|
import { QueryClient, QueryFunction } from "@tanstack/react-query"; |
|
|
|
async function throwIfResNotOk(res: Response) { |
|
if (!res.ok) { |
|
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 res = await fetch(url, { |
|
method, |
|
headers: data ? { "Content-Type": "application/json" } : {}, |
|
body: 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 res = await fetch(queryKey[0] as string, { |
|
credentials: "include", |
|
}); |
|
|
|
if (unauthorizedBehavior === "returnNull" && res.status === 401) { |
|
return null; |
|
} |
|
|
|
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, |
|
}, |
|
}, |
|
}); |
|
|