UNPKG

@plone/volto

Version:
88 lines (81 loc) 2.48 kB
import React from 'react'; import { Button, Ref } from 'semantic-ui-react'; import { defineMessages, useIntl } from 'react-intl'; import BlockChooser from '@plone/volto/components/manage/BlockChooser/BlockChooser'; import Icon from '@plone/volto/components/theme/Icon/Icon'; import { useDetectClickOutside } from '@plone/volto/helpers/Utils/useDetectClickOutside'; import addSVG from '@plone/volto/icons/add.svg'; import { usePopper } from 'react-popper'; import { createPortal } from 'react-dom'; const messages = defineMessages({ addBlock: { id: 'Add block in position {index}', defaultMessage: 'Add block in position {index}', }, }); const NewBlockAddButton = (props) => { const intl = useIntl(); const { blocksConfig, block, index, onMutateBlock } = props; const [isOpenMenu, setOpenMenu] = React.useState(false); const blockChooserRef = useDetectClickOutside({ onTriggered: () => setOpenMenu(false), triggerKeys: ['Escape'], }); const [referenceElement, setReferenceElement] = React.useState(null); const [popperElement, setPopperElement] = React.useState(null); const { styles, attributes } = usePopper(referenceElement, popperElement, { placement: 'bottom', modifiers: [ { name: 'offset', options: { offset: [0, -30], }, }, { name: 'flip', options: { fallbackPlacements: ['right', 'top-start'], }, }, ], }); return ( <> <Ref innerRef={setReferenceElement}> <Button type="button" basic icon onClick={() => setOpenMenu(true)} className="add-block-button" aria-label={intl.formatMessage(messages.addBlock, { index, })} > <Icon name={addSVG} className="circled" size="24px" /> </Button> </Ref> {isOpenMenu ? createPortal( <div ref={setPopperElement} style={styles.popper} {...attributes.popper} className="container-chooser-wrapper" > <BlockChooser onMutateBlock={onMutateBlock} currentBlock={block} showRestricted blocksConfig={blocksConfig} ref={blockChooserRef} /> </div>, document.body, ) : null} </> ); }; export default NewBlockAddButton;