@wordpress/data 6.7.0 → 6.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/README.md +28 -0
- package/build/components/use-select/index.js +133 -19
- package/build/components/use-select/index.js.map +1 -1
- package/build/index.js +22 -3
- package/build/index.js.map +1 -1
- package/build/plugins/persistence/index.js +2 -375
- package/build/plugins/persistence/index.js.map +1 -1
- package/build/redux-store/index.js +52 -5
- package/build/redux-store/index.js.map +1 -1
- package/build/registry.js +31 -4
- package/build/registry.js.map +1 -1
- package/build-module/components/use-select/index.js +131 -19
- package/build-module/components/use-select/index.js.map +1 -1
- package/build-module/index.js +13 -1
- package/build-module/index.js.map +1 -1
- package/build-module/plugins/persistence/index.js +2 -365
- package/build-module/plugins/persistence/index.js.map +1 -1
- package/build-module/redux-store/index.js +52 -5
- package/build-module/redux-store/index.js.map +1 -1
- package/build-module/registry.js +31 -4
- package/build-module/registry.js.map +1 -1
- package/package.json +8 -8
- package/src/components/use-select/index.js +144 -14
- package/src/components/use-select/test/index.js +139 -3
- package/src/components/use-select/test/suspense.js +160 -0
- package/src/index.js +16 -1
- package/src/plugins/persistence/index.js +2 -420
- package/src/plugins/persistence/test/index.js +1 -777
- package/src/redux-store/index.js +43 -0
- package/src/registry.js +30 -4
- package/src/test/registry.js +8 -1
- package/tsconfig.json +2 -2
package/CHANGELOG.md
CHANGED
package/README.md
CHANGED
|
@@ -662,6 +662,20 @@ _Parameters_
|
|
|
662
662
|
|
|
663
663
|
- _listener_ `Function`: Callback function.
|
|
664
664
|
|
|
665
|
+
### suspendSelect
|
|
666
|
+
|
|
667
|
+
Given the name of a registered store, returns an object containing the store's
|
|
668
|
+
selectors pre-bound to state so that you only need to supply additional arguments,
|
|
669
|
+
and modified so that they throw promises in case the selector is not resolved yet.
|
|
670
|
+
|
|
671
|
+
_Parameters_
|
|
672
|
+
|
|
673
|
+
- _storeNameOrDescriptor_ `string|StoreDescriptor`: Unique namespace identifier for the store or the store descriptor.
|
|
674
|
+
|
|
675
|
+
_Returns_
|
|
676
|
+
|
|
677
|
+
- `Object`: Object containing the store's suspense-wrapped selectors.
|
|
678
|
+
|
|
665
679
|
### use
|
|
666
680
|
|
|
667
681
|
Extends a registry to inherit functionality provided by a given plugin. A
|
|
@@ -827,6 +841,20 @@ _Returns_
|
|
|
827
841
|
|
|
828
842
|
- `Function`: A custom react hook.
|
|
829
843
|
|
|
844
|
+
### useSuspenseSelect
|
|
845
|
+
|
|
846
|
+
A variant of the `useSelect` hook that has the same API, but will throw a
|
|
847
|
+
suspense Promise if any of the called selectors is in an unresolved state.
|
|
848
|
+
|
|
849
|
+
_Parameters_
|
|
850
|
+
|
|
851
|
+
- _mapSelect_ `Function`: Function called on every state change. The returned value is exposed to the component using this hook. The function receives the `registry.suspendSelect` method as the first argument and the `registry` as the second one.
|
|
852
|
+
- _deps_ `Array`: A dependency array used to memoize the `mapSelect` so that the same `mapSelect` is invoked on every state change unless the dependencies change.
|
|
853
|
+
|
|
854
|
+
_Returns_
|
|
855
|
+
|
|
856
|
+
- `Object`: Data object returned by the `mapSelect` function.
|
|
857
|
+
|
|
830
858
|
### withDispatch
|
|
831
859
|
|
|
832
860
|
Higher-order component used to add dispatch props using registered action
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
8
|
exports.default = useSelect;
|
|
9
|
+
exports.useSuspenseSelect = useSuspenseSelect;
|
|
9
10
|
|
|
10
11
|
var _useMemoOne = require("use-memo-one");
|
|
11
12
|
|
|
@@ -124,14 +125,7 @@ function useSelect(mapSelect, deps) {
|
|
|
124
125
|
const _mapSelect = hasMappingFunction ? callbackMapper : null;
|
|
125
126
|
|
|
126
127
|
const registry = (0, _useRegistry.default)();
|
|
127
|
-
const isAsync = (0, _useAsyncMode.default)();
|
|
128
|
-
// We use the cache-stable `useMemoOne` to avoid
|
|
129
|
-
// losing queues.
|
|
130
|
-
|
|
131
|
-
const queueContext = (0, _useMemoOne.useMemoOne)(() => ({
|
|
132
|
-
queue: true
|
|
133
|
-
}), [registry]);
|
|
134
|
-
const [, forceRender] = (0, _element.useReducer)(s => s + 1, 0);
|
|
128
|
+
const isAsync = (0, _useAsyncMode.default)();
|
|
135
129
|
const latestRegistry = (0, _element.useRef)(registry);
|
|
136
130
|
const latestMapSelect = (0, _element.useRef)();
|
|
137
131
|
const latestIsAsync = (0, _element.useRef)(isAsync);
|
|
@@ -151,9 +145,10 @@ function useSelect(mapSelect, deps) {
|
|
|
151
145
|
mapOutput = latestMapOutput.current;
|
|
152
146
|
const hasReplacedRegistry = latestRegistry.current !== registry;
|
|
153
147
|
const hasReplacedMapSelect = latestMapSelect.current !== _mapSelect;
|
|
148
|
+
const hasLeftAsyncMode = latestIsAsync.current && !isAsync;
|
|
154
149
|
const lastMapSelectFailed = !!latestMapOutputError.current;
|
|
155
150
|
|
|
156
|
-
if (hasReplacedRegistry || hasReplacedMapSelect || lastMapSelectFailed) {
|
|
151
|
+
if (hasReplacedRegistry || hasReplacedMapSelect || hasLeftAsyncMode || lastMapSelectFailed) {
|
|
157
152
|
try {
|
|
158
153
|
mapOutput = wrapSelect(_mapSelect);
|
|
159
154
|
} catch (error) {
|
|
@@ -178,17 +173,18 @@ function useSelect(mapSelect, deps) {
|
|
|
178
173
|
|
|
179
174
|
latestRegistry.current = registry;
|
|
180
175
|
latestMapSelect.current = _mapSelect;
|
|
176
|
+
latestIsAsync.current = isAsync;
|
|
181
177
|
latestMapOutput.current = mapOutput;
|
|
182
|
-
latestMapOutputError.current = undefined;
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
178
|
+
latestMapOutputError.current = undefined;
|
|
179
|
+
}); // React can sometimes clear the `useMemo` cache.
|
|
180
|
+
// We use the cache-stable `useMemoOne` to avoid
|
|
181
|
+
// losing queues.
|
|
182
|
+
|
|
183
|
+
const queueContext = (0, _useMemoOne.useMemoOne)(() => ({
|
|
184
|
+
queue: true
|
|
185
|
+
}), [registry]);
|
|
186
|
+
const [, forceRender] = (0, _element.useReducer)(s => s + 1, 0);
|
|
187
|
+
const isMounted = (0, _element.useRef)(false);
|
|
192
188
|
(0, _compose.useIsomorphicLayoutEffect)(() => {
|
|
193
189
|
if (!hasMappingFunction) {
|
|
194
190
|
return;
|
|
@@ -211,6 +207,10 @@ function useSelect(mapSelect, deps) {
|
|
|
211
207
|
};
|
|
212
208
|
|
|
213
209
|
const onChange = () => {
|
|
210
|
+
if (!isMounted.current) {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
214
|
if (latestIsAsync.current) {
|
|
215
215
|
renderQueue.add(queueContext, onStoreChange);
|
|
216
216
|
} else {
|
|
@@ -222,14 +222,128 @@ function useSelect(mapSelect, deps) {
|
|
|
222
222
|
|
|
223
223
|
onStoreChange();
|
|
224
224
|
const unsubscribers = listeningStores.current.map(storeName => registry.__unstableSubscribeStore(storeName, onChange));
|
|
225
|
+
isMounted.current = true;
|
|
225
226
|
return () => {
|
|
226
227
|
// The return value of the subscribe function could be undefined if the store is a custom generic store.
|
|
227
228
|
unsubscribers.forEach(unsubscribe => unsubscribe === null || unsubscribe === void 0 ? void 0 : unsubscribe());
|
|
228
229
|
renderQueue.cancel(queueContext);
|
|
230
|
+
isMounted.current = false;
|
|
229
231
|
}; // If you're tempted to eliminate the spread dependencies below don't do it!
|
|
230
232
|
// We're passing these in from the calling function and want to make sure we're
|
|
231
233
|
// examining every individual value inside the `deps` array.
|
|
232
234
|
}, [registry, wrapSelect, hasMappingFunction, depsChangedFlag]);
|
|
233
235
|
return hasMappingFunction ? mapOutput : registry.select(mapSelect);
|
|
234
236
|
}
|
|
237
|
+
/**
|
|
238
|
+
* A variant of the `useSelect` hook that has the same API, but will throw a
|
|
239
|
+
* suspense Promise if any of the called selectors is in an unresolved state.
|
|
240
|
+
*
|
|
241
|
+
* @param {Function} mapSelect Function called on every state change. The
|
|
242
|
+
* returned value is exposed to the component
|
|
243
|
+
* using this hook. The function receives the
|
|
244
|
+
* `registry.suspendSelect` method as the first
|
|
245
|
+
* argument and the `registry` as the second one.
|
|
246
|
+
* @param {Array} deps A dependency array used to memoize the `mapSelect`
|
|
247
|
+
* so that the same `mapSelect` is invoked on every
|
|
248
|
+
* state change unless the dependencies change.
|
|
249
|
+
*
|
|
250
|
+
* @return {Object} Data object returned by the `mapSelect` function.
|
|
251
|
+
*/
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
function useSuspenseSelect(mapSelect, deps) {
|
|
255
|
+
const _mapSelect = (0, _element.useCallback)(mapSelect, deps);
|
|
256
|
+
|
|
257
|
+
const registry = (0, _useRegistry.default)();
|
|
258
|
+
const isAsync = (0, _useAsyncMode.default)();
|
|
259
|
+
const latestRegistry = (0, _element.useRef)(registry);
|
|
260
|
+
const latestMapSelect = (0, _element.useRef)();
|
|
261
|
+
const latestIsAsync = (0, _element.useRef)(isAsync);
|
|
262
|
+
const latestMapOutput = (0, _element.useRef)();
|
|
263
|
+
const latestMapOutputError = (0, _element.useRef)(); // Keep track of the stores being selected in the `mapSelect` function,
|
|
264
|
+
// and only subscribe to those stores later.
|
|
265
|
+
|
|
266
|
+
const listeningStores = (0, _element.useRef)([]);
|
|
267
|
+
const wrapSelect = (0, _element.useCallback)(callback => registry.__unstableMarkListeningStores(() => callback(registry.suspendSelect, registry), listeningStores), [registry]); // Generate a "flag" for used in the effect dependency array.
|
|
268
|
+
// It's different than just using `mapSelect` since deps could be undefined,
|
|
269
|
+
// in that case, we would still want to memoize it.
|
|
270
|
+
|
|
271
|
+
const depsChangedFlag = (0, _element.useMemo)(() => ({}), deps || []);
|
|
272
|
+
let mapOutput = latestMapOutput.current;
|
|
273
|
+
let mapOutputError = latestMapOutputError.current;
|
|
274
|
+
const hasReplacedRegistry = latestRegistry.current !== registry;
|
|
275
|
+
const hasReplacedMapSelect = latestMapSelect.current !== _mapSelect;
|
|
276
|
+
const hasLeftAsyncMode = latestIsAsync.current && !isAsync;
|
|
277
|
+
|
|
278
|
+
if (hasReplacedRegistry || hasReplacedMapSelect || hasLeftAsyncMode) {
|
|
279
|
+
try {
|
|
280
|
+
mapOutput = wrapSelect(_mapSelect);
|
|
281
|
+
} catch (error) {
|
|
282
|
+
mapOutputError = error;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
(0, _compose.useIsomorphicLayoutEffect)(() => {
|
|
287
|
+
latestRegistry.current = registry;
|
|
288
|
+
latestMapSelect.current = _mapSelect;
|
|
289
|
+
latestIsAsync.current = isAsync;
|
|
290
|
+
latestMapOutput.current = mapOutput;
|
|
291
|
+
latestMapOutputError.current = mapOutputError;
|
|
292
|
+
}); // React can sometimes clear the `useMemo` cache.
|
|
293
|
+
// We use the cache-stable `useMemoOne` to avoid
|
|
294
|
+
// losing queues.
|
|
295
|
+
|
|
296
|
+
const queueContext = (0, _useMemoOne.useMemoOne)(() => ({
|
|
297
|
+
queue: true
|
|
298
|
+
}), [registry]);
|
|
299
|
+
const [, forceRender] = (0, _element.useReducer)(s => s + 1, 0);
|
|
300
|
+
const isMounted = (0, _element.useRef)(false);
|
|
301
|
+
(0, _compose.useIsomorphicLayoutEffect)(() => {
|
|
302
|
+
const onStoreChange = () => {
|
|
303
|
+
try {
|
|
304
|
+
const newMapOutput = wrapSelect(latestMapSelect.current);
|
|
305
|
+
|
|
306
|
+
if ((0, _isShallowEqual.default)(latestMapOutput.current, newMapOutput)) {
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
latestMapOutput.current = newMapOutput;
|
|
311
|
+
} catch (error) {
|
|
312
|
+
latestMapOutputError.current = error;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
forceRender();
|
|
316
|
+
};
|
|
317
|
+
|
|
318
|
+
const onChange = () => {
|
|
319
|
+
if (!isMounted.current) {
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
if (latestIsAsync.current) {
|
|
324
|
+
renderQueue.add(queueContext, onStoreChange);
|
|
325
|
+
} else {
|
|
326
|
+
onStoreChange();
|
|
327
|
+
}
|
|
328
|
+
}; // catch any possible state changes during mount before the subscription
|
|
329
|
+
// could be set.
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
onStoreChange();
|
|
333
|
+
const unsubscribers = listeningStores.current.map(storeName => registry.__unstableSubscribeStore(storeName, onChange));
|
|
334
|
+
isMounted.current = true;
|
|
335
|
+
return () => {
|
|
336
|
+
// The return value of the subscribe function could be undefined if the store is a custom generic store.
|
|
337
|
+
unsubscribers.forEach(unsubscribe => unsubscribe === null || unsubscribe === void 0 ? void 0 : unsubscribe());
|
|
338
|
+
renderQueue.cancel(queueContext);
|
|
339
|
+
isMounted.current = false;
|
|
340
|
+
};
|
|
341
|
+
}, [registry, wrapSelect, depsChangedFlag]);
|
|
342
|
+
|
|
343
|
+
if (mapOutputError) {
|
|
344
|
+
throw mapOutputError;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
return mapOutput;
|
|
348
|
+
}
|
|
235
349
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["@wordpress/data/src/components/use-select/index.js"],"names":["noop","renderQueue","useSelect","mapSelect","deps","hasMappingFunction","callbackMapper","_mapSelect","registry","isAsync","queueContext","queue","forceRender","s","latestRegistry","latestMapSelect","latestIsAsync","latestMapOutput","latestMapOutputError","listeningStores","wrapSelect","callback","__unstableMarkListeningStores","select","depsChangedFlag","mapOutput","current","hasReplacedRegistry","hasReplacedMapSelect","lastMapSelectFailed","error","errorMessage","message","stack","console","undefined","flush","onStoreChange","newMapOutput","onChange","add","unsubscribers","map","storeName","__unstableSubscribeStore","forEach","unsubscribe","cancel"],"mappings":";;;;;;;;;AAGA;;AAKA;;AACA;;AACA;;AACA;;AAKA;;AACA;;AAjBA;AACA;AACA;;AAGA;AACA;AACA;;AAMA;AACA;AACA;AAIA,MAAMA,IAAI,GAAG,MAAM,CAAE,CAArB;;AACA,MAAMC,WAAW,GAAG,iCAApB;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACe,SAASC,SAAT,CAAoBC,SAApB,EAA+BC,IAA/B,EAAsC;AACpD,QAAMC,kBAAkB,GAAG,eAAe,OAAOF,SAAjD,CADoD,CAGpD;AACA;AACA;;AACA,MAAK,CAAEE,kBAAP,EAA4B;AAC3BD,IAAAA,IAAI,GAAG,EAAP;AACA,GARmD,CAUpD;AACA;AACA;AACA;AACA;;;AACA,QAAME,cAAc,GAAG,0BACtBD,kBAAkB,GAAGF,SAAH,GAAeH,IADX,EAEtBI,IAFsB,CAAvB;;AAIA,QAAMG,UAAU,GAAGF,kBAAkB,GAAGC,cAAH,GAAoB,IAAzD;;AAEA,QAAME,QAAQ,GAAG,2BAAjB;AACA,QAAMC,OAAO,GAAG,4BAAhB,CAtBoD,CAuBpD;AACA;AACA;;AACA,QAAMC,YAAY,GAAG,4BAAY,OAAQ;AAAEC,IAAAA,KAAK,EAAE;AAAT,GAAR,CAAZ,EAAuC,CAAEH,QAAF,CAAvC,CAArB;AACA,QAAM,GAAII,WAAJ,IAAoB,yBAAcC,CAAF,IAASA,CAAC,GAAG,CAAzB,EAA4B,CAA5B,CAA1B;AAEA,QAAMC,cAAc,GAAG,qBAAQN,QAAR,CAAvB;AACA,QAAMO,eAAe,GAAG,sBAAxB;AACA,QAAMC,aAAa,GAAG,qBAAQP,OAAR,CAAtB;AACA,QAAMQ,eAAe,GAAG,sBAAxB;AACA,QAAMC,oBAAoB,GAAG,sBAA7B,CAjCoD,CAmCpD;AACA;;AACA,QAAMC,eAAe,GAAG,qBAAQ,EAAR,CAAxB;AACA,QAAMC,UAAU,GAAG,0BAChBC,QAAF,IACCb,QAAQ,CAACc,6BAAT,CACC,MAAMD,QAAQ,CAAEb,QAAQ,CAACe,MAAX,EAAmBf,QAAnB,CADf,EAECW,eAFD,CAFiB,EAMlB,CAAEX,QAAF,CANkB,CAAnB,CAtCoD,CA+CpD;AACA;AACA;;AACA,QAAMgB,eAAe,GAAG,sBAAS,OAAQ,EAAR,CAAT,EAAuBpB,IAAI,IAAI,EAA/B,CAAxB;AAEA,MAAIqB,SAAJ;;AAEA,MAAKlB,UAAL,EAAkB;AACjBkB,IAAAA,SAAS,GAAGR,eAAe,CAACS,OAA5B;AACA,UAAMC,mBAAmB,GAAGb,cAAc,CAACY,OAAf,KAA2BlB,QAAvD;AACA,UAAMoB,oBAAoB,GAAGb,eAAe,CAACW,OAAhB,KAA4BnB,UAAzD;AACA,UAAMsB,mBAAmB,GAAG,CAAC,CAAEX,oBAAoB,CAACQ,OAApD;;AAEA,QACCC,mBAAmB,IACnBC,oBADA,IAEAC,mBAHD,EAIE;AACD,UAAI;AACHJ,QAAAA,SAAS,GAAGL,UAAU,CAAEb,UAAF,CAAtB;AACA,OAFD,CAEE,OAAQuB,KAAR,EAAgB;AACjB,YAAIC,YAAY,GAAI,gDAAgDD,KAAK,CAACE,OAAS,EAAnF;;AAEA,YAAKd,oBAAoB,CAACQ,OAA1B,EAAoC;AACnCK,UAAAA,YAAY,IAAK,2DAAjB;AACAA,UAAAA,YAAY,IAAK,GAAGb,oBAAoB,CAACQ,OAArB,CAA6BO,KAAO,MAAxD;AACAF,UAAAA,YAAY,IAAI,uBAAhB;AACA,SAPgB,CASjB;;;AACAG,QAAAA,OAAO,CAACJ,KAAR,CAAeC,YAAf;AACA;AACD;AACD;;AAED,0CAA2B,MAAM;AAChC,QAAK,CAAE1B,kBAAP,EAA4B;AAC3B;AACA;;AAEDS,IAAAA,cAAc,CAACY,OAAf,GAAyBlB,QAAzB;AACAO,IAAAA,eAAe,CAACW,OAAhB,GAA0BnB,UAA1B;AACAU,IAAAA,eAAe,CAACS,OAAhB,GAA0BD,SAA1B;AACAP,IAAAA,oBAAoB,CAACQ,OAArB,GAA+BS,SAA/B,CARgC,CAUhC;AACA;AACA;AACA;;AACA,QAAKnB,aAAa,CAACU,OAAd,KAA0BjB,OAA/B,EAAyC;AACxCO,MAAAA,aAAa,CAACU,OAAd,GAAwBjB,OAAxB;AACAR,MAAAA,WAAW,CAACmC,KAAZ,CAAmB1B,YAAnB;AACA;AACD,GAlBD;AAoBA,0CAA2B,MAAM;AAChC,QAAK,CAAEL,kBAAP,EAA4B;AAC3B;AACA;;AAED,UAAMgC,aAAa,GAAG,MAAM;AAC3B,UAAI;AACH,cAAMC,YAAY,GAAGlB,UAAU,CAAEL,eAAe,CAACW,OAAlB,CAA/B;;AAEA,YAAK,6BAAgBT,eAAe,CAACS,OAAhC,EAAyCY,YAAzC,CAAL,EAA+D;AAC9D;AACA;;AACDrB,QAAAA,eAAe,CAACS,OAAhB,GAA0BY,YAA1B;AACA,OAPD,CAOE,OAAQR,KAAR,EAAgB;AACjBZ,QAAAA,oBAAoB,CAACQ,OAArB,GAA+BI,KAA/B;AACA;;AACDlB,MAAAA,WAAW;AACX,KAZD;;AAcA,UAAM2B,QAAQ,GAAG,MAAM;AACtB,UAAKvB,aAAa,CAACU,OAAnB,EAA6B;AAC5BzB,QAAAA,WAAW,CAACuC,GAAZ,CAAiB9B,YAAjB,EAA+B2B,aAA/B;AACA,OAFD,MAEO;AACNA,QAAAA,aAAa;AACb;AACD,KAND,CAnBgC,CA2BhC;AACA;;;AACAA,IAAAA,aAAa;AAEb,UAAMI,aAAa,GAAGtB,eAAe,CAACO,OAAhB,CAAwBgB,GAAxB,CAA+BC,SAAF,IAClDnC,QAAQ,CAACoC,wBAAT,CAAmCD,SAAnC,EAA8CJ,QAA9C,CADqB,CAAtB;AAIA,WAAO,MAAM;AACZ;AACAE,MAAAA,aAAa,CAACI,OAAd,CAAyBC,WAAF,IAAmBA,WAAnB,aAAmBA,WAAnB,uBAAmBA,WAAW,EAArD;AACA7C,MAAAA,WAAW,CAAC8C,MAAZ,CAAoBrC,YAApB;AACA,KAJD,CAnCgC,CAwChC;AACA;AACA;AACA,GA3CD,EA2CG,CAAEF,QAAF,EAAYY,UAAZ,EAAwBf,kBAAxB,EAA4CmB,eAA5C,CA3CH;AA6CA,SAAOnB,kBAAkB,GAAGoB,SAAH,GAAejB,QAAQ,CAACe,MAAT,CAAiBpB,SAAjB,CAAxC;AACA","sourcesContent":["/**\n * External dependencies\n */\nimport { useMemoOne } from 'use-memo-one';\n\n/**\n * WordPress dependencies\n */\nimport { createQueue } from '@wordpress/priority-queue';\nimport { useRef, useCallback, useMemo, useReducer } from '@wordpress/element';\nimport isShallowEqual from '@wordpress/is-shallow-equal';\nimport { useIsomorphicLayoutEffect } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport useRegistry from '../registry-provider/use-registry';\nimport useAsyncMode from '../async-mode-provider/use-async-mode';\n\nconst noop = () => {};\nconst renderQueue = createQueue();\n\n/** @typedef {import('../../types').StoreDescriptor} StoreDescriptor */\n\n/**\n * Custom react hook for retrieving props from registered selectors.\n *\n * In general, this custom React hook follows the\n * [rules of hooks](https://reactjs.org/docs/hooks-rules.html).\n *\n * @param {Function|StoreDescriptor|string} mapSelect Function called on every state change. The\n * returned value is exposed to the component\n * implementing this hook. The function receives\n * the `registry.select` method on the first\n * argument and the `registry` on the second\n * argument.\n * When a store key is passed, all selectors for\n * the store will be returned. This is only meant\n * for usage of these selectors in event\n * callbacks, not for data needed to create the\n * element tree.\n * @param {Array} deps If provided, this memoizes the mapSelect so the\n * same `mapSelect` is invoked on every state\n * change unless the dependencies change.\n *\n * @example\n * ```js\n * import { useSelect } from '@wordpress/data';\n *\n * function HammerPriceDisplay( { currency } ) {\n * const price = useSelect( ( select ) => {\n * return select( 'my-shop' ).getPrice( 'hammer', currency )\n * }, [ currency ] );\n * return new Intl.NumberFormat( 'en-US', {\n * style: 'currency',\n * currency,\n * } ).format( price );\n * }\n *\n * // Rendered in the application:\n * // <HammerPriceDisplay currency=\"USD\" />\n * ```\n *\n * In the above example, when `HammerPriceDisplay` is rendered into an\n * application, the price will be retrieved from the store state using the\n * `mapSelect` callback on `useSelect`. If the currency prop changes then\n * any price in the state for that currency is retrieved. If the currency prop\n * doesn't change and other props are passed in that do change, the price will\n * not change because the dependency is just the currency.\n *\n * When data is only used in an event callback, the data should not be retrieved\n * on render, so it may be useful to get the selectors function instead.\n *\n * **Don't use `useSelect` this way when calling the selectors in the render\n * function because your component won't re-render on a data change.**\n *\n * ```js\n * import { useSelect } from '@wordpress/data';\n *\n * function Paste( { children } ) {\n * const { getSettings } = useSelect( 'my-shop' );\n * function onPaste() {\n * // Do something with the settings.\n * const settings = getSettings();\n * }\n * return <div onPaste={ onPaste }>{ children }</div>;\n * }\n * ```\n *\n * @return {Function} A custom react hook.\n */\nexport default function useSelect( mapSelect, deps ) {\n\tconst hasMappingFunction = 'function' === typeof mapSelect;\n\n\t// If we're recalling a store by its name or by\n\t// its descriptor then we won't be caching the\n\t// calls to `mapSelect` because we won't be calling it.\n\tif ( ! hasMappingFunction ) {\n\t\tdeps = [];\n\t}\n\n\t// Because of the \"rule of hooks\" we have to call `useCallback`\n\t// on every invocation whether or not we have a real function\n\t// for `mapSelect`. we'll create this intermediate variable to\n\t// fulfill that need and then reference it with our \"real\"\n\t// `_mapSelect` if we can.\n\tconst callbackMapper = useCallback(\n\t\thasMappingFunction ? mapSelect : noop,\n\t\tdeps\n\t);\n\tconst _mapSelect = hasMappingFunction ? callbackMapper : null;\n\n\tconst registry = useRegistry();\n\tconst isAsync = useAsyncMode();\n\t// React can sometimes clear the `useMemo` cache.\n\t// We use the cache-stable `useMemoOne` to avoid\n\t// losing queues.\n\tconst queueContext = useMemoOne( () => ( { queue: true } ), [ registry ] );\n\tconst [ , forceRender ] = useReducer( ( s ) => s + 1, 0 );\n\n\tconst latestRegistry = useRef( registry );\n\tconst latestMapSelect = useRef();\n\tconst latestIsAsync = useRef( isAsync );\n\tconst latestMapOutput = useRef();\n\tconst latestMapOutputError = useRef();\n\n\t// Keep track of the stores being selected in the _mapSelect function,\n\t// and only subscribe to those stores later.\n\tconst listeningStores = useRef( [] );\n\tconst wrapSelect = useCallback(\n\t\t( callback ) =>\n\t\t\tregistry.__unstableMarkListeningStores(\n\t\t\t\t() => callback( registry.select, registry ),\n\t\t\t\tlisteningStores\n\t\t\t),\n\t\t[ registry ]\n\t);\n\n\t// Generate a \"flag\" for used in the effect dependency array.\n\t// It's different than just using `mapSelect` since deps could be undefined,\n\t// in that case, we would still want to memoize it.\n\tconst depsChangedFlag = useMemo( () => ( {} ), deps || [] );\n\n\tlet mapOutput;\n\n\tif ( _mapSelect ) {\n\t\tmapOutput = latestMapOutput.current;\n\t\tconst hasReplacedRegistry = latestRegistry.current !== registry;\n\t\tconst hasReplacedMapSelect = latestMapSelect.current !== _mapSelect;\n\t\tconst lastMapSelectFailed = !! latestMapOutputError.current;\n\n\t\tif (\n\t\t\thasReplacedRegistry ||\n\t\t\thasReplacedMapSelect ||\n\t\t\tlastMapSelectFailed\n\t\t) {\n\t\t\ttry {\n\t\t\t\tmapOutput = wrapSelect( _mapSelect );\n\t\t\t} catch ( error ) {\n\t\t\t\tlet errorMessage = `An error occurred while running 'mapSelect': ${ error.message }`;\n\n\t\t\t\tif ( latestMapOutputError.current ) {\n\t\t\t\t\terrorMessage += `\\nThe error may be correlated with this previous error:\\n`;\n\t\t\t\t\terrorMessage += `${ latestMapOutputError.current.stack }\\n\\n`;\n\t\t\t\t\terrorMessage += 'Original stack trace:';\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error( errorMessage );\n\t\t\t}\n\t\t}\n\t}\n\n\tuseIsomorphicLayoutEffect( () => {\n\t\tif ( ! hasMappingFunction ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlatestRegistry.current = registry;\n\t\tlatestMapSelect.current = _mapSelect;\n\t\tlatestMapOutput.current = mapOutput;\n\t\tlatestMapOutputError.current = undefined;\n\n\t\t// This has to run after the other ref updates\n\t\t// to avoid using stale values in the flushed\n\t\t// callbacks or potentially overwriting a\n\t\t// changed `latestMapOutput.current`.\n\t\tif ( latestIsAsync.current !== isAsync ) {\n\t\t\tlatestIsAsync.current = isAsync;\n\t\t\trenderQueue.flush( queueContext );\n\t\t}\n\t} );\n\n\tuseIsomorphicLayoutEffect( () => {\n\t\tif ( ! hasMappingFunction ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst onStoreChange = () => {\n\t\t\ttry {\n\t\t\t\tconst newMapOutput = wrapSelect( latestMapSelect.current );\n\n\t\t\t\tif ( isShallowEqual( latestMapOutput.current, newMapOutput ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tlatestMapOutput.current = newMapOutput;\n\t\t\t} catch ( error ) {\n\t\t\t\tlatestMapOutputError.current = error;\n\t\t\t}\n\t\t\tforceRender();\n\t\t};\n\n\t\tconst onChange = () => {\n\t\t\tif ( latestIsAsync.current ) {\n\t\t\t\trenderQueue.add( queueContext, onStoreChange );\n\t\t\t} else {\n\t\t\t\tonStoreChange();\n\t\t\t}\n\t\t};\n\n\t\t// Catch any possible state changes during mount before the subscription\n\t\t// could be set.\n\t\tonStoreChange();\n\n\t\tconst unsubscribers = listeningStores.current.map( ( storeName ) =>\n\t\t\tregistry.__unstableSubscribeStore( storeName, onChange )\n\t\t);\n\n\t\treturn () => {\n\t\t\t// The return value of the subscribe function could be undefined if the store is a custom generic store.\n\t\t\tunsubscribers.forEach( ( unsubscribe ) => unsubscribe?.() );\n\t\t\trenderQueue.cancel( queueContext );\n\t\t};\n\t\t// If you're tempted to eliminate the spread dependencies below don't do it!\n\t\t// We're passing these in from the calling function and want to make sure we're\n\t\t// examining every individual value inside the `deps` array.\n\t}, [ registry, wrapSelect, hasMappingFunction, depsChangedFlag ] );\n\n\treturn hasMappingFunction ? mapOutput : registry.select( mapSelect );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["@wordpress/data/src/components/use-select/index.js"],"names":["noop","renderQueue","useSelect","mapSelect","deps","hasMappingFunction","callbackMapper","_mapSelect","registry","isAsync","latestRegistry","latestMapSelect","latestIsAsync","latestMapOutput","latestMapOutputError","listeningStores","wrapSelect","callback","__unstableMarkListeningStores","select","depsChangedFlag","mapOutput","current","hasReplacedRegistry","hasReplacedMapSelect","hasLeftAsyncMode","lastMapSelectFailed","error","errorMessage","message","stack","console","undefined","queueContext","queue","forceRender","s","isMounted","onStoreChange","newMapOutput","onChange","add","unsubscribers","map","storeName","__unstableSubscribeStore","forEach","unsubscribe","cancel","useSuspenseSelect","suspendSelect","mapOutputError"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport { useMemoOne } from 'use-memo-one';\n\n/**\n * WordPress dependencies\n */\nimport { createQueue } from '@wordpress/priority-queue';\nimport { useRef, useCallback, useMemo, useReducer } from '@wordpress/element';\nimport isShallowEqual from '@wordpress/is-shallow-equal';\nimport { useIsomorphicLayoutEffect } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport useRegistry from '../registry-provider/use-registry';\nimport useAsyncMode from '../async-mode-provider/use-async-mode';\n\nconst noop = () => {};\nconst renderQueue = createQueue();\n\n/** @typedef {import('../../types').StoreDescriptor} StoreDescriptor */\n\n/**\n * Custom react hook for retrieving props from registered selectors.\n *\n * In general, this custom React hook follows the\n * [rules of hooks](https://reactjs.org/docs/hooks-rules.html).\n *\n * @param {Function|StoreDescriptor|string} mapSelect Function called on every state change. The\n * returned value is exposed to the component\n * implementing this hook. The function receives\n * the `registry.select` method on the first\n * argument and the `registry` on the second\n * argument.\n * When a store key is passed, all selectors for\n * the store will be returned. This is only meant\n * for usage of these selectors in event\n * callbacks, not for data needed to create the\n * element tree.\n * @param {Array} deps If provided, this memoizes the mapSelect so the\n * same `mapSelect` is invoked on every state\n * change unless the dependencies change.\n *\n * @example\n * ```js\n * import { useSelect } from '@wordpress/data';\n *\n * function HammerPriceDisplay( { currency } ) {\n * const price = useSelect( ( select ) => {\n * return select( 'my-shop' ).getPrice( 'hammer', currency )\n * }, [ currency ] );\n * return new Intl.NumberFormat( 'en-US', {\n * style: 'currency',\n * currency,\n * } ).format( price );\n * }\n *\n * // Rendered in the application:\n * // <HammerPriceDisplay currency=\"USD\" />\n * ```\n *\n * In the above example, when `HammerPriceDisplay` is rendered into an\n * application, the price will be retrieved from the store state using the\n * `mapSelect` callback on `useSelect`. If the currency prop changes then\n * any price in the state for that currency is retrieved. If the currency prop\n * doesn't change and other props are passed in that do change, the price will\n * not change because the dependency is just the currency.\n *\n * When data is only used in an event callback, the data should not be retrieved\n * on render, so it may be useful to get the selectors function instead.\n *\n * **Don't use `useSelect` this way when calling the selectors in the render\n * function because your component won't re-render on a data change.**\n *\n * ```js\n * import { useSelect } from '@wordpress/data';\n *\n * function Paste( { children } ) {\n * const { getSettings } = useSelect( 'my-shop' );\n * function onPaste() {\n * // Do something with the settings.\n * const settings = getSettings();\n * }\n * return <div onPaste={ onPaste }>{ children }</div>;\n * }\n * ```\n *\n * @return {Function} A custom react hook.\n */\nexport default function useSelect( mapSelect, deps ) {\n\tconst hasMappingFunction = 'function' === typeof mapSelect;\n\n\t// If we're recalling a store by its name or by\n\t// its descriptor then we won't be caching the\n\t// calls to `mapSelect` because we won't be calling it.\n\tif ( ! hasMappingFunction ) {\n\t\tdeps = [];\n\t}\n\n\t// Because of the \"rule of hooks\" we have to call `useCallback`\n\t// on every invocation whether or not we have a real function\n\t// for `mapSelect`. we'll create this intermediate variable to\n\t// fulfill that need and then reference it with our \"real\"\n\t// `_mapSelect` if we can.\n\tconst callbackMapper = useCallback(\n\t\thasMappingFunction ? mapSelect : noop,\n\t\tdeps\n\t);\n\tconst _mapSelect = hasMappingFunction ? callbackMapper : null;\n\n\tconst registry = useRegistry();\n\tconst isAsync = useAsyncMode();\n\n\tconst latestRegistry = useRef( registry );\n\tconst latestMapSelect = useRef();\n\tconst latestIsAsync = useRef( isAsync );\n\tconst latestMapOutput = useRef();\n\tconst latestMapOutputError = useRef();\n\n\t// Keep track of the stores being selected in the _mapSelect function,\n\t// and only subscribe to those stores later.\n\tconst listeningStores = useRef( [] );\n\tconst wrapSelect = useCallback(\n\t\t( callback ) =>\n\t\t\tregistry.__unstableMarkListeningStores(\n\t\t\t\t() => callback( registry.select, registry ),\n\t\t\t\tlisteningStores\n\t\t\t),\n\t\t[ registry ]\n\t);\n\n\t// Generate a \"flag\" for used in the effect dependency array.\n\t// It's different than just using `mapSelect` since deps could be undefined,\n\t// in that case, we would still want to memoize it.\n\tconst depsChangedFlag = useMemo( () => ( {} ), deps || [] );\n\n\tlet mapOutput;\n\n\tif ( _mapSelect ) {\n\t\tmapOutput = latestMapOutput.current;\n\t\tconst hasReplacedRegistry = latestRegistry.current !== registry;\n\t\tconst hasReplacedMapSelect = latestMapSelect.current !== _mapSelect;\n\t\tconst hasLeftAsyncMode = latestIsAsync.current && ! isAsync;\n\t\tconst lastMapSelectFailed = !! latestMapOutputError.current;\n\n\t\tif (\n\t\t\thasReplacedRegistry ||\n\t\t\thasReplacedMapSelect ||\n\t\t\thasLeftAsyncMode ||\n\t\t\tlastMapSelectFailed\n\t\t) {\n\t\t\ttry {\n\t\t\t\tmapOutput = wrapSelect( _mapSelect );\n\t\t\t} catch ( error ) {\n\t\t\t\tlet errorMessage = `An error occurred while running 'mapSelect': ${ error.message }`;\n\n\t\t\t\tif ( latestMapOutputError.current ) {\n\t\t\t\t\terrorMessage += `\\nThe error may be correlated with this previous error:\\n`;\n\t\t\t\t\terrorMessage += `${ latestMapOutputError.current.stack }\\n\\n`;\n\t\t\t\t\terrorMessage += 'Original stack trace:';\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error( errorMessage );\n\t\t\t}\n\t\t}\n\t}\n\n\tuseIsomorphicLayoutEffect( () => {\n\t\tif ( ! hasMappingFunction ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlatestRegistry.current = registry;\n\t\tlatestMapSelect.current = _mapSelect;\n\t\tlatestIsAsync.current = isAsync;\n\t\tlatestMapOutput.current = mapOutput;\n\t\tlatestMapOutputError.current = undefined;\n\t} );\n\n\t// React can sometimes clear the `useMemo` cache.\n\t// We use the cache-stable `useMemoOne` to avoid\n\t// losing queues.\n\tconst queueContext = useMemoOne( () => ( { queue: true } ), [ registry ] );\n\tconst [ , forceRender ] = useReducer( ( s ) => s + 1, 0 );\n\tconst isMounted = useRef( false );\n\n\tuseIsomorphicLayoutEffect( () => {\n\t\tif ( ! hasMappingFunction ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst onStoreChange = () => {\n\t\t\ttry {\n\t\t\t\tconst newMapOutput = wrapSelect( latestMapSelect.current );\n\n\t\t\t\tif ( isShallowEqual( latestMapOutput.current, newMapOutput ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tlatestMapOutput.current = newMapOutput;\n\t\t\t} catch ( error ) {\n\t\t\t\tlatestMapOutputError.current = error;\n\t\t\t}\n\t\t\tforceRender();\n\t\t};\n\n\t\tconst onChange = () => {\n\t\t\tif ( ! isMounted.current ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( latestIsAsync.current ) {\n\t\t\t\trenderQueue.add( queueContext, onStoreChange );\n\t\t\t} else {\n\t\t\t\tonStoreChange();\n\t\t\t}\n\t\t};\n\n\t\t// Catch any possible state changes during mount before the subscription\n\t\t// could be set.\n\t\tonStoreChange();\n\n\t\tconst unsubscribers = listeningStores.current.map( ( storeName ) =>\n\t\t\tregistry.__unstableSubscribeStore( storeName, onChange )\n\t\t);\n\n\t\tisMounted.current = true;\n\n\t\treturn () => {\n\t\t\t// The return value of the subscribe function could be undefined if the store is a custom generic store.\n\t\t\tunsubscribers.forEach( ( unsubscribe ) => unsubscribe?.() );\n\t\t\trenderQueue.cancel( queueContext );\n\t\t\tisMounted.current = false;\n\t\t};\n\t\t// If you're tempted to eliminate the spread dependencies below don't do it!\n\t\t// We're passing these in from the calling function and want to make sure we're\n\t\t// examining every individual value inside the `deps` array.\n\t}, [ registry, wrapSelect, hasMappingFunction, depsChangedFlag ] );\n\n\treturn hasMappingFunction ? mapOutput : registry.select( mapSelect );\n}\n\n/**\n * A variant of the `useSelect` hook that has the same API, but will throw a\n * suspense Promise if any of the called selectors is in an unresolved state.\n *\n * @param {Function} mapSelect Function called on every state change. The\n * returned value is exposed to the component\n * using this hook. The function receives the\n * `registry.suspendSelect` method as the first\n * argument and the `registry` as the second one.\n * @param {Array} deps A dependency array used to memoize the `mapSelect`\n * so that the same `mapSelect` is invoked on every\n * state change unless the dependencies change.\n *\n * @return {Object} Data object returned by the `mapSelect` function.\n */\nexport function useSuspenseSelect( mapSelect, deps ) {\n\tconst _mapSelect = useCallback( mapSelect, deps );\n\n\tconst registry = useRegistry();\n\tconst isAsync = useAsyncMode();\n\n\tconst latestRegistry = useRef( registry );\n\tconst latestMapSelect = useRef();\n\tconst latestIsAsync = useRef( isAsync );\n\tconst latestMapOutput = useRef();\n\tconst latestMapOutputError = useRef();\n\n\t// Keep track of the stores being selected in the `mapSelect` function,\n\t// and only subscribe to those stores later.\n\tconst listeningStores = useRef( [] );\n\tconst wrapSelect = useCallback(\n\t\t( callback ) =>\n\t\t\tregistry.__unstableMarkListeningStores(\n\t\t\t\t() => callback( registry.suspendSelect, registry ),\n\t\t\t\tlisteningStores\n\t\t\t),\n\t\t[ registry ]\n\t);\n\n\t// Generate a \"flag\" for used in the effect dependency array.\n\t// It's different than just using `mapSelect` since deps could be undefined,\n\t// in that case, we would still want to memoize it.\n\tconst depsChangedFlag = useMemo( () => ( {} ), deps || [] );\n\n\tlet mapOutput = latestMapOutput.current;\n\tlet mapOutputError = latestMapOutputError.current;\n\n\tconst hasReplacedRegistry = latestRegistry.current !== registry;\n\tconst hasReplacedMapSelect = latestMapSelect.current !== _mapSelect;\n\tconst hasLeftAsyncMode = latestIsAsync.current && ! isAsync;\n\n\tif ( hasReplacedRegistry || hasReplacedMapSelect || hasLeftAsyncMode ) {\n\t\ttry {\n\t\t\tmapOutput = wrapSelect( _mapSelect );\n\t\t} catch ( error ) {\n\t\t\tmapOutputError = error;\n\t\t}\n\t}\n\n\tuseIsomorphicLayoutEffect( () => {\n\t\tlatestRegistry.current = registry;\n\t\tlatestMapSelect.current = _mapSelect;\n\t\tlatestIsAsync.current = isAsync;\n\t\tlatestMapOutput.current = mapOutput;\n\t\tlatestMapOutputError.current = mapOutputError;\n\t} );\n\n\t// React can sometimes clear the `useMemo` cache.\n\t// We use the cache-stable `useMemoOne` to avoid\n\t// losing queues.\n\tconst queueContext = useMemoOne( () => ( { queue: true } ), [ registry ] );\n\tconst [ , forceRender ] = useReducer( ( s ) => s + 1, 0 );\n\tconst isMounted = useRef( false );\n\n\tuseIsomorphicLayoutEffect( () => {\n\t\tconst onStoreChange = () => {\n\t\t\ttry {\n\t\t\t\tconst newMapOutput = wrapSelect( latestMapSelect.current );\n\n\t\t\t\tif ( isShallowEqual( latestMapOutput.current, newMapOutput ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tlatestMapOutput.current = newMapOutput;\n\t\t\t} catch ( error ) {\n\t\t\t\tlatestMapOutputError.current = error;\n\t\t\t}\n\n\t\t\tforceRender();\n\t\t};\n\n\t\tconst onChange = () => {\n\t\t\tif ( ! isMounted.current ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( latestIsAsync.current ) {\n\t\t\t\trenderQueue.add( queueContext, onStoreChange );\n\t\t\t} else {\n\t\t\t\tonStoreChange();\n\t\t\t}\n\t\t};\n\n\t\t// catch any possible state changes during mount before the subscription\n\t\t// could be set.\n\t\tonStoreChange();\n\n\t\tconst unsubscribers = listeningStores.current.map( ( storeName ) =>\n\t\t\tregistry.__unstableSubscribeStore( storeName, onChange )\n\t\t);\n\n\t\tisMounted.current = true;\n\n\t\treturn () => {\n\t\t\t// The return value of the subscribe function could be undefined if the store is a custom generic store.\n\t\t\tunsubscribers.forEach( ( unsubscribe ) => unsubscribe?.() );\n\t\t\trenderQueue.cancel( queueContext );\n\t\t\tisMounted.current = false;\n\t\t};\n\t}, [ registry, wrapSelect, depsChangedFlag ] );\n\n\tif ( mapOutputError ) {\n\t\tthrow mapOutputError;\n\t}\n\n\treturn mapOutput;\n}\n"]}
|
package/build/index.js
CHANGED
|
@@ -59,7 +59,7 @@ Object.defineProperty(exports, "createRegistrySelector", {
|
|
|
59
59
|
return _factory.createRegistrySelector;
|
|
60
60
|
}
|
|
61
61
|
});
|
|
62
|
-
exports.use = exports.subscribe = exports.select = exports.resolveSelect = exports.registerStore = exports.registerGenericStore = exports.register = exports.plugins = exports.dispatch = void 0;
|
|
62
|
+
exports.use = exports.suspendSelect = exports.subscribe = exports.select = exports.resolveSelect = exports.registerStore = exports.registerGenericStore = exports.register = exports.plugins = exports.dispatch = void 0;
|
|
63
63
|
Object.defineProperty(exports, "useDispatch", {
|
|
64
64
|
enumerable: true,
|
|
65
65
|
get: function () {
|
|
@@ -78,6 +78,12 @@ Object.defineProperty(exports, "useSelect", {
|
|
|
78
78
|
return _useSelect.default;
|
|
79
79
|
}
|
|
80
80
|
});
|
|
81
|
+
Object.defineProperty(exports, "useSuspenseSelect", {
|
|
82
|
+
enumerable: true,
|
|
83
|
+
get: function () {
|
|
84
|
+
return _useSelect.useSuspenseSelect;
|
|
85
|
+
}
|
|
86
|
+
});
|
|
81
87
|
Object.defineProperty(exports, "withDispatch", {
|
|
82
88
|
enumerable: true,
|
|
83
89
|
get: function () {
|
|
@@ -113,7 +119,7 @@ var _withRegistry = _interopRequireDefault(require("./components/with-registry")
|
|
|
113
119
|
|
|
114
120
|
var _registryProvider = require("./components/registry-provider");
|
|
115
121
|
|
|
116
|
-
var _useSelect =
|
|
122
|
+
var _useSelect = _interopRequireWildcard(require("./components/use-select"));
|
|
117
123
|
|
|
118
124
|
var _useDispatch = require("./components/use-dispatch");
|
|
119
125
|
|
|
@@ -227,6 +233,19 @@ const select = _defaultRegistry.default.select;
|
|
|
227
233
|
|
|
228
234
|
exports.select = select;
|
|
229
235
|
const resolveSelect = _defaultRegistry.default.resolveSelect;
|
|
236
|
+
/**
|
|
237
|
+
* Given the name of a registered store, returns an object containing the store's
|
|
238
|
+
* selectors pre-bound to state so that you only need to supply additional arguments,
|
|
239
|
+
* and modified so that they throw promises in case the selector is not resolved yet.
|
|
240
|
+
*
|
|
241
|
+
* @param {string|StoreDescriptor} storeNameOrDescriptor Unique namespace identifier for the store
|
|
242
|
+
* or the store descriptor.
|
|
243
|
+
*
|
|
244
|
+
* @return {Object} Object containing the store's suspense-wrapped selectors.
|
|
245
|
+
*/
|
|
246
|
+
|
|
247
|
+
exports.resolveSelect = resolveSelect;
|
|
248
|
+
const suspendSelect = _defaultRegistry.default.suspendSelect;
|
|
230
249
|
/**
|
|
231
250
|
* Given the name of a registered store, returns an object of the store's action creators.
|
|
232
251
|
* Calling an action creator will cause it to be dispatched, updating the state value accordingly.
|
|
@@ -246,7 +265,7 @@ const resolveSelect = _defaultRegistry.default.resolveSelect;
|
|
|
246
265
|
* @return {Object} Object containing the action creators.
|
|
247
266
|
*/
|
|
248
267
|
|
|
249
|
-
exports.
|
|
268
|
+
exports.suspendSelect = suspendSelect;
|
|
250
269
|
const dispatch = _defaultRegistry.default.dispatch;
|
|
251
270
|
/**
|
|
252
271
|
* Given a listener function, the function will be called any time the state value
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["@wordpress/data/src/index.js"],"names":["select","defaultRegistry","resolveSelect","dispatch","subscribe","registerGenericStore","registerStore","use","register"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["@wordpress/data/src/index.js"],"names":["select","defaultRegistry","resolveSelect","suspendSelect","dispatch","subscribe","registerGenericStore","registerStore","use","register"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA;;AAKA;;AACA;;;;AAIA;;AACA;;AACA;;AACA;;AAKA;;AAIA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;AA9BA;AACA;AACA;;AAGA;AACA;AACA;;AAIA;;AAqBA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,MAAM,GAAGC,yBAAgBD,MAA/B;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACO,MAAME,aAAa,GAAGD,yBAAgBC,aAAtC;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACO,MAAMC,aAAa,GAAGF,yBAAgBE,aAAtC;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACO,MAAMC,QAAQ,GAAGH,yBAAgBG,QAAjC;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACO,MAAMC,SAAS,GAAGJ,yBAAgBI,SAAlC;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACO,MAAMC,oBAAoB,GAAGL,yBAAgBK,oBAA7C;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACO,MAAMC,aAAa,GAAGN,yBAAgBM,aAAtC;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;;;AACO,MAAMC,GAAG,GAAGP,yBAAgBO,GAA5B;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACO,MAAMC,QAAQ,GAAGR,yBAAgBQ,QAAjC","sourcesContent":["/**\n * External dependencies\n */\nimport combineReducers from 'turbo-combine-reducers';\n\n/**\n * Internal dependencies\n */\nimport defaultRegistry from './default-registry';\nimport * as plugins from './plugins';\n\n/** @typedef {import('./types').StoreDescriptor} StoreDescriptor */\n\nexport { default as withSelect } from './components/with-select';\nexport { default as withDispatch } from './components/with-dispatch';\nexport { default as withRegistry } from './components/with-registry';\nexport {\n\tRegistryProvider,\n\tRegistryConsumer,\n\tuseRegistry,\n} from './components/registry-provider';\nexport {\n\tdefault as useSelect,\n\tuseSuspenseSelect,\n} from './components/use-select';\nexport { useDispatch } from './components/use-dispatch';\nexport { AsyncModeProvider } from './components/async-mode-provider';\nexport { createRegistry } from './registry';\nexport { createRegistrySelector, createRegistryControl } from './factory';\nexport { controls } from './controls';\nexport { default as createReduxStore } from './redux-store';\n\n/**\n * Object of available plugins to use with a registry.\n *\n * @see [use](#use)\n *\n * @type {Object}\n */\nexport { plugins };\n\n/**\n * The combineReducers helper function turns an object whose values are different\n * reducing functions into a single reducing function you can pass to registerReducer.\n *\n * @param {Object} reducers An object whose values correspond to different reducing\n * functions that need to be combined into one.\n *\n * @example\n * ```js\n * import { combineReducers, createReduxStore, register } from '@wordpress/data';\n *\n * const prices = ( state = {}, action ) => {\n * \treturn action.type === 'SET_PRICE' ?\n * \t\t{\n * \t\t\t...state,\n * \t\t\t[ action.item ]: action.price,\n * \t\t} :\n * \t\tstate;\n * };\n *\n * const discountPercent = ( state = 0, action ) => {\n * \treturn action.type === 'START_SALE' ?\n * \t\taction.discountPercent :\n * \t\tstate;\n * };\n *\n * const store = createReduxStore( 'my-shop', {\n * \treducer: combineReducers( {\n * \t\tprices,\n * \t\tdiscountPercent,\n * \t} ),\n * } );\n * register( store );\n * ```\n *\n * @return {Function} A reducer that invokes every reducer inside the reducers\n * object, and constructs a state object with the same shape.\n */\nexport { combineReducers };\n\n/**\n * Given the name or descriptor of a registered store, returns an object of the store's selectors.\n * The selector functions are been pre-bound to pass the current state automatically.\n * As a consumer, you need only pass arguments of the selector, if applicable.\n *\n * @param {string|StoreDescriptor} storeNameOrDescriptor Unique namespace identifier for the store\n * or the store descriptor.\n *\n * @example\n * ```js\n * import { select } from '@wordpress/data';\n *\n * select( 'my-shop' ).getPrice( 'hammer' );\n * ```\n *\n * @return {Object} Object containing the store's selectors.\n */\nexport const select = defaultRegistry.select;\n\n/**\n * Given the name of a registered store, returns an object containing the store's\n * selectors pre-bound to state so that you only need to supply additional arguments,\n * and modified so that they return promises that resolve to their eventual values,\n * after any resolvers have ran.\n *\n * @param {string|StoreDescriptor} storeNameOrDescriptor Unique namespace identifier for the store\n * or the store descriptor.\n *\n * @example\n * ```js\n * import { resolveSelect } from '@wordpress/data';\n *\n * resolveSelect( 'my-shop' ).getPrice( 'hammer' ).then(console.log)\n * ```\n *\n * @return {Object} Object containing the store's promise-wrapped selectors.\n */\nexport const resolveSelect = defaultRegistry.resolveSelect;\n\n/**\n * Given the name of a registered store, returns an object containing the store's\n * selectors pre-bound to state so that you only need to supply additional arguments,\n * and modified so that they throw promises in case the selector is not resolved yet.\n *\n * @param {string|StoreDescriptor} storeNameOrDescriptor Unique namespace identifier for the store\n * or the store descriptor.\n *\n * @return {Object} Object containing the store's suspense-wrapped selectors.\n */\nexport const suspendSelect = defaultRegistry.suspendSelect;\n\n/**\n * Given the name of a registered store, returns an object of the store's action creators.\n * Calling an action creator will cause it to be dispatched, updating the state value accordingly.\n *\n * Note: Action creators returned by the dispatch will return a promise when\n * they are called.\n *\n * @param {string|StoreDescriptor} storeNameOrDescriptor Unique namespace identifier for the store\n * or the store descriptor.\n *\n * @example\n * ```js\n * import { dispatch } from '@wordpress/data';\n *\n * dispatch( 'my-shop' ).setPrice( 'hammer', 9.75 );\n * ```\n * @return {Object} Object containing the action creators.\n */\nexport const dispatch = defaultRegistry.dispatch;\n\n/**\n * Given a listener function, the function will be called any time the state value\n * of one of the registered stores has changed. This function returns a `unsubscribe`\n * function used to stop the subscription.\n *\n * @param {Function} listener Callback function.\n *\n * @example\n * ```js\n * import { subscribe } from '@wordpress/data';\n *\n * const unsubscribe = subscribe( () => {\n * \t// You could use this opportunity to test whether the derived result of a\n * \t// selector has subsequently changed as the result of a state update.\n * } );\n *\n * // Later, if necessary...\n * unsubscribe();\n * ```\n */\nexport const subscribe = defaultRegistry.subscribe;\n\n/**\n * Registers a generic store instance.\n *\n * @deprecated Use `register( storeDescriptor )` instead.\n *\n * @param {string} name Store registry name.\n * @param {Object} store Store instance (`{ getSelectors, getActions, subscribe }`).\n */\nexport const registerGenericStore = defaultRegistry.registerGenericStore;\n\n/**\n * Registers a standard `@wordpress/data` store.\n *\n * @deprecated Use `register` instead.\n *\n * @param {string} storeName Unique namespace identifier for the store.\n * @param {Object} options Store description (reducer, actions, selectors, resolvers).\n *\n * @return {Object} Registered store object.\n */\nexport const registerStore = defaultRegistry.registerStore;\n\n/**\n * Extends a registry to inherit functionality provided by a given plugin. A\n * plugin is an object with properties aligning to that of a registry, merged\n * to extend the default registry behavior.\n *\n * @param {Object} plugin Plugin object.\n */\nexport const use = defaultRegistry.use;\n\n/**\n * Registers a standard `@wordpress/data` store descriptor.\n *\n * @example\n * ```js\n * import { createReduxStore, register } from '@wordpress/data';\n *\n * const store = createReduxStore( 'demo', {\n * reducer: ( state = 'OK' ) => state,\n * selectors: {\n * getValue: ( state ) => state,\n * },\n * } );\n * register( store );\n * ```\n *\n * @param {StoreDescriptor} store Store descriptor.\n */\nexport const register = defaultRegistry.register;\n"]}
|