import { useEffect, useRef, useState, type FC, type MouseEvent as ReactMouseEvent } from 'react' import { ArrowDown2, CloseCircle, TickSquare } from 'iconsax-react' import { clx } from '../helpers/utils' import type { ItemsSelectType } from './Select' type Props = { className?: string items: ItemsSelectType[] value: string[] onChange: (value: string[]) => void onBlur?: () => void error_text?: string placeholder?: string label?: string disabled?: boolean } const MultiSelect: FC = ({ className, items, value, onChange, onBlur, error_text, placeholder = 'انتخاب کنید', label, disabled, }) => { const [isOpen, setIsOpen] = useState(false) const wrapperRef = useRef(null) const selectedValues = value ?? [] useEffect(() => { const handleClickOutside = (e: MouseEvent) => { if (wrapperRef.current && !wrapperRef.current.contains(e.target as Node)) { if (isOpen) { setIsOpen(false) onBlur?.() } } } document.addEventListener('mousedown', handleClickOutside) return () => document.removeEventListener('mousedown', handleClickOutside) }, [isOpen, onBlur]) const selectedItems = items.filter((item) => selectedValues.includes(String(item.value)), ) const toggleValue = (itemValue: string) => { if (selectedValues.includes(itemValue)) { onChange(selectedValues.filter((v) => v !== itemValue)) } else { onChange([...selectedValues, itemValue]) } } const handleClear = (e: ReactMouseEvent) => { e.stopPropagation() onChange([]) onBlur?.() } const displayText = selectedItems.length === 0 ? placeholder : selectedItems.length <= 2 ? selectedItems.map((item) => item.label).join('، ') : `${selectedItems.length} مورد انتخاب شده` return (
{label && ( )}
{selectedItems.length > 0 && ( )} {isOpen && (
{items.length === 0 ? (
موردی برای انتخاب نیست
) : (
    {items.map((item) => { const itemValue = String(item.value) const isSelected = selectedValues.includes(itemValue) return (
  • ) })}
)}
)}
{selectedItems.length > 0 && (
{selectedItems.map((item) => ( {item.label} ))}
)} {error_text ? (
{error_text}
) : null}
) } export default MultiSelect