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)}. + + + )} } >