"use client"; import { useState, useEffect, useRef } from "react"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Search, X, Loader2 } from "lucide-react"; import Image from "next/image"; import { cn } from "@/lib/utils"; interface Item { id: number; name: string; category?: string; image?: string; rarity?: string; level?: number; weight?: number; npc_price?: number; [key: string]: any; } interface ItemSearchProps { onItemSelect: (item: Item) => void; selectedItem?: Item | null; placeholder?: string; className?: string; } export function ItemSearch({ onItemSelect, selectedItem, placeholder = "Pesquisar item...", className, }: ItemSearchProps) { const [searchQuery, setSearchQuery] = useState(""); const [items, setItems] = useState([]); const [loading, setLoading] = useState(false); const [showDropdown, setShowDropdown] = useState(false); const [previewItem, setPreviewItem] = useState(selectedItem || null); const searchRef = useRef(null); const debounceRef = useRef(undefined); // Buscar itens ao digitar useEffect(() => { if (debounceRef.current) { clearTimeout(debounceRef.current); } if (searchQuery.trim().length < 2) { setItems([]); setShowDropdown(false); return; } setLoading(true); debounceRef.current = setTimeout(async () => { try { const res = await fetch( `/api/items?q=${encodeURIComponent(searchQuery)}&pageSize=10` ); if (res.ok) { const data = await res.json(); setItems(data.items || []); setShowDropdown(true); } } catch (error) { console.error("Erro ao buscar itens:", error); } finally { setLoading(false); } }, 300); }, [searchQuery]); // Fechar dropdown ao clicar fora useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (searchRef.current && !searchRef.current.contains(event.target as Node)) { setShowDropdown(false); } }; document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, []); // Atualizar preview quando item selecionado mudar externamente useEffect(() => { if (selectedItem) { setPreviewItem(selectedItem); setSearchQuery(selectedItem.name); } }, [selectedItem]); const handleItemClick = (item: Item) => { setPreviewItem(item); setSearchQuery(item.name); setShowDropdown(false); onItemSelect(item); }; const handleClear = () => { setSearchQuery(""); setPreviewItem(null); setItems([]); setShowDropdown(false); onItemSelect(null as any); }; return (
setSearchQuery(e.target.value)} onFocus={() => searchQuery.length >= 2 && setShowDropdown(true)} placeholder={placeholder} className="pl-9 pr-9" /> {searchQuery && ( )} {loading && ( )}
{/* Dropdown de resultados */} {showDropdown && items.length > 0 && (
{items.map((item) => (
handleItemClick(item)} > {item.image && (
{item.name}
)}

{item.name}

{item.category && (

{item.category}

)}
{item.rarity && ( {item.rarity} )}
))}
)} {/* Preview do item selecionado */} {previewItem && (
{previewItem.image && (
{previewItem.name}
)}

{previewItem.name}

{previewItem.category && ( Categoria: {previewItem.category} )} {previewItem.rarity && ( {previewItem.rarity} )} {previewItem.level !== undefined && previewItem.level !== null && ( Level: {previewItem.level} )} {previewItem.weight !== undefined && previewItem.weight !== null && ( Peso: {previewItem.weight} oz )} {previewItem.npc_price !== undefined && previewItem.npc_price !== null && ( Preço NPC: {previewItem.npc_price.toLocaleString()} gp )}
)}
); }