import React, { useState, useRef, useEffect } from 'react'; import { ChevronDown } from './ChevronDown'; import { CustomSelectProps } from './types'; import { CustomSelectContainer, CustomSelectTrigger, CustomSelectChevron, CustomSelectOptionsList, CustomSelectOption } from './styles'; export const CustomSelect: React.FC = ({ id, value, options, onChange, $hasError, isApp, placeholder }) => { const [isOpen, setIsOpen] = useState(false); const containerRef = useRef(null); const selectedOption = options.find(o => o.value === value); const selectedLabel = selectedOption ? selectedOption.label : placeholder || ''; useEffect(() => { const handleClickOutside = (e: MouseEvent) => { if ( containerRef.current && !containerRef.current.contains(e.target as Node) ) { setIsOpen(false); } }; document.addEventListener('mousedown', handleClickOutside); return () => document.removeEventListener('mousedown', handleClickOutside); }, []); return ( setIsOpen(prev => !prev)} $hasError={$hasError} isApp={isApp} $isPlaceholder={!selectedOption} aria-expanded={isOpen} aria-haspopup="listbox" > {selectedLabel} {isOpen && ( {options.map(o => ( { onChange(o.value); setIsOpen(false); }} > {o.label} ))} )} ); };