import React from 'react'; import { FormFieldTemplateDefault } from './formStyle'; import keycodes from './keycodes'; const FormContext = React.createContext(null); const FormFieldTemplateContext = React.createContext(null); export function FormProvider({ children, initialValues = {}, template = FormFieldTemplateDefault }) { const [values, setValues] = React.useState(initialValues); return ( {children} ); } export function FormProviderCore({ children, values, setValues, template = FormFieldTemplateDefault }) { const [submitAction, setSubmitAction] = React.useState(null); const handleEnter = React.useCallback( (e) => { if (e.keyCode == keycodes.enter && submitAction && submitAction.action) { e.preventDefault(); submitAction.action(values); } }, [submitAction, values] ); React.useEffect(() => { document.addEventListener('keyup', handleEnter); return () => { document.removeEventListener('keyup', handleEnter); }; }, [handleEnter]); const setFieldValue = React.useCallback( (field, value) => setValues((v) => ({ ...v, [field]: value, })), [setValues] ); const provider = { values, setValues, setFieldValue, setSubmitAction, }; return ( {children} ); } export function useForm() { return React.useContext(FormContext); } export function FormFieldTemplateProvider({ children, template = FormFieldTemplateDefault }) { return {children}; } export function useFormFieldTemplate() { return React.useContext(FormFieldTemplateContext); }