import React, { memo, useCallback, useMemo, useState } from 'react'; import { get } from 'lodash'; import isEqual from 'react-fast-compare'; import PropTypes from 'prop-types'; import { FormattedMessage } from 'react-intl'; import { Arrow } from '@buffetjs/icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import pluginId from '../../pluginId'; import useEditView from '../../hooks/useEditView'; import DynamicComponentCard from '../DynamicComponentCard'; import FieldComponent from '../FieldComponent'; import NotAllowedInput from '../NotAllowedInput'; import connect from './utils/connect'; import select from './utils/select'; import BaselineAlignement from './BaselineAlignement'; import Button from './Button'; import ComponentsPicker from './ComponentsPicker'; import ComponentWrapper from './ComponentWrapper'; import DynamicZoneWrapper from './DynamicZoneWrapper'; import Label from './Label'; import RoundCTA from './RoundCTA'; import Wrapper from './Wrapper'; /* eslint-disable react/no-array-index-key */ const DynamicZone = ({ max, min, name, // Passed with the select function addComponentToDynamicZone, formErrors, isCreatingEntry, isFieldAllowed, isFieldReadable, layout, moveComponentUp, moveComponentDown, removeComponentFromDynamicZone, dynamicDisplayedComponents, }) => { const [isOpen, setIsOpen] = useState(false); const { components } = useEditView(); const getDynamicComponentSchemaData = useCallback( componentUid => { const component = components.find(compo => compo.uid === componentUid); const { schema } = component; return schema; }, [components] ); const getDynamicComponentInfos = useCallback( componentUid => { const { info: { icon, name }, } = getDynamicComponentSchemaData(componentUid); return { icon, name }; }, [getDynamicComponentSchemaData] ); const dynamicZoneErrors = useMemo(() => { return Object.keys(formErrors) .filter(key => { return key === name; }) .map(key => formErrors[key]); }, [formErrors, name]); const dynamicZoneAvailableComponents = useMemo( () => get(layout, ['schema', 'attributes', name, 'components'], []), [layout, name] ); const metas = useMemo(() => get(layout, ['metadatas', name, 'edit'], {}), [layout, name]); const dynamicDisplayedComponentsLength = dynamicDisplayedComponents.length; const missingComponentNumber = min - dynamicDisplayedComponentsLength; const hasError = dynamicZoneErrors.length > 0; const hasMinError = dynamicZoneErrors.length > 0 && get(dynamicZoneErrors, [0, 'id'], '').includes('min'); const hasRequiredError = hasError && !hasMinError; const hasMaxError = hasError && get(dynamicZoneErrors, [0, 'id'], '') === 'components.Input.error.validation.max'; if (!isFieldAllowed && isCreatingEntry) { return ( ); } if (!isFieldAllowed && !isFieldReadable && !isCreatingEntry) { return ( ); } return ( {dynamicDisplayedComponentsLength > 0 && ( )} {dynamicDisplayedComponents.map((componentUid, index) => { const showDownIcon = isFieldAllowed && dynamicDisplayedComponentsLength > 0 && index < dynamicDisplayedComponentsLength - 1; const showUpIcon = isFieldAllowed && dynamicDisplayedComponentsLength > 0 && index > 0; return (
{showDownIcon && ( moveComponentDown(name, index)} > )} {showUpIcon && ( moveComponentUp(name, index)} > )}
{isFieldAllowed && ( removeComponentFromDynamicZone(name, index)}> )}
); })}
{isFieldAllowed ? (