import React, { useState, useEffect } from 'react'; import { Modal, Box, Typography, TextField, Button, CircularProgress, Alert, FormControl, InputLabel, Select, MenuItem, FormControlLabel, Checkbox } from '@mui/material'; import type { PublicacionDto } from '../../../models/dtos/Distribucion/PublicacionDto'; import type { CreatePublicacionDto } from '../../../models/dtos/Distribucion/CreatePublicacionDto'; import type { UpdatePublicacionDto } from '../../../models/dtos/Distribucion/UpdatePublicacionDto'; import type { EmpresaDto } from '../../../models/dtos/Distribucion/EmpresaDto'; import empresaService from '../../../services/Distribucion/empresaService'; // Para cargar empresas const modalStyle = { /* ... (mismo estilo) ... */ position: 'absolute' as 'absolute', top: '50%', left: '50%', transform: 'translate(-50%, -50%)', width: { xs: '90%', sm: 500 }, bgcolor: 'background.paper', border: '2px solid #000', boxShadow: 24, p: 4, maxHeight: '90vh', overflowY: 'auto' }; interface PublicacionFormModalProps { open: boolean; onClose: () => void; onSubmit: (data: CreatePublicacionDto | UpdatePublicacionDto, id?: number) => Promise; initialData?: PublicacionDto | null; errorMessage?: string | null; clearErrorMessage: () => void; } const PublicacionFormModal: React.FC = ({ open, onClose, onSubmit, initialData, errorMessage, clearErrorMessage }) => { const [nombre, setNombre] = useState(''); const [observacion, setObservacion] = useState(''); const [idEmpresa, setIdEmpresa] = useState(''); const [ctrlDevoluciones, setCtrlDevoluciones] = useState(false); const [habilitada, setHabilitada] = useState(true); const [empresas, setEmpresas] = useState([]); const [loading, setLoading] = useState(false); const [loadingEmpresas, setLoadingEmpresas] = useState(false); const [localErrors, setLocalErrors] = useState<{ [key: string]: string | null }>({}); const isEditing = Boolean(initialData); useEffect(() => { const fetchEmpresas = async () => { setLoadingEmpresas(true); try { const data = await empresaService.getAllEmpresas(); setEmpresas(data); } catch (error) { console.error("Error al cargar empresas", error); setLocalErrors(prev => ({...prev, empresas: 'Error al cargar empresas.'})); } finally { setLoadingEmpresas(false); } }; if (open) { fetchEmpresas(); setNombre(initialData?.nombre || ''); setObservacion(initialData?.observacion || ''); setIdEmpresa(initialData?.idEmpresa || ''); setCtrlDevoluciones(initialData ? initialData.ctrlDevoluciones : false); setHabilitada(initialData ? initialData.habilitada : true); setLocalErrors({}); clearErrorMessage(); } }, [open, initialData, clearErrorMessage]); const validate = (): boolean => { const errors: { [key: string]: string | null } = {}; if (!nombre.trim()) errors.nombre = 'El nombre es obligatorio.'; if (!idEmpresa) errors.idEmpresa = 'Debe seleccionar una empresa.'; setLocalErrors(errors); return Object.keys(errors).length === 0; }; const handleInputChange = (fieldName: string) => { if (localErrors[fieldName]) { setLocalErrors(prev => ({ ...prev, [fieldName]: null })); } if (errorMessage) clearErrorMessage(); }; const handleSubmit = async (event: React.FormEvent) => { event.preventDefault(); clearErrorMessage(); if (!validate()) return; setLoading(true); try { const dataToSubmit = { nombre, observacion: observacion || undefined, idEmpresa: Number(idEmpresa), ctrlDevoluciones, habilitada }; if (isEditing && initialData) { await onSubmit(dataToSubmit as UpdatePublicacionDto, initialData.idPublicacion); } else { await onSubmit(dataToSubmit as CreatePublicacionDto); } onClose(); } catch (error: any) { console.error("Error en submit de PublicacionFormModal:", error); } finally { setLoading(false); } }; return ( {isEditing ? 'Editar Publicación' : 'Agregar Nueva Publicación'} {setNombre(e.target.value); handleInputChange('nombre');}} margin="dense" fullWidth error={!!localErrors.nombre} helperText={localErrors.nombre || ''} disabled={loading} autoFocus={!isEditing} /> Empresa {localErrors.idEmpresa && {localErrors.idEmpresa}} setObservacion(e.target.value)} margin="dense" fullWidth multiline rows={3} disabled={loading} /> setCtrlDevoluciones(e.target.checked)} disabled={loading}/>} label="Controla Devoluciones" /> setHabilitada(e.target.checked)} disabled={loading}/>} label="Habilitada" /> {errorMessage && {errorMessage}} {localErrors.empresas && {localErrors.empresas}} ); }; export default PublicacionFormModal;