Skip to content

Commit

Permalink
Widgets: Memoize 'getWidgets' store selector (#63338)
Browse files Browse the repository at this point in the history
Co-authored-by: Mamaduka <mamaduka@git.wordpress.org>
Co-authored-by: tyxla <tyxla@git.wordpress.org>
  • Loading branch information
3 people committed Jul 10, 2024
1 parent 73719c4 commit acda158
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ const { ExperimentalBlockEditorProvider } = unlock( blockEditorPrivateApis );
const { PatternsMenuItems } = unlock( editPatternsPrivateApis );
const { BlockKeyboardShortcuts } = unlock( blockLibraryPrivateApis );

const EMPTY_ARRAY = [];

export default function WidgetAreasBlockEditorProvider( {
blockEditorSettings,
children,
Expand All @@ -54,7 +56,7 @@ export default function WidgetAreasBlockEditorProvider( {
widgets: select( editWidgetsStore ).getWidgets(),
reusableBlocks: ALLOW_REUSABLE_BLOCKS
? getEntityRecords( 'postType', 'wp_block' )
: [],
: EMPTY_ARRAY,
isFixedToolbarActive: !! select( preferencesStore ).get(
'core/edit-widgets',
'fixedToolbar'
Expand Down
47 changes: 29 additions & 18 deletions packages/edit-widgets/src/store/selectors.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/**
* WordPress dependencies
*/
import { createRegistrySelector } from '@wordpress/data';
import { createSelector, createRegistrySelector } from '@wordpress/data';
import { getWidgetIdFromBlock } from '@wordpress/widgets';
import { store as coreStore } from '@wordpress/core-data';
import { store as blockEditorStore } from '@wordpress/block-editor';
Expand Down Expand Up @@ -29,24 +29,35 @@ const EMPTY_INSERTION_POINT = {
*
* @return {Object[]} API List of widgets.
*/
export const getWidgets = createRegistrySelector( ( select ) => () => {
const widgets = select( coreStore ).getEntityRecords(
'root',
'widget',
buildWidgetsQuery()
);
export const getWidgets = createRegistrySelector( ( select ) =>
createSelector(
() => {
const widgets = select( coreStore ).getEntityRecords(
'root',
'widget',
buildWidgetsQuery()
);

return (
// Key widgets by their ID.
widgets?.reduce(
( allWidgets, widget ) => ( {
...allWidgets,
[ widget.id ]: widget,
} ),
{}
) || {}
);
} );
return (
// Key widgets by their ID.
widgets?.reduce(
( allWidgets, widget ) => ( {
...allWidgets,
[ widget.id ]: widget,
} ),
{}
) ?? {}
);
},
() => [
select( coreStore ).getEntityRecords(
'root',
'widget',
buildWidgetsQuery()
),
]
)
);

/**
* Returns API widget data for a particular widget ID.
Expand Down

0 comments on commit acda158

Please sign in to comment.