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}
);
};