better-auth
Version:
The most comprehensive authentication framework for TypeScript.
98 lines (96 loc) • 2.51 kB
JavaScript
import { atom, onMount } from "nanostores";
//#region src/client/query.ts
const isServer = () => typeof window === "undefined";
const useAuthQuery = (initializedAtom, path, $fetch, options) => {
const value = atom({
data: null,
error: null,
isPending: true,
isRefetching: false,
refetch: (queryParams) => fn(queryParams)
});
const fn = async (queryParams) => {
return new Promise((resolve) => {
const opts = typeof options === "function" ? options({
data: value.get().data,
error: value.get().error,
isPending: value.get().isPending
}) : options;
$fetch(path, {
...opts,
query: {
...opts?.query,
...queryParams?.query
},
async onSuccess(context) {
value.set({
data: context.data,
error: null,
isPending: false,
isRefetching: false,
refetch: value.value.refetch
});
await opts?.onSuccess?.(context);
},
async onError(context) {
const { request } = context;
const retryAttempts = typeof request.retry === "number" ? request.retry : request.retry?.attempts;
const retryAttempt = request.retryAttempt || 0;
if (retryAttempts && retryAttempt < retryAttempts) return;
value.set({
error: context.error,
data: null,
isPending: false,
isRefetching: false,
refetch: value.value.refetch
});
await opts?.onError?.(context);
},
async onRequest(context) {
const currentValue = value.get();
value.set({
isPending: currentValue.data === null,
data: currentValue.data,
error: null,
isRefetching: true,
refetch: value.value.refetch
});
await opts?.onRequest?.(context);
}
}).catch((error) => {
value.set({
error,
data: null,
isPending: false,
isRefetching: false,
refetch: value.value.refetch
});
}).finally(() => {
resolve(void 0);
});
});
};
initializedAtom = Array.isArray(initializedAtom) ? initializedAtom : [initializedAtom];
let isMounted = false;
for (const initAtom of initializedAtom) initAtom.subscribe(async () => {
if (isServer()) return;
if (isMounted) await fn();
else onMount(value, () => {
const timeoutId = setTimeout(async () => {
if (!isMounted) {
await fn();
isMounted = true;
}
}, 0);
return () => {
value.off();
initAtom.off();
clearTimeout(timeoutId);
};
});
});
return value;
};
//#endregion
export { useAuthQuery };
//# sourceMappingURL=query.mjs.map