{
  "version": 3,
  "sources": ["../../src/store/actions.js"],
  "sourcesContent": ["/* eslint no-console: [ 'error', { allow: [ 'error', 'warn' ] } ] */\n/**\n * WordPress dependencies\n */\nimport {\n\tcloneBlock,\n\t__experimentalCloneSanitizedBlock,\n\tcreateBlock,\n\tdoBlocksMatchTemplate,\n\tgetBlockType,\n\tgetDefaultBlockName,\n\thasBlockSupport,\n\tswitchToBlockType,\n\tsynchronizeBlocksWithTemplate,\n\tgetBlockSupport,\n\tisUnmodifiedDefaultBlock,\n\tisUnmodifiedBlock,\n} from '@wordpress/blocks';\nimport { speak } from '@wordpress/a11y';\nimport { __, _n, sprintf } from '@wordpress/i18n';\nimport { store as noticesStore } from '@wordpress/notices';\nimport { create, insert, remove, toHTMLString } from '@wordpress/rich-text';\nimport deprecated from '@wordpress/deprecated';\nimport { store as preferencesStore } from '@wordpress/preferences';\n\n/**\n * Internal dependencies\n */\nimport {\n\tretrieveSelectedAttribute,\n\tfindRichTextAttributeKey,\n\tSTART_OF_SELECTED_AREA,\n} from '../utils/selection';\nimport {\n\t__experimentalUpdateSettings,\n\tprivateRemoveBlocks,\n\teditContentOnlySection,\n} from './private-actions';\n\n/** @typedef {import('../components/use-on-block-drop/types').WPDropOperation} WPDropOperation */\n\nconst castArray = ( maybeArray ) =>\n\tArray.isArray( maybeArray ) ? maybeArray : [ maybeArray ];\n\n/**\n * Action that resets blocks state to the specified array of blocks, taking precedence\n * over any other content reflected as an edit in state.\n *\n * @param {Array} blocks Array of blocks.\n */\nexport const resetBlocks =\n\t( blocks ) =>\n\t( { dispatch } ) => {\n\t\tdispatch( { type: 'RESET_BLOCKS', blocks } );\n\t\tdispatch( validateBlocksToTemplate( blocks ) );\n\t};\n\n/**\n * Block validity is a function of blocks state (at the point of a\n * reset) and the template setting. As a compromise to its placement\n * across distinct parts of state, it is implemented here as a side\n * effect of the block reset action.\n *\n * @param {Array} blocks Array of blocks.\n */\nexport const validateBlocksToTemplate =\n\t( blocks ) =>\n\t( { select, dispatch } ) => {\n\t\tconst template = select.getTemplate();\n\t\tconst templateLock = select.getTemplateLock();\n\n\t\t// Unlocked templates are considered always valid because they act\n\t\t// as default values only.\n\t\tconst isBlocksValidToTemplate =\n\t\t\t! template ||\n\t\t\ttemplateLock !== 'all' ||\n\t\t\tdoBlocksMatchTemplate( blocks, template );\n\n\t\t// Update if validity has changed.\n\t\tconst isValidTemplate = select.isValidTemplate();\n\n\t\tif ( isBlocksValidToTemplate !== isValidTemplate ) {\n\t\t\tdispatch.setTemplateValidity( isBlocksValidToTemplate );\n\t\t\treturn isBlocksValidToTemplate;\n\t\t}\n\t};\n\n/**\n * A block selection object.\n *\n * @typedef {Object} WPBlockSelection\n *\n * @property {string} clientId     A block client ID.\n * @property {string} attributeKey A block attribute key.\n * @property {number} offset       An attribute value offset, based on the rich\n *                                 text value. See `wp.richText.create`.\n */\n\n/**\n * A selection object.\n *\n * @typedef {Object} WPSelection\n *\n * @property {WPBlockSelection} start The selection start.\n * @property {WPBlockSelection} end   The selection end.\n */\n\n/**\n * Returns an action object used in signalling that selection state should be\n * reset to the specified selection.\n *\n * @param {WPBlockSelection} selectionStart  The selection start.\n * @param {WPBlockSelection} selectionEnd    The selection end.\n * @param {0|-1|null}        initialPosition Initial block position.\n *\n * @return {Object} Action object.\n */\nexport function resetSelection(\n\tselectionStart,\n\tselectionEnd,\n\tinitialPosition\n) {\n\treturn {\n\t\ttype: 'RESET_SELECTION',\n\t\tselectionStart,\n\t\tselectionEnd,\n\t\tinitialPosition,\n\t};\n}\n\n/**\n * Returns an action object used in signalling that blocks have been received.\n * Unlike resetBlocks, these should be appended to the existing known set, not\n * replacing.\n *\n * @deprecated\n *\n * @param {Object[]} blocks Array of block objects.\n *\n * @return {Object} Action object.\n */\nexport function receiveBlocks( blocks ) {\n\tdeprecated( 'wp.data.dispatch( \"core/block-editor\" ).receiveBlocks', {\n\t\tsince: '5.9',\n\t\talternative: 'resetBlocks or insertBlocks',\n\t} );\n\n\treturn {\n\t\ttype: 'RECEIVE_BLOCKS',\n\t\tblocks,\n\t};\n}\n\n/**\n * Action that updates attributes of multiple blocks with the specified client IDs.\n *\n * @param {string|string[]} clientIds                     Block client IDs.\n * @param {Object}          attributes                    Block attributes to be merged. Should be keyed by clientIds if `options.uniqueByBlock` is true.\n * @param {Object}          options                       Updating options.\n * @param {boolean}         [options.uniqueByBlock=false] Whether each block in clientIds array has a unique set of attributes.\n * @return {Object} Action object.\n */\nexport function updateBlockAttributes(\n\tclientIds,\n\tattributes,\n\toptions = { uniqueByBlock: false }\n) {\n\tif ( typeof options === 'boolean' ) {\n\t\toptions = { uniqueByBlock: options };\n\t}\n\n\treturn {\n\t\ttype: 'UPDATE_BLOCK_ATTRIBUTES',\n\t\tclientIds: castArray( clientIds ),\n\t\tattributes,\n\t\toptions,\n\t};\n}\n\n/**\n * Action that updates the block with the specified client ID.\n *\n * @param {string} clientId Block client ID.\n * @param {Object} updates  Block attributes to be merged.\n *\n * @return {Object} Action object.\n */\nexport function updateBlock( clientId, updates ) {\n\treturn {\n\t\ttype: 'UPDATE_BLOCK',\n\t\tclientId,\n\t\tupdates,\n\t};\n}\n\n/**\n * Returns an action object used in signalling that the block with the\n * specified client ID has been selected, optionally accepting a position\n * value reflecting its selection directionality. An initialPosition of -1\n * reflects a reverse selection.\n *\n * @param {string}    clientId        Block client ID.\n * @param {0|-1|null} initialPosition Optional initial position. Pass -1 to reflect reverse selection\n *                                    or `null` to prevent focusing the block.\n *\n * @return {Object} Action object.\n */\nexport function selectBlock( clientId, initialPosition = 0 ) {\n\treturn {\n\t\ttype: 'SELECT_BLOCK',\n\t\tinitialPosition,\n\t\tclientId,\n\t};\n}\n\n/**\n * Returns an action object used in signalling that the block with the\n * specified client ID has been hovered.\n *\n * @deprecated\n */\nexport function hoverBlock() {\n\tdeprecated( 'wp.data.dispatch( \"core/block-editor\" ).hoverBlock', {\n\t\tsince: '6.9',\n\t\tversion: '7.1',\n\t} );\n\treturn {\n\t\ttype: 'DO_NOTHING',\n\t};\n}\n\n/**\n * Yields action objects used in signalling that the block preceding the given\n * clientId (or optionally, its first parent from bottom to top)\n * should be selected.\n *\n * @param {string}  clientId         Block client ID.\n * @param {boolean} fallbackToParent If true, select the first parent if there is no previous block.\n */\nexport const selectPreviousBlock =\n\t( clientId, fallbackToParent = false ) =>\n\t( { select, dispatch } ) => {\n\t\tconst previousBlockClientId =\n\t\t\tselect.getPreviousBlockClientId( clientId );\n\t\tif ( previousBlockClientId ) {\n\t\t\tdispatch.selectBlock( previousBlockClientId, -1 );\n\t\t} else if ( fallbackToParent ) {\n\t\t\tconst firstParentClientId = select.getBlockRootClientId( clientId );\n\t\t\tif ( firstParentClientId ) {\n\t\t\t\tdispatch.selectBlock( firstParentClientId, -1 );\n\t\t\t} else {\n\t\t\t\t// Fallback to next block when no previous block and no parent\n\t\t\t\tconst nextBlockClientId =\n\t\t\t\t\tselect.getNextBlockClientId( clientId );\n\t\t\t\tif ( nextBlockClientId ) {\n\t\t\t\t\tdispatch.selectBlock( nextBlockClientId, 0 );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n/**\n * Yields action objects used in signalling that the block following the given\n * clientId should be selected.\n *\n * @param {string} clientId Block client ID.\n */\nexport const selectNextBlock =\n\t( clientId ) =>\n\t( { select, dispatch } ) => {\n\t\tconst nextBlockClientId = select.getNextBlockClientId( clientId );\n\t\tif ( nextBlockClientId ) {\n\t\t\tdispatch.selectBlock( nextBlockClientId );\n\t\t}\n\t};\n\n/**\n * Action that starts block multi-selection.\n *\n * @return {Object} Action object.\n */\nexport function startMultiSelect() {\n\treturn {\n\t\ttype: 'START_MULTI_SELECT',\n\t};\n}\n\n/**\n * Action that stops block multi-selection.\n *\n * @return {Object} Action object.\n */\nexport function stopMultiSelect() {\n\treturn {\n\t\ttype: 'STOP_MULTI_SELECT',\n\t};\n}\n\n/**\n * Action that changes block multi-selection.\n *\n * @param {string}      start                         First block of the multi selection.\n * @param {string}      end                           Last block of the multiselection.\n * @param {number|null} __experimentalInitialPosition Optional initial position. Pass as null to skip focus within editor canvas.\n */\nexport const multiSelect =\n\t( start, end, __experimentalInitialPosition = 0 ) =>\n\t( { select, dispatch } ) => {\n\t\tconst startBlockRootClientId = select.getBlockRootClientId( start );\n\t\tconst endBlockRootClientId = select.getBlockRootClientId( end );\n\n\t\t// Only allow block multi-selections at the same level.\n\t\tif ( startBlockRootClientId !== endBlockRootClientId ) {\n\t\t\treturn;\n\t\t}\n\n\t\tdispatch( {\n\t\t\ttype: 'MULTI_SELECT',\n\t\t\tstart,\n\t\t\tend,\n\t\t\tinitialPosition: __experimentalInitialPosition,\n\t\t} );\n\n\t\tconst blockCount = select.getSelectedBlockCount();\n\n\t\tspeak(\n\t\t\tsprintf(\n\t\t\t\t/* translators: %s: number of selected blocks */\n\t\t\t\t_n( '%s block selected.', '%s blocks selected.', blockCount ),\n\t\t\t\tblockCount\n\t\t\t),\n\t\t\t'assertive'\n\t\t);\n\t};\n\n/**\n * Action that clears the block selection.\n *\n * @return {Object} Action object.\n */\nexport function clearSelectedBlock() {\n\treturn {\n\t\ttype: 'CLEAR_SELECTED_BLOCK',\n\t};\n}\n\n/**\n * Action that enables or disables block selection.\n *\n * @param {boolean} [isSelectionEnabled=true] Whether block selection should\n *                                            be enabled.\n *\n * @return {Object} Action object.\n */\nexport function toggleSelection( isSelectionEnabled = true ) {\n\treturn {\n\t\ttype: 'TOGGLE_SELECTION',\n\t\tisSelectionEnabled,\n\t};\n}\n\n/**\n * Action that replaces given blocks with one or more replacement blocks.\n *\n * @param {(string|string[])} clientIds       Block client ID(s) to replace.\n * @param {(Object|Object[])} blocks          Replacement block(s).\n * @param {number}            indexToSelect   Index of replacement block to select.\n * @param {0|-1|null}         initialPosition Index of caret after in the selected block after the operation.\n * @param {?Object}           meta            Optional Meta values to be passed to the action object.\n *\n * @return {Object} Action object.\n */\nexport const replaceBlocks =\n\t( clientIds, blocks, indexToSelect, initialPosition = 0, meta ) =>\n\t( { select, dispatch, registry } ) => {\n\t\tclientIds = castArray( clientIds );\n\t\tblocks = castArray( blocks );\n\t\tconst rootClientId = select.getBlockRootClientId( clientIds[ 0 ] );\n\t\t// Replace is valid if the new blocks can be inserted in the root block.\n\t\tfor ( let index = 0; index < blocks.length; index++ ) {\n\t\t\tconst block = blocks[ index ];\n\t\t\tconst canInsertBlock = select.canInsertBlockType(\n\t\t\t\tblock.name,\n\t\t\t\trootClientId\n\t\t\t);\n\t\t\tif ( ! canInsertBlock ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t// We're batching these two actions because an extra `undo/redo` step can\n\t\t// be created, based on whether we insert a default block or not.\n\t\tregistry.batch( () => {\n\t\t\tdispatch( {\n\t\t\t\ttype: 'REPLACE_BLOCKS',\n\t\t\t\tclientIds,\n\t\t\t\tblocks,\n\t\t\t\ttime: Date.now(),\n\t\t\t\tindexToSelect,\n\t\t\t\tinitialPosition,\n\t\t\t\tmeta,\n\t\t\t} );\n\t\t\t// To avoid a focus loss when removing the last block, assure there is\n\t\t\t// always a default block if the last of the blocks have been removed.\n\t\t\tdispatch.ensureDefaultBlock();\n\t\t} );\n\t};\n\n/**\n * Action that replaces a single block with one or more replacement blocks.\n *\n * @param {(string|string[])} clientId Block client ID to replace.\n * @param {(Object|Object[])} block    Replacement block(s).\n *\n * @return {Object} Action object.\n */\nexport function replaceBlock( clientId, block ) {\n\treturn replaceBlocks( clientId, block );\n}\n\n/**\n * Higher-order action creator which, given the action type to dispatch creates\n * an action creator for managing block movement.\n *\n * @param {string} type Action type to dispatch.\n *\n * @return {Function} Action creator.\n */\nconst createOnMove =\n\t( type ) =>\n\t( clientIds, rootClientId ) =>\n\t( { select, dispatch } ) => {\n\t\t// If one of the blocks is locked or the parent is locked, we cannot move any block.\n\t\tconst canMoveBlocks = select.canMoveBlocks( clientIds );\n\t\tif ( ! canMoveBlocks ) {\n\t\t\treturn;\n\t\t}\n\n\t\tdispatch( { type, clientIds: castArray( clientIds ), rootClientId } );\n\t};\n\nexport const moveBlocksDown = createOnMove( 'MOVE_BLOCKS_DOWN' );\nexport const moveBlocksUp = createOnMove( 'MOVE_BLOCKS_UP' );\n\n/**\n * Action that moves given blocks to a new position.\n *\n * @param {?string} clientIds        The client IDs of the blocks.\n * @param {?string} fromRootClientId Root client ID source.\n * @param {?string} toRootClientId   Root client ID destination.\n * @param {number}  index            The index to move the blocks to.\n */\nexport const moveBlocksToPosition =\n\t( clientIds, fromRootClientId = '', toRootClientId = '', index ) =>\n\t( { select, dispatch } ) => {\n\t\tconst canMoveBlocks = select.canMoveBlocks( clientIds );\n\n\t\t// If one of the blocks is locked or the parent is locked, we cannot move any block.\n\t\tif ( ! canMoveBlocks ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If moving inside the same root block the move is always possible.\n\t\tif ( fromRootClientId !== toRootClientId ) {\n\t\t\tconst canRemoveBlocks = select.canRemoveBlocks( clientIds );\n\n\t\t\t// If we're moving to another block, it means we're deleting blocks from\n\t\t\t// the original block, so we need to check if removing is possible.\n\t\t\tif ( ! canRemoveBlocks ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst canInsertBlocks = select.canInsertBlocks(\n\t\t\t\tclientIds,\n\t\t\t\ttoRootClientId\n\t\t\t);\n\n\t\t\t// If moving to other parent block, the move is possible if we can insert a block of the same type inside the new parent block.\n\t\t\tif ( ! canInsertBlocks ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tdispatch( {\n\t\t\ttype: 'MOVE_BLOCKS_TO_POSITION',\n\t\t\tfromRootClientId,\n\t\t\ttoRootClientId,\n\t\t\tclientIds,\n\t\t\tindex,\n\t\t} );\n\t};\n\n/**\n * Action that moves given block to a new position.\n *\n * @param {?string} clientId         The client ID of the block.\n * @param {?string} fromRootClientId Root client ID source.\n * @param {?string} toRootClientId   Root client ID destination.\n * @param {number}  index            The index to move the block to.\n */\nexport function moveBlockToPosition(\n\tclientId,\n\tfromRootClientId = '',\n\ttoRootClientId = '',\n\tindex\n) {\n\treturn moveBlocksToPosition(\n\t\t[ clientId ],\n\t\tfromRootClientId,\n\t\ttoRootClientId,\n\t\tindex\n\t);\n}\n\n/**\n * Action that inserts a single block, optionally at a specific index respective a root block list.\n *\n * Only allowed blocks are inserted. The action may fail silently for blocks that are not allowed or if\n * a templateLock is active on the block list.\n *\n * @param {Object}    block           Block object to insert.\n * @param {?number}   index           Index at which block should be inserted.\n * @param {?string}   rootClientId    Optional root client ID of block list on which to insert.\n * @param {?boolean}  updateSelection If true block selection will be updated. If false, block selection will not change. Defaults to true.\n * @param {0|-1|null} initialPosition Initial focus position. Setting it to null prevent focusing the inserted block.\n * @param {?Object}   meta            Optional Meta values to be passed to the action object.\n *\n * @return {Object} Action object.\n */\nexport function insertBlock(\n\tblock,\n\tindex,\n\trootClientId,\n\tupdateSelection,\n\tinitialPosition,\n\tmeta\n) {\n\treturn insertBlocks(\n\t\t[ block ],\n\t\tindex,\n\t\trootClientId,\n\t\tupdateSelection,\n\t\tinitialPosition,\n\t\tmeta\n\t);\n}\n\n/**\n * Action that inserts an array of blocks, optionally at a specific index respective a root block list.\n *\n * Only allowed blocks are inserted. The action may fail silently for blocks that are not allowed or if\n * a templateLock is active on the block list.\n *\n * @param {Object[]}  blocks          Block objects to insert.\n * @param {?number}   index           Index at which block should be inserted.\n * @param {?string}   rootClientId    Optional root client ID of block list on which to insert.\n * @param {?boolean}  updateSelection If true block selection will be updated.  If false, block selection will not change. Defaults to true.\n * @param {0|-1|null} initialPosition Initial focus position. Setting it to null prevent focusing the inserted block.\n * @param {?Object}   meta            Optional Meta values to be passed to the action object.\n *\n * @return {Object} Action object.\n */\nexport const insertBlocks =\n\t(\n\t\tblocks,\n\t\tindex,\n\t\trootClientId,\n\t\tupdateSelection = true,\n\t\tinitialPosition = 0,\n\t\tmeta\n\t) =>\n\t( { select, dispatch } ) => {\n\t\tif ( initialPosition !== null && typeof initialPosition === 'object' ) {\n\t\t\tmeta = initialPosition;\n\t\t\tinitialPosition = 0;\n\t\t\tdeprecated(\n\t\t\t\t\"meta argument in wp.data.dispatch('core/block-editor')\",\n\t\t\t\t{\n\t\t\t\t\tsince: '5.8',\n\t\t\t\t\thint: 'The meta argument is now the 6th argument of the function',\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tblocks = castArray( blocks );\n\t\tconst allowedBlocks = [];\n\t\tfor ( const block of blocks ) {\n\t\t\tconst isValid = select.canInsertBlockType(\n\t\t\t\tblock.name,\n\t\t\t\trootClientId\n\t\t\t);\n\t\t\tif ( isValid ) {\n\t\t\t\tallowedBlocks.push( block );\n\t\t\t}\n\t\t}\n\t\tif ( allowedBlocks.length ) {\n\t\t\tdispatch( {\n\t\t\t\ttype: 'INSERT_BLOCKS',\n\t\t\t\tblocks: allowedBlocks,\n\t\t\t\tindex,\n\t\t\t\trootClientId,\n\t\t\t\ttime: Date.now(),\n\t\t\t\tupdateSelection,\n\t\t\t\tinitialPosition: updateSelection ? initialPosition : null,\n\t\t\t\tmeta,\n\t\t\t} );\n\t\t}\n\t};\n\n/**\n * Action that shows the insertion point.\n *\n * @param    {?string}         rootClientId           Optional root client ID of block list on\n *                                                    which to insert.\n * @param    {?number}         index                  Index at which block should be inserted.\n * @param    {?Object}         __unstableOptions      Additional options.\n * @property {boolean}         __unstableWithInserter Whether or not to show an inserter button.\n * @property {WPDropOperation} operation              The operation to perform when applied,\n *                                                    either 'insert' or 'replace' for now.\n *\n * @return {Object} Action object.\n */\nexport function showInsertionPoint(\n\trootClientId,\n\tindex,\n\t__unstableOptions = {}\n) {\n\tconst { __unstableWithInserter, operation, nearestSide } =\n\t\t__unstableOptions;\n\treturn {\n\t\ttype: 'SHOW_INSERTION_POINT',\n\t\trootClientId,\n\t\tindex,\n\t\t__unstableWithInserter,\n\t\toperation,\n\t\tnearestSide,\n\t};\n}\n/**\n * Action that hides the insertion point.\n */\nexport const hideInsertionPoint =\n\t() =>\n\t( { select, dispatch } ) => {\n\t\tif ( ! select.isBlockInsertionPointVisible() ) {\n\t\t\treturn;\n\t\t}\n\t\tdispatch( {\n\t\t\ttype: 'HIDE_INSERTION_POINT',\n\t\t} );\n\t};\n\n/**\n * Action that resets the template validity.\n *\n * @param {boolean} isValid template validity flag.\n *\n * @return {Object} Action object.\n */\nexport function setTemplateValidity( isValid ) {\n\treturn {\n\t\ttype: 'SET_TEMPLATE_VALIDITY',\n\t\tisValid,\n\t};\n}\n\n/**\n * Action that synchronizes the template with the list of blocks.\n *\n * @return {Object} Action object.\n */\nexport const synchronizeTemplate =\n\t() =>\n\t( { select, dispatch } ) => {\n\t\tdispatch( { type: 'SYNCHRONIZE_TEMPLATE' } );\n\t\tconst blocks = select.getBlocks();\n\t\tconst template = select.getTemplate();\n\t\tconst updatedBlockList = synchronizeBlocksWithTemplate(\n\t\t\tblocks,\n\t\t\ttemplate\n\t\t);\n\n\t\tdispatch.resetBlocks( updatedBlockList );\n\t};\n\n/**\n * Delete the current selection.\n *\n * @param {boolean} isForward\n */\nexport const __unstableDeleteSelection =\n\t( isForward ) =>\n\t( { registry, select, dispatch } ) => {\n\t\tconst selectionAnchor = select.getSelectionStart();\n\t\tconst selectionFocus = select.getSelectionEnd();\n\n\t\tif ( selectionAnchor.clientId === selectionFocus.clientId ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// It's not mergeable if there's no rich text selection.\n\t\tif (\n\t\t\t! selectionAnchor.attributeKey ||\n\t\t\t! selectionFocus.attributeKey ||\n\t\t\ttypeof selectionAnchor.offset === 'undefined' ||\n\t\t\ttypeof selectionFocus.offset === 'undefined'\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst anchorRootClientId = select.getBlockRootClientId(\n\t\t\tselectionAnchor.clientId\n\t\t);\n\t\tconst focusRootClientId = select.getBlockRootClientId(\n\t\t\tselectionFocus.clientId\n\t\t);\n\n\t\t// It's not mergeable if the selection doesn't start and end in the same\n\t\t// block list. Maybe in the future it should be allowed.\n\t\tif ( anchorRootClientId !== focusRootClientId ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst blockOrder = select.getBlockOrder( anchorRootClientId );\n\t\tconst anchorIndex = blockOrder.indexOf( selectionAnchor.clientId );\n\t\tconst focusIndex = blockOrder.indexOf( selectionFocus.clientId );\n\n\t\t// Reassign selection start and end based on order.\n\t\tlet selectionStart, selectionEnd;\n\n\t\tif ( anchorIndex > focusIndex ) {\n\t\t\tselectionStart = selectionFocus;\n\t\t\tselectionEnd = selectionAnchor;\n\t\t} else {\n\t\t\tselectionStart = selectionAnchor;\n\t\t\tselectionEnd = selectionFocus;\n\t\t}\n\n\t\tconst targetSelection = isForward ? selectionEnd : selectionStart;\n\t\tconst targetBlock = select.getBlock( targetSelection.clientId );\n\t\tconst targetBlockType = getBlockType( targetBlock.name );\n\n\t\tif ( ! targetBlockType.merge ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst selectionA = selectionStart;\n\t\tconst selectionB = selectionEnd;\n\n\t\tconst blockA = select.getBlock( selectionA.clientId );\n\t\tconst blockB = select.getBlock( selectionB.clientId );\n\n\t\tconst htmlA = blockA.attributes[ selectionA.attributeKey ];\n\t\tconst htmlB = blockB.attributes[ selectionB.attributeKey ];\n\n\t\tlet valueA = create( { html: htmlA } );\n\t\tlet valueB = create( { html: htmlB } );\n\n\t\tvalueA = remove( valueA, selectionA.offset, valueA.text.length );\n\t\tvalueB = insert( valueB, START_OF_SELECTED_AREA, 0, selectionB.offset );\n\n\t\t// Clone the blocks so we don't manipulate the original.\n\t\tconst cloneA = cloneBlock( blockA, {\n\t\t\t[ selectionA.attributeKey ]: toHTMLString( { value: valueA } ),\n\t\t} );\n\t\tconst cloneB = cloneBlock( blockB, {\n\t\t\t[ selectionB.attributeKey ]: toHTMLString( { value: valueB } ),\n\t\t} );\n\n\t\tconst followingBlock = isForward ? cloneA : cloneB;\n\n\t\t// We can only merge blocks with similar types\n\t\t// thus, we transform the block to merge first\n\t\tconst blocksWithTheSameType =\n\t\t\tblockA.name === blockB.name\n\t\t\t\t? [ followingBlock ]\n\t\t\t\t: switchToBlockType( followingBlock, targetBlockType.name );\n\n\t\t// If the block types can not match, do nothing\n\t\tif ( ! blocksWithTheSameType || ! blocksWithTheSameType.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet updatedAttributes;\n\n\t\tif ( isForward ) {\n\t\t\tconst blockToMerge = blocksWithTheSameType.pop();\n\t\t\tupdatedAttributes = targetBlockType.merge(\n\t\t\t\tblockToMerge.attributes,\n\t\t\t\tcloneB.attributes\n\t\t\t);\n\t\t} else {\n\t\t\tconst blockToMerge = blocksWithTheSameType.shift();\n\t\t\tupdatedAttributes = targetBlockType.merge(\n\t\t\t\tcloneA.attributes,\n\t\t\t\tblockToMerge.attributes\n\t\t\t);\n\t\t}\n\n\t\tconst newAttributeKey = retrieveSelectedAttribute( updatedAttributes );\n\n\t\tconst convertedHtml = updatedAttributes[ newAttributeKey ];\n\t\tconst convertedValue = create( { html: convertedHtml } );\n\t\tconst newOffset = convertedValue.text.indexOf( START_OF_SELECTED_AREA );\n\t\tconst newValue = remove( convertedValue, newOffset, newOffset + 1 );\n\t\tconst newHtml = toHTMLString( { value: newValue } );\n\n\t\tupdatedAttributes[ newAttributeKey ] = newHtml;\n\n\t\tconst selectedBlockClientIds = select.getSelectedBlockClientIds();\n\t\tconst replacement = [\n\t\t\t...( isForward ? blocksWithTheSameType : [] ),\n\t\t\t{\n\t\t\t\t// Preserve the original client ID.\n\t\t\t\t...targetBlock,\n\t\t\t\tattributes: {\n\t\t\t\t\t...targetBlock.attributes,\n\t\t\t\t\t...updatedAttributes,\n\t\t\t\t},\n\t\t\t},\n\t\t\t...( isForward ? [] : blocksWithTheSameType ),\n\t\t];\n\n\t\tregistry.batch( () => {\n\t\t\tdispatch.selectionChange(\n\t\t\t\ttargetBlock.clientId,\n\t\t\t\tnewAttributeKey,\n\t\t\t\tnewOffset,\n\t\t\t\tnewOffset\n\t\t\t);\n\n\t\t\tdispatch.replaceBlocks(\n\t\t\t\tselectedBlockClientIds,\n\t\t\t\treplacement,\n\t\t\t\t0, // If we don't pass the `indexToSelect` it will default to the last block.\n\t\t\t\tselect.getSelectedBlocksInitialCaretPosition()\n\t\t\t);\n\t\t} );\n\t};\n\n/**\n * Split the current selection.\n * @param {?Array} blocks\n */\nexport const __unstableSplitSelection =\n\t( blocks = [] ) =>\n\t( { registry, select, dispatch } ) => {\n\t\tconst selectionAnchor = select.getSelectionStart();\n\t\tconst selectionFocus = select.getSelectionEnd();\n\t\tconst anchorRootClientId = select.getBlockRootClientId(\n\t\t\tselectionAnchor.clientId\n\t\t);\n\t\tconst focusRootClientId = select.getBlockRootClientId(\n\t\t\tselectionFocus.clientId\n\t\t);\n\n\t\t// It's not splittable if the selection doesn't start and end in the same\n\t\t// block list. Maybe in the future it should be allowed.\n\t\tif ( anchorRootClientId !== focusRootClientId ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst blockOrder = select.getBlockOrder( anchorRootClientId );\n\t\tconst anchorIndex = blockOrder.indexOf( selectionAnchor.clientId );\n\t\tconst focusIndex = blockOrder.indexOf( selectionFocus.clientId );\n\n\t\t// Reassign selection start and end based on order.\n\t\tlet selectionStart, selectionEnd;\n\n\t\tif ( anchorIndex > focusIndex ) {\n\t\t\tselectionStart = selectionFocus;\n\t\t\tselectionEnd = selectionAnchor;\n\t\t} else {\n\t\t\tselectionStart = selectionAnchor;\n\t\t\tselectionEnd = selectionFocus;\n\t\t}\n\n\t\tconst selectionA = selectionStart;\n\t\tconst selectionB = selectionEnd;\n\t\tconst blockA = select.getBlock( selectionA.clientId );\n\t\tconst blockB = select.getBlock( selectionB.clientId );\n\t\tconst blockAType = getBlockType( blockA.name );\n\t\tconst blockBType = getBlockType( blockB.name );\n\t\tconst attributeKeyA =\n\t\t\ttypeof selectionA.attributeKey === 'string'\n\t\t\t\t? selectionA.attributeKey\n\t\t\t\t: findRichTextAttributeKey( blockAType );\n\t\tconst attributeKeyB =\n\t\t\ttypeof selectionB.attributeKey === 'string'\n\t\t\t\t? selectionB.attributeKey\n\t\t\t\t: findRichTextAttributeKey( blockBType );\n\t\tconst blockAttributes = select.getBlockAttributes(\n\t\t\tselectionA.clientId\n\t\t);\n\t\tconst bindings = blockAttributes?.metadata?.bindings;\n\n\t\t// If the attribute is bound, don't split the selection and insert a new block instead.\n\t\tif ( bindings?.[ attributeKeyA ] ) {\n\t\t\t// Show warning if user tries to insert a block into another block with bindings.\n\t\t\tif ( blocks.length ) {\n\t\t\t\tconst { createWarningNotice } =\n\t\t\t\t\tregistry.dispatch( noticesStore );\n\t\t\t\tcreateWarningNotice(\n\t\t\t\t\t__(\n\t\t\t\t\t\t\"Blocks can't be inserted into other blocks with bindings\"\n\t\t\t\t\t),\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'snackbar',\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdispatch.insertAfterBlock( selectionA.clientId );\n\t\t\treturn;\n\t\t}\n\n\t\t// Can't split if the selection is not set.\n\t\tif (\n\t\t\t! attributeKeyA ||\n\t\t\t! attributeKeyB ||\n\t\t\ttypeof selectionAnchor.offset === 'undefined' ||\n\t\t\ttypeof selectionFocus.offset === 'undefined'\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\t// We can do some short-circuiting if the selection is collapsed.\n\t\tif (\n\t\t\tselectionA.clientId === selectionB.clientId &&\n\t\t\tattributeKeyA === attributeKeyB &&\n\t\t\tselectionA.offset === selectionB.offset\n\t\t) {\n\t\t\t// If an unmodified default block is selected, replace it. We don't\n\t\t\t// want to be converting into a default block.\n\t\t\tif ( blocks.length ) {\n\t\t\t\tif ( isUnmodifiedDefaultBlock( blockA, 'content' ) ) {\n\t\t\t\t\tdispatch.replaceBlocks(\n\t\t\t\t\t\t[ selectionA.clientId ],\n\t\t\t\t\t\tblocks,\n\t\t\t\t\t\tblocks.length - 1,\n\t\t\t\t\t\t-1\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If selection is at the start or end, we can simply insert an\n\t\t\t// empty block, provided this block has no inner blocks.\n\t\t\telse if ( ! select.getBlockOrder( selectionA.clientId ).length ) {\n\t\t\t\tfunction createEmpty() {\n\t\t\t\t\tconst defaultBlockName = getDefaultBlockName();\n\t\t\t\t\treturn select.canInsertBlockType(\n\t\t\t\t\t\tdefaultBlockName,\n\t\t\t\t\t\tanchorRootClientId\n\t\t\t\t\t)\n\t\t\t\t\t\t? createBlock( defaultBlockName )\n\t\t\t\t\t\t: createBlock(\n\t\t\t\t\t\t\t\tselect.getBlockName( selectionA.clientId )\n\t\t\t\t\t\t  );\n\t\t\t\t}\n\n\t\t\t\tconst length = blockAttributes[ attributeKeyA ].length;\n\n\t\t\t\tif ( selectionA.offset === 0 && length ) {\n\t\t\t\t\tdispatch.insertBlocks(\n\t\t\t\t\t\t[ createEmpty() ],\n\t\t\t\t\t\tselect.getBlockIndex( selectionA.clientId ),\n\t\t\t\t\t\tanchorRootClientId,\n\t\t\t\t\t\tfalse\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( selectionA.offset === length ) {\n\t\t\t\t\tdispatch.insertBlocks(\n\t\t\t\t\t\t[ createEmpty() ],\n\t\t\t\t\t\tselect.getBlockIndex( selectionA.clientId ) + 1,\n\t\t\t\t\t\tanchorRootClientId\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst htmlA = blockA.attributes[ attributeKeyA ];\n\t\tconst htmlB = blockB.attributes[ attributeKeyB ];\n\n\t\tlet valueA = create( { html: htmlA } );\n\t\tlet valueB = create( { html: htmlB } );\n\n\t\tvalueA = remove( valueA, selectionA.offset, valueA.text.length );\n\t\tvalueB = remove( valueB, 0, selectionB.offset );\n\n\t\tlet head = {\n\t\t\t// Preserve the original client ID.\n\t\t\t...blockA,\n\t\t\t// If both start and end are the same, should only copy innerBlocks\n\t\t\t// once.\n\t\t\tinnerBlocks:\n\t\t\t\tblockA.clientId === blockB.clientId ? [] : blockA.innerBlocks,\n\t\t\tattributes: {\n\t\t\t\t...blockA.attributes,\n\t\t\t\t[ attributeKeyA ]: toHTMLString( { value: valueA } ),\n\t\t\t},\n\t\t};\n\n\t\tlet tail = {\n\t\t\t...blockB,\n\t\t\t// Only preserve the original client ID if the end is different.\n\t\t\tclientId:\n\t\t\t\tblockA.clientId === blockB.clientId\n\t\t\t\t\t? createBlock( blockB.name ).clientId\n\t\t\t\t\t: blockB.clientId,\n\t\t\tattributes: {\n\t\t\t\t...blockB.attributes,\n\t\t\t\t[ attributeKeyB ]: toHTMLString( { value: valueB } ),\n\t\t\t},\n\t\t};\n\n\t\t// When splitting a block, attempt to convert the tail block to the\n\t\t// default block type. For example, when splitting a heading block, the\n\t\t// tail block will be converted to a paragraph block. Note that for\n\t\t// blocks such as a list item and button, this will be skipped because\n\t\t// the default block type cannot be inserted.\n\t\tconst defaultBlockName = getDefaultBlockName();\n\t\tif (\n\t\t\t// A block is only split when the selection is within the same\n\t\t\t// block.\n\t\t\tblockA.clientId === blockB.clientId &&\n\t\t\tdefaultBlockName &&\n\t\t\ttail.name !== defaultBlockName &&\n\t\t\tselect.canInsertBlockType( defaultBlockName, anchorRootClientId )\n\t\t) {\n\t\t\tconst switched = switchToBlockType( tail, defaultBlockName );\n\t\t\tif ( switched?.length === 1 ) {\n\t\t\t\ttail = switched[ 0 ];\n\t\t\t}\n\t\t}\n\n\t\tif ( ! blocks.length ) {\n\t\t\tdispatch.replaceBlocks( select.getSelectedBlockClientIds(), [\n\t\t\t\thead,\n\t\t\t\ttail,\n\t\t\t] );\n\t\t\treturn;\n\t\t}\n\n\t\tlet selection;\n\t\tconst output = [];\n\t\tconst clonedBlocks = [ ...blocks ];\n\t\tconst firstBlock = clonedBlocks.shift();\n\t\tconst headType = getBlockType( head.name );\n\t\tconst firstBlocks =\n\t\t\theadType.merge && firstBlock.name === headType.name\n\t\t\t\t? [ firstBlock ]\n\t\t\t\t: switchToBlockType( firstBlock, headType.name );\n\n\t\tif ( firstBlocks?.length ) {\n\t\t\tconst first = firstBlocks.shift();\n\t\t\thead = {\n\t\t\t\t...head,\n\t\t\t\tattributes: {\n\t\t\t\t\t...head.attributes,\n\t\t\t\t\t...headType.merge( head.attributes, first.attributes ),\n\t\t\t\t},\n\t\t\t};\n\t\t\toutput.push( head );\n\t\t\tselection = {\n\t\t\t\tclientId: head.clientId,\n\t\t\t\tattributeKey: attributeKeyA,\n\t\t\t\toffset: create( { html: head.attributes[ attributeKeyA ] } )\n\t\t\t\t\t.text.length,\n\t\t\t};\n\t\t\tclonedBlocks.unshift( ...firstBlocks );\n\t\t} else {\n\t\t\tif ( ! isUnmodifiedBlock( head ) ) {\n\t\t\t\toutput.push( head );\n\t\t\t}\n\t\t\toutput.push( firstBlock );\n\t\t}\n\n\t\tconst lastBlock = clonedBlocks.pop();\n\t\tconst tailType = getBlockType( tail.name );\n\n\t\tif ( clonedBlocks.length ) {\n\t\t\toutput.push( ...clonedBlocks );\n\t\t}\n\n\t\tif ( lastBlock ) {\n\t\t\tconst lastBlocks =\n\t\t\t\ttailType.merge && tailType.name === lastBlock.name\n\t\t\t\t\t? [ lastBlock ]\n\t\t\t\t\t: switchToBlockType( lastBlock, tailType.name );\n\n\t\t\tif ( lastBlocks?.length ) {\n\t\t\t\tconst last = lastBlocks.pop();\n\t\t\t\toutput.push( {\n\t\t\t\t\t...tail,\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\t...tail.attributes,\n\t\t\t\t\t\t...tailType.merge( last.attributes, tail.attributes ),\n\t\t\t\t\t},\n\t\t\t\t} );\n\t\t\t\toutput.push( ...lastBlocks );\n\t\t\t\tselection = {\n\t\t\t\t\tclientId: tail.clientId,\n\t\t\t\t\tattributeKey: attributeKeyB,\n\t\t\t\t\toffset: create( {\n\t\t\t\t\t\thtml: last.attributes[ attributeKeyB ],\n\t\t\t\t\t} ).text.length,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\toutput.push( lastBlock );\n\t\t\t\tif ( ! isUnmodifiedBlock( tail ) ) {\n\t\t\t\t\toutput.push( tail );\n\t\t\t\t}\n\t\t\t}\n\t\t} else if ( ! isUnmodifiedBlock( tail ) ) {\n\t\t\toutput.push( tail );\n\t\t}\n\n\t\tregistry.batch( () => {\n\t\t\tdispatch.replaceBlocks(\n\t\t\t\tselect.getSelectedBlockClientIds(),\n\t\t\t\toutput,\n\t\t\t\toutput.length - 1,\n\t\t\t\t0\n\t\t\t);\n\t\t\tif ( selection ) {\n\t\t\t\tdispatch.selectionChange(\n\t\t\t\t\tselection.clientId,\n\t\t\t\t\tselection.attributeKey,\n\t\t\t\t\tselection.offset,\n\t\t\t\t\tselection.offset\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\t};\n\n/**\n * Expand the selection to cover the entire blocks, removing partial selection.\n */\nexport const __unstableExpandSelection =\n\t() =>\n\t( { select, dispatch } ) => {\n\t\tconst selectionAnchor = select.getSelectionStart();\n\t\tconst selectionFocus = select.getSelectionEnd();\n\t\tdispatch.selectionChange( {\n\t\t\tstart: { clientId: selectionAnchor.clientId },\n\t\t\tend: { clientId: selectionFocus.clientId },\n\t\t} );\n\t};\n\n/**\n * Action that merges two blocks.\n *\n * @param {string} firstBlockClientId  Client ID of the first block to merge.\n * @param {string} secondBlockClientId Client ID of the second block to merge.\n */\nexport const mergeBlocks =\n\t( firstBlockClientId, secondBlockClientId ) =>\n\t( { registry, select, dispatch } ) => {\n\t\tconst clientIdA = firstBlockClientId;\n\t\tconst clientIdB = secondBlockClientId;\n\t\tconst blockA = select.getBlock( clientIdA );\n\t\tconst blockAType = getBlockType( blockA.name );\n\n\t\tif (\n\t\t\t! blockAType ||\n\t\t\tselect.getBlockEditingMode( clientIdA ) === 'disabled' ||\n\t\t\tselect.getBlockEditingMode( clientIdB ) === 'disabled'\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst blockB = select.getBlock( clientIdB );\n\n\t\tif (\n\t\t\t! blockAType.merge &&\n\t\t\tgetBlockSupport( blockA.name, '__experimentalOnMerge' )\n\t\t) {\n\t\t\t// If there's no merge function defined, attempt merging inner\n\t\t\t// blocks.\n\t\t\tconst blocksWithTheSameType = switchToBlockType(\n\t\t\t\tblockB,\n\t\t\t\tblockAType.name\n\t\t\t);\n\t\t\t// Only focus the previous block if it's not mergeable.\n\t\t\tif ( blocksWithTheSameType?.length !== 1 ) {\n\t\t\t\tdispatch.selectBlock( blockA.clientId );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst [ blockWithSameType ] = blocksWithTheSameType;\n\t\t\tif ( blockWithSameType.innerBlocks.length < 1 ) {\n\t\t\t\tdispatch.selectBlock( blockA.clientId );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tregistry.batch( () => {\n\t\t\t\tdispatch.insertBlocks(\n\t\t\t\t\tblockWithSameType.innerBlocks,\n\t\t\t\t\tundefined,\n\t\t\t\t\tclientIdA\n\t\t\t\t);\n\t\t\t\tdispatch.removeBlock( clientIdB );\n\t\t\t\tdispatch.selectBlock(\n\t\t\t\t\tblockWithSameType.innerBlocks[ 0 ].clientId\n\t\t\t\t);\n\n\t\t\t\t// Attempt to merge the next block if it's the same type and\n\t\t\t\t// same attributes. This is useful when merging a paragraph into\n\t\t\t\t// a list, and the next block is also a list. If we don't merge,\n\t\t\t\t// it looks like one list, but it's actually two lists. The same\n\t\t\t\t// applies to other blocks such as a group with the same\n\t\t\t\t// attributes.\n\t\t\t\tconst nextBlockClientId =\n\t\t\t\t\tselect.getNextBlockClientId( clientIdA );\n\n\t\t\t\tif (\n\t\t\t\t\tnextBlockClientId &&\n\t\t\t\t\tselect.getBlockName( clientIdA ) ===\n\t\t\t\t\t\tselect.getBlockName( nextBlockClientId )\n\t\t\t\t) {\n\t\t\t\t\tconst rootAttributes =\n\t\t\t\t\t\tselect.getBlockAttributes( clientIdA );\n\t\t\t\t\tconst previousRootAttributes =\n\t\t\t\t\t\tselect.getBlockAttributes( nextBlockClientId );\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tObject.keys( rootAttributes ).every(\n\t\t\t\t\t\t\t( key ) =>\n\t\t\t\t\t\t\t\trootAttributes[ key ] ===\n\t\t\t\t\t\t\t\tpreviousRootAttributes[ key ]\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\tdispatch.moveBlocksToPosition(\n\t\t\t\t\t\t\tselect.getBlockOrder( nextBlockClientId ),\n\t\t\t\t\t\t\tnextBlockClientId,\n\t\t\t\t\t\t\tclientIdA\n\t\t\t\t\t\t);\n\t\t\t\t\t\tdispatch.removeBlock( nextBlockClientId, false );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( isUnmodifiedDefaultBlock( blockA ) ) {\n\t\t\tdispatch.removeBlock(\n\t\t\t\tclientIdA,\n\t\t\t\tselect.isBlockSelected( clientIdA )\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif ( isUnmodifiedDefaultBlock( blockB ) ) {\n\t\t\tdispatch.removeBlock(\n\t\t\t\tclientIdB,\n\t\t\t\tselect.isBlockSelected( clientIdB )\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif ( ! blockAType.merge ) {\n\t\t\tif ( isUnmodifiedBlock( blockB, 'content' ) ) {\n\t\t\t\tdispatch.removeBlock(\n\t\t\t\t\tclientIdB,\n\t\t\t\t\tselect.isBlockSelected( clientIdB )\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tdispatch.selectBlock( blockA.clientId );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst blockBType = getBlockType( blockB.name );\n\t\tconst { clientId, attributeKey, offset } = select.getSelectionStart();\n\t\tconst selectedBlockType =\n\t\t\tclientId === clientIdA ? blockAType : blockBType;\n\t\tconst attributeDefinition =\n\t\t\tselectedBlockType.attributes[ attributeKey ];\n\t\tconst canRestoreTextSelection =\n\t\t\t( clientId === clientIdA || clientId === clientIdB ) &&\n\t\t\tattributeKey !== undefined &&\n\t\t\toffset !== undefined &&\n\t\t\t// We cannot restore text selection if the RichText identifier\n\t\t\t// is not a defined block attribute key. This can be the case if the\n\t\t\t// fallback instance ID is used to store selection (and no RichText\n\t\t\t// identifier is set), or when the identifier is wrong.\n\t\t\t!! attributeDefinition;\n\n\t\tif ( ! attributeDefinition ) {\n\t\t\tif ( typeof attributeKey === 'number' ) {\n\t\t\t\twindow.console.error(\n\t\t\t\t\t`RichText needs an identifier prop that is the block attribute key of the attribute it controls. Its type is expected to be a string, but was ${ typeof attributeKey }`\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\twindow.console.error(\n\t\t\t\t\t'The RichText identifier prop does not match any attributes defined by the block.'\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Clone the blocks so we don't insert the character in a \"live\" block.\n\t\tconst cloneA = cloneBlock( blockA );\n\t\tconst cloneB = cloneBlock( blockB );\n\n\t\tif ( canRestoreTextSelection ) {\n\t\t\tconst selectedBlock = clientId === clientIdA ? cloneA : cloneB;\n\t\t\tconst html = selectedBlock.attributes[ attributeKey ];\n\t\t\tconst value = insert(\n\t\t\t\tcreate( { html } ),\n\t\t\t\tSTART_OF_SELECTED_AREA,\n\t\t\t\toffset,\n\t\t\t\toffset\n\t\t\t);\n\n\t\t\tselectedBlock.attributes[ attributeKey ] = toHTMLString( {\n\t\t\t\tvalue,\n\t\t\t} );\n\t\t}\n\n\t\t// We can only merge blocks with similar types\n\t\t// thus, we transform the block to merge first.\n\t\tconst blocksWithTheSameType =\n\t\t\tblockA.name === blockB.name\n\t\t\t\t? [ cloneB ]\n\t\t\t\t: switchToBlockType( cloneB, blockA.name );\n\n\t\t// If the block types can not match, do nothing.\n\t\tif ( ! blocksWithTheSameType || ! blocksWithTheSameType.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Calling the merge to update the attributes and remove the block to be merged.\n\t\tconst updatedAttributes = blockAType.merge(\n\t\t\tcloneA.attributes,\n\t\t\tblocksWithTheSameType[ 0 ].attributes\n\t\t);\n\n\t\tif ( canRestoreTextSelection ) {\n\t\t\tconst newAttributeKey =\n\t\t\t\tretrieveSelectedAttribute( updatedAttributes );\n\t\t\tconst convertedHtml = updatedAttributes[ newAttributeKey ];\n\t\t\tconst convertedValue = create( { html: convertedHtml } );\n\t\t\tconst newOffset = convertedValue.text.indexOf(\n\t\t\t\tSTART_OF_SELECTED_AREA\n\t\t\t);\n\t\t\tconst newValue = remove( convertedValue, newOffset, newOffset + 1 );\n\t\t\tconst newHtml = toHTMLString( { value: newValue } );\n\n\t\t\tupdatedAttributes[ newAttributeKey ] = newHtml;\n\n\t\t\tdispatch.selectionChange(\n\t\t\t\tblockA.clientId,\n\t\t\t\tnewAttributeKey,\n\t\t\t\tnewOffset,\n\t\t\t\tnewOffset\n\t\t\t);\n\t\t}\n\n\t\tdispatch.replaceBlocks(\n\t\t\t[ blockA.clientId, blockB.clientId ],\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\t...blockA,\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\t...blockA.attributes,\n\t\t\t\t\t\t...updatedAttributes,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t...blocksWithTheSameType.slice( 1 ),\n\t\t\t],\n\t\t\t0 // If we don't pass the `indexToSelect` it will default to the last block.\n\t\t);\n\t};\n\n/**\n * Yields action objects used in signalling that the blocks corresponding to\n * the set of specified client IDs are to be removed.\n *\n * @param {string|string[]} clientIds      Client IDs of blocks to remove.\n * @param {boolean}         selectPrevious True if the previous block\n *                                         or the immediate parent\n *                                         (if no previous block exists)\n *                                         should be selected\n *                                         when a block is removed.\n */\nexport const removeBlocks = ( clientIds, selectPrevious = true ) =>\n\tprivateRemoveBlocks( clientIds, selectPrevious );\n\n/**\n * Returns an action object used in signalling that the block with the\n * specified client ID is to be removed.\n *\n * @param {string}  clientId       Client ID of block to remove.\n * @param {boolean} selectPrevious True if the previous block should be\n *                                 selected when a block is removed.\n *\n * @return {Object} Action object.\n */\nexport function removeBlock( clientId, selectPrevious ) {\n\treturn removeBlocks( [ clientId ], selectPrevious );\n}\n\n/**\n * Returns an action object used in signalling that the inner blocks with the\n * specified client ID should be replaced.\n *\n * @param {string}    rootClientId    Client ID of the block whose InnerBlocks will re replaced.\n * @param {Object[]}  blocks          Block objects to insert as new InnerBlocks\n * @param {?boolean}  updateSelection If true block selection will be updated. If false, block selection will not change. Defaults to false.\n * @param {0|-1|null} initialPosition Initial block position.\n * @return {Object} Action object.\n */\nexport function replaceInnerBlocks(\n\trootClientId,\n\tblocks,\n\tupdateSelection = false,\n\tinitialPosition = 0\n) {\n\treturn {\n\t\ttype: 'REPLACE_INNER_BLOCKS',\n\t\trootClientId,\n\t\tblocks,\n\t\tupdateSelection,\n\t\tinitialPosition: updateSelection ? initialPosition : null,\n\t\ttime: Date.now(),\n\t};\n}\n\n/**\n * Returns an action object used to toggle the block editing mode between\n * visual and HTML modes.\n *\n * @param {string} clientId Block client ID.\n *\n * @return {Object} Action object.\n */\nexport function toggleBlockMode( clientId ) {\n\treturn {\n\t\ttype: 'TOGGLE_BLOCK_MODE',\n\t\tclientId,\n\t};\n}\n\n/**\n * Returns an action object used in signalling that the user has begun to type.\n *\n * @return {Object} Action object.\n */\nexport function startTyping() {\n\treturn {\n\t\ttype: 'START_TYPING',\n\t};\n}\n\n/**\n * Returns an action object used in signalling that the user has stopped typing.\n *\n * @return {Object} Action object.\n */\nexport function stopTyping() {\n\treturn {\n\t\ttype: 'STOP_TYPING',\n\t};\n}\n\n/**\n * Returns an action object used in signalling that the user has begun to drag blocks.\n *\n * @param {string[]} clientIds An array of client ids being dragged\n *\n * @return {Object} Action object.\n */\nexport function startDraggingBlocks( clientIds = [] ) {\n\treturn {\n\t\ttype: 'START_DRAGGING_BLOCKS',\n\t\tclientIds,\n\t};\n}\n\n/**\n * Returns an action object used in signalling that the user has stopped dragging blocks.\n *\n * @return {Object} Action object.\n */\nexport function stopDraggingBlocks() {\n\treturn {\n\t\ttype: 'STOP_DRAGGING_BLOCKS',\n\t};\n}\n\n/**\n * Returns an action object used in signalling that the caret has entered formatted text.\n *\n * @deprecated\n *\n * @return {Object} Action object.\n */\nexport function enterFormattedText() {\n\tdeprecated( 'wp.data.dispatch( \"core/block-editor\" ).enterFormattedText', {\n\t\tsince: '6.1',\n\t\tversion: '6.3',\n\t} );\n\treturn {\n\t\ttype: 'DO_NOTHING',\n\t};\n}\n\n/**\n * Returns an action object used in signalling that the user caret has exited formatted text.\n *\n * @deprecated\n *\n * @return {Object} Action object.\n */\nexport function exitFormattedText() {\n\tdeprecated( 'wp.data.dispatch( \"core/block-editor\" ).exitFormattedText', {\n\t\tsince: '6.1',\n\t\tversion: '6.3',\n\t} );\n\treturn {\n\t\ttype: 'DO_NOTHING',\n\t};\n}\n\n/**\n * Action that changes the position of the user caret.\n *\n * @param {string|WPSelection} clientId     The selected block client ID.\n * @param {string}             attributeKey The selected block attribute key.\n * @param {number}             startOffset  The start offset.\n * @param {number}             endOffset    The end offset.\n *\n * @return {Object} Action object.\n */\nexport function selectionChange(\n\tclientId,\n\tattributeKey,\n\tstartOffset,\n\tendOffset\n) {\n\tif ( typeof clientId === 'string' ) {\n\t\treturn {\n\t\t\ttype: 'SELECTION_CHANGE',\n\t\t\tclientId,\n\t\t\tattributeKey,\n\t\t\tstartOffset,\n\t\t\tendOffset,\n\t\t};\n\t}\n\n\treturn { type: 'SELECTION_CHANGE', ...clientId };\n}\n\n/**\n * Action that adds a new block of the default type to the block list.\n *\n * @param {?Object} attributes   Optional attributes of the block to assign.\n * @param {?string} rootClientId Optional root client ID of block list on which\n *                               to append.\n * @param {?number} index        Optional index where to insert the default block.\n */\nexport const insertDefaultBlock =\n\t( attributes, rootClientId, index ) =>\n\t( { dispatch } ) => {\n\t\t// Abort if there is no default block type (if it has been unregistered).\n\t\tconst defaultBlockName = getDefaultBlockName();\n\t\tif ( ! defaultBlockName ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst block = createBlock( defaultBlockName, attributes );\n\n\t\treturn dispatch.insertBlock( block, index, rootClientId );\n\t};\n\n/**\n * @typedef {Object< string, Object >} SettingsByClientId\n */\n\n/**\n * Action that changes the nested settings of the given block(s).\n *\n * @param {string | SettingsByClientId} clientId Client ID of the block whose\n *                                               nested setting are being\n *                                               received, or object of settings\n *                                               by client ID.\n * @param {Object}                      settings Object with the new settings\n *                                               for the nested block.\n *\n * @return {Object} Action object\n */\nexport function updateBlockListSettings( clientId, settings ) {\n\treturn {\n\t\ttype: 'UPDATE_BLOCK_LIST_SETTINGS',\n\t\tclientId,\n\t\tsettings,\n\t};\n}\n\n/**\n * Action that updates the block editor settings.\n *\n * @param {Object} settings Updated settings\n *\n * @return {Object} Action object\n */\nexport function updateSettings( settings ) {\n\treturn __experimentalUpdateSettings( settings, {\n\t\tstripExperimentalSettings: true,\n\t} );\n}\n\n/**\n * Action that signals that a temporary reusable block has been saved\n * in order to switch its temporary id with the real id.\n *\n * @deprecated\n */\nexport function __unstableSaveReusableBlock() {\n\tdeprecated(\n\t\t'wp.data.dispatch( \"core/block-editor\" ).__unstableSaveReusableBlock',\n\t\t{\n\t\t\tsince: '7.1',\n\t\t}\n\t);\n\treturn {\n\t\ttype: 'DO_NOTHING',\n\t};\n}\n\n/**\n * Action that marks the last block change explicitly as persistent.\n *\n * @return {Object} Action object.\n */\nexport function __unstableMarkLastChangeAsPersistent() {\n\treturn { type: 'MARK_LAST_CHANGE_AS_PERSISTENT' };\n}\n\n/**\n * Action that signals that the next block change should be marked explicitly as not persistent.\n *\n * @return {Object} Action object.\n */\nexport function __unstableMarkNextChangeAsNotPersistent() {\n\treturn { type: 'MARK_NEXT_CHANGE_AS_NOT_PERSISTENT' };\n}\n\n/**\n * Action that marks the last block change as an automatic change, meaning it was not\n * performed by the user, and can be undone using the `Escape` and `Backspace` keys.\n * This action must be called after the change was made, and any actions that are a\n * consequence of it, so it is recommended to be called at the next idle period to ensure all\n * selection changes have been recorded.\n */\nexport const __unstableMarkAutomaticChange =\n\t() =>\n\t( { dispatch } ) => {\n\t\tdispatch( { type: 'MARK_AUTOMATIC_CHANGE' } );\n\t\tconst { requestIdleCallback = ( cb ) => setTimeout( cb, 100 ) } =\n\t\t\twindow;\n\t\trequestIdleCallback( () => {\n\t\t\tdispatch( { type: 'MARK_AUTOMATIC_CHANGE_FINAL' } );\n\t\t} );\n\t};\n\n/**\n * Action that sets the editor mode\n *\n * @param {string} mode Editor mode\n */\nexport const __unstableSetEditorMode =\n\t( mode ) =>\n\t( { registry } ) => {\n\t\tregistry.dispatch( preferencesStore ).set( 'core', 'editorTool', mode );\n\n\t\tif ( mode === 'navigation' ) {\n\t\t\tspeak( __( 'You are currently in Write mode.' ) );\n\t\t} else if ( mode === 'edit' ) {\n\t\t\tspeak( __( 'You are currently in Design mode.' ) );\n\t\t}\n\t};\n\n/**\n * Set the block moving client ID.\n *\n * @deprecated\n *\n * @return {Object} Action object.\n */\nexport function setBlockMovingClientId() {\n\tdeprecated(\n\t\t'wp.data.dispatch( \"core/block-editor\" ).setBlockMovingClientId',\n\t\t{\n\t\t\tsince: '6.7',\n\t\t\thint: 'Block moving mode feature has been removed',\n\t\t}\n\t);\n\treturn {\n\t\ttype: 'DO_NOTHING',\n\t};\n}\n\n/**\n * Action that duplicates a list of blocks.\n *\n * @param {string[]} clientIds\n * @param {boolean}  updateSelection\n */\nexport const duplicateBlocks =\n\t( clientIds, updateSelection = true ) =>\n\t( { select, dispatch } ) => {\n\t\tif ( ! clientIds || ! clientIds.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return early if blocks don't exist.\n\t\tconst blocks = select.getBlocksByClientId( clientIds );\n\t\tif ( blocks.some( ( block ) => ! block ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return early if blocks don't support multiple usage.\n\t\tconst blockNames = blocks.map( ( block ) => block.name );\n\t\tif (\n\t\t\tblockNames.some(\n\t\t\t\t( blockName ) =>\n\t\t\t\t\t! hasBlockSupport( blockName, 'multiple', true )\n\t\t\t)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst rootClientId = select.getBlockRootClientId( clientIds[ 0 ] );\n\t\tconst clientIdsArray = castArray( clientIds );\n\t\tconst lastSelectedIndex = select.getBlockIndex(\n\t\t\tclientIdsArray[ clientIdsArray.length - 1 ]\n\t\t);\n\t\tconst clonedBlocks = blocks.map( ( block ) =>\n\t\t\t__experimentalCloneSanitizedBlock( block )\n\t\t);\n\t\tdispatch.insertBlocks(\n\t\t\tclonedBlocks,\n\t\t\tlastSelectedIndex + 1,\n\t\t\trootClientId,\n\t\t\tupdateSelection\n\t\t);\n\t\tif ( clonedBlocks.length > 1 && updateSelection ) {\n\t\t\tdispatch.multiSelect(\n\t\t\t\tclonedBlocks[ 0 ].clientId,\n\t\t\t\tclonedBlocks[ clonedBlocks.length - 1 ].clientId\n\t\t\t);\n\t\t}\n\t\treturn clonedBlocks.map( ( block ) => block.clientId );\n\t};\n\n/**\n * Action that inserts a default block before a given block.\n *\n * @param {string} clientId\n */\nexport const insertBeforeBlock =\n\t( clientId ) =>\n\t( { select, dispatch } ) => {\n\t\tif ( ! clientId ) {\n\t\t\treturn;\n\t\t}\n\t\tconst rootClientId = select.getBlockRootClientId( clientId );\n\t\tconst isLocked = select.getTemplateLock( rootClientId );\n\t\tif ( isLocked ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst blockIndex = select.getBlockIndex( clientId );\n\t\tconst directInsertBlock = rootClientId\n\t\t\t? select.getDirectInsertBlock( rootClientId )\n\t\t\t: null;\n\n\t\tif ( ! directInsertBlock ) {\n\t\t\treturn dispatch.insertDefaultBlock( {}, rootClientId, blockIndex );\n\t\t}\n\n\t\tconst copiedAttributes = {};\n\t\tif ( directInsertBlock.attributesToCopy ) {\n\t\t\tconst attributes = select.getBlockAttributes( clientId );\n\t\t\tdirectInsertBlock.attributesToCopy.forEach( ( key ) => {\n\t\t\t\tif ( attributes[ key ] ) {\n\t\t\t\t\tcopiedAttributes[ key ] = attributes[ key ];\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\tconst block = createBlock( directInsertBlock.name, {\n\t\t\t...directInsertBlock.attributes,\n\t\t\t...copiedAttributes,\n\t\t} );\n\t\treturn dispatch.insertBlock( block, blockIndex, rootClientId );\n\t};\n\n/**\n * Action that inserts a default block after a given block.\n *\n * @param {string} clientId\n */\nexport const insertAfterBlock =\n\t( clientId ) =>\n\t( { select, dispatch } ) => {\n\t\tif ( ! clientId ) {\n\t\t\treturn;\n\t\t}\n\t\tconst rootClientId = select.getBlockRootClientId( clientId );\n\t\tconst isLocked = select.getTemplateLock( rootClientId );\n\t\tif ( isLocked ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst blockIndex = select.getBlockIndex( clientId );\n\t\tconst directInsertBlock = rootClientId\n\t\t\t? select.getDirectInsertBlock( rootClientId )\n\t\t\t: null;\n\n\t\tif ( ! directInsertBlock ) {\n\t\t\treturn dispatch.insertDefaultBlock(\n\t\t\t\t{},\n\t\t\t\trootClientId,\n\t\t\t\tblockIndex + 1\n\t\t\t);\n\t\t}\n\n\t\tconst copiedAttributes = {};\n\t\tif ( directInsertBlock.attributesToCopy ) {\n\t\t\tconst attributes = select.getBlockAttributes( clientId );\n\t\t\tdirectInsertBlock.attributesToCopy.forEach( ( key ) => {\n\t\t\t\tif ( attributes[ key ] ) {\n\t\t\t\t\tcopiedAttributes[ key ] = attributes[ key ];\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\tconst block = createBlock( directInsertBlock.name, {\n\t\t\t...directInsertBlock.attributes,\n\t\t\t...copiedAttributes,\n\t\t} );\n\t\treturn dispatch.insertBlock( block, blockIndex + 1, rootClientId );\n\t};\n\n/**\n * Action that toggles the highlighted block state.\n *\n * @param {string}  clientId      The block's clientId.\n * @param {boolean} isHighlighted The highlight state.\n */\nexport function toggleBlockHighlight( clientId, isHighlighted ) {\n\treturn {\n\t\ttype: 'TOGGLE_BLOCK_HIGHLIGHT',\n\t\tclientId,\n\t\tisHighlighted,\n\t};\n}\n\n/**\n * Action that \"flashes\" the block with a given `clientId` by rhythmically highlighting it.\n *\n * @param {string} clientId Target block client ID.\n * @param {number} timeout  Duration in milliseconds to keep the highlight. Defaults to 150ms.\n */\nexport const flashBlock =\n\t( clientId, timeout = 150 ) =>\n\tasync ( { dispatch } ) => {\n\t\tdispatch( toggleBlockHighlight( clientId, true ) );\n\t\tawait new Promise( ( resolve ) => setTimeout( resolve, timeout ) );\n\t\tdispatch( toggleBlockHighlight( clientId, false ) );\n\t};\n\n/**\n * Action that sets whether a block has controlled inner blocks.\n *\n * @param {string}  clientId                 The block's clientId.\n * @param {boolean} hasControlledInnerBlocks True if the block's inner blocks are controlled.\n */\nexport function setHasControlledInnerBlocks(\n\tclientId,\n\thasControlledInnerBlocks\n) {\n\treturn {\n\t\ttype: 'SET_HAS_CONTROLLED_INNER_BLOCKS',\n\t\thasControlledInnerBlocks,\n\t\tclientId,\n\t};\n}\n\n/**\n * Action that sets whether given blocks are visible on the canvas.\n *\n * @param {Record<string,boolean>} updates For each block's clientId, its new visibility setting.\n */\nexport function setBlockVisibility( updates ) {\n\treturn {\n\t\ttype: 'SET_BLOCK_VISIBILITY',\n\t\tupdates,\n\t};\n}\n\n/**\n * Action that sets whether a block is being temporarily edited as blocks.\n *\n * DO-NOT-USE in production.\n * This action is created for internal/experimental only usage and may be\n * removed anytime without any warning, causing breakage on any plugin or theme invoking it.\n *\n * @param {?string} clientId The clientId of the block being temporarily edited.\n */\nexport function __unstableSetTemporarilyEditingAsBlocks( clientId ) {\n\tdeprecated(\n\t\t\"wp.data.dispatch( 'core/block-editor' ).__unstableSetTemporarilyEditingAsBlocks\",\n\t\t{\n\t\t\tsince: '7.0',\n\t\t}\n\t);\n\treturn editContentOnlySection( clientId );\n}\n\n/**\n * Interface for inserter media requests.\n *\n * @typedef {Object} InserterMediaRequest\n * @property {number} per_page How many items to fetch per page.\n * @property {string} search   The search term to use for filtering the results.\n */\n\n/**\n * Interface for inserter media responses. Any media resource should\n * map their response to this interface, in order to create the core\n * WordPress media blocks (image, video, audio).\n *\n * @typedef {Object} InserterMediaItem\n * @property {string}        title        The title of the media item.\n * @property {string}        url          The source url of the media item.\n * @property {string}        [previewUrl] The preview source url of the media item to display in the media list.\n * @property {number}        [id]         The WordPress id of the media item.\n * @property {number|string} [sourceId]   The id of the media item from external source.\n * @property {string}        [alt]        The alt text of the media item.\n * @property {string}        [caption]    The caption of the media item.\n */\n\n/**\n * Registers a new inserter media category. Once registered, the media category is\n * available in the inserter's media tab.\n *\n * The following interfaces are used:\n *\n * _Type Definition_\n *\n * - _InserterMediaRequest_ `Object`: Interface for inserter media requests.\n *\n * _Properties_\n *\n * - _per_page_ `number`: How many items to fetch per page.\n * - _search_ `string`: The search term to use for filtering the results.\n *\n * _Type Definition_\n *\n * - _InserterMediaItem_ `Object`: Interface for inserter media responses. Any media resource should\n * map their response to this interface, in order to create the core\n * WordPress media blocks (image, video, audio).\n *\n * _Properties_\n *\n * - _title_ `string`: The title of the media item.\n * - _url_ `string: The source url of the media item.\n * - _previewUrl_ `[string]`: The preview source url of the media item to display in the media list.\n * - _id_ `[number]`: The WordPress id of the media item.\n * - _sourceId_ `[number|string]`: The id of the media item from external source.\n * - _alt_ `[string]`: The alt text of the media item.\n * - _caption_ `[string]`: The caption of the media item.\n *\n * @param    {InserterMediaCategory}                                  category                       The inserter media category to register.\n *\n * @example\n * ```js\n *\n * wp.data.dispatch('core/block-editor').registerInserterMediaCategory( {\n * \t name: 'openverse',\n * \t labels: {\n * \t \tname: 'Openverse',\n * \t \tsearch_items: 'Search Openverse',\n * \t },\n * \t mediaType: 'image',\n * \t async fetch( query = {} ) {\n * \t \tconst defaultArgs = {\n * \t \t\tmature: false,\n * \t \t\texcluded_source: 'flickr,inaturalist,wikimedia',\n * \t \t\tlicense: 'pdm,cc0',\n * \t \t};\n * \t \tconst finalQuery = { ...query, ...defaultArgs };\n * \t \t// Sometimes you might need to map the supported request params according to `InserterMediaRequest`.\n * \t \t// interface. In this example the `search` query param is named `q`.\n * \t \tconst mapFromInserterMediaRequest = {\n * \t \t\tper_page: 'page_size',\n * \t \t\tsearch: 'q',\n * \t \t};\n * \t \tconst url = new URL( 'https://api.openverse.org/v1/images/' );\n * \t \tObject.entries( finalQuery ).forEach( ( [ key, value ] ) => {\n * \t \t\tconst queryKey = mapFromInserterMediaRequest[ key ] || key;\n * \t \t\turl.searchParams.set( queryKey, value );\n * \t \t} );\n * \t \tconst response = await window.fetch( url, {\n * \t \t\theaders: {\n * \t \t\t\t'User-Agent': 'WordPress/inserter-media-fetch',\n * \t \t\t},\n * \t \t} );\n * \t \tconst jsonResponse = await response.json();\n * \t \tconst results = jsonResponse.results;\n * \t \treturn results.map( ( result ) => ( {\n * \t \t\t...result,\n * \t \t\t// If your response result includes an `id` prop that you want to access later, it should\n * \t \t\t// be mapped to `InserterMediaItem`'s `sourceId` prop. This can be useful if you provide\n * \t \t\t// a report URL getter.\n * \t \t\t// Additionally you should always clear the `id` value of your response results because\n * \t \t\t// it is used to identify WordPress media items.\n * \t \t\tsourceId: result.id,\n * \t \t\tid: undefined,\n * \t \t\tcaption: result.caption,\n * \t \t\tpreviewUrl: result.thumbnail,\n * \t \t} ) );\n * \t },\n * \t getReportUrl: ( { sourceId } ) =>\n * \t \t`https://wordpress.org/openverse/image/${ sourceId }/report/`,\n * \t isExternalResource: true,\n * } );\n * ```\n *\n * @typedef {Object} InserterMediaCategory Interface for inserter media category.\n * @property {string}                                                 name                           The name of the media category, that should be unique among all media categories.\n * @property {Object}                                                 labels                         Labels for the media category.\n * @property {string}                                                 labels.name                    General name of the media category. It's used in the inserter media items list.\n * @property {string}                                                 [labels.search_items='Search'] Label for searching items. Default is \u2018Search Posts\u2019 / \u2018Search Pages\u2019.\n * @property {('image'|'audio'|'video')}                              mediaType                      The media type of the media category.\n * @property {(InserterMediaRequest) => Promise<InserterMediaItem[]>} fetch                          The function to fetch media items for the category.\n * @property {(InserterMediaItem) => string}                          [getReportUrl]                 If the media category supports reporting media items, this function should return\n *                                                                                                   the report url for the media item. It accepts the `InserterMediaItem` as an argument.\n * @property {boolean}                                                [isExternalResource]           If the media category is an external resource, this should be set to true.\n *                                                                                                   This is used to avoid making a request to the external resource when the user\n */\nexport const registerInserterMediaCategory =\n\t( category ) =>\n\t( { select, dispatch } ) => {\n\t\tif ( ! category || typeof category !== 'object' ) {\n\t\t\tconsole.error(\n\t\t\t\t'Category should be an `InserterMediaCategory` object.'\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tif ( ! category.name ) {\n\t\t\tconsole.error(\n\t\t\t\t'Category should have a `name` that should be unique among all media categories.'\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tif ( ! category.labels?.name ) {\n\t\t\tconsole.error( 'Category should have a `labels.name`.' );\n\t\t\treturn;\n\t\t}\n\t\tif ( ! [ 'image', 'audio', 'video' ].includes( category.mediaType ) ) {\n\t\t\tconsole.error(\n\t\t\t\t'Category should have `mediaType` property that is one of `image|audio|video`.'\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tif ( ! category.fetch || typeof category.fetch !== 'function' ) {\n\t\t\tconsole.error(\n\t\t\t\t'Category should have a `fetch` function defined with the following signature `(InserterMediaRequest) => Promise<InserterMediaItem[]>`.'\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tconst registeredInserterMediaCategories =\n\t\t\tselect.getRegisteredInserterMediaCategories();\n\t\tif (\n\t\t\tregisteredInserterMediaCategories.some(\n\t\t\t\t( { name } ) => name === category.name\n\t\t\t)\n\t\t) {\n\t\t\tconsole.error(\n\t\t\t\t`A category is already registered with the same name: \"${ category.name }\".`\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tif (\n\t\t\tregisteredInserterMediaCategories.some(\n\t\t\t\t( { labels: { name } = {} } ) => name === category.labels?.name\n\t\t\t)\n\t\t) {\n\t\t\tconsole.error(\n\t\t\t\t`A category is already registered with the same labels.name: \"${ category.labels.name }\".`\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\t// `inserterMediaCategories` is a private block editor setting, which means it cannot\n\t\t// be updated through the public `updateSettings` action. We preserve this setting as\n\t\t// private, so extenders can only add new inserter media categories and don't have any\n\t\t// control over the core media categories.\n\t\tdispatch( {\n\t\t\ttype: 'REGISTER_INSERTER_MEDIA_CATEGORY',\n\t\t\tcategory: { ...category, isExternalResource: true },\n\t\t} );\n\t};\n\n/**\n * @typedef {import('../components/block-editing-mode').BlockEditingMode} BlockEditingMode\n */\n\n/**\n * Sets the block editing mode for a given block.\n *\n * @see useBlockEditingMode\n *\n * @param {string}           clientId The block client ID, or `''` for the root container.\n * @param {BlockEditingMode} mode     The block editing mode. One of `'disabled'`,\n *                                    `'contentOnly'`, or `'default'`.\n *\n * @return {Object} Action object.\n */\nexport function setBlockEditingMode( clientId = '', mode ) {\n\treturn {\n\t\ttype: 'SET_BLOCK_EDITING_MODE',\n\t\tclientId,\n\t\tmode,\n\t};\n}\n\n/**\n * Clears the block editing mode for a given block.\n *\n * @see useBlockEditingMode\n *\n * @param {string} clientId The block client ID, or `''` for the root container.\n *\n * @return {Object} Action object.\n */\nexport function unsetBlockEditingMode( clientId = '' ) {\n\treturn {\n\t\ttype: 'UNSET_BLOCK_EDITING_MODE',\n\t\tclientId,\n\t};\n}\n\n/**\n * Sets which List View panel should be opened.\n *\n * @param {string|null} clientId The client ID of the panel to open, or null to close all.\n * @return {Object} Action object.\n */\nexport function __unstableSetOpenListViewPanel( clientId ) {\n\treturn {\n\t\ttype: 'SET_OPEN_LIST_VIEW_PANEL',\n\t\tclientId,\n\t};\n}\n\n/**\n * Sets all List View panels to be opened.\n *\n * @return {Object} Action object.\n */\nexport function __unstableSetAllListViewPanelsOpen() {\n\treturn {\n\t\ttype: 'SET_ALL_LIST_VIEW_PANELS_OPEN',\n\t};\n}\n\n/**\n * Toggles a List View panel open/closed state.\n *\n * @param {string}  clientId The client ID of the panel to toggle.\n * @param {boolean} isOpen   Whether the panel should be open.\n * @return {Object} Action object.\n */\nexport function __unstableToggleListViewPanel( clientId, isOpen ) {\n\treturn {\n\t\ttype: 'TOGGLE_LIST_VIEW_PANEL',\n\t\tclientId,\n\t\tisOpen,\n\t};\n}\n\n/**\n * Increments the List View expand revision to force re-render.\n *\n * This action increments a counter that is used in the ListView component's key prop.\n * When the key changes, the component will remount with a fresh expanded state,\n * ensuring parent blocks show their children. For example, after click-through\n * navigation.\n *\n * @return {Object} Action object.\n */\nexport function __unstableIncrementListViewExpandRevision() {\n\treturn {\n\t\ttype: 'INCREMENT_LIST_VIEW_EXPAND_REVISION',\n\t};\n}\n"],
  "mappings": "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",
  "names": ["deprecated", "noticesStore", "createEmpty", "defaultBlockName", "blocksWithTheSameType", "preferencesStore"]
}
