Spaces:
Running
Running
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, | |
}, | |
}, | |
}); | |