import { useRef, useState, useEffect } from "react"; import { Check, LogOut, Settings, UserCircle } from "lucide-react"; import type { ApiSettings, AuthInfo, AuthTenantMembership, LoginResponse } from "../types"; import HelpMenu from "./HelpMenu"; import LoginModal from "../features/auth/LoginModal"; import { logout } from "../api/auth"; type Props = { settings: ApiSettings; auth: AuthInfo | null; onSettingsChange: (settings: ApiSettings) => void; onAuthChange: (auth: AuthInfo | null, accessToken?: string) => void; }; export default function Titlebar({ settings, auth, onAuthChange }: Props) { const [accountOpen, setAccountOpen] = useState(false); const [tenantOpen, setTenantOpen] = useState(false); const [loginOpen, setLoginOpen] = useState(false); const accountRef = useRef(null); const tenantRef = useRef(null); const activeTenant = auth?.active_tenant ?? auth?.tenant ?? null; const tenants = auth?.tenants ?? (activeTenant ? [activeTenant] : []); const canSwitchTenant = tenants.length > 1; useEffect(() => { function onPointerDown(event: MouseEvent) { const target = event.target as Node; if (accountRef.current && !accountRef.current.contains(target)) { setAccountOpen(false); } if (tenantRef.current && !tenantRef.current.contains(target)) { setTenantOpen(false); } } window.addEventListener("mousedown", onPointerDown); return () => window.removeEventListener("mousedown", onPointerDown); }, []); function handleLogin(response: LoginResponse) { const active = response.active_tenant ?? response.tenant; onAuthChange( { user: response.user, tenant: active, active_tenant: active, tenants: response.tenants ?? [active], scopes: response.scopes, roles: response.roles, groups: response.groups }, response.access_token ); } async function handleLogout() { try { await logout(settings); } catch { // Logout is best effort; clear local session either way. } onAuthChange(null, ""); setAccountOpen(false); } function handleTenantSelect(tenant: AuthTenantMembership) { // Backend-side active tenant switching will be wired later. For now this is a UI placeholder. onAuthChange(auth ? { ...auth, tenant, active_tenant: tenant } : null); setTenantOpen(false); } return (
{auth && activeTenant && (
tenant: {canSwitchTenant ? ( <> {tenantOpen && (
{tenants.map((tenant) => { const active = tenant.id === activeTenant.id; return ( ); })}
)} ) : ( {activeTenant.name} )}
)}
{accountOpen && (
{auth ? ( <>
{auth.user.display_name || auth.user.email} {auth.user.email}
) : ( )}
)}
{loginOpen && setLoginOpen(false)} onLogin={handleLogin} />}
); }