11import { IonPage , IonContent } from '@ionic/react' ;
2- import { useState } from 'react' ;
2+ import { FC , useState } from 'react' ;
33import { useHistory , useParams } from 'react-router-dom' ;
44import './ReportDetailPage.scss' ;
5- import { useQuery , useQueryClient } from '@tanstack/react-query' ;
5+ import { useQuery } from '@tanstack/react-query' ;
66import axios from 'axios' ;
77import { MedicalReport } from '../../common/models/medicalReport' ;
88import { useTranslation } from 'react-i18next' ;
99import { getAuthConfig } from 'common/api/reportService' ;
10- import { useToasts } from 'common/hooks/useToasts' ;
1110import AiAssistantNotice from './components/AiAssistantNotice' ;
1211import ReportHeader from './components/ReportHeader' ;
1312import ReportTabs from './components/ReportTabs' ;
@@ -20,42 +19,47 @@ import { QueryKey } from 'common/utils/constants';
2019
2120const API_URL = import . meta. env . VITE_BASE_URL_API || '' ;
2221
23- // Function to fetch report by ID
24- const fetchReportById = async ( id : string ) : Promise < MedicalReport > => {
25- const response = await axios . get < MedicalReport > (
26- `${ API_URL } /api/reports/${ id } ` ,
27- await getAuthConfig ( ) ,
28- ) ;
29- return response . data ;
30- } ;
31-
3222/**
3323 * Page component for displaying detailed medical report analysis.
3424 * This shows AI insights and original report data with flagged values.
3525 */
36- const ReportDetailPage : React . FC = ( ) => {
26+ const ReportDetailPage : FC = ( ) => {
3727 const { reportId } = useParams < { reportId : string } > ( ) ;
3828 const history = useHistory ( ) ;
3929 const { t } = useTranslation ( ) ;
40- const { createToast } = useToasts ( ) ;
4130 const [ isUploadModalOpen , setIsUploadModalOpen ] = useState ( false ) ;
42- const queryClient = useQueryClient ( ) ;
31+ const [ activeTab , setActiveTab ] = useState < 'ai' | 'original' > ( 'ai' ) ;
4332
4433 const handleUploadComplete = ( ) => {
4534 setIsUploadModalOpen ( false ) ;
4635 history . push ( '/tabs/home' ) ;
4736 } ;
4837
38+ // Handle tab selection
39+ const handleTabChange = ( tab : 'ai' | 'original' ) => {
40+ setActiveTab ( tab ) ;
41+ } ;
42+
43+ // Function to fetch report by ID
44+ const fetchReportById = async ( id : string ) : Promise < MedicalReport > => {
45+ const response = await axios . get < MedicalReport > (
46+ `${ API_URL } /api/reports/${ id } ` ,
47+ await getAuthConfig ( ) ,
48+ ) ;
49+ return response . data ;
50+ } ;
51+
4952 // Fetch report data using react-query
50- const { data, isLoading, error } = useQuery < MedicalReport > ( {
53+ const {
54+ data : reportData ,
55+ isLoading,
56+ error,
57+ } = useQuery < MedicalReport > ( {
5158 queryKey : [ QueryKey . ReportDetail , reportId ] ,
5259 queryFn : ( ) => fetchReportById ( reportId ! ) ,
5360 enabled : ! ! reportId ,
5461 } ) ;
5562
56- // State to track expanded sections
57- const [ activeTab , setActiveTab ] = useState < 'ai' | 'original' > ( 'ai' ) ;
58-
5963 // Handle loading and error states
6064 if ( isLoading ) {
6165 return < IonPage > </ IonPage > ;
@@ -71,7 +75,7 @@ const ReportDetailPage: React.FC = () => {
7175 ) ;
7276 }
7377
74- if ( ! data ) {
78+ if ( ! reportData ) {
7579 return (
7680 < IonPage >
7781 < IonContent className = "ion-padding" >
@@ -81,77 +85,11 @@ const ReportDetailPage: React.FC = () => {
8185 ) ;
8286 }
8387
84- const reportData = data ;
85-
86- // Handle tab selection
87- const handleTabChange = ( tab : 'ai' | 'original' ) => {
88- setActiveTab ( tab ) ;
89- } ;
90-
91- // Handle close button
92- const handleClose = ( ) => {
93- history . push ( '/tabs/home' ) ;
94- } ;
95-
96- // Handle action buttons
97- const handleDiscard = async ( setIsProcessing : ( isProcessing : boolean ) => void ) => {
98- try {
99- setIsProcessing ( true ) ;
100- await axios . delete ( `${ API_URL } /api/reports/${ reportId } ` , await getAuthConfig ( ) ) ;
101- setIsProcessing ( false ) ;
102-
103- // Show toast notification
104- createToast ( {
105- message : t ( 'report.discard.success' , {
106- ns : 'reportDetail' ,
107- defaultValue : 'Report deleted successfully' ,
108- } ) ,
109- duration : 2000 ,
110- } ) ;
111-
112- queryClient . invalidateQueries ( { queryKey : [ QueryKey . Reports ] } ) ;
113- queryClient . invalidateQueries ( { queryKey : [ QueryKey . LatestReports ] } ) ;
114- queryClient . invalidateQueries ( { queryKey : [ QueryKey . ReportDetail , reportId ] } ) ;
115-
116- // Navigate back
117- history . push ( '/tabs/home' ) ;
118- } catch ( error ) {
119- setIsProcessing ( false ) ;
120-
121- console . error ( 'Error discarding report:' , error ) ;
122- createToast ( {
123- message : t ( 'report.discard.error' , {
124- ns : 'reportDetail' ,
125- defaultValue : 'Failed to delete report' ,
126- } ) ,
127- duration : 2000 ,
128- color : 'danger' ,
129- } ) ;
130- }
131- } ;
132-
133- const handleNewUpload = async ( setIsProcessing : ( isProcessing : boolean ) => void ) => {
134- try {
135- setIsProcessing ( true ) ;
136- await axios . delete ( `${ API_URL } /api/reports/${ reportId } ` , await getAuthConfig ( ) ) ;
137- setIsProcessing ( false ) ;
138-
139- queryClient . invalidateQueries ( { queryKey : [ QueryKey . Reports ] } ) ;
140- queryClient . invalidateQueries ( { queryKey : [ QueryKey . LatestReports ] } ) ;
141- queryClient . invalidateQueries ( { queryKey : [ QueryKey . ReportDetail , reportId ] } ) ;
142-
143- setIsUploadModalOpen ( true ) ;
144- } catch ( error ) {
145- setIsProcessing ( false ) ;
146- console . error ( 'Error deleting report before new upload:' , error ) ;
147- }
148- } ;
149-
15088 return (
15189 < IonPage className = "report-detail-page" >
15290 < IonContent fullscreen >
15391 { /* Header component */ }
154- < ReportHeader reportData = { reportData } onClose = { handleClose } />
92+ < ReportHeader reportData = { reportData } />
15593
15694 { /* Tab selector for AI Insights vs Original Report */ }
15795 < ReportTabs activeTab = { activeTab } onTabChange = { handleTabChange } />
@@ -172,9 +110,9 @@ const ReportDetailPage: React.FC = () => {
172110
173111 { /* Action buttons at the bottom */ }
174112 < ActionButtons
175- onDiscard = { handleDiscard }
176- onNewUpload = { handleNewUpload }
113+ reportId = { reportId }
177114 reportTitle = { reportData . title }
115+ setIsUploadModalOpen = { setIsUploadModalOpen }
178116 />
179117
180118 < UploadModal
0 commit comments