Skip to content

Instantly share code, notes, and snippets.

@chihabhajji
Created April 21, 2023 07:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chihabhajji/b253b366dded23d7d791fc6c083459f8 to your computer and use it in GitHub Desktop.
Save chihabhajji/b253b366dded23d7d791fc6c083459f8 to your computer and use it in GitHub Desktop.
Generic form handler to update the state
type NonArrayFunctionKeys<T> = {
[K in keyof T]-?: T[K] extends Function | unknown[] ? never : K
}[keyof T];
const handleInputChange = <TKey extends NonArrayFunctionKeys<User>, TValue>(
value: TValue,
name: TKey,
// setStateCallback: React.Dispatch<React.SetStateAction<User>>
) => setProfile((prev) => ({...prev, [name]: value}));
type KeysMatching<T, V> = { [K in keyof T]-?: T[K] extends V ? K : never }[keyof T];
const handleArrayChanged = <TKey extends KeysMatching<User, unknown[]>, TValue extends string>(
value: TValue,
name: TKey,
// setStateCallback: React.Dispatch<React.SetStateAction<User>>
) => {
setProfile((preProfile) => {
const updated = {...preProfile};
if (Array.isArray(updated[name]) && updated[name].includes(value)) {
updated[name] = updated[name].filter((item) => item !== value);
} else {
updated[name] = [...(updated[name] ?? []), value];
}
return updated;
});
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment