import PropTypes from 'prop-types'; import * as React from 'react'; import { v4 as uuidv4 } from 'uuid'; import { useFormContext, useWatch } from 'react-hook-form'; import Typography from '@mui/material/Typography'; import Stack from '@mui/material/Stack'; import Box from '@mui/material/Box'; import IconButton from '@mui/material/IconButton'; import RemoveIcon from '@mui/icons-material/Remove'; import AddIcon from '@mui/icons-material/Add'; import InputCreator from 'components/InputCreator'; import { EditorContext } from 'contexts/Editor'; import { FieldsPropType } from 'propTypes/propTypes'; function DynamicField(props) { const { label, description, fields, name, defaultValue, stepId } = props; const { control, setValue, getValues } = useFormContext(); const fieldsValue = useWatch({ control, name }); const editorContext = React.useContext(EditorContext); const createEmptyItem = React.useCallback(() => { return fields.reduce((previousValue, field) => { return { ...previousValue, [field.key]: '', __id: uuidv4(), }; }, {}); }, [fields]); const addItem = React.useCallback(() => { const values = getValues(name); if (!values) { setValue(name, [createEmptyItem()]); } else { setValue(name, values.concat(createEmptyItem())); } }, [getValues, createEmptyItem]); const removeItem = React.useCallback( (index) => { if (fieldsValue.length === 1) return; const newFieldsValue = fieldsValue.filter( (fieldValue, fieldIndex) => fieldIndex !== index, ); setValue(name, newFieldsValue); }, [fieldsValue], ); React.useEffect( function addInitialGroupWhenEmpty() { const fieldValues = getValues(name); if (!fieldValues && defaultValue) { setValue(name, defaultValue); } else if (!fieldValues) { setValue(name, [createEmptyItem()]); } }, [createEmptyItem, defaultValue], ); return ( {label} {fieldsValue?.map((field, index) => ( {fields.map((fieldSchema, fieldSchemaIndex) => ( ))} removeItem(index)} sx={{ width: 61, height: 61 }} > ))} {description} ); } DynamicField.propTypes = { onChange: PropTypes.func, onBlur: PropTypes.func, defaultValue: PropTypes.arrayOf(PropTypes.object), name: PropTypes.string.isRequired, label: PropTypes.string.isRequired, type: PropTypes.string, required: PropTypes.bool, readOnly: PropTypes.bool, description: PropTypes.string, docUrl: PropTypes.string, clickToCopy: PropTypes.bool, disabled: PropTypes.bool, fields: FieldsPropType.isRequired, shouldUnregister: PropTypes.bool, stepId: PropTypes.string, }; export default DynamicField;