TF-1604: Add requiredCapabilities support TeamMailbox for SetEmailMethod

(cherry picked from commit af9432c91755489a544b781bf068dd037fc627ee)
This commit is contained in:
HuyNguyen
2023-03-22 13:32:49 +07:00
committed by Dat Vu
parent 02e5d9e6aa
commit a794d8491e
28 changed files with 477 additions and 291 deletions
@@ -1,6 +1,7 @@
import 'package:core/core.dart'; import 'package:core/core.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.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/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:tmail_ui_user/features/composer/domain/state/save_email_as_drafts_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/save_email_as_drafts_state.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
@@ -12,7 +13,7 @@ class SaveEmailAsDraftsInteractor {
SaveEmailAsDraftsInteractor(this._emailRepository, this._mailboxRepository); SaveEmailAsDraftsInteractor(this._emailRepository, this._mailboxRepository);
Stream<Either<Failure, Success>> execute(AccountId accountId, Email email) async* { Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, Email email) async* {
try { try {
yield Right<Failure, Success>(SaveEmailAsDraftsLoading()); yield Right<Failure, Success>(SaveEmailAsDraftsLoading());
@@ -24,7 +25,7 @@ class SaveEmailAsDraftsInteractor {
final currentMailboxState = listState.first; final currentMailboxState = listState.first;
final currentEmailState = listState.last; final currentEmailState = listState.last;
final emailAsDrafts = await _emailRepository.saveEmailAsDrafts(accountId, email); final emailAsDrafts = await _emailRepository.saveEmailAsDrafts(session, accountId, email);
yield Right<Failure, Success>( yield Right<Failure, Success>(
SaveEmailAsDraftsSuccess( SaveEmailAsDraftsSuccess(
emailAsDrafts, emailAsDrafts,
@@ -2,6 +2,7 @@ import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart'; import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
@@ -15,9 +16,10 @@ class SendEmailInteractor {
SendEmailInteractor(this._emailRepository, this._mailboxRepository); SendEmailInteractor(this._emailRepository, this._mailboxRepository);
Stream<Either<Failure, Success>> execute( Stream<Either<Failure, Success>> execute(
AccountId accountId, Session session,
EmailRequest emailRequest, AccountId accountId,
{CreateNewMailboxRequest? mailboxRequest} EmailRequest emailRequest,
{CreateNewMailboxRequest? mailboxRequest}
) async* { ) async* {
try { try {
yield Right<Failure, Success>(SendingEmailState()); yield Right<Failure, Success>(SendingEmailState());
@@ -31,6 +33,7 @@ class SendEmailInteractor {
final currentEmailState = listState.last; final currentEmailState = listState.last;
final result = await _emailRepository.sendEmail( final result = await _emailRepository.sendEmail(
session,
accountId, accountId,
emailRequest, emailRequest,
mailboxRequest: mailboxRequest mailboxRequest: mailboxRequest
@@ -1,6 +1,7 @@
import 'package:core/core.dart'; import 'package:core/core.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.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/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
@@ -12,7 +13,7 @@ class UpdateEmailDraftsInteractor {
UpdateEmailDraftsInteractor(this._emailRepository, this._mailboxRepository); UpdateEmailDraftsInteractor(this._emailRepository, this._mailboxRepository);
Stream<Either<Failure, Success>> execute(AccountId accountId, Email newEmail, EmailId oldEmailId) async* { Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, Email newEmail, EmailId oldEmailId) async* {
try { try {
yield Right<Failure, Success>(UpdatingEmailDrafts()); yield Right<Failure, Success>(UpdatingEmailDrafts());
@@ -24,7 +25,7 @@ class UpdateEmailDraftsInteractor {
final currentMailboxState = listState.first; final currentMailboxState = listState.first;
final currentEmailState = listState.last; final currentEmailState = listState.last;
final newEmailDrafts = await _emailRepository.updateEmailDrafts(accountId, newEmail, oldEmailId); final newEmailDrafts = await _emailRepository.updateEmailDrafts(session, accountId, newEmail, oldEmailId);
yield Right<Failure, Success>( yield Right<Failure, Success>(
UpdateEmailDraftsSuccess( UpdateEmailDraftsSuccess(
newEmailDrafts, newEmailDrafts,
@@ -771,13 +771,14 @@ class ComposerController extends BaseController {
} }
void _handleSendMessages(BuildContext context) async { void _handleSendMessages(BuildContext context) async {
final session = mailboxDashBoardController.sessionCurrent;
final arguments = composerArguments.value; final arguments = composerArguments.value;
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
final sentMailboxId = mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleSent]; final sentMailboxId = mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleSent];
final outboxMailboxId = mailboxDashBoardController.outboxMailbox?.id; final outboxMailboxId = mailboxDashBoardController.outboxMailbox?.id;
final userProfile = mailboxDashBoardController.userProfile.value; final userProfile = mailboxDashBoardController.userProfile.value;
if (arguments != null && accountId != null && userProfile != null) { if (arguments != null && accountId != null && userProfile != null && session != null) {
final email = await _generateEmail(context, userProfile, outboxMailboxId: outboxMailboxId); final email = await _generateEmail(context, userProfile, outboxMailboxId: outboxMailboxId);
final submissionCreateId = Id(_uuid.v1()); final submissionCreateId = Id(_uuid.v1());
final emailRequest = EmailRequest( final emailRequest = EmailRequest(
@@ -793,7 +794,7 @@ class ComposerController extends BaseController {
? CreateNewMailboxRequest(Id(_uuid.v1()), PresentationMailbox.outboxMailboxName) ? CreateNewMailboxRequest(Id(_uuid.v1()), PresentationMailbox.outboxMailboxName)
: null; : null;
mailboxDashBoardController.handleSendEmailAction(accountId, emailRequest, mailboxRequest); mailboxDashBoardController.handleSendEmailAction(session, accountId, emailRequest, mailboxRequest);
uploadController.clearInlineFileUploaded(); uploadController.clearInlineFileUploaded();
} }
@@ -976,8 +977,9 @@ class ComposerController extends BaseController {
final draftMailboxId = mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleDrafts]; final draftMailboxId = mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleDrafts];
final userProfile = mailboxDashBoardController.userProfile.value; final userProfile = mailboxDashBoardController.userProfile.value;
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
final session = mailboxDashBoardController.sessionCurrent;
if (arguments != null && userProfile != null && accountId != null) { if (arguments != null && userProfile != null && accountId != null && session != null) {
final isChanged = await _isEmailChanged(context, arguments); final isChanged = await _isEmailChanged(context, arguments);
if (isChanged && context.mounted) { if (isChanged && context.mounted) {
final newEmail = await _generateEmail( final newEmail = await _generateEmail(
@@ -990,13 +992,14 @@ class ComposerController extends BaseController {
if (arguments.emailActionType == EmailActionType.edit && oldEmail != null && oldEmail.id != null) { if (arguments.emailActionType == EmailActionType.edit && oldEmail != null && oldEmail.id != null) {
mailboxDashBoardController.consumeState( mailboxDashBoardController.consumeState(
_updateEmailDraftsInteractor.execute( _updateEmailDraftsInteractor.execute(
session,
accountId, accountId,
newEmail, newEmail,
oldEmail.id! oldEmail.id!
) )
); );
} else { } else {
mailboxDashBoardController.consumeState(_saveEmailAsDraftsInteractor.execute(accountId, newEmail)); mailboxDashBoardController.consumeState(_saveEmailAsDraftsInteractor.execute(session, accountId, newEmail));
} }
uploadController.clearInlineFileUploaded(); uploadController.clearInlineFileUploaded();
@@ -15,9 +15,14 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_r
abstract class EmailDataSource { abstract class EmailDataSource {
Future<Email> getEmailContent(Session session, AccountId accountId, EmailId emailId); Future<Email> getEmailContent(Session session, AccountId accountId, EmailId emailId);
Future<bool> sendEmail(AccountId accountId, EmailRequest emailRequest, {CreateNewMailboxRequest? mailboxRequest}); Future<bool> sendEmail(
Session session,
AccountId accountId,
EmailRequest emailRequest,
{CreateNewMailboxRequest? mailboxRequest}
);
Future<List<Email>> markAsRead(AccountId accountId, List<Email> emails, ReadActions readActions); Future<List<Email>> markAsRead(Session session, AccountId accountId, List<Email> emails, ReadActions readActions);
Future<List<DownloadTaskId>> downloadAttachments( Future<List<DownloadTaskId>> downloadAttachments(
List<Attachment> attachments, List<Attachment> attachments,
@@ -43,21 +48,22 @@ abstract class EmailDataSource {
StreamController<Either<Failure, Success>> onReceiveController StreamController<Either<Failure, Success>> onReceiveController
); );
Future<List<EmailId>> moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest); Future<List<EmailId>> moveToMailbox(Session session, AccountId accountId, MoveToMailboxRequest moveRequest);
Future<List<Email>> markAsStar( Future<List<Email>> markAsStar(
Session session,
AccountId accountId, AccountId accountId,
List<Email> emails, List<Email> emails,
MarkStarAction markStarAction MarkStarAction markStarAction
); );
Future<Email> saveEmailAsDrafts(AccountId accountId, Email email); Future<Email> saveEmailAsDrafts(Session session, AccountId accountId, Email email);
Future<bool> removeEmailDrafts(AccountId accountId, EmailId emailId); Future<bool> removeEmailDrafts(Session session, AccountId accountId, EmailId emailId);
Future<Email> updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId); Future<Email> updateEmailDrafts(Session session, AccountId accountId, Email newEmail, EmailId oldEmailId);
Future<List<EmailId>> deleteMultipleEmailsPermanently(AccountId accountId, List<EmailId> emailIds); Future<List<EmailId>> deleteMultipleEmailsPermanently(Session session, AccountId accountId, List<EmailId> emailIds);
Future<bool> deleteEmailPermanently(AccountId accountId, EmailId emailId); Future<bool> deleteEmailPermanently(Session session, AccountId accountId, EmailId emailId);
} }
@@ -32,16 +32,26 @@ class EmailDataSourceImpl extends EmailDataSource {
} }
@override @override
Future<bool> sendEmail(AccountId accountId, EmailRequest emailRequest, {CreateNewMailboxRequest? mailboxRequest}) { Future<bool> sendEmail(
Session session,
AccountId accountId,
EmailRequest emailRequest,
{CreateNewMailboxRequest? mailboxRequest}
) {
return Future.sync(() async { return Future.sync(() async {
return await emailAPI.sendEmail(accountId, emailRequest, mailboxRequest: mailboxRequest); return await emailAPI.sendEmail(session, accountId, emailRequest, mailboxRequest: mailboxRequest);
}).catchError(_exceptionThrower.throwException); }).catchError(_exceptionThrower.throwException);
} }
@override @override
Future<List<Email>> markAsRead(AccountId accountId, List<Email> emails, ReadActions readActions) { Future<List<Email>> markAsRead(
Session session,
AccountId accountId,
List<Email> emails,
ReadActions readActions
) {
return Future.sync(() async { return Future.sync(() async {
return await emailAPI.markAsRead(accountId, emails, readActions); return await emailAPI.markAsRead(session, accountId, emails, readActions);
}).catchError(_exceptionThrower.throwException); }).catchError(_exceptionThrower.throwException);
} }
@@ -71,37 +81,37 @@ class EmailDataSourceImpl extends EmailDataSource {
} }
@override @override
Future<List<EmailId>> moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest) { Future<List<EmailId>> moveToMailbox(Session session, AccountId accountId, MoveToMailboxRequest moveRequest) {
return Future.sync(() async { return Future.sync(() async {
return await emailAPI.moveToMailbox(accountId, moveRequest); return await emailAPI.moveToMailbox(session, accountId, moveRequest);
}).catchError(_exceptionThrower.throwException); }).catchError(_exceptionThrower.throwException);
} }
@override @override
Future<List<Email>> markAsStar(AccountId accountId, List<Email> emails, MarkStarAction markStarAction) { Future<List<Email>> markAsStar(Session session, AccountId accountId, List<Email> emails, MarkStarAction markStarAction) {
return Future.sync(() async { return Future.sync(() async {
return await emailAPI.markAsStar(accountId, emails, markStarAction); return await emailAPI.markAsStar(session, accountId, emails, markStarAction);
}).catchError(_exceptionThrower.throwException); }).catchError(_exceptionThrower.throwException);
} }
@override @override
Future<Email> saveEmailAsDrafts(AccountId accountId, Email email) { Future<Email> saveEmailAsDrafts(Session session, AccountId accountId, Email email) {
return Future.sync(() async { return Future.sync(() async {
return await emailAPI.saveEmailAsDrafts(accountId, email); return await emailAPI.saveEmailAsDrafts(session, accountId, email);
}).catchError(_exceptionThrower.throwException); }).catchError(_exceptionThrower.throwException);
} }
@override @override
Future<bool> removeEmailDrafts(AccountId accountId, EmailId emailId) { Future<bool> removeEmailDrafts(Session session, AccountId accountId, EmailId emailId) {
return Future.sync(() async { return Future.sync(() async {
return await emailAPI.removeEmailDrafts(accountId, emailId); return await emailAPI.removeEmailDrafts(session, accountId, emailId);
}).catchError(_exceptionThrower.throwException); }).catchError(_exceptionThrower.throwException);
} }
@override @override
Future<Email> updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId) { Future<Email> updateEmailDrafts(Session session, AccountId accountId, Email newEmail, EmailId oldEmailId) {
return Future.sync(() async { return Future.sync(() async {
return await emailAPI.updateEmailDrafts(accountId, newEmail, oldEmailId); return await emailAPI.updateEmailDrafts(session, accountId, newEmail, oldEmailId);
}).catchError(_exceptionThrower.throwException); }).catchError(_exceptionThrower.throwException);
} }
@@ -126,16 +136,16 @@ class EmailDataSourceImpl extends EmailDataSource {
} }
@override @override
Future<List<EmailId>> deleteMultipleEmailsPermanently(AccountId accountId, List<EmailId> emailIds) { Future<List<EmailId>> deleteMultipleEmailsPermanently(Session session, AccountId accountId, List<EmailId> emailIds) {
return Future.sync(() async { return Future.sync(() async {
return await emailAPI.deleteMultipleEmailsPermanently(accountId, emailIds); return await emailAPI.deleteMultipleEmailsPermanently(session, accountId, emailIds);
}).catchError(_exceptionThrower.throwException); }).catchError(_exceptionThrower.throwException);
} }
@override @override
Future<bool> deleteEmailPermanently(AccountId accountId, EmailId emailId) { Future<bool> deleteEmailPermanently(Session session, AccountId accountId, EmailId emailId) {
return Future.sync(() async { return Future.sync(() async {
return await emailAPI.deleteEmailPermanently(accountId, emailId); return await emailAPI.deleteEmailPermanently(session, accountId, emailId);
}).catchError(_exceptionThrower.throwException); }).catchError(_exceptionThrower.throwException);
} }
} }
+70 -22
View File
@@ -86,11 +86,8 @@ class EmailAPI with HandleSetErrorMixin {
final getEmailInvocation = jmapRequestBuilder.invocation(getEmailMethod); final getEmailInvocation = jmapRequestBuilder.invocation(getEmailMethod);
final capabilitiesSupportTeamMailboxes = getEmailMethod.requiredCapabilities.add(CapabilityIdentifier.jmapTeamMailboxes) as Set<CapabilityIdentifier>; final capabilities = getEmailMethod.requiredCapabilities
.toCapabilitiesSupportTeamMailboxes(session, accountId);
final capabilities = [CapabilityIdentifier.jmapTeamMailboxes].isSupportTeamMailboxes(session, accountId)
? capabilitiesSupportTeamMailboxes
: getEmailMethod.requiredCapabilities;
final result = await (jmapRequestBuilder final result = await (jmapRequestBuilder
..usings(capabilities)) ..usings(capabilities))
@@ -108,6 +105,7 @@ class EmailAPI with HandleSetErrorMixin {
} }
Future<bool> sendEmail( Future<bool> sendEmail(
Session session,
AccountId accountId, AccountId accountId,
EmailRequest emailRequest, EmailRequest emailRequest,
{CreateNewMailboxRequest? mailboxRequest} {CreateNewMailboxRequest? mailboxRequest}
@@ -170,8 +168,11 @@ class EmailAPI with HandleSetErrorMixin {
final setEmailSubmissionInvocation = requestBuilder.invocation(setEmailSubmissionMethod); final setEmailSubmissionInvocation = requestBuilder.invocation(setEmailSubmissionMethod);
final capabilities = setEmailSubmissionMethod.requiredCapabilities
.toCapabilitiesSupportTeamMailboxes(session, accountId);
final response = await (requestBuilder final response = await (requestBuilder
..usings(setEmailSubmissionMethod.requiredCapabilities)) ..usings(capabilities))
.build() .build()
.execute(); .execute();
@@ -228,7 +229,12 @@ class EmailAPI with HandleSetErrorMixin {
return remainedErrors; return remainedErrors;
} }
Future<List<Email>> markAsRead(AccountId accountId, List<Email> emails, ReadActions readActions) async { Future<List<Email>> markAsRead(
Session session,
AccountId accountId,
List<Email> emails,
ReadActions readActions
) async {
final setEmailMethod = SetEmailMethod(accountId) final setEmailMethod = SetEmailMethod(accountId)
..addUpdates(emails.listEmailIds.generateMapUpdateObjectMarkAsRead(readActions)); ..addUpdates(emails.listEmailIds.generateMapUpdateObjectMarkAsRead(readActions));
@@ -242,8 +248,11 @@ class EmailAPI with HandleSetErrorMixin {
final getEmailInvocation = requestBuilder.invocation(getEmailMethod); final getEmailInvocation = requestBuilder.invocation(getEmailMethod);
final capabilities = setEmailMethod.requiredCapabilities
.toCapabilitiesSupportTeamMailboxes(session, accountId);
final response = await (requestBuilder final response = await (requestBuilder
..usings(setEmailMethod.requiredCapabilities)) ..usings(capabilities))
.build() .build()
.execute(); .execute();
@@ -358,7 +367,11 @@ class EmailAPI with HandleSetErrorMixin {
return bytesDownloaded; return bytesDownloaded;
} }
Future<List<EmailId>> moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest) async { Future<List<EmailId>> moveToMailbox(
Session session,
AccountId accountId,
MoveToMailboxRequest moveRequest
) async {
requireCapability(moveRequest.session, accountId, [CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail]); requireCapability(moveRequest.session, accountId, [CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail]);
@@ -388,7 +401,10 @@ class EmailAPI with HandleSetErrorMixin {
..addUpdates(currentItem.value.generateMapUpdateObjectMoveToMailbox(currentItem.key, moveRequest.destinationMailboxId)); ..addUpdates(currentItem.value.generateMapUpdateObjectMoveToMailbox(currentItem.key, moveRequest.destinationMailboxId));
}).map(requestBuilder.invocation).toList(); }).map(requestBuilder.invocation).toList();
final response = await (requestBuilder..usings({CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail})) final capabilities = {CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail}
.toCapabilitiesSupportTeamMailboxes(session, accountId);
final response = await (requestBuilder..usings(capabilities))
.build() .build()
.execute(); .execute();
@@ -414,7 +430,12 @@ class EmailAPI with HandleSetErrorMixin {
} }
Future<List<Email>> markAsStar(AccountId accountId, List<Email> emails, MarkStarAction markStarAction) async { Future<List<Email>> markAsStar(
Session session,
AccountId accountId,
List<Email> emails,
MarkStarAction markStarAction
) async {
final setEmailMethod = SetEmailMethod(accountId) final setEmailMethod = SetEmailMethod(accountId)
..addUpdates(emails.listEmailIds.generateMapUpdateObjectMarkAsStar(markStarAction)); ..addUpdates(emails.listEmailIds.generateMapUpdateObjectMarkAsStar(markStarAction));
@@ -428,8 +449,11 @@ class EmailAPI with HandleSetErrorMixin {
final getEmailInvocation = requestBuilder.invocation(getEmailMethod); final getEmailInvocation = requestBuilder.invocation(getEmailMethod);
final capabilities = setEmailMethod.requiredCapabilities
.toCapabilitiesSupportTeamMailboxes(session, accountId);
final response = await (requestBuilder final response = await (requestBuilder
..usings(setEmailMethod.requiredCapabilities)) ..usings(capabilities))
.build() .build()
.execute(); .execute();
@@ -444,7 +468,7 @@ class EmailAPI with HandleSetErrorMixin {
}); });
} }
Future<Email> saveEmailAsDrafts(AccountId accountId, Email email) async { Future<Email> saveEmailAsDrafts(Session session, AccountId accountId, Email email) async {
final idCreateMethod = Id(_uuid.v1()); final idCreateMethod = Id(_uuid.v1());
final setEmailMethod = SetEmailMethod(accountId) final setEmailMethod = SetEmailMethod(accountId)
..addCreate(idCreateMethod, email); ..addCreate(idCreateMethod, email);
@@ -453,8 +477,11 @@ class EmailAPI with HandleSetErrorMixin {
final setEmailInvocation = requestBuilder.invocation(setEmailMethod); final setEmailInvocation = requestBuilder.invocation(setEmailMethod);
final capabilities = setEmailMethod.requiredCapabilities
.toCapabilitiesSupportTeamMailboxes(session, accountId);
final response = await (requestBuilder final response = await (requestBuilder
..usings(setEmailMethod.requiredCapabilities)) ..usings(capabilities))
.build() .build()
.execute(); .execute();
@@ -474,7 +501,7 @@ class EmailAPI with HandleSetErrorMixin {
} }
} }
Future<bool> removeEmailDrafts(AccountId accountId, EmailId emailId) async { Future<bool> removeEmailDrafts(Session session, AccountId accountId, EmailId emailId) async {
final setEmailMethod = SetEmailMethod(accountId) final setEmailMethod = SetEmailMethod(accountId)
..addDestroy({emailId.id}); ..addDestroy({emailId.id});
@@ -482,8 +509,11 @@ class EmailAPI with HandleSetErrorMixin {
final setEmailInvocation = requestBuilder.invocation(setEmailMethod); final setEmailInvocation = requestBuilder.invocation(setEmailMethod);
final capabilities = setEmailMethod.requiredCapabilities
.toCapabilitiesSupportTeamMailboxes(session, accountId);
final response = await (requestBuilder final response = await (requestBuilder
..usings(setEmailMethod.requiredCapabilities)) ..usings(capabilities))
.build() .build()
.execute(); .execute();
@@ -498,7 +528,12 @@ class EmailAPI with HandleSetErrorMixin {
}); });
} }
Future<Email> updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId) async { Future<Email> updateEmailDrafts(
Session session,
AccountId accountId,
Email newEmail,
EmailId oldEmailId
) async {
final idCreateMethod = Id(_uuid.v1()); final idCreateMethod = Id(_uuid.v1());
final setEmailMethod = SetEmailMethod(accountId) final setEmailMethod = SetEmailMethod(accountId)
..addCreate(idCreateMethod, newEmail) ..addCreate(idCreateMethod, newEmail)
@@ -508,8 +543,11 @@ class EmailAPI with HandleSetErrorMixin {
final setEmailInvocation = requestBuilder.invocation(setEmailMethod); final setEmailInvocation = requestBuilder.invocation(setEmailMethod);
final capabilities = setEmailMethod.requiredCapabilities
.toCapabilitiesSupportTeamMailboxes(session, accountId);
final response = await (requestBuilder final response = await (requestBuilder
..usings(setEmailMethod.requiredCapabilities)) ..usings(capabilities))
.build() .build()
.execute(); .execute();
@@ -530,15 +568,22 @@ class EmailAPI with HandleSetErrorMixin {
} }
} }
Future<List<EmailId>> deleteMultipleEmailsPermanently(AccountId accountId, List<EmailId> emailIds) async { Future<List<EmailId>> deleteMultipleEmailsPermanently(
Session session,
AccountId accountId,
List<EmailId> emailIds
) async {
final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation());
final setEmailMethod = SetEmailMethod(accountId) final setEmailMethod = SetEmailMethod(accountId)
..addDestroy(emailIds.map((emailId) => emailId.id).toSet()); ..addDestroy(emailIds.map((emailId) => emailId.id).toSet());
final setEmailInvocation = requestBuilder.invocation(setEmailMethod); final setEmailInvocation = requestBuilder.invocation(setEmailMethod);
final capabilities = setEmailMethod.requiredCapabilities
.toCapabilitiesSupportTeamMailboxes(session, accountId);
final response = await (requestBuilder final response = await (requestBuilder
..usings(setEmailMethod.requiredCapabilities)) ..usings(capabilities))
.build() .build()
.execute(); .execute();
@@ -555,15 +600,18 @@ class EmailAPI with HandleSetErrorMixin {
return List.empty(); return List.empty();
} }
Future<bool> deleteEmailPermanently(AccountId accountId, EmailId emailId) async { Future<bool> deleteEmailPermanently(Session session, AccountId accountId, EmailId emailId) async {
final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation());
final setEmailMethod = SetEmailMethod(accountId) final setEmailMethod = SetEmailMethod(accountId)
..addDestroy({emailId.id}); ..addDestroy({emailId.id});
final setEmailInvocation = requestBuilder.invocation(setEmailMethod); final setEmailInvocation = requestBuilder.invocation(setEmailMethod);
final capabilities = setEmailMethod.requiredCapabilities
.toCapabilitiesSupportTeamMailboxes(session, accountId);
final response = await (requestBuilder final response = await (requestBuilder
..usings(setEmailMethod.requiredCapabilities)) ..usings(capabilities))
.build() .build()
.execute(); .execute();
@@ -37,13 +37,23 @@ class EmailRepositoryImpl extends EmailRepository {
} }
@override @override
Future<bool> sendEmail(AccountId accountId, EmailRequest emailRequest, {CreateNewMailboxRequest? mailboxRequest}) { Future<bool> sendEmail(
return emailDataSource.sendEmail(accountId, emailRequest, mailboxRequest: mailboxRequest); Session session,
AccountId accountId,
EmailRequest emailRequest,
{CreateNewMailboxRequest? mailboxRequest}
) {
return emailDataSource.sendEmail(session, accountId, emailRequest, mailboxRequest: mailboxRequest);
} }
@override @override
Future<List<Email>> markAsRead(AccountId accountId, List<Email> emails, ReadActions readActions) { Future<List<Email>> markAsRead(
return emailDataSource.markAsRead(accountId, emails, readActions); Session session,
AccountId accountId,
List<Email> emails,
ReadActions readActions
) {
return emailDataSource.markAsRead(session, accountId, emails, readActions);
} }
@override @override
@@ -73,17 +83,18 @@ class EmailRepositoryImpl extends EmailRepository {
} }
@override @override
Future<List<EmailId>> moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest) { Future<List<EmailId>> moveToMailbox(Session session, AccountId accountId, MoveToMailboxRequest moveRequest) {
return emailDataSource.moveToMailbox(accountId, moveRequest); return emailDataSource.moveToMailbox(session, accountId, moveRequest);
} }
@override @override
Future<List<Email>> markAsStar( Future<List<Email>> markAsStar(
AccountId accountId, Session session,
List<Email> emails, AccountId accountId,
MarkStarAction markStarAction List<Email> emails,
MarkStarAction markStarAction
) { ) {
return emailDataSource.markAsStar(accountId, emails, markStarAction); return emailDataSource.markAsStar(session, accountId, emails, markStarAction);
} }
@override @override
@@ -110,18 +121,18 @@ class EmailRepositoryImpl extends EmailRepository {
} }
@override @override
Future<Email> saveEmailAsDrafts(AccountId accountId, Email email) { Future<Email> saveEmailAsDrafts(Session session, AccountId accountId, Email email) {
return emailDataSource.saveEmailAsDrafts(accountId, email); return emailDataSource.saveEmailAsDrafts(session, accountId, email);
} }
@override @override
Future<bool> removeEmailDrafts(AccountId accountId, EmailId emailId) { Future<bool> removeEmailDrafts(Session session, AccountId accountId, EmailId emailId) {
return emailDataSource.removeEmailDrafts(accountId, emailId); return emailDataSource.removeEmailDrafts(session, accountId, emailId);
} }
@override @override
Future<Email> updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId) { Future<Email> updateEmailDrafts(Session session, AccountId accountId, Email newEmail, EmailId oldEmailId) {
return emailDataSource.updateEmailDrafts(accountId, newEmail, oldEmailId); return emailDataSource.updateEmailDrafts(session, accountId, newEmail, oldEmailId);
} }
@override @override
@@ -143,13 +154,13 @@ class EmailRepositoryImpl extends EmailRepository {
} }
@override @override
Future<List<EmailId>> deleteMultipleEmailsPermanently(AccountId accountId, List<EmailId> emailIds) { Future<List<EmailId>> deleteMultipleEmailsPermanently(Session session, AccountId accountId, List<EmailId> emailIds) {
return emailDataSource.deleteMultipleEmailsPermanently(accountId, emailIds); return emailDataSource.deleteMultipleEmailsPermanently(session, accountId, emailIds);
} }
@override @override
Future<bool> deleteEmailPermanently(AccountId accountId, EmailId emailId) { Future<bool> deleteEmailPermanently(Session session, AccountId accountId, EmailId emailId) {
return emailDataSource.deleteEmailPermanently(accountId, emailId); return emailDataSource.deleteEmailPermanently(session, accountId, emailId);
} }
@override @override
@@ -16,9 +16,14 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_r
abstract class EmailRepository { abstract class EmailRepository {
Future<Email> getEmailContent(Session session, AccountId accountId, EmailId emailId); Future<Email> getEmailContent(Session session, AccountId accountId, EmailId emailId);
Future<bool> sendEmail(AccountId accountId, EmailRequest emailRequest, {CreateNewMailboxRequest? mailboxRequest}); Future<bool> sendEmail(
Session session,
AccountId accountId,
EmailRequest emailRequest,
{CreateNewMailboxRequest? mailboxRequest}
);
Future<List<Email>> markAsRead(AccountId accountId, List<Email> emails, ReadActions readActions); Future<List<Email>> markAsRead(Session session, AccountId accountId, List<Email> emails, ReadActions readActions);
Future<List<DownloadTaskId>> downloadAttachments( Future<List<DownloadTaskId>> downloadAttachments(
List<Attachment> attachments, List<Attachment> attachments,
@@ -44,9 +49,10 @@ abstract class EmailRepository {
StreamController<Either<Failure, Success>> onReceiveController StreamController<Either<Failure, Success>> onReceiveController
); );
Future<List<EmailId>> moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest); Future<List<EmailId>> moveToMailbox(Session session, AccountId accountId, MoveToMailboxRequest moveRequest);
Future<List<Email>> markAsStar( Future<List<Email>> markAsStar(
Session session,
AccountId accountId, AccountId accountId,
List<Email> emails, List<Email> emails,
MarkStarAction markStarAction MarkStarAction markStarAction
@@ -62,15 +68,15 @@ abstract class EmailRepository {
Future<List<EmailContent>> addTooltipWhenHoverOnLink(List<EmailContent> emailContents); Future<List<EmailContent>> addTooltipWhenHoverOnLink(List<EmailContent> emailContents);
Future<Email> saveEmailAsDrafts(AccountId accountId, Email email); Future<Email> saveEmailAsDrafts(Session session, AccountId accountId, Email email);
Future<bool> removeEmailDrafts(AccountId accountId, EmailId emailId); Future<bool> removeEmailDrafts(Session session, AccountId accountId, EmailId emailId);
Future<Email> updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId); Future<Email> updateEmailDrafts(Session session, AccountId accountId, Email newEmail, EmailId oldEmailId);
Future<List<EmailId>> deleteMultipleEmailsPermanently(AccountId accountId, List<EmailId> emailIds); Future<List<EmailId>> deleteMultipleEmailsPermanently(Session session, AccountId accountId, List<EmailId> emailIds);
Future<bool> deleteEmailPermanently(AccountId accountId, EmailId emailId); Future<bool> deleteEmailPermanently(Session session, AccountId accountId, EmailId emailId);
Future<jmap.State?> getEmailState(); Future<jmap.State?> getEmailState();
} }
@@ -1,6 +1,7 @@
import 'package:core/core.dart'; import 'package:core/core.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.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/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/email/domain/state/delete_email_permanently_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/delete_email_permanently_state.dart';
@@ -12,7 +13,7 @@ class DeleteEmailPermanentlyInteractor {
DeleteEmailPermanentlyInteractor(this._emailRepository, this._mailboxRepository); DeleteEmailPermanentlyInteractor(this._emailRepository, this._mailboxRepository);
Stream<Either<Failure, Success>> execute(AccountId accountId, EmailId emailId) async* { Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, EmailId emailId) async* {
try { try {
yield Right<Failure, Success>(StartDeleteEmailPermanently()); yield Right<Failure, Success>(StartDeleteEmailPermanently());
@@ -24,7 +25,7 @@ class DeleteEmailPermanentlyInteractor {
final currentMailboxState = listState.first; final currentMailboxState = listState.first;
final currentEmailState = listState.last; final currentEmailState = listState.last;
final result = await _emailRepository.deleteEmailPermanently(accountId, emailId); final result = await _emailRepository.deleteEmailPermanently(session, accountId, emailId);
if (result) { if (result) {
yield Right<Failure, Success>(DeleteEmailPermanentlySuccess( yield Right<Failure, Success>(DeleteEmailPermanentlySuccess(
currentEmailState: currentEmailState, currentEmailState: currentEmailState,
@@ -1,6 +1,7 @@
import 'package:core/core.dart'; import 'package:core/core.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.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/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.dart';
@@ -12,7 +13,7 @@ class DeleteMultipleEmailsPermanentlyInteractor {
DeleteMultipleEmailsPermanentlyInteractor(this._emailRepository, this._mailboxRepository); DeleteMultipleEmailsPermanentlyInteractor(this._emailRepository, this._mailboxRepository);
Stream<Either<Failure, Success>> execute(AccountId accountId, List<EmailId> emailIds) async* { Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, List<EmailId> emailIds) async* {
try { try {
yield Right<Failure, Success>(LoadingDeleteMultipleEmailsPermanentlyAll()); yield Right<Failure, Success>(LoadingDeleteMultipleEmailsPermanentlyAll());
@@ -24,7 +25,7 @@ class DeleteMultipleEmailsPermanentlyInteractor {
final currentMailboxState = listState.first; final currentMailboxState = listState.first;
final currentEmailState = listState.last; final currentEmailState = listState.last;
final listResult = await _emailRepository.deleteMultipleEmailsPermanently(accountId, emailIds); final listResult = await _emailRepository.deleteMultipleEmailsPermanently(session, accountId, emailIds);
if (listResult.length == emailIds.length) { if (listResult.length == emailIds.length) {
yield Right<Failure, Success>(DeleteMultipleEmailsPermanentlyAllSuccess( yield Right<Failure, Success>(DeleteMultipleEmailsPermanentlyAllSuccess(
listResult, listResult,
@@ -1,6 +1,7 @@
import 'package:core/core.dart'; import 'package:core/core.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.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/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:model/model.dart'; import 'package:model/model.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
@@ -13,7 +14,7 @@ class MarkAsEmailReadInteractor {
MarkAsEmailReadInteractor(this._emailRepository, this._mailboxRepository); MarkAsEmailReadInteractor(this._emailRepository, this._mailboxRepository);
Stream<Either<Failure, Success>> execute(AccountId accountId, Email email, ReadActions readAction) async* { Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, Email email, ReadActions readAction) async* {
try { try {
final listState = await Future.wait([ final listState = await Future.wait([
_mailboxRepository.getMailboxState(), _mailboxRepository.getMailboxState(),
@@ -23,7 +24,7 @@ class MarkAsEmailReadInteractor {
final currentMailboxState = listState.first; final currentMailboxState = listState.first;
final currentEmailState = listState.last; final currentEmailState = listState.last;
final result = await _emailRepository.markAsRead(accountId, [email], readAction); final result = await _emailRepository.markAsRead(session, accountId, [email], readAction);
if (result.isNotEmpty) { if (result.isNotEmpty) {
final updatedEmail = email.updatedEmail(newKeywords: result.first.keywords); final updatedEmail = email.updatedEmail(newKeywords: result.first.keywords);
yield Right(MarkAsEmailReadSuccess( yield Right(MarkAsEmailReadSuccess(
@@ -1,6 +1,7 @@
import 'package:core/core.dart'; import 'package:core/core.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.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/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:model/model.dart'; import 'package:model/model.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
@@ -11,10 +12,10 @@ class MarkAsStarEmailInteractor {
MarkAsStarEmailInteractor(this.emailRepository); MarkAsStarEmailInteractor(this.emailRepository);
Stream<Either<Failure, Success>> execute(AccountId accountId, Email email, MarkStarAction markStarAction) async* { Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, Email email, MarkStarAction markStarAction) async* {
try { try {
final currentEmailState = await emailRepository.getEmailState(); final currentEmailState = await emailRepository.getEmailState();
final result = await emailRepository.markAsStar(accountId, [email], markStarAction); final result = await emailRepository.markAsStar(session, accountId, [email], markStarAction);
if (result.isNotEmpty) { if (result.isNotEmpty) {
final updatedEmail = email.updatedEmail(newKeywords: result.first.keywords); final updatedEmail = email.updatedEmail(newKeywords: result.first.keywords);
yield Right(MarkAsStarEmailSuccess( yield Right(MarkAsStarEmailSuccess(
@@ -1,6 +1,7 @@
import 'package:core/core.dart'; import 'package:core/core.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart';
@@ -12,7 +13,7 @@ class MoveToMailboxInteractor {
MoveToMailboxInteractor(this._emailRepository, this._mailboxRepository); MoveToMailboxInteractor(this._emailRepository, this._mailboxRepository);
Stream<Either<Failure, Success>> execute(AccountId accountId, MoveToMailboxRequest moveRequest) async* { Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, MoveToMailboxRequest moveRequest) async* {
try { try {
yield Right(LoadingMoveToMailbox()); yield Right(LoadingMoveToMailbox());
@@ -24,7 +25,7 @@ class MoveToMailboxInteractor {
final currentMailboxState = listState.first; final currentMailboxState = listState.first;
final currentEmailState = listState.last; final currentEmailState = listState.last;
final result = await _emailRepository.moveToMailbox(accountId, moveRequest); final result = await _emailRepository.moveToMailbox(session, accountId, moveRequest);
if (result.isNotEmpty) { if (result.isNotEmpty) {
yield Right(MoveToMailboxSuccess( yield Right(MoveToMailboxSuccess(
result.first, result.first,
@@ -408,8 +408,9 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
void markAsEmailRead(PresentationEmail presentationEmail, ReadActions readActions) async { void markAsEmailRead(PresentationEmail presentationEmail, ReadActions readActions) async {
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
if (accountId != null) { final session = mailboxDashBoardController.sessionCurrent;
consumeState(_markAsEmailReadInteractor.execute(accountId, presentationEmail.toEmail(), readActions)); if (accountId != null && session != null) {
consumeState(_markAsEmailReadInteractor.execute(session, accountId, presentationEmail.toEmail(), readActions));
} }
} }
@@ -664,21 +665,33 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
PresentationMailbox destinationMailbox PresentationMailbox destinationMailbox
) { ) {
if (destinationMailbox.isTrash) { if (destinationMailbox.isTrash) {
_moveToTrashAction(context, accountId, MoveToMailboxRequest( _moveToTrashAction(
context,
session,
accountId,
MoveToMailboxRequest(
{currentMailbox.id: [emailSelected.id!]}, {currentMailbox.id: [emailSelected.id!]},
destinationMailbox.id, destinationMailbox.id,
MoveAction.moving, MoveAction.moving,
session, session,
EmailActionType.moveToTrash)); EmailActionType.moveToTrash));
} else if (destinationMailbox.isSpam) { } else if (destinationMailbox.isSpam) {
_moveToSpamAction(context, accountId, MoveToMailboxRequest( _moveToSpamAction(
context,
session,
accountId,
MoveToMailboxRequest(
{currentMailbox.id: [emailSelected.id!]}, {currentMailbox.id: [emailSelected.id!]},
destinationMailbox.id, destinationMailbox.id,
MoveAction.moving, MoveAction.moving,
session, session,
EmailActionType.moveToSpam)); EmailActionType.moveToSpam));
} else { } else {
_moveToMailbox(context, accountId, MoveToMailboxRequest( _moveToMailbox(
context,
session,
accountId,
MoveToMailboxRequest(
{currentMailbox.id: [emailSelected.id!]}, {currentMailbox.id: [emailSelected.id!]},
destinationMailbox.id, destinationMailbox.id,
MoveAction.moving, MoveAction.moving,
@@ -688,9 +701,9 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
} }
} }
void _moveToMailbox(BuildContext context, AccountId accountId, MoveToMailboxRequest moveRequest) { void _moveToMailbox(BuildContext context, Session session, AccountId accountId, MoveToMailboxRequest moveRequest) {
closeEmailView(context); closeEmailView(context);
consumeState(_moveToMailboxInteractor.execute(accountId, moveRequest)); consumeState(_moveToMailboxInteractor.execute(session, accountId, moveRequest));
} }
void _moveToMailboxSuccess(MoveToMailboxSuccess success) { void _moveToMailboxSuccess(MoveToMailboxSuccess success) {
@@ -719,39 +732,55 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
void _revertedToOriginalMailbox(MoveToMailboxRequest newMoveRequest) { void _revertedToOriginalMailbox(MoveToMailboxRequest newMoveRequest) {
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
if (accountId != null) { final session = mailboxDashBoardController.sessionCurrent;
_moveToMailbox(currentContext!, accountId, newMoveRequest); if (accountId != null && session != null) {
_moveToMailbox(currentContext!, session, accountId, newMoveRequest);
} }
} }
void moveToTrash(BuildContext context, PresentationEmail email) async { void moveToTrash(BuildContext context, PresentationEmail email) async {
final session = mailboxDashBoardController.sessionCurrent;
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
final trashMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleTrash); final trashMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleTrash);
final currentMailbox = getMailboxContain(email); final currentMailbox = getMailboxContain(email);
if (accountId != null && currentMailbox != null && trashMailboxId != null) { if (session != null && accountId != null && currentMailbox != null && trashMailboxId != null) {
_moveToTrashAction(context, accountId, MoveToMailboxRequest( _moveToTrashAction(
{currentMailbox.id: [email.id!]}, context,
trashMailboxId, session,
MoveAction.moving, accountId,
mailboxDashBoardController.sessionCurrent!, MoveToMailboxRequest(
EmailActionType.moveToTrash) {currentMailbox.id: [email.id!]},
trashMailboxId,
MoveAction.moving,
mailboxDashBoardController.sessionCurrent!,
EmailActionType.moveToTrash)
); );
} }
} }
void _moveToTrashAction(BuildContext context, AccountId accountId, MoveToMailboxRequest moveRequest) { void _moveToTrashAction(
BuildContext context,
Session session,
AccountId accountId,
MoveToMailboxRequest moveRequest
) {
closeEmailView(context); closeEmailView(context);
mailboxDashBoardController.moveToMailbox(accountId, moveRequest); mailboxDashBoardController.moveToMailbox(session, accountId, moveRequest);
} }
void moveToSpam(BuildContext context, PresentationEmail email) async { void moveToSpam(BuildContext context, PresentationEmail email) async {
final session = mailboxDashBoardController.sessionCurrent;
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
final spamMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleSpam); final spamMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleSpam);
final currentMailbox = getMailboxContain(email); final currentMailbox = getMailboxContain(email);
if (accountId != null && currentMailbox != null && spamMailboxId != null) { if (session != null && accountId != null && currentMailbox != null && spamMailboxId != null) {
_moveToSpamAction(context, accountId, MoveToMailboxRequest( _moveToSpamAction(
context,
session,
accountId,
MoveToMailboxRequest(
{currentMailbox.id: [email.id!]}, {currentMailbox.id: [email.id!]},
spamMailboxId, spamMailboxId,
MoveAction.moving, MoveAction.moving,
@@ -762,12 +791,17 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
} }
void unSpam(BuildContext context, PresentationEmail email) async { void unSpam(BuildContext context, PresentationEmail email) async {
final session = mailboxDashBoardController.sessionCurrent;
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
final spamMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleSpam); final spamMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleSpam);
final inboxMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleInbox); final inboxMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleInbox);
if (accountId != null && spamMailboxId != null && inboxMailboxId != null) { if (session != null && accountId != null && spamMailboxId != null && inboxMailboxId != null) {
_moveToSpamAction(context, accountId, MoveToMailboxRequest( _moveToSpamAction(
context,
session,
accountId,
MoveToMailboxRequest(
{spamMailboxId: [email.id!]}, {spamMailboxId: [email.id!]},
inboxMailboxId, inboxMailboxId,
MoveAction.moving, MoveAction.moving,
@@ -777,15 +811,21 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
} }
} }
void _moveToSpamAction(BuildContext context, AccountId accountId, MoveToMailboxRequest moveRequest) { void _moveToSpamAction(
BuildContext context,
Session session,
AccountId accountId,
MoveToMailboxRequest moveRequest
) {
closeEmailView(context); closeEmailView(context);
mailboxDashBoardController.moveToMailbox(accountId, moveRequest); mailboxDashBoardController.moveToMailbox(session, accountId, moveRequest);
} }
void markAsStarEmail(PresentationEmail presentationEmail, MarkStarAction markStarAction) async { void markAsStarEmail(PresentationEmail presentationEmail, MarkStarAction markStarAction) async {
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
if (accountId != null) { final session = mailboxDashBoardController.sessionCurrent;
consumeState(_markAsStarEmailInteractor.execute(accountId, presentationEmail.toEmail(), markStarAction)); if (accountId != null && session != null) {
consumeState(_markAsStarEmailInteractor.execute(session, accountId, presentationEmail.toEmail(), markStarAction));
} }
} }
@@ -52,9 +52,8 @@ class MailboxAPI with HandleSetErrorMixin {
final queryInvocation = jmapRequestBuilder.invocation(getMailboxCreated); final queryInvocation = jmapRequestBuilder.invocation(getMailboxCreated);
final capabilities = [CapabilityIdentifier.jmapTeamMailboxes].isSupportTeamMailboxes(session, accountId) final capabilities = getMailboxCreated.requiredCapabilities
? getMailboxCreated.requiredCapabilitiesSupportTeamMailboxes .toCapabilitiesSupportTeamMailboxes(session, accountId);
: getMailboxCreated.requiredCapabilities;
final result = await (jmapRequestBuilder final result = await (jmapRequestBuilder
..usings(capabilities)) ..usings(capabilities))
@@ -93,9 +92,8 @@ class MailboxAPI with HandleSetErrorMixin {
final getMailboxUpdatedInvocation = jmapRequestBuilder.invocation(getMailboxUpdated); final getMailboxUpdatedInvocation = jmapRequestBuilder.invocation(getMailboxUpdated);
final getMailboxCreatedInvocation = jmapRequestBuilder.invocation(getMailboxCreated); final getMailboxCreatedInvocation = jmapRequestBuilder.invocation(getMailboxCreated);
final capabilities = [CapabilityIdentifier.jmapTeamMailboxes].isSupportTeamMailboxes(session, accountId) final capabilities = getMailboxUpdated.requiredCapabilities
? getMailboxUpdated.requiredCapabilitiesSupportTeamMailboxes .toCapabilitiesSupportTeamMailboxes(session, accountId);
: getMailboxUpdated.requiredCapabilities;
final result = await (jmapRequestBuilder final result = await (jmapRequestBuilder
..usings(capabilities)) ..usings(capabilities))
@@ -141,9 +139,8 @@ class MailboxAPI with HandleSetErrorMixin {
final setMailboxInvocation = requestBuilder.invocation(setMailboxMethod); final setMailboxInvocation = requestBuilder.invocation(setMailboxMethod);
final capabilities = [CapabilityIdentifier.jmapTeamMailboxes].isSupportTeamMailboxes(session, accountId) final capabilities = setMailboxMethod.requiredCapabilities
? setMailboxMethod.requiredCapabilities.add(CapabilityIdentifier.jmapTeamMailboxes) as Set<CapabilityIdentifier> .toCapabilitiesSupportTeamMailboxes(session, accountId);
: setMailboxMethod.requiredCapabilities;
final response = await (requestBuilder final response = await (requestBuilder
..usings(capabilities)) ..usings(capabilities))
@@ -212,9 +209,8 @@ class MailboxAPI with HandleSetErrorMixin {
.map(requestBuilder.invocation) .map(requestBuilder.invocation)
.toList(); .toList();
final capabilities = [CapabilityIdentifier.jmapTeamMailboxes].isSupportTeamMailboxes(session, accountId) final capabilities = {CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail}
? {CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail, CapabilityIdentifier.jmapTeamMailboxes} .toCapabilitiesSupportTeamMailboxes(session, accountId);
: {CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail};
final response = await (requestBuilder final response = await (requestBuilder
..usings(capabilities)) ..usings(capabilities))
@@ -258,9 +254,8 @@ class MailboxAPI with HandleSetErrorMixin {
final setMailboxInvocation = requestBuilder.invocation(setMailboxMethod); final setMailboxInvocation = requestBuilder.invocation(setMailboxMethod);
final capabilities = [CapabilityIdentifier.jmapTeamMailboxes].isSupportTeamMailboxes(session, accountId) final capabilities = setMailboxMethod.requiredCapabilities
? setMailboxMethod.requiredCapabilities.add(CapabilityIdentifier.jmapTeamMailboxes) as Set<CapabilityIdentifier> .toCapabilitiesSupportTeamMailboxes(session, accountId);
: setMailboxMethod.requiredCapabilities;
final response = await (requestBuilder final response = await (requestBuilder
..usings(capabilities)) ..usings(capabilities))
@@ -290,9 +285,8 @@ class MailboxAPI with HandleSetErrorMixin {
final setMailboxInvocation = requestBuilder.invocation(setMailboxMethod); final setMailboxInvocation = requestBuilder.invocation(setMailboxMethod);
final capabilities = [CapabilityIdentifier.jmapTeamMailboxes].isSupportTeamMailboxes(session, accountId) final capabilities = setMailboxMethod.requiredCapabilities
? setMailboxMethod.requiredCapabilities.add(CapabilityIdentifier.jmapTeamMailboxes) as Set<CapabilityIdentifier> .toCapabilitiesSupportTeamMailboxes(session, accountId);
: setMailboxMethod.requiredCapabilities;
final response = await (requestBuilder final response = await (requestBuilder
..usings(capabilities)) ..usings(capabilities))
@@ -322,9 +316,8 @@ class MailboxAPI with HandleSetErrorMixin {
final setMailboxInvocation = requestBuilder.invocation(setMailboxMethod); final setMailboxInvocation = requestBuilder.invocation(setMailboxMethod);
final capabilities = [CapabilityIdentifier.jmapTeamMailboxes].isSupportTeamMailboxes(session, accountId) final capabilities = setMailboxMethod.requiredCapabilities
? setMailboxMethod.requiredCapabilities.add(CapabilityIdentifier.jmapTeamMailboxes) as Set<CapabilityIdentifier> .toCapabilitiesSupportTeamMailboxes(session, accountId);
: setMailboxMethod.requiredCapabilities;
final response = await (requestBuilder final response = await (requestBuilder
..usings(capabilities)) ..usings(capabilities))
@@ -357,9 +350,8 @@ class MailboxAPI with HandleSetErrorMixin {
final setMailboxInvocation = requestBuilder.invocation(setMailboxMethod); final setMailboxInvocation = requestBuilder.invocation(setMailboxMethod);
final capabilities = [CapabilityIdentifier.jmapTeamMailboxes].isSupportTeamMailboxes(session, accountId) final capabilities = setMailboxMethod.requiredCapabilities
? setMailboxMethod.requiredCapabilities.add(CapabilityIdentifier.jmapTeamMailboxes) as Set<CapabilityIdentifier> .toCapabilitiesSupportTeamMailboxes(session, accountId);
: setMailboxMethod.requiredCapabilities;
final response = await (requestBuilder final response = await (requestBuilder
..usings(capabilities)) ..usings(capabilities))
@@ -118,9 +118,10 @@ class MailboxIsolateWorker {
lastReceivedDate = listEmailUnread.last.receivedAt; lastReceivedDate = listEmailUnread.last.receivedAt;
final result = await args.emailAPI.markAsRead( final result = await args.emailAPI.markAsRead(
args.accountId, args.session,
listEmailUnread, args.accountId,
ReadActions.markAsRead); listEmailUnread,
ReadActions.markAsRead);
log('MailboxIsolateWorker::_handleMarkAsMailboxRead(): MARK_READ: ${result.length}'); log('MailboxIsolateWorker::_handleMarkAsMailboxRead(): MARK_READ: ${result.length}');
emailListCompleted.addAll(result); emailListCompleted.addAll(result);
@@ -184,8 +185,7 @@ class MailboxIsolateWorker {
lastEmailId = listEmailUnread.last.id; lastEmailId = listEmailUnread.last.id;
lastReceivedDate = listEmailUnread.last.receivedAt; lastReceivedDate = listEmailUnread.last.receivedAt;
final result = await _emailApi.markAsRead( final result = await _emailApi.markAsRead(session, accountId, listEmailUnread, ReadActions.markAsRead);
accountId, listEmailUnread, ReadActions.markAsRead);
log('MailboxIsolateWorker::_handleMarkAsMailboxReadActionOnWeb(): MARK_READ: ${result.length}'); log('MailboxIsolateWorker::_handleMarkAsMailboxReadActionOnWeb(): MARK_READ: ${result.length}');
emailListCompleted.addAll(result); emailListCompleted.addAll(result);
@@ -1,6 +1,5 @@
import 'package:jmap_dart_client/http/http_client.dart'; import 'package:jmap_dart_client/http/http_client.dart';
import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart';
import 'package:jmap_dart_client/jmap/core/request/reference_path.dart'; import 'package:jmap_dart_client/jmap/core/request/reference_path.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
@@ -40,9 +39,8 @@ class SpamReportApi {
)); ));
final getMailboxInvocation = requestBuilder.invocation(getMailBoxMethod); final getMailboxInvocation = requestBuilder.invocation(getMailBoxMethod);
final capabilities = [CapabilityIdentifier.jmapTeamMailboxes].isSupportTeamMailboxes(session, accountId) final capabilities = getMailBoxMethod.requiredCapabilities
? getMailBoxMethod.requiredCapabilitiesSupportTeamMailboxes .toCapabilitiesSupportTeamMailboxes(session, accountId);
: getMailBoxMethod.requiredCapabilities;
final result = await (requestBuilder final result = await (requestBuilder
..usings(capabilities)) ..usings(capabilities))
@@ -1,6 +1,7 @@
import 'package:core/core.dart'; import 'package:core/core.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.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/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
@@ -12,7 +13,7 @@ class RemoveEmailDraftsInteractor {
RemoveEmailDraftsInteractor(this._emailRepository, this._mailboxRepository); RemoveEmailDraftsInteractor(this._emailRepository, this._mailboxRepository);
Stream<Either<Failure, Success>> execute(AccountId accountId, EmailId emailId) async* { Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, EmailId emailId) async* {
try { try {
final listState = await Future.wait([ final listState = await Future.wait([
_mailboxRepository.getMailboxState(), _mailboxRepository.getMailboxState(),
@@ -22,7 +23,7 @@ class RemoveEmailDraftsInteractor {
final currentMailboxState = listState.first; final currentMailboxState = listState.first;
final currentEmailState = listState.last; final currentEmailState = listState.last;
final result = await _emailRepository.removeEmailDrafts(accountId, emailId); final result = await _emailRepository.removeEmailDrafts(session, accountId, emailId);
if (result) { if (result) {
yield Right<Failure, Success>(RemoveEmailDraftsSuccess( yield Right<Failure, Success>(RemoveEmailDraftsSuccess(
currentEmailState: currentEmailState, currentEmailState: currentEmailState,
@@ -592,8 +592,8 @@ class MailboxDashBoardController extends ReloadableController {
} }
} }
void moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest) { void moveToMailbox(Session session, AccountId accountId, MoveToMailboxRequest moveRequest) {
consumeState(_moveToMailboxInteractor.execute(accountId, moveRequest)); consumeState(_moveToMailboxInteractor.execute(session, accountId, moveRequest));
} }
void _moveToMailboxSuccess(MoveToMailboxSuccess success) { void _moveToMailboxSuccess(MoveToMailboxSuccess success) {
@@ -621,22 +621,25 @@ class MailboxDashBoardController extends ReloadableController {
void _revertedToOriginalMailbox(MoveToMailboxRequest newMoveRequest) { void _revertedToOriginalMailbox(MoveToMailboxRequest newMoveRequest) {
final currentAccountId = accountId.value; final currentAccountId = accountId.value;
if (currentAccountId != null) { final session = sessionCurrent;
consumeState(_moveToMailboxInteractor.execute(currentAccountId, newMoveRequest)); if (currentAccountId != null && session != null) {
consumeState(_moveToMailboxInteractor.execute(session, currentAccountId, newMoveRequest));
} }
} }
void _discardEmail(Email email) { void _discardEmail(Email email) {
final currentAccountId = accountId.value; final currentAccountId = accountId.value;
if (currentAccountId != null && email.id != null) { final session = sessionCurrent;
consumeState(_removeEmailDraftsInteractor.execute(currentAccountId, email.id!)); if (currentAccountId != null && session != null && email.id != null) {
consumeState(_removeEmailDraftsInteractor.execute(session, currentAccountId, email.id!));
} }
} }
void deleteEmailPermanently(PresentationEmail email) { void deleteEmailPermanently(PresentationEmail email) {
final currentAccountId = accountId.value; final currentAccountId = accountId.value;
if (currentAccountId != null && email.id != null) { final session = sessionCurrent;
consumeState(_deleteEmailPermanentlyInteractor.execute(currentAccountId, email.id!)); if (currentAccountId != null && session != null && email.id != null) {
consumeState(_deleteEmailPermanentlyInteractor.execute(session, currentAccountId, email.id!));
} }
} }
@@ -651,20 +654,22 @@ class MailboxDashBoardController extends ReloadableController {
} }
void markAsEmailRead(PresentationEmail presentationEmail, ReadActions readActions) async { void markAsEmailRead(PresentationEmail presentationEmail, ReadActions readActions) async {
if (accountId.value != null) { if (accountId.value != null && sessionCurrent != null) {
consumeState(_markAsEmailReadInteractor.execute( consumeState(_markAsEmailReadInteractor.execute(
accountId.value!, sessionCurrent!,
presentationEmail.toEmail(), accountId.value!,
readActions)); presentationEmail.toEmail(),
readActions));
} }
} }
void markAsStarEmail(PresentationEmail presentationEmail, MarkStarAction action) { void markAsStarEmail(PresentationEmail presentationEmail, MarkStarAction action) {
if (accountId.value != null) { if (accountId.value != null && sessionCurrent != null) {
consumeState(_markAsStarEmailInteractor.execute( consumeState(_markAsStarEmailInteractor.execute(
accountId.value!, sessionCurrent!,
presentationEmail.toEmail(), accountId.value!,
action)); presentationEmail.toEmail(),
action));
} }
} }
@@ -673,11 +678,12 @@ class MailboxDashBoardController extends ReloadableController {
.map((presentationEmail) => presentationEmail.toEmail()) .map((presentationEmail) => presentationEmail.toEmail())
.toList(); .toList();
log('MailboxDashBoardController::markAsReadSelectedMultipleEmail(): listEmail: ${listEmail.length}'); log('MailboxDashBoardController::markAsReadSelectedMultipleEmail(): listEmail: ${listEmail.length}');
if (accountId.value != null) { if (accountId.value != null && sessionCurrent != null) {
consumeState(_markAsMultipleEmailReadInteractor.execute( consumeState(_markAsMultipleEmailReadInteractor.execute(
accountId.value!, sessionCurrent!,
listEmail, accountId.value!,
readActions)); listEmail,
readActions));
} }
} }
@@ -709,11 +715,12 @@ class MailboxDashBoardController extends ReloadableController {
final listEmail = listPresentationEmail final listEmail = listPresentationEmail
.map((presentationEmail) => presentationEmail.toEmail()) .map((presentationEmail) => presentationEmail.toEmail())
.toList(); .toList();
if (accountId.value != null) { if (accountId.value != null && sessionCurrent != null) {
consumeState(_markAsStarMultipleEmailInteractor.execute( consumeState(_markAsStarMultipleEmailInteractor.execute(
accountId.value!, sessionCurrent!,
listEmail, accountId.value!,
markStarAction)); listEmail,
markStarAction));
} }
} }
@@ -797,21 +804,30 @@ class MailboxDashBoardController extends ReloadableController {
PresentationMailbox destinationMailbox PresentationMailbox destinationMailbox
) { ) {
if (destinationMailbox.isTrash) { if (destinationMailbox.isTrash) {
_moveSelectedEmailMultipleToMailboxAction(accountId, MoveToMailboxRequest( _moveSelectedEmailMultipleToMailboxAction(
session,
accountId,
MoveToMailboxRequest(
{currentMailbox.id: listEmailIds}, {currentMailbox.id: listEmailIds},
destinationMailbox.id, destinationMailbox.id,
MoveAction.moving, MoveAction.moving,
session, session,
EmailActionType.moveToTrash)); EmailActionType.moveToTrash));
} else if (destinationMailbox.isSpam) { } else if (destinationMailbox.isSpam) {
_moveSelectedEmailMultipleToMailboxAction(accountId, MoveToMailboxRequest( _moveSelectedEmailMultipleToMailboxAction(
session,
accountId,
MoveToMailboxRequest(
{currentMailbox.id: listEmailIds}, {currentMailbox.id: listEmailIds},
destinationMailbox.id, destinationMailbox.id,
MoveAction.moving, MoveAction.moving,
session, session,
EmailActionType.moveToSpam)); EmailActionType.moveToSpam));
} else { } else {
_moveSelectedEmailMultipleToMailboxAction(accountId, MoveToMailboxRequest( _moveSelectedEmailMultipleToMailboxAction(
session,
accountId,
MoveToMailboxRequest(
{currentMailbox.id: listEmailIds}, {currentMailbox.id: listEmailIds},
destinationMailbox.id, destinationMailbox.id,
MoveAction.moving, MoveAction.moving,
@@ -850,9 +866,11 @@ class MailboxDashBoardController extends ReloadableController {
Map<MailboxId, List<EmailId>> mapListEmails, Map<MailboxId, List<EmailId>> mapListEmails,
PresentationMailbox destinationMailbox, PresentationMailbox destinationMailbox,
) async { ) async {
if (accountId.value != null ) { if (accountId.value != null && sessionCurrent != null) {
if (destinationMailbox.isTrash) { if (destinationMailbox.isTrash) {
moveToMailbox(accountId.value!, moveToMailbox(
sessionCurrent!,
accountId.value!,
MoveToMailboxRequest( MoveToMailboxRequest(
mapListEmails, mapListEmails,
destinationMailbox.id, destinationMailbox.id,
@@ -862,7 +880,9 @@ class MailboxDashBoardController extends ReloadableController {
), ),
); );
} else if (destinationMailbox.isSpam) { } else if (destinationMailbox.isSpam) {
moveToMailbox(accountId.value!, moveToMailbox(
sessionCurrent!,
accountId.value!,
MoveToMailboxRequest( MoveToMailboxRequest(
mapListEmails, mapListEmails,
destinationMailbox.id, destinationMailbox.id,
@@ -872,7 +892,9 @@ class MailboxDashBoardController extends ReloadableController {
), ),
); );
} else { } else {
moveToMailbox(accountId.value!, moveToMailbox(
sessionCurrent!,
accountId.value!,
MoveToMailboxRequest( MoveToMailboxRequest(
mapListEmails, mapListEmails,
destinationMailbox.id, destinationMailbox.id,
@@ -888,10 +910,11 @@ class MailboxDashBoardController extends ReloadableController {
} }
void _moveSelectedEmailMultipleToMailboxAction( void _moveSelectedEmailMultipleToMailboxAction(
AccountId accountId, Session session,
MoveToMailboxRequest moveRequest AccountId accountId,
MoveToMailboxRequest moveRequest
) { ) {
consumeState(_moveMultipleEmailToMailboxInteractor.execute(accountId, moveRequest)); consumeState(_moveMultipleEmailToMailboxInteractor.execute(session, accountId, moveRequest));
} }
void _moveSelectedMultipleEmailToMailboxSuccess(Success success) { void _moveSelectedMultipleEmailToMailboxSuccess(Success success) {
@@ -952,17 +975,21 @@ class MailboxDashBoardController extends ReloadableController {
} }
void _revertedSelectionEmailToOriginalMailbox(MoveToMailboxRequest newMoveRequest) { void _revertedSelectionEmailToOriginalMailbox(MoveToMailboxRequest newMoveRequest) {
if (accountId.value != null) { if (accountId.value != null && sessionCurrent != null) {
consumeState(_moveMultipleEmailToMailboxInteractor.execute( consumeState(_moveMultipleEmailToMailboxInteractor.execute(
accountId.value!, sessionCurrent!,
newMoveRequest)); accountId.value!,
newMoveRequest));
} }
} }
void moveSelectedMultipleEmailToTrash(List<PresentationEmail> listEmails, PresentationMailbox mailboxCurrent) { void moveSelectedMultipleEmailToTrash(List<PresentationEmail> listEmails, PresentationMailbox mailboxCurrent) {
final trashMailboxId = getMailboxIdByRole(PresentationMailbox.roleTrash); final trashMailboxId = getMailboxIdByRole(PresentationMailbox.roleTrash);
if (accountId.value != null && trashMailboxId != null) { if (accountId.value != null && trashMailboxId != null && sessionCurrent != null) {
_moveSelectedEmailMultipleToMailboxAction(accountId.value!, MoveToMailboxRequest( _moveSelectedEmailMultipleToMailboxAction(
sessionCurrent!,
accountId.value!,
MoveToMailboxRequest(
{mailboxCurrent.id: listEmails.listEmailIds}, {mailboxCurrent.id: listEmails.listEmailIds},
trashMailboxId, trashMailboxId,
MoveAction.moving, MoveAction.moving,
@@ -974,8 +1001,11 @@ class MailboxDashBoardController extends ReloadableController {
void moveSelectedMultipleEmailToSpam(List<PresentationEmail> listEmail, PresentationMailbox mailboxCurrent) { void moveSelectedMultipleEmailToSpam(List<PresentationEmail> listEmail, PresentationMailbox mailboxCurrent) {
final spamMailboxId = getMailboxIdByRole(PresentationMailbox.roleSpam); final spamMailboxId = getMailboxIdByRole(PresentationMailbox.roleSpam);
if (accountId.value != null && spamMailboxId != null) { if (accountId.value != null && spamMailboxId != null && sessionCurrent != null) {
_moveSelectedEmailMultipleToMailboxAction(accountId.value!, MoveToMailboxRequest( _moveSelectedEmailMultipleToMailboxAction(
sessionCurrent!,
accountId.value!,
MoveToMailboxRequest(
{mailboxCurrent.id: listEmail.listEmailIds}, {mailboxCurrent.id: listEmail.listEmailIds},
spamMailboxId, spamMailboxId,
MoveAction.moving, MoveAction.moving,
@@ -988,8 +1018,11 @@ class MailboxDashBoardController extends ReloadableController {
void unSpamSelectedMultipleEmail(List<PresentationEmail> listEmail) { void unSpamSelectedMultipleEmail(List<PresentationEmail> listEmail) {
final spamMailboxId = getMailboxIdByRole(PresentationMailbox.roleSpam); final spamMailboxId = getMailboxIdByRole(PresentationMailbox.roleSpam);
final inboxMailboxId = getMailboxIdByRole(PresentationMailbox.roleInbox); final inboxMailboxId = getMailboxIdByRole(PresentationMailbox.roleInbox);
if (inboxMailboxId != null && accountId.value != null && spamMailboxId != null) { if (inboxMailboxId != null && accountId.value != null && spamMailboxId != null && sessionCurrent != null) {
_moveSelectedEmailMultipleToMailboxAction(accountId.value!, MoveToMailboxRequest( _moveSelectedEmailMultipleToMailboxAction(
sessionCurrent!,
accountId.value!,
MoveToMailboxRequest(
{spamMailboxId: listEmail.listEmailIds}, {spamMailboxId: listEmail.listEmailIds},
inboxMailboxId, inboxMailboxId,
MoveAction.moving, MoveAction.moving,
@@ -1090,10 +1123,11 @@ class MailboxDashBoardController extends ReloadableController {
void _deleteMultipleEmailsPermanently(List<PresentationEmail> listEmails, {Function? onCancelSelectionEmail}) { void _deleteMultipleEmailsPermanently(List<PresentationEmail> listEmails, {Function? onCancelSelectionEmail}) {
onCancelSelectionEmail?.call(); onCancelSelectionEmail?.call();
if (accountId.value != null) { if (accountId.value != null && sessionCurrent != null) {
consumeState(_deleteMultipleEmailsPermanentlyInteractor.execute( consumeState(_deleteMultipleEmailsPermanentlyInteractor.execute(
accountId.value!, sessionCurrent!,
listEmails.listEmailIds)); accountId.value!,
listEmails.listEmailIds));
} }
} }
@@ -1658,11 +1692,13 @@ class MailboxDashBoardController extends ReloadableController {
} }
void handleSendEmailAction( void handleSendEmailAction(
Session session,
AccountId accountId, AccountId accountId,
EmailRequest emailRequest, EmailRequest emailRequest,
CreateNewMailboxRequest? mailboxRequest CreateNewMailboxRequest? mailboxRequest
) { ) {
consumeState(_sendEmailInteractor.execute( consumeState(_sendEmailInteractor.execute(
session,
accountId, accountId,
emailRequest, emailRequest,
mailboxRequest: mailboxRequest mailboxRequest: mailboxRequest
@@ -2,7 +2,6 @@ import 'dart:async';
import 'package:jmap_dart_client/http/http_client.dart'; import 'package:jmap_dart_client/http/http_client.dart';
import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart';
import 'package:jmap_dart_client/jmap/core/filter/filter.dart'; import 'package:jmap_dart_client/jmap/core/filter/filter.dart';
import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
import 'package:jmap_dart_client/jmap/core/request/reference_path.dart'; import 'package:jmap_dart_client/jmap/core/request/reference_path.dart';
@@ -27,23 +26,6 @@ class ThreadAPI {
ThreadAPI(this.httpClient); ThreadAPI(this.httpClient);
Set<CapabilityIdentifier> _capabilitiesForEmailMethod(Session session, AccountId accountId) {
final getMailboxCreated = GetEmailMethod(accountId);
try {
requireCapability(
session,
accountId,
[CapabilityIdentifier.jmapTeamMailboxes]);
return {
CapabilityIdentifier.jmapCore,
CapabilityIdentifier.jmapMail,
CapabilityIdentifier.jmapTeamMailboxes
};
} catch (_) {
return getMailboxCreated.requiredCapabilities;
}
}
Future<EmailsResponse> getAllEmail( Future<EmailsResponse> getAllEmail(
Session session, Session session,
AccountId accountId, AccountId accountId,
@@ -78,8 +60,11 @@ class ThreadAPI {
final getEmailInvocation = jmapRequestBuilder.invocation(getEmailMethod); final getEmailInvocation = jmapRequestBuilder.invocation(getEmailMethod);
final capabilities = getEmailMethod.requiredCapabilities
.toCapabilitiesSupportTeamMailboxes(session, accountId);
final result = await (jmapRequestBuilder final result = await (jmapRequestBuilder
..usings(_capabilitiesForEmailMethod(session, accountId))) ..usings(capabilities))
.build() .build()
.execute(); .execute();
@@ -133,8 +118,11 @@ class ThreadAPI {
final getEmailUpdatedInvocation = jmapRequestBuilder.invocation(getMailboxUpdated); final getEmailUpdatedInvocation = jmapRequestBuilder.invocation(getMailboxUpdated);
final getEmailCreatedInvocation = jmapRequestBuilder.invocation(getEmailCreated); final getEmailCreatedInvocation = jmapRequestBuilder.invocation(getEmailCreated);
final capabilities = getEmailCreated.requiredCapabilities
.toCapabilitiesSupportTeamMailboxes(session, accountId);
final result = await (jmapRequestBuilder final result = await (jmapRequestBuilder
..usings(_capabilitiesForEmailMethod(session, accountId))) ..usings(capabilities))
.build() .build()
.execute(); .execute();
@@ -175,8 +163,11 @@ class ThreadAPI {
final getEmailInvocation = jmapRequestBuilder.invocation(getEmailMethod); final getEmailInvocation = jmapRequestBuilder.invocation(getEmailMethod);
final capabilities = getEmailMethod.requiredCapabilities
.toCapabilitiesSupportTeamMailboxes(session, accountId);
final result = await (jmapRequestBuilder final result = await (jmapRequestBuilder
..usings(_capabilitiesForEmailMethod(session, accountId))) ..usings(capabilities))
.build() .build()
.execute(); .execute();
@@ -73,7 +73,7 @@ class ThreadIsolateWorker {
if (newEmailList.isNotEmpty) { if (newEmailList.isNotEmpty) {
lastEmail = newEmailList.last; lastEmail = newEmailList.last;
hasEmails = true; hasEmails = true;
final listEmailIdDeleted = await args.emailAPI.deleteMultipleEmailsPermanently(args.accountId, newEmailList.listEmailIds); final listEmailIdDeleted = await args.emailAPI.deleteMultipleEmailsPermanently(args.session, args.accountId, newEmailList.listEmailIds);
if (listEmailIdDeleted.isNotEmpty && listEmailIdDeleted.length == newEmailList.listEmailIds.length) { if (listEmailIdDeleted.isNotEmpty && listEmailIdDeleted.length == newEmailList.listEmailIds.length) {
sendPort.send(listEmailIdDeleted); sendPort.send(listEmailIdDeleted);
@@ -123,7 +123,7 @@ class ThreadIsolateWorker {
if (newEmailList.isNotEmpty) { if (newEmailList.isNotEmpty) {
lastEmail = newEmailList.last; lastEmail = newEmailList.last;
hasEmails = true; hasEmails = true;
final listEmailIdDeleted = await _emailAPI.deleteMultipleEmailsPermanently(accountId, newEmailList.listEmailIds); final listEmailIdDeleted = await _emailAPI.deleteMultipleEmailsPermanently(session, accountId, newEmailList.listEmailIds);
if (listEmailIdDeleted.isNotEmpty && listEmailIdDeleted.length == newEmailList.listEmailIds.length) { if (listEmailIdDeleted.isNotEmpty && listEmailIdDeleted.length == newEmailList.listEmailIds.length) {
await updateDestroyedEmailCache(listEmailIdDeleted); await updateDestroyedEmailCache(listEmailIdDeleted);
@@ -1,6 +1,7 @@
import 'package:core/core.dart'; import 'package:core/core.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.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/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:model/model.dart'; import 'package:model/model.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
@@ -14,9 +15,10 @@ class MarkAsMultipleEmailReadInteractor {
MarkAsMultipleEmailReadInteractor(this._emailRepository, this._mailboxRepository); MarkAsMultipleEmailReadInteractor(this._emailRepository, this._mailboxRepository);
Stream<Either<Failure, Success>> execute( Stream<Either<Failure, Success>> execute(
AccountId accountId, Session session,
List<Email> emails, AccountId accountId,
ReadActions readAction List<Email> emails,
ReadActions readAction
) async* { ) async* {
try { try {
yield Right(LoadingMarkAsMultipleEmailReadAll()); yield Right(LoadingMarkAsMultipleEmailReadAll());
@@ -33,7 +35,7 @@ class MarkAsMultipleEmailReadInteractor {
.where((email) => readAction == ReadActions.markAsUnread ? email.hasRead : !email.hasRead) .where((email) => readAction == ReadActions.markAsUnread ? email.hasRead : !email.hasRead)
.toList(); .toList();
final result = await _emailRepository.markAsRead(accountId, listEmailNeedMarkAsRead, readAction); final result = await _emailRepository.markAsRead(session, accountId, listEmailNeedMarkAsRead, readAction);
if (listEmailNeedMarkAsRead.length == result.length) { if (listEmailNeedMarkAsRead.length == result.length) {
final countMarkAsReadSuccess = emails.length; final countMarkAsReadSuccess = emails.length;
@@ -1,6 +1,7 @@
import 'package:core/core.dart'; import 'package:core/core.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.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/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:model/model.dart'; import 'package:model/model.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
@@ -12,9 +13,10 @@ class MarkAsStarMultipleEmailInteractor {
MarkAsStarMultipleEmailInteractor(this._emailRepository); MarkAsStarMultipleEmailInteractor(this._emailRepository);
Stream<Either<Failure, Success>> execute( Stream<Either<Failure, Success>> execute(
AccountId accountId, Session session,
List<Email> emails, AccountId accountId,
MarkStarAction markStarAction List<Email> emails,
MarkStarAction markStarAction
) async* { ) async* {
try { try {
yield Right(LoadingMarkAsStarMultipleEmailAll()); yield Right(LoadingMarkAsStarMultipleEmailAll());
@@ -25,7 +27,7 @@ class MarkAsStarMultipleEmailInteractor {
.where((email) => markStarAction == MarkStarAction.unMarkStar ? email.hasStarred : !email.hasStarred) .where((email) => markStarAction == MarkStarAction.unMarkStar ? email.hasStarred : !email.hasStarred)
.toList(); .toList();
final result = await _emailRepository.markAsStar(accountId, listEmailNeedMarkStar, markStarAction); final result = await _emailRepository.markAsStar(session, accountId, listEmailNeedMarkStar, markStarAction);
if (listEmailNeedMarkStar.length == result.length) { if (listEmailNeedMarkStar.length == result.length) {
final countMarkStarSuccess = emails.length; final countMarkStarSuccess = emails.length;
@@ -3,6 +3,7 @@ import 'dart:async';
import 'package:core/core.dart'; import 'package:core/core.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
@@ -14,7 +15,11 @@ class MoveMultipleEmailToMailboxInteractor {
MoveMultipleEmailToMailboxInteractor(this._emailRepository, this._mailboxRepository); MoveMultipleEmailToMailboxInteractor(this._emailRepository, this._mailboxRepository);
Stream<Either<Failure, Success>> execute(AccountId accountId, MoveToMailboxRequest moveRequest) async* { Stream<Either<Failure, Success>> execute(
Session session,
AccountId accountId,
MoveToMailboxRequest moveRequest
) async* {
try { try {
yield Right(LoadingMoveMultipleEmailToMailboxAll()); yield Right(LoadingMoveMultipleEmailToMailboxAll());
@@ -26,7 +31,7 @@ class MoveMultipleEmailToMailboxInteractor {
final currentMailboxState = listState.first; final currentMailboxState = listState.first;
final currentEmailState = listState.last; final currentEmailState = listState.last;
final result = await _emailRepository.moveToMailbox(accountId, moveRequest); final result = await _emailRepository.moveToMailbox(session, accountId, moveRequest);
int totalEmail = 0; int totalEmail = 0;
for (var element in moveRequest.currentMailboxes.values) { for (var element in moveRequest.currentMailboxes.values) {
totalEmail = totalEmail + element.length; totalEmail = totalEmail + element.length;
@@ -51,57 +51,69 @@ mixin EmailActionController on ViewAsDialogActionMixin {
} }
void moveToTrash(PresentationEmail email, {PresentationMailbox? mailboxContain}) async { void moveToTrash(PresentationEmail email, {PresentationMailbox? mailboxContain}) async {
final session = mailboxDashBoardController.sessionCurrent;
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
final trashMailboxId = mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleTrash]; final trashMailboxId = mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleTrash];
if (mailboxContain != null && accountId != null && trashMailboxId != null) { if (session != null && mailboxContain != null && accountId != null && trashMailboxId != null) {
_moveToTrashAction(accountId, MoveToMailboxRequest( _moveToTrashAction(
{mailboxContain.id: email.id != null ? [email.id!] : []}, session,
trashMailboxId, accountId,
MoveAction.moving, MoveToMailboxRequest(
mailboxDashBoardController.sessionCurrent!, {mailboxContain.id: email.id != null ? [email.id!] : []},
EmailActionType.moveToTrash) trashMailboxId,
MoveAction.moving,
mailboxDashBoardController.sessionCurrent!,
EmailActionType.moveToTrash)
); );
} }
} }
void _moveToTrashAction(AccountId accountId, MoveToMailboxRequest moveRequest) { void _moveToTrashAction(Session session, AccountId accountId, MoveToMailboxRequest moveRequest) {
mailboxDashBoardController.moveToMailbox(accountId, moveRequest); mailboxDashBoardController.moveToMailbox(session, accountId, moveRequest);
} }
void moveToSpam(PresentationEmail email, {PresentationMailbox? mailboxContain}) async { void moveToSpam(PresentationEmail email, {PresentationMailbox? mailboxContain}) async {
final session = mailboxDashBoardController.sessionCurrent;
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
final spamMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleSpam); final spamMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleSpam);
if (mailboxContain != null && accountId != null && spamMailboxId != null) { if (session != null && mailboxContain != null && accountId != null && spamMailboxId != null) {
moveToSpamAction(accountId, MoveToMailboxRequest( moveToSpamAction(
{mailboxContain.id: email.id != null ? [email.id!] : []}, session,
spamMailboxId, accountId,
MoveAction.moving, MoveToMailboxRequest(
mailboxDashBoardController.sessionCurrent!, {mailboxContain.id: email.id != null ? [email.id!] : []},
EmailActionType.moveToSpam) spamMailboxId,
MoveAction.moving,
mailboxDashBoardController.sessionCurrent!,
EmailActionType.moveToSpam)
); );
} }
} }
void unSpam(PresentationEmail email) async { void unSpam(PresentationEmail email) async {
final session = mailboxDashBoardController.sessionCurrent;
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
final spamMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleSpam); final spamMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleSpam);
final inboxMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleInbox); final inboxMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleInbox);
if (inboxMailboxId != null && accountId != null && spamMailboxId != null) { if (session != null && inboxMailboxId != null && accountId != null && spamMailboxId != null) {
moveToSpamAction(accountId, MoveToMailboxRequest( moveToSpamAction(
{spamMailboxId: email.id != null ? [email.id!] : []}, session,
inboxMailboxId, accountId,
MoveAction.moving, MoveToMailboxRequest(
mailboxDashBoardController.sessionCurrent!, {spamMailboxId: email.id != null ? [email.id!] : []},
EmailActionType.unSpam) inboxMailboxId,
MoveAction.moving,
mailboxDashBoardController.sessionCurrent!,
EmailActionType.unSpam)
); );
} }
} }
void moveToSpamAction(AccountId accountId, MoveToMailboxRequest moveRequest) { void moveToSpamAction(Session session, AccountId accountId, MoveToMailboxRequest moveRequest) {
mailboxDashBoardController.moveToMailbox(accountId, moveRequest); mailboxDashBoardController.moveToMailbox(session, accountId, moveRequest);
} }
void moveToMailbox( void moveToMailbox(
@@ -160,32 +172,41 @@ mixin EmailActionController on ViewAsDialogActionMixin {
PresentationMailbox destinationMailbox PresentationMailbox destinationMailbox
) { ) {
if (destinationMailbox.isTrash) { if (destinationMailbox.isTrash) {
moveToSpamAction(accountId, MoveToMailboxRequest( moveToSpamAction(
{currentMailbox.id: emailSelected.id != null ? [emailSelected.id!] : []},
destinationMailbox.id,
MoveAction.moving,
session, session,
EmailActionType.moveToTrash)); accountId,
MoveToMailboxRequest(
{currentMailbox.id: emailSelected.id != null ? [emailSelected.id!] : []},
destinationMailbox.id,
MoveAction.moving,
session,
EmailActionType.moveToTrash));
} else if (destinationMailbox.isSpam) { } else if (destinationMailbox.isSpam) {
moveToSpamAction(accountId, MoveToMailboxRequest( moveToSpamAction(
{currentMailbox.id: emailSelected.id != null ? [emailSelected.id!] : []},
destinationMailbox.id,
MoveAction.moving,
session, session,
EmailActionType.moveToSpam)); accountId,
MoveToMailboxRequest(
{currentMailbox.id: emailSelected.id != null ? [emailSelected.id!] : []},
destinationMailbox.id,
MoveAction.moving,
session,
EmailActionType.moveToSpam));
} else { } else {
_moveToMailboxAction(accountId, MoveToMailboxRequest( _moveToMailboxAction(
{currentMailbox.id: emailSelected.id != null ? [emailSelected.id!] : []},
destinationMailbox.id,
MoveAction.moving,
session, session,
EmailActionType.moveToMailbox, accountId,
destinationPath: destinationMailbox.mailboxPath)); MoveToMailboxRequest(
{currentMailbox.id: emailSelected.id != null ? [emailSelected.id!] : []},
destinationMailbox.id,
MoveAction.moving,
session,
EmailActionType.moveToMailbox,
destinationPath: destinationMailbox.mailboxPath));
} }
} }
void _moveToMailboxAction(AccountId accountId, MoveToMailboxRequest moveRequest) { void _moveToMailboxAction(Session session, AccountId accountId, MoveToMailboxRequest moveRequest) {
mailboxDashBoardController.moveToMailbox(accountId, moveRequest); mailboxDashBoardController.moveToMailbox(session, accountId, moveRequest);
} }
void deleteEmailPermanently(BuildContext context, PresentationEmail email) { void deleteEmailPermanently(BuildContext context, PresentationEmail email) {
+1 -1
View File
@@ -1,5 +1,5 @@
{ {
"@@last_modified": "2023-03-22T15:16:03.053821", "@@last_modified": "2023-03-10T14:00:31.546227",
"initializing_data": "Initializing data...", "initializing_data": "Initializing data...",
"@initializing_data": { "@initializing_data": {
"type": "text", "type": "text",
+14 -10
View File
@@ -28,16 +28,6 @@ void requireCapability(Session session, AccountId accountId, List<CapabilityIden
extension CapabilityIdentifierExtension on List<CapabilityIdentifier> { extension CapabilityIdentifierExtension on List<CapabilityIdentifier> {
bool isSupportTeamMailboxes(Session session, AccountId accountId) {
try {
requireCapability(session, accountId, this);
return true;
} catch (error) {
logError('CapabilityIdentifierExtension::isSupported(): $error');
return false;
}
}
bool isSupported(Session session, AccountId accountId) { bool isSupported(Session session, AccountId accountId) {
try { try {
requireCapability(session, accountId, this); requireCapability(session, accountId, this);
@@ -47,4 +37,18 @@ extension CapabilityIdentifierExtension on List<CapabilityIdentifier> {
return false; return false;
} }
} }
}
extension CapabilityIdentifierSetExtension on Set<CapabilityIdentifier> {
Set<CapabilityIdentifier> toCapabilitiesSupportTeamMailboxes(Session session, AccountId accountId) {
try {
requireCapability(session, accountId, [CapabilityIdentifier.jmapTeamMailboxes]);
add(CapabilityIdentifier.jmapTeamMailboxes);
return this;
} catch (error) {
logError('CapabilityIdentifierExtension::toCapabilitiesSupportTeamMailboxes(): $error');
return this;
}
}
} }