@wordpress/core-data
Version:
Access to and manipulation of core WordPress entities.
114 lines (111 loc) • 3.62 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.META_SELECTORS = void 0;
exports.default = useQuerySelect;
var _data = require("@wordpress/data");
var _memoize = _interopRequireDefault(require("./memoize"));
var _constants = require("./constants");
/**
* WordPress dependencies
*/
/**
* Internal dependencies
*/
const META_SELECTORS = exports.META_SELECTORS = ['getIsResolving', 'hasStartedResolution', 'hasFinishedResolution', 'isResolving', 'getCachedResolvers'];
/**
* Like useSelect, but the selectors return objects containing
* both the original data AND the resolution info.
*
* @since 6.1.0 Introduced in WordPress core.
* @private
*
* @param {Function} mapQuerySelect see useSelect
* @param {Array} deps see useSelect
*
* @example
* ```js
* import { useQuerySelect } from '@wordpress/data';
* import { store as coreDataStore } from '@wordpress/core-data';
*
* function PageTitleDisplay( { id } ) {
* const { data: page, isResolving } = useQuerySelect( ( query ) => {
* return query( coreDataStore ).getEntityRecord( 'postType', 'page', id )
* }, [ id ] );
*
* if ( isResolving ) {
* return 'Loading...';
* }
*
* return page.title;
* }
*
* // Rendered in the application:
* // <PageTitleDisplay id={ 10 } />
* ```
*
* In the above example, when `PageTitleDisplay` is rendered into an
* application, the page and the resolution details will be retrieved from
* the store state using the `mapSelect` callback on `useQuerySelect`.
*
* If the id prop changes then any page in the state for that id is
* retrieved. If the id prop doesn't change and other props are passed in
* that do change, the title will not change because the dependency is just
* the id.
* @see useSelect
*
* @return {QuerySelectResponse} Queried data.
*/
function useQuerySelect(mapQuerySelect, deps) {
return (0, _data.useSelect)((select, registry) => {
const resolve = store => enrichSelectors(select(store));
return mapQuerySelect(resolve, registry);
}, deps);
}
/**
* Transform simple selectors into ones that return an object with the
* original return value AND the resolution info.
*
* @param {Object} selectors Selectors to enrich
* @return {EnrichedSelectors} Enriched selectors
*/
const enrichSelectors = (0, _memoize.default)(selectors => {
const resolvers = {};
for (const selectorName in selectors) {
if (META_SELECTORS.includes(selectorName)) {
continue;
}
Object.defineProperty(resolvers, selectorName, {
get: () => (...args) => {
const data = selectors[selectorName](...args);
const resolutionStatus = selectors.getResolutionState(selectorName, args)?.status;
let status;
switch (resolutionStatus) {
case 'resolving':
status = _constants.Status.Resolving;
break;
case 'finished':
status = _constants.Status.Success;
break;
case 'error':
status = _constants.Status.Error;
break;
case undefined:
status = _constants.Status.Idle;
break;
}
return {
data,
status,
isResolving: status === _constants.Status.Resolving,
hasStarted: status !== _constants.Status.Idle,
hasResolved: status === _constants.Status.Success || status === _constants.Status.Error
};
}
});
}
return resolvers;
});
//# sourceMappingURL=use-query-select.js.map
;