62 lines
1.7 KiB
TypeScript
62 lines
1.7 KiB
TypeScript
import { trpc } from "@/lib/trpc";
|
|
import { UNAUTHED_ERR_MSG } from '@shared/const';
|
|
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
|
import { httpBatchLink, TRPCClientError } from "@trpc/client";
|
|
import { createRoot } from "react-dom/client";
|
|
import superjson from "superjson";
|
|
import App from "./App";
|
|
import { getLoginUrl } from "./const";
|
|
import "./index.css";
|
|
|
|
const queryClient = new QueryClient();
|
|
|
|
const redirectToLoginIfUnauthorized = (error: unknown) => {
|
|
if (!(error instanceof TRPCClientError)) return;
|
|
if (typeof window === "undefined") return;
|
|
|
|
const isUnauthorized = error.message === UNAUTHED_ERR_MSG;
|
|
|
|
if (!isUnauthorized) return;
|
|
|
|
window.location.href = getLoginUrl();
|
|
};
|
|
|
|
queryClient.getQueryCache().subscribe(event => {
|
|
if (event.type === "updated" && event.action.type === "error") {
|
|
const error = event.query.state.error;
|
|
redirectToLoginIfUnauthorized(error);
|
|
console.error("[API Query Error]", error);
|
|
}
|
|
});
|
|
|
|
queryClient.getMutationCache().subscribe(event => {
|
|
if (event.type === "updated" && event.action.type === "error") {
|
|
const error = event.mutation.state.error;
|
|
redirectToLoginIfUnauthorized(error);
|
|
console.error("[API Mutation Error]", error);
|
|
}
|
|
});
|
|
|
|
const trpcClient = trpc.createClient({
|
|
links: [
|
|
httpBatchLink({
|
|
url: "/api/trpc",
|
|
transformer: superjson,
|
|
fetch(input, init) {
|
|
return globalThis.fetch(input, {
|
|
...(init ?? {}),
|
|
credentials: "include",
|
|
});
|
|
},
|
|
}),
|
|
],
|
|
});
|
|
|
|
createRoot(document.getElementById("root")!).render(
|
|
<trpc.Provider client={trpcClient} queryClient={queryClient}>
|
|
<QueryClientProvider client={queryClient}>
|
|
<App />
|
|
</QueryClientProvider>
|
|
</trpc.Provider>
|
|
);
|