diff --git a/frontend/src/components/Dashboard/Dashboard.tsx b/frontend/src/components/Dashboard/Dashboard.tsx index cf00516..0a95df9 100644 --- a/frontend/src/components/Dashboard/Dashboard.tsx +++ b/frontend/src/components/Dashboard/Dashboard.tsx @@ -38,7 +38,7 @@ import { } from '@mui/icons-material'; import { useNavigate } from 'react-router-dom'; import { useAuth } from '../../contexts/AuthContext'; -import api from '../../services/api'; +import api, { documentService } from '../../services/api'; interface Document { id: string; @@ -377,9 +377,12 @@ const RecentDocuments: React.FC = ({ documents = [] }) => { - const downloadUrl = `/api/documents/${doc.id}/download`; - window.open(downloadUrl, '_blank'); + onClick={async () => { + try { + await documentService.downloadFile(doc.id, doc.original_filename || doc.filename); + } catch (error) { + console.error('Download failed:', error); + } }} > diff --git a/frontend/src/pages/FailedOcrPage.tsx b/frontend/src/pages/FailedOcrPage.tsx index 260fe94..b11fe60 100644 --- a/frontend/src/pages/FailedOcrPage.tsx +++ b/frontend/src/pages/FailedOcrPage.tsx @@ -473,7 +473,13 @@ const FailedOcrPage: React.FC = () => { window.open(`/api/documents/${document.id}/download`, '_blank')} + onClick={async () => { + try { + await documentService.downloadFile(document.id, document.original_filename || document.filename); + } catch (error) { + console.error('Download failed:', error); + } + }} > @@ -760,7 +766,13 @@ const FailedOcrPage: React.FC = () => { window.open(`/api/documents/${doc.id}/download`, '_blank')} + onClick={async () => { + try { + await documentService.downloadFile(doc.id, doc.original_filename || doc.filename); + } catch (error) { + console.error('Download failed:', error); + } + }} sx={{ color: theme.palette.secondary.main }} > diff --git a/frontend/src/services/api.ts b/frontend/src/services/api.ts index e4c15c2..db0cf7e 100644 --- a/frontend/src/services/api.ts +++ b/frontend/src/services/api.ts @@ -151,6 +151,28 @@ export const documentService = { }) }, + downloadFile: async (id: string, filename?: string) => { + try { + const response = await api.get(`/documents/${id}/download`, { + responseType: 'blob', + }); + + // Create blob URL and trigger download + const blob = new Blob([response.data], { type: response.headers['content-type'] }); + const url = window.URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = filename || `document-${id}`; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + window.URL.revokeObjectURL(url); + } catch (error) { + console.error('Download failed:', error); + throw error; + } + }, + getOcrText: (id: string) => { return api.get(`/documents/${id}/ocr`) },