import React, { useState, useRef, useEffect } from 'react'; import { Search, ChevronDown, X } from 'lucide-react'; interface Option { id: string; name: string; subtext?: string; } interface SearchableSelectProps { options: Option[]; value: string; onChange: (value: string) => void; placeholder: string; label: string; required?: boolean; } const SearchableSelect: React.FC = ({ options, value, onChange, placeholder, label, required = false }) => { const [isOpen, setIsOpen] = useState(false); const [searchTerm, setSearchTerm] = useState(''); const containerRef = useRef(null); const selectedOption = options.find(opt => opt.id === value); useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (containerRef.current && !containerRef.current.contains(event.target as Node)) { setIsOpen(false); } }; document.addEventListener('mousedown', handleClickOutside); return () => document.removeEventListener('mousedown', handleClickOutside); }, []); const filteredOptions = options.filter(opt => (opt.name || '').toLowerCase().includes((searchTerm || '').toLowerCase()) || (opt.subtext && (opt.subtext || '').toLowerCase().includes((searchTerm || '').toLowerCase())) ); return (
setIsOpen(!isOpen)} className={`w-full px-4 py-3 bg-slate-50 border ${isOpen ? 'border-indigo-500 ring-2 ring-indigo-500/10' : 'border-slate-200'} rounded-xl cursor-pointer flex items-center justify-between transition-all text-sm`} > {selectedOption ? selectedOption.name : placeholder}
{isOpen && (
setSearchTerm(e.target.value)} onClick={(e) => e.stopPropagation()} />
{filteredOptions.length > 0 ? ( filteredOptions.map(option => (
{ onChange(option.id); setIsOpen(false); setSearchTerm(''); }} className={`px-4 py-3 hover:bg-indigo-50 cursor-pointer transition-colors flex flex-col ${value === option.id ? 'bg-indigo-50 border-l-4 border-indigo-600' : ''}`} > {option.name} {option.subtext && ( {option.subtext} )}
)) ) : (
Nenhum resultado encontrado.
)}
)}
); }; export default SearchableSelect;