"use client" import { Github, LayoutDashboard, LogOut, PlusCircle, Search, Star } from "lucide-react" import Link from "next/link" import { useEffect, useState } from "react" import { LoginModal } from "@/components/login-modal" import { ThemeSwitcher } from "@/components/theme-switcher" import { REPO_NAME, REPO_PATH } from "@/constants" import { getIconsArray } from "@/lib/api" import { pb } from "@/lib/pb" import type { IconWithName } from "@/types/icons" import { CommandMenu } from "./command-menu" import { HeaderNav } from "./header-nav" import { Avatar, AvatarFallback, AvatarImage } from "./ui/avatar" import { Button } from "./ui/button" import { DropdownMenu, DropdownMenuContent, DropdownMenuSeparator, DropdownMenuTrigger } from "./ui/dropdown-menu" import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "./ui/tooltip" interface UserData { username: string email: string avatar?: string } function formatStars(stars: number): string { if (stars >= 1000) { return `${(stars / 1000).toFixed(1)}K` } return stars.toString() } export function Header() { const [iconsData, setIconsData] = useState([]) const [isLoaded, setIsLoaded] = useState(false) const [commandMenuOpen, setCommandMenuOpen] = useState(false) const [loginModalOpen, setLoginModalOpen] = useState(false) const [isLoggedIn, setIsLoggedIn] = useState(false) const [userData, setUserData] = useState(undefined) const [stars, setStars] = useState(0) useEffect(() => { async function loadIcons() { try { const icons = await getIconsArray() setIconsData(icons) setIsLoaded(true) } catch (error) { console.error("Failed to load icons:", error) setIsLoaded(true) } } loadIcons() }, []) useEffect(() => { async function fetchStars() { try { const response = await fetch(`https://api.github.com/repos/${REPO_NAME}`) const data = await response.json() setStars(Math.round(data.stargazers_count / 100) * 100) } catch (error) { console.error("Failed to fetch stars:", error) } } fetchStars() }, []) useEffect(() => { const updateAuthState = () => { if (pb.authStore.isValid && pb.authStore.record) { setIsLoggedIn(true) setUserData({ username: pb.authStore.record.username || pb.authStore.record.email, email: pb.authStore.record.email, avatar: pb.authStore.record.avatar ? `${pb.baseURL}/api/files/_pb_users_auth_/${pb.authStore.record.id}/${pb.authStore.record.avatar}` : undefined, }) } else { setIsLoggedIn(false) setUserData(undefined) } } updateAuthState() const unsubscribe = pb.authStore.onChange(() => { updateAuthState() }) return () => { unsubscribe() } }, []) const openCommandMenu = () => { setCommandMenuOpen(true) } const handleSignOut = () => { pb.authStore.clear() } const handleSubmitClick = () => { if (!isLoggedIn) { setLoginModalOpen(true) } } return (
Dashboard Icons
{/* Desktop search button */}
{/* Mobile search button */}
{/* Mobile Submit Button */}
{isLoggedIn ? ( ) : ( )}
{isLoggedIn ? ( ) : ( )}

View on GitHub

{isLoggedIn && userData && (
{userData.username.slice(0, 2).toUpperCase()}

{userData.username}

{userData.email}

)}
{/* Single instance of CommandMenu */} {isLoaded && } {/* Login Modal */}
) }