@gechiui/block-editor
Version:
135 lines (123 loc) • 4.46 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import { createElement, Fragment } from "@gechiui/element";
/**
* External dependencies
*/
import classnames from 'classnames';
/**
* GeChiUI dependencies
*/
import { useSelect, useDispatch } from '@gechiui/data';
import { useRef } from '@gechiui/element';
import { useViewportMatch } from '@gechiui/compose';
import { getBlockType, hasBlockSupport } from '@gechiui/blocks';
import { ToolbarGroup } from '@gechiui/components';
/**
* Internal dependencies
*/
import BlockMover from '../block-mover';
import BlockParentSelector from '../block-parent-selector';
import BlockSwitcher from '../block-switcher';
import BlockControls from '../block-controls';
import BlockSettingsMenu from '../block-settings-menu';
import { useShowMoversGestures } from './utils';
import { store as blockEditorStore } from '../../store';
export default function BlockToolbar(_ref) {
let {
hideDragHandle
} = _ref;
const {
blockClientIds,
blockClientId,
blockType,
hasFixedToolbar,
hasReducedUI,
isValid,
isVisual
} = useSelect(select => {
const {
getBlockName,
getBlockMode,
getSelectedBlockClientIds,
isBlockValid,
getBlockRootClientId,
getSettings
} = select(blockEditorStore);
const selectedBlockClientIds = getSelectedBlockClientIds();
const selectedBlockClientId = selectedBlockClientIds[0];
const blockRootClientId = getBlockRootClientId(selectedBlockClientId);
const settings = getSettings();
return {
blockClientIds: selectedBlockClientIds,
blockClientId: selectedBlockClientId,
blockType: selectedBlockClientId && getBlockType(getBlockName(selectedBlockClientId)),
hasFixedToolbar: settings.hasFixedToolbar,
hasReducedUI: settings.hasReducedUI,
rootClientId: blockRootClientId,
isValid: selectedBlockClientIds.every(id => isBlockValid(id)),
isVisual: selectedBlockClientIds.every(id => getBlockMode(id) === 'visual')
};
}, []); // Handles highlighting the current block outline on hover or focus of the
// block type toolbar area.
const {
toggleBlockHighlight
} = useDispatch(blockEditorStore);
const nodeRef = useRef();
const {
showMovers,
gestures: showMoversGestures
} = useShowMoversGestures({
ref: nodeRef,
onChange(isFocused) {
if (isFocused && hasReducedUI) {
return;
}
toggleBlockHighlight(blockClientId, isFocused);
}
}); // Account for the cases where the block toolbar is rendered within the
// header area and not contextually to the block.
const displayHeaderToolbar = useViewportMatch('medium', '<') || hasFixedToolbar;
if (blockType) {
if (!hasBlockSupport(blockType, '__experimentalToolbar', true)) {
return null;
}
}
const shouldShowMovers = displayHeaderToolbar || showMovers;
if (blockClientIds.length === 0) {
return null;
}
const shouldShowVisualToolbar = isValid && isVisual;
const isMultiToolbar = blockClientIds.length > 1;
const classes = classnames('block-editor-block-toolbar', shouldShowMovers && 'is-showing-movers');
return createElement("div", {
className: classes
}, !isMultiToolbar && !displayHeaderToolbar && createElement(BlockParentSelector, {
clientIds: blockClientIds
}), createElement("div", _extends({
ref: nodeRef
}, showMoversGestures), (shouldShowVisualToolbar || isMultiToolbar) && createElement(ToolbarGroup, {
className: "block-editor-block-toolbar__block-controls"
}, createElement(BlockSwitcher, {
clientIds: blockClientIds
}), createElement(BlockMover, {
clientIds: blockClientIds,
hideDragHandle: hideDragHandle || hasReducedUI
}))), shouldShowVisualToolbar && createElement(Fragment, null, createElement(BlockControls.Slot, {
group: "parent",
className: "block-editor-block-toolbar__slot"
}), createElement(BlockControls.Slot, {
group: "block",
className: "block-editor-block-toolbar__slot"
}), createElement(BlockControls.Slot, {
className: "block-editor-block-toolbar__slot"
}), createElement(BlockControls.Slot, {
group: "inline",
className: "block-editor-block-toolbar__slot"
}), createElement(BlockControls.Slot, {
group: "other",
className: "block-editor-block-toolbar__slot"
})), createElement(BlockSettingsMenu, {
clientIds: blockClientIds
}));
}
//# sourceMappingURL=index.js.map