85 lines
2.5 KiB
JavaScript
Raw Normal View History

import React, { useCallback, useState } from 'react';
2019-11-04 09:00:59 +01:00
import { get } from 'lodash';
import PropTypes from 'prop-types';
2019-11-04 10:10:38 +01:00
import { FormattedMessage } from 'react-intl';
import pluginId from '../../pluginId';
2019-11-04 09:00:59 +01:00
import useDataManager from '../../hooks/useDataManager';
2019-11-04 10:10:38 +01:00
import DynamicComponentCard from '../DynamicComponentCard';
2019-11-04 09:00:59 +01:00
import Button from './Button';
2019-11-04 10:10:38 +01:00
import ComponentsPicker from './ComponentsPicker';
2019-11-04 09:00:59 +01:00
import Wrapper from './Wrapper';
const DynamicZone = ({ name }) => {
2019-11-04 09:00:59 +01:00
const [isOpen, setIsOpen] = useState(false);
2019-11-04 10:10:38 +01:00
const [isOver, setIsOver] = useState(false);
const {
addComponentToDynamicZone,
allLayoutData,
layout,
modifiedData,
} = useDataManager();
const getDynamicDisplayedComponents = useCallback(() => {
return get(modifiedData, [name], []).map(data => data.__component);
}, [modifiedData, name]);
const getDynamicComponentSchemaData = useCallback(
compoUid => {
return get(allLayoutData, compoUid, {});
},
[allLayoutData]
);
2019-11-04 09:00:59 +01:00
const dynamicZoneAvailableComponents = get(
layout,
['schema', 'attributes', name, 'components'],
[]
);
2019-11-04 10:10:38 +01:00
const displayInfo = isOver && !isOpen;
const handleMouseEvent = () => setIsOver(prev => !prev);
2019-11-04 09:00:59 +01:00
return (
<>
2019-11-04 10:10:38 +01:00
<Wrapper show={displayInfo}>
2019-11-04 09:00:59 +01:00
<Button
isOpen={isOpen}
type="button"
2019-11-04 10:10:38 +01:00
onMouseEnter={handleMouseEvent}
onMouseLeave={handleMouseEvent}
2019-11-04 09:00:59 +01:00
onClick={() => setIsOpen(prev => !prev)}
/>
2019-11-04 10:10:38 +01:00
<div className="info">
<FormattedMessage
id={`${pluginId}.components.DynamicZone.add-compo`}
values={{ componentName: name }}
/>
</div>
<ComponentsPicker isOpen={isOpen}>
{dynamicZoneAvailableComponents.map(componentUid => {
return (
<DynamicComponentCard
key={componentUid}
componentUid={componentUid}
onClick={() => {
setIsOpen(false);
addComponentToDynamicZone(name, componentUid);
}}
/>
);
2019-11-04 10:10:38 +01:00
})}
</ComponentsPicker>
{getDynamicDisplayedComponents().map((componentUid, index) => {
console.log({ all: getDynamicComponentSchemaData(componentUid) });
return <div key={index}>{componentUid}</div>;
})}
2019-11-04 09:00:59 +01:00
</Wrapper>
</>
);
};
DynamicZone.propTypes = {
name: PropTypes.string.isRequired,
};
export { DynamicZone };
export default DynamicZone;