import React, { useState, useRef } from 'react'; import useClickOutside from 'lib/hooks/useClickOutside'; import * as S from './Select.styled'; import LiveIcon from './LiveIcon.styled'; export interface SelectProps { options?: Array; id?: string; name?: string; selectSize?: 'M' | 'L'; isLive?: boolean; minWidth?: string; value?: string | number; defaultValue?: string | number; placeholder?: string; disabled?: boolean; onChange?: (option: string | number) => void; } export interface SelectOption { label: string | number; value: string | number; disabled?: boolean; isLive?: boolean; } const Select: React.FC = ({ options = [], value, defaultValue, selectSize = 'L', placeholder = '', isLive, disabled = false, onChange, ...props }) => { const [selectedOption, setSelectedOption] = useState(value); const [showOptions, setShowOptions] = useState(false); const showOptionsHandler = () => { if (!disabled) setShowOptions(!showOptions); }; const selectContainerRef = useRef(null); const clickOutsideHandler = () => setShowOptions(false); useClickOutside(selectContainerRef, clickOutsideHandler); const updateSelectedOption = (option: SelectOption) => { if (disabled) return; setSelectedOption(option.value); if (onChange) onChange(option.value); setShowOptions(false); }; React.useEffect(() => { setSelectedOption(value); }, [isLive, value]); return (
{isLive && } {options.find( (option) => option.value === (defaultValue || selectedOption) )?.label || placeholder} {showOptions && ( {options?.map((option) => ( updateSelectedOption(option)} tabIndex={0} role="option" > {option.isLive && } {option.label} ))} )}
); }; export default Select;