import React from "react"; import { FieldValues, FormProvider, FormProviderProps, SubmitErrorHandler, SubmitHandler, } from "react-hook-form"; import { createAutocompleteField } from "./RHFAutocomplete"; import { createCheckboxField } from "./RHFCheckbox"; import { createChipField } from "./RHFChip"; import { createColorInputField } from "./RHFColorInput"; import { createColorPickerField } from "./RHFColorPicker"; import { createDateInputField } from "./RHFDateInput"; import { createDatePicker } from "./RHFDatePicker"; import { createDatePickerField } from "./RHFDatePickerInput"; import { createDateTimePickerField } from "./RHFDateTimerPicker"; import { createFileInputField } from "./RHFFileInput"; import { createJsonInputField } from "./RHFJsonInput"; import { createMonthPicker } from "./RHFMonthPicker"; import { createMonthPickerInput } from "./RHFMonthPickerInput"; import { createMultiSelectField } from "./RHFMultiSelect"; import { createNativeSelectField } from "./RHFNativeSelect"; import { createNumberInputField } from "./RHFNumberInput"; import { createPasswordInputField } from "./RHFPasswordInput"; import { createRadioGroupField } from "./RHFRadioGroup"; import { createRangeSliderField } from "./RHFRangeSlider"; import { createSegmentedControlField } from "./RHFSegmentedControl"; import { createSelectField } from "./RHFSelect"; import { createSliderField } from "./RHFSlider"; import { createSwitchField } from "./RHFSwitch"; import { createTextareaField } from "./RHFTextarea"; import { createTextInputField } from "./RHFTextInput"; import { createTimeInputField } from "./RHFTimeInput"; import { createYearPicker } from "./RHFYearPicker"; import { createYearPickerInput } from "./RHFYearPickerInput"; type CreateFormProviderProps = FormProviderProps & { onSubmit?: SubmitHandler; onError?: SubmitErrorHandler; }; type FormComponent = React.FC< CreateFormProviderProps & { debug?: boolean } > & { Autocomplete: ReturnType>; Checkbox: ReturnType>; Chip: ReturnType>; ColorInput: ReturnType>; ColorPicker: ReturnType>; FileInput: ReturnType>; TextInput: ReturnType>; Textarea: ReturnType>; JsonInput: ReturnType>; MultiSelect: ReturnType>; NativeSelect: ReturnType>; NumberInput: ReturnType>; PasswordInput: ReturnType>; SegmentedControl: ReturnType>; Select: ReturnType>; Slider: ReturnType>; RangeSlider: ReturnType>; Switch: ReturnType>; RadioGroup: ReturnType>; DateInput: ReturnType>; DatePicker: ReturnType>; DatePickerInput: ReturnType>; DateTimePickerInput: ReturnType>; MonthPicker: ReturnType>; MonthPickerInput: ReturnType>; TimeInput: ReturnType>; YearPicker: ReturnType>; YearPickerInput: ReturnType>; }; export const createFormProvider = < T extends FieldValues = FieldValues, >(): FormComponent => { const Form = (props: CreateFormProviderProps & { debug?: boolean }) => { const { onSubmit = (values) => console.log(values), onError = (err) => console.error(err), debug = false, children, ...formMethods } = props; return (
{children} {debug && null}
); }; // here is the point where we infer the generic to a child Form.Autocomplete = createAutocompleteField(); Form.Checkbox = createCheckboxField(); Form.Chip = createChipField(); Form.ColorInput = createColorInputField(); Form.ColorPicker = createColorPickerField(); Form.FileInput = createFileInputField(); Form.TextInput = createTextInputField(); Form.Textarea = createTextareaField(); Form.JsonInput = createJsonInputField(); Form.MultiSelect = createMultiSelectField(); Form.NativeSelect = createNativeSelectField(); Form.NumberInput = createNumberInputField(); Form.PasswordInput = createPasswordInputField(); Form.SegmentedControl = createSegmentedControlField(); Form.Select = createSelectField(); Form.Slider = createSliderField(); Form.RangeSlider = createRangeSliderField(); Form.Switch = createSwitchField(); Form.RadioGroup = createRadioGroupField(); Form.DateInput = createDateInputField(); Form.DatePicker = createDatePicker(); Form.DatePickerInput = createDatePickerField(); Form.DateTimePickerInput = createDateTimePickerField(); Form.MonthPicker = createMonthPicker(); Form.MonthPickerInput = createMonthPickerInput(); Form.TimeInput = createTimeInputField(); Form.YearPicker = createYearPicker(); Form.YearPickerInput = createYearPickerInput(); return Form; };