From 4da1b7d8fcbd351ed81d4b31971f01baa73d9ada Mon Sep 17 00:00:00 2001 From: Linus Rath Date: Thu, 26 Mar 2026 12:04:18 +0100 Subject: [PATCH] feat: update file upload size handling to use dynamic max size #96 --- app/[locale]/files/page.tsx | 40 +++++++++++++++++-------------- components/files/file-browser.tsx | 2 -- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/app/[locale]/files/page.tsx b/app/[locale]/files/page.tsx index aade290f..b466819a 100644 --- a/app/[locale]/files/page.tsx +++ b/app/[locale]/files/page.tsx @@ -11,7 +11,7 @@ import { useAuthStore, redirectToLogin } from "@/stores/auth-store"; import { useEmailStore } from "@/stores/email-store"; import { useFileStore } from "@/stores/file-store"; import { toast } from "@/stores/toast-store"; -import { cn } from "@/lib/utils"; +import { cn, formatFileSize } from "@/lib/utils"; import { NavigationRail } from "@/components/layout/navigation-rail"; import { SidebarAppsModal } from "@/components/layout/sidebar-apps-modal"; import { InlineAppView } from "@/components/layout/inline-app-view"; @@ -156,39 +156,43 @@ export default function FilesPage() { } }, [createDirectory, t]); - const MAX_FILE_SIZE = 500 * 1024 * 1024; // 500 MB + const maxSizeUpload = client?.getMaxSizeUpload() || 0; const handleUploadFiles = useCallback(async (files: File[]) => { - const oversized = files.filter(f => f.size > MAX_FILE_SIZE); - const valid = files.filter(f => f.size <= MAX_FILE_SIZE); - if (oversized.length > 0) { - toast.error(t("file_too_large", { name: oversized[0].name, max: "500 MB" })); + if (maxSizeUpload > 0) { + const oversized = files.filter(f => f.size > maxSizeUpload); + files = files.filter(f => f.size <= maxSizeUpload); + if (oversized.length > 0) { + toast.error(t("file_too_large", { name: oversized[0].name, max: formatFileSize(maxSizeUpload) })); + } } - if (valid.length === 0) return; + if (files.length === 0) return; try { - await uploadFiles(valid); - toast.success(t("upload_success", { count: valid.length })); + await uploadFiles(files); + toast.success(t("upload_success", { count: files.length })); } catch (err) { console.error("Failed to upload files:", err); toast.error(t("upload_error")); } - }, [uploadFiles, t]); + }, [uploadFiles, t, maxSizeUpload]); const handleUploadFolder = useCallback(async (files: File[]) => { - const oversized = files.filter(f => f.size > MAX_FILE_SIZE); - const valid = files.filter(f => f.size <= MAX_FILE_SIZE); - if (oversized.length > 0) { - toast.error(t("file_too_large", { name: oversized[0].name, max: "500 MB" })); + if (maxSizeUpload > 0) { + const oversized = files.filter(f => f.size > maxSizeUpload); + files = files.filter(f => f.size <= maxSizeUpload); + if (oversized.length > 0) { + toast.error(t("file_too_large", { name: oversized[0].name, max: formatFileSize(maxSizeUpload) })); + } } - if (valid.length === 0) return; + if (files.length === 0) return; try { - await uploadFolder(valid); - toast.success(t("upload_success", { count: valid.length })); + await uploadFolder(files); + toast.success(t("upload_success", { count: files.length })); } catch (err) { console.error("Failed to upload folder:", err); toast.error(t("upload_error")); } - }, [uploadFolder, t]); + }, [uploadFolder, t, maxSizeUpload]); const handleDelete = useCallback(async (name: string) => { const confirmed = await confirmDialog({ diff --git a/components/files/file-browser.tsx b/components/files/file-browser.tsx index ef62d814..e09d72bb 100644 --- a/components/files/file-browser.tsx +++ b/components/files/file-browser.tsx @@ -181,8 +181,6 @@ function isPreviewable(name: string): boolean { return isImageFile(name) || isTextFile(name) || isPdfFile(name) || isAudioFile(name) || isVideoFile(name); } -const MAX_FILE_SIZE = 500 * 1024 * 1024; // 500 MB - function getFileIconByName(name: string, size: "sm" | "lg") { const cls = size === "sm" ? "w-5 h-5" : "w-10 h-10"; if (isVectorFile(name)) return ;