"use client"; import { useState } from "react"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { cn } from "@/lib/utils/ui"; import Image from "next/image"; import { deriveNameFromLogo } from "@/lib/logo"; const DEFAULT_BASE_PATH = "/logos"; const resolveLogoSrc = (logo: string, basePath: string) => { if (/^https?:\/\//.test(logo)) { return logo; } return `${basePath.replace(/\/$/, "")}/${logo.replace(/^\//, "")}`; }; interface LogoPickerTriggerProps { selectedLogo?: string | null; disabled?: boolean; helperText?: string; placeholder?: string; basePath?: string; onOpen: () => void; className?: string; } export function LogoPickerTrigger({ selectedLogo, disabled, helperText = "Clique para trocar o logo", placeholder = "Selecionar logo", basePath = DEFAULT_BASE_PATH, onOpen, className, }: LogoPickerTriggerProps) { const hasLogo = Boolean(selectedLogo); const selectedLogoLabel = deriveNameFromLogo(selectedLogo); const selectedLogoPath = hasLogo && selectedLogo ? resolveLogoSrc(selectedLogo, basePath) : null; return ( ); } interface LogoPickerDialogProps { open: boolean; logos: string[]; value: string; onOpenChange: (open: boolean) => void; onSelect: (logo: string) => void; basePath?: string; title?: string; description?: string; emptyState?: React.ReactNode; } export function LogoPickerDialog({ open, logos, value, onOpenChange, onSelect, basePath = DEFAULT_BASE_PATH, title = "Escolher logo", description = "Selecione o logo que será usado para identificar este item.", emptyState, }: LogoPickerDialogProps) { const [search, setSearch] = useState(""); const filteredLogos = logos.filter((logo) => { if (!search.trim()) return true; const logoLabel = deriveNameFromLogo(logo).toLowerCase(); return logoLabel.includes(search.toLowerCase().trim()); }); const handleOpenChange = (isOpen: boolean) => { if (!isOpen) setSearch(""); onOpenChange(isOpen); }; return ( {title} {description ? ( {description} ) : null} {logos.length > 0 && ( setSearch(e.target.value)} className="h-8 text-sm" /> )} {logos.length === 0 ? ( emptyState ?? (

Nenhum logo encontrado. Adicione arquivos na pasta de logos.

) ) : filteredLogos.length === 0 ? (

Nenhum logo encontrado para “{search}”

) : (
{filteredLogos.map((logo) => { const isActive = value === logo; const logoLabel = deriveNameFromLogo(logo); return ( ); })}
)}
); }