UNPKG

3.93 kBJavaScriptView Raw
1System.register(['react/jsx-runtime', 'react', 'jotai/vanilla'], (function (exports) {
2 'use strict';
3 var jsx, createContext, useContext, useRef, ReactExports, useReducer, useEffect, useDebugValue, useCallback, getDefaultStore, createStore;
4 return {
5 setters: [function (module) {
6 jsx = module.jsx;
7 }, function (module) {
8 createContext = module.createContext;
9 useContext = module.useContext;
10 useRef = module.useRef;
11 ReactExports = module.default;
12 useReducer = module.useReducer;
13 useEffect = module.useEffect;
14 useDebugValue = module.useDebugValue;
15 useCallback = module.useCallback;
16 }, function (module) {
17 getDefaultStore = module.getDefaultStore;
18 createStore = module.createStore;
19 }],
20 execute: (function () {
21
22 exports({
23 useAtom: useAtom,
24 useAtomValue: useAtomValue,
25 useSetAtom: useSetAtom
26 });
27
28 const StoreContext = createContext(void 0);
29 const useStore = exports('useStore', (options) => {
30 const store = useContext(StoreContext);
31 return (options == null ? void 0 : options.store) || store || getDefaultStore();
32 });
33 const Provider = exports('Provider', ({
34 children,
35 store
36 }) => {
37 const storeRef = useRef();
38 if (!store && !storeRef.current) {
39 storeRef.current = createStore();
40 }
41 return /* @__PURE__ */ jsx(StoreContext.Provider, { value: store || storeRef.current, children });
42 });
43
44 const isPromise = (x) => x instanceof Promise;
45 const use = ReactExports.use || ((promise) => {
46 if (promise.status === "pending") {
47 throw promise;
48 } else if (promise.status === "fulfilled") {
49 return promise.value;
50 } else if (promise.status === "rejected") {
51 throw promise.reason;
52 } else {
53 promise.status = "pending";
54 promise.then(
55 (v) => {
56 promise.status = "fulfilled";
57 promise.value = v;
58 },
59 (e) => {
60 promise.status = "rejected";
61 promise.reason = e;
62 }
63 );
64 throw promise;
65 }
66 });
67 function useAtomValue(atom, options) {
68 const store = useStore(options);
69 const [[valueFromReducer, storeFromReducer, atomFromReducer], rerender] = useReducer(
70 (prev) => {
71 const nextValue = store.get(atom);
72 if (Object.is(prev[0], nextValue) && prev[1] === store && prev[2] === atom) {
73 return prev;
74 }
75 return [nextValue, store, atom];
76 },
77 void 0,
78 () => [store.get(atom), store, atom]
79 );
80 let value = valueFromReducer;
81 if (storeFromReducer !== store || atomFromReducer !== atom) {
82 rerender();
83 value = store.get(atom);
84 }
85 const delay = options == null ? void 0 : options.delay;
86 useEffect(() => {
87 const unsub = store.sub(atom, () => {
88 if (typeof delay === "number") {
89 setTimeout(rerender, delay);
90 return;
91 }
92 rerender();
93 });
94 rerender();
95 return unsub;
96 }, [store, atom, delay]);
97 useDebugValue(value);
98 return isPromise(value) ? use(value) : value;
99 }
100
101 function useSetAtom(atom, options) {
102 const store = useStore(options);
103 const setAtom = useCallback(
104 (...args) => {
105 if (!("write" in atom)) {
106 throw new Error("not writable atom");
107 }
108 return store.set(atom, ...args);
109 },
110 [store, atom]
111 );
112 return setAtom;
113 }
114
115 function useAtom(atom, options) {
116 return [
117 useAtomValue(atom, options),
118 useSetAtom(atom, options)
119 ];
120 }
121
122 })
123 };
124}));