@@ -2,12 +2,11 @@ import { IonPage, IonContent } from '@ionic/react';
2
2
import { FC , useState } from 'react' ;
3
3
import { useHistory , useParams } from 'react-router-dom' ;
4
4
import './ReportDetailPage.scss' ;
5
- import { useQuery , useQueryClient } from '@tanstack/react-query' ;
5
+ import { useQuery } from '@tanstack/react-query' ;
6
6
import axios from 'axios' ;
7
7
import { MedicalReport } from '../../common/models/medicalReport' ;
8
8
import { useTranslation } from 'react-i18next' ;
9
9
import { getAuthConfig } from 'common/api/reportService' ;
10
- import { useToasts } from 'common/hooks/useToasts' ;
11
10
import AiAssistantNotice from './components/AiAssistantNotice' ;
12
11
import ReportHeader from './components/ReportHeader' ;
13
12
import ReportTabs from './components/ReportTabs' ;
@@ -20,15 +19,6 @@ import { QueryKey } from 'common/utils/constants';
20
19
21
20
const API_URL = import . meta. env . VITE_BASE_URL_API || '' ;
22
21
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
-
32
22
/**
33
23
* Page component for displaying detailed medical report analysis.
34
24
* This shows AI insights and original report data with flagged values.
@@ -37,25 +27,39 @@ const ReportDetailPage: FC = () => {
37
27
const { reportId } = useParams < { reportId : string } > ( ) ;
38
28
const history = useHistory ( ) ;
39
29
const { t } = useTranslation ( ) ;
40
- const { createToast } = useToasts ( ) ;
41
30
const [ isUploadModalOpen , setIsUploadModalOpen ] = useState ( false ) ;
42
- const queryClient = useQueryClient ( ) ;
31
+ const [ activeTab , setActiveTab ] = useState < 'ai' | 'original' > ( 'ai' ) ;
43
32
44
33
const handleUploadComplete = ( ) => {
45
34
setIsUploadModalOpen ( false ) ;
46
35
history . push ( '/tabs/home' ) ;
47
36
} ;
48
37
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
+
49
52
// 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 > ( {
51
58
queryKey : [ QueryKey . ReportDetail , reportId ] ,
52
59
queryFn : ( ) => fetchReportById ( reportId ! ) ,
53
60
enabled : ! ! reportId ,
54
61
} ) ;
55
62
56
- // State to track expanded sections
57
- const [ activeTab , setActiveTab ] = useState < 'ai' | 'original' > ( 'ai' ) ;
58
-
59
63
// Handle loading and error states
60
64
if ( isLoading ) {
61
65
return < IonPage > </ IonPage > ;
@@ -71,7 +75,7 @@ const ReportDetailPage: FC = () => {
71
75
) ;
72
76
}
73
77
74
- if ( ! data ) {
78
+ if ( ! reportData ) {
75
79
return (
76
80
< IonPage >
77
81
< IonContent className = "ion-padding" >
@@ -81,67 +85,6 @@ const ReportDetailPage: FC = () => {
81
85
) ;
82
86
}
83
87
84
- const reportData = data ;
85
-
86
- // Handle tab selection
87
- const handleTabChange = ( tab : 'ai' | 'original' ) => {
88
- setActiveTab ( tab ) ;
89
- } ;
90
-
91
- // Handle action buttons
92
- const handleDiscard = async ( setIsProcessing : ( isProcessing : boolean ) => void ) => {
93
- try {
94
- setIsProcessing ( true ) ;
95
- await axios . delete ( `${ API_URL } /api/reports/${ reportId } ` , await getAuthConfig ( ) ) ;
96
- setIsProcessing ( false ) ;
97
-
98
- // Show toast notification
99
- createToast ( {
100
- message : t ( 'report.discard.success' , {
101
- ns : 'reportDetail' ,
102
- defaultValue : 'Report deleted successfully' ,
103
- } ) ,
104
- duration : 2000 ,
105
- } ) ;
106
-
107
- await queryClient . invalidateQueries ( { queryKey : [ QueryKey . Reports ] } ) ;
108
- await queryClient . invalidateQueries ( { queryKey : [ QueryKey . LatestReports ] } ) ;
109
- await queryClient . invalidateQueries ( { queryKey : [ QueryKey . ReportDetail , reportId ] } ) ;
110
-
111
- // Navigate back
112
- history . push ( '/tabs/home' ) ;
113
- } catch ( error ) {
114
- setIsProcessing ( false ) ;
115
-
116
- console . error ( 'Error discarding report:' , error ) ;
117
- createToast ( {
118
- message : t ( 'report.discard.error' , {
119
- ns : 'reportDetail' ,
120
- defaultValue : 'Failed to delete report' ,
121
- } ) ,
122
- duration : 2000 ,
123
- color : 'danger' ,
124
- } ) ;
125
- }
126
- } ;
127
-
128
- const handleNewUpload = async ( setIsProcessing : ( isProcessing : boolean ) => void ) => {
129
- try {
130
- setIsProcessing ( true ) ;
131
- await axios . delete ( `${ API_URL } /api/reports/${ reportId } ` , await getAuthConfig ( ) ) ;
132
- setIsProcessing ( false ) ;
133
-
134
- await queryClient . invalidateQueries ( { queryKey : [ QueryKey . Reports ] } ) ;
135
- await queryClient . invalidateQueries ( { queryKey : [ QueryKey . LatestReports ] } ) ;
136
- await queryClient . invalidateQueries ( { queryKey : [ QueryKey . ReportDetail , reportId ] } ) ;
137
-
138
- setIsUploadModalOpen ( true ) ;
139
- } catch ( error ) {
140
- setIsProcessing ( false ) ;
141
- console . error ( 'Error deleting report before new upload:' , error ) ;
142
- }
143
- } ;
144
-
145
88
return (
146
89
< IonPage className = "report-detail-page" >
147
90
< IonContent fullscreen >
@@ -167,9 +110,9 @@ const ReportDetailPage: FC = () => {
167
110
168
111
{ /* Action buttons at the bottom */ }
169
112
< ActionButtons
170
- onDiscard = { handleDiscard }
171
- onNewUpload = { handleNewUpload }
113
+ reportId = { reportId }
172
114
reportTitle = { reportData . title }
115
+ setIsUploadModalOpen = { setIsUploadModalOpen }
173
116
/>
174
117
175
118
< UploadModal
0 commit comments