diff --git a/lib/features/composer/domain/usecases/save_email_as_drafts_interactor.dart b/lib/features/composer/domain/usecases/save_email_as_drafts_interactor.dart index c58ea8424..2141a70ee 100644 --- a/lib/features/composer/domain/usecases/save_email_as_drafts_interactor.dart +++ b/lib/features/composer/domain/usecases/save_email_as_drafts_interactor.dart @@ -25,14 +25,13 @@ class SaveEmailAsDraftsInteractor { final currentEmailState = listState.last; final emailAsDrafts = await _emailRepository.saveEmailAsDrafts(accountId, email); - if (emailAsDrafts != null) { - yield Right(SaveEmailAsDraftsSuccess( - emailAsDrafts, - currentEmailState: currentEmailState, - currentMailboxState: currentMailboxState)); - } else { - yield Left(SaveEmailAsDraftsFailure(null)); - } + yield Right( + SaveEmailAsDraftsSuccess( + emailAsDrafts, + currentEmailState: currentEmailState, + currentMailboxState: currentMailboxState + ) + ); } catch (e) { yield Left(SaveEmailAsDraftsFailure(e)); } diff --git a/lib/features/email/data/datasource/email_datasource.dart b/lib/features/email/data/datasource/email_datasource.dart index 12d3196a8..1aaaec2ee 100644 --- a/lib/features/email/data/datasource/email_datasource.dart +++ b/lib/features/email/data/datasource/email_datasource.dart @@ -50,7 +50,7 @@ abstract class EmailDataSource { MarkStarAction markStarAction ); - Future saveEmailAsDrafts(AccountId accountId, Email email); + Future saveEmailAsDrafts(AccountId accountId, Email email); Future removeEmailDrafts(AccountId accountId, EmailId emailId); diff --git a/lib/features/email/data/datasource_impl/email_datasource_impl.dart b/lib/features/email/data/datasource_impl/email_datasource_impl.dart index c54042258..dbd358ed8 100644 --- a/lib/features/email/data/datasource_impl/email_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_datasource_impl.dart @@ -98,7 +98,7 @@ class EmailDataSourceImpl extends EmailDataSource { } @override - Future saveEmailAsDrafts(AccountId accountId, Email email) { + Future saveEmailAsDrafts(AccountId accountId, Email email) { return Future.sync(() async { return await emailAPI.saveEmailAsDrafts(accountId, email); }).catchError((error) { diff --git a/lib/features/email/data/network/email_api.dart b/lib/features/email/data/network/email_api.dart index a331b7a36..8bb6589c1 100644 --- a/lib/features/email/data/network/email_api.dart +++ b/lib/features/email/data/network/email_api.dart @@ -432,7 +432,7 @@ class EmailAPI with HandleSetErrorMixin { }); } - Future saveEmailAsDrafts(AccountId accountId, Email email) async { + Future saveEmailAsDrafts(AccountId accountId, Email email) async { final setEmailMethod = SetEmailMethod(accountId) ..addCreate(email.id.id, email); @@ -446,14 +446,19 @@ class EmailAPI with HandleSetErrorMixin { .execute(); final setEmailResponse = response.parse( - setEmailInvocation.methodCallId, - SetEmailResponse.deserialize); + setEmailInvocation.methodCallId, + SetEmailResponse.deserialize + ); - return Future.sync(() async { - return setEmailResponse?.created?[email.id.id]; - }).catchError((error) { - throw error; - }); + final emailCreated = setEmailResponse?.created?[email.id.id]; + final listEntriesErrors = _handleSetEmailResponse(response: setEmailResponse,); + final mapErrors = Map.fromEntries(listEntriesErrors); + + if (emailCreated != null && mapErrors.isEmpty) { + return emailCreated; + } else { + throw SetEmailMethodException(mapErrors); + } } Future removeEmailDrafts(AccountId accountId, EmailId emailId) async { diff --git a/lib/features/email/data/repository/email_repository_impl.dart b/lib/features/email/data/repository/email_repository_impl.dart index 5f69eb66a..282724894 100644 --- a/lib/features/email/data/repository/email_repository_impl.dart +++ b/lib/features/email/data/repository/email_repository_impl.dart @@ -104,7 +104,7 @@ class EmailRepositoryImpl extends EmailRepository { } @override - Future saveEmailAsDrafts(AccountId accountId, Email email) { + Future saveEmailAsDrafts(AccountId accountId, Email email) { return emailDataSource.saveEmailAsDrafts(accountId, email); } diff --git a/lib/features/email/domain/repository/email_repository.dart b/lib/features/email/domain/repository/email_repository.dart index 4ddca04c7..373f87d32 100644 --- a/lib/features/email/domain/repository/email_repository.dart +++ b/lib/features/email/domain/repository/email_repository.dart @@ -60,7 +60,7 @@ abstract class EmailRepository { Future> addTooltipWhenHoverOnLink(List emailContents); - Future saveEmailAsDrafts(AccountId accountId, Email email); + Future saveEmailAsDrafts(AccountId accountId, Email email); Future removeEmailDrafts(AccountId accountId, EmailId emailId); diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index 4e211cc0a..598c0fe62 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -61,6 +61,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/download/download_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/set_error_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/composer_overlay_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/download/download_task_state.dart'; @@ -277,9 +278,9 @@ class MailboxDashBoardController extends ReloadableController { (failure) { if (failure is SendEmailFailure) { _handleSendEmailFailure(failure); - } else if (failure is SaveEmailAsDraftsFailure - || failure is RemoveEmailDraftsFailure - || failure is UpdateEmailDraftsFailure) { + } else if (failure is SaveEmailAsDraftsFailure) { + _handleSaveEmailAsDraftsFailure(failure); + } else if (failure is RemoveEmailDraftsFailure || failure is UpdateEmailDraftsFailure) { clearState(); } else if (failure is MarkAsMailboxReadAllFailure || failure is MarkAsMailboxReadFailure) { @@ -1555,22 +1556,23 @@ class MailboxDashBoardController extends ReloadableController { final listErrors = exception.mapErrors.values.toList(); final toastSuccess = _handleSetErrors(listErrors); if (!toastSuccess) { - _showToastSendMessageFailure(AppLocalizations.of(currentContext!).message_has_been_sent_failure); + _showToastSendMessageFailure(AppLocalizations.of(currentContext!).sendMessageFailure); } } else { - _showToastSendMessageFailure(AppLocalizations.of(currentContext!).message_has_been_sent_failure); + _showToastSendMessageFailure(AppLocalizations.of(currentContext!).sendMessageFailure); } clearState(); } - bool _handleSetErrors(List listErrors) { + bool _handleSetErrors(List listErrors, {bool isDrafts = false}) { for (var error in listErrors) { - if (error.type == SetError.tooLarge) { - _showToastSendMessageFailure(AppLocalizations.of(currentContext!).sendMessageFailureWithSetErrorTypeTooLarge); - return true; - } else if (error.type == SetError.overQuota) { - _showToastSendMessageFailure(AppLocalizations.of(currentContext!).sendMessageFailureWithSetErrorTypeOverQuota); + if (error.type == SetError.tooLarge || error.type == SetError.overQuota) { + if (isDrafts) { + _showToastSendMessageFailure(error.toastMessageForSaveEmailAsDraftFailure(currentContext!)); + } else { + _showToastSendMessageFailure(error.toastMessageForSendEmailFailure(currentContext!)); + } return true; } } @@ -1587,6 +1589,27 @@ class MailboxDashBoardController extends ReloadableController { ); } } + + void _handleSaveEmailAsDraftsFailure(SaveEmailAsDraftsFailure failure) { + logError('MailboxDashBoardController::_handleSaveEmailAsDraftsFailure():failure: $failure'); + if (currentContext == null) { + clearState(); + return; + } + final exception = failure.exception; + logError('MailboxDashBoardController::_handleSaveEmailAsDraftsFailure():exception: $exception'); + if (exception is SetEmailMethodException) { + final listErrors = exception.mapErrors.values.toList(); + final toastSuccess = _handleSetErrors(listErrors); + if (!toastSuccess) { + _showToastSendMessageFailure(AppLocalizations.of(currentContext!).saveEmailAsDraftFailure); + } + } else { + _showToastSendMessageFailure(AppLocalizations.of(currentContext!).saveEmailAsDraftFailure); + } + + clearState(); + } @override void onClose() { diff --git a/lib/features/mailbox_dashboard/presentation/extensions/set_error_extension.dart b/lib/features/mailbox_dashboard/presentation/extensions/set_error_extension.dart new file mode 100644 index 000000000..038edec66 --- /dev/null +++ b/lib/features/mailbox_dashboard/presentation/extensions/set_error_extension.dart @@ -0,0 +1,27 @@ + +import 'package:flutter/widgets.dart'; +import 'package:jmap_dart_client/jmap/core/error/set_error.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +extension SetErrorExtension on SetError { + + String toastMessageForSendEmailFailure(BuildContext context) { + if (type == SetError.tooLarge) { + return AppLocalizations.of(context).sendMessageFailureWithSetErrorTypeTooLarge; + } else if (type == SetError.overQuota) { + return AppLocalizations.of(context).sendMessageFailureWithSetErrorTypeOverQuota; + } else { + return AppLocalizations.of(context).sendMessageFailure; + } + } + + String toastMessageForSaveEmailAsDraftFailure(BuildContext context) { + if (type == SetError.tooLarge) { + return AppLocalizations.of(context).saveEmailAsDraftFailureWithSetErrorTypeTooLarge; + } else if (type == SetError.overQuota) { + return AppLocalizations.of(context).saveEmailAsDraftFailureWithSetErrorTypeOverQuota; + } else { + return AppLocalizations.of(context).saveEmailAsDraftFailure; + } + } +} \ No newline at end of file diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index 62ca75ecb..0853723a9 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2023-02-02T19:29:42.134695", + "@@last_modified": "2023-02-03T11:24:09.273116", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -588,12 +588,6 @@ "placeholders_order": [], "placeholders": {} }, - "message_has_been_sent_failure": "Message has been sent failure", - "@message_has_been_sent_failure": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, "done": "Done", "@done": { "type": "text", @@ -2650,6 +2644,12 @@ "placeholders_order": [], "placeholders": {} }, + "sendMessageFailure": "Failure to send your message.", + "@sendMessageFailure": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, "sendMessageFailureWithSetErrorTypeTooLarge": "Failure to send your message, because it is too large.", "@sendMessageFailureWithSetErrorTypeTooLarge": { "type": "text", @@ -2661,5 +2661,23 @@ "type": "text", "placeholders_order": [], "placeholders": {} + }, + "saveEmailAsDraftFailure": "Failure to save your message as drafts.", + "@saveEmailAsDraftFailure": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "saveEmailAsDraftFailureWithSetErrorTypeTooLarge": "Failure to save your message as drafts, because it is too large.", + "@saveEmailAsDraftFailureWithSetErrorTypeTooLarge": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "saveEmailAsDraftFailureWithSetErrorTypeOverQuota": "Failure to save your message as drafts, because it is over quota.", + "@saveEmailAsDraftFailureWithSetErrorTypeOverQuota": { + "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 e4d942ebb..95ffdd4bf 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -602,13 +602,6 @@ class AppLocalizations { ); } - String get message_has_been_sent_failure { - return Intl.message( - 'Message has been sent failure', - name: 'message_has_been_sent_failure', - ); - } - String get done { return Intl.message( 'Done', @@ -2720,6 +2713,13 @@ class AppLocalizations { name: 'reduceSomeFiltersAndTryAgain'); } + String get sendMessageFailure { + return Intl.message( + 'Failure to send your message.', + name: 'sendMessageFailure', + ); + } + String get sendMessageFailureWithSetErrorTypeTooLarge { return Intl.message( 'Failure to send your message, because it is too large.', @@ -2733,4 +2733,25 @@ class AppLocalizations { name: 'sendMessageFailureWithSetErrorTypeOverQuota', ); } + + String get saveEmailAsDraftFailure { + return Intl.message( + 'Failure to save your message as drafts.', + name: 'saveEmailAsDraftFailure', + ); + } + + String get saveEmailAsDraftFailureWithSetErrorTypeTooLarge { + return Intl.message( + 'Failure to save your message as drafts, because it is too large.', + name: 'saveEmailAsDraftFailureWithSetErrorTypeTooLarge', + ); + } + + String get saveEmailAsDraftFailureWithSetErrorTypeOverQuota { + return Intl.message( + 'Failure to save your message as drafts, because it is over quota.', + name: 'saveEmailAsDraftFailureWithSetErrorTypeOverQuota', + ); + } } \ No newline at end of file