UNPKG

jotai

Version:

👻 Next gen state management that will spook you

259 lines (218 loc) • 7.77 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@tanstack/query-core'), require('jotai')) : typeof define === 'function' && define.amd ? define(['exports', '@tanstack/query-core', 'jotai'], factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.jotaiQuery = {}, global.queryCore, global.jotai)); })(this, (function (exports, queryCore, jotai) { 'use strict'; var queryClientAtom = jotai.atom(new queryCore.QueryClient()); function atomWithQuery(createQuery, getQueryClient) { if (getQueryClient === void 0) { getQueryClient = function getQueryClient(get) { return get(queryClientAtom); }; } var observerAtom = jotai.atom(function (get) { var queryClient = getQueryClient(get); var defaultedOptions = queryClient.defaultQueryOptions(); var observer = new queryCore.QueryObserver(queryClient, defaultedOptions); return observer; }); var queryDataAtom = jotai.atom(function (get) { var queryClient = getQueryClient(get); var options = typeof createQuery === 'function' ? createQuery(get) : createQuery; var defaultedOptions = queryClient.defaultQueryOptions(options); var observer = get(observerAtom); observer.destroy(); observer.setOptions(defaultedOptions); var initialResult = observer.getCurrentResult(); var resolve = null; var resultAtom = jotai.atom(initialResult.data === undefined && options.enabled !== false ? new Promise(function (r) { resolve = r; }) : initialResult); var setResult = null; var unsubscribe = null; var unsubIfNotMounted = function unsubIfNotMounted() { if (!setResult) { unsubscribe == null ? void 0 : unsubscribe(); unsubscribe = null; } }; var listener = function listener(result) { if (result.isFetching || !result.isError && result.data === undefined) { return; } if (resolve) { setTimeout(unsubIfNotMounted, 1000); resolve(result); resolve = null; } else if (setResult) { setResult(result); } else { throw new Error('setting result without mount'); } }; if (options.enabled !== false) { unsubscribe = observer.subscribe(listener); } resultAtom.onMount = function (update) { setResult = update; if (options.enabled !== false && !unsubscribe) { unsubscribe = observer.subscribe(listener); listener(observer.getCurrentResult()); } return function () { setResult = null; unsubscribe == null ? void 0 : unsubscribe(); }; }; return { options: options, resultAtom: resultAtom, unsubIfNotMounted: unsubIfNotMounted }; }, function (get, set, action) { var observer = get(observerAtom); var _get2 = get(queryDataAtom), options = _get2.options, resultAtom = _get2.resultAtom, unsubIfNotMounted = _get2.unsubIfNotMounted; if (options.enabled === false) { return; } switch (action.type) { case 'refetch': { set(resultAtom, new Promise(function () {})); unsubIfNotMounted(); return observer.refetch({ cancelRefetch: true }).then(function (result) { set(resultAtom, result); }); } } }); var queryAtom = jotai.atom(function (get) { var _get3 = get(queryDataAtom), resultAtom = _get3.resultAtom; var result = get(resultAtom); if (result.isError) { throw result.error; } return result.data; }, function (_get, set, action) { return set(queryDataAtom, action); }); return queryAtom; } function atomWithInfiniteQuery(createQuery, getQueryClient) { if (getQueryClient === void 0) { getQueryClient = function getQueryClient(get) { return get(queryClientAtom); }; } var queryDataAtom = jotai.atom(function (get) { var queryClient = getQueryClient(get); var options = typeof createQuery === 'function' ? createQuery(get) : createQuery; var defaultedOptions = queryClient.defaultQueryOptions(options); var observer = new queryCore.InfiniteQueryObserver(queryClient, defaultedOptions); var initialResult = observer.getCurrentResult(); var resolve = null; var resultAtom = jotai.atom(initialResult.data === undefined && options.enabled !== false ? new Promise(function (r) { resolve = r; }) : initialResult); var setResult = function setResult() { throw new Error('setting result without mount'); }; var state = { isMounted: false, unsubscribe: null }; var listener = function listener(result) { if (result.isFetching || !result.isError && result.data === undefined || result.isError && queryCore.isCancelledError(result.error)) { return; } if (resolve) { setTimeout(function () { if (!state.isMounted) { state.unsubscribe == null ? void 0 : state.unsubscribe(); state.unsubscribe = null; } }, 1000); resolve(result); resolve = null; } else { setResult(result); } }; if (options.enabled !== false) { state.unsubscribe = observer.subscribe(listener); } resultAtom.onMount = function (update) { setResult = update; state.isMounted = true; if (options.enabled !== false && !state.unsubscribe) { state.unsubscribe = observer.subscribe(listener); listener(observer.getCurrentResult()); } return function () { return state.unsubscribe == null ? void 0 : state.unsubscribe(); }; }; return { options: options, resultAtom: resultAtom, observer: observer, state: state }; }, function (get, set, action) { var _get2 = get(queryDataAtom), options = _get2.options, resultAtom = _get2.resultAtom, observer = _get2.observer, state = _get2.state; if (options.enabled === false) { return; } switch (action.type) { case 'refetch': { set(resultAtom, new Promise(function () {})); if (!state.isMounted) { state.unsubscribe == null ? void 0 : state.unsubscribe(); state.unsubscribe = null; } observer.refetch(action.payload).then(function (result) { set(resultAtom, result); }); return; } case 'fetchPreviousPage': { observer.fetchPreviousPage(); return; } case 'fetchNextPage': { observer.fetchNextPage(); return; } } }); var queryAtom = jotai.atom(function (get) { var _get3 = get(queryDataAtom), resultAtom = _get3.resultAtom; var result = get(resultAtom); if (result.isError) { throw result.error; } return result.data; }, function (_get, set, action) { return set(queryDataAtom, action); }); return queryAtom; } exports.atomWithInfiniteQuery = atomWithInfiniteQuery; exports.atomWithQuery = atomWithQuery; exports.queryClientAtom = queryClientAtom; Object.defineProperty(exports, '__esModule', { value: true }); }));