UNPKG

@gechiui/block-editor

Version:
136 lines (116 loc) 4.39 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _lodash = require("lodash"); var _data = require("@gechiui/data"); var _blocks = require("@gechiui/blocks"); var _i18n = require("@gechiui/i18n"); var _a11y = require("@gechiui/a11y"); var _element = require("@gechiui/element"); var _store = require("../../../store"); /** * External dependencies */ /** * GeChiUI dependencies */ /** * Internal dependencies */ /** * @typedef GCInserterConfig * * @property {string=} rootClientId If set, insertion will be into the * block with this ID. * @property {number=} insertionIndex If set, insertion will be into this * explicit position. * @property {string=} clientId If set, insertion will be after the * block with this ID. * @property {boolean=} isAppender Whether the inserter is an appender * or not. * @property {Function=} onSelect Called after insertion. */ /** * Returns the insertion point state given the inserter config. * * @param {GCInserterConfig} config Inserter Config. * @return {Array} Insertion Point State (rootClientID, onInsertBlocks and onToggle). */ function useInsertionPoint(_ref) { let { rootClientId = '', insertionIndex, clientId, isAppender, onSelect, shouldFocusBlock = true } = _ref; const { getSelectedBlock } = (0, _data.useSelect)(_store.store); const { destinationRootClientId, destinationIndex } = (0, _data.useSelect)(select => { const { getSelectedBlockClientId, getBlockRootClientId, getBlockIndex, getBlockOrder } = select(_store.store); const selectedBlockClientId = getSelectedBlockClientId(); let _destinationRootClientId = rootClientId; let _destinationIndex; if (insertionIndex !== undefined) { // Insert into a specific index. _destinationIndex = insertionIndex; } else if (clientId) { // Insert after a specific client ID. _destinationIndex = getBlockIndex(clientId); } else if (!isAppender && selectedBlockClientId) { _destinationRootClientId = getBlockRootClientId(selectedBlockClientId); _destinationIndex = getBlockIndex(selectedBlockClientId) + 1; } else { // Insert at the end of the list. _destinationIndex = getBlockOrder(_destinationRootClientId).length; } return { destinationRootClientId: _destinationRootClientId, destinationIndex: _destinationIndex }; }, [rootClientId, insertionIndex, clientId, isAppender]); const { replaceBlocks, insertBlocks, showInsertionPoint, hideInsertionPoint } = (0, _data.useDispatch)(_store.store); const onInsertBlocks = (0, _element.useCallback)(function (blocks, meta) { let shouldForceFocusBlock = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; const selectedBlock = getSelectedBlock(); if (!isAppender && selectedBlock && (0, _blocks.isUnmodifiedDefaultBlock)(selectedBlock)) { replaceBlocks(selectedBlock.clientId, blocks, null, shouldFocusBlock || shouldForceFocusBlock ? 0 : null, meta); } else { insertBlocks(blocks, destinationIndex, destinationRootClientId, true, shouldFocusBlock || shouldForceFocusBlock ? 0 : null, meta); } const message = (0, _i18n.sprintf)( // translators: %d: the name of the block that has been added (0, _i18n._n)('%d block added.', '%d blocks added.', (0, _lodash.castArray)(blocks).length), (0, _lodash.castArray)(blocks).length); (0, _a11y.speak)(message); if (onSelect) { onSelect(); } }, [isAppender, getSelectedBlock, replaceBlocks, insertBlocks, destinationRootClientId, destinationIndex, onSelect, shouldFocusBlock]); const onToggleInsertionPoint = (0, _element.useCallback)(show => { if (show) { showInsertionPoint(destinationRootClientId, destinationIndex); } else { hideInsertionPoint(); } }, [showInsertionPoint, hideInsertionPoint, destinationRootClientId, destinationIndex]); return [destinationRootClientId, onInsertBlocks, onToggleInsertionPoint]; } var _default = useInsertionPoint; exports.default = _default; //# sourceMappingURL=use-insertion-point.js.map