diff --git a/frontend/src/components/layout/Header.tsx b/frontend/src/components/layout/Header.tsx deleted file mode 100644 index f45a6bf..0000000 --- a/frontend/src/components/layout/Header.tsx +++ /dev/null @@ -1,226 +0,0 @@ -// DEPRECATED: Replaced by ContextStrip.tsx — keeping for reference during transition -import { useEffect } from 'react' -import { useNavigate, Link } from '@tanstack/react-router' -import { LogOut, ChevronDown, User, Search, Sun, Moon, RefreshCw, Menu, Settings } from 'lucide-react' -import { useQuery } from '@tanstack/react-query' -import { useCommandPalette } from '@/components/command-palette/useCommandPalette' -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuLabel, - DropdownMenuSeparator, - DropdownMenuTrigger, -} from '@/components/ui/dropdown-menu' -import { useAuth, isSuperAdmin } from '@/lib/auth' -import { useUIStore } from '@/lib/store' -import { tenantsApi } from '@/lib/api' -import { useEventStreamContext } from '@/contexts/EventStreamContext' -import type { ConnectionState } from '@/hooks/useEventStream' - -// ─── Connection State Indicator ────────────────────────────────────────────── - -const CONNECTION_CONFIG: Record< - ConnectionState, - { colorClass: string; label: string; pulse: boolean } -> = { - connected: { colorClass: 'bg-success', label: 'Connected', pulse: false }, - connecting: { colorClass: 'bg-warning', label: 'Connecting...', pulse: true }, - reconnecting: { colorClass: 'bg-warning', label: 'Reconnecting...', pulse: true }, - disconnected: { colorClass: 'bg-error', label: 'Disconnected', pulse: false }, -} - -function formatTime(date: Date): string { - return date.toLocaleTimeString(undefined, { - hour: '2-digit', - minute: '2-digit', - second: '2-digit', - }) -} - -function ConnectionIndicator({ - state, - lastConnectedAt, - onReconnect, -}: { - state: ConnectionState - lastConnectedAt: Date | null - onReconnect: () => void -}) { - const { colorClass, label, pulse } = CONNECTION_CONFIG[state] - - return ( -
-
- {/* Tooltip on hover */} -
-
-

{label}

- {lastConnectedAt && ( -

- Last connected: {formatTime(lastConnectedAt)} -

- )} - {state === 'disconnected' && ( - - )} -
-
-
- ) -} - -// ─── Header ────────────────────────────────────────────────────────────────── - -export function Header() { - const { user, logout } = useAuth() - const { selectedTenantId, setSelectedTenantId, theme, setTheme } = useUIStore() - const { connectionState, lastConnectedAt, reconnect } = useEventStreamContext() - const navigate = useNavigate() - - const SYSTEM_TENANT_ID = '00000000-0000-0000-0000-000000000000' - - const { data: tenants } = useQuery({ - queryKey: ['tenants'], - queryFn: tenantsApi.list, - enabled: isSuperAdmin(user), - select: (data) => data.filter((t) => t.id !== SYSTEM_TENANT_ID), - }) - - const selectedTenant = tenants?.find((t) => t.id === selectedTenantId) - - // Auto-select when there's exactly one tenant and nothing selected - useEffect(() => { - if (isSuperAdmin(user) && tenants && tenants.length === 1 && !selectedTenantId) { - setSelectedTenantId(tenants[0].id) - } - }, [tenants, selectedTenantId, user, setSelectedTenantId]) - - const handleLogout = async () => { - await logout() - void navigate({ to: '/login' }) - } - - const roleLabel: Record = { - super_admin: 'Super Admin', - tenant_admin: 'Admin', - operator: 'Operator', - viewer: 'Viewer', - } - - return ( -
- {/* Left: hamburger + tenant context */} -
- - {isSuperAdmin(user) && tenants && tenants.length > 0 && ( - - - {selectedTenant ? selectedTenant.name : 'All Organizations'} - - - - Organization Context - - setSelectedTenantId(null)}> - All Organizations - - {tenants.map((tenant) => ( - setSelectedTenantId(tenant.id)} - > - {tenant.name} - - ))} - - - )} -
- - {/* Right: actions + user menu */} -
- {/* Search trigger */} - - - {/* Dark/light mode toggle */} - - - {/* SSE connection state indicator */} - - - - -
- -
- {user?.name ?? user?.email} - {/* Only show role if it differs from the display name */} - {(user?.name ?? user?.email) !== (roleLabel[user?.role ?? ''] ?? user?.role) && ( - - {roleLabel[user?.role ?? ''] ?? user?.role} - - )} - -
- - -
{user?.email}
-
- - - - - Settings - - - - void handleLogout()} className="text-error" data-testid="button-sign-out"> - - Sign out - -
-
-
-
- ) -}