/** * File preview modal for DMS. * Renders PDF files in an iframe via the preview endpoint. * Shows file metadata and download button for non-PDF files. */ import React, { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Modal } from '@/components/ui/Modal'; import { Button } from '@/components/ui/Button'; import { formatDateShort } from '@/utils/date'; import { Badge } from '@/components/ui/Badge'; import { getFilePreviewUrl, type DmsFile } from '@/api/dms'; import { FileText } from 'lucide-react'; export interface FilePreviewModalProps { open: boolean; file: DmsFile | null; onClose: () => void; } function formatFileSize(bytes: number): string { if (bytes < 1024) return `${bytes} B`; if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`; } export function FilePreviewModal({ open, file, onClose }: FilePreviewModalProps) { const { t } = useTranslation(); const [previewUrl, setPreviewUrl] = useState(null); useEffect(() => { if (open && file) { setPreviewUrl(getFilePreviewUrl(file.id)); } else { setPreviewUrl(null); } }, [open, file]); if (!file) return null; const isPdf = file.mime_type === 'application/pdf'; const isImage = file.mime_type.startsWith('image/'); return (
{file.mime_type.split('/')[1]?.toUpperCase() || t('dms.icon.other')} {formatFileSize(file.size_bytes ?? file.size ?? 0)} {file.created_at && ( {t('dms.fileModified')}: {formatDateShort(file.created_at)} )}
{isPdf && previewUrl && (