Spaces:
Running
Running
import { QueryClient, QueryFunction } from "@tanstack/react-query"; | |
async function throwIfResNotOk(res: Response) { | |
if (!res.ok) { | |
// Handle 401 errors by clearing authentication | |
if (res.status === 401) { | |
localStorage.removeItem('token'); | |
localStorage.removeItem('user'); | |
localStorage.removeItem('seller'); | |
localStorage.removeItem('userType'); | |
// Redirect to auth page if not already there | |
if (window.location.pathname !== '/auth') { | |
window.location.href = '/auth'; | |
} | |
} | |
const text = (await res.text()) || res.statusText; | |
throw new Error(`${res.status}: ${text}`); | |
} | |
} | |
export async function apiRequest( | |
method: string, | |
url: string, | |
data?: unknown | undefined, | |
): Promise<Response> { | |
const token = localStorage.getItem('token'); | |
const headers: Record<string, string> = {}; | |
// Don't set Content-Type for FormData - let browser set it with proper boundary | |
if (data && !(data instanceof FormData)) { | |
headers["Content-Type"] = "application/json"; | |
} | |
if (token) { | |
headers["Authorization"] = `Bearer ${token}`; | |
} | |
const res = await fetch(url, { | |
method, | |
headers, | |
body: data instanceof FormData ? data : (data ? JSON.stringify(data) : undefined), | |
credentials: "include", | |
}); | |
await throwIfResNotOk(res); | |
return res; | |
} | |
type UnauthorizedBehavior = "returnNull" | "throw"; | |
export const getQueryFn: <T>(options: { | |
on401: UnauthorizedBehavior; | |
}) => QueryFunction<T> = | |
({ on401: unauthorizedBehavior }) => | |
async ({ queryKey }) => { | |
const token = localStorage.getItem('token'); | |
const headers: Record<string, string> = {}; | |
if (token) { | |
headers["Authorization"] = `Bearer ${token}`; | |
} | |
const res = await fetch(queryKey.join("/") as string, { | |
headers, | |
credentials: "include", | |
}); | |
if (res.status === 401) { | |
// Handle 401 errors by clearing authentication | |
localStorage.removeItem('token'); | |
localStorage.removeItem('user'); | |
localStorage.removeItem('seller'); | |
localStorage.removeItem('userType'); | |
if (unauthorizedBehavior === "returnNull") { | |
return null; | |
} | |
// Redirect to auth page if not already there | |
if (window.location.pathname !== '/auth') { | |
window.location.href = '/auth'; | |
} | |
} | |
await throwIfResNotOk(res); | |
return await res.json(); | |
}; | |
export const queryClient = new QueryClient({ | |
defaultOptions: { | |
queries: { | |
queryFn: getQueryFn({ on401: "throw" }), | |
refetchInterval: false, | |
refetchOnWindowFocus: false, | |
staleTime: Infinity, | |
retry: false, | |
}, | |
mutations: { | |
retry: false, | |
}, | |
}, | |
}); | |