"use client"; import { useState, useEffect } from "react"; import { useRouter } from "next/navigation"; import { Search, ScanLine } from "lucide-react"; import { detectSearchType, isValidBarcode } from "@/lib/openFoodFactsApi"; import { cn } from "@/lib/utils"; interface SearchBarProps { initialQuery?: string; className?: string; placeholder?: string; compact?: boolean; } export function SearchBar({ initialQuery = "", className = "", placeholder = "Buscar produtos ou código de barras…", compact = false, }: SearchBarProps) { const [query, setQuery] = useState(initialQuery); const [searchType, setSearchType] = useState<"barcode" | "name" | null>(null); const router = useRouter(); useEffect(() => { const cleaned = query.replace(/\D/g, ""); if (cleaned.length >= 8 && cleaned.length <= 13) { setSearchType("barcode"); } else if (query.trim()) { setSearchType("name"); } else { setSearchType(null); } }, [query]); const handleSearch = () => { if (!query.trim()) return; const type = detectSearchType(query); if (type === "barcode") { const clean = query.replace(/\D/g, ""); if (isValidBarcode(clean)) { router.push(`/produto/${clean}`); } else { router.push(`/resultados?q=${encodeURIComponent(query.trim())}`); } } else { router.push(`/resultados?q=${encodeURIComponent(query.trim())}`); } }; const handleKey = (e: React.KeyboardEvent) => { if (e.key === "Enter") handleSearch(); }; if (compact) { return (
setQuery(e.target.value)} onKeyDown={handleKey} className={cn( "w-full pl-9 pr-3 h-9 text-sm rounded border border-[var(--border-subtle)]", "bg-[var(--bg-elevated)] text-[var(--fg-primary)] placeholder-[var(--fg-faint)]", "focus:outline-none focus:border-[var(--accent)] transition-colors duration-200" )} />
); } return (
{searchType === "barcode" ? ( ) : ( )}
setQuery(e.target.value)} onKeyDown={handleKey} className={cn( "w-full pl-10 pr-4 h-10 text-sm rounded border border-[var(--border-subtle)]", "bg-[var(--bg-elevated)] text-[var(--fg-primary)] placeholder-[var(--fg-faint)]", "focus:outline-none focus:border-[var(--accent)] transition-colors duration-200" )} /> {searchType && (
{searchType === "barcode" ? "Código" : "Nome"}
)}
); }