From d5790098bb6d11a932fd0e0269b5a1ea5c9d41d2 Mon Sep 17 00:00:00 2001 From: Ella <4710635+ellatrix@users.noreply.github.com> Date: Tue, 9 Apr 2024 15:10:32 +0300 Subject: [PATCH] getEntityRecords: batch actions (#60591) Co-authored-by: ellatrix Co-authored-by: youknowriad --- packages/core-data/src/resolvers.js | 64 +++++++++++++----------- packages/core-data/src/test/resolvers.js | 7 +-- 2 files changed, 38 insertions(+), 33 deletions(-) diff --git a/packages/core-data/src/resolvers.js b/packages/core-data/src/resolvers.js index bc9a0ce28d9e94..7de2c354ba2bf8 100644 --- a/packages/core-data/src/resolvers.js +++ b/packages/core-data/src/resolvers.js @@ -193,7 +193,7 @@ export const getEditedEntityRecord = forwardResolver( 'getEntityRecord' ); */ export const getEntityRecords = ( kind, name, query = {} ) => - async ( { dispatch } ) => { + async ( { dispatch, registry } ) => { const configs = await dispatch( getOrLoadEntitiesConfig( kind, name ) ); const entityConfig = configs.find( ( config ) => config.name === name && config.kind === kind @@ -261,37 +261,41 @@ export const getEntityRecords = } ); } - dispatch.receiveEntityRecords( - kind, - name, - records, - query, - false, - undefined, - meta - ); + registry.batch( () => { + dispatch.receiveEntityRecords( + kind, + name, + records, + query, + false, + undefined, + meta + ); - // When requesting all fields, the list of results can be used to - // resolve the `getEntityRecord` selector in addition to `getEntityRecords`. - // See https://github.com/WordPress/gutenberg/pull/26575 - if ( ! query?._fields && ! query.context ) { - const key = entityConfig.key || DEFAULT_ENTITY_KEY; - const resolutionsArgs = records - .filter( ( record ) => record[ key ] ) - .map( ( record ) => [ kind, name, record[ key ] ] ); + // When requesting all fields, the list of results can be used to + // resolve the `getEntityRecord` selector in addition to `getEntityRecords`. + // See https://github.com/WordPress/gutenberg/pull/26575 + if ( ! query?._fields && ! query.context ) { + const key = entityConfig.key || DEFAULT_ENTITY_KEY; + const resolutionsArgs = records + .filter( ( record ) => record[ key ] ) + .map( ( record ) => [ kind, name, record[ key ] ] ); + + dispatch( { + type: 'START_RESOLUTIONS', + selectorName: 'getEntityRecord', + args: resolutionsArgs, + } ); + dispatch( { + type: 'FINISH_RESOLUTIONS', + selectorName: 'getEntityRecord', + args: resolutionsArgs, + } ); + } - dispatch( { - type: 'START_RESOLUTIONS', - selectorName: 'getEntityRecord', - args: resolutionsArgs, - } ); - dispatch( { - type: 'FINISH_RESOLUTIONS', - selectorName: 'getEntityRecord', - args: resolutionsArgs, - } ); - } - } finally { + dispatch.__unstableReleaseStoreLock( lock ); + } ); + } catch ( e ) { dispatch.__unstableReleaseStoreLock( lock ); } }; diff --git a/packages/core-data/src/test/resolvers.js b/packages/core-data/src/test/resolvers.js index 544caad0c2dbc4..36265165da96ec 100644 --- a/packages/core-data/src/test/resolvers.js +++ b/packages/core-data/src/test/resolvers.js @@ -143,6 +143,7 @@ describe( 'getEntityRecords', () => { baseURLParams: { context: 'edit' }, }, ]; + const registry = { batch: ( callback ) => callback() }; beforeEach( async () => { triggerFetch.mockReset(); @@ -160,7 +161,7 @@ describe( 'getEntityRecords', () => { // Provide response triggerFetch.mockImplementation( () => POST_TYPES ); - await getEntityRecords( 'root', 'postType' )( { dispatch } ); + await getEntityRecords( 'root', 'postType' )( { dispatch, registry } ); // Fetch request should have been issued. expect( triggerFetch ).toHaveBeenCalledWith( { @@ -191,7 +192,7 @@ describe( 'getEntityRecords', () => { // Provide response triggerFetch.mockImplementation( () => POST_TYPES ); - await getEntityRecords( 'root', 'postType' )( { dispatch } ); + await getEntityRecords( 'root', 'postType' )( { dispatch, registry } ); // Fetch request should have been issued. expect( triggerFetch ).toHaveBeenCalledWith( { @@ -221,7 +222,7 @@ describe( 'getEntityRecords', () => { // Provide response triggerFetch.mockImplementation( () => POST_TYPES ); - await getEntityRecords( 'root', 'postType' )( { dispatch } ); + await getEntityRecords( 'root', 'postType' )( { dispatch, registry } ); // Fetch request should have been issued. expect( triggerFetch ).toHaveBeenCalledWith( {