"use client"; import { useState, useRef, useEffect } from "react"; import { usePathname, useRouter } from "next/navigation"; import Link from "next/link"; import Image from "next/image"; import { Menu, X, LogIn, User, LayoutDashboard, LogOut, Shield } from "lucide-react"; import { cn } from "@/lib/utils"; import { Button } from "@/components/ui/Button"; import { useAuth } from "@/hooks/useAuth"; import { shortenPubkey } from "@/lib/nostr"; const SECTION_LINKS = [{ label: "About", anchor: "about" }]; const PAGE_LINKS = [ { label: "Meetups", href: "/events" }, { label: "Community", href: "/community" }, { label: "FAQ", href: "/faq" }, ]; function ProfileAvatar({ picture, name, size = 36, }: { picture?: string; name?: string; size?: number; }) { const [imgError, setImgError] = useState(false); const initial = (name || "?")[0].toUpperCase(); if (picture && !imgError) { return ( {name setImgError(true)} unoptimized /> ); } return (
{initial}
); } export function Navbar() { const [open, setOpen] = useState(false); const [dropdownOpen, setDropdownOpen] = useState(false); const dropdownRef = useRef(null); const pathname = usePathname(); const router = useRouter(); const { user, loading, logout } = useAuth(); const isHome = pathname === "/"; useEffect(() => { function handleClickOutside(e: MouseEvent) { if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) { setDropdownOpen(false); } } document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, []); function sectionHref(anchor: string) { return isHome ? `#${anchor}` : `/#${anchor}`; } const displayName = user?.name || user?.displayName || shortenPubkey(user?.pubkey || ""); const isStaff = user?.role === "ADMIN" || user?.role === "MODERATOR"; function handleLogout() { setDropdownOpen(false); setOpen(false); logout(); router.push("/"); } return ( ); }