From 7bf22639bae20a54bb2fd83da4c1de572372da86 Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 6 Aug 2026 21:33:03 +0200 Subject: [PATCH] feat: mock Homarr Assistant in demo mode and fix board page crash (#6524) --- .../[locale]/boards/(content)/_creator.tsx | 23 +++++++-- .../_components/assistant-configuration.tsx | 18 +++---- .../chat/assistant-provider-options.spec.ts | 18 +++++++ .../chat/assistant-provider-options.ts | 17 +++++++ .../src/app/api/assistant/chat/route.ts | 45 ++++++++++++++--- packages/api/src/router/assistant.ts | 49 +++++++++---------- 6 files changed, 127 insertions(+), 43 deletions(-) create mode 100644 apps/nextjs/src/app/api/assistant/chat/assistant-provider-options.spec.ts create mode 100644 apps/nextjs/src/app/api/assistant/chat/assistant-provider-options.ts diff --git a/apps/nextjs/src/app/[locale]/boards/(content)/_creator.tsx b/apps/nextjs/src/app/[locale]/boards/(content)/_creator.tsx index 4390f9acc..ddb379fae 100644 --- a/apps/nextjs/src/app/[locale]/boards/(content)/_creator.tsx +++ b/apps/nextjs/src/app/[locale]/boards/(content)/_creator.tsx @@ -1,5 +1,6 @@ import type { Metadata } from "next"; import { cache } from "react"; +import { notFound, redirect } from "next/navigation"; import { TRPCError } from "@trpc/server"; import { dehydrate, HydrationBoundary } from "@tanstack/react-query"; @@ -43,8 +44,24 @@ export const createBoardContentPage = >( page: async ({ params }: { params: Promise }) => { const resolvedParams = await params; const queryClient = getQueryClient(); + const session = await auth(); - const [board, session] = await Promise.all([getInitialBoard(resolvedParams), auth()]); + const board = await getInitialBoard(resolvedParams).catch((error) => { + if (error instanceof TRPCError && error.code === "NOT_FOUND") { + if (!session) { + logger.debug("No home board found for anonymous user, redirecting to login"); + redirect("/auth/login"); + } + + notFound(); + } + + if (error instanceof TRPCError && error.code === "BAD_REQUEST") { + notFound(); + } + + throw error; + }); const itemsMap = board.items.reduce((acc, item) => { const existing = acc.get(item.kind); @@ -96,8 +113,8 @@ export const createBoardContentPage = >( }, }; } catch (error) { - // Ignore not found errors and return empty metadata - if (error instanceof TRPCError && error.code === "NOT_FOUND") { + // Ignore not found and bad-request errors and return empty metadata + if (error instanceof TRPCError && (error.code === "NOT_FOUND" || error.code === "BAD_REQUEST")) { return {}; } diff --git a/apps/nextjs/src/app/[locale]/manage/assistant/_components/assistant-configuration.tsx b/apps/nextjs/src/app/[locale]/manage/assistant/_components/assistant-configuration.tsx index 8f8c538b4..f97c53e2f 100644 --- a/apps/nextjs/src/app/[locale]/manage/assistant/_components/assistant-configuration.tsx +++ b/apps/nextjs/src/app/[locale]/manage/assistant/_components/assistant-configuration.tsx @@ -462,7 +462,7 @@ export const AssistantConfiguration = () => { } > - +