UNPKG

3.74 kBJavaScriptView Raw
1(function (global, factory) {
2 typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react'), require('jotai/vanilla')) :
3 typeof define === 'function' && define.amd ? define(['exports', 'react', 'jotai/vanilla'], factory) :
4 (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.jotaiReact = {}, global.React, global.jotaiVanilla));
5})(this, (function (exports, ReactExports, vanilla) { 'use strict';
6
7 var StoreContext = ReactExports.createContext(undefined);
8 var useStore = function useStore(options) {
9 var store = ReactExports.useContext(StoreContext);
10 return (options == null ? void 0 : options.store) || store || vanilla.getDefaultStore();
11 };
12 var Provider = function Provider(_ref) {
13 var children = _ref.children,
14 store = _ref.store;
15 var storeRef = ReactExports.useRef();
16 if (!store && !storeRef.current) {
17 storeRef.current = vanilla.createStore();
18 }
19 return ReactExports.createElement(StoreContext.Provider, {
20 value: store || storeRef.current
21 }, children);
22 };
23
24 var isPromiseLike = function isPromiseLike(x) {
25 return typeof (x == null ? void 0 : x.then) === 'function';
26 };
27 var use = ReactExports.use || function (promise) {
28 if (promise.status === 'pending') {
29 throw promise;
30 } else if (promise.status === 'fulfilled') {
31 return promise.value;
32 } else if (promise.status === 'rejected') {
33 throw promise.reason;
34 } else {
35 promise.status = 'pending';
36 promise.then(function (v) {
37 promise.status = 'fulfilled';
38 promise.value = v;
39 }, function (e) {
40 promise.status = 'rejected';
41 promise.reason = e;
42 });
43 throw promise;
44 }
45 };
46 function useAtomValue(atom, options) {
47 var store = useStore(options);
48 var _useReducer = ReactExports.useReducer(function (prev) {
49 var nextValue = store.get(atom);
50 if (Object.is(prev[0], nextValue) && prev[1] === store && prev[2] === atom) {
51 return prev;
52 }
53 return [nextValue, store, atom];
54 }, undefined, function () {
55 return [store.get(atom), store, atom];
56 }),
57 _useReducer$ = _useReducer[0],
58 valueFromReducer = _useReducer$[0],
59 storeFromReducer = _useReducer$[1],
60 atomFromReducer = _useReducer$[2],
61 rerender = _useReducer[1];
62 var value = valueFromReducer;
63 if (storeFromReducer !== store || atomFromReducer !== atom) {
64 rerender();
65 value = store.get(atom);
66 }
67 var delay = options == null ? void 0 : options.delay;
68 ReactExports.useEffect(function () {
69 var unsub = store.sub(atom, function () {
70 if (typeof delay === 'number') {
71 setTimeout(rerender, delay);
72 return;
73 }
74 rerender();
75 });
76 rerender();
77 return unsub;
78 }, [store, atom, delay]);
79 ReactExports.useDebugValue(value);
80 return isPromiseLike(value) ? use(value) : value;
81 }
82
83 function useSetAtom(atom, options) {
84 var store = useStore(options);
85 var setAtom = ReactExports.useCallback(function () {
86 if (!('write' in atom)) {
87 throw new Error('not writable atom');
88 }
89 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
90 args[_key] = arguments[_key];
91 }
92 return store.set.apply(store, [atom].concat(args));
93 }, [store, atom]);
94 return setAtom;
95 }
96
97 function useAtom(atom, options) {
98 return [useAtomValue(atom, options), useSetAtom(atom, options)];
99 }
100
101 exports.Provider = Provider;
102 exports.useAtom = useAtom;
103 exports.useAtomValue = useAtomValue;
104 exports.useSetAtom = useSetAtom;
105 exports.useStore = useStore;
106
107}));