"use client"; import { useQuery, useQueryClient } from "@tanstack/react-query"; import { useEffect, useState, useTransition } from "react"; import { Input } from "@/shared/components/ui/input"; import { Popover, PopoverContent, PopoverTrigger, } from "@/shared/components/ui/popover"; import { Spinner } from "@/shared/components/ui/spinner"; import { buildLogoDevUrl, logoQueryKeys, toNameKey, } from "@/shared/lib/logo"; import { removeEstablishmentLogoAction, saveEstablishmentLogoAction, } from "@/shared/lib/logo/establishment-logo-actions"; import { buildInitials, getCategoryBgColorFromName, getCategoryColorFromName, } from "@/shared/utils/category-colors"; import { cn } from "@/shared/utils/ui"; interface LogoResult { name: string; domain: string; } async function fetchLogoResults(query: string): Promise { if (!query.trim()) return []; const res = await fetch( `/api/logo/search?q=${encodeURIComponent(query.trim())}`, ); if (!res.ok) return []; const data = await res.json(); return Array.isArray(data) ? data : []; } interface EstablishmentLogoPickerProps { name: string; resolvedDomain: string | null; open: boolean; onOpenChange: (open: boolean) => void; onSelect: (domain: string | null) => void; children: React.ReactNode; } export function EstablishmentLogoPicker({ name, resolvedDomain, open, onOpenChange, onSelect, children, }: EstablishmentLogoPickerProps) { const [isPending, startTransition] = useTransition(); const [searchInput, setSearchInput] = useState(name); const [debouncedSearch, setDebouncedSearch] = useState(name); const queryClient = useQueryClient(); useEffect(() => { if (open) { setSearchInput(name); setDebouncedSearch(name); } }, [open, name]); useEffect(() => { const timer = setTimeout(() => setDebouncedSearch(searchInput), 400); return () => clearTimeout(timer); }, [searchInput]); const { data: results = [], isLoading } = useQuery({ queryKey: logoQueryKeys.search(debouncedSearch), queryFn: () => fetchLogoResults(debouncedSearch), enabled: open && debouncedSearch.trim().length > 0, staleTime: 1000 * 60 * 60, }); function handleSelect(domain: string) { startTransition(async () => { await saveEstablishmentLogoAction(name, domain); queryClient.setQueryData(logoQueryKeys.mapping(toNameKey(name)), { domain }); onSelect(domain); }); } function handleReset() { startTransition(async () => { await removeEstablishmentLogoAction(name); queryClient.setQueryData(logoQueryKeys.mapping(toNameKey(name)), { domain: null, }); onSelect(null); }); } return ( {children}

Escolha um logo para {name}

setSearchInput(e.target.value)} placeholder="Buscar marca..." className="mb-3 h-8 text-sm" autoFocus /> {isLoading ? (
) : (
{results.map((r) => ( ))}
)}
); }