fix(media): stream large files and honour size settings (#3387)

This commit is contained in:
Hampus authored and GitHub committed 2026-10-11 13:28:24 +02:00
1 parent 6acd7f3d22
commit 45b78a13c2
97 files changed
+2547 -409

No files matched your search

@@ -6,10 +6,10 @@ import {
ANIMATED_AVATAR_FORMATS,
ANIMATED_IMAGE_FORMATS,
AVATAR_RECOMMENDED_SIZE_LABEL,
IMAGE_MAX_SIZE_BYTES,
STATIC_IMAGE_FORMATS,
} from '@app/features/app/config/I18nDisplayConstants';
import RuntimeConfig from '@app/features/app/state/RuntimeConfig';
import {GlobalLimits} from '@app/features/app/utils/GlobalLimits';
import {LimitResolver} from '@app/features/app/utils/LimitResolverAdapter';
import {isLimitToggleEnabled} from '@app/features/app/utils/LimitUtils';
import type {Gif} from '@app/features/expressions/commands/GifCommands';
@@ -163,11 +163,11 @@ export const AvatarUploader = observer(
);
const processAvatarFile = useCallback(
async (file: File) => {
if (file.size > 10 * 1024 * 1024) {
if (file.size > GlobalLimits.getAvatarMaxSize()) {
showUserErrorModal(
i18n._(COULDN_T_UPLOAD_AVATAR_DESCRIPTOR),
i18n._(AVATAR_FILE_IS_TOO_LARGE_PLEASE_CHOOSE_A_DESCRIPTOR, {
imageMaxSizeLabel: formatFileSize(i18n.locale, IMAGE_MAX_SIZE_BYTES),
imageMaxSizeLabel: formatFileSize(i18n.locale, GlobalLimits.getAvatarMaxSize()),
}),
);
return;
@@ -308,13 +308,13 @@ export const AvatarUploader = observer(
const uploadHint = canUploadAnimatedAvatar
? formatImageUploadRecommendedHint(i18n, {
formats: ANIMATED_IMAGE_FORMATS,
maxSize: formatFileSize(i18n.locale, IMAGE_MAX_SIZE_BYTES),
maxSize: formatFileSize(i18n.locale, GlobalLimits.getAvatarMaxSize()),
recommendedSize: AVATAR_RECOMMENDED_SIZE_LABEL,
})
: shouldShowPremiumFeatures()
? formatImageUploadRecommendedHintWithNote(i18n, {
formats: STATIC_IMAGE_FORMATS,
maxSize: formatFileSize(i18n.locale, IMAGE_MAX_SIZE_BYTES),
maxSize: formatFileSize(i18n.locale, GlobalLimits.getAvatarMaxSize()),
recommendedSize: AVATAR_RECOMMENDED_SIZE_LABEL,
note: i18n._(ANIMATED_AVATARS_REQUIRE_PREMIUM_NOTE_DESCRIPTOR, {
animatedAvatarFormats: ANIMATED_AVATAR_FORMATS,
@@ -323,7 +323,7 @@ export const AvatarUploader = observer(
})
: formatImageUploadRecommendedHint(i18n, {
formats: STATIC_IMAGE_FORMATS,
maxSize: formatFileSize(i18n.locale, IMAGE_MAX_SIZE_BYTES),
maxSize: formatFileSize(i18n.locale, GlobalLimits.getAvatarMaxSize()),
recommendedSize: AVATAR_RECOMMENDED_SIZE_LABEL,
});
openAssetSourceModal({
@@ -5,8 +5,8 @@ import {
ANIMATED_IMAGE_FORMATS,
BANNER_ASPECT_RATIO_LABEL,
BANNER_MINIMUM_SIZE_LABEL,
IMAGE_MAX_SIZE_BYTES,
} from '@app/features/app/config/I18nDisplayConstants';
import {GlobalLimits} from '@app/features/app/utils/GlobalLimits';
import {LimitResolver} from '@app/features/app/utils/LimitResolverAdapter';
import {isLimitToggleEnabled} from '@app/features/app/utils/LimitUtils';
import type {Gif} from '@app/features/expressions/commands/GifCommands';
@@ -183,11 +183,11 @@ export const BannerUploader = observer(
}, [i18n]);
const processBannerFile = useCallback(
async (file: File) => {
if (file.size > 10 * 1024 * 1024) {
if (file.size > GlobalLimits.getAvatarMaxSize()) {
showUserErrorModal(
i18n._(COULDN_T_UPLOAD_BANNER_DESCRIPTOR),
i18n._(BANNER_FILE_IS_TOO_LARGE_PLEASE_CHOOSE_A_DESCRIPTOR, {
imageMaxSizeLabel: formatFileSize(i18n.locale, IMAGE_MAX_SIZE_BYTES),
imageMaxSizeLabel: formatFileSize(i18n.locale, GlobalLimits.getAvatarMaxSize()),
}),
);
return;
@@ -264,7 +264,7 @@ export const BannerUploader = observer(
title: i18n._(CHANGE_BANNER_DESCRIPTOR),
uploadHint: formatImageUploadMinimumHint(i18n, {
formats: ANIMATED_IMAGE_FORMATS,
maxSize: formatFileSize(i18n.locale, IMAGE_MAX_SIZE_BYTES),
maxSize: formatFileSize(i18n.locale, GlobalLimits.getAvatarMaxSize()),
minimumSize: BANNER_MINIMUM_SIZE_LABEL,
aspectRatio: BANNER_ASPECT_RATIO_LABEL,
}),