UNPKG

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