import * as React from 'react'; import { ReactNode, useEffect } from 'react'; import { FormGroupContext } from './FormGroupContext'; import { useFormGroups } from './useFormGroups'; /** * This provider allows its input children to register to a specific group. * This enables other components in the group to access group properties such as its * validation (valid/invalid) or whether its inputs have been updated (dirty/pristine). * * @example * import { Edit, SimpleForm, TextInput, FormGroupContextProvider, useFormGroup } from 'mv-tmp'; * import { Accordion, AccordionDetails, AccordionSummary, Typography } from '@mui/material'; * * const PostEdit = (props) => ( * * * * * * } * aria-controls="options-content" * id="options-header" * > * Options * * * * * * * * * ); * * const AccordionSectionTitle = ({ children, name }) => { * const formGroupState = useFormGroup(name); * return ( * * {children} * * ); * } * * @param props The component props * @param {ReactNode} props.children The form group content * @param {String} props.name The form group name */ export const FormGroupContextProvider = ({ children, name, }: { children: ReactNode; name: string; }) => { const formGroups = useFormGroups(); useEffect(() => { if ( !formGroups || !formGroups.registerGroup || !formGroups.unregisterGroup ) { console.warn( `The FormGroupContextProvider can only be used inside a FormContext such as provided by the SimpleForm and TabbedForm components` ); return; } formGroups.registerGroup(name); return () => { formGroups.unregisterGroup(name); }; }, [formGroups, name]); return ( {children} ); };