diff --git a/frontend/src/components/detail/ExcelPreview.tsx b/frontend/src/components/detail/ExcelPreview.tsx
index 32b5fa1..a447ba9 100644
--- a/frontend/src/components/detail/ExcelPreview.tsx
+++ b/frontend/src/components/detail/ExcelPreview.tsx
@@ -48,6 +48,9 @@ export function ExcelPreview({ fileId, fileName }: ExcelPreviewProps) {
return (
+ );
+}
+
export function ResultPreview({ files, links, hasSelectedStage }: ResultPreviewProps) {
const [fileId, setFileId] = useState(null);
const [zoom, setZoom] = useState(1);
const [fullscreen, setFullscreen] = useState(false);
+ const [fileMissing, setFileMissing] = useState(false);
useEffect(() => {
if (files.length > 0) {
@@ -27,6 +49,25 @@ export function ResultPreview({ files, links, hasSelectedStage }: ResultPreviewP
}, [files]);
const activeFile = fileId ? files.find((f) => f.id === fileId) ?? null : null;
+
+ useEffect(() => {
+ if (!activeFile || isExcelFile(activeFile)) {
+ setFileMissing(false);
+ return;
+ }
+ let cancelled = false;
+ setFileMissing(false);
+ fetch(fileViewUrl(activeFile.id), { method: 'HEAD' })
+ .then((res) => {
+ if (!cancelled) setFileMissing(!res.ok);
+ })
+ .catch(() => {
+ if (!cancelled) setFileMissing(true);
+ });
+ return () => {
+ cancelled = true;
+ };
+ }, [activeFile?.id, activeFile?.mimetype]);
const fileIndex = activeFile ? files.findIndex((f) => f.id === activeFile.id) : -1;
const isImage = activeFile?.mimetype.includes('image') ?? false;
const isVideo = activeFile ? isVideoFile(activeFile) : false;
@@ -54,6 +95,9 @@ export function ResultPreview({ files, links, hasSelectedStage }: ResultPreviewP
if (isExcel) {
return ;
}
+ if (fileMissing) {
+ return ;
+ }
const src = fileViewUrl(activeFile.id);
if (isImage) {
return (
@@ -63,12 +107,19 @@ export function ResultPreview({ files, links, hasSelectedStage }: ResultPreviewP
className="max-h-full max-w-full object-contain transition-transform duration-150"
style={{ transform: `scale(${zoom})` }}
draggable={false}
+ onError={() => setFileMissing(true)}
/>
);
}
if (isVideo) {
return (
-
+