import React, { useState, useEffect, useRef } from 'react'; import { Area } from '../../entities/Area'; import { useToast } from '../Shared/ToastContext'; import { useTranslation } from 'react-i18next'; interface AreaModalProps { isOpen: boolean; onClose: () => void; onSave: (areaData: Partial) => Promise; area?: Area | null; } const AreaModal: React.FC = ({ isOpen, onClose, area, onSave }) => { const { t } = useTranslation(); const [formData, setFormData] = useState({ id: area?.id || 0, name: area?.name || '', description: area?.description || '', }); const [error, setError] = useState(null); const modalRef = useRef(null); const [isSubmitting, setIsSubmitting] = useState(false); const [isClosing, setIsClosing] = useState(false); const { showSuccessToast, showErrorToast } = useToast(); useEffect(() => { if (isOpen) { setFormData({ id: area?.id || 0, name: area?.name || '', description: area?.description || '', }); setError(null); } }, [isOpen, area]); useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if ( modalRef.current && !modalRef.current.contains(event.target as Node) ) { handleClose(); } }; if (isOpen) { document.addEventListener('mousedown', handleClickOutside); } return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, [isOpen]); useEffect(() => { const handleKeyDown = (event: KeyboardEvent) => { if (event.key === 'Escape') { handleClose(); } }; if (isOpen) { document.addEventListener('keydown', handleKeyDown); } return () => { document.removeEventListener('keydown', handleKeyDown); }; }, [isOpen]); const handleChange = ( e: React.ChangeEvent ) => { const { name, value } = e.target; setFormData((prev) => ({ ...prev, [name]: value, })); }; const handleSubmit = async () => { if (!formData.name.trim()) { setError(t('errors.areaNameRequired')); return; } setIsSubmitting(true); setError(null); try { await onSave(formData); showSuccessToast(formData.id ? t('success.areaUpdated') : t('success.areaCreated')); handleClose(); } catch (err) { setError((err as Error).message); showErrorToast(t('errors.failedToSaveArea')); } finally { setIsSubmitting(false); } }; const handleClose = () => { setIsClosing(true); setTimeout(() => { onClose(); setIsClosing(false); }, 300); }; if (!isOpen) return null; return ( {/* Area Name */} {/* Area Description */} {t('forms.areaDescription')} {/* Error Message */} {error && {error}} {/* Action Buttons */} {t('common.cancel')} {isSubmitting ? t('modals.submitting') : formData.id && formData.id !== 0 ? t('modals.updateArea') : t('modals.createArea')} ); }; export default AreaModal;