From 1181b1fe22c7f5a998f8954f9e02a184a3513cf8 Mon Sep 17 00:00:00 2001 From: SnapOtter Date: Sat, 13 Jun 2026 15:19:58 +0800 Subject: [PATCH] fix(web): restore preview panel rendering for all file types The home-page preview panel always rendered ImageViewer regardless of the uploaded file's modality, causing videos, audio, PDFs, and data files to show "Preview not available". Root cause: the preview branching only checked for a blob URL and assumed all files were images. Fix: branch on currentEntry.previewKind so the existing MediaPlayerView, DocumentView, and a file-info fallback are activated for their respective modalities. Also widen the AppLayout dropzone from image-only to all file types so non-image files can reach the home page in the first place. --- apps/web/src/components/layout/app-layout.tsx | 4 ++- apps/web/src/pages/home-page.tsx | 36 +++++++++++++++++-- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/apps/web/src/components/layout/app-layout.tsx b/apps/web/src/components/layout/app-layout.tsx index 8112f1f3..df1e780d 100644 --- a/apps/web/src/components/layout/app-layout.tsx +++ b/apps/web/src/components/layout/app-layout.tsx @@ -148,7 +148,9 @@ export function AppLayout({ className={cn("flex-1 flex flex-col overflow-hidden", isMobile && "pt-12 pb-20")} >
- {children || } + {children || ( + true} /> + )}
diff --git a/apps/web/src/pages/home-page.tsx b/apps/web/src/pages/home-page.tsx index 1975d015..12a14ef5 100644 --- a/apps/web/src/pages/home-page.tsx +++ b/apps/web/src/pages/home-page.tsx @@ -5,12 +5,14 @@ import { TOOL_BUNDLE_MAP, TOOLS, } from "@snapotter/shared"; -import { Clock, Download, Loader2 } from "lucide-react"; +import { Clock, Download, FileArchive, Loader2 } from "lucide-react"; import { useCallback, useEffect, useMemo } from "react"; import { useLocation, useNavigate } from "react-router-dom"; import { ImageViewer } from "@/components/common/image-viewer"; import { MultiImageViewer } from "@/components/common/multi-image-viewer"; import { AppLayout } from "@/components/layout/app-layout"; +import { DocumentView } from "@/components/tools/document-view"; +import { MediaPlayerView } from "@/components/tools/media-player-view"; import { useTranslation } from "@/contexts/i18n-context"; import { useMobile } from "@/hooks/use-mobile"; import { ICON_MAP } from "@/lib/icon-map"; @@ -173,7 +175,7 @@ export function HomePage() { })} - {/* Full-width image preview */} + {/* Full-width file preview */}
{files.length > 1 ? ( @@ -183,6 +185,20 @@ export function HomePage() {

{t.homePage.generatingPreview}

{selectedFileName}

+ ) : currentEntry?.previewKind === "video" || currentEntry?.previewKind === "audio" ? ( + + ) : currentEntry?.previewKind === "document" ? ( + + ) : currentEntry?.previewKind === "none" ? ( +
+ +

+ {selectedFileName ?? files[0].name} +

+

+ {selectedFileSize ? `${(selectedFileSize / 1024).toFixed(1)} KB` : ""} +

+
) : originalBlobUrl ? ( - {/* Right panel: Image preview */} + {/* Right panel: File preview (modality-aware) */}
{files.length > 1 ? ( @@ -400,6 +416,20 @@ export function HomePage() {

{t.homePage.generatingPreview}

{selectedFileName}

+ ) : currentEntry?.previewKind === "video" || currentEntry?.previewKind === "audio" ? ( + + ) : currentEntry?.previewKind === "document" ? ( + + ) : currentEntry?.previewKind === "none" ? ( +
+ +

+ {selectedFileName ?? files[0].name} +

+

+ {selectedFileSize ? `${(selectedFileSize / 1024).toFixed(1)} KB` : ""} +

+
) : originalBlobUrl ? (