Skip to content

Commit 38afd47

Browse files
committed
SerializeProps type, making it easy to implement custom input types
1 parent 2425b9e commit 38afd47

File tree

1 file changed

+15
-10
lines changed

1 file changed

+15
-10
lines changed

src/elements/FormInput.tsx

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,17 @@ export type Deserializer<T extends object, K extends keyof T, State = DefaultSta
4444
props: FormInputProps<T, K, State, Error>
4545
) => T[K] | T[K][keyof T[K]];
4646

47-
function defaultSerializer<T extends object, K extends keyof T, State = DefaultState, Error extends string = string>(
47+
export type SerializeProps<T extends object, K extends keyof T> = {
48+
dateAsNumber?: boolean;
49+
setUndefinedOnUncheck?: boolean;
50+
setNullOnUncheck?: boolean;
51+
type?: FormInputType;
52+
value?: T[K] | T[K][keyof T[K]];
53+
};
54+
55+
export function defaultSerializer<T extends object, K extends keyof T>(
4856
currentValue: T[K] | T[K][keyof T[K]],
49-
props: FormInputProps<T, K, State, Error>
57+
props: SerializeProps<T, K>
5058
): boolean | string {
5159
switch (props.type) {
5260
case "datetime-local":
@@ -84,11 +92,11 @@ function defaultSerializer<T extends object, K extends keyof T, State = DefaultS
8492
}
8593
}
8694

87-
function defaultDeserializer<T extends object, K extends keyof T, State = DefaultState, Error extends string = string>(
95+
export function defaultDeserializer<T extends object, K extends keyof T>(
8896
inputValue: string,
8997
inputChecked: boolean,
90-
currentValue: any,
91-
props: FormInputProps<T, K, State, Error>
98+
currentValue: T[K],
99+
props: SerializeProps<T, K>
92100
) {
93101
switch (props.type) {
94102
case "number": {
@@ -148,11 +156,8 @@ export type FormInputProps<T extends object, K extends keyof T = keyof T, State
148156
dirtyClassName?: string;
149157
dirtyStyle?: React.CSSProperties;
150158
disableOnSubmitting?: boolean;
151-
dateAsNumber?: boolean;
152-
setNullOnUncheck?: boolean;
153-
setUndefinedOnUncheck?: boolean;
154159
hideWhenNull?: boolean;
155-
};
160+
} & SerializeProps<T, K>;
156161

157162
/**
158163
* The builtin form input. You must always specify **form** and **name**. Use the **type** prop to specify what type of field it represents.
@@ -209,7 +214,7 @@ export function FormInput<T extends object, K extends keyof T, State extends Def
209214
onChange={(ev) => {
210215
setValue((deserializer ?? defaultDeserializer)(ev.target.value, ev.target.checked, currentValue, props));
211216
}}
212-
name={name + ""}
217+
name={name as string}
213218
type={type}
214219
{...rest}
215220
/>

0 commit comments

Comments
 (0)