UNPKG

@wordpress/block-editor

Version:
130 lines (112 loc) 4.29 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _data = require("@wordpress/data"); var _blocks = require("@wordpress/blocks"); var _i18n = require("@wordpress/i18n"); var _a11y = require("@wordpress/a11y"); var _element = require("@wordpress/element"); var _store = require("../../../store"); /** * WordPress dependencies */ /** * Internal dependencies */ /** * @typedef WPInserterConfig * * @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 {WPInserterConfig} config Inserter Config. * @return {Array} Insertion Point State (rootClientID, onInsertBlocks and onToggle). */ function useInsertionPoint({ rootClientId = '', insertionIndex, clientId, isAppender, onSelect, shouldFocusBlock = true, selectBlockOnInsert = true }) { 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)((blocks, meta, shouldForceFocusBlock = 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, selectBlockOnInsert, shouldFocusBlock || shouldForceFocusBlock ? 0 : null, meta); } const blockLength = Array.isArray(blocks) ? blocks.length : 1; 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.', blockLength), blockLength); (0, _a11y.speak)(message); if (onSelect) { onSelect(blocks); } }, [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