import React, { useState, useRef, useEffect } from 'react'; interface SelectProps { value?: string; onValueChange?: (value: string) => void; disabled?: boolean; className?: string; placeholder?: string; children: React.ReactNode; } interface SelectTriggerProps { children: React.ReactNode; className?: string; } interface SelectContentProps { children: React.ReactNode; className?: string; } interface SelectItemProps { value: string; children: React.ReactNode; className?: string; } interface SelectValueProps { placeholder?: string; className?: string; } export function Select({ value, onValueChange, disabled = false, className = '', placeholder, children }: SelectProps) { const [isOpen, setIsOpen] = useState(false); const [selectedValue, setSelectedValue] = useState(value || ''); const [selectedLabel, setSelectedLabel] = useState(''); const selectRef = useRef(null); useEffect(() => { setSelectedValue(value || ''); }, [value]); useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (selectRef.current && !selectRef.current.contains(event.target as Node)) { setIsOpen(false); } }; document.addEventListener('mousedown', handleClickOutside); return () => document.removeEventListener('mousedown', handleClickOutside); }, []); const handleSelect = (value: string, label: string) => { setSelectedValue(value); setSelectedLabel(label); onValueChange?.(value); setIsOpen(false); }; return (
{React.Children.map(children, (child) => { if (React.isValidElement(child)) { if (child.type === SelectTrigger) { return React.cloneElement(child as any, { onClick: () => !disabled && setIsOpen(!isOpen), disabled, selectedValue: selectedValue, selectedLabel: selectedLabel, placeholder, isOpen }); } if (child.type === SelectContent && isOpen) { return React.cloneElement(child as any, { onSelect: handleSelect }); } } return child; })}
); } export function SelectTrigger({ children, className = '', onClick, disabled, selectedValue, selectedLabel, placeholder, isOpen }: SelectTriggerProps & { onClick?: () => void; disabled?: boolean; selectedValue?: string; selectedLabel?: string; placeholder?: string; isOpen?: boolean; }) { return ( ); } export function SelectContent({ children, className = '', onSelect }: SelectContentProps & { onSelect?: (value: string, label: string) => void; }) { return (
{React.Children.map(children, (child) => { if (React.isValidElement(child) && child.type === SelectItem) { return React.cloneElement(child as any, { onSelect }); } return child; })}
); } export function SelectItem({ value, children, className = '', onSelect }: SelectItemProps & { onSelect?: (value: string, label: string) => void; }) { return ( ); } export function SelectValue({ placeholder, className = '' }: SelectValueProps) { return ( {placeholder} ); }