From e20731e027f499c315290e6d2a648907ff554c89 Mon Sep 17 00:00:00 2001 From: Marco Pedone Date: Tue, 19 Aug 2025 19:14:30 +0200 Subject: [PATCH] Enhance API error handling: add errorLink to handle UNAUTHORIZED errors and reload the page --- .../src/middlewares/auth_middleware.ts | 1 - apps/infoalloggi/src/utils/api.ts | 25 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/apps/infoalloggi/src/middlewares/auth_middleware.ts b/apps/infoalloggi/src/middlewares/auth_middleware.ts index 407b0bf..d69446a 100644 --- a/apps/infoalloggi/src/middlewares/auth_middleware.ts +++ b/apps/infoalloggi/src/middlewares/auth_middleware.ts @@ -125,7 +125,6 @@ const refreshAuthToken = async ( response.cookies.delete(REFRESH_TOKEN_COOKIE_NAME); return response; } - // If refresh token is valid, sign a new access token const redirect = req.nextUrl.searchParams.get("redirect"); const destination = onSuccessDashboard diff --git a/apps/infoalloggi/src/utils/api.ts b/apps/infoalloggi/src/utils/api.ts index c0d8aec..776ae3d 100644 --- a/apps/infoalloggi/src/utils/api.ts +++ b/apps/infoalloggi/src/utils/api.ts @@ -3,9 +3,12 @@ import { httpSubscriptionLink, loggerLink, splitLink, + TRPCClientError, + type TRPCLink, } from "@trpc/client"; import { createTRPCNext } from "@trpc/next"; import type { inferRouterInputs, inferRouterOutputs } from "@trpc/server"; +import { observable } from "@trpc/server/observable"; import superjson from "superjson"; import type { AppRouter } from "~/server/api/root"; @@ -19,10 +22,32 @@ const getUrl = () => { return `${base}/api/trpc`; }; +const errorLink: TRPCLink = () => { + return ({ next, op }) => { + return observable((observer) => { + const unsubscribe = next(op).subscribe({ + next: observer.next, + error(err) { + if ( + err instanceof TRPCClientError && + err.data?.code === "UNAUTHORIZED" + ) { + window.location.reload(); + } + observer.error(err); + }, + complete: observer.complete, + }); + return unsubscribe; + }); + }; +}; + export const api = createTRPCNext({ config() { return { links: [ + errorLink, loggerLink({ enabled: (opts) => (process.env.NODE_ENV === "development" &&