parent
46b05aa81d
commit
debb607212
1 changed files with 47 additions and 0 deletions
@ -0,0 +1,47 @@ |
|||||||
|
import { Dispatch, SetStateAction } from 'react'; |
||||||
|
|
||||||
|
import { InputProps as MUIInputProps } from '@mui/material'; |
||||||
|
|
||||||
|
export type MapToStateSetter = { |
||||||
|
[TypeName in keyof MapToType]: Dispatch<SetStateAction<MapToType[TypeName]>>; |
||||||
|
}; |
||||||
|
|
||||||
|
export type MapToValueConverter = { |
||||||
|
[TypeName in keyof MapToType]: (value: unknown) => MapToType[TypeName]; |
||||||
|
}; |
||||||
|
|
||||||
|
export type InputOnChangeParameters = Parameters< |
||||||
|
Exclude<MUIInputProps['onChange'], undefined> |
||||||
|
>; |
||||||
|
|
||||||
|
const MAP_TO_VALUE_CONVERTER: MapToValueConverter = { |
||||||
|
number: (value) => parseInt(String(value), 10) || 0, |
||||||
|
string: (value) => String(value), |
||||||
|
}; |
||||||
|
|
||||||
|
const createInputOnChangeHandler = |
||||||
|
<TypeName extends keyof MapToType>({ |
||||||
|
postSet, |
||||||
|
preSet, |
||||||
|
set, |
||||||
|
setType = 'string', |
||||||
|
}: { |
||||||
|
postSet?: (...args: InputOnChangeParameters) => void; |
||||||
|
preSet?: (...args: InputOnChangeParameters) => void; |
||||||
|
set?: MapToStateSetter[TypeName]; |
||||||
|
setType?: TypeName | 'string'; |
||||||
|
} = {}): MUIInputProps['onChange'] => |
||||||
|
(event) => { |
||||||
|
const { |
||||||
|
target: { value }, |
||||||
|
} = event; |
||||||
|
const postConvertValue = MAP_TO_VALUE_CONVERTER[setType]( |
||||||
|
value, |
||||||
|
) as MapToType[TypeName]; |
||||||
|
|
||||||
|
preSet?.call(null, event); |
||||||
|
set?.call(null, postConvertValue); |
||||||
|
postSet?.call(null, event); |
||||||
|
}; |
||||||
|
|
||||||
|
export default createInputOnChangeHandler; |
Loading…
Reference in new issue