import React, { useState, useEffect } from 'react'; import { patientService } from '../../services/patientService'; import { procedureService } from '../../services/procedureService'; import { medicalRecordService } from '../../services/medicalRecordService'; import ErrorAlert from '../../components/ErrorAlert'; function ProcedureList() { const [user, setUser] = useState({}); const [patient, setPatient] = useState(null); const [embg, setEmbg] = useState(''); const [searched, setSearched] = useState(false); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [availableProcedures, setAvailableProcedures] = useState([]); const [performedProcedures, setPerformedProcedures] = useState([]); const [procedureResults, setProcedureResults] = useState([]); const [showRequestForm, setShowRequestForm] = useState(false); const [requestData, setRequestData] = useState({ procedureId: '', procedureDate: new Date().toISOString().split('T')[0], notes: '', }); // Load user from localStorage and listen for changes useEffect(() => { const loadUser = () => { const userStr = localStorage.getItem('user'); console.log('[ProcedureList] Loading user from localStorage:', userStr); if (userStr) { try { const parsedUser = JSON.parse(userStr); console.log('[ProcedureList] Parsed user:', parsedUser); setUser(parsedUser); } catch (err) { console.error('Failed to parse user:', err); setUser({}); } } else { console.log('[ProcedureList] No user in localStorage'); setUser({}); } }; console.log('[ProcedureList] useEffect running - loading user'); loadUser(); // Listen for storage changes (other tabs/windows) window.addEventListener('storage', loadUser); // Listen for custom event (same tab changes) window.addEventListener('userStorageChange', loadUser); return () => { window.removeEventListener('storage', loadUser); window.removeEventListener('userStorageChange', loadUser); }; }, []); const handleSearch = async (e) => { e.preventDefault(); setError(null); setLoading(true); try { if (!embg.trim()) { setError('Please enter an EMBG'); setLoading(false); return; } const patientResponse = await patientService.getPatientByEmbg(embg); setPatient(patientResponse.data); setSearched(true); // Fetch medical record for patient const medicalRecordRes = await medicalRecordService.getMedicalRecordByPatientId(patientResponse.data.patientId); // Fetch available procedures from database try { const proceduresResponse = await procedureService.getAllProcedures(); console.log('Procedures response:', proceduresResponse); console.log('Procedures data:', proceduresResponse.data); setAvailableProcedures(Array.isArray(proceduresResponse.data) ? proceduresResponse.data : []); } catch (procErr) { console.error('Failed to fetch procedures:', procErr); setError('Failed to fetch procedures: ' + procErr.message); setAvailableProcedures([]); } // Fetch performed procedures for patient try { const performedRes = await procedureService.getPerformedProceduresForPatient(patientResponse.data.patientId); setPerformedProcedures(Array.isArray(performedRes.data) ? performedRes.data : []); } catch (err) { console.error('Failed to fetch performed procedures:', err); setPerformedProcedures([]); } // Fetch procedure results for medical record try { const resultsResponse = await procedureService.getProcedureResultsForMedicalRecord(medicalRecordRes.data.recordId); setProcedureResults(Array.isArray(resultsResponse.data) ? resultsResponse.data : []); } catch (err) { console.error('Failed to fetch procedure results:', err); setProcedureResults([]); } } catch (err) { console.error('Search error:', err); setError(`Error: ${err.response?.data?.error || err.message || 'Patient not found'}`); setPatient(null); } finally { setLoading(false); } }; const handleRequestProcedure = async (e) => { e.preventDefault(); setError(null); if (!requestData.procedureId) { setError('Please select a procedure'); return; } if (!patient) { setError('Patient not found'); return; } try { setLoading(true); // Get doctor ID from logged-in user const doctorId = user.doctorId; const request = { procedureId: parseInt(requestData.procedureId), doctorId: parseInt(doctorId), patientId: patient.patientId, procedureDate: requestData.procedureDate, notes: requestData.notes, }; console.log('User object:', user); console.log('Sending procedure request with doctorId:', doctorId, 'Full request:', request); await procedureService.recordProcedure(request); // Refresh the performed procedures const performedRes = await procedureService.getPerformedProceduresForPatient(patient.patientId); setPerformedProcedures(performedRes.data); // Reset form setRequestData({ procedureId: '', procedureDate: new Date().toISOString().split('T')[0], notes: '', }); setShowRequestForm(false); setError(null); } catch (err) { console.error('Error details:', err); console.error('Response:', err.response); const errorMsg = err.response?.data?.error || err.message || 'Unknown error'; setError('Failed to request procedure: ' + errorMsg); } finally { setLoading(false); } }; return (
EMBG
{patient.embg}
Blood Type
{patient.bloodType || 'N/A'}
Date of Birth
{patient.dateOfBirth}
{proc.procedure?.procedureType || 'Procedure'}
Requested by: {proc.doctor?.firstName} {proc.doctor?.lastName}
Procedure Date: {proc.procedureDate}
{proc.notes && (Notes: {proc.notes}
)}{result.procedure?.procedureType || 'Procedure'}
Outcome: {result.resultDescription}
Result Date: {result.resultDate}
{performedProcedures.length} procedure{performedProcedures.length !== 1 ? 's' : ''} awaiting results
Submit Procedure ResultsNo procedures for this patient
Enter a patient EMBG to request procedures