1 | 'use strict';
|
2 |
|
3 | Object.defineProperty(exports, '__esModule', { value: true });
|
4 |
|
5 | var react = require('react');
|
6 | var jotai = require('jotai');
|
7 |
|
8 | function useAtomDevtools(anAtom, name) {
|
9 | var extension;
|
10 |
|
11 | try {
|
12 | extension = window.__REDUX_DEVTOOLS_EXTENSION__;
|
13 | } catch (_unused) {}
|
14 |
|
15 | if (!extension) {
|
16 | if (typeof process === 'object' && process.env.NODE_ENV === 'development' && typeof window !== 'undefined') {
|
17 | console.warn('Please install/enable Redux devtools extension');
|
18 | }
|
19 | }
|
20 |
|
21 | var _useAtom = jotai.useAtom(anAtom),
|
22 | value = _useAtom[0],
|
23 | setValue = _useAtom[1];
|
24 |
|
25 | var lastValue = react.useRef(value);
|
26 | var isTimeTraveling = react.useRef(false);
|
27 | var devtools = react.useRef();
|
28 | var atomName = name || anAtom.debugLabel || anAtom.toString();
|
29 | react.useEffect(function () {
|
30 | if (extension) {
|
31 | devtools.current = extension.connect({
|
32 | name: atomName
|
33 | });
|
34 | var unsubscribe = devtools.current.subscribe(function (message) {
|
35 | var _message$payload3, _message$payload4;
|
36 |
|
37 | if (message.type === 'DISPATCH' && message.state) {
|
38 | var _message$payload, _message$payload2;
|
39 |
|
40 | if (((_message$payload = message.payload) == null ? void 0 : _message$payload.type) === 'JUMP_TO_ACTION' || ((_message$payload2 = message.payload) == null ? void 0 : _message$payload2.type) === 'JUMP_TO_STATE') {
|
41 | isTimeTraveling.current = true;
|
42 | }
|
43 |
|
44 | setValue(JSON.parse(message.state));
|
45 | } else if (message.type === 'DISPATCH' && ((_message$payload3 = message.payload) == null ? void 0 : _message$payload3.type) === 'COMMIT') {
|
46 | var _devtools$current;
|
47 |
|
48 | (_devtools$current = devtools.current) == null ? void 0 : _devtools$current.init(lastValue.current);
|
49 | } else if (message.type === 'DISPATCH' && ((_message$payload4 = message.payload) == null ? void 0 : _message$payload4.type) === 'IMPORT_STATE') {
|
50 | var _message$payload$next, _message$payload$next2;
|
51 |
|
52 | var actions = (_message$payload$next = message.payload.nextLiftedState) == null ? void 0 : _message$payload$next.actionsById;
|
53 | var computedStates = ((_message$payload$next2 = message.payload.nextLiftedState) == null ? void 0 : _message$payload$next2.computedStates) || [];
|
54 | computedStates.forEach(function (_ref, index) {
|
55 | var state = _ref.state;
|
56 | actions[index] || atomName;
|
57 |
|
58 | if (index === 0) {
|
59 | var _devtools$current2;
|
60 |
|
61 | (_devtools$current2 = devtools.current) == null ? void 0 : _devtools$current2.init(state);
|
62 | } else {
|
63 | setValue(state);
|
64 | }
|
65 | });
|
66 | }
|
67 | });
|
68 | devtools.current.shouldInit = true;
|
69 | return unsubscribe;
|
70 | }
|
71 | }, [anAtom, extension, atomName, setValue]);
|
72 | react.useEffect(function () {
|
73 | if (devtools.current) {
|
74 | lastValue.current = value;
|
75 |
|
76 | if (devtools.current.shouldInit) {
|
77 | devtools.current.init(value);
|
78 | devtools.current.shouldInit = false;
|
79 | } else if (isTimeTraveling.current) {
|
80 | isTimeTraveling.current = false;
|
81 | } else {
|
82 | devtools.current.send(atomName + " - " + new Date().toLocaleString(), value);
|
83 | }
|
84 | }
|
85 | }, [anAtom, extension, atomName, value]);
|
86 | }
|
87 |
|
88 | function _extends() {
|
89 | _extends = Object.assign || function (target) {
|
90 | for (var i = 1; i < arguments.length; i++) {
|
91 | var source = arguments[i];
|
92 |
|
93 | for (var key in source) {
|
94 | if (Object.prototype.hasOwnProperty.call(source, key)) {
|
95 | target[key] = source[key];
|
96 | }
|
97 | }
|
98 | }
|
99 |
|
100 | return target;
|
101 | };
|
102 |
|
103 | return _extends.apply(this, arguments);
|
104 | }
|
105 |
|
106 | function _unsupportedIterableToArray(o, minLen) {
|
107 | if (!o) return;
|
108 | if (typeof o === "string") return _arrayLikeToArray(o, minLen);
|
109 | var n = Object.prototype.toString.call(o).slice(8, -1);
|
110 | if (n === "Object" && o.constructor) n = o.constructor.name;
|
111 | if (n === "Map" || n === "Set") return Array.from(o);
|
112 | if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
|
113 | }
|
114 |
|
115 | function _arrayLikeToArray(arr, len) {
|
116 | if (len == null || len > arr.length) len = arr.length;
|
117 |
|
118 | for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
|
119 |
|
120 | return arr2;
|
121 | }
|
122 |
|
123 | function _createForOfIteratorHelperLoose(o, allowArrayLike) {
|
124 | var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
|
125 | if (it) return (it = it.call(o)).next.bind(it);
|
126 |
|
127 | if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
|
128 | if (it) o = it;
|
129 | var i = 0;
|
130 | return function () {
|
131 | if (i >= o.length) return {
|
132 | done: true
|
133 | };
|
134 | return {
|
135 | done: false,
|
136 | value: o[i++]
|
137 | };
|
138 | };
|
139 | }
|
140 |
|
141 | throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
142 | }
|
143 |
|
144 | var hasInitialValue = function hasInitialValue(atom) {
|
145 | return 'init' in atom;
|
146 | };
|
147 |
|
148 | var IS_EQUAL_PROMISE = Symbol();
|
149 | var INTERRUPT_PROMISE = Symbol();
|
150 |
|
151 | var isInterruptablePromise = function isInterruptablePromise(promise) {
|
152 | return !!promise[INTERRUPT_PROMISE];
|
153 | };
|
154 |
|
155 | var createInterruptablePromise = function createInterruptablePromise(promise) {
|
156 | var interrupt;
|
157 | var interruptablePromise = new Promise(function (resolve, reject) {
|
158 | interrupt = resolve;
|
159 | promise.then(resolve, reject);
|
160 | });
|
161 |
|
162 | interruptablePromise[IS_EQUAL_PROMISE] = function (p) {
|
163 | return p === interruptablePromise || p === promise;
|
164 | };
|
165 |
|
166 | interruptablePromise[INTERRUPT_PROMISE] = interrupt;
|
167 | return interruptablePromise;
|
168 | };
|
169 |
|
170 | var createState = function createState(initialValues, stateListener) {
|
171 | var state = {
|
172 | l: stateListener,
|
173 | v: 0,
|
174 | a: new WeakMap(),
|
175 | m: new WeakMap(),
|
176 | p: new Set()
|
177 | };
|
178 |
|
179 | if (initialValues) {
|
180 | for (var _iterator = _createForOfIteratorHelperLoose(initialValues), _step; !(_step = _iterator()).done;) {
|
181 | var _step$value = _step.value,
|
182 | atom = _step$value[0],
|
183 | value = _step$value[1];
|
184 | var atomState = {
|
185 | v: value,
|
186 | r: 0,
|
187 | d: new Map()
|
188 | };
|
189 |
|
190 | if (typeof process === 'object' && process.env.NODE_ENV !== 'production') {
|
191 | Object.freeze(atomState);
|
192 | }
|
193 |
|
194 | state.a.set(atom, atomState);
|
195 | }
|
196 | }
|
197 |
|
198 | return state;
|
199 | };
|
200 |
|
201 | var getAtomState = function getAtomState(state, atom) {
|
202 | return state.a.get(atom);
|
203 | };
|
204 |
|
205 | var wipAtomState = function wipAtomState(state, atom, dependencies) {
|
206 | var atomState = getAtomState(state, atom);
|
207 |
|
208 | var nextAtomState = _extends({
|
209 | r: 0
|
210 | }, atomState, {
|
211 | d: dependencies ? new Map(Array.from(dependencies).map(function (a) {
|
212 | var _getAtomState$r, _getAtomState;
|
213 |
|
214 | return [a, (_getAtomState$r = (_getAtomState = getAtomState(state, a)) == null ? void 0 : _getAtomState.r) != null ? _getAtomState$r : 0];
|
215 | })) : atomState ? atomState.d : new Map()
|
216 | });
|
217 |
|
218 | return [nextAtomState, atomState == null ? void 0 : atomState.d];
|
219 | };
|
220 |
|
221 | var setAtomValue = function setAtomValue(state, atom, value, dependencies, promise) {
|
222 | var _atomState$p;
|
223 |
|
224 | var _wipAtomState = wipAtomState(state, atom, dependencies),
|
225 | atomState = _wipAtomState[0],
|
226 | prevDependencies = _wipAtomState[1];
|
227 |
|
228 | if (promise && !((_atomState$p = atomState.p) != null && _atomState$p[IS_EQUAL_PROMISE](promise))) {
|
229 | return;
|
230 | }
|
231 |
|
232 | atomState.c == null ? void 0 : atomState.c();
|
233 | delete atomState.e;
|
234 | delete atomState.p;
|
235 | delete atomState.c;
|
236 | delete atomState.i;
|
237 |
|
238 | if (!('v' in atomState) || !Object.is(atomState.v, value)) {
|
239 | atomState.v = value;
|
240 | ++atomState.r;
|
241 | }
|
242 |
|
243 | commitAtomState(state, atom, atomState);
|
244 | mountDependencies(state, atom, atomState, prevDependencies);
|
245 | };
|
246 |
|
247 | var setAtomReadError = function setAtomReadError(state, atom, error, dependencies, promise) {
|
248 | var _atomState$p2;
|
249 |
|
250 | var _wipAtomState2 = wipAtomState(state, atom, dependencies),
|
251 | atomState = _wipAtomState2[0],
|
252 | prevDependencies = _wipAtomState2[1];
|
253 |
|
254 | if (promise && !((_atomState$p2 = atomState.p) != null && _atomState$p2[IS_EQUAL_PROMISE](promise))) {
|
255 | return;
|
256 | }
|
257 |
|
258 | atomState.c == null ? void 0 : atomState.c();
|
259 | delete atomState.p;
|
260 | delete atomState.c;
|
261 | delete atomState.i;
|
262 | atomState.e = error;
|
263 | commitAtomState(state, atom, atomState);
|
264 | mountDependencies(state, atom, atomState, prevDependencies);
|
265 | };
|
266 |
|
267 | var setAtomReadPromise = function setAtomReadPromise(state, atom, promise, dependencies) {
|
268 | var _atomState$p3;
|
269 |
|
270 | var _wipAtomState3 = wipAtomState(state, atom, dependencies),
|
271 | atomState = _wipAtomState3[0],
|
272 | prevDependencies = _wipAtomState3[1];
|
273 |
|
274 | if ((_atomState$p3 = atomState.p) != null && _atomState$p3[IS_EQUAL_PROMISE](promise)) {
|
275 | return;
|
276 | }
|
277 |
|
278 | atomState.c == null ? void 0 : atomState.c();
|
279 |
|
280 | if (isInterruptablePromise(promise)) {
|
281 | atomState.p = promise;
|
282 | delete atomState.c;
|
283 | } else {
|
284 | var interruptablePromise = createInterruptablePromise(promise);
|
285 | atomState.p = interruptablePromise;
|
286 | atomState.c = interruptablePromise[INTERRUPT_PROMISE];
|
287 | }
|
288 |
|
289 | commitAtomState(state, atom, atomState);
|
290 | mountDependencies(state, atom, atomState, prevDependencies);
|
291 | };
|
292 |
|
293 | var setAtomInvalidated = function setAtomInvalidated(state, atom) {
|
294 | var _wipAtomState4 = wipAtomState(state, atom),
|
295 | atomState = _wipAtomState4[0];
|
296 |
|
297 | atomState.c == null ? void 0 : atomState.c();
|
298 | delete atomState.p;
|
299 | delete atomState.c;
|
300 | atomState.i = atomState.r;
|
301 | commitAtomState(state, atom, atomState);
|
302 | };
|
303 |
|
304 | var setAtomWritePromise = function setAtomWritePromise(state, atom, promise) {
|
305 | var _wipAtomState5 = wipAtomState(state, atom),
|
306 | atomState = _wipAtomState5[0];
|
307 |
|
308 | if (promise) {
|
309 | atomState.w = promise;
|
310 | } else {
|
311 | delete atomState.w;
|
312 | }
|
313 |
|
314 | commitAtomState(state, atom, atomState);
|
315 | };
|
316 |
|
317 | var scheduleReadAtomState = function scheduleReadAtomState(state, atom, promise) {
|
318 | promise.finally(function () {
|
319 | readAtomState(state, atom, true);
|
320 | });
|
321 | };
|
322 |
|
323 | var readAtomState = function readAtomState(state, atom, force) {
|
324 | if (!force) {
|
325 | var atomState = getAtomState(state, atom);
|
326 |
|
327 | if (atomState) {
|
328 | atomState.d.forEach(function (_, a) {
|
329 | if (a !== atom) {
|
330 | var aState = getAtomState(state, a);
|
331 |
|
332 | if (aState && !aState.e && !aState.p && aState.r === aState.i) {
|
333 | readAtomState(state, a, true);
|
334 | }
|
335 | }
|
336 | });
|
337 |
|
338 | if (Array.from(atomState.d.entries()).every(function (_ref) {
|
339 | var a = _ref[0],
|
340 | r = _ref[1];
|
341 | var aState = getAtomState(state, a);
|
342 | return aState && !aState.e && !aState.p && aState.r !== aState.i && aState.r === r;
|
343 | })) {
|
344 | return atomState;
|
345 | }
|
346 | }
|
347 | }
|
348 |
|
349 | var error;
|
350 | var promise;
|
351 | var value;
|
352 | var dependencies = new Set();
|
353 |
|
354 | try {
|
355 | var promiseOrValue = atom.read(function (a) {
|
356 | dependencies.add(a);
|
357 |
|
358 | if (a !== atom) {
|
359 | var _aState = readAtomState(state, a);
|
360 |
|
361 | if (_aState.e) {
|
362 | throw _aState.e;
|
363 | }
|
364 |
|
365 | if (_aState.p) {
|
366 | throw _aState.p;
|
367 | }
|
368 |
|
369 | return _aState.v;
|
370 | }
|
371 |
|
372 | var aState = getAtomState(state, a);
|
373 |
|
374 | if (aState) {
|
375 | if (aState.p) {
|
376 | throw aState.p;
|
377 | }
|
378 |
|
379 | return aState.v;
|
380 | }
|
381 |
|
382 | if (hasInitialValue(a)) {
|
383 | return a.init;
|
384 | }
|
385 |
|
386 | throw new Error('no atom init');
|
387 | });
|
388 |
|
389 | if (promiseOrValue instanceof Promise) {
|
390 | promise = promiseOrValue.then(function (value) {
|
391 | setAtomValue(state, atom, value, dependencies, promise);
|
392 | flushPending(state);
|
393 | }).catch(function (e) {
|
394 | if (e instanceof Promise) {
|
395 | scheduleReadAtomState(state, atom, e);
|
396 | return e;
|
397 | }
|
398 |
|
399 | setAtomReadError(state, atom, e instanceof Error ? e : new Error(e), dependencies, promise);
|
400 | flushPending(state);
|
401 | });
|
402 | } else {
|
403 | value = promiseOrValue;
|
404 | }
|
405 | } catch (errorOrPromise) {
|
406 | if (errorOrPromise instanceof Promise) {
|
407 | promise = errorOrPromise;
|
408 | } else if (errorOrPromise instanceof Error) {
|
409 | error = errorOrPromise;
|
410 | } else {
|
411 | error = new Error(errorOrPromise);
|
412 | }
|
413 | }
|
414 |
|
415 | if (error) {
|
416 | setAtomReadError(state, atom, error, dependencies);
|
417 | } else if (promise) {
|
418 | setAtomReadPromise(state, atom, promise, dependencies);
|
419 | } else {
|
420 | setAtomValue(state, atom, value, dependencies);
|
421 | }
|
422 |
|
423 | return getAtomState(state, atom);
|
424 | };
|
425 |
|
426 | var canUnmountAtom = function canUnmountAtom(atom, mounted) {
|
427 | return !mounted.l.size && (!mounted.d.size || mounted.d.size === 1 && mounted.d.has(atom));
|
428 | };
|
429 |
|
430 | var invalidateDependents = function invalidateDependents(state, atom) {
|
431 | var mounted = state.m.get(atom);
|
432 | mounted == null ? void 0 : mounted.d.forEach(function (dependent) {
|
433 | if (dependent === atom) {
|
434 | return;
|
435 | }
|
436 |
|
437 | setAtomInvalidated(state, dependent);
|
438 | invalidateDependents(state, dependent);
|
439 | });
|
440 | };
|
441 |
|
442 | var writeAtomState = function writeAtomState(state, atom, update, pendingPromises) {
|
443 | var isPendingPromisesExpired = !pendingPromises.length;
|
444 | var atomState = getAtomState(state, atom);
|
445 |
|
446 | if (atomState && atomState.w) {
|
447 | var promise = atomState.w.then(function () {
|
448 | writeAtomState(state, atom, update, pendingPromises);
|
449 |
|
450 | if (isPendingPromisesExpired) {
|
451 | flushPending(state);
|
452 | }
|
453 | });
|
454 |
|
455 | if (!isPendingPromisesExpired) {
|
456 | pendingPromises.push(promise);
|
457 | }
|
458 |
|
459 | return;
|
460 | }
|
461 |
|
462 | try {
|
463 | var promiseOrVoid = atom.write(function (a) {
|
464 | var aState = readAtomState(state, a);
|
465 |
|
466 | if (aState.e) {
|
467 | throw aState.e;
|
468 | }
|
469 |
|
470 | if (aState.p) {
|
471 | if (typeof process === 'object' && process.env.NODE_ENV !== 'production') {
|
472 | console.warn('Reading pending atom state in write operation. We throw a promise for now.', a);
|
473 | }
|
474 |
|
475 | throw aState.p;
|
476 | }
|
477 |
|
478 | if ('v' in aState) {
|
479 | return aState.v;
|
480 | }
|
481 |
|
482 | if (typeof process === 'object' && process.env.NODE_ENV !== 'production') {
|
483 | console.warn('[Bug] no value found while reading atom in write operation. This probably a bug.', a);
|
484 | }
|
485 |
|
486 | throw new Error('no value found');
|
487 | }, function (a, v) {
|
488 | var isPendingPromisesExpired = !pendingPromises.length;
|
489 |
|
490 | if (a === atom) {
|
491 | setAtomValue(state, a, v);
|
492 | invalidateDependents(state, a);
|
493 | } else {
|
494 | writeAtomState(state, a, v, pendingPromises);
|
495 | }
|
496 |
|
497 | if (isPendingPromisesExpired) {
|
498 | flushPending(state);
|
499 | }
|
500 | }, update);
|
501 |
|
502 | if (promiseOrVoid instanceof Promise) {
|
503 | var _promise = promiseOrVoid.finally(function () {
|
504 | setAtomWritePromise(state, atom);
|
505 |
|
506 | if (isPendingPromisesExpired) {
|
507 | flushPending(state);
|
508 | }
|
509 | });
|
510 |
|
511 | if (!isPendingPromisesExpired) {
|
512 | pendingPromises.push(_promise);
|
513 | }
|
514 |
|
515 | setAtomWritePromise(state, atom, _promise);
|
516 | }
|
517 | } catch (e) {
|
518 | if (pendingPromises.length === 1) {
|
519 | throw e;
|
520 | } else if (!isPendingPromisesExpired) {
|
521 | pendingPromises.push(new Promise(function (_resolve, reject) {
|
522 | reject(e);
|
523 | }));
|
524 | } else {
|
525 | console.error('Uncaught exception: Use promise to catch error', e);
|
526 | }
|
527 | }
|
528 | };
|
529 |
|
530 | var writeAtom = function writeAtom(state, writingAtom, update) {
|
531 | var pendingPromises = [Promise.resolve()];
|
532 | writeAtomState(state, writingAtom, update, pendingPromises);
|
533 | flushPending(state);
|
534 |
|
535 | if (pendingPromises.length <= 1) {
|
536 | pendingPromises.splice(0);
|
537 | } else {
|
538 | return new Promise(function (resolve, reject) {
|
539 | var loop = function loop() {
|
540 | if (pendingPromises.length <= 1) {
|
541 | pendingPromises.splice(0);
|
542 | resolve();
|
543 | } else {
|
544 | Promise.all(pendingPromises).then(function () {
|
545 | pendingPromises.splice(1);
|
546 | flushPending(state);
|
547 | loop();
|
548 | }).catch(reject);
|
549 | }
|
550 | };
|
551 |
|
552 | loop();
|
553 | });
|
554 | }
|
555 | };
|
556 |
|
557 | var isActuallyWritableAtom = function isActuallyWritableAtom(atom) {
|
558 | return !!atom.write;
|
559 | };
|
560 |
|
561 | var mountAtom = function mountAtom(state, atom, initialDependent) {
|
562 | var atomState = getAtomState(state, atom);
|
563 |
|
564 | if (atomState) {
|
565 | atomState.d.forEach(function (_, a) {
|
566 | if (a !== atom) {
|
567 | if (!state.m.has(a)) {
|
568 | mountAtom(state, a, atom);
|
569 | }
|
570 | }
|
571 | });
|
572 | } else if (typeof process === 'object' && process.env.NODE_ENV !== 'production') {
|
573 | console.warn('[Bug] could not find atom state to mount', atom);
|
574 | }
|
575 |
|
576 | var mounted = {
|
577 | d: new Set(initialDependent && [initialDependent]),
|
578 | l: new Set(),
|
579 | u: undefined
|
580 | };
|
581 | state.m.set(atom, mounted);
|
582 |
|
583 | if (isActuallyWritableAtom(atom) && atom.onMount) {
|
584 | var setAtom = function setAtom(update) {
|
585 | return writeAtom(state, atom, update);
|
586 | };
|
587 |
|
588 | mounted.u = atom.onMount(setAtom);
|
589 | }
|
590 |
|
591 | return mounted;
|
592 | };
|
593 |
|
594 | var unmountAtom = function unmountAtom(state, atom) {
|
595 | var _state$m$get;
|
596 |
|
597 | var onUnmount = (_state$m$get = state.m.get(atom)) == null ? void 0 : _state$m$get.u;
|
598 |
|
599 | if (onUnmount) {
|
600 | onUnmount();
|
601 | }
|
602 |
|
603 | state.m.delete(atom);
|
604 | var atomState = getAtomState(state, atom);
|
605 |
|
606 | if (atomState) {
|
607 | atomState.d.forEach(function (_, a) {
|
608 | if (a !== atom) {
|
609 | var mounted = state.m.get(a);
|
610 |
|
611 | if (mounted) {
|
612 | mounted.d.delete(atom);
|
613 |
|
614 | if (canUnmountAtom(a, mounted)) {
|
615 | unmountAtom(state, a);
|
616 | }
|
617 | }
|
618 | }
|
619 | });
|
620 | } else if (typeof process === 'object' && process.env.NODE_ENV !== 'production') {
|
621 | console.warn('[Bug] could not find atom state to unmount', atom);
|
622 | }
|
623 | };
|
624 |
|
625 | var mountDependencies = function mountDependencies(state, atom, atomState, prevDependencies) {
|
626 | if (prevDependencies !== atomState.d) {
|
627 | var dependencies = new Set(atomState.d.keys());
|
628 |
|
629 | if (prevDependencies) {
|
630 | prevDependencies.forEach(function (_, a) {
|
631 | var mounted = state.m.get(a);
|
632 |
|
633 | if (dependencies.has(a)) {
|
634 | dependencies.delete(a);
|
635 | } else if (mounted) {
|
636 | mounted.d.delete(atom);
|
637 |
|
638 | if (canUnmountAtom(a, mounted)) {
|
639 | unmountAtom(state, a);
|
640 | }
|
641 | } else if (typeof process === 'object' && process.env.NODE_ENV !== 'production') {
|
642 | console.warn('[Bug] a dependency is not mounted', a);
|
643 | }
|
644 | });
|
645 | }
|
646 |
|
647 | dependencies.forEach(function (a) {
|
648 | var mounted = state.m.get(a);
|
649 |
|
650 | if (mounted) {
|
651 | var dependents = mounted.d;
|
652 | dependents.add(atom);
|
653 | } else {
|
654 | mountAtom(state, a, atom);
|
655 | }
|
656 | });
|
657 | }
|
658 | };
|
659 |
|
660 | var commitAtomState = function commitAtomState(state, atom, atomState) {
|
661 | if (typeof process === 'object' && process.env.NODE_ENV !== 'production') {
|
662 | Object.freeze(atomState);
|
663 | }
|
664 |
|
665 | var isNewAtom = !state.a.has(atom);
|
666 | state.a.set(atom, atomState);
|
667 |
|
668 | if (state.l) {
|
669 | state.l(atom, isNewAtom);
|
670 | }
|
671 |
|
672 | ++state.v;
|
673 | state.p.add(atom);
|
674 | };
|
675 |
|
676 | var flushPending = function flushPending(state) {
|
677 | state.p.forEach(function (atom) {
|
678 | var mounted = state.m.get(atom);
|
679 | mounted == null ? void 0 : mounted.l.forEach(function (listener) {
|
680 | return listener();
|
681 | });
|
682 | });
|
683 | state.p.clear();
|
684 | };
|
685 | var restoreAtoms = function restoreAtoms(state, values) {
|
686 | for (var _iterator2 = _createForOfIteratorHelperLoose(values), _step2; !(_step2 = _iterator2()).done;) {
|
687 | var _step2$value = _step2.value,
|
688 | atom = _step2$value[0],
|
689 | value = _step2$value[1];
|
690 |
|
691 | if (hasInitialValue(atom)) {
|
692 | setAtomValue(state, atom, value);
|
693 | invalidateDependents(state, atom);
|
694 | }
|
695 | }
|
696 |
|
697 | flushPending(state);
|
698 | };
|
699 |
|
700 | var TARGET = Symbol();
|
701 | var GET_VERSION = Symbol();
|
702 | var createMutableSource = function createMutableSource(target, getVersion) {
|
703 | var _ref;
|
704 |
|
705 | return _ref = {}, _ref[TARGET] = target, _ref[GET_VERSION] = getVersion, _ref;
|
706 | };
|
707 |
|
708 | var createStoreForProduction = function createStoreForProduction(initialValues) {
|
709 | var state = createState(initialValues);
|
710 | var stateMutableSource = createMutableSource(state, function () {
|
711 | return state.v;
|
712 | });
|
713 |
|
714 | var updateAtom = function updateAtom(atom, update) {
|
715 | return writeAtom(state, atom, update);
|
716 | };
|
717 |
|
718 | return [stateMutableSource, updateAtom];
|
719 | };
|
720 |
|
721 | var createStoreForDevelopment = function createStoreForDevelopment(initialValues) {
|
722 | var stateListener = function stateListener(updatedAtom, isNewAtom) {
|
723 | ++debugStore.version;
|
724 |
|
725 | if (isNewAtom) {
|
726 | debugStore.atoms = [].concat(debugStore.atoms, [updatedAtom]);
|
727 | }
|
728 |
|
729 | Promise.resolve().then(function () {
|
730 | debugStore.listeners.forEach(function (listener) {
|
731 | return listener();
|
732 | });
|
733 | });
|
734 | };
|
735 |
|
736 | var state = createState(initialValues, stateListener);
|
737 | var stateMutableSource = createMutableSource(state, function () {
|
738 | return state.v;
|
739 | });
|
740 |
|
741 | var updateAtom = function updateAtom(atom, update) {
|
742 | return writeAtom(state, atom, update);
|
743 | };
|
744 |
|
745 | var debugStore = {
|
746 | version: 0,
|
747 | atoms: [],
|
748 | state: state,
|
749 | listeners: new Set()
|
750 | };
|
751 | var debugMutableSource = createMutableSource(debugStore, function () {
|
752 | return debugStore.version;
|
753 | });
|
754 |
|
755 | var restore = function restore(values) {
|
756 | return restoreAtoms(state, values);
|
757 | };
|
758 |
|
759 | return [stateMutableSource, updateAtom, debugMutableSource, restore];
|
760 | };
|
761 |
|
762 | typeof process === 'object' && process.env.NODE_ENV !== 'production' ? createStoreForDevelopment : createStoreForProduction;
|
763 | var isDevStore = function isDevStore(store) {
|
764 | return store.length > 2;
|
765 | };
|
766 |
|
767 | var getDebugStateAndAtoms = function getDebugStateAndAtoms(_ref3) {
|
768 | var atoms = _ref3.atoms,
|
769 | state = _ref3.state;
|
770 | return [state, atoms];
|
771 | };
|
772 | var subscribeDebugStore = function subscribeDebugStore(_ref4, callback) {
|
773 | var listeners = _ref4.listeners;
|
774 | listeners.add(callback);
|
775 | return function () {
|
776 | return listeners.delete(callback);
|
777 | };
|
778 | };
|
779 |
|
780 | function useAtomsSnapshot(scope) {
|
781 | var StoreContext = jotai.SECRET_INTERNAL_getStoreContext(scope);
|
782 |
|
783 | var _useContext = react.useContext(StoreContext),
|
784 | debugMutableSource = _useContext[2];
|
785 |
|
786 | if (debugMutableSource === undefined) {
|
787 | throw Error('useAtomsSnapshot can only be used in dev mode.');
|
788 | }
|
789 |
|
790 | var _useMutableSource = jotai.SECRET_INTERNAL_useMutableSource(debugMutableSource, getDebugStateAndAtoms, subscribeDebugStore),
|
791 | state = _useMutableSource[0],
|
792 | atoms = _useMutableSource[1];
|
793 |
|
794 | return react.useMemo(function () {
|
795 | var atomToAtomValueTuples = atoms.filter(function (atom) {
|
796 | return !!state.m.get(atom);
|
797 | }).map(function (atom) {
|
798 | var _state$a$get;
|
799 |
|
800 | var atomState = (_state$a$get = state.a.get(atom)) != null ? _state$a$get : {};
|
801 | return [atom, atomState.e || atomState.p || atomState.w || atomState.v];
|
802 | });
|
803 | return new Map(atomToAtomValueTuples);
|
804 | }, [atoms, state]);
|
805 | }
|
806 |
|
807 | function useGotoAtomsSnapshot(scope) {
|
808 | var StoreContext = jotai.SECRET_INTERNAL_getStoreContext(scope);
|
809 | var store = react.useContext(StoreContext);
|
810 |
|
811 | if (!isDevStore(store)) {
|
812 | throw new Error('useGotoAtomsSnapshot can only be used in dev mode.');
|
813 | }
|
814 |
|
815 | var restore = store[3];
|
816 | return react.useCallback(function (values) {
|
817 | for (var _iterator = _createForOfIteratorHelperLoose(values), _step; !(_step = _iterator()).done;) {
|
818 | var _step$value = _step.value,
|
819 | atom = _step$value[0];
|
820 |
|
821 | if (atom.scope !== scope) {
|
822 | throw new Error('atom scope mismatch to restore');
|
823 | }
|
824 | }
|
825 |
|
826 | restore(values);
|
827 | }, [restore, scope]);
|
828 | }
|
829 |
|
830 | exports.useAtomDevtools = useAtomDevtools;
|
831 | exports.useAtomsSnapshot = useAtomsSnapshot;
|
832 | exports.useGotoAtomsSnapshot = useGotoAtomsSnapshot;
|