UNPKG

@wordpress/block-editor

Version:
133 lines (127 loc) 4.49 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import { createElement, Fragment } from "@wordpress/element"; /** * External dependencies */ import { castArray, flow, noop } from 'lodash'; /** * WordPress dependencies */ import { __ } from '@wordpress/i18n'; import { DropdownMenu, MenuGroup, MenuItem } from '@wordpress/components'; import { useSelect } from '@wordpress/data'; import { moreVertical } from '@wordpress/icons'; import { Children, cloneElement, useCallback } from '@wordpress/element'; import { serialize } from '@wordpress/blocks'; import { store as keyboardShortcutsStore } from '@wordpress/keyboard-shortcuts'; import { useCopyToClipboard } from '@wordpress/compose'; /** * Internal dependencies */ import BlockActions from '../block-actions'; import BlockModeToggle from './block-mode-toggle'; import BlockHTMLConvertButton from './block-html-convert-button'; import __unstableBlockSettingsMenuFirstItem from './block-settings-menu-first-item'; import BlockSettingsMenuControls from '../block-settings-menu-controls'; const POPOVER_PROPS = { className: 'block-editor-block-settings-menu__popover', position: 'bottom right', isAlternate: true }; function CopyMenuItem({ blocks, onCopy }) { const ref = useCopyToClipboard(() => serialize(blocks), onCopy); return createElement(MenuItem, { ref: ref }, __('Copy')); } export function BlockSettingsDropdown({ clientIds, __experimentalSelectBlock, children, ...props }) { const blockClientIds = castArray(clientIds); const count = blockClientIds.length; const firstBlockClientId = blockClientIds[0]; const shortcuts = useSelect(select => { const { getShortcutRepresentation } = select(keyboardShortcutsStore); return { duplicate: getShortcutRepresentation('core/block-editor/duplicate'), remove: getShortcutRepresentation('core/block-editor/remove'), insertAfter: getShortcutRepresentation('core/block-editor/insert-after'), insertBefore: getShortcutRepresentation('core/block-editor/insert-before') }; }, []); const updateSelection = useCallback(__experimentalSelectBlock ? async clientIdsPromise => { const ids = await clientIdsPromise; if (ids && ids[0]) { __experimentalSelectBlock(ids[0]); } } : noop, [__experimentalSelectBlock]); const removeBlockLabel = count === 1 ? __('Remove block') : __('Remove blocks'); return createElement(BlockActions, { clientIds: clientIds, __experimentalUpdateSelection: !__experimentalSelectBlock }, ({ canDuplicate, canInsertDefaultBlock, isLocked, onDuplicate, onInsertAfter, onInsertBefore, onRemove, onCopy, onMoveTo, blocks }) => createElement(DropdownMenu, _extends({ icon: moreVertical, label: __('Options'), className: "block-editor-block-settings-menu", popoverProps: POPOVER_PROPS, noIcons: true }, props), ({ onClose }) => createElement(Fragment, null, createElement(MenuGroup, null, createElement(__unstableBlockSettingsMenuFirstItem.Slot, { fillProps: { onClose } }), count === 1 && createElement(BlockHTMLConvertButton, { clientId: firstBlockClientId }), createElement(CopyMenuItem, { blocks: blocks, onCopy: onCopy }), canDuplicate && createElement(MenuItem, { onClick: flow(onClose, onDuplicate, updateSelection), shortcut: shortcuts.duplicate }, __('Duplicate')), canInsertDefaultBlock && createElement(Fragment, null, createElement(MenuItem, { onClick: flow(onClose, onInsertBefore), shortcut: shortcuts.insertBefore }, __('Insert before')), createElement(MenuItem, { onClick: flow(onClose, onInsertAfter), shortcut: shortcuts.insertAfter }, __('Insert after'))), !isLocked && createElement(MenuItem, { onClick: flow(onClose, onMoveTo) }, __('Move to')), count === 1 && createElement(BlockModeToggle, { clientId: firstBlockClientId, onToggle: onClose })), createElement(BlockSettingsMenuControls.Slot, { fillProps: { onClose }, clientIds: clientIds }), typeof children === 'function' ? children({ onClose }) : Children.map(child => cloneElement(child, { onClose })), createElement(MenuGroup, null, !isLocked && createElement(MenuItem, { onClick: flow(onClose, onRemove, updateSelection), shortcut: shortcuts.remove }, removeBlockLabel))))); } export default BlockSettingsDropdown; //# sourceMappingURL=block-settings-dropdown.js.map