UNPKG

@wordpress/block-editor

Version:
66 lines (54 loc) 1.8 kB
/** * WordPress dependencies */ import { isEntirelySelected } from '@wordpress/dom'; import { useSelect, useDispatch } from '@wordpress/data'; import { __unstableUseShortcutEventMatch as useShortcutEventMatch } from '@wordpress/keyboard-shortcuts'; import { useRefEffect } from '@wordpress/compose'; /** * Internal dependencies */ import { store as blockEditorStore } from '../../store'; export default function useSelectAll() { const { getBlockOrder, getSelectedBlockClientIds, getBlockRootClientId } = useSelect( blockEditorStore ); const { multiSelect, selectBlock } = useDispatch( blockEditorStore ); const isMatch = useShortcutEventMatch(); return useRefEffect( ( node ) => { function onKeyDown( event ) { if ( ! isMatch( 'core/block-editor/select-all', event ) ) { return; } const selectedClientIds = getSelectedBlockClientIds(); if ( selectedClientIds.length < 2 && ! isEntirelySelected( event.target ) ) { return; } event.preventDefault(); const [ firstSelectedClientId ] = selectedClientIds; const rootClientId = getBlockRootClientId( firstSelectedClientId ); const blockClientIds = getBlockOrder( rootClientId ); // If we have selected all sibling nested blocks, try selecting up a // level. See: https://github.com/WordPress/gutenberg/pull/31859/ if ( selectedClientIds.length === blockClientIds.length ) { if ( rootClientId ) { node.ownerDocument.defaultView .getSelection() .removeAllRanges(); selectBlock( rootClientId ); } return; } multiSelect( blockClientIds[ 0 ], blockClientIds[ blockClientIds.length - 1 ] ); } node.addEventListener( 'keydown', onKeyDown ); return () => { node.removeEventListener( 'keydown', onKeyDown ); }; }, [] ); }