"use client" import Link from "next/link" import { usePathname, useRouter } from "next/navigation" import { useEffect, useState } from "react" import { BookOpen, Menu, Search, LogOut, BookMarked, Shield } from "lucide-react" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Sheet, SheetContent, SheetTrigger, SheetTitle } from "@/components/ui/sheet" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" import { ThemeToggle } from "@/components/theme-toggle" import { useAuth } from "@/lib/auth-context" const navLinks = [ { label: "Trang Chủ", href: "/" }, { label: "Thể Loại", href: "/the-loai" }, { label: "Danh Sách", href: "/tim-kiem" }, ] type SearchSuggestion = { id: string title: string slug: string authorName: string coverUrl?: string | null series?: { id: string; name: string } | null } function roleLabel(role?: "USER" | "MOD" | "ADMIN") { if (role === "ADMIN") return "Quản trị viên" if (role === "MOD") return "Kiểm duyệt viên" return "Thành viên" } export function Header() { const pathname = usePathname() const router = useRouter() const { user, logout } = useAuth() const [searchQuery, setSearchQuery] = useState("") const [suggestions, setSuggestions] = useState([]) const [isSearchFocused, setIsSearchFocused] = useState(false) const [open, setOpen] = useState(false) useEffect(() => { const query = searchQuery.trim() if (query.length < 2) { setSuggestions([]) return } const controller = new AbortController() const timeoutId = setTimeout(async () => { try { const res = await fetch(`/api/truyen/suggest?q=${encodeURIComponent(query)}`, { signal: controller.signal, }) if (!res.ok) { setSuggestions([]) return } const data = await res.json() setSuggestions(Array.isArray(data) ? data : []) } catch { setSuggestions([]) } }, 250) return () => { controller.abort() clearTimeout(timeoutId) } }, [searchQuery]) const goToSuggestion = (slug: string) => { router.push(`/truyen/${slug}`) setSearchQuery("") setSuggestions([]) setIsSearchFocused(false) } const handleSearch = (e: React.FormEvent) => { e.preventDefault() if (searchQuery.trim()) { router.push(`/tim-kiem?q=${encodeURIComponent(searchQuery.trim())}`) setSearchQuery("") setSuggestions([]) setIsSearchFocused(false) } } return (
{/* Logo */} Virtus's Reader {/* Desktop Nav */} {/* Search */}
setSearchQuery(e.target.value)} onFocus={() => setIsSearchFocused(true)} onBlur={() => setTimeout(() => setIsSearchFocused(false), 120)} /> {isSearchFocused && searchQuery.trim().length >= 2 && (
{suggestions.length > 0 ? ( suggestions.map((item) => ( )) ) : (
Không tìm thấy kết quả phù hợp.
)}
)}
{/* Right Actions */}
{user ? (

{user.username}

{user.email}

Loại tài khoản: {roleLabel(user.role)}

{(user.role === "MOD" || user.role === "ADMIN") && ( <> Trang Quản Trị )} Tủ Sách Đăng Xuất
) : (
)} {/* Mobile menu */} Menu điều hướng
{ handleSearch(e); setOpen(false) }}>
setSearchQuery(e.target.value)} />
{!user && (
)} {user && (
{user.avatarUrl ? ( {user.username} ) : (
{user.username.charAt(0).toUpperCase()}
)}

{user.username}

{user.email}

Loại tài khoản: {roleLabel(user.role)}

)}
) }