/* 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

{ setSearchInput(e.target.value); }} onKeyDown={(e) => { if (e.key === 'Enter') { triggerSearch(); } }} className="search-input" />
{patients.map(p => ( ))}
PACIENTE DNI EDAD ACCIONES
{p.name} {p.lastname}
{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

{appointmentError && (
{appointmentError}
)}
)} {/* MODAL COBROS */} {showPaymentModal && selectedPatient && (
setShowPaymentModal(false)}>
e.stopPropagation()}>

Cobros - {selectedPatient.name}

)} {showSuccessModal && (

Operación Exitosa

{successMessage}

)}
); }; export default ViewPatient;