import React from "react"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Download, Loader2 } from "lucide-react"; import { DocumentManager } from "@/lib/document/manager"; import { FilePreviewDialogProps } from "../types"; import { toast } from "sonner"; export const FilePreviewDialog = React.memo(({ document: fileDoc, onClose }: FilePreviewDialogProps) => { const [content, setContent] = React.useState(null); const [isLoading, setIsLoading] = React.useState(true); const [error, setError] = React.useState(null); const documentManager = React.useMemo(() => DocumentManager.getInstance(), []); React.useEffect(() => { if (!fileDoc) return; const loadContent = async () => { try { setIsLoading(true); setError(null); const file = await documentManager.getDocument(fileDoc.id); if (fileDoc.type === "image") { const reader = new FileReader(); reader.onload = () => setContent(reader.result as string); reader.readAsDataURL(file); } else if (fileDoc.type === "pdf") { const url = URL.createObjectURL(file); setContent(url); return () => URL.revokeObjectURL(url); } else { const text = await file.text(); setContent(text); } } catch (err) { console.error(err); setError("Failed to load file content"); } finally { setIsLoading(false); } }; loadContent(); }, [fileDoc, documentManager]); const handleDownload = React.useCallback(async () => { if (!fileDoc) return; try { const file = await documentManager.getDocument(fileDoc.id); const url = URL.createObjectURL(file); const a = document.createElement('a'); a.href = url; a.download = fileDoc.name; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); } catch (err) { console.error(err); toast.error("Failed to download file"); } }, [fileDoc, documentManager]); if (!fileDoc) return null; const renderContent = () => { if (isLoading) { return (
); } if (error) { return (
{error}
); } if (content) { if (fileDoc.type === "image") { return (
{fileDoc.name}
); } if (fileDoc.type === "pdf") { return