@gechiui/block-editor
Version:
164 lines (157 loc) • 5.47 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import { createElement, Fragment } from "@gechiui/element";
/**
* External dependencies
*/
import { castArray, flow, noop } from 'lodash';
/**
* GeChiUI dependencies
*/
import { __, sprintf } from '@gechiui/i18n';
import { DropdownMenu, MenuGroup, MenuItem } from '@gechiui/components';
import { useSelect } from '@gechiui/data';
import { moreVertical } from '@gechiui/icons';
import { Children, cloneElement, useCallback } from '@gechiui/element';
import { serialize, store as blocksStore } from '@gechiui/blocks';
import { store as keyboardShortcutsStore } from '@gechiui/keyboard-shortcuts';
import { useCopyToClipboard } from '@gechiui/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';
import { store as blockEditorStore } from '../../store';
const POPOVER_PROPS = {
className: 'block-editor-block-settings-menu__popover',
position: 'bottom right',
isAlternate: true
};
function CopyMenuItem(_ref) {
let {
blocks,
onCopy
} = _ref;
const ref = useCopyToClipboard(() => serialize(blocks), onCopy);
return createElement(MenuItem, {
ref: ref
}, __('复制'));
}
export function BlockSettingsDropdown(_ref2) {
let {
clientIds,
__experimentalSelectBlock,
children,
...props
} = _ref2;
const blockClientIds = castArray(clientIds);
const count = blockClientIds.length;
const firstBlockClientId = blockClientIds[0];
const {
onlyBlock,
title
} = useSelect(select => {
var _getBlockType;
const {
getBlockCount,
getBlockName
} = select(blockEditorStore);
const {
getBlockType
} = select(blocksStore);
return {
onlyBlock: 1 === getBlockCount(),
title: (_getBlockType = getBlockType(getBlockName(firstBlockClientId))) === null || _getBlockType === void 0 ? void 0 : _getBlockType.title
};
}, [firstBlockClientId]);
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 label = sprintf(
/* translators: %s: block name */
__('删除 %s'), title);
const removeBlockLabel = count === 1 ? label : __('移除区块');
return createElement(BlockActions, {
clientIds: clientIds,
__experimentalUpdateSelection: !__experimentalSelectBlock
}, _ref3 => {
let {
canDuplicate,
canInsertDefaultBlock,
canMove,
canRemove,
onDuplicate,
onInsertAfter,
onInsertBefore,
onRemove,
onCopy,
onMoveTo,
blocks
} = _ref3;
return createElement(DropdownMenu, _extends({
icon: moreVertical,
label: __('选项'),
className: "block-editor-block-settings-menu",
popoverProps: POPOVER_PROPS,
noIcons: true
}, props), _ref4 => {
let {
onClose
} = _ref4;
return 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
}, __('创建副本')), canInsertDefaultBlock && createElement(Fragment, null, createElement(MenuItem, {
onClick: flow(onClose, onInsertBefore),
shortcut: shortcuts.insertBefore
}, __('在当前区块前插入')), createElement(MenuItem, {
onClick: flow(onClose, onInsertAfter),
shortcut: shortcuts.insertAfter
}, __('在当前区块后插入'))), canMove && !onlyBlock && createElement(MenuItem, {
onClick: flow(onClose, onMoveTo)
}, __('移动至')), 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
})), canRemove && createElement(MenuGroup, null, createElement(MenuItem, {
onClick: flow(onClose, onRemove, updateSelection),
shortcut: shortcuts.remove
}, removeBlockLabel)));
});
});
}
export default BlockSettingsDropdown;
//# sourceMappingURL=block-settings-dropdown.js.map