import { useEffect, useRef, useState } from 'react' import { ChevronDown, Search, X } from 'lucide-react' import { useLocale } from '@meshkee/dashboard-ui' import { useT } from '../i18n/useT' import type { FlatCategory } from '../types/category' import styles from './SearchableSelect.module.css' interface SearchableSelectProps { options: FlatCategory[] value: string onChange: (value: string) => void placeholder?: string allowEmpty?: boolean } function categoryLabel(cat: FlatCategory, isFa: boolean) { if (isFa) { return cat.nameFa ? `${cat.nameFa}${cat.nameEn ? ` / ${cat.nameEn}` : ''}` : cat.nameEn } return cat.nameEn ? `${cat.nameEn}${cat.nameFa ? ` / ${cat.nameFa}` : ''}` : cat.nameFa } export function SearchableSelect({ options, value, onChange, placeholder, allowEmpty = true, }: SearchableSelectProps) { const t = useT() const { locale } = useLocale() const isFa = locale === 'fa' const [open, setOpen] = useState(false) const [query, setQuery] = useState('') const containerRef = useRef(null) const inputRef = useRef(null) const selected = options.find((o) => o.id === value) const selectedLabel = selected ? categoryLabel(selected, isFa) : '' const searchPlaceholder = placeholder ?? t('categories.select.search') const filtered = options.filter((cat) => { const q = query.trim().toLowerCase() if (!q) return true return ( cat.nameEn.toLowerCase().includes(q) || cat.nameFa.includes(query.trim()) ) }) useEffect(() => { if (!open) return const onClickOutside = (e: MouseEvent) => { if (containerRef.current && !containerRef.current.contains(e.target as Node)) { setOpen(false) setQuery('') } } document.addEventListener('mousedown', onClickOutside) return () => document.removeEventListener('mousedown', onClickOutside) }, [open]) function selectOption(id: string) { onChange(id) setOpen(false) setQuery('') } function handleFocus() { setOpen(true) } return (
{ setQuery(e.target.value) if (!open) setOpen(true) }} onFocus={handleFocus} dir={isFa ? 'rtl' : 'ltr'} /> {value && !open && ( )}
{open && (
    {allowEmpty ? (
  • ) : null} {filtered.length === 0 ? (
  • {t('categories.select.empty')}
  • ) : ( filtered.map((cat) => (
  • )) )}
)}
) }