From a82a20bbe27735a0055684278b04dd97a58a98a3 Mon Sep 17 00:00:00 2001 From: Robert Anderson Date: Fri, 9 Jun 2023 12:28:10 +1000 Subject: [PATCH 1/3] Remove select() hack from getBlockEditingMode() --- packages/block-editor/src/store/index.js | 14 ++-- .../src/store/private-selectors.js | 65 +++++++++---------- 2 files changed, 35 insertions(+), 44 deletions(-) diff --git a/packages/block-editor/src/store/index.js b/packages/block-editor/src/store/index.js index ed17b387ba5884..0506cbddec88aa 100644 --- a/packages/block-editor/src/store/index.js +++ b/packages/block-editor/src/store/index.js @@ -1,7 +1,7 @@ /** * WordPress dependencies */ -import { createReduxStore, registerStore } from '@wordpress/data'; +import { createReduxStore, register } from '@wordpress/data'; /** * Internal dependencies @@ -35,11 +35,7 @@ export const store = createReduxStore( STORE_NAME, { persist: [ 'preferences' ], } ); -// We will be able to use the `register` function once we switch -// the "preferences" persistence to use the new preferences package. -const registeredStore = registerStore( STORE_NAME, { - ...storeConfig, - persist: [ 'preferences' ], -} ); -unlock( registeredStore ).registerPrivateActions( privateActions ); -unlock( registeredStore ).registerPrivateSelectors( privateSelectors ); +unlock( store ).registerPrivateActions( privateActions ); +unlock( store ).registerPrivateSelectors( privateSelectors ); + +register( store ); diff --git a/packages/block-editor/src/store/private-selectors.js b/packages/block-editor/src/store/private-selectors.js index ff85b4fb3f20b4..d73c540a392252 100644 --- a/packages/block-editor/src/store/private-selectors.js +++ b/packages/block-editor/src/store/private-selectors.js @@ -6,8 +6,8 @@ import createSelector from 'rememo'; /** * WordPress dependencies */ -import { select } from '@wordpress/data'; import { store as blocksStore } from '@wordpress/blocks'; +import { createRegistrySelector } from '@wordpress/data'; /** * Internal dependencies @@ -72,40 +72,35 @@ export function getLastInsertedBlocksClientIds( state ) { * @return {BlockEditingMode} The block editing mode. One of `'disabled'`, * `'contentOnly'`, or `'default'`. */ -export const getBlockEditingMode = createSelector( - ( state, clientId = '' ) => { - if ( state.blockEditingModes.has( clientId ) ) { - return state.blockEditingModes.get( clientId ); - } - if ( ! clientId ) { - return 'default'; - } - const rootClientId = getBlockRootClientId( state, clientId ); - const templateLock = getTemplateLock( state, rootClientId ); - if ( templateLock === 'contentOnly' ) { - const name = getBlockName( state, clientId ); - // TODO: Terrible hack! We're calling the global select() function - // here instead of using createRegistrySelector(). The problem with - // using createRegistrySelector() is that then the public - // block-editor selectors (e.g. canInsertBlockTypeUnmemoized) can't - // call this private block-editor selector due to a bug in - // @wordpress/data. See - // https://github.com/WordPress/gutenberg/pull/50985. - const isContent = - select( blocksStore ).__experimentalHasContentRoleAttribute( - name - ); - return isContent ? 'contentOnly' : 'disabled'; - } - const parentMode = getBlockEditingMode( state, rootClientId ); - return parentMode === 'contentOnly' ? 'default' : parentMode; - }, - ( state ) => [ - state.blockEditingModes, - state.blocks.parents, - state.settings.templateLock, - state.blockListSettings, - ] +export const getBlockEditingMode = createRegistrySelector( ( select ) => + createSelector( + ( state, clientId = '' ) => { + if ( state.blockEditingModes.has( clientId ) ) { + return state.blockEditingModes.get( clientId ); + } + if ( ! clientId ) { + return 'default'; + } + const rootClientId = getBlockRootClientId( state, clientId ); + const templateLock = getTemplateLock( state, rootClientId ); + if ( templateLock === 'contentOnly' ) { + const name = getBlockName( state, clientId ); + const isContent = + select( blocksStore ).__experimentalHasContentRoleAttribute( + name + ); + return isContent ? 'contentOnly' : 'disabled'; + } + const parentMode = getBlockEditingMode( state, rootClientId ); + return parentMode === 'contentOnly' ? 'default' : parentMode; + }, + ( state ) => [ + state.blockEditingModes, + state.blocks.parents, + state.settings.templateLock, + state.blockListSettings, + ] + ) ); /** From 41c2532c7e1533053dbb94f0c1230356722a32fc Mon Sep 17 00:00:00 2001 From: Robert Anderson Date: Fri, 9 Jun 2023 13:18:48 +1000 Subject: [PATCH 2/3] Update getBlockEditingMode tests --- .../src/store/test/private-selectors.js | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/packages/block-editor/src/store/test/private-selectors.js b/packages/block-editor/src/store/test/private-selectors.js index ecae342317ce18..1dae0a21e06b12 100644 --- a/packages/block-editor/src/store/test/private-selectors.js +++ b/packages/block-editor/src/store/test/private-selectors.js @@ -1,8 +1,3 @@ -/** - * WordPress dependencies - */ -import { select } from '@wordpress/data'; - /** * Internal dependencies */ @@ -126,9 +121,11 @@ describe( 'private selectors', () => { const __experimentalHasContentRoleAttribute = jest.fn( () => false ); - select.mockReturnValue( { - __experimentalHasContentRoleAttribute, - } ); + getBlockEditingMode.registry = { + select: jest.fn( () => ( { + __experimentalHasContentRoleAttribute, + } ) ), + }; it( 'should return default by default', () => { expect( From e9855d2853529cf1e276a4df7348acb5ba09f44c Mon Sep 17 00:00:00 2001 From: Robert Anderson Date: Fri, 9 Jun 2023 14:28:19 +1000 Subject: [PATCH 3/3] Fix block-editor selector tests --- packages/block-editor/src/store/test/private-selectors.js | 4 ++-- packages/block-editor/src/store/test/selectors.js | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/block-editor/src/store/test/private-selectors.js b/packages/block-editor/src/store/test/private-selectors.js index 1dae0a21e06b12..c6dac371692f7e 100644 --- a/packages/block-editor/src/store/test/private-selectors.js +++ b/packages/block-editor/src/store/test/private-selectors.js @@ -122,9 +122,9 @@ describe( 'private selectors', () => { () => false ); getBlockEditingMode.registry = { - select: jest.fn( () => ( { + select: () => ( { __experimentalHasContentRoleAttribute, - } ) ), + } ), }; it( 'should return default by default', () => { diff --git a/packages/block-editor/src/store/test/selectors.js b/packages/block-editor/src/store/test/selectors.js index 5cc17fc08b3142..652a9307bf18a0 100644 --- a/packages/block-editor/src/store/test/selectors.js +++ b/packages/block-editor/src/store/test/selectors.js @@ -73,6 +73,13 @@ const { wasBlockJustInserted, __experimentalGetGlobalBlocksByName, } = selectors; +import { getBlockEditingMode } from '../private-selectors'; + +getBlockEditingMode.registry = { + select: () => ( { + __experimentalHasContentRoleAttribute: jest.fn( () => false ), + } ), +}; describe( 'selectors', () => { let cachedSelectors;