From d0795b69eaecf61cdb65377ee5561fca64c1de26 Mon Sep 17 00:00:00 2001 From: SnapOtter Date: Sun, 14 Jun 2026 21:53:42 +0800 Subject: [PATCH] feat: disable auto-save, add Save to Files button, accept all file types in library - Disabled auto-save of processed files to library (worker no longer calls autoSaveToLibrary) - Added "Save to Files" button in the review panel for explicit saving - Files library upload area now accepts all file types, not just images - Removed "Drop images here" hardcoded text, replaced with i18n - Removed image-only file filter from library upload --- apps/api/src/jobs/worker.ts | 11 +---- .../src/components/common/review-panel.tsx | 44 ++++++++++++++++++- .../src/components/files/file-upload-area.tsx | 18 +++----- packages/shared/src/i18n/ar.ts | 5 +++ packages/shared/src/i18n/de.ts | 5 +++ packages/shared/src/i18n/en.ts | 5 +++ packages/shared/src/i18n/es.ts | 5 +++ packages/shared/src/i18n/fr.ts | 5 +++ packages/shared/src/i18n/hi.ts | 5 +++ packages/shared/src/i18n/id.ts | 5 +++ packages/shared/src/i18n/it.ts | 5 +++ packages/shared/src/i18n/ja.ts | 5 +++ packages/shared/src/i18n/ko.ts | 5 +++ packages/shared/src/i18n/nl.ts | 5 +++ packages/shared/src/i18n/pl.ts | 5 +++ packages/shared/src/i18n/pt-BR.ts | 5 +++ packages/shared/src/i18n/ru.ts | 5 +++ packages/shared/src/i18n/sv.ts | 5 +++ packages/shared/src/i18n/th.ts | 5 +++ packages/shared/src/i18n/tr.ts | 5 +++ packages/shared/src/i18n/uk.ts | 5 +++ packages/shared/src/i18n/vi.ts | 5 +++ packages/shared/src/i18n/zh-CN.ts | 5 +++ packages/shared/src/i18n/zh-TW.ts | 5 +++ 24 files changed, 155 insertions(+), 23 deletions(-) diff --git a/apps/api/src/jobs/worker.ts b/apps/api/src/jobs/worker.ts index a9a5ab76..3689a43a 100644 --- a/apps/api/src/jobs/worker.ts +++ b/apps/api/src/jobs/worker.ts @@ -238,15 +238,8 @@ async function processToolJob(job: Job): Promise { // Generate preview for non-browser-previewable formats const previewRef = await generatePreview(resultBuffer, resultContentType, jobId, inputBuffer); - // Auto-save to user file library - const savedFileId = await autoSaveToLibrary({ - fileId: data.fileId, - userId: data.userId, - buffer: resultBuffer, - outName, - contentType: resultContentType, - toolId: data.toolId, - }); + // No auto-save -- users save to library explicitly via the UI + const savedFileId: string | undefined = undefined; const durationMs = Date.now() - startTime; diff --git a/apps/web/src/components/common/review-panel.tsx b/apps/web/src/components/common/review-panel.tsx index 38036e0c..93aabf01 100644 --- a/apps/web/src/components/common/review-panel.tsx +++ b/apps/web/src/components/common/review-panel.tsx @@ -1,7 +1,8 @@ -import { AlertCircle, ArrowLeft, CheckCircle2, Download, FileText } from "lucide-react"; -import { useMemo } from "react"; +import { AlertCircle, ArrowLeft, CheckCircle2, Download, FileText, FolderPlus } from "lucide-react"; +import { useCallback, useMemo, useState } from "react"; import { Link } from "react-router-dom"; import { useTranslation } from "@/contexts/i18n-context"; +import { formatHeaders } from "@/lib/api"; import { formatFileSize, triggerDownload } from "@/lib/download"; import { format } from "@/lib/format"; @@ -72,6 +73,28 @@ export function ReviewPanel({ triggerDownload(downloadUrl, filename); }; + const [saveStatus, setSaveStatus] = useState<"idle" | "saving" | "saved" | "error">("idle"); + + const handleSaveToFiles = useCallback(async () => { + setSaveStatus("saving"); + try { + const res = await fetch(downloadUrl); + const blob = await res.blob(); + const formData = new FormData(); + formData.append("file", new File([blob], filename, { type: fileType })); + const uploadRes = await fetch("/api/v1/files/upload", { + method: "POST", + headers: formatHeaders(), + body: formData, + }); + if (!uploadRes.ok) throw new Error("Upload failed"); + setSaveStatus("saved"); + } catch { + setSaveStatus("error"); + setTimeout(() => setSaveStatus("idle"), 3000); + } + }, [downloadUrl, filename, fileType]); + const hasBatchStats = totalCount != null && totalCount > 1 && successCount != null && failedCount != null; @@ -165,6 +188,23 @@ export function ReviewPanel({ )} + {/* Save to Files */} + {!isDataOutput && ( + + )} + {/* Adjust settings */}