import { Link, useMatchRoute, useNavigate } from "@tanstack/react-router"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { useAuth } from "../hooks/useAuth"; import { LucideIcon } from "../lib/iconData"; import { useUIStore } from "../stores/uiStore"; import { UserMenu } from "./UserMenu"; interface NavLinkOrButtonProps { to: string; isActive: boolean; isProtected: boolean; isAuthenticated: boolean; onAuthPrompt: () => void; children: React.ReactNode; } function NavLinkOrButton({ to, isActive, isProtected, isAuthenticated, onAuthPrompt, children, }: NavLinkOrButtonProps) { const activeClass = "text-gray-900 font-medium"; const inactiveClass = "text-gray-500 hover:text-gray-700 transition-colors"; const className = `text-sm ${isActive ? activeClass : inactiveClass}`; if (isProtected && !isAuthenticated) { return ( ); } return ( {children} ); } export function TopNav() { const { t } = useTranslation(); const { data: auth } = useAuth(); const isAuthenticated = !!auth?.user; const openAuthPrompt = useUIStore((s) => s.openAuthPrompt); const matchRoute = useMatchRoute(); const navigate = useNavigate(); const [searchQuery, setSearchQuery] = useState(""); const isHome = !!matchRoute({ to: "/" }); const isCollection = !!matchRoute({ to: "/collection", fuzzy: true }); const isSetups = !!matchRoute({ to: "/setups", fuzzy: true }); function handleSearch() { const trimmed = searchQuery.trim(); if (!trimmed) return; navigate({ to: "/global-items", search: { q: trimmed } }); setSearchQuery(""); } return (