11// ABOUTME: Document archive component that displays user's documents from backend API
22// ABOUTME: Includes filtering, loading states, and proper error handling for document management
3- import React , { useState , useEffect } from 'react' ;
3+ import { useState , useEffect } from 'react' ;
44import { Link } from 'react-router-dom' ;
55import { Button } from '@/components/ui/button' ;
66import DocumentStatusFilter from '@/components/DocumentStatusFilter' ;
77import { fetchDocuments } from '@/services/documentService' ;
8+ import { fetchAnonymizations } from '@/services/anonymizeService' ;
89import { Document } from '@/types/document' ;
10+ import { ArchiveDocument } from '@/types/archiveDocument' ;
11+
912import { useToast } from '@/hooks/use-toast' ;
1013
11- type DocumentStatus = 'All' | 'Anonymized' | 'Original' | 'Summarized' ;
14+ type DocumentStatus = 'All' | 'Anonymized' | 'Original' ;
1215
1316const DocumentArchive = ( ) => {
1417 const [ selectedStatus , setSelectedStatus ] = useState < DocumentStatus > ( 'All' ) ;
15- const [ documents , setDocuments ] = useState < Document [ ] > ( [ ] ) ;
18+ const [ documents , setDocuments ] = useState < ArchiveDocument [ ] > ( [ ] ) ;
1619 const [ loading , setLoading ] = useState ( true ) ;
1720 const [ error , setError ] = useState < string | null > ( null ) ;
1821 const { toast } = useToast ( ) ;
@@ -22,8 +25,56 @@ const DocumentArchive = () => {
2225 try {
2326 setLoading ( true ) ;
2427 setError ( null ) ;
25- const fetchedDocuments = await fetchDocuments ( ) ;
26- setDocuments ( fetchedDocuments ) ;
28+
29+ // Fetch both original documents and anonymizations in parallel
30+ const [ originalDocs , anonymizations ] = await Promise . all ( [
31+ fetchDocuments ( ) ,
32+ fetchAnonymizations ( ) . catch ( ( err ) => {
33+ console . warn ( 'Failed to fetch anonymizations:' , err ) ;
34+ // Show a warning toast but don't fail the entire operation
35+ toast ( {
36+ title : 'Warning' ,
37+ description :
38+ 'Could not load anonymized documents. Showing original documents only.' ,
39+ variant : 'default' ,
40+ } ) ;
41+ return [ ] ;
42+ } ) ,
43+ ] ) ;
44+
45+ // Convert original documents to archive format
46+ const archiveOriginals : ArchiveDocument [ ] = originalDocs . map ( ( doc ) => ( {
47+ id : doc . id ,
48+ fileName : doc . fileName ,
49+ uploadDate : doc . uploadDate ,
50+ status : 'Original' as const ,
51+ documentType : 'original' as const ,
52+ documentText : doc . documentText ,
53+ } ) ) ;
54+
55+ // Convert anonymizations to archive format
56+ const archiveAnonymized : ArchiveDocument [ ] = anonymizations . map (
57+ ( anon ) => ( {
58+ id : anon . id ,
59+ fileName : `${ getOriginalFileName (
60+ originalDocs ,
61+ anon . documentId
62+ ) } (Anonymized)`,
63+ uploadDate : anon . created ,
64+ status : 'Anonymized' as const ,
65+ documentType : 'anonymized' as const ,
66+ originalDocumentId : anon . documentId ,
67+ documentText : anon . anonymizedText ,
68+ } )
69+ ) ;
70+
71+ // Combine and sort by upload date (newest first)
72+ const allDocuments = [ ...archiveOriginals , ...archiveAnonymized ] . sort (
73+ ( a , b ) =>
74+ new Date ( b . uploadDate ) . getTime ( ) - new Date ( a . uploadDate ) . getTime ( )
75+ ) ;
76+
77+ setDocuments ( allDocuments ) ;
2778 } catch ( err ) {
2879 const errorMessage =
2980 err instanceof Error ? err . message : 'Failed to load documents' ;
@@ -41,6 +92,15 @@ const DocumentArchive = () => {
4192 loadDocuments ( ) ;
4293 } , [ toast ] ) ;
4394
95+ // Helper function to get original document filename for anonymized documents
96+ const getOriginalFileName = (
97+ originalDocs : Document [ ] ,
98+ documentId : string
99+ ) : string => {
100+ const originalDoc = originalDocs . find ( ( doc ) => doc . id === documentId ) ;
101+ return originalDoc ?. fileName || 'Unknown Document' ;
102+ } ;
103+
44104 const formatDate = ( dateString : string ) => {
45105 try {
46106 return new Date ( dateString ) . toLocaleDateString ( ) ;
@@ -49,6 +109,8 @@ const DocumentArchive = () => {
49109 }
50110 } ;
51111
112+ // Filter documents based on selected status
113+
52114 const filteredDocuments =
53115 selectedStatus === 'All'
54116 ? documents
@@ -112,17 +174,23 @@ const DocumentArchive = () => {
112174 className = { `px-2 py-0.5 rounded-full transition-all duration-200 ${
113175 doc . status === 'Anonymized'
114176 ? 'bg-green-100 text-green-800 group-hover:bg-green-200'
115- : doc . status === 'Summarized'
116- ? 'bg-blue-100 text-blue-800 group-hover:bg-blue-200'
117177 : 'bg-gray-100 text-gray-800 group-hover:bg-gray-200'
118178 } `}
119179 >
120180 { doc . status }
121181 </ span >
122182 </ div >
123- < Link to = { `/editor?id=${ doc . id } ` } >
183+ < Link
184+ to = { `/editor?id=${
185+ doc . documentType === 'anonymized'
186+ ? doc . originalDocumentId
187+ : doc . id
188+ } `}
189+ >
124190 < Button className = "w-full transition-all duration-200 group-hover:bg-primary/90" >
125- Open Document
191+ { doc . documentType === 'anonymized'
192+ ? 'View Anonymized'
193+ : 'Open Document' }
126194 </ Button >
127195 </ Link >
128196 </ div >
@@ -136,7 +204,7 @@ const DocumentArchive = () => {
136204 ? "You haven't uploaded any documents yet."
137205 : `No ${ selectedStatus . toLowerCase ( ) } documents found.` }
138206 </ p >
139- < Link to = "/" >
207+ < Link to = "/home " >
140208 < Button > Upload a document</ Button >
141209 </ Link >
142210 </ div >
0 commit comments