import React, { useState } from "react"; interface Option { value: string; text: string; selected: boolean; } interface MultiSelectProps { label: string; options: Option[]; defaultSelected?: string[]; onChange?: (selected: string[]) => void; disabled?: boolean; } const MultiSelect: React.FC = ({ label, options, defaultSelected = [], onChange, disabled = false, }) => { const [selectedOptions, setSelectedOptions] = useState(defaultSelected); const [isOpen, setIsOpen] = useState(false); const toggleDropdown = () => { if (disabled) return; setIsOpen((prev) => !prev); }; const handleSelect = (optionValue: string) => { const newSelectedOptions = selectedOptions.includes(optionValue) ? selectedOptions.filter((value) => value !== optionValue) : [...selectedOptions, optionValue]; setSelectedOptions(newSelectedOptions); if (onChange) onChange(newSelectedOptions); }; const removeOption = (index: number, value: string) => { const newSelectedOptions = selectedOptions.filter((opt) => opt !== value); setSelectedOptions(newSelectedOptions); if (onChange) onChange(newSelectedOptions); }; const selectedValuesText = selectedOptions.map( (value) => options.find((option) => option.value === value)?.text || "" ); return (
{selectedValuesText.length > 0 ? ( selectedValuesText.map((text, index) => (
{text}
removeOption(index, selectedOptions[index]) } className="pl-2 text-gray-500 cursor-pointer group-hover:text-gray-400 dark:text-gray-400" >
)) ) : ( )}
{isOpen && (
e.stopPropagation()} >
{options.map((option, index) => (
handleSelect(option.value)} >
{option.text}
))}
)}
); }; export default MultiSelect;