UNPKG

7.77 kBJavaScriptView Raw
1(function (global, factory) {
2 typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@tanstack/query-core'), require('jotai')) :
3 typeof define === 'function' && define.amd ? define(['exports', '@tanstack/query-core', 'jotai'], factory) :
4 (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.jotaiQuery = {}, global.queryCore, global.jotai));
5})(this, (function (exports, queryCore, jotai) { 'use strict';
6
7 var queryClientAtom = jotai.atom(new queryCore.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 observerAtom = jotai.atom(function (get) {
17 var queryClient = getQueryClient(get);
18 var defaultedOptions = queryClient.defaultQueryOptions();
19 var observer = new queryCore.QueryObserver(queryClient, defaultedOptions);
20 return observer;
21 });
22 var queryDataAtom = jotai.atom(function (get) {
23 var queryClient = getQueryClient(get);
24 var options = typeof createQuery === 'function' ? createQuery(get) : createQuery;
25 var defaultedOptions = queryClient.defaultQueryOptions(options);
26 var observer = get(observerAtom);
27 observer.destroy();
28 observer.setOptions(defaultedOptions);
29 var initialResult = observer.getCurrentResult();
30 var resolve = null;
31 var resultAtom = jotai.atom(initialResult.data === undefined && options.enabled !== false ? new Promise(function (r) {
32 resolve = r;
33 }) : initialResult);
34 var setResult = null;
35 var unsubscribe = null;
36
37 var unsubIfNotMounted = function unsubIfNotMounted() {
38 if (!setResult) {
39 unsubscribe == null ? void 0 : unsubscribe();
40 unsubscribe = null;
41 }
42 };
43
44 var listener = function listener(result) {
45 if (result.isFetching || !result.isError && result.data === undefined) {
46 return;
47 }
48
49 if (resolve) {
50 setTimeout(unsubIfNotMounted, 1000);
51 resolve(result);
52 resolve = null;
53 } else if (setResult) {
54 setResult(result);
55 } else {
56 throw new Error('setting result without mount');
57 }
58 };
59
60 if (options.enabled !== false) {
61 unsubscribe = observer.subscribe(listener);
62 }
63
64 resultAtom.onMount = function (update) {
65 setResult = update;
66
67 if (options.enabled !== false && !unsubscribe) {
68 unsubscribe = observer.subscribe(listener);
69 listener(observer.getCurrentResult());
70 }
71
72 return function () {
73 setResult = null;
74 unsubscribe == null ? void 0 : unsubscribe();
75 };
76 };
77
78 return {
79 options: options,
80 resultAtom: resultAtom,
81 unsubIfNotMounted: unsubIfNotMounted
82 };
83 }, function (get, set, action) {
84 var observer = get(observerAtom);
85
86 var _get2 = get(queryDataAtom),
87 options = _get2.options,
88 resultAtom = _get2.resultAtom,
89 unsubIfNotMounted = _get2.unsubIfNotMounted;
90
91 if (options.enabled === false) {
92 return;
93 }
94
95 switch (action.type) {
96 case 'refetch':
97 {
98 set(resultAtom, new Promise(function () {}));
99 unsubIfNotMounted();
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 atomWithInfiniteQuery(createQuery, getQueryClient) {
126 if (getQueryClient === void 0) {
127 getQueryClient = function getQueryClient(get) {
128 return get(queryClientAtom);
129 };
130 }
131
132 var queryDataAtom = jotai.atom(function (get) {
133 var queryClient = getQueryClient(get);
134 var options = typeof createQuery === 'function' ? createQuery(get) : createQuery;
135 var defaultedOptions = queryClient.defaultQueryOptions(options);
136 var observer = new queryCore.InfiniteQueryObserver(queryClient, defaultedOptions);
137 var initialResult = observer.getCurrentResult();
138 var resolve = null;
139 var resultAtom = jotai.atom(initialResult.data === undefined && options.enabled !== false ? new Promise(function (r) {
140 resolve = r;
141 }) : initialResult);
142
143 var setResult = function setResult() {
144 throw new Error('setting result without mount');
145 };
146
147 var state = {
148 isMounted: false,
149 unsubscribe: null
150 };
151
152 var listener = function listener(result) {
153 if (result.isFetching || !result.isError && result.data === undefined || result.isError && queryCore.isCancelledError(result.error)) {
154 return;
155 }
156
157 if (resolve) {
158 setTimeout(function () {
159 if (!state.isMounted) {
160 state.unsubscribe == null ? void 0 : state.unsubscribe();
161 state.unsubscribe = null;
162 }
163 }, 1000);
164 resolve(result);
165 resolve = null;
166 } else {
167 setResult(result);
168 }
169 };
170
171 if (options.enabled !== false) {
172 state.unsubscribe = observer.subscribe(listener);
173 }
174
175 resultAtom.onMount = function (update) {
176 setResult = update;
177 state.isMounted = true;
178
179 if (options.enabled !== false && !state.unsubscribe) {
180 state.unsubscribe = observer.subscribe(listener);
181 listener(observer.getCurrentResult());
182 }
183
184 return function () {
185 return state.unsubscribe == null ? void 0 : state.unsubscribe();
186 };
187 };
188
189 return {
190 options: options,
191 resultAtom: resultAtom,
192 observer: observer,
193 state: state
194 };
195 }, function (get, set, action) {
196 var _get2 = get(queryDataAtom),
197 options = _get2.options,
198 resultAtom = _get2.resultAtom,
199 observer = _get2.observer,
200 state = _get2.state;
201
202 if (options.enabled === false) {
203 return;
204 }
205
206 switch (action.type) {
207 case 'refetch':
208 {
209 set(resultAtom, new Promise(function () {}));
210
211 if (!state.isMounted) {
212 state.unsubscribe == null ? void 0 : state.unsubscribe();
213 state.unsubscribe = null;
214 }
215
216 observer.refetch(action.payload).then(function (result) {
217 set(resultAtom, result);
218 });
219 return;
220 }
221
222 case 'fetchPreviousPage':
223 {
224 observer.fetchPreviousPage();
225 return;
226 }
227
228 case 'fetchNextPage':
229 {
230 observer.fetchNextPage();
231 return;
232 }
233 }
234 });
235 var queryAtom = jotai.atom(function (get) {
236 var _get3 = get(queryDataAtom),
237 resultAtom = _get3.resultAtom;
238
239 var result = get(resultAtom);
240
241 if (result.isError) {
242 throw result.error;
243 }
244
245 return result.data;
246 }, function (_get, set, action) {
247 return set(queryDataAtom, action);
248 });
249 return queryAtom;
250 }
251
252 exports.atomWithInfiniteQuery = atomWithInfiniteQuery;
253 exports.atomWithQuery = atomWithQuery;
254 exports.queryClientAtom = queryClientAtom;
255
256 Object.defineProperty(exports, '__esModule', { value: true });
257
258}));