Files
Stripe/src/modules/trpc/trpc-client.ts
jackbeeby dc5eea1ad0 wdc
2024-12-05 18:20:27 +11:00

88 lines
3.0 KiB
TypeScript

import { TRPCClientError, httpBatchLink, loggerLink, type TRPCClientErrorLike } from "@trpc/client";
import { createTRPCNext } from "@trpc/next";
import { SALEOR_API_URL_HEADER, SALEOR_AUTHORIZATION_BEARER_HEADER } from "@saleor/app-sdk/const";
import { useErrorModalStore } from "../ui/organisms/GlobalErrorModal/state";
import { type AppRouter } from "./trpc-app-router";
import { getErrorHandler } from "./utils";
import { logger } from "@/lib/logger";
import { appBridgeInstance } from "@/app-bridge-instance";
import { BaseTrpcError, JwtInvalidError, JwtTokenExpiredError } from "@/errors";
import { isDevelopment } from "@/lib/isEnv";
const genericErrorHandler = (err: unknown) => {
getErrorHandler({
actionId: "generic-error",
appBridge: appBridgeInstance,
})(err as TRPCClientErrorLike<AppRouter>);
};
export const trpcClient = createTRPCNext<AppRouter>({
config() {
return {
abortOnUnmount: true,
links: [
loggerLink({
// enable client and server logs for development
// enable client logs for production
enabled: (opts) =>
(isDevelopment() && typeof window !== "undefined") ||
(opts.direction === "down" && opts.result instanceof Error),
// use logger for production, console.log for development
logger: !isDevelopment() ? (data) => logger.error(data, "TRPC client error") : undefined,
}),
loggerLink({
logger: (data) => {
if (data.direction === "down" && data.result instanceof TRPCClientError) {
const serialized = data.result.data?.serialized;
const error = BaseTrpcError.parse(serialized);
if (error instanceof JwtTokenExpiredError) {
useErrorModalStore.setState({
isOpen: true,
message: "JWT Token expired. Please refresh the page.",
});
}
if (error instanceof JwtInvalidError) {
useErrorModalStore.setState({
isOpen: true,
message: "JWT Token is invalid. Please refresh the page.",
});
}
}
},
}),
httpBatchLink({
url: "/api/trpc",
headers() {
return {
/**
* Attach headers from app to client requests, so tRPC can add them to context
*/
[SALEOR_AUTHORIZATION_BEARER_HEADER]: appBridgeInstance?.getState().token,
[SALEOR_API_URL_HEADER]: appBridgeInstance?.getState().saleorApiUrl,
};
},
}),
],
queryClientConfig: {
defaultOptions: {
mutations: {
onError: genericErrorHandler,
retry: false,
},
queries: {
refetchOnMount: false,
refetchOnWindowFocus: false,
refetchOnReconnect: false,
onError: genericErrorHandler,
retry: false,
},
},
},
};
},
ssr: false,
});