'use client'; import { useState, useEffect } from 'react'; import Link from 'next/link'; import dynamic from 'next/dynamic'; import { usePathname } from 'next/navigation'; import { Video, FolderOpen, Building2, Settings, LogOut, User, Menu, Keyboard, LayoutDashboard, MessageSquareQuote, Search, } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { Sheet, SheetContent, SheetTrigger, SheetTitle, SheetDescription } from '@/components/ui/sheet'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; import { ThemeToggle } from '@/components/theme-toggle'; import { cn } from '@/lib/utils'; const KeyboardShortcutsModal = dynamic( () => import('@/components/keyboard-shortcuts-modal').then(mod => mod.KeyboardShortcutsModal), { ssr: false } ); const SearchModal = dynamic( () => import('@/components/search-modal').then(mod => mod.SearchModal), { ssr: false } ); interface NavItem { href: string; label: string; icon: React.ComponentType<{ className?: string }>; } const navItems: NavItem[] = [ { href: '/dashboard', label: 'Projects', icon: FolderOpen }, { href: '/workspaces', label: 'Workspaces', icon: Building2 }, ]; interface HeaderProps { user?: { name?: string | null; email?: string | null; image?: string | null; isAdmin?: boolean; } | null; showAppNavigation?: boolean; } export function Header({ user, showAppNavigation = false }: HeaderProps) { const pathname = usePathname(); const [shortcutsOpen, setShortcutsOpen] = useState(false); const [searchOpen, setSearchOpen] = useState(false); // Global Ctrl+K / Cmd+K listener useEffect(() => { const handler = (e: KeyboardEvent) => { if ((e.ctrlKey || e.metaKey) && e.key === 'k') { if (!user || !showAppNavigation) { return; } e.preventDefault(); setSearchOpen((v) => !v); } }; window.addEventListener('keydown', handler); return () => window.removeEventListener('keydown', handler); }, [showAppNavigation, user]); // Hide header on video player pages — they use full viewport with their own back button const isVideoPage = /\/videos\/[^/]+($|\/compare)/.test(pathname) || pathname.startsWith('/watch/'); if (isVideoPage) return null; return (
{/* Mobile menu */} Navigation Menu Access your projects and workspaces {/* Logo */}
{user && showAppNavigation && }
); }