import React, { useState, useEffect } from 'react'; import { patientService } from '../../services/patientService'; import { labService } from '../../services/labService'; import ErrorAlert from '../../components/ErrorAlert'; function LabTestList() { const [user, setUser] = useState({}); const isLabTechnician = user.role === 'LAB_TECHNICIAN'; 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 [availableTests, setAvailableTests] = useState([]); const [labTestRequests, setLabTestRequests] = useState([]); const [labResults, setLabResults] = useState([]); const [pendingTests, setPendingTests] = useState([]); const [submittedTests, setSubmittedTests] = useState([]); const [selectedTest, setSelectedTest] = useState(null); const [showRequestForm, setShowRequestForm] = useState(false); const [requestData, setRequestData] = useState({ testId: '', testDate: new Date().toISOString().split('T')[0], notes: '', }); const [submitFormData, setSubmitFormData] = useState({ results: '', resultDate: new Date().toISOString().split('T')[0], }); // Filter states for pending tests const [pendingFilters, setPendingFilters] = useState({ testName: '', patientName: '', testDate: '', }); // Filter states for submitted tests const [submittedFilters, setSubmittedFilters] = useState({ testName: '', patientName: '', testDate: '', }); // Load user from localStorage and listen for changes useEffect(() => { const loadUser = () => { const userStr = localStorage.getItem('user'); console.log('[LabTestList] Loading user from localStorage:', userStr); if (userStr) { try { const parsedUser = JSON.parse(userStr); console.log('[LabTestList] Parsed user:', parsedUser); setUser(parsedUser); } catch (err) { console.error('Failed to parse user:', err); setUser({}); } } else { console.log('[LabTestList] No user in localStorage'); setUser({}); } }; console.log('[LabTestList] 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); }; }, []); useEffect(() => { if (isLabTechnician) { loadLabTestsData(); } }, [isLabTechnician]); const loadLabTestsData = async () => { try { setLoading(true); setError(null); // Load pending tests const pendingRes = await labService.getPendingLabTests(); setPendingTests(pendingRes.data || []); // Try to load submitted tests, but don't fail if this endpoint doesn't exist try { const submittedRes = await labService.getAllSubmittedLabResults(); setSubmittedTests(submittedRes.data || []); } catch (err) { console.warn('Could not load submitted tests:', err); setSubmittedTests([]); } } catch (err) { setError('Failed to load pending lab tests'); setPendingTests([]); } finally { setLoading(false); } }; 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 available tests const testsResponse = await labService.getAllLabTests(); setAvailableTests(testsResponse.data); // Fetch medical record for patient const { medicalRecordService } = await import('../../services/medicalRecordService'); const medicalRecordRes = await medicalRecordService.getMedicalRecordByPatientId(patientResponse.data.patientId); // Fetch existing test requests for patient const requestsResponse = await labService.getLabTestRequestsForPatient(patientResponse.data.patientId); setLabTestRequests(requestsResponse.data); // Fetch lab results for medical record const resultsResponse = await labService.getLabResultsForMedicalRecord(medicalRecordRes.data.recordId); setLabResults(resultsResponse.data); } catch (err) { setError(`Patient with EMBG ${embg} not found`); setPatient(null); } finally { setLoading(false); } }; const handleRequestTest = async (e) => { e.preventDefault(); setError(null); if (!requestData.testId) { setError('Please select a test'); return; } if (!patient) { setError('Patient not found'); return; } try { setLoading(true); // Get doctor ID from logged-in user const doctorId = user.doctorId; const request = { patientId: patient.patientId, medicalRecordId: patient.patientId, // Assuming medical record ID matches patient ID doctorId: parseInt(doctorId), testId: parseInt(requestData.testId), testDate: requestData.testDate, notes: requestData.notes, }; console.log('User object:', user); console.log('Sending lab test request with doctorId:', doctorId, 'Full request:', request); await labService.requestLabTest(request); // Refresh the test requests const requestsResponse = await labService.getLabTestRequestsForPatient(patient.patientId); setLabTestRequests(requestsResponse.data); // Reset form setRequestData({ testId: '', testDate: new Date().toISOString().split('T')[0], notes: '', }); setShowRequestForm(false); setError(null); } catch (err) { setError('Failed to request lab test: ' + err.response?.data?.error || err.message); } finally { setLoading(false); } }; const handleSubmitResult = async (e) => { e.preventDefault(); setError(null); if (!submitFormData.results.trim()) { setError('Please enter test results'); return; } if (!selectedTest) { setError('No test selected'); return; } try { setLoading(true); const { medicalRecordService } = await import('../../services/medicalRecordService'); const medicalRecordRes = await medicalRecordService.getMedicalRecordByPatientId(selectedTest.patientId); const resultData = { medicalRecordId: medicalRecordRes.data.recordId, testId: selectedTest.testId, results: submitFormData.results, resultDate: submitFormData.resultDate, }; await labService.submitLabResult(resultData); // Refresh pending tests await loadLabTestsData(); // Reset form setSelectedTest(null); setSubmitFormData({ results: '', resultDate: new Date().toISOString().split('T')[0], }); // Show success message setError(null); alert('Lab result submitted successfully!'); // Refresh the lab tests data await loadLabTestsData(); // Reset form setSelectedTest(null); setSubmitFormData({ results: '', resultDate: new Date().toISOString().split('T')[0], }); } catch (err) { setError('Failed to submit lab result: ' + (err.response?.data?.error || err.message)); } finally { setLoading(false); } }; if (isLabTechnician) { return (

Lab Tests - Submit Results

{error && setError(null)} />} {selectedTest ? ( // Submit Result Form

Submit Lab Result

Test: {selectedTest.testName}

Patient: {selectedTest.patientName}

Doctor: {selectedTest.doctorName}

Test Date: {selectedTest.testDate}

{selectedTest.notes &&

Notes: {selectedTest.notes}

}