import React, { useState, useRef, useEffect } from 'react'; import { ChevronDown, Check } from 'lucide-react'; export interface Option { value: string | number; label: string; } interface CustomSelectProps { value: string | number; onChange: (value: any) => void; options: Option[]; placeholder?: string; icon?: React.ReactNode; className?: string; disabled?: boolean; } export const CustomSelect: React.FC = ({ value, onChange, options, placeholder = 'Selecione...', icon, className = '', disabled = false }) => { const [isOpen, setIsOpen] = useState(false); const containerRef = useRef(null); const selectedOption = options.find(o => o.value === 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); }, []); return (
!disabled && setIsOpen(!isOpen)} className={`w-full p-3 bg-white border rounded-xl flex justify-between items-center cursor-pointer text-sm transition-all shadow-sm ${isOpen ? 'border-primary-500 ring-2 ring-primary-100' : 'border-slate-200 hover:border-primary-300'} ${disabled ? 'opacity-50 cursor-not-allowed bg-slate-50' : ''} `} >
{icon && {icon}} {selectedOption ? selectedOption.label : placeholder}
{isOpen && !disabled && (
{options.map((option) => (
{ onChange(option.value); setIsOpen(false); }} className={`p-3 text-sm cursor-pointer flex justify-between items-center transition-colors border-b border-slate-50 last:border-0 ${option.value === value ? 'bg-primary-50 text-primary-700 font-bold' : 'text-slate-600 hover:bg-slate-50 hover:text-slate-900'} `} > {option.label} {option.value === value && }
))} {options.length === 0 && (
Sem opções
)}
)}
); };