diff --git a/lib/features/email/data/datasource/email_datasource.dart b/lib/features/email/data/datasource/email_datasource.dart index 4248f413e..bdfd90afe 100644 --- a/lib/features/email/data/datasource/email_datasource.dart +++ b/lib/features/email/data/datasource/email_datasource.dart @@ -143,7 +143,7 @@ abstract class EmailDataSource { Future getStoredSendingEmail(AccountId accountId, UserName userName, String sendingId); - Future unsubscribeMail(Session session, AccountId accountId, EmailId emailId); + Future unsubscribeMail(Session session, AccountId accountId, EmailId emailId); Future restoreDeletedMessage(RestoredDeletedMessageRequest restoredDeletedMessageRequest); 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 c1b150c67..2354d2c41 100644 --- a/lib/features/email/data/datasource_impl/email_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_datasource_impl.dart @@ -307,7 +307,7 @@ class EmailDataSourceImpl extends EmailDataSource { } @override - Future unsubscribeMail(Session session, AccountId accountId, EmailId emailId) { + Future unsubscribeMail(Session session, AccountId accountId, EmailId emailId) { return Future.sync(() async { return await emailAPI.unsubscribeMail(session, accountId, emailId); }).catchError(_exceptionThrower.throwException); diff --git a/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart b/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart index accf354e5..85df8381d 100644 --- a/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart @@ -339,7 +339,7 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource { } @override - Future unsubscribeMail(Session session, AccountId accountId, EmailId emailId) { + Future unsubscribeMail(Session session, AccountId accountId, EmailId emailId) { throw UnimplementedError(); } diff --git a/lib/features/email/data/network/email_api.dart b/lib/features/email/data/network/email_api.dart index f93ff0246..4f764d31c 100644 --- a/lib/features/email/data/network/email_api.dart +++ b/lib/features/email/data/network/email_api.dart @@ -678,17 +678,13 @@ class EmailAPI with HandleSetErrorMixin { } } - Future unsubscribeMail(Session session, AccountId accountId, EmailId emailId) async { + Future unsubscribeMail(Session session, AccountId accountId, EmailId emailId) async { final setEmailMethod = SetEmailMethod(accountId) ..addUpdates(emailId.generateMapUpdateObjectUnsubscribeMail()); - final getEmailMethod = GetEmailMethod(accountId) - ..addIds({emailId.id}) - ..addProperties(ThreadConstants.propertiesDefault); - final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); requestBuilder.invocation(setEmailMethod); - final getEmailInvocation = requestBuilder.invocation(getEmailMethod); + final setEmailInvocation = requestBuilder.invocation(setEmailMethod); final capabilities = setEmailMethod.requiredCapabilities.toCapabilitiesSupportTeamMailboxes(session, accountId); @@ -697,14 +693,19 @@ class EmailAPI with HandleSetErrorMixin { .build() .execute(); - final getEmailResponse = response.parse( - getEmailInvocation.methodCallId, - GetEmailResponse.deserialize); + final setEmailResponse = response.parse( + setEmailInvocation.methodCallId, + SetEmailResponse.deserialize, + ); - if (getEmailResponse?.list.isNotEmpty == true) { - return getEmailResponse!.list.first; - } else { - throw NotFoundEmailException(); + final emailIdUpdated = setEmailResponse?.updated + ?.keys + .map((id) => EmailId(id)) + .toList() ?? []; + final mapErrors = handleSetResponse([setEmailResponse]); + + if (emailIdUpdated.isEmpty) { + throw SetMethodException(mapErrors); } } diff --git a/lib/features/email/data/repository/email_repository_impl.dart b/lib/features/email/data/repository/email_repository_impl.dart index cbc7f5201..c48b4c3df 100644 --- a/lib/features/email/data/repository/email_repository_impl.dart +++ b/lib/features/email/data/repository/email_repository_impl.dart @@ -293,7 +293,7 @@ class EmailRepositoryImpl extends EmailRepository { } @override - Future unsubscribeMail(Session session, AccountId accountId, EmailId emailId) { + Future unsubscribeMail(Session session, AccountId accountId, EmailId emailId) { return emailDataSource[DataSourceType.network]!.unsubscribeMail(session, accountId, emailId); } diff --git a/lib/features/email/domain/repository/email_repository.dart b/lib/features/email/domain/repository/email_repository.dart index 5e62b863e..7aaf27b9d 100644 --- a/lib/features/email/domain/repository/email_repository.dart +++ b/lib/features/email/domain/repository/email_repository.dart @@ -144,7 +144,7 @@ abstract class EmailRepository { TransformConfiguration configuration ); - Future unsubscribeMail(Session session, AccountId accountId, EmailId emailId); + Future unsubscribeMail(Session session, AccountId accountId, EmailId emailId); Future restoreDeletedMessage(RestoredDeletedMessageRequest restoredDeletedMessageRequest); diff --git a/lib/features/email/domain/state/unsubscribe_email_state.dart b/lib/features/email/domain/state/unsubscribe_email_state.dart index ee4c94956..8ec09d478 100644 --- a/lib/features/email/domain/state/unsubscribe_email_state.dart +++ b/lib/features/email/domain/state/unsubscribe_email_state.dart @@ -1,24 +1,17 @@ import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; -import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:tmail_ui_user/features/base/state/ui_action_state.dart'; class UnsubscribeEmailLoading extends LoadingState {} class UnsubscribeEmailSuccess extends UIActionState { - final Email newEmail; - UnsubscribeEmailSuccess( - this.newEmail, { jmap.State? currentEmailState, jmap.State? currentMailboxState, } ) : super(currentEmailState, currentMailboxState); - - @override - List get props => [newEmail, ...super.props]; } class UnsubscribeEmailFailure extends FeatureFailure { diff --git a/lib/features/email/domain/usecases/unsubscribe_email_interactor.dart b/lib/features/email/domain/usecases/unsubscribe_email_interactor.dart index cf74151d3..4e1720b98 100644 --- a/lib/features/email/domain/usecases/unsubscribe_email_interactor.dart +++ b/lib/features/email/domain/usecases/unsubscribe_email_interactor.dart @@ -16,8 +16,8 @@ class UnsubscribeEmailInteractor { try { yield Right(UnsubscribeEmailLoading()); final currentEmailState = await emailRepository.getEmailState(session, accountId); - final newEmail = await emailRepository.unsubscribeMail(session, accountId, emailId); - yield Right(UnsubscribeEmailSuccess(newEmail, currentEmailState: currentEmailState)); + await emailRepository.unsubscribeMail(session, accountId, emailId); + yield Right(UnsubscribeEmailSuccess(currentEmailState: currentEmailState)); } catch (e) { yield Left(UnsubscribeEmailFailure(exception: e)); } 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 d477d0a09..7a8161165 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -401,7 +401,7 @@ class MailboxDashBoardController extends ReloadableController with UserSettingPo } else if (success is DeleteSendingEmailSuccess) { getAllSendingEmails(); } else if (success is UnsubscribeEmailSuccess) { - _handleUnsubscribeMailSuccess(success.newEmail); + _handleUnsubscribeMailSuccess(); } else if (success is RestoreDeletedMessageSuccess) { dispatchMailboxUIAction(RefreshChangeMailboxAction(success.currentMailboxState)); _handleRestoreDeletedMessageSuccess(success.emailRecoveryAction.id!); @@ -2599,13 +2599,16 @@ class MailboxDashBoardController extends ReloadableController with UserSettingPo } } - void _handleUnsubscribeMailSuccess(Email email) { + void _handleUnsubscribeMailSuccess() { if (currentContext != null && currentOverlayContext != null) { appToast.showToastSuccessMessage( currentOverlayContext!, AppLocalizations.of(currentContext!).unsubscribedFromThisMailingList); } - setSelectedEmail(email.toPresentationEmail()); + final newEmail = selectedEmail.value?.updateKeywords({ + KeyWordIdentifierExtension.unsubscribeMail: true, + }); + setSelectedEmail(newEmail); } void _replaceBrowserHistory({Uri? uri}) {