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 (
{/* Left: Logo */} GearBox {/* Center: Desktop nav links */} {/* Right: Search bar (desktop only) + User section */}
{/* Search bar — desktop only */}
setSearchQuery(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") handleSearch(); }} placeholder={t("nav.searchPlaceholder")} className="bg-gray-50 border border-gray-200 rounded-lg pl-9 pr-3 py-2 text-sm text-gray-900 placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-gray-200 focus:border-gray-300 w-48 lg:w-64 transition-colors" />
{/* User section */} {isAuthenticated ? ( ) : ( {t("auth.signIn")} )}
); }