From d0103444236198169089e9ae6395d75e5ec56e36 Mon Sep 17 00:00:00 2001 From: openhands Date: Sun, 26 Jul 2026 17:17:56 +0200 Subject: [PATCH] feat: add language switcher, theme switcher, logout, and hotel logo to client toolbar --- src/app/client/client-view.tsx | 201 +++++++++++++++++++-------------- src/app/client/page.tsx | 4 +- 2 files changed, 122 insertions(+), 83 deletions(-) diff --git a/src/app/client/client-view.tsx b/src/app/client/client-view.tsx index 0e9874c6..ed3f7e9e 100644 --- a/src/app/client/client-view.tsx +++ b/src/app/client/client-view.tsx @@ -1,7 +1,12 @@ "use client"; +import { LogOut } from "lucide-react"; +import Image from "next/image"; import Link from "next/link"; +import { signOut } from "next-auth/react"; import { type ReactNode, useCallback, useEffect, useState } from "react"; +import { LanguageSwitcher } from "@/components/language-switcher"; +import { ThemeSwitcher } from "@/components/theme-switcher"; function ToolbarBtn({ onClick, @@ -47,11 +52,13 @@ export function ClientView({ ticket, clientUrl, hotelName, + logo, initialOnline, }: { ticket: string; clientUrl: string; hotelName: string; + logo: string | null; initialOnline: number; }) { const [_isFullscreen, setIsFullscreen] = useState(false); @@ -94,90 +101,120 @@ export function ClientView({ className="relative w-screen h-screen overflow-hidden" style={{ backgroundColor: "var(--color-background)" }} > -
- - +
+ + + Home + + + + + window.location.reload()} title="Reload"> + + Reload + + + + + + + + Fullscreen + + + +
- Home - - - - - window.location.reload()} title="Reload"> - + Online users + + + + {onlineCount} +
+
+ +
+ {logo ? ( + {hotelName} + ) : ( + + {hotelName} + + )} + + + signOut({ callbackUrl: "/" })} + title="Logout" > - Reload - - - - - - - - Fullscreen - - - -
- - Online users - - - - {onlineCount} + +
diff --git a/src/app/client/page.tsx b/src/app/client/page.tsx index c84b10af..33fcd4e2 100644 --- a/src/app/client/page.tsx +++ b/src/app/client/page.tsx @@ -16,9 +16,10 @@ export default async function ClientPage() { const userId = Number(session.user.id); - const [hotelName, clientUrl] = await Promise.all([ + const [hotelName, clientUrl, logo] = await Promise.all([ resolveHotelName(), siteSettings.get("nitro_client_url", ""), + siteSettings.get("cms_logo", ""), ]); const ip = (await headers()).get("x-real-client-ip") ?? "0.0.0.0"; @@ -33,6 +34,7 @@ export default async function ClientPage() { ticket={ticket} clientUrl={clientUrl || "/nitro-client/"} hotelName={hotelName} + logo={logo} initialOnline={onlineCount} /> );