Skip to content

Commit 9780b04

Browse files
committed
fix(rhf/fields): Properly infer types when using a resolver with a transform
1 parent cb6585c commit 9780b04

File tree

10 files changed

+81
-35
lines changed

10 files changed

+81
-35
lines changed

src/components/form/field-checkbox-group/index.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@ type CheckboxOption = Omit<CheckboxProps, 'children' | 'value' | 'render'> & {
1717
export type FieldCheckboxGroupProps<
1818
TFieldValues extends FieldValues = FieldValues,
1919
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
20+
TTransformedValues = TFieldValues,
2021
> = FieldProps<
2122
TFieldValues,
2223
TName,
24+
TTransformedValues,
2325
{
2426
type: 'checkbox-group';
2527
options: Array<CheckboxOption>;
@@ -30,8 +32,9 @@ export type FieldCheckboxGroupProps<
3032
export const FieldCheckboxGroup = <
3133
TFieldValues extends FieldValues = FieldValues,
3234
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
35+
TTransformedValues = TFieldValues,
3336
>(
34-
props: FieldCheckboxGroupProps<TFieldValues, TName>
37+
props: FieldCheckboxGroupProps<TFieldValues, TName, TTransformedValues>
3538
) => {
3639
const {
3740
name,

src/components/form/field-checkbox/index.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@ import { Checkbox } from '@/components/ui/checkbox';
1111
export type FieldCheckboxProps<
1212
TFieldValues extends FieldValues = FieldValues,
1313
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
14+
TTransformedValues = TFieldValues,
1415
> = FieldProps<
1516
TFieldValues,
1617
TName,
18+
TTransformedValues,
1719
{
1820
type: 'checkbox';
1921
containerProps?: ComponentProps<'div'>;
@@ -23,8 +25,9 @@ export type FieldCheckboxProps<
2325
export const FieldCheckbox = <
2426
TFieldValues extends FieldValues = FieldValues,
2527
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
28+
TTransformedValues = TFieldValues,
2629
>(
27-
props: FieldCheckboxProps<TFieldValues, TName>
30+
props: FieldCheckboxProps<TFieldValues, TName, TTransformedValues>
2831
) => {
2932
const {
3033
name,

src/components/form/field-date/index.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@ import { DatePicker } from '@/components/ui/date-picker';
1111
export type FieldDateProps<
1212
TFieldValues extends FieldValues = FieldValues,
1313
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
14+
TTransformedValues = TFieldValues,
1415
> = FieldProps<
1516
TFieldValues,
1617
TName,
18+
TTransformedValues,
1719
{
1820
type: 'date';
1921
containerProps?: ComponentProps<'div'>;
@@ -23,8 +25,9 @@ export type FieldDateProps<
2325
export const FieldDate = <
2426
TFieldValues extends FieldValues = FieldValues,
2527
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
28+
TTransformedValues = TFieldValues,
2629
>(
27-
props: FieldDateProps<TFieldValues, TName>
30+
props: FieldDateProps<TFieldValues, TName, TTransformedValues>
2831
) => {
2932
const {
3033
name,

src/components/form/field-number/index.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@ import { FormFieldError } from '../form-field-error';
1313
export type FieldNumberProps<
1414
TFieldValues extends FieldValues = FieldValues,
1515
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
16+
TTransformedValues = TFieldValues,
1617
> = FieldProps<
1718
TFieldValues,
1819
TName,
20+
TTransformedValues,
1921
{
2022
type: 'number';
2123
containerProps?: ComponentProps<'div'>;
@@ -26,8 +28,9 @@ export type FieldNumberProps<
2628
export const FieldNumber = <
2729
TFieldValues extends FieldValues = FieldValues,
2830
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
31+
TTransformedValues = TFieldValues,
2932
>(
30-
props: FieldNumberProps<TFieldValues, TName>
33+
props: FieldNumberProps<TFieldValues, TName, TTransformedValues>
3134
) => {
3235
const {
3336
name,

src/components/form/field-otp/index.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@ import { FormFieldError } from '../form-field-error';
1616
export type FieldOtpProps<
1717
TFieldValues extends FieldValues = FieldValues,
1818
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
19+
TTransformedValues = TFieldValues,
1920
> = FieldProps<
2021
TFieldValues,
2122
TName,
23+
TTransformedValues,
2224
{
2325
type: 'otp';
2426
autoSubmit?: boolean;
@@ -29,8 +31,9 @@ export type FieldOtpProps<
2931
export const FieldOtp = <
3032
TFieldValues extends FieldValues = FieldValues,
3133
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
34+
TTransformedValues = TFieldValues,
3235
>(
33-
props: FieldOtpProps<TFieldValues, TName>
36+
props: FieldOtpProps<TFieldValues, TName, TTransformedValues>
3437
) => {
3538
const {
3639
name,

src/components/form/field-radio-group/index.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@ type RadioOption = Omit<RadioProps, 'children' | 'render'> & {
1515
export type FieldRadioGroupProps<
1616
TFieldValues extends FieldValues = FieldValues,
1717
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
18+
TTransformedValues = TFieldValues,
1819
> = FieldProps<
1920
TFieldValues,
2021
TName,
22+
TTransformedValues,
2123
{
2224
type: 'radio-group';
2325
options: Array<RadioOption>;
@@ -29,8 +31,9 @@ export type FieldRadioGroupProps<
2931
export const FieldRadioGroup = <
3032
TFieldValues extends FieldValues = FieldValues,
3133
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
34+
TTransformedValues = TFieldValues,
3235
>(
33-
props: FieldRadioGroupProps<TFieldValues, TName>
36+
props: FieldRadioGroupProps<TFieldValues, TName, TTransformedValues>
3437
) => {
3538
const {
3639
name,

src/components/form/field-select/index.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@ import { Select } from '@/components/ui/select';
1111
export type FieldSelectProps<
1212
TFieldValues extends FieldValues = FieldValues,
1313
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
14+
TTransformedValues = TFieldValues,
1415
> = FieldProps<
1516
TFieldValues,
1617
TName,
18+
TTransformedValues,
1719
{
1820
type: 'select';
1921
containerProps?: ComponentProps<'div'>;
@@ -23,8 +25,9 @@ export type FieldSelectProps<
2325
export const FieldSelect = <
2426
TFieldValues extends FieldValues = FieldValues,
2527
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
28+
TTransformedValues = TFieldValues,
2629
>(
27-
props: FieldSelectProps<TFieldValues, TName>
30+
props: FieldSelectProps<TFieldValues, TName, TTransformedValues>
2831
) => {
2932
const {
3033
name,

src/components/form/field-text/index.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@ import { FormFieldError } from '../form-field-error';
1212
export type FieldTextProps<
1313
TFieldValues extends FieldValues = FieldValues,
1414
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
15+
TTransformedValues = TFieldValues,
1516
> = FieldProps<
1617
TFieldValues,
1718
TName,
19+
TTransformedValues,
1820
{
1921
type: 'text' | 'email' | 'tel';
2022
containerProps?: ComponentProps<'div'>;
@@ -24,8 +26,9 @@ export type FieldTextProps<
2426
export const FieldText = <
2527
TFieldValues extends FieldValues = FieldValues,
2628
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
29+
TTransformedValues = TFieldValues,
2730
>(
28-
props: FieldTextProps<TFieldValues, TName>
31+
props: FieldTextProps<TFieldValues, TName, TTransformedValues>
2932
) => {
3033
const {
3134
name,

src/components/form/form-field-controller.tsx

Lines changed: 41 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -28,44 +28,53 @@ type FormFieldSize = 'sm' | 'default' | 'lg';
2828
type FieldCustomProps<
2929
TFieldValues extends FieldValues = FieldValues,
3030
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
31+
TTransformedValues = TFieldValues,
3132
> = {
3233
type: 'custom';
3334
} & Pick<
34-
ControllerProps<TFieldValues, TName>,
35+
ControllerProps<TFieldValues, TName, TTransformedValues>,
3536
'defaultValue' | 'name' | 'shouldUnregister' | 'disabled' | 'render'
3637
> &
37-
Required<Pick<ControllerProps<TFieldValues, TName>, 'control'>>;
38+
Required<
39+
Pick<ControllerProps<TFieldValues, TName, TTransformedValues>, 'control'>
40+
>;
3841

3942
type CustomProps = object;
4043
export type FieldProps<
4144
TFieldValues extends FieldValues = FieldValues,
4245
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
46+
TTransformedValues = TFieldValues,
4347
TProps extends CustomProps = CustomProps,
44-
> = Omit<FieldCustomProps<TFieldValues, TName>, 'render' | 'type'> & {
48+
> = Omit<
49+
FieldCustomProps<TFieldValues, TName, TTransformedValues>,
50+
'render' | 'type'
51+
> & {
4552
size?: FormFieldSize;
4653
displayError?: boolean;
4754
} & Omit<TProps, 'value' | 'ref' | 'id' | 'aria-invalid' | 'aria-describedby'>;
4855

4956
export type FormFieldControllerProps<
5057
TFieldValues extends FieldValues = FieldValues,
5158
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
59+
TTransformedValues = TFieldValues,
5260
> =
53-
| FieldCustomProps<TFieldValues, TName>
61+
| FieldCustomProps<TFieldValues, TName, TTransformedValues>
5462
// -- ADD NEW FIELD PROPS TYPE HERE --
55-
| FieldNumberProps<TFieldValues, TName>
56-
| FieldSelectProps<TFieldValues, TName>
57-
| FieldDateProps<TFieldValues, TName>
58-
| FieldTextProps<TFieldValues, TName>
59-
| FieldOtpProps<TFieldValues, TName>
60-
| FieldRadioGroupProps<TFieldValues, TName>
61-
| FieldCheckboxProps<TFieldValues, TName>
62-
| FieldCheckboxGroupProps<TFieldValues, TName>;
63+
| FieldNumberProps<TFieldValues, TName, TTransformedValues>
64+
| FieldSelectProps<TFieldValues, TName, TTransformedValues>
65+
| FieldDateProps<TFieldValues, TName, TTransformedValues>
66+
| FieldTextProps<TFieldValues, TName, TTransformedValues>
67+
| FieldOtpProps<TFieldValues, TName, TTransformedValues>
68+
| FieldRadioGroupProps<TFieldValues, TName, TTransformedValues>
69+
| FieldCheckboxProps<TFieldValues, TName, TTransformedValues>
70+
| FieldCheckboxGroupProps<TFieldValues, TName, TTransformedValues>;
6371

6472
export const FormFieldController = <
6573
TFieldValues extends FieldValues = FieldValues,
6674
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
75+
TTransformedValues = TFieldValues,
6776
>(
68-
_props: FormFieldControllerProps<TFieldValues, TName>
77+
_props: FormFieldControllerProps<TFieldValues, TName, TTransformedValues>
6978
) => {
7079
const { size } = useFormField();
7180

@@ -110,15 +119,18 @@ export const FormFieldController = <
110119

111120
const displayError = 'displayError' in props ? props.displayError : undefined;
112121

113-
const contextValue: FormFieldControllerContextValue<TFieldValues, TName> =
114-
useMemo(
115-
() => ({
116-
name: props.name,
117-
control: props.control,
118-
displayError: displayError,
119-
}),
120-
[props.name, props.control, displayError]
121-
);
122+
const contextValue: FormFieldControllerContextValue<
123+
TFieldValues,
124+
TName,
125+
TTransformedValues
126+
> = useMemo(
127+
() => ({
128+
name: props.name,
129+
control: props.control,
130+
displayError: displayError,
131+
}),
132+
[props.name, props.control, displayError]
133+
);
122134

123135
return (
124136
<FormFieldControllerContext value={contextValue as ExplicitAny}>
@@ -130,7 +142,13 @@ export const FormFieldController = <
130142
export type FormFieldControllerContextValue<
131143
TFieldValues extends FieldValues = FieldValues,
132144
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
133-
> = Required<Pick<ControllerProps<TFieldValues, TName>, 'control' | 'name'>> & {
145+
TTransformedValues = TFieldValues,
146+
> = Required<
147+
Pick<
148+
ControllerProps<TFieldValues, TName, TTransformedValues>,
149+
'control' | 'name'
150+
>
151+
> & {
134152
displayError?: boolean;
135153
};
136154

src/components/form/form.tsx

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,17 @@ import {
77

88
import { cn } from '@/lib/tailwind/utils';
99

10-
type FormProps<TFieldValues extends FieldValues> = StrictUnion<
11-
| (FormProviderProps<TFieldValues> & {
10+
type FormProps<
11+
TFieldValues extends FieldValues = FieldValues,
12+
TContext = ExplicitAny,
13+
TTransformedValues = TFieldValues,
14+
> = StrictUnion<
15+
| (FormProviderProps<TFieldValues, TContext, TTransformedValues> & {
1216
noHtmlForm?: false;
13-
onSubmit?: SubmitHandler<TFieldValues>;
17+
onSubmit?: SubmitHandler<TTransformedValues>;
1418
className?: string;
1519
})
16-
| (FormProviderProps<TFieldValues> & {
20+
| (FormProviderProps<TFieldValues, TContext, TTransformedValues> & {
1721
noHtmlForm: true;
1822
})
1923
>;

0 commit comments

Comments
 (0)