UNPKG

23.5 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, '__esModule', { value: true });
4
5var react = require('react');
6var jotai = require('jotai');
7
8function 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
88function _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
106function _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
115function _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
123function _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
144var hasInitialValue = function hasInitialValue(atom) {
145 return 'init' in atom;
146};
147
148var IS_EQUAL_PROMISE = Symbol();
149var INTERRUPT_PROMISE = Symbol();
150
151var isInterruptablePromise = function isInterruptablePromise(promise) {
152 return !!promise[INTERRUPT_PROMISE];
153};
154
155var 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
170var 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
201var getAtomState = function getAtomState(state, atom) {
202 return state.a.get(atom);
203};
204
205var 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
221var 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
247var 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
267var 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
293var 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
304var 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
317var scheduleReadAtomState = function scheduleReadAtomState(state, atom, promise) {
318 promise.finally(function () {
319 readAtomState(state, atom, true);
320 });
321};
322
323var 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
426var canUnmountAtom = function canUnmountAtom(atom, mounted) {
427 return !mounted.l.size && (!mounted.d.size || mounted.d.size === 1 && mounted.d.has(atom));
428};
429
430var 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
442var 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
530var 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
557var isActuallyWritableAtom = function isActuallyWritableAtom(atom) {
558 return !!atom.write;
559};
560
561var 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
594var 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
625var 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
660var 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
676var 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};
685var 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
700var TARGET = Symbol();
701var GET_VERSION = Symbol();
702var createMutableSource = function createMutableSource(target, getVersion) {
703 var _ref;
704
705 return _ref = {}, _ref[TARGET] = target, _ref[GET_VERSION] = getVersion, _ref;
706};
707
708var 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
721var 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
762typeof process === 'object' && process.env.NODE_ENV !== 'production' ? createStoreForDevelopment : createStoreForProduction;
763var isDevStore = function isDevStore(store) {
764 return store.length > 2;
765};
766
767var getDebugStateAndAtoms = function getDebugStateAndAtoms(_ref3) {
768 var atoms = _ref3.atoms,
769 state = _ref3.state;
770 return [state, atoms];
771};
772var 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
780function 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
807function 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
830exports.useAtomDevtools = useAtomDevtools;
831exports.useAtomsSnapshot = useAtomsSnapshot;
832exports.useGotoAtomsSnapshot = useGotoAtomsSnapshot;