From 67639578a562afbacd264730114616eda0f5cb2d Mon Sep 17 00:00:00 2001 From: dab246 Date: Tue, 29 Mar 2022 13:01:38 +0700 Subject: [PATCH] TF-130 Checking `maxSizeAttachmentsPerEmail` when uploading attachments --- .../presentation/composer_controller.dart | 33 ++++++++++++++++++- .../mailbox_dashboard_controller.dart | 17 ++++++++++ lib/l10n/intl_messages.arb | 8 ++++- lib/main/localizations/app_localizations.dart | 7 ++++ 4 files changed, 63 insertions(+), 2 deletions(-) diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index e287d8d51..ee0bcb3e9 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -517,7 +517,38 @@ class ComposerController extends BaseController { void _pickFileSuccess(Success success) { if (success is LocalFilePickerSuccess) { - _uploadAttachmentsAction(success.pickedFiles); + if (_validateAttachmentsSize(success.pickedFiles)) { + _uploadAttachmentsAction(success.pickedFiles); + } else { + if (currentContext != null) { + _appToast.showErrorToast(AppLocalizations.of(currentContext!).the_total_size_of_attachments_in_an_email_exceeds_the_limit); + } + } + } + } + + bool _validateAttachmentsSize(List listFiles) { + num currentTotalSize = 0; + if (attachments.isNotEmpty) { + final currentListSize = attachments + .map((attachment) => attachment.size?.value ?? 0) + .toList(); + currentTotalSize = currentListSize.reduce((sum, size) => sum + size); + log('ComposerController::checkingAttachmentsLimit(): currentTotalSize: $currentTotalSize'); + } + + final uploadedListSize = listFiles.map((file) => file.fileSize).toList(); + final uploadedTotalSize = uploadedListSize.reduce((sum, size) => sum + size); + log('ComposerController::checkingAttachmentsLimit(): uploadedTotalSize: $uploadedTotalSize'); + + final totalSizeReadyToUpload = currentTotalSize + uploadedTotalSize; + log('ComposerController::checkingAttachmentsLimit(): totalSizeReadyToUpload: $totalSizeReadyToUpload'); + + final maxSizeAttachmentsPerEmail = mailboxDashBoardController.maxSizeAttachmentsPerEmail?.value; + if (maxSizeAttachmentsPerEmail != null) { + return totalSizeReadyToUpload <= maxSizeAttachmentsPerEmail; + } else { + return false; } } diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart index ca66be3a5..c63f5626e 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart @@ -4,7 +4,10 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart'; +import 'package:jmap_dart_client/jmap/core/capability/mail_capability.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; +import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:model/model.dart'; @@ -269,6 +272,20 @@ class MailboxDashBoardController extends ReloadableController { accountId.value = sessionCurrent?.accounts.keys.first; } + UnsignedInt? get maxSizeAttachmentsPerEmail { + if (sessionCurrent != null && accountId.value != null) { + final mailCapability = sessionCurrent + ?.accounts[accountId.value] + ?.accountCapabilities[CapabilityIdentifier.jmapMail]; + if (mailCapability is MailCapability) { + final maxSizeAttachmentsPerEmail = mailCapability.maxSizeAttachmentsPerEmail; + log('MailboxDashBoardController::maxSizeAttachmentsPerEmail(): $maxSizeAttachmentsPerEmail'); + return maxSizeAttachmentsPerEmail; + } + } + return null; + } + void composeEmailAction() { if (kIsWeb) { if (dashBoardAction != DashBoardAction.compose) { diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index 27578a375..7831e2ac5 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2022-03-29T11:38:05.063764", + "@@last_modified": "2022-03-29T13:00:02.017403", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -893,5 +893,11 @@ "type": "text", "placeholders_order": [], "placeholders": {} + }, + "the_total_size_of_attachments_in_an_email_exceeds_the_limit": "The total size of attachments in an email exceeds the limit.", + "@the_total_size_of_attachments_in_an_email_exceeds_the_limit": { + "type": "text", + "placeholders_order": [], + "placeholders": {} } } \ No newline at end of file diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index b4d5c3f12..763947f42 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -949,4 +949,11 @@ class AppLocalizations { 'Fix email addresses', name: 'fix_email_addresses'); } + + String get the_total_size_of_attachments_in_an_email_exceeds_the_limit { + return Intl.message( + 'The total size of attachments in an email exceeds the limit.', + name: 'the_total_size_of_attachments_in_an_email_exceeds_the_limit' + ); + } } \ No newline at end of file