UNPKG

2.6 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, '__esModule', { value: true });
4
5var jotai = require('jotai');
6var reactQuery = require('react-query');
7
8var queryClientAtom = jotai.atom(null);
9var getQueryClient = function getQueryClient(get, set) {
10 var queryClient = get(queryClientAtom);
11
12 if (queryClient === null) {
13 queryClient = new reactQuery.QueryClient();
14 set(queryClientAtom, queryClient);
15 }
16
17 return queryClient;
18};
19
20function atomWithQuery(createQuery, equalityFn) {
21 if (equalityFn === void 0) {
22 equalityFn = Object.is;
23 }
24
25 var dataAtom = jotai.atom(new Promise(function () {}));
26 var queryAtom = jotai.atom(function (get) {
27 var options = typeof createQuery === 'function' ? createQuery(get) : createQuery;
28 var initAtom = jotai.atom(null, function (get, set, cleanup) {
29 set(dataAtom, new Promise(function () {}));
30 var queryClient = getQueryClient(get, set);
31 var observer = new reactQuery.QueryObserver(queryClient, options);
32 var hasData = false;
33 observer.subscribe(function (result) {
34 if (result.data !== undefined) {
35 if (!hasData || !equalityFn(get(dataAtom), result.data)) {
36 hasData = true;
37 set(dataAtom, result.data);
38 }
39 }
40 });
41 cleanup(function () {
42 return observer.destroy();
43 });
44 });
45
46 initAtom.onMount = function (init) {
47 var destroy;
48
49 var cleanup = function cleanup(callback) {
50 if (destroy === false) {
51 callback();
52 } else {
53 destroy = callback;
54 }
55 };
56
57 init(cleanup);
58 return function () {
59 if (destroy) {
60 destroy();
61 }
62
63 destroy = false;
64 };
65 };
66
67 return [options, initAtom];
68 }, function (get, set, action) {
69 if (action.type === 'refetch') {
70 var _queryClient$getQuery;
71
72 var _get2 = get(queryAtom),
73 options = _get2[0];
74
75 set(dataAtom, new Promise(function () {}));
76 var queryClient = getQueryClient(get, set);
77 (_queryClient$getQuery = queryClient.getQueryCache().find(options.queryKey)) == null ? void 0 : _queryClient$getQuery.reset();
78 var p = queryClient.refetchQueries(options.queryKey);
79 return p;
80 }
81
82 return;
83 });
84 var queryDataAtom = jotai.atom(function (get) {
85 var _get3 = get(queryAtom),
86 initAtom = _get3[1];
87
88 get(initAtom);
89 return get(dataAtom);
90 }, function (_get, set, action) {
91 return set(queryAtom, action);
92 });
93 return queryDataAtom;
94}
95
96exports.atomWithQuery = atomWithQuery;
97exports.queryClientAtom = queryClientAtom;