diff --git a/lib/features/caching/config/cache_version.dart b/lib/features/caching/config/cache_version.dart index 4209327c0..7d5040c38 100644 --- a/lib/features/caching/config/cache_version.dart +++ b/lib/features/caching/config/cache_version.dart @@ -1,4 +1,4 @@ class CacheVersion { - static const int hiveDBVersion = 7; + static const int hiveDBVersion = 8; } \ No newline at end of file diff --git a/lib/features/composer/domain/extensions/email_request_extension.dart b/lib/features/composer/domain/extensions/email_request_extension.dart index 408973fb7..f12fbb6e7 100644 --- a/lib/features/composer/domain/extensions/email_request_extension.dart +++ b/lib/features/composer/domain/extensions/email_request_extension.dart @@ -23,7 +23,8 @@ extension EmailRequestExtension on EmailRequest { identityId: identityId, mailboxNameRequest: mailboxRequest?.newName, creationIdRequest: mailboxRequest?.creationId, - sendingState: newState + sendingState: newState, + previousEmailId: previousEmailId ); } } \ No newline at end of file diff --git a/lib/features/offline_mode/extensions/sending_email_hive_cache_extension.dart b/lib/features/offline_mode/extensions/sending_email_hive_cache_extension.dart index bcd44d55b..e9d2e7e57 100644 --- a/lib/features/offline_mode/extensions/sending_email_hive_cache_extension.dart +++ b/lib/features/offline_mode/extensions/sending_email_hive_cache_extension.dart @@ -26,7 +26,8 @@ extension SendingEmailHiveCacheExtension on SendingEmailHiveCache { identityId: const IdentityIdNullableConverter().fromJson(identityId), mailboxNameRequest: const MailboxNameConverter().fromJson(mailboxNameRequest), creationIdRequest: const IdNullableConverter().fromJson(creationIdRequest), - sendingState: SendingState.values.firstWhere((value) => value.name == sendingState) + sendingState: SendingState.values.firstWhere((value) => value.name == sendingState), + previousEmailId: const EmailIdNullableConverter().fromJson(previousEmailId), ); } } \ No newline at end of file diff --git a/lib/features/offline_mode/model/sending_email_hive_cache.dart b/lib/features/offline_mode/model/sending_email_hive_cache.dart index 80a66dcdd..ee8cae8b6 100644 --- a/lib/features/offline_mode/model/sending_email_hive_cache.dart +++ b/lib/features/offline_mode/model/sending_email_hive_cache.dart @@ -41,6 +41,9 @@ class SendingEmailHiveCache extends HiveObject with EquatableMixin { @HiveField(10) final String sendingState; + @HiveField(11) + final String? previousEmailId; + SendingEmailHiveCache( this.sendingId, this.email, @@ -53,6 +56,7 @@ class SendingEmailHiveCache extends HiveObject with EquatableMixin { this.mailboxNameRequest, this.creationIdRequest, this.sendingState, + this.previousEmailId, ); @override @@ -68,5 +72,6 @@ class SendingEmailHiveCache extends HiveObject with EquatableMixin { mailboxNameRequest, creationIdRequest, sendingState, + previousEmailId, ]; } \ No newline at end of file diff --git a/lib/features/offline_mode/work_manager/sending_email_worker.dart b/lib/features/offline_mode/work_manager/sending_email_worker.dart index 8a832dca2..6b3c2a581 100644 --- a/lib/features/offline_mode/work_manager/sending_email_worker.dart +++ b/lib/features/offline_mode/work_manager/sending_email_worker.dart @@ -6,6 +6,8 @@ import 'package:core/utils/app_logger.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:model/email/email_action_type.dart'; import 'package:model/extensions/account_id_extensions.dart'; import 'package:model/extensions/session_extension.dart'; import 'package:model/oidc/token_oidc.dart'; @@ -13,6 +15,8 @@ import 'package:tmail_ui_user/features/caching/config/hive_cache_config.dart'; import 'package:tmail_ui_user/features/caching/utils/cache_utils.dart'; import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart'; import 'package:tmail_ui_user/features/composer/domain/usecases/send_email_interactor.dart'; +import 'package:tmail_ui_user/features/email/domain/state/unsubscribe_email_state.dart'; +import 'package:tmail_ui_user/features/email/domain/usecases/unsubscribe_email_interactor.dart'; import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart'; import 'package:tmail_ui_user/features/home/domain/state/get_session_state.dart'; import 'package:tmail_ui_user/features/home/domain/usecases/get_session_interactor.dart'; @@ -43,6 +47,7 @@ class SendingEmailWorker extends Worker { GetSessionInteractor? _getSessionInteractor; SendingQueueIsolateManager? _sendingQueueIsolateManager; SendingEmailCacheManager? _sendingEmailCacheManager; + UnsubscribeEmailInteractor? _unsubscribeEmailInteractor; late Completer _completer; late SendingEmail _sendingEmail; @@ -97,6 +102,8 @@ class SendingEmailWorker extends Worker { failure is GetStoredTokenOidcFailure || failure is GetCredentialFailure) { _handleWorkerTaskToRetry(); + } else if (failure is UnsubscribeEmailFailure) { + _handleWorkerTaskSuccess(); } } @@ -111,6 +118,8 @@ class SendingEmailWorker extends Worker { _handleGetAccountByBasicAuthSuccess(success); } else if (success is SendEmailSuccess) { _handleSendEmailSuccess(success); + } else if (success is UnsubscribeEmailSuccess) { + _handleWorkerTaskSuccess(); } } @@ -128,6 +137,7 @@ class SendingEmailWorker extends Worker { _sendEmailInteractor = getBinding(); _sendingQueueIsolateManager = getBinding(); _sendingEmailCacheManager = getBinding(); + _unsubscribeEmailInteractor = getBinding(); } void _updatingSendingStateToMainUI({String? sendingId, SendingState? sendingState}) { @@ -204,7 +214,12 @@ class SendingEmailWorker extends Worker { } void _handleSendEmailSuccess(SendEmailSuccess success) { - _handleWorkerTaskSuccess(); + if (success.emailRequest.emailActionType == EmailActionType.composeFromUnsubscribeMailtoLink && + success.emailRequest.previousEmailId != null) { + _unsubscribeMail(success.emailRequest.previousEmailId!); + } else { + _handleWorkerTaskSuccess(); + } } void _handleSendEmailFailure(SendEmailFailure failure) { @@ -246,4 +261,21 @@ class SendingEmailWorker extends Worker { UserName? userName } ) => TupleKey(sendingId, sendingState.name, accountId?.asString, userName?.value).toString(); + + void _unsubscribeMail(EmailId emailId) { + if (_unsubscribeEmailInteractor != null && + _currentSession != null && + _currentAccountId != null + ) { + consumeState( + _unsubscribeEmailInteractor!.execute( + _currentSession!, + _currentAccountId!, + emailId + ) + ); + } else { + _handleWorkerTaskSuccess(); + } + } } \ No newline at end of file diff --git a/lib/features/sending_queue/domain/extensions/sending_email_extension.dart b/lib/features/sending_queue/domain/extensions/sending_email_extension.dart index cd9208670..6b01c6dbf 100644 --- a/lib/features/sending_queue/domain/extensions/sending_email_extension.dart +++ b/lib/features/sending_queue/domain/extensions/sending_email_extension.dart @@ -23,6 +23,7 @@ extension SendingEmailExtension on SendingEmail { mailboxNameRequest?.name, creationIdRequest?.value, sendingState.name, + previousEmailId?.asString, ); } @@ -34,7 +35,8 @@ extension SendingEmailExtension on SendingEmail { emailIdDestroyed: emailIdDestroyed, emailIdAnsweredOrForwarded: emailIdAnsweredOrForwarded, identityId: identityId, - storedSendingId: sendingId + storedSendingId: sendingId, + previousEmailId: previousEmailId, ); } @@ -51,7 +53,8 @@ extension SendingEmailExtension on SendingEmail { mailboxNameRequest: mailboxNameRequest, creationIdRequest: creationIdRequest, sendingState: sendingState, - selectMode: selectMode == SelectMode.INACTIVE ? SelectMode.ACTIVE : SelectMode.INACTIVE + selectMode: selectMode == SelectMode.INACTIVE ? SelectMode.ACTIVE : SelectMode.INACTIVE, + previousEmailId: previousEmailId, ); } @@ -68,7 +71,8 @@ extension SendingEmailExtension on SendingEmail { mailboxNameRequest: mailboxNameRequest, creationIdRequest: creationIdRequest, sendingState: sendingState, - selectMode: SelectMode.INACTIVE + selectMode: SelectMode.INACTIVE, + previousEmailId: previousEmailId, ); } @@ -85,7 +89,8 @@ extension SendingEmailExtension on SendingEmail { mailboxNameRequest: mailboxNameRequest, creationIdRequest: creationIdRequest, sendingState: newState, - selectMode: selectMode + selectMode: selectMode, + previousEmailId: previousEmailId, ); } } \ No newline at end of file diff --git a/lib/features/sending_queue/domain/model/sending_email.dart b/lib/features/sending_queue/domain/model/sending_email.dart index d3009735a..8fa5acaae 100644 --- a/lib/features/sending_queue/domain/model/sending_email.dart +++ b/lib/features/sending_queue/domain/model/sending_email.dart @@ -31,6 +31,7 @@ class SendingEmail with EquatableMixin { final DateTime createTime; final SelectMode selectMode; final SendingState sendingState; + final EmailId? previousEmailId; SendingEmail({ required this.sendingId, @@ -44,7 +45,8 @@ class SendingEmail with EquatableMixin { this.mailboxNameRequest, this.creationIdRequest, this.selectMode = SelectMode.INACTIVE, - this.sendingState = SendingState.waiting + this.sendingState = SendingState.waiting, + this.previousEmailId, }); Map toJson() { @@ -66,6 +68,7 @@ class SendingEmail with EquatableMixin { writeNotNull('identityId', const IdentityIdNullableConverter().toJson(identityId)); writeNotNull('mailboxNameRequest', mailboxNameRequest?.name); writeNotNull('creationIdRequest', const IdNullableConverter().toJson(creationIdRequest)); + writeNotNull('previousEmailId', const EmailIdNullableConverter().toJson(previousEmailId)); return val; } @@ -88,6 +91,7 @@ class SendingEmail with EquatableMixin { identityId: const IdentityIdNullableConverter().fromJson(json['identityId'] as String?), mailboxNameRequest: const MailboxNameConverter().fromJson(json['mailboxNameRequest'] as String?), creationIdRequest: const IdNullableConverter().fromJson(json['creationIdRequest'] as String?), + previousEmailId: const EmailIdNullableConverter().fromJson(json['previousEmailId'] as String?), ); } @@ -134,5 +138,6 @@ class SendingEmail with EquatableMixin { creationIdRequest, selectMode, sendingState, + previousEmailId, ]; } \ No newline at end of file