From 273e9b0a070072f764b00f2559418301e208e694 Mon Sep 17 00:00:00 2001 From: grimsi <9295182+grimsi@users.noreply.github.com> Date: Sat, 8 Jun 2024 16:05:25 +0200 Subject: [PATCH] Fix bug in error handler response handling Change background of Sonner --- frontend/@/components/ui/sonner.tsx | 2 +- frontend/App.tsx | 3 ++- frontend/util/middleware.ts | 25 ++++++++++++++++++------- frontend/views/SetupView.tsx | 12 ++++-------- 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/frontend/@/components/ui/sonner.tsx b/frontend/@/components/ui/sonner.tsx index 1128edf..c24c3d6 100644 --- a/frontend/@/components/ui/sonner.tsx +++ b/frontend/@/components/ui/sonner.tsx @@ -13,7 +13,7 @@ const Toaster = ({ ...props }: ToasterProps) => { toastOptions={{ classNames: { toast: - "group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg", + "group toast group-[.toaster]:bg-content1 group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg", description: "group-[.toast]:text-muted-foreground", actionButton: "group-[.toast]:bg-primary group-[.toast]:text-primary-foreground", diff --git a/frontend/App.tsx b/frontend/App.tsx index 75cff10..1aab1bc 100644 --- a/frontend/App.tsx +++ b/frontend/App.tsx @@ -11,7 +11,8 @@ import {ErrorHandlingMiddleware} from "Frontend/util/middleware"; export default function App() { const navigate = useNavigate(); - client.middlewares.push(ErrorHandlingMiddleware); + + client.middlewares = [ErrorHandlingMiddleware]; return ( diff --git a/frontend/util/middleware.ts b/frontend/util/middleware.ts index 10ec4d9..d5625e5 100644 --- a/frontend/util/middleware.ts +++ b/frontend/util/middleware.ts @@ -2,19 +2,30 @@ import {Middleware, MiddlewareContext, MiddlewareNext} from '@hilla/frontend'; import {toast} from "sonner"; import {getReasonPhrase} from "http-status-codes"; -export const ErrorHandlingMiddleware: Middleware = async function( +export const ErrorHandlingMiddleware: Middleware = async function ( context: MiddlewareContext, next: MiddlewareNext ) { const {endpoint, method} = context; - let response: Response = await next(context); - if(!response.ok) { - //Ignore calls to UserEndpoint.getUserInfo since they are managed by Hilla and called on initial load - if(endpoint == "UserEndpoint" && method == "getUserInfo") return response; + let originalResponse = (await next(context)); - toast.error(`${getReasonPhrase(response.status)}`, {description: `${endpoint}.${method}`}) + if (!originalResponse.ok) { + // .clone() is necessary because response.json() is one-time only and Hilla accesses it in its internal error handler + // @see https://developer.mozilla.org/en-US/docs/Web/API/Response/clone + let response: Response = originalResponse.clone(); + + //Ignore calls to UserEndpoint.getUserInfo since they are managed by Hilla and called on initial load + if (endpoint == "UserEndpoint" && method == "getUserInfo") return originalResponse; + + let json: any = await response.json(); + + if (json.type == "dev.hilla.exception.EndpointException") { + toast.error(`${getReasonPhrase(response.status)}`, {description: `${json.message}`}); + } else { + toast.error(`${getReasonPhrase(response.status)}`, {description: `${endpoint}.${method}`}) + } } - return response; + return originalResponse; } \ No newline at end of file diff --git a/frontend/views/SetupView.tsx b/frontend/views/SetupView.tsx index 132bc36..e100433 100644 --- a/frontend/views/SetupView.tsx +++ b/frontend/views/SetupView.tsx @@ -94,17 +94,13 @@ function SetupView() { initialValues={{username: '', email: '', password: '', passwordRepeat: ''}} onSubmit={ async (values: any) => { - try { - await SetupEndpoint.registerSuperAdmin({ + await SetupEndpoint.registerSuperAdmin({ username: values.username, password: values.password, email: values.email - }); - toast.success("Setup finished", {description: "Have fun with Gameyfin!"}); - navigate('/login'); - } catch (e) { - alert("An error occurred while completing the setup. Please try again.") - } + }); + toast.success("Setup finished", {description: "Have fun with Gameyfin!"}); + navigate('/login'); } } >