From e9798a22c327cd8d1d8623226789053f513dc0bc Mon Sep 17 00:00:00 2001
From: Ajay Bura <32841439+ajbura@users.noreply.github.com>
Date: Tue, 5 Aug 2025 18:35:18 +0530
Subject: [PATCH] Show file size exceeds error on upload (#2411)
* Show file size exceeds error on upload
* fix missing import and make size bold
---
.../upload-card/CompactUploadCardRenderer.tsx | 22 ++++++++++++++++---
.../upload-card/UploadCardRenderer.tsx | 22 ++++++++++++++++---
2 files changed, 38 insertions(+), 6 deletions(-)
diff --git a/src/app/components/upload-card/CompactUploadCardRenderer.tsx b/src/app/components/upload-card/CompactUploadCardRenderer.tsx
index 998b517a..b9bada71 100644
--- a/src/app/components/upload-card/CompactUploadCardRenderer.tsx
+++ b/src/app/components/upload-card/CompactUploadCardRenderer.tsx
@@ -4,7 +4,8 @@ import { UploadCard, UploadCardError, CompactUploadCardProgress } from './Upload
import { TUploadAtom, UploadStatus, UploadSuccess, useBindUploadAtom } from '../../state/upload';
import { useMatrixClient } from '../../hooks/useMatrixClient';
import { TUploadContent } from '../../utils/matrix';
-import { getFileTypeIcon } from '../../utils/common';
+import { bytesToSize, getFileTypeIcon } from '../../utils/common';
+import { useMediaConfig } from '../../hooks/useMediaConfig';
type CompactUploadCardRendererProps = {
isEncrypted?: boolean;
@@ -19,10 +20,16 @@ export function CompactUploadCardRenderer({
onComplete,
}: CompactUploadCardRendererProps) {
const mx = useMatrixClient();
+ const mediaConfig = useMediaConfig();
+ const allowSize = mediaConfig['m.upload.size'] || Infinity;
+
const { upload, startUpload, cancelUpload } = useBindUploadAtom(mx, uploadAtom, isEncrypted);
const { file } = upload;
+ const fileSizeExceeded = file.size >= allowSize;
- if (upload.status === UploadStatus.Idle) startUpload();
+ if (upload.status === UploadStatus.Idle && !fileSizeExceeded) {
+ startUpload();
+ }
const removeUpload = () => {
cancelUpload();
@@ -76,7 +83,7 @@ export function CompactUploadCardRenderer({
>
) : (
<>
- {upload.status === UploadStatus.Idle && (
+ {upload.status === UploadStatus.Idle && !fileSizeExceeded && (
)}
{upload.status === UploadStatus.Loading && (
@@ -87,6 +94,15 @@ export function CompactUploadCardRenderer({
{upload.error.message}
)}
+ {upload.status === UploadStatus.Idle && fileSizeExceeded && (
+
+
+ The file size exceeds the limit. Maximum allowed size is{' '}
+ {bytesToSize(allowSize)}, but the uploaded file is{' '}
+ {bytesToSize(file.size)}.
+
+
+ )}
>
)}
diff --git a/src/app/components/upload-card/UploadCardRenderer.tsx b/src/app/components/upload-card/UploadCardRenderer.tsx
index 4383e204..0a127a08 100644
--- a/src/app/components/upload-card/UploadCardRenderer.tsx
+++ b/src/app/components/upload-card/UploadCardRenderer.tsx
@@ -4,13 +4,14 @@ import { UploadCard, UploadCardError, UploadCardProgress } from './UploadCard';
import { UploadStatus, UploadSuccess, useBindUploadAtom } from '../../state/upload';
import { useMatrixClient } from '../../hooks/useMatrixClient';
import { TUploadContent } from '../../utils/matrix';
-import { getFileTypeIcon } from '../../utils/common';
+import { bytesToSize, getFileTypeIcon } from '../../utils/common';
import {
roomUploadAtomFamily,
TUploadItem,
TUploadMetadata,
} from '../../state/room/roomInputDrafts';
import { useObjectURL } from '../../hooks/useObjectURL';
+import { useMediaConfig } from '../../hooks/useMediaConfig';
type ImagePreviewProps = { fileItem: TUploadItem; onSpoiler: (marked: boolean) => void };
function ImagePreview({ fileItem, onSpoiler }: ImagePreviewProps) {
@@ -75,12 +76,18 @@ export function UploadCardRenderer({
onComplete,
}: UploadCardRendererProps) {
const mx = useMatrixClient();
+ const mediaConfig = useMediaConfig();
+ const allowSize = mediaConfig['m.upload.size'] || Infinity;
+
const uploadAtom = roomUploadAtomFamily(fileItem.file);
const { metadata } = fileItem;
const { upload, startUpload, cancelUpload } = useBindUploadAtom(mx, uploadAtom, isEncrypted);
const { file } = upload;
+ const fileSizeExceeded = file.size >= allowSize;
- if (upload.status === UploadStatus.Idle) startUpload();
+ if (upload.status === UploadStatus.Idle && !fileSizeExceeded) {
+ startUpload();
+ }
const handleSpoiler = (marked: boolean) => {
setMetadata(fileItem, { ...metadata, markedAsSpoiler: marked });
@@ -131,7 +138,7 @@ export function UploadCardRenderer({
{fileItem.originalFile.type.startsWith('image') && (
)}
- {upload.status === UploadStatus.Idle && (
+ {upload.status === UploadStatus.Idle && !fileSizeExceeded && (
)}
{upload.status === UploadStatus.Loading && (
@@ -142,6 +149,15 @@ export function UploadCardRenderer({
{upload.error.message}
)}
+ {upload.status === UploadStatus.Idle && fileSizeExceeded && (
+
+
+ The file size exceeds the limit. Maximum allowed size is{' '}
+ {bytesToSize(allowSize)}, but the uploaded file is{' '}
+ {bytesToSize(file.size)}.
+
+
+ )}
>
}
>