import React, { useState, useEffect } from 'react'; import { Dialog } from '@headlessui/react'; import { XMarkIcon } from '@heroicons/react/24/outline'; import toast from 'react-hot-toast'; import { useTranslation } from 'react-i18next'; import logger from '../../utils/logger'; interface LpmedioEntry { _id: string; rut: string; nombre: string; tipoPersona: 'Empresa' | 'Persona'; tipoLista: string; nombreSubLista: string; fechaIncorporacion: string; } interface LpmedioModalProps { isOpen: boolean; onClose: () => void; entry?: LpmedioEntry; onSuccess: () => void; } const API_URL = globalThis.__APP_ENV__?.VITE_API_BASE_URL || 'https://duxiter.azurianlab.com/api'; const LpmedioModal: React.FC = ({ isOpen, onClose, entry, onSuccess }) => { const { t } = useTranslation(); const [formData, setFormData] = useState({ rut: '', nombre: '', tipoPersona: 'Empresa' as 'Empresa' | 'Persona', tipoLista: 'Mediano Impacto', nombreSubLista: '', fechaIncorporacion: new Date().toISOString().split('T')[0] }); useEffect(() => { if (entry) { setFormData({ rut: entry.rut, nombre: entry.nombre, tipoPersona: entry.tipoPersona, tipoLista: entry.tipoLista, nombreSubLista: entry.nombreSubLista, fechaIncorporacion: new Date(entry.fechaIncorporacion).toISOString().split('T')[0] }); } else { setFormData({ rut: '', nombre: '', tipoPersona: 'Empresa', tipoLista: 'Mediano Impacto', nombreSubLista: '', fechaIncorporacion: new Date().toISOString().split('T')[0] }); } }, [entry]); // Sanitize RUT: remove dots, keep dash const sanitizeRut = (rut: string): string => { return rut.replace(/\./g, ''); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); try { const token = localStorage.getItem('token'); const url = entry ? `${API_URL}/lpmedio/${entry._id}` : `${API_URL}/lpmedio`; // Create a copy of formData with sanitized RUT const sanitizedFormData = { ...formData, rut: sanitizeRut(formData.rut) }; const response = await fetch(url, { method: entry ? 'PUT' : 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, body: JSON.stringify(sanitizedFormData) }); if (!response.ok) { throw new Error(entry ? t('lpmedioModal.errors.updateError') : t('lpmedioModal.errors.createError')); } toast.success(entry ? t('lpmedioModal.messages.updateSuccess') : t('lpmedioModal.messages.createSuccess')); onSuccess(); onClose(); } catch (error) { logger.error('Error:', error); toast.error(entry ? t('lpmedioModal.errors.updateError') : t('lpmedioModal.errors.createError')); } }; return ( ); }; export default LpmedioModal;