satupeta-main/shared/utils/query-client.ts
2026-02-23 12:21:05 +07:00

51 lines
1.2 KiB
TypeScript
Executable File

import { QueryClient, QueryCache, MutationCache } from "@tanstack/react-query";
import { AxiosError } from "axios";
import { toast } from "sonner";
// Query client setup
export const queryClient = new QueryClient({
queryCache: new QueryCache({
onError: (error) => {
handleGlobalError(error);
},
}),
mutationCache: new MutationCache({
onError: (error) => {
handleGlobalError(error);
},
}),
});
let hasRedirected = false;
function handleGlobalError(error: unknown) {
if (
typeof window !== "undefined" &&
error &&
typeof error === "object" &&
"isAxiosError" in error
) {
const axiosError = error as AxiosError;
if (axiosError.response?.status === 401) {
const requestUrl = axiosError.config?.url;
const isAuthEndpoint =
requestUrl?.includes("/auth/refresh") ||
requestUrl?.includes("/me") ||
requestUrl?.includes("/auth/session");
if (isAuthEndpoint) return;
if (!hasRedirected) {
hasRedirected = true;
toast.error("Session expired. Refreshing token...");
window.location.href = "/auth/admin/logout";
}
} else {
toast.error(axiosError.message || "Something went wrong.");
}
}
}