From 33bf4002e8e4ccca359bb1f3db12f56d7ffea167 Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 3 Feb 2023 12:26:01 +0700 Subject: [PATCH] TF-1190 Handle `SetError` when update email as drafts --- .../update_email_drafts_interactor.dart | 15 +++++----- .../data/datasource/email_datasource.dart | 2 +- .../email_datasource_impl.dart | 2 +- .../email/data/network/email_api.dart | 29 ++++++++++--------- .../repository/email_repository_impl.dart | 2 +- .../domain/repository/email_repository.dart | 2 +- .../mailbox_dashboard_controller.dart | 25 +++++++++++++++- 7 files changed, 50 insertions(+), 27 deletions(-) diff --git a/lib/features/composer/domain/usecases/update_email_drafts_interactor.dart b/lib/features/composer/domain/usecases/update_email_drafts_interactor.dart index c481d16d6..93a4f2acb 100644 --- a/lib/features/composer/domain/usecases/update_email_drafts_interactor.dart +++ b/lib/features/composer/domain/usecases/update_email_drafts_interactor.dart @@ -25,14 +25,13 @@ class UpdateEmailDraftsInteractor { final currentEmailState = listState.last; final newEmailDrafts = await _emailRepository.updateEmailDrafts(accountId, newEmail, oldEmailId); - if (newEmailDrafts != null) { - yield Right(UpdateEmailDraftsSuccess( - newEmailDrafts, - currentEmailState: currentEmailState, - currentMailboxState: currentMailboxState)); - } else { - yield Left(UpdateEmailDraftsFailure(null)); - } + yield Right( + UpdateEmailDraftsSuccess( + newEmailDrafts, + currentEmailState: currentEmailState, + currentMailboxState: currentMailboxState + ) + ); } catch (e) { yield Left(UpdateEmailDraftsFailure(e)); } diff --git a/lib/features/email/data/datasource/email_datasource.dart b/lib/features/email/data/datasource/email_datasource.dart index 1aaaec2ee..6b39c9625 100644 --- a/lib/features/email/data/datasource/email_datasource.dart +++ b/lib/features/email/data/datasource/email_datasource.dart @@ -54,7 +54,7 @@ abstract class EmailDataSource { Future removeEmailDrafts(AccountId accountId, EmailId emailId); - Future updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId); + Future updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId); Future> deleteMultipleEmailsPermanently(AccountId accountId, List emailIds); 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 dbd358ed8..0339c4770 100644 --- a/lib/features/email/data/datasource_impl/email_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_datasource_impl.dart @@ -116,7 +116,7 @@ class EmailDataSourceImpl extends EmailDataSource { } @override - Future updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId) { + Future updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId) { return Future.sync(() async { return await emailAPI.updateEmailDrafts(accountId, newEmail, oldEmailId); }).catchError((error) { diff --git a/lib/features/email/data/network/email_api.dart b/lib/features/email/data/network/email_api.dart index 8bb6589c1..297572a16 100644 --- a/lib/features/email/data/network/email_api.dart +++ b/lib/features/email/data/network/email_api.dart @@ -451,7 +451,7 @@ class EmailAPI with HandleSetErrorMixin { ); final emailCreated = setEmailResponse?.created?[email.id.id]; - final listEntriesErrors = _handleSetEmailResponse(response: setEmailResponse,); + final listEntriesErrors = _handleSetEmailResponse(response: setEmailResponse); final mapErrors = Map.fromEntries(listEntriesErrors); if (emailCreated != null && mapErrors.isEmpty) { @@ -485,7 +485,7 @@ class EmailAPI with HandleSetErrorMixin { }); } - Future updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId) async { + Future updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId) async { final setEmailMethod = SetEmailMethod(accountId) ..addCreate(newEmail.id.id, newEmail) ..addDestroy({oldEmailId.id}); @@ -500,19 +500,20 @@ class EmailAPI with HandleSetErrorMixin { .execute(); final setEmailResponse = response.parse( - setEmailInvocation.methodCallId, - SetEmailResponse.deserialize); + setEmailInvocation.methodCallId, + SetEmailResponse.deserialize + ); - return Future.sync(() async { - final emailUpdated = setEmailResponse?.created?[newEmail.id.id]; - final emailDestroyed = setEmailResponse?.destroyed?.contains(oldEmailId.id); - if (emailUpdated != null && emailDestroyed == true) { - return emailUpdated; - } - return null; - }).catchError((error) { - throw error; - }); + final emailUpdated = setEmailResponse?.created?[newEmail.id.id]; + final isEmailDestroyedSuccess = setEmailResponse?.destroyed?.contains(oldEmailId.id) ?? false; + final listEntriesErrors = _handleSetEmailResponse(response: setEmailResponse); + final mapErrors = Map.fromEntries(listEntriesErrors); + + if (emailUpdated != null && isEmailDestroyedSuccess && mapErrors.isEmpty) { + return emailUpdated; + } else { + throw SetEmailMethodException(mapErrors); + } } Future> deleteMultipleEmailsPermanently(AccountId accountId, List emailIds) async { diff --git a/lib/features/email/data/repository/email_repository_impl.dart b/lib/features/email/data/repository/email_repository_impl.dart index 282724894..5bb0d53cc 100644 --- a/lib/features/email/data/repository/email_repository_impl.dart +++ b/lib/features/email/data/repository/email_repository_impl.dart @@ -114,7 +114,7 @@ class EmailRepositoryImpl extends EmailRepository { } @override - Future updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId) { + Future updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId) { return emailDataSource.updateEmailDrafts(accountId, newEmail, oldEmailId); } diff --git a/lib/features/email/domain/repository/email_repository.dart b/lib/features/email/domain/repository/email_repository.dart index 373f87d32..db79b31c2 100644 --- a/lib/features/email/domain/repository/email_repository.dart +++ b/lib/features/email/domain/repository/email_repository.dart @@ -64,7 +64,7 @@ abstract class EmailRepository { Future removeEmailDrafts(AccountId accountId, EmailId emailId); - Future updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId); + Future updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId); Future> deleteMultipleEmailsPermanently(AccountId accountId, List emailIds); 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 598c0fe62..f07ac0e37 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -280,7 +280,9 @@ class MailboxDashBoardController extends ReloadableController { _handleSendEmailFailure(failure); } else if (failure is SaveEmailAsDraftsFailure) { _handleSaveEmailAsDraftsFailure(failure); - } else if (failure is RemoveEmailDraftsFailure || failure is UpdateEmailDraftsFailure) { + } else if (failure is UpdateEmailDraftsFailure) { + _handleUpdateEmailAsDraftsFailure(failure); + } else if (failure is RemoveEmailDraftsFailure) { clearState(); } else if (failure is MarkAsMailboxReadAllFailure || failure is MarkAsMailboxReadFailure) { @@ -1610,6 +1612,27 @@ class MailboxDashBoardController extends ReloadableController { clearState(); } + + void _handleUpdateEmailAsDraftsFailure(UpdateEmailDraftsFailure failure) { + logError('MailboxDashBoardController::_handleUpdateEmailAsDraftsFailure():failure: $failure'); + if (currentContext == null) { + clearState(); + return; + } + final exception = failure.exception; + logError('MailboxDashBoardController::_handleUpdateEmailAsDraftsFailure():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() {