UNPKG

7.97 kBJavaScriptView Raw
1System.register(['@tanstack/query-core', 'jotai'], (function (exports) {
2 'use strict';
3 var QueryClient, QueryObserver, InfiniteQueryObserver, isCancelledError, atom;
4 return {
5 setters: [function (module) {
6 QueryClient = module.QueryClient;
7 QueryObserver = module.QueryObserver;
8 InfiniteQueryObserver = module.InfiniteQueryObserver;
9 isCancelledError = module.isCancelledError;
10 }, function (module) {
11 atom = module.atom;
12 }],
13 execute: (function () {
14
15 exports({
16 atomWithInfiniteQuery: atomWithInfiniteQuery,
17 atomWithQuery: atomWithQuery
18 });
19
20 const queryClientAtom = exports('queryClientAtom', atom(new QueryClient()));
21
22 function atomWithQuery(createQuery, getQueryClient = (get) => get(queryClientAtom)) {
23 const observerAtom = atom((get) => {
24 const queryClient = getQueryClient(get);
25 const defaultedOptions = queryClient.defaultQueryOptions();
26 const observer = new QueryObserver(queryClient, defaultedOptions);
27 return observer;
28 });
29 const queryDataAtom = atom(
30 (get) => {
31 const queryClient = getQueryClient(get);
32 const options = typeof createQuery === "function" ? createQuery(get) : createQuery;
33 const defaultedOptions = queryClient.defaultQueryOptions(options);
34 const observer = get(observerAtom);
35 observer.destroy();
36 observer.setOptions(defaultedOptions);
37 const initialResult = observer.getCurrentResult();
38 let resolve = null;
39 const resultAtom = atom(
40 initialResult.data === void 0 && options.enabled !== false ? new Promise((r) => {
41 resolve = r;
42 }) : initialResult
43 );
44 let setResult = null;
45 let unsubscribe = null;
46 const unsubIfNotMounted = () => {
47 if (!setResult) {
48 unsubscribe == null ? void 0 : unsubscribe();
49 unsubscribe = null;
50 }
51 };
52 const listener = (result) => {
53 if (result.isFetching || !result.isError && result.data === void 0) {
54 return;
55 }
56 if (resolve) {
57 setTimeout(unsubIfNotMounted, 1e3);
58 resolve(result);
59 resolve = null;
60 } else if (setResult) {
61 setResult(result);
62 } else {
63 throw new Error("setting result without mount");
64 }
65 };
66 if (options.enabled !== false) {
67 unsubscribe = observer.subscribe(listener);
68 }
69 resultAtom.onMount = (update) => {
70 setResult = update;
71 if (options.enabled !== false && !unsubscribe) {
72 unsubscribe = observer.subscribe(listener);
73 listener(observer.getCurrentResult());
74 }
75 return () => {
76 setResult = null;
77 unsubscribe == null ? void 0 : unsubscribe();
78 };
79 };
80 return { options, resultAtom, unsubIfNotMounted };
81 },
82 (get, set, action) => {
83 const observer = get(observerAtom);
84 const { options, resultAtom, unsubIfNotMounted } = get(queryDataAtom);
85 if (options.enabled === false) {
86 return;
87 }
88 switch (action.type) {
89 case "refetch": {
90 set(resultAtom, new Promise(() => {
91 }));
92 unsubIfNotMounted();
93 return observer.refetch({ cancelRefetch: true }).then((result) => {
94 set(resultAtom, result);
95 });
96 }
97 }
98 }
99 );
100 const queryAtom = atom(
101 (get) => {
102 const { resultAtom } = get(queryDataAtom);
103 const result = get(resultAtom);
104 if (result.isError) {
105 throw result.error;
106 }
107 return result.data;
108 },
109 (_get, set, action) => set(queryDataAtom, action)
110 );
111 return queryAtom;
112 }
113
114 function atomWithInfiniteQuery(createQuery, getQueryClient = (get) => get(queryClientAtom)) {
115 const queryDataAtom = atom(
116 (get) => {
117 const queryClient = getQueryClient(get);
118 const options = typeof createQuery === "function" ? createQuery(get) : createQuery;
119 const defaultedOptions = queryClient.defaultQueryOptions(options);
120 const observer = new InfiniteQueryObserver(queryClient, defaultedOptions);
121 const initialResult = observer.getCurrentResult();
122 let resolve = null;
123 const resultAtom = atom(
124 initialResult.data === void 0 && options.enabled !== false ? new Promise((r) => {
125 resolve = r;
126 }) : initialResult
127 );
128 let setResult = () => {
129 throw new Error("setting result without mount");
130 };
131 const state = {
132 isMounted: false,
133 unsubscribe: null
134 };
135 const listener = (result) => {
136 if (result.isFetching || !result.isError && result.data === void 0 || result.isError && isCancelledError(result.error)) {
137 return;
138 }
139 if (resolve) {
140 setTimeout(() => {
141 var _a;
142 if (!state.isMounted) {
143 (_a = state.unsubscribe) == null ? void 0 : _a.call(state);
144 state.unsubscribe = null;
145 }
146 }, 1e3);
147 resolve(result);
148 resolve = null;
149 } else {
150 setResult(result);
151 }
152 };
153 if (options.enabled !== false) {
154 state.unsubscribe = observer.subscribe(listener);
155 }
156 resultAtom.onMount = (update) => {
157 setResult = update;
158 state.isMounted = true;
159 if (options.enabled !== false && !state.unsubscribe) {
160 state.unsubscribe = observer.subscribe(listener);
161 listener(observer.getCurrentResult());
162 }
163 return () => {
164 var _a;
165 return (_a = state.unsubscribe) == null ? void 0 : _a.call(state);
166 };
167 };
168 return { options, resultAtom, observer, state };
169 },
170 (get, set, action) => {
171 var _a;
172 const { options, resultAtom, observer, state } = get(queryDataAtom);
173 if (options.enabled === false) {
174 return;
175 }
176 switch (action.type) {
177 case "refetch": {
178 set(resultAtom, new Promise(() => {
179 }));
180 if (!state.isMounted) {
181 (_a = state.unsubscribe) == null ? void 0 : _a.call(state);
182 state.unsubscribe = null;
183 }
184 observer.refetch(action.payload).then((result) => {
185 set(resultAtom, result);
186 });
187 return;
188 }
189 case "fetchPreviousPage": {
190 observer.fetchPreviousPage();
191 return;
192 }
193 case "fetchNextPage": {
194 observer.fetchNextPage();
195 return;
196 }
197 }
198 }
199 );
200 const queryAtom = atom(
201 (get) => {
202 const { resultAtom } = get(queryDataAtom);
203 const result = get(resultAtom);
204 if (result.isError) {
205 throw result.error;
206 }
207 return result.data;
208 },
209 (_get, set, action) => set(queryDataAtom, action)
210 );
211 return queryAtom;
212 }
213
214 })
215 };
216}));