/* eslint-disable no-undef */
import React, { useState, useEffect } from 'react';
import '../styles/ViewPatient.css';
import { useNavigate } from 'react-router-dom';
import NavBar from '../components/NavBar';
import PaymentSection from '../components/PaymentSection';
import { getAllPatients, calculateAge } from '../services/patientService';
import { appointmentService } from '../services/appointmentService';
import { Eye, ClipboardList, Calendar, DollarSign, User, Search, Plus, CheckCircle } from 'lucide-react';
const ViewPatient = ({ user }) => {
const [patients, setPatients] = useState([]);
const [loading, setLoading] = useState(true);
const [searchTerm, setSearchTerm] = useState('');
const [searchInput, setSearchInput] = useState('');
const [currentPage, setCurrentPage] = useState(1);
const [totalPages, setTotalPages] = useState(1);
const [totalPatients, setTotalPatients] = useState(0);
const [patientsPerPage] = useState(10);
const navigate = useNavigate();
const [showPatientDetails, setShowPatientDetails] = useState(false);
const [showAppointmentModal, setShowAppointmentModal] = useState(false);
const [showPaymentModal, setShowPaymentModal] = useState(false);
const [selectedPatient, setSelectedPatient] = useState(null);
const [showSuccessModal, setShowSuccessModal] = useState(false);
const [successMessage, setSuccessMessage] = useState('');
const [appointmentLoading, setAppointmentLoading] = useState(false);
const [appointmentError, setAppointmentError] = useState('');
const [appointmentFormData, setAppointmentFormData] = useState({
name: '', date: '', time: '', type: '', dni: '', other_treatment: ''
});
useEffect(() => {
const controller = new AbortController();
const signal = controller.signal;
const load = async () => {
if (!user?.id) return;
try {
setLoading(true);
// clear current list while loading to avoid accidental accumulation
setPatients([]);
console.log('ViewPatient: requesting patients', { page: currentPage, pageSize: patientsPerPage, search: searchTerm });
const result = await getAllPatients(currentPage, patientsPerPage, searchTerm.trim(), signal);
if (result && result.success) {
setPatients(result.data || []);
setTotalPages(result.pagination?.totalPages || 1);
setTotalPatients(result.pagination?.totalPatients || 0);
console.log('ViewPatient: loaded', { received: (result.data || []).length, pagination: result.pagination });
} else {
// if server returned unexpected shape, fallback to empty
setPatients([]);
setTotalPages(1);
setTotalPatients(0);
}
} catch (error) {
if (error.name === 'AbortError') { console.log('ViewPatient: request aborted'); return; }
console.error(error);
} finally { setLoading(false); }
};
load();
return () => controller.abort();
}, [user, currentPage, searchTerm]);
// Trigger search only on Enter or button click
const triggerSearch = () => {
const trimmed = searchInput.trim();
if (trimmed !== searchTerm) {
setCurrentPage(1);
setSearchTerm(trimmed);
}
};
const formatDate = (dateString) => {
if (!dateString) return 'N/A';
return dateString.split('T')[0].split('-').reverse().join('/');
};
const handleAppointmentFormChange = (e) => {
setAppointmentFormData({ ...appointmentFormData, [e.target.name]: e.target.value });
};
const openAppointmentModal = (p) => {
setSelectedPatient(p);
setAppointmentError('');
setAppointmentFormData({
name: `${p.name} ${p.lastname}`,
dni: p.dni,
date: new Date().toISOString().split('T')[0],
time: '',
type: '',
other_treatment: ''
});
setShowAppointmentModal(true);
};
const handleSubmitAppointment = async (e) => {
e.preventDefault();
setAppointmentError('');
setAppointmentLoading(true);
try {
const result = await appointmentService.createAppointment({
...appointmentFormData,
patient_id: selectedPatient.id
});
if (result && result.success !== false) {
setShowAppointmentModal(false);
setSuccessMessage(`Turno agendado para ${appointmentFormData.date} a las ${appointmentFormData.time}`);
setShowSuccessModal(true);
setTimeout(() => setShowSuccessModal(false), 2500);
// Limpiar el formulario
setAppointmentFormData({
name: '', date: '', time: '', type: '', dni: '', other_treatment: ''
});
} else {
setAppointmentError(result?.error || 'Error al agendar turno');
}
} catch (error) {
console.error('Error agendando turno:', error);
setAppointmentError(error.message || 'Error al agendar turno');
} finally {
setAppointmentLoading(false);
}
};
return (
Gestión de Pacientes
Control clínico y de pagos
| PACIENTE |
DNI |
EDAD |
ACCIONES |
{patients.map(p => (
|
|
{p.dni} |
{calculateAge(p.birthdate)} años |
|
))}
Mostrando {(currentPage - 1) * patientsPerPage + 1} a {Math.min(currentPage * patientsPerPage, totalPatients)} de {totalPatients} pacientes
{[...Array(totalPages)].map((_, i) => (
))}
{/* MODAL DETALLES */}
{showPatientDetails && selectedPatient && (
setShowPatientDetails(false)}>
e.stopPropagation()}>
Datos del Paciente - {selectedPatient.name}
DNI{selectedPatient.dni}
Fecha de Nacimiento{formatDate(selectedPatient.birthdate)}
Edad{calculateAge(selectedPatient.birthdate)} años
Profesión{selectedPatient.occupation || 'N/A'}
Teléfono{selectedPatient.phone || 'N/A'}
Email{selectedPatient.email || 'N/A'}
Dirección{selectedPatient.address || 'N/A'}
Titular{selectedPatient.is_holder ? 'Sí' : 'No'}
Observaciones{selectedPatient.notes || '—'}
)}
{/* MODAL AGENDAR TURNO (image_772db7.png Design) */}
{showAppointmentModal && (
!appointmentLoading && setShowAppointmentModal(false)}>
e.stopPropagation()}>
Agendar Nuevo Turno
)}
{/* MODAL COBROS */}
{showPaymentModal && selectedPatient && (
setShowPaymentModal(false)}>
e.stopPropagation()}>
Cobros - {selectedPatient.name}
)}
{showSuccessModal && (
Operación Exitosa
{successMessage}
)}
);
};
export default ViewPatient;