UNPKG

4.1 kBJavaScriptView Raw
1'use client';
2System.register(['react', 'jotai/vanilla'], (function (exports) {
3 'use strict';
4 var createContext, useContext, useRef, createElement, ReactExports, useReducer, useEffect, useDebugValue, useCallback, getDefaultStore, createStore;
5 return {
6 setters: [function (module) {
7 createContext = module.createContext;
8 useContext = module.useContext;
9 useRef = module.useRef;
10 createElement = module.createElement;
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 createElement(
42 StoreContext.Provider,
43 {
44 value: store || storeRef.current
45 },
46 children
47 );
48 });
49
50 const isPromiseLike = (x) => typeof (x == null ? void 0 : x.then) === "function";
51 const use = ReactExports.use || ((promise) => {
52 if (promise.status === "pending") {
53 throw promise;
54 } else if (promise.status === "fulfilled") {
55 return promise.value;
56 } else if (promise.status === "rejected") {
57 throw promise.reason;
58 } else {
59 promise.status = "pending";
60 promise.then(
61 (v) => {
62 promise.status = "fulfilled";
63 promise.value = v;
64 },
65 (e) => {
66 promise.status = "rejected";
67 promise.reason = e;
68 }
69 );
70 throw promise;
71 }
72 });
73 function useAtomValue(atom, options) {
74 const store = useStore(options);
75 const [[valueFromReducer, storeFromReducer, atomFromReducer], rerender] = useReducer(
76 (prev) => {
77 const nextValue = store.get(atom);
78 if (Object.is(prev[0], nextValue) && prev[1] === store && prev[2] === atom) {
79 return prev;
80 }
81 return [nextValue, store, atom];
82 },
83 void 0,
84 () => [store.get(atom), store, atom]
85 );
86 let value = valueFromReducer;
87 if (storeFromReducer !== store || atomFromReducer !== atom) {
88 rerender();
89 value = store.get(atom);
90 }
91 const delay = options == null ? void 0 : options.delay;
92 useEffect(() => {
93 const unsub = store.sub(atom, () => {
94 if (typeof delay === "number") {
95 setTimeout(rerender, delay);
96 return;
97 }
98 rerender();
99 });
100 rerender();
101 return unsub;
102 }, [store, atom, delay]);
103 useDebugValue(value);
104 return isPromiseLike(value) ? use(value) : value;
105 }
106
107 function useSetAtom(atom, options) {
108 const store = useStore(options);
109 const setAtom = useCallback(
110 (...args) => {
111 if (!("write" in atom)) {
112 throw new Error("not writable atom");
113 }
114 return store.set(atom, ...args);
115 },
116 [store, atom]
117 );
118 return setAtom;
119 }
120
121 function useAtom(atom, options) {
122 return [
123 useAtomValue(atom, options),
124 // We do wrong type assertion here, which results in throwing an error.
125 useSetAtom(atom, options)
126 ];
127 }
128
129 })
130 };
131}));