import { useEffect, useRef, useState } from 'react' import { X } from 'lucide-react' import type { Category, CategoryFormData } from '../types/category' import { flattenCategories } from '../utils/categories' import { SearchableSelect } from './SearchableSelect' import styles from './CategoryModal.module.css' interface CategoryModalProps { open: boolean onClose: () => void onSubmit: (data: CategoryFormData) => void categories: Category[] defaultParentId?: string editingCategory?: Category | null title?: string isSubmitting?: boolean } const ANIMATION_MS = 220 export function CategoryModal({ open, onClose, onSubmit, categories, defaultParentId = '', editingCategory = null, title = 'Add Category', isSubmitting = false, }: CategoryModalProps) { const formRef = useRef(null) const [mounted, setMounted] = useState(open) const [closing, setClosing] = useState(false) const [parentId, setParentId] = useState(defaultParentId) const [nameEn, setNameEn] = useState('') const [nameFa, setNameFa] = useState('') const [description, setDescription] = useState('') useEffect(() => { if (open) { setMounted(true) setClosing(false) setParentId(editingCategory?.parentId ?? defaultParentId) setNameEn(editingCategory?.nameEn ?? '') setNameFa(editingCategory?.nameFa ?? '') setDescription(editingCategory?.description ?? '') } else if (mounted) { setClosing(true) const timer = setTimeout(() => { setMounted(false) setClosing(false) }, ANIMATION_MS) return () => clearTimeout(timer) } }, [open, defaultParentId, editingCategory, mounted]) useEffect(() => { if (!mounted || closing) return const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose() } document.addEventListener('keydown', onKey) return () => document.removeEventListener('keydown', onKey) }, [mounted, closing, onClose]) if (!mounted) return null function handleSubmit(e: React.FormEvent) { e.preventDefault() onSubmit({ parentId, nameFa: nameFa.trim(), nameEn: nameEn.trim(), description: description.trim(), }) } const parentOptions = flattenCategories( categories.filter((category) => category.id !== editingCategory?.id), ) return (
e.stopPropagation()} role="dialog" aria-modal="true" aria-labelledby="category-modal-title" >

{title}

setNameFa(e.target.value)} required disabled={isSubmitting} />
setNameEn(e.target.value)} required disabled={isSubmitting} />