Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions packages/data/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

## Unreleased

### New Features

- Added new `resolveSelect` registry method to initiate and wait for selector resolution

## 4.26.0 (2020-12-17)

### New Features
Expand Down
23 changes: 23 additions & 0 deletions packages/data/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -591,6 +591,29 @@ components via a consumer.
See <a name="#RegistryConsumer">RegistryConsumer</a> documentation for
example.

<a name="resolveSelect" href="#resolveSelect">#</a> **resolveSelect**

Given the name of a registered store, returns an object containing the store's
selectors pre-bound to state so that you only need to supply additional arguments,
and modified so that they return promises that resolve to their eventual values,
after any resolvers have ran.

_Usage_

```js
import { resolveSelect } from '@wordpress/data';

resolveSelect( 'my-shop' ).getPrice( 'hammer' ).then(console.log)
```

_Parameters_

- _storeNameOrDefinition_ `(string|WPDataStore)`: Unique namespace identifier for the store or the store definition.

_Returns_

- `Object`: Object containing the store's promise-wrapped selectors.

<a name="select" href="#select">#</a> **select**

Given the name or definition of a registered store, returns an object of the store's selectors.
Expand Down
2 changes: 1 addition & 1 deletion packages/data/src/controls.js
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ export const builtinControls = {
( registry ) => ( { storeKey, selectorName, args } ) => {
const method = registry.select( storeKey )[ selectorName ]
.hasResolver
? '__experimentalResolveSelect'
? 'resolveSelect'
: 'select';
return registry[ method ]( storeKey )[ selectorName ]( ...args );
}
Expand Down
7 changes: 3 additions & 4 deletions packages/data/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -106,15 +106,14 @@ export const select = defaultRegistry.select;
*
* @example
* ```js
* import { __experimentalResolveSelect } from '@wordpress/data';
* import { resolveSelect } from '@wordpress/data';
*
* __experimentalResolveSelect( 'my-shop' ).getPrice( 'hammer' ).then(console.log)
* resolveSelect( 'my-shop' ).getPrice( 'hammer' ).then(console.log)
* ```
*
* @return {Object} Object containing the store's promise-wrapped selectors.
*/
export const __experimentalResolveSelect =
defaultRegistry.__experimentalResolveSelect;
export const resolveSelect = defaultRegistry.resolveSelect;

/**
* Given the name of a registered store, returns an object of the store's action creators.
Expand Down
7 changes: 4 additions & 3 deletions packages/data/src/redux-store/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -148,10 +148,11 @@ export default function createReduxStore( key, options ) {
selectors = result.selectors;
}

const resolveSelectors = mapResolveSelectors( selectors, store );

const getSelectors = () => selectors;
const getActions = () => actions;
const getResolveSelectors = () =>
mapResolveSelectors( selectors, store );
const getResolveSelectors = () => resolveSelectors;

// We have some modules monkey-patching the store object
// It's wrong to do so but until we refactor all of our effects to controls
Expand Down Expand Up @@ -185,7 +186,7 @@ export default function createReduxStore( key, options ) {
selectors,
resolvers,
getSelectors,
__experimentalGetResolveSelectors: getResolveSelectors,
getResolveSelectors,
getActions,
subscribe,
};
Expand Down
8 changes: 4 additions & 4 deletions packages/data/src/registry.js
Original file line number Diff line number Diff line change
Expand Up @@ -112,17 +112,17 @@ export function createRegistry( storeConfigs = {}, parent = null ) {
*
* @return {Object} Each key of the object matches the name of a selector.
*/
function __experimentalResolveSelect( storeNameOrDefinition ) {
function resolveSelect( storeNameOrDefinition ) {
const storeName = isObject( storeNameOrDefinition )
? storeNameOrDefinition.name
: storeNameOrDefinition;
__experimentalListeningStores.add( storeName );
const store = stores[ storeName ];
if ( store ) {
return store.__experimentalGetResolveSelectors();
return store.getResolveSelectors();
}

return parent && parent.__experimentalResolveSelect( storeName );
return parent && parent.resolveSelect( storeName );
}

/**
Expand Down Expand Up @@ -218,7 +218,7 @@ export function createRegistry( storeConfigs = {}, parent = null ) {
namespaces: stores, // TODO: Deprecate/remove this.
subscribe,
select,
__experimentalResolveSelect,
resolveSelect,
dispatch,
use,
register,
Expand Down
4 changes: 1 addition & 3 deletions packages/edit-navigation/src/store/controls.js
Original file line number Diff line number Diff line change
Expand Up @@ -167,9 +167,7 @@ const controls = {

RESOLVE_MENU_ITEMS: createRegistryControl(
( registry ) => ( { query } ) => {
return registry
.__experimentalResolveSelect( 'core' )
.getMenuItems( query );
return registry.resolveSelect( 'core' ).getMenuItems( query );
}
),
};
Expand Down
6 changes: 2 additions & 4 deletions packages/edit-navigation/src/store/test/controls.js
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ describe( 'controls', () => {
it( 'triggers RESOLVE_MENU_ITEMS', () => {
const getMenuItems = jest.fn( () => [ 'menu-1', 'menu-2' ] );
const registry = {
__experimentalResolveSelect: jest.fn( () => ( {
resolveSelect: jest.fn( () => ( {
getMenuItems,
} ) ),
};
Expand All @@ -282,9 +282,7 @@ describe( 'controls', () => {
} )
).toEqual( [ 'menu-1', 'menu-2' ] );

expect( registry.__experimentalResolveSelect ).toHaveBeenCalledWith(
'core'
);
expect( registry.resolveSelect ).toHaveBeenCalledWith( 'core' );
expect( getMenuItems ).toHaveBeenCalledTimes( 1 );
} );
} );
4 changes: 2 additions & 2 deletions packages/edit-widgets/src/store/controls.js
Original file line number Diff line number Diff line change
Expand Up @@ -163,14 +163,14 @@ const controls = {
RESOLVE_WIDGET_AREAS: createRegistryControl(
( registry ) => ( { query } ) => {
return registry
.__experimentalResolveSelect( 'core' )
.resolveSelect( 'core' )
.getEntityRecords( KIND, WIDGET_AREA_ENTITY_TYPE, query );
}
),

RESOLVE_WIDGETS: createRegistryControl( ( registry ) => ( { query } ) => {
return registry
.__experimentalResolveSelect( 'core' )
.resolveSelect( 'core' )
.getEntityRecords( 'root', 'widget', query );
} ),
};
Expand Down