Skip to content

Commit 6897360

Browse files
authored
Gutenberg: Reset core resolvers on site change (#29445)
Reset Gutenberg's `core` resolvers on site change in order to avoid accidentally sending REST request to the previously selected site.
1 parent b1bb29f commit 6897360

File tree

6 files changed

+78
-20
lines changed

6 files changed

+78
-20
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export const setSelectedSiteId = selectedSiteId => ( {
2+
type: 'GUTENLYPSO_SELECTED_SITE_ID_SET',
3+
selectedSiteId,
4+
} );
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/**
2+
* WordPress Dependencies
3+
*/
4+
import { registerStore } from '@wordpress/data';
5+
6+
/**
7+
* Internal dependencies
8+
*/
9+
import reducer from './reducer';
10+
import * as actions from './actions';
11+
import * as selectors from './selectors';
12+
13+
const store = registerStore( 'gutenberg/calypso', {
14+
reducer,
15+
actions,
16+
selectors,
17+
} );
18+
19+
export default store;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/* eslint-disable wpcalypso/import-docblock */
2+
/**
3+
* WordPress dependencies
4+
*/
5+
import { combineReducers } from '@wordpress/data';
6+
7+
const selectedSiteId = ( state = null, action ) =>
8+
'GUTENLYPSO_SELECTED_SITE_ID_SET' === action.type ? action.selectedSiteId : state;
9+
10+
export default combineReducers( { selectedSiteId } );
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const getSelectedSiteId = state => state.selectedSiteId;

client/gutenberg/editor/controller.js

+18-5
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { has, set, uniqueId } from 'lodash';
1212
* WordPress dependencies
1313
*/
1414
import { setLocaleData } from '@wordpress/i18n';
15-
import { dispatch } from '@wordpress/data';
15+
import { dispatch, select } from '@wordpress/data';
1616

1717
/**
1818
* Internal dependencies
@@ -110,6 +110,22 @@ export const loadGutenbergBlockAvailability = store => {
110110
} );
111111
};
112112

113+
export const resetGutenbergState = ( registry, selectedSiteId ) => {
114+
// Always reset core/editor, core/notices, and other UI parts
115+
registry.reset( 'core/editor' );
116+
registry.reset( 'core/notices' );
117+
dispatch( 'core/edit-post' ).closePublishSidebar();
118+
dispatch( 'core/edit-post' ).closeModal();
119+
120+
// Only reset core/data on site change
121+
const previousGutenbergSiteId = select( 'gutenberg/calypso' ).getSelectedSiteId();
122+
123+
if ( !! previousGutenbergSiteId && previousGutenbergSiteId !== selectedSiteId ) {
124+
registry.resetCoreResolvers();
125+
}
126+
dispatch( 'gutenberg/calypso' ).setSelectedSiteId( selectedSiteId );
127+
};
128+
113129
export const redirect = ( { store: { getState } }, next ) => {
114130
const state = getState();
115131
const siteId = getSelectedSiteId( state );
@@ -140,10 +156,7 @@ export const post = async ( context, next ) => {
140156

141157
const { Editor, registry } = initGutenberg( userId, context.store );
142158

143-
// Reset the Gutenberg state
144-
registry.reset();
145-
dispatch( 'core/edit-post' ).closePublishSidebar();
146-
dispatch( 'core/edit-post' ).closeModal();
159+
resetGutenbergState( registry, siteId );
147160

148161
return props => (
149162
<Editor { ...{ siteId, postId, postType, uniqueDraftKey, isDemoContent, ...props } } />

client/gutenberg/editor/init.js

+26-15
Original file line numberDiff line numberDiff line change
@@ -34,26 +34,34 @@ const addResetToRegistry = registry => {
3434
window.gutenbergState = () => mapValues( registry.stores, ( { store } ) => store.getState() );
3535
}
3636

37-
const resettableStores = [ 'core/editor', 'core/notices' ];
38-
3937
const stores = [];
4038
return {
4139
registerStore( namespace, options ) {
42-
let store;
43-
if ( -1 === resettableStores.indexOf( namespace ) ) {
44-
store = registry.registerStore( namespace, options );
45-
} else {
46-
store = registry.registerStore( namespace, {
47-
...options,
48-
reducer: ( state, action ) =>
49-
options.reducer( 'GUTENLYPSO_RESET' === action.type ? undefined : state, action ),
50-
} );
51-
}
40+
const store = registry.registerStore( namespace, {
41+
...options,
42+
reducer: ( state, action ) => {
43+
if ( 'GUTENLYPSO_RESET' === action.type && namespace === action.namespace ) {
44+
debug( `Resetting ${ namespace } store` );
45+
return options.reducer( undefined, action );
46+
}
47+
return options.reducer( state, action );
48+
},
49+
} );
5250
stores.push( store );
5351
return store;
5452
},
55-
reset() {
56-
stores.forEach( store => store.dispatch( { type: 'GUTENLYPSO_RESET' } ) );
53+
reset( namespace ) {
54+
stores.forEach( store => store.dispatch( { type: 'GUTENLYPSO_RESET', namespace } ) );
55+
},
56+
resetCoreResolvers() {
57+
// @see https://github.com/WordPress/gutenberg/blob/e1092c0d0b75fe53ab57bc6c4cc9e32cb2e74e40/packages/data/src/resolvers-cache-middleware.js#L14-L34
58+
const resolvers = registry.select( 'core/data' ).getCachedResolvers( 'core' );
59+
debug( `Resetting core store resolvers: ${ Object.keys( resolvers ).toString() }` );
60+
Object.entries( resolvers ).forEach( ( [ selectorName, resolversByArgs ] ) => {
61+
resolversByArgs.forEach( ( value, args ) => {
62+
registry.dispatch( 'core/data' ).invalidateResolution( 'core', selectorName, args );
63+
} );
64+
} );
5765
},
5866
};
5967
};
@@ -63,12 +71,15 @@ const addResetToRegistry = registry => {
6371
export const initGutenberg = once( ( userId, store ) => {
6472
debug( 'Starting Gutenberg editor initialization...' );
6573

74+
const registry = use( addResetToRegistry );
75+
6676
debug( 'Registering data plugins' );
6777
const storageKey = 'WP_DATA_USER_' + userId;
6878
use( plugins.persistence, { storageKey: storageKey } );
6979
use( plugins.controls );
7080

71-
const registry = use( addResetToRegistry );
81+
debug( 'Initializing gutenberg/calypso store' );
82+
require( 'gutenberg/editor/calypso-store' );
7283

7384
// We need to ensure that core-data is loaded after the data plugins have been registered.
7485
debug( 'Initializing core-data store' );

0 commit comments

Comments
 (0)