import React, { useCallback, useState } from 'react'; import { get } from 'lodash'; import PropTypes from 'prop-types'; import { FormattedMessage } from 'react-intl'; import pluginId from '../../pluginId'; import useDataManager from '../../hooks/useDataManager'; import useEditView from '../../hooks/useEditView'; import DynamicComponentCard from '../DynamicComponentCard'; import FieldComponent from '../FieldComponent'; import Button from './Button'; import ComponentsPicker from './ComponentsPicker'; import ComponentWrapper from './ComponentWrapper'; import Label from './Label'; import RoundCTA from './RoundCTA'; import Wrapper from './Wrapper'; const DynamicZone = ({ max, min, name }) => { const [isOpen, setIsOpen] = useState(true); const { addComponentToDynamicZone, formErrors, layout, modifiedData, moveComponentUp, moveComponentDown, removeComponentFromDynamicZone, } = useDataManager(); const { components } = useEditView(); const getDynamicDisplayedComponents = useCallback(() => { return get(modifiedData, [name], []).map(data => data.__component); }, [modifiedData, name]); const getDynamicComponentSchemaData = componentUid => { const component = components.find(compo => compo.uid === componentUid); const { schema } = component; return schema; }; const getDynamicComponentIcon = componentUid => { const { info: { icon }, } = getDynamicComponentSchemaData(componentUid); return icon; }; const dynamicZoneErrors = Object.keys(formErrors) .filter(key => { return key === name; }) .map(key => formErrors[key]); const dynamicZoneAvailableComponents = get( layout, ['schema', 'attributes', name, 'components'], [] ); const metas = get(layout, ['metadatas', name, 'edit'], {}); const dynamicDisplayedComponentsLength = getDynamicDisplayedComponents() .length; const missingComponentNumber = min - dynamicDisplayedComponentsLength; const hasError = dynamicZoneErrors.length > 0; const hasMinError = dynamicZoneErrors.length > 0 && get(dynamicZoneErrors, [0, 'id'], '').includes('min') && !isOpen; return ( <> {getDynamicDisplayedComponents().length > 0 && ( )} {getDynamicDisplayedComponents().map((componentUid, index) => { const showDownIcon = dynamicDisplayedComponentsLength > 0 && index < dynamicDisplayedComponentsLength - 1; const showUpIcon = dynamicDisplayedComponentsLength > 0 && index > 0; return ( {showDownIcon && ( moveComponentDown(name, index)} > )} {showUpIcon && ( moveComponentUp(name, index)} > )} removeComponentFromDynamicZone(name, index)} > ); })}