"use client"; import { usePathname, useRouter } from "next/navigation"; import { useMemo } from "react"; import Link from "next/link"; import Image from "next/image"; import PropTypes from "prop-types"; import { ThemeToggle, LanguageSwitcher } from "@/shared/components"; import { OAUTH_PROVIDERS, APIKEY_PROVIDERS } from "@/shared/constants/config"; import { translate } from "@/i18n/runtime"; const getPageInfo = (pathname) => { if (!pathname) return { title: "", description: "", breadcrumbs: [] }; // Provider detail page: /dashboard/providers/[id] const providerMatch = pathname.match(/\/providers\/([^/]+)$/); if (providerMatch) { const providerId = providerMatch[1]; const providerInfo = OAUTH_PROVIDERS[providerId] || APIKEY_PROVIDERS[providerId]; if (providerInfo) { return { title: providerInfo.name, description: "", breadcrumbs: [ { label: "Providers", href: "/dashboard/providers" }, { label: providerInfo.name, image: `/providers/${providerInfo.id}.png` } ] }; } } if (pathname.includes("/providers")) return { title: "Providers", description: "Manage your AI provider connections", breadcrumbs: [] }; if (pathname.includes("/combos")) return { title: "Combos", description: "Model combos with fallback", breadcrumbs: [] }; if (pathname.includes("/usage")) return { title: "Usage & Analytics", description: "Monitor your API usage, token consumption, and request logs", breadcrumbs: [] }; if (pathname.includes("/mitm")) return { title: "MITM Proxy", description: "Intercept CLI tool traffic and route through 9Router", breadcrumbs: [] }; if (pathname.includes("/cli-tools")) return { title: "CLI Tools", description: "Configure CLI tools", breadcrumbs: [] }; if (pathname.includes("/endpoint")) return { title: "Endpoint", description: "API endpoint configuration", breadcrumbs: [] }; if (pathname.includes("/profile")) return { title: "Settings", description: "Manage your preferences", breadcrumbs: [] }; if (pathname.includes("/translator")) return { title: "Translator", description: "Debug translation flow between formats", breadcrumbs: [] }; if (pathname.includes("/console-log")) return { title: "Console Log", description: "Live server console output", breadcrumbs: [] }; if (pathname === "/dashboard") return { title: "Endpoint", description: "API endpoint configuration", breadcrumbs: [] }; return { title: "", description: "", breadcrumbs: [] }; }; export default function Header({ onMenuClick, showMenuButton = true }) { const pathname = usePathname(); const router = useRouter(); // Memoize page info to prevent unnecessary recalculations const pageInfo = useMemo(() => getPageInfo(pathname), [pathname]); const { title, description, breadcrumbs } = pageInfo; const handleLogout = async () => { try { const res = await fetch("/api/auth/logout", { method: "POST" }); if (res.ok) { router.push("/login"); router.refresh(); } } catch (err) { console.error("Failed to logout:", err); } }; return (
{/* Mobile menu button */}
{showMenuButton && ( )}
{/* Page title with breadcrumbs - desktop */}
{breadcrumbs.length > 0 ? (
{breadcrumbs.map((crumb, index) => (
{index > 0 && ( chevron_right )} {crumb.href ? ( {crumb.label} ) : (
{crumb.image && ( {crumb.label} { e.currentTarget.style.display = "none"; }} /> )}

{translate(crumb.label)}

)}
))}
) : title ? (

{translate(title)}

{description && (

{translate(description)}

)}
) : null}
{/* Right actions */}
{/* Language switcher */} {/* Theme toggle */} {/* Logout button */}
); } Header.propTypes = { onMenuClick: PropTypes.func, showMenuButton: PropTypes.bool, };