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 && ( {metas.label} {metas.description} )} {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)} > ); })} { if (dynamicDisplayedComponentsLength < max) { setIsOpen(prev => !prev); } else { strapi.notification.info( `${pluginId}.components.components.notification.info.maximum-requirement` ); } }} /> {hasMinError && {missingComponentNumber} missing components} {dynamicZoneAvailableComponents.map(componentUid => { return ( { setIsOpen(false); const shouldCheckErrors = hasError; addComponentToDynamicZone( name, componentUid, shouldCheckErrors ); }} /> ); })} > ); }; DynamicZone.defaultProps = { max: Infinity, min: -Infinity, }; DynamicZone.propTypes = { max: PropTypes.number, min: PropTypes.number, name: PropTypes.string.isRequired, }; export { DynamicZone }; export default DynamicZone;
{metas.label}
{metas.description}