TF-1718 Implement unsubscribeMail on Jmap server in offline mode
(cherry picked from commit 354808e6883501a8dc1e0ecd5c0d1a6beab0e83a)
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
|
||||
class CacheVersion {
|
||||
static const int hiveDBVersion = 7;
|
||||
static const int hiveDBVersion = 8;
|
||||
}
|
||||
@@ -23,7 +23,8 @@ extension EmailRequestExtension on EmailRequest {
|
||||
identityId: identityId,
|
||||
mailboxNameRequest: mailboxRequest?.newName,
|
||||
creationIdRequest: mailboxRequest?.creationId,
|
||||
sendingState: newState
|
||||
sendingState: newState,
|
||||
previousEmailId: previousEmailId
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
];
|
||||
}
|
||||
@@ -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<bool> _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<SendEmailInteractor>();
|
||||
_sendingQueueIsolateManager = getBinding<SendingQueueIsolateManager>();
|
||||
_sendingEmailCacheManager = getBinding<SendingEmailCacheManager>();
|
||||
_unsubscribeEmailInteractor = getBinding<UnsubscribeEmailInteractor>();
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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<String, dynamic> 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,
|
||||
];
|
||||
}
|
||||
Reference in New Issue
Block a user