From c236e2a075e38d866c5611352defe6b4cab1ce41 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sat, 18 Apr 2026 01:23:29 +0000 Subject: [PATCH 1/5] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- src/components/cases/documents-tab.tsx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/components/cases/documents-tab.tsx b/src/components/cases/documents-tab.tsx index b25823b..4d3b86d 100644 --- a/src/components/cases/documents-tab.tsx +++ b/src/components/cases/documents-tab.tsx @@ -14,9 +14,17 @@ import { FolderPlus, ChevronRight, Home, + Eye, + ExternalLink, } from "lucide-react"; import { formatDate } from "@/lib/format"; import { toast } from "sonner"; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; const MAX_BYTES = 50 * 1024 * 1024; From 3e5394416b9e463cc19bbec04b2213b0c173abf5 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sat, 18 Apr 2026 01:23:37 +0000 Subject: [PATCH 2/5] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- src/components/cases/documents-tab.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/cases/documents-tab.tsx b/src/components/cases/documents-tab.tsx index 4d3b86d..c34d4ec 100644 --- a/src/components/cases/documents-tab.tsx +++ b/src/components/cases/documents-tab.tsx @@ -37,6 +37,9 @@ export function CaseDocumentsTab({ caseId }: { caseId: string }) { const [dragOver, setDragOver] = useState(false); const [creatingFolder, setCreatingFolder] = useState(false); const [newFolderName, setNewFolderName] = useState(""); + const [previewDoc, setPreviewDoc] = useState(null); + const [previewUrl, setPreviewUrl] = useState(null); + const [previewLoading, setPreviewLoading] = useState(false); const fileRef = useRef(null); const load = useCallback(async () => { From 19efb32e77ab5adfdd2c51c6c230f065683a997e Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sat, 18 Apr 2026 01:23:46 +0000 Subject: [PATCH 3/5] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- src/components/cases/documents-tab.tsx | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/components/cases/documents-tab.tsx b/src/components/cases/documents-tab.tsx index c34d4ec..352b3e4 100644 --- a/src/components/cases/documents-tab.tsx +++ b/src/components/cases/documents-tab.tsx @@ -216,6 +216,23 @@ export function CaseDocumentsTab({ caseId }: { caseId: string }) { window.open(data.signedUrl, "_blank"); }; + const openPreview = async (doc: any) => { + setPreviewDoc(doc); + setPreviewUrl(null); + setPreviewLoading(true); + const { data, error } = await supabase.storage + .from("case-documents") + .createSignedUrl(doc.storage_path, 300); + setPreviewLoading(false); + if (error) { toast.error(error.message); setPreviewDoc(null); return; } + setPreviewUrl(data.signedUrl); + }; + + const closePreview = () => { + setPreviewDoc(null); + setPreviewUrl(null); + }; + const del = async (doc: any) => { if (!confirm(`Delete ${doc.name}?`)) return; await supabase.storage.from("case-documents").remove([doc.storage_path]); From 28f74d83dd653a4aa3173cd06d109431b86c9d71 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sat, 18 Apr 2026 01:23:54 +0000 Subject: [PATCH 4/5] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- src/components/cases/documents-tab.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/cases/documents-tab.tsx b/src/components/cases/documents-tab.tsx index 352b3e4..9eaa68e 100644 --- a/src/components/cases/documents-tab.tsx +++ b/src/components/cases/documents-tab.tsx @@ -369,8 +369,9 @@ export function CaseDocumentsTab({ caseId }: { caseId: string }) { {d.size_bytes ? `${(d.size_bytes / 1024).toFixed(1)} KB` : "—"} - - + + + ))} From 2ffce29fb7b43b7013b7845cd07d94bac9eb1c50 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sat, 18 Apr 2026 01:24:15 +0000 Subject: [PATCH 5/5] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- src/components/cases/documents-tab.tsx | 74 ++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/src/components/cases/documents-tab.tsx b/src/components/cases/documents-tab.tsx index 9eaa68e..544ec93 100644 --- a/src/components/cases/documents-tab.tsx +++ b/src/components/cases/documents-tab.tsx @@ -380,6 +380,80 @@ export function CaseDocumentsTab({ caseId }: { caseId: string }) { + + !o && closePreview()}> + + + {previewDoc?.name} + {previewUrl && ( +
+ + +
+ )} +
+
+ {previewLoading ? ( +
+ Loading preview… +
+ ) : previewUrl && previewDoc ? ( + + ) : null} +
+
+
+ + ); +} + +function PreviewBody({ url, doc }: { url: string; doc: any }) { + const mime = (doc.mime_type || "").toLowerCase(); + const name = (doc.name || "").toLowerCase(); + const isImage = mime.startsWith("image/") || /\.(png|jpe?g|gif|webp|svg|bmp)$/i.test(name); + const isPdf = mime === "application/pdf" || name.endsWith(".pdf"); + const isText = + mime.startsWith("text/") || + /\.(txt|md|csv|json|log|xml|yml|yaml)$/i.test(name); + const isAudio = mime.startsWith("audio/") || /\.(mp3|wav|m4a|ogg)$/i.test(name); + const isVideo = mime.startsWith("video/") || /\.(mp4|webm|mov)$/i.test(name); + + if (isImage) { + return ( +
+ {doc.name} +
+ ); + } + if (isPdf || isText) { + return