Files
sofa/apps/web/src/lib/orpc/client.ts
T
2026-10-04 15:59:08 -04:00

40 lines
1.2 KiB
TypeScript

import { msg } from "@lingui/core/macro";
import { createORPCClient } from "@orpc/client";
import { RPCLink } from "@orpc/client/fetch";
import type { ContractRouterClient } from "@orpc/contract";
import { createTanstackQueryUtils } from "@orpc/tanstack-query";
import { QueryCache, QueryClient } from "@tanstack/react-query";
import { toast } from "sonner";
import type { contract } from "@sofa/api/contract";
import { i18n } from "@sofa/i18n";
export const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 60_000,
gcTime: 10 * 60_000,
refetchOnWindowFocus: false,
},
},
queryCache: new QueryCache({
onError: (_error, query) => {
toast.error(i18n._(msg`Something went wrong…`), {
action: {
label: i18n._(msg`Retry`),
onClick: () => void queryClient.refetchQueries({ queryKey: query.queryKey, exact: true }),
},
});
},
}),
});
export const link = new RPCLink({
url: `${window.location.origin}/rpc`,
fetch: (input, init) => fetch(input, { ...init, credentials: "include" }),
});
export const client: ContractRouterClient<typeof contract> = createORPCClient(link);
export const orpc = createTanstackQueryUtils(client);