import { once } from 'lodash'; import React, { createContext } from 'react'; type ErrorMap = { [key in keyof T]?: string }; export type FieldRegisterModel = { getError(): string | undefined; getValue(): any; }; interface FormObjectContext> { value: T; valueRef: React.MutableRefObject; errors: ErrorMap; register: (fieldName: string, field: FieldRegisterModel) => void; validate: (fieldName: string) => void; onChange: (name: string, change?: any, isValid?: boolean) => void; } const defaultContext: FormObjectContext = { value: {}, errors: {}, valueRef: React.createRef(), register: () => {}, validate: () => {}, onChange: (name, change) => console.log('context got form change', name, change), }; // Using once to get the generic to work function _getFieldContext>() { return createContext>(defaultContext as any); } export const getFieldContext = once(_getFieldContext); export function FormObjectProvider({ children, ...rest }: FormObjectContext & { children: React.ReactNode }) { const { Provider } = getFieldContext(); return {children}; }