UNPKG

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