'use client'; import { useEffect, useState } from 'react'; import { ExternalLink } from 'lucide-react'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { apiFetch } from '@/lib/api/client'; interface FilePreviewDialogProps { open: boolean; onOpenChange: (open: boolean) => void; fileId?: string; fileName?: string; mimeType?: string; } export function FilePreviewDialog({ open, onOpenChange, fileId, fileName, mimeType, }: FilePreviewDialogProps) { const [previewUrl, setPreviewUrl] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); useEffect(() => { if (!open || !fileId) { setPreviewUrl(null); setError(null); return; } setLoading(true); setError(null); apiFetch<{ data: { url: string } }>(`/api/v1/files/${fileId}/preview`) .then((res) => { setPreviewUrl(res.data.url); }) .catch(() => { setError('Failed to load preview'); }) .finally(() => { setLoading(false); }); }, [open, fileId]); const isImage = mimeType?.startsWith('image/'); const isPdf = mimeType === 'application/pdf'; return ( {fileName ?? 'Preview'} {previewUrl && ( )}
{loading && (
Loading preview...
)} {error && (
{error}
)} {!loading && !error && previewUrl && isImage && (
{/* eslint-disable-next-line @next/next/no-img-element */} {fileName
)} {!loading && !error && previewUrl && isPdf && (