From a63b658dc4ef2eeca510435452d5d27f4ca79d09 Mon Sep 17 00:00:00 2001 From: Froidefond Julien Date: Thu, 26 Mar 2026 06:19:15 +0100 Subject: [PATCH] feat: streamline mobile header navigation Remove dashboard link from desktop/tablet nav (logo already links to /). Move user switcher into hamburger menu as inline clickable items on mobile. Co-Authored-By: Claude Opus 4.6 (1M context) --- apps/backoffice/app/(app)/layout.tsx | 23 +++++-- apps/backoffice/app/components/MobileNav.tsx | 71 +++++++++++++++++--- 2 files changed, 76 insertions(+), 18 deletions(-) diff --git a/apps/backoffice/app/(app)/layout.tsx b/apps/backoffice/app/(app)/layout.tsx index 915e84c..42e219d 100644 --- a/apps/backoffice/app/(app)/layout.tsx +++ b/apps/backoffice/app/(app)/layout.tsx @@ -20,7 +20,6 @@ type NavItem = { }; const navItems: NavItem[] = [ - { href: "/", labelKey: "nav.dashboard", icon: "dashboard" }, { href: "/books", labelKey: "nav.books", icon: "books" }, { href: "/series", labelKey: "nav.series", icon: "series" }, { href: "/authors", labelKey: "nav.authors", icon: "authors" }, @@ -74,11 +73,13 @@ export default async function AppLayout({ children }: { children: ReactNode }) { ))} - +
+ +
@@ -91,7 +92,15 @@ export default async function AppLayout({ children }: { children: ReactNode }) { - ({ ...item, label: t(item.labelKey) }))} /> + ({ ...item, label: t(item.labelKey) })), + ]} + users={users} + activeUserId={activeUserId} + setActiveUserAction={setActiveUserAction} + />
diff --git a/apps/backoffice/app/components/MobileNav.tsx b/apps/backoffice/app/components/MobileNav.tsx index 5d8c547..d3fc33a 100644 --- a/apps/backoffice/app/components/MobileNav.tsx +++ b/apps/backoffice/app/components/MobileNav.tsx @@ -1,10 +1,11 @@ "use client"; -import { useState, useEffect } from "react"; +import { useState, useEffect, useTransition } from "react"; import { createPortal } from "react-dom"; import Link from "next/link"; import { NavIcon } from "./ui"; import { useTranslation } from "../../lib/i18n/context"; +import type { UserDto } from "@/lib/api"; type NavItem = { href: "/" | "/books" | "/series" | "/authors" | "/libraries" | "/jobs" | "/tokens" | "/settings"; @@ -24,10 +25,24 @@ const XIcon = () => ( ); -export function MobileNav({ navItems }: { navItems: NavItem[] }) { +export function MobileNav({ navItems, users, activeUserId, setActiveUserAction }: { + navItems: NavItem[]; + users: UserDto[]; + activeUserId: string | null; + setActiveUserAction: (formData: FormData) => Promise; +}) { const { t } = useTranslation(); const [isOpen, setIsOpen] = useState(false); const [mounted, setMounted] = useState(false); + const [, startTransition] = useTransition(); + + function select(userId: string | null) { + startTransition(async () => { + const fd = new FormData(); + fd.append("user_id", userId ?? ""); + await setActiveUserAction(fd); + }); + } useEffect(() => { setMounted(true); @@ -71,15 +86,49 @@ export function MobileNav({ navItems }: { navItems: NavItem[] }) { ))} -
- setIsOpen(false)} - > - - {t("nav.settings")} - +
+ {users.length > 0 && ( + <> +

{t("users.title")}

+ + {users.map((user) => ( + + ))} + + )} +
+ setIsOpen(false)} + > + + {t("nav.settings")} + +