UNPKG

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