UNPKG

8.11 kBJavaScriptView Raw
1(function (global, factory) {
2 typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react-query'), require('jotai')) :
3 typeof define === 'function' && define.amd ? define(['exports', 'react-query', 'jotai'], factory) :
4 (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.jotaiQuery = {}, global.reactQuery, global.jotai));
5})(this, (function (exports, reactQuery, jotai) { 'use strict';
6
7 var queryClientAtom = jotai.atom(new reactQuery.QueryClient());
8
9 function atomWithQuery(createQuery, getQueryClient) {
10 if (getQueryClient === void 0) {
11 getQueryClient = function getQueryClient(get) {
12 return get(queryClientAtom);
13 };
14 }
15
16 var queryDataAtom = jotai.atom(function (get) {
17 var queryClient = getQueryClient(get);
18 var options = typeof createQuery === 'function' ? createQuery(get) : createQuery;
19 var defaultedOptions = queryClient.defaultQueryOptions(options);
20 var observer = new reactQuery.QueryObserver(queryClient, defaultedOptions);
21 var initialResult = observer.getCurrentResult();
22 var resolve = null;
23 var resultAtom = jotai.atom(initialResult.data === undefined && options.enabled !== false ? new Promise(function (r) {
24 resolve = r;
25 }) : initialResult);
26
27 var setResult = function setResult() {
28 throw new Error('setting result without mount');
29 };
30
31 var state = {
32 isMounted: false,
33 unsubscribe: null
34 };
35
36 var listener = function listener(result) {
37 if (result.isFetching || !result.isError && result.data === undefined) {
38 return;
39 }
40
41 if (resolve) {
42 setTimeout(function () {
43 if (!state.isMounted) {
44 state.unsubscribe == null ? void 0 : state.unsubscribe();
45 state.unsubscribe = null;
46 }
47 }, 1000);
48 resolve(result);
49 resolve = null;
50 } else {
51 setResult(result);
52 }
53 };
54
55 if (options.enabled !== false) {
56 state.unsubscribe = observer.subscribe(listener);
57 }
58
59 resultAtom.onMount = function (update) {
60 setResult = update;
61 state.isMounted = true;
62
63 if (options.enabled !== false && !state.unsubscribe) {
64 state.unsubscribe = observer.subscribe(listener);
65 listener(observer.getCurrentResult());
66 }
67
68 return function () {
69 return state.unsubscribe == null ? void 0 : state.unsubscribe();
70 };
71 };
72
73 return {
74 options: options,
75 resultAtom: resultAtom,
76 observer: observer,
77 state: state
78 };
79 }, function (get, set, action) {
80 var _get2 = get(queryDataAtom),
81 options = _get2.options,
82 resultAtom = _get2.resultAtom,
83 observer = _get2.observer,
84 state = _get2.state;
85
86 if (options.enabled === false) {
87 return;
88 }
89
90 switch (action.type) {
91 case 'refetch':
92 {
93 set(resultAtom, new Promise(function () {}));
94
95 if (!state.isMounted) {
96 state.unsubscribe == null ? void 0 : state.unsubscribe();
97 state.unsubscribe = null;
98 }
99
100 return observer.refetch({
101 cancelRefetch: true
102 }).then(function (result) {
103 set(resultAtom, result);
104 });
105 }
106 }
107 });
108 var queryAtom = jotai.atom(function (get) {
109 var _get3 = get(queryDataAtom),
110 resultAtom = _get3.resultAtom;
111
112 var result = get(resultAtom);
113
114 if (result.isError) {
115 throw result.error;
116 }
117
118 return result.data;
119 }, function (_get, set, action) {
120 return set(queryDataAtom, action);
121 });
122 return queryAtom;
123 }
124
125 function _objectWithoutPropertiesLoose(source, excluded) {
126 if (source == null) return {};
127 var target = {};
128 var sourceKeys = Object.keys(source);
129 var key, i;
130
131 for (i = 0; i < sourceKeys.length; i++) {
132 key = sourceKeys[i];
133 if (excluded.indexOf(key) >= 0) continue;
134 target[key] = source[key];
135 }
136
137 return target;
138 }
139
140 var _excluded = ["type"];
141 function atomWithInfiniteQuery(createQuery, getQueryClient) {
142 if (getQueryClient === void 0) {
143 getQueryClient = function getQueryClient(get) {
144 return get(queryClientAtom);
145 };
146 }
147
148 var queryDataAtom = jotai.atom(function (get) {
149 var queryClient = getQueryClient(get);
150 var options = typeof createQuery === 'function' ? createQuery(get) : createQuery;
151 var defaultedOptions = queryClient.defaultQueryOptions(options);
152 var observer = new reactQuery.InfiniteQueryObserver(queryClient, defaultedOptions);
153 var initialResult = observer.getCurrentResult();
154 var resolve = null;
155 var resultAtom = jotai.atom(initialResult.data === undefined && options.enabled !== false ? new Promise(function (r) {
156 resolve = r;
157 }) : initialResult);
158
159 var setResult = function setResult() {
160 throw new Error('setting result without mount');
161 };
162
163 var state = {
164 isMounted: false,
165 unsubscribe: null
166 };
167
168 var listener = function listener(result) {
169 if (result.isFetching || !result.isError && result.data === undefined || result.isError && reactQuery.isCancelledError(result.error)) {
170 return;
171 }
172
173 if (resolve) {
174 setTimeout(function () {
175 if (!state.isMounted) {
176 state.unsubscribe == null ? void 0 : state.unsubscribe();
177 state.unsubscribe = null;
178 }
179 }, 1000);
180 resolve(result);
181 resolve = null;
182 } else {
183 setResult(result);
184 }
185 };
186
187 if (options.enabled !== false) {
188 state.unsubscribe = observer.subscribe(listener);
189 }
190
191 resultAtom.onMount = function (update) {
192 setResult = update;
193 state.isMounted = true;
194
195 if (options.enabled !== false && !state.unsubscribe) {
196 state.unsubscribe = observer.subscribe(listener);
197 listener(observer.getCurrentResult());
198 }
199
200 return function () {
201 return state.unsubscribe == null ? void 0 : state.unsubscribe();
202 };
203 };
204
205 return {
206 options: options,
207 resultAtom: resultAtom,
208 observer: observer,
209 state: state
210 };
211 }, function (get, set, action) {
212 var _get2 = get(queryDataAtom),
213 options = _get2.options,
214 resultAtom = _get2.resultAtom,
215 observer = _get2.observer,
216 state = _get2.state;
217
218 if (options.enabled === false) {
219 return;
220 }
221
222 switch (action.type) {
223 case 'refetch':
224 {
225 set(resultAtom, new Promise(function () {}));
226
227 if (!state.isMounted) {
228 state.unsubscribe == null ? void 0 : state.unsubscribe();
229 state.unsubscribe = null;
230 }
231
232 action.type;
233 var rest = _objectWithoutPropertiesLoose(action, _excluded);
234
235 observer.refetch(rest).then(function (result) {
236 set(resultAtom, result);
237 });
238 return;
239 }
240
241 case 'fetchPreviousPage':
242 {
243 observer.fetchPreviousPage();
244 return;
245 }
246
247 case 'fetchNextPage':
248 {
249 observer.fetchNextPage();
250 return;
251 }
252 }
253 });
254 var queryAtom = jotai.atom(function (get) {
255 var _get3 = get(queryDataAtom),
256 resultAtom = _get3.resultAtom;
257
258 var result = get(resultAtom);
259
260 if (result.isError) {
261 throw result.error;
262 }
263
264 return result.data;
265 }, function (_get, set, action) {
266 return set(queryDataAtom, action);
267 });
268 return queryAtom;
269 }
270
271 exports.atomWithInfiniteQuery = atomWithInfiniteQuery;
272 exports.atomWithQuery = atomWithQuery;
273 exports.queryClientAtom = queryClientAtom;
274
275 Object.defineProperty(exports, '__esModule', { value: true });
276
277}));