| | import React, { createContext, PropsWithChildren, ReactElement, useContext, useMemo } from 'react'; |
| | import type { |
| | Control, |
| | |
| | FieldValues, |
| | UseFormReset, |
| | UseFormRegister, |
| | UseFormGetValues, |
| | UseFormHandleSubmit, |
| | UseFormSetValue, |
| | } from 'react-hook-form'; |
| |
|
| | interface FormContextValue<TFieldValues extends FieldValues> { |
| | register: UseFormRegister<TFieldValues>; |
| | control: Control<TFieldValues>; |
| | |
| | getValues: UseFormGetValues<TFieldValues>; |
| | setValue: UseFormSetValue<TFieldValues>; |
| | handleSubmit: UseFormHandleSubmit<TFieldValues>; |
| | reset: UseFormReset<TFieldValues>; |
| | } |
| |
|
| | function createFormContext<TFieldValues extends FieldValues>() { |
| | const context = createContext<FormContextValue<TFieldValues> | undefined>(undefined); |
| |
|
| | const useCustomFormContext = (): FormContextValue<TFieldValues> => { |
| | const value = useContext(context); |
| | if (!value) { |
| | throw new Error('useCustomFormContext must be used within a CustomFormProvider'); |
| | } |
| | return value; |
| | }; |
| |
|
| | const CustomFormProvider = ({ |
| | register, |
| | control, |
| | setValue, |
| | |
| | getValues, |
| | handleSubmit, |
| | reset, |
| | children, |
| | }: PropsWithChildren<FormContextValue<TFieldValues>>): ReactElement => { |
| | const value = useMemo( |
| | () => ({ register, control, getValues, setValue, handleSubmit, reset }), |
| | [register, control, setValue, getValues, handleSubmit, reset], |
| | ); |
| |
|
| | return <context.Provider value={value}>{children}</context.Provider>; |
| | }; |
| |
|
| | return { CustomFormProvider, useCustomFormContext }; |
| | } |
| |
|
| | export type { FormContextValue }; |
| | export { createFormContext }; |
| |
|