import React, { useEffect, useState } from 'react'; import { View, Text, TouchableOpacity } from 'react-native'; import { IColors, colorMatch } from '../../utils'; import { Button } from '../Button'; import { styles } from './select.style'; export type SelectOption = { label: string; value: string | number; }; type ISelect = { search?: boolean; disabledOptions?: Array; borderColor?: string; }; interface MultipleSelectProps extends ISelect { multiple: true; value: SelectOption[]; onChange: (value: SelectOption[]) => void; } interface SingleSelectProps extends ISelect { multiple?: false; value?: SelectOption; onChange: (value: SelectOption | undefined) => void; } type SelectProps = { options: SelectOption[]; color?: IColors; placeholder?: string; } & (SingleSelectProps | MultipleSelectProps); export const Select: React.FC = ({ multiple, value, onChange, options, color = 'blue', placeholder, disabledOptions, borderColor, }) => { const [isOpen, setIsOpen] = useState(false); const [activeColor, setActiveColor] = useState(colorMatch(color)); useEffect(() => { setActiveColor(colorMatch(color)); }, [color]); function clearOptions() { multiple ? onChange([]) : onChange(undefined); } function selectOption(option: SelectOption) { if (multiple) { if (value.includes(option)) { onChange(value.filter((o) => o !== option)); } else { onChange([...value, option]); } } else { if (option !== value) { onChange(option); } } } function isOptionSelected(option: SelectOption) { return multiple ? value.includes(option) : option === value; } return ( setIsOpen(false)} style={[styles.container, borderColor ? { borderColor } : {}]} activeOpacity={0.7} onPress={() => setIsOpen((prev) => !prev)} > {(!value || (multiple && value.length === 0)) && ( {placeholder} )} {multiple ? ( value.map((v) => (