UNPKG

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