jotai
Version:
👻 Next gen state management that will spook you
259 lines (218 loc) • 7.77 kB
JavaScript
(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 });
}));