diff --git a/lib/features/composer/domain/usecases/save_email_as_drafts_interactor.dart b/lib/features/composer/domain/usecases/save_email_as_drafts_interactor.dart index 2141a70ee..e959c95ac 100644 --- a/lib/features/composer/domain/usecases/save_email_as_drafts_interactor.dart +++ b/lib/features/composer/domain/usecases/save_email_as_drafts_interactor.dart @@ -1,6 +1,7 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.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: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'; @@ -12,7 +13,7 @@ class SaveEmailAsDraftsInteractor { SaveEmailAsDraftsInteractor(this._emailRepository, this._mailboxRepository); - Stream> execute(AccountId accountId, Email email) async* { + Stream> execute(Session session, AccountId accountId, Email email) async* { try { yield Right(SaveEmailAsDraftsLoading()); @@ -24,7 +25,7 @@ class SaveEmailAsDraftsInteractor { final currentMailboxState = listState.first; final currentEmailState = listState.last; - final emailAsDrafts = await _emailRepository.saveEmailAsDrafts(accountId, email); + final emailAsDrafts = await _emailRepository.saveEmailAsDrafts(session, accountId, email); yield Right( SaveEmailAsDraftsSuccess( emailAsDrafts, diff --git a/lib/features/composer/domain/usecases/send_email_interactor.dart b/lib/features/composer/domain/usecases/send_email_interactor.dart index 7eb7f4591..0563c5c85 100644 --- a/lib/features/composer/domain/usecases/send_email_interactor.dart +++ b/lib/features/composer/domain/usecases/send_email_interactor.dart @@ -2,6 +2,7 @@ import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; import 'package:dartz/dartz.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/state/send_email_state.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; @@ -15,9 +16,10 @@ class SendEmailInteractor { SendEmailInteractor(this._emailRepository, this._mailboxRepository); Stream> execute( - AccountId accountId, - EmailRequest emailRequest, - {CreateNewMailboxRequest? mailboxRequest} + Session session, + AccountId accountId, + EmailRequest emailRequest, + {CreateNewMailboxRequest? mailboxRequest} ) async* { try { yield Right(SendingEmailState()); @@ -31,6 +33,7 @@ class SendEmailInteractor { final currentEmailState = listState.last; final result = await _emailRepository.sendEmail( + session, accountId, emailRequest, mailboxRequest: mailboxRequest diff --git a/lib/features/composer/domain/usecases/update_email_drafts_interactor.dart b/lib/features/composer/domain/usecases/update_email_drafts_interactor.dart index 93a4f2acb..1045bed94 100644 --- a/lib/features/composer/domain/usecases/update_email_drafts_interactor.dart +++ b/lib/features/composer/domain/usecases/update_email_drafts_interactor.dart @@ -1,6 +1,7 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.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:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; @@ -12,7 +13,7 @@ class UpdateEmailDraftsInteractor { UpdateEmailDraftsInteractor(this._emailRepository, this._mailboxRepository); - Stream> execute(AccountId accountId, Email newEmail, EmailId oldEmailId) async* { + Stream> execute(Session session, AccountId accountId, Email newEmail, EmailId oldEmailId) async* { try { yield Right(UpdatingEmailDrafts()); @@ -24,7 +25,7 @@ class UpdateEmailDraftsInteractor { final currentMailboxState = listState.first; final currentEmailState = listState.last; - final newEmailDrafts = await _emailRepository.updateEmailDrafts(accountId, newEmail, oldEmailId); + final newEmailDrafts = await _emailRepository.updateEmailDrafts(session, accountId, newEmail, oldEmailId); yield Right( UpdateEmailDraftsSuccess( newEmailDrafts, diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index 1003a54ae..5224d2b72 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -771,13 +771,14 @@ class ComposerController extends BaseController { } void _handleSendMessages(BuildContext context) async { + final session = mailboxDashBoardController.sessionCurrent; final arguments = composerArguments.value; final accountId = mailboxDashBoardController.accountId.value; final sentMailboxId = mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleSent]; final outboxMailboxId = mailboxDashBoardController.outboxMailbox?.id; 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 submissionCreateId = Id(_uuid.v1()); final emailRequest = EmailRequest( @@ -793,7 +794,7 @@ class ComposerController extends BaseController { ? CreateNewMailboxRequest(Id(_uuid.v1()), PresentationMailbox.outboxMailboxName) : null; - mailboxDashBoardController.handleSendEmailAction(accountId, emailRequest, mailboxRequest); + mailboxDashBoardController.handleSendEmailAction(session, accountId, emailRequest, mailboxRequest); uploadController.clearInlineFileUploaded(); } @@ -976,8 +977,9 @@ class ComposerController extends BaseController { final draftMailboxId = mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleDrafts]; final userProfile = mailboxDashBoardController.userProfile.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); if (isChanged && context.mounted) { final newEmail = await _generateEmail( @@ -990,13 +992,14 @@ class ComposerController extends BaseController { if (arguments.emailActionType == EmailActionType.edit && oldEmail != null && oldEmail.id != null) { mailboxDashBoardController.consumeState( _updateEmailDraftsInteractor.execute( + session, accountId, newEmail, oldEmail.id! ) ); } else { - mailboxDashBoardController.consumeState(_saveEmailAsDraftsInteractor.execute(accountId, newEmail)); + mailboxDashBoardController.consumeState(_saveEmailAsDraftsInteractor.execute(session, accountId, newEmail)); } uploadController.clearInlineFileUploaded(); diff --git a/lib/features/email/data/datasource/email_datasource.dart b/lib/features/email/data/datasource/email_datasource.dart index 04ca5397f..029a8568a 100644 --- a/lib/features/email/data/datasource/email_datasource.dart +++ b/lib/features/email/data/datasource/email_datasource.dart @@ -15,9 +15,14 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_r abstract class EmailDataSource { Future getEmailContent(Session session, AccountId accountId, EmailId emailId); - Future sendEmail(AccountId accountId, EmailRequest emailRequest, {CreateNewMailboxRequest? mailboxRequest}); + Future sendEmail( + Session session, + AccountId accountId, + EmailRequest emailRequest, + {CreateNewMailboxRequest? mailboxRequest} + ); - Future> markAsRead(AccountId accountId, List emails, ReadActions readActions); + Future> markAsRead(Session session, AccountId accountId, List emails, ReadActions readActions); Future> downloadAttachments( List attachments, @@ -43,21 +48,22 @@ abstract class EmailDataSource { StreamController> onReceiveController ); - Future> moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest); + Future> moveToMailbox(Session session, AccountId accountId, MoveToMailboxRequest moveRequest); Future> markAsStar( + Session session, AccountId accountId, List emails, MarkStarAction markStarAction ); - Future saveEmailAsDrafts(AccountId accountId, Email email); + Future saveEmailAsDrafts(Session session, AccountId accountId, Email email); - Future removeEmailDrafts(AccountId accountId, EmailId emailId); + Future removeEmailDrafts(Session session, AccountId accountId, EmailId emailId); - Future updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId); + Future updateEmailDrafts(Session session, AccountId accountId, Email newEmail, EmailId oldEmailId); - Future> deleteMultipleEmailsPermanently(AccountId accountId, List emailIds); + Future> deleteMultipleEmailsPermanently(Session session, AccountId accountId, List emailIds); - Future deleteEmailPermanently(AccountId accountId, EmailId emailId); + Future deleteEmailPermanently(Session session, AccountId accountId, EmailId emailId); } \ No newline at end of file diff --git a/lib/features/email/data/datasource_impl/email_datasource_impl.dart b/lib/features/email/data/datasource_impl/email_datasource_impl.dart index d4bbf75ad..d1abf6f5e 100644 --- a/lib/features/email/data/datasource_impl/email_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_datasource_impl.dart @@ -32,16 +32,26 @@ class EmailDataSourceImpl extends EmailDataSource { } @override - Future sendEmail(AccountId accountId, EmailRequest emailRequest, {CreateNewMailboxRequest? mailboxRequest}) { + Future sendEmail( + Session session, + AccountId accountId, + EmailRequest emailRequest, + {CreateNewMailboxRequest? mailboxRequest} + ) { return Future.sync(() async { - return await emailAPI.sendEmail(accountId, emailRequest, mailboxRequest: mailboxRequest); + return await emailAPI.sendEmail(session, accountId, emailRequest, mailboxRequest: mailboxRequest); }).catchError(_exceptionThrower.throwException); } @override - Future> markAsRead(AccountId accountId, List emails, ReadActions readActions) { + Future> markAsRead( + Session session, + AccountId accountId, + List emails, + ReadActions readActions + ) { return Future.sync(() async { - return await emailAPI.markAsRead(accountId, emails, readActions); + return await emailAPI.markAsRead(session, accountId, emails, readActions); }).catchError(_exceptionThrower.throwException); } @@ -71,37 +81,37 @@ class EmailDataSourceImpl extends EmailDataSource { } @override - Future> moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest) { + Future> moveToMailbox(Session session, AccountId accountId, MoveToMailboxRequest moveRequest) { return Future.sync(() async { - return await emailAPI.moveToMailbox(accountId, moveRequest); + return await emailAPI.moveToMailbox(session, accountId, moveRequest); }).catchError(_exceptionThrower.throwException); } @override - Future> markAsStar(AccountId accountId, List emails, MarkStarAction markStarAction) { + Future> markAsStar(Session session, AccountId accountId, List emails, MarkStarAction markStarAction) { return Future.sync(() async { - return await emailAPI.markAsStar(accountId, emails, markStarAction); + return await emailAPI.markAsStar(session, accountId, emails, markStarAction); }).catchError(_exceptionThrower.throwException); } @override - Future saveEmailAsDrafts(AccountId accountId, Email email) { + Future saveEmailAsDrafts(Session session, AccountId accountId, Email email) { return Future.sync(() async { - return await emailAPI.saveEmailAsDrafts(accountId, email); + return await emailAPI.saveEmailAsDrafts(session, accountId, email); }).catchError(_exceptionThrower.throwException); } @override - Future removeEmailDrafts(AccountId accountId, EmailId emailId) { + Future removeEmailDrafts(Session session, AccountId accountId, EmailId emailId) { return Future.sync(() async { - return await emailAPI.removeEmailDrafts(accountId, emailId); + return await emailAPI.removeEmailDrafts(session, accountId, emailId); }).catchError(_exceptionThrower.throwException); } @override - Future updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId) { + Future updateEmailDrafts(Session session, AccountId accountId, Email newEmail, EmailId oldEmailId) { return Future.sync(() async { - return await emailAPI.updateEmailDrafts(accountId, newEmail, oldEmailId); + return await emailAPI.updateEmailDrafts(session, accountId, newEmail, oldEmailId); }).catchError(_exceptionThrower.throwException); } @@ -126,16 +136,16 @@ class EmailDataSourceImpl extends EmailDataSource { } @override - Future> deleteMultipleEmailsPermanently(AccountId accountId, List emailIds) { + Future> deleteMultipleEmailsPermanently(Session session, AccountId accountId, List emailIds) { return Future.sync(() async { - return await emailAPI.deleteMultipleEmailsPermanently(accountId, emailIds); + return await emailAPI.deleteMultipleEmailsPermanently(session, accountId, emailIds); }).catchError(_exceptionThrower.throwException); } @override - Future deleteEmailPermanently(AccountId accountId, EmailId emailId) { + Future deleteEmailPermanently(Session session, AccountId accountId, EmailId emailId) { return Future.sync(() async { - return await emailAPI.deleteEmailPermanently(accountId, emailId); + return await emailAPI.deleteEmailPermanently(session, accountId, emailId); }).catchError(_exceptionThrower.throwException); } } \ No newline at end of file diff --git a/lib/features/email/data/network/email_api.dart b/lib/features/email/data/network/email_api.dart index f7a7d6364..8f5102890 100644 --- a/lib/features/email/data/network/email_api.dart +++ b/lib/features/email/data/network/email_api.dart @@ -86,11 +86,8 @@ class EmailAPI with HandleSetErrorMixin { final getEmailInvocation = jmapRequestBuilder.invocation(getEmailMethod); - final capabilitiesSupportTeamMailboxes = getEmailMethod.requiredCapabilities.add(CapabilityIdentifier.jmapTeamMailboxes) as Set; - - final capabilities = [CapabilityIdentifier.jmapTeamMailboxes].isSupportTeamMailboxes(session, accountId) - ? capabilitiesSupportTeamMailboxes - : getEmailMethod.requiredCapabilities; + final capabilities = getEmailMethod.requiredCapabilities + .toCapabilitiesSupportTeamMailboxes(session, accountId); final result = await (jmapRequestBuilder ..usings(capabilities)) @@ -108,6 +105,7 @@ class EmailAPI with HandleSetErrorMixin { } Future sendEmail( + Session session, AccountId accountId, EmailRequest emailRequest, {CreateNewMailboxRequest? mailboxRequest} @@ -170,8 +168,11 @@ class EmailAPI with HandleSetErrorMixin { final setEmailSubmissionInvocation = requestBuilder.invocation(setEmailSubmissionMethod); + final capabilities = setEmailSubmissionMethod.requiredCapabilities + .toCapabilitiesSupportTeamMailboxes(session, accountId); + final response = await (requestBuilder - ..usings(setEmailSubmissionMethod.requiredCapabilities)) + ..usings(capabilities)) .build() .execute(); @@ -228,7 +229,12 @@ class EmailAPI with HandleSetErrorMixin { return remainedErrors; } - Future> markAsRead(AccountId accountId, List emails, ReadActions readActions) async { + Future> markAsRead( + Session session, + AccountId accountId, + List emails, + ReadActions readActions + ) async { final setEmailMethod = SetEmailMethod(accountId) ..addUpdates(emails.listEmailIds.generateMapUpdateObjectMarkAsRead(readActions)); @@ -242,8 +248,11 @@ class EmailAPI with HandleSetErrorMixin { final getEmailInvocation = requestBuilder.invocation(getEmailMethod); + final capabilities = setEmailMethod.requiredCapabilities + .toCapabilitiesSupportTeamMailboxes(session, accountId); + final response = await (requestBuilder - ..usings(setEmailMethod.requiredCapabilities)) + ..usings(capabilities)) .build() .execute(); @@ -358,7 +367,11 @@ class EmailAPI with HandleSetErrorMixin { return bytesDownloaded; } - Future> moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest) async { + Future> moveToMailbox( + Session session, + AccountId accountId, + MoveToMailboxRequest moveRequest + ) async { requireCapability(moveRequest.session, accountId, [CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail]); @@ -388,7 +401,10 @@ class EmailAPI with HandleSetErrorMixin { ..addUpdates(currentItem.value.generateMapUpdateObjectMoveToMailbox(currentItem.key, moveRequest.destinationMailboxId)); }).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() .execute(); @@ -414,7 +430,12 @@ class EmailAPI with HandleSetErrorMixin { } - Future> markAsStar(AccountId accountId, List emails, MarkStarAction markStarAction) async { + Future> markAsStar( + Session session, + AccountId accountId, + List emails, + MarkStarAction markStarAction + ) async { final setEmailMethod = SetEmailMethod(accountId) ..addUpdates(emails.listEmailIds.generateMapUpdateObjectMarkAsStar(markStarAction)); @@ -428,8 +449,11 @@ class EmailAPI with HandleSetErrorMixin { final getEmailInvocation = requestBuilder.invocation(getEmailMethod); + final capabilities = setEmailMethod.requiredCapabilities + .toCapabilitiesSupportTeamMailboxes(session, accountId); + final response = await (requestBuilder - ..usings(setEmailMethod.requiredCapabilities)) + ..usings(capabilities)) .build() .execute(); @@ -444,7 +468,7 @@ class EmailAPI with HandleSetErrorMixin { }); } - Future saveEmailAsDrafts(AccountId accountId, Email email) async { + Future saveEmailAsDrafts(Session session, AccountId accountId, Email email) async { final idCreateMethod = Id(_uuid.v1()); final setEmailMethod = SetEmailMethod(accountId) ..addCreate(idCreateMethod, email); @@ -453,8 +477,11 @@ class EmailAPI with HandleSetErrorMixin { final setEmailInvocation = requestBuilder.invocation(setEmailMethod); + final capabilities = setEmailMethod.requiredCapabilities + .toCapabilitiesSupportTeamMailboxes(session, accountId); + final response = await (requestBuilder - ..usings(setEmailMethod.requiredCapabilities)) + ..usings(capabilities)) .build() .execute(); @@ -474,7 +501,7 @@ class EmailAPI with HandleSetErrorMixin { } } - Future removeEmailDrafts(AccountId accountId, EmailId emailId) async { + Future removeEmailDrafts(Session session, AccountId accountId, EmailId emailId) async { final setEmailMethod = SetEmailMethod(accountId) ..addDestroy({emailId.id}); @@ -482,8 +509,11 @@ class EmailAPI with HandleSetErrorMixin { final setEmailInvocation = requestBuilder.invocation(setEmailMethod); + final capabilities = setEmailMethod.requiredCapabilities + .toCapabilitiesSupportTeamMailboxes(session, accountId); + final response = await (requestBuilder - ..usings(setEmailMethod.requiredCapabilities)) + ..usings(capabilities)) .build() .execute(); @@ -498,7 +528,12 @@ class EmailAPI with HandleSetErrorMixin { }); } - Future updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId) async { + Future updateEmailDrafts( + Session session, + AccountId accountId, + Email newEmail, + EmailId oldEmailId + ) async { final idCreateMethod = Id(_uuid.v1()); final setEmailMethod = SetEmailMethod(accountId) ..addCreate(idCreateMethod, newEmail) @@ -508,8 +543,11 @@ class EmailAPI with HandleSetErrorMixin { final setEmailInvocation = requestBuilder.invocation(setEmailMethod); + final capabilities = setEmailMethod.requiredCapabilities + .toCapabilitiesSupportTeamMailboxes(session, accountId); + final response = await (requestBuilder - ..usings(setEmailMethod.requiredCapabilities)) + ..usings(capabilities)) .build() .execute(); @@ -530,15 +568,22 @@ class EmailAPI with HandleSetErrorMixin { } } - Future> deleteMultipleEmailsPermanently(AccountId accountId, List emailIds) async { + Future> deleteMultipleEmailsPermanently( + Session session, + AccountId accountId, + List emailIds + ) async { final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); final setEmailMethod = SetEmailMethod(accountId) ..addDestroy(emailIds.map((emailId) => emailId.id).toSet()); final setEmailInvocation = requestBuilder.invocation(setEmailMethod); + final capabilities = setEmailMethod.requiredCapabilities + .toCapabilitiesSupportTeamMailboxes(session, accountId); + final response = await (requestBuilder - ..usings(setEmailMethod.requiredCapabilities)) + ..usings(capabilities)) .build() .execute(); @@ -555,15 +600,18 @@ class EmailAPI with HandleSetErrorMixin { return List.empty(); } - Future deleteEmailPermanently(AccountId accountId, EmailId emailId) async { + Future deleteEmailPermanently(Session session, AccountId accountId, EmailId emailId) async { final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); final setEmailMethod = SetEmailMethod(accountId) ..addDestroy({emailId.id}); final setEmailInvocation = requestBuilder.invocation(setEmailMethod); + final capabilities = setEmailMethod.requiredCapabilities + .toCapabilitiesSupportTeamMailboxes(session, accountId); + final response = await (requestBuilder - ..usings(setEmailMethod.requiredCapabilities)) + ..usings(capabilities)) .build() .execute(); diff --git a/lib/features/email/data/repository/email_repository_impl.dart b/lib/features/email/data/repository/email_repository_impl.dart index 7ed59cbff..0f966b908 100644 --- a/lib/features/email/data/repository/email_repository_impl.dart +++ b/lib/features/email/data/repository/email_repository_impl.dart @@ -37,13 +37,23 @@ class EmailRepositoryImpl extends EmailRepository { } @override - Future sendEmail(AccountId accountId, EmailRequest emailRequest, {CreateNewMailboxRequest? mailboxRequest}) { - return emailDataSource.sendEmail(accountId, emailRequest, mailboxRequest: mailboxRequest); + Future sendEmail( + Session session, + AccountId accountId, + EmailRequest emailRequest, + {CreateNewMailboxRequest? mailboxRequest} + ) { + return emailDataSource.sendEmail(session, accountId, emailRequest, mailboxRequest: mailboxRequest); } @override - Future> markAsRead(AccountId accountId, List emails, ReadActions readActions) { - return emailDataSource.markAsRead(accountId, emails, readActions); + Future> markAsRead( + Session session, + AccountId accountId, + List emails, + ReadActions readActions + ) { + return emailDataSource.markAsRead(session, accountId, emails, readActions); } @override @@ -73,17 +83,18 @@ class EmailRepositoryImpl extends EmailRepository { } @override - Future> moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest) { - return emailDataSource.moveToMailbox(accountId, moveRequest); + Future> moveToMailbox(Session session, AccountId accountId, MoveToMailboxRequest moveRequest) { + return emailDataSource.moveToMailbox(session, accountId, moveRequest); } @override Future> markAsStar( - AccountId accountId, - List emails, - MarkStarAction markStarAction + Session session, + AccountId accountId, + List emails, + MarkStarAction markStarAction ) { - return emailDataSource.markAsStar(accountId, emails, markStarAction); + return emailDataSource.markAsStar(session, accountId, emails, markStarAction); } @override @@ -110,18 +121,18 @@ class EmailRepositoryImpl extends EmailRepository { } @override - Future saveEmailAsDrafts(AccountId accountId, Email email) { - return emailDataSource.saveEmailAsDrafts(accountId, email); + Future saveEmailAsDrafts(Session session, AccountId accountId, Email email) { + return emailDataSource.saveEmailAsDrafts(session, accountId, email); } @override - Future removeEmailDrafts(AccountId accountId, EmailId emailId) { - return emailDataSource.removeEmailDrafts(accountId, emailId); + Future removeEmailDrafts(Session session, AccountId accountId, EmailId emailId) { + return emailDataSource.removeEmailDrafts(session, accountId, emailId); } @override - Future updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId) { - return emailDataSource.updateEmailDrafts(accountId, newEmail, oldEmailId); + Future updateEmailDrafts(Session session, AccountId accountId, Email newEmail, EmailId oldEmailId) { + return emailDataSource.updateEmailDrafts(session, accountId, newEmail, oldEmailId); } @override @@ -143,13 +154,13 @@ class EmailRepositoryImpl extends EmailRepository { } @override - Future> deleteMultipleEmailsPermanently(AccountId accountId, List emailIds) { - return emailDataSource.deleteMultipleEmailsPermanently(accountId, emailIds); + Future> deleteMultipleEmailsPermanently(Session session, AccountId accountId, List emailIds) { + return emailDataSource.deleteMultipleEmailsPermanently(session, accountId, emailIds); } @override - Future deleteEmailPermanently(AccountId accountId, EmailId emailId) { - return emailDataSource.deleteEmailPermanently(accountId, emailId); + Future deleteEmailPermanently(Session session, AccountId accountId, EmailId emailId) { + return emailDataSource.deleteEmailPermanently(session, accountId, emailId); } @override diff --git a/lib/features/email/domain/repository/email_repository.dart b/lib/features/email/domain/repository/email_repository.dart index 26a7fc767..42109ec43 100644 --- a/lib/features/email/domain/repository/email_repository.dart +++ b/lib/features/email/domain/repository/email_repository.dart @@ -16,9 +16,14 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_r abstract class EmailRepository { Future getEmailContent(Session session, AccountId accountId, EmailId emailId); - Future sendEmail(AccountId accountId, EmailRequest emailRequest, {CreateNewMailboxRequest? mailboxRequest}); + Future sendEmail( + Session session, + AccountId accountId, + EmailRequest emailRequest, + {CreateNewMailboxRequest? mailboxRequest} + ); - Future> markAsRead(AccountId accountId, List emails, ReadActions readActions); + Future> markAsRead(Session session, AccountId accountId, List emails, ReadActions readActions); Future> downloadAttachments( List attachments, @@ -44,9 +49,10 @@ abstract class EmailRepository { StreamController> onReceiveController ); - Future> moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest); + Future> moveToMailbox(Session session, AccountId accountId, MoveToMailboxRequest moveRequest); Future> markAsStar( + Session session, AccountId accountId, List emails, MarkStarAction markStarAction @@ -62,15 +68,15 @@ abstract class EmailRepository { Future> addTooltipWhenHoverOnLink(List emailContents); - Future saveEmailAsDrafts(AccountId accountId, Email email); + Future saveEmailAsDrafts(Session session, AccountId accountId, Email email); - Future removeEmailDrafts(AccountId accountId, EmailId emailId); + Future removeEmailDrafts(Session session, AccountId accountId, EmailId emailId); - Future updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId); + Future updateEmailDrafts(Session session, AccountId accountId, Email newEmail, EmailId oldEmailId); - Future> deleteMultipleEmailsPermanently(AccountId accountId, List emailIds); + Future> deleteMultipleEmailsPermanently(Session session, AccountId accountId, List emailIds); - Future deleteEmailPermanently(AccountId accountId, EmailId emailId); + Future deleteEmailPermanently(Session session, AccountId accountId, EmailId emailId); Future getEmailState(); } \ No newline at end of file diff --git a/lib/features/email/domain/usecases/delete_email_permanently_interactor.dart b/lib/features/email/domain/usecases/delete_email_permanently_interactor.dart index 4cce03b57..567f4cfe9 100644 --- a/lib/features/email/domain/usecases/delete_email_permanently_interactor.dart +++ b/lib/features/email/domain/usecases/delete_email_permanently_interactor.dart @@ -1,6 +1,7 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.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:tmail_ui_user/features/email/domain/repository/email_repository.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); - Stream> execute(AccountId accountId, EmailId emailId) async* { + Stream> execute(Session session, AccountId accountId, EmailId emailId) async* { try { yield Right(StartDeleteEmailPermanently()); @@ -24,7 +25,7 @@ class DeleteEmailPermanentlyInteractor { final currentMailboxState = listState.first; final currentEmailState = listState.last; - final result = await _emailRepository.deleteEmailPermanently(accountId, emailId); + final result = await _emailRepository.deleteEmailPermanently(session, accountId, emailId); if (result) { yield Right(DeleteEmailPermanentlySuccess( currentEmailState: currentEmailState, diff --git a/lib/features/email/domain/usecases/delete_multiple_emails_permanently_interactor.dart b/lib/features/email/domain/usecases/delete_multiple_emails_permanently_interactor.dart index 554e43be9..d2686e9c7 100644 --- a/lib/features/email/domain/usecases/delete_multiple_emails_permanently_interactor.dart +++ b/lib/features/email/domain/usecases/delete_multiple_emails_permanently_interactor.dart @@ -1,6 +1,7 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.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: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'; @@ -12,7 +13,7 @@ class DeleteMultipleEmailsPermanentlyInteractor { DeleteMultipleEmailsPermanentlyInteractor(this._emailRepository, this._mailboxRepository); - Stream> execute(AccountId accountId, List emailIds) async* { + Stream> execute(Session session, AccountId accountId, List emailIds) async* { try { yield Right(LoadingDeleteMultipleEmailsPermanentlyAll()); @@ -24,7 +25,7 @@ class DeleteMultipleEmailsPermanentlyInteractor { final currentMailboxState = listState.first; final currentEmailState = listState.last; - final listResult = await _emailRepository.deleteMultipleEmailsPermanently(accountId, emailIds); + final listResult = await _emailRepository.deleteMultipleEmailsPermanently(session, accountId, emailIds); if (listResult.length == emailIds.length) { yield Right(DeleteMultipleEmailsPermanentlyAllSuccess( listResult, diff --git a/lib/features/email/domain/usecases/mark_as_email_read_interactor.dart b/lib/features/email/domain/usecases/mark_as_email_read_interactor.dart index cf605c9f7..c5966111a 100644 --- a/lib/features/email/domain/usecases/mark_as_email_read_interactor.dart +++ b/lib/features/email/domain/usecases/mark_as_email_read_interactor.dart @@ -1,6 +1,7 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.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:model/model.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; @@ -13,7 +14,7 @@ class MarkAsEmailReadInteractor { MarkAsEmailReadInteractor(this._emailRepository, this._mailboxRepository); - Stream> execute(AccountId accountId, Email email, ReadActions readAction) async* { + Stream> execute(Session session, AccountId accountId, Email email, ReadActions readAction) async* { try { final listState = await Future.wait([ _mailboxRepository.getMailboxState(), @@ -23,7 +24,7 @@ class MarkAsEmailReadInteractor { final currentMailboxState = listState.first; final currentEmailState = listState.last; - final result = await _emailRepository.markAsRead(accountId, [email], readAction); + final result = await _emailRepository.markAsRead(session, accountId, [email], readAction); if (result.isNotEmpty) { final updatedEmail = email.updatedEmail(newKeywords: result.first.keywords); yield Right(MarkAsEmailReadSuccess( diff --git a/lib/features/email/domain/usecases/mark_as_star_email_interactor.dart b/lib/features/email/domain/usecases/mark_as_star_email_interactor.dart index 1b6fe178d..0f056f838 100644 --- a/lib/features/email/domain/usecases/mark_as_star_email_interactor.dart +++ b/lib/features/email/domain/usecases/mark_as_star_email_interactor.dart @@ -1,6 +1,7 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.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:model/model.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; @@ -11,10 +12,10 @@ class MarkAsStarEmailInteractor { MarkAsStarEmailInteractor(this.emailRepository); - Stream> execute(AccountId accountId, Email email, MarkStarAction markStarAction) async* { + Stream> execute(Session session, AccountId accountId, Email email, MarkStarAction markStarAction) async* { try { 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) { final updatedEmail = email.updatedEmail(newKeywords: result.first.keywords); yield Right(MarkAsStarEmailSuccess( diff --git a/lib/features/email/domain/usecases/move_to_mailbox_interactor.dart b/lib/features/email/domain/usecases/move_to_mailbox_interactor.dart index 7a9588483..d7b7d033a 100644 --- a/lib/features/email/domain/usecases/move_to_mailbox_interactor.dart +++ b/lib/features/email/domain/usecases/move_to_mailbox_interactor.dart @@ -1,6 +1,7 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.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/repository/email_repository.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); - Stream> execute(AccountId accountId, MoveToMailboxRequest moveRequest) async* { + Stream> execute(Session session, AccountId accountId, MoveToMailboxRequest moveRequest) async* { try { yield Right(LoadingMoveToMailbox()); @@ -24,7 +25,7 @@ class MoveToMailboxInteractor { final currentMailboxState = listState.first; final currentEmailState = listState.last; - final result = await _emailRepository.moveToMailbox(accountId, moveRequest); + final result = await _emailRepository.moveToMailbox(session, accountId, moveRequest); if (result.isNotEmpty) { yield Right(MoveToMailboxSuccess( result.first, diff --git a/lib/features/email/presentation/controller/single_email_controller.dart b/lib/features/email/presentation/controller/single_email_controller.dart index 2b9dc11f8..4584ee234 100644 --- a/lib/features/email/presentation/controller/single_email_controller.dart +++ b/lib/features/email/presentation/controller/single_email_controller.dart @@ -408,8 +408,9 @@ class SingleEmailController extends BaseController with AppLoaderMixin { void markAsEmailRead(PresentationEmail presentationEmail, ReadActions readActions) async { final accountId = mailboxDashBoardController.accountId.value; - if (accountId != null) { - consumeState(_markAsEmailReadInteractor.execute(accountId, presentationEmail.toEmail(), readActions)); + final session = mailboxDashBoardController.sessionCurrent; + 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 ) { if (destinationMailbox.isTrash) { - _moveToTrashAction(context, accountId, MoveToMailboxRequest( + _moveToTrashAction( + context, + session, + accountId, + MoveToMailboxRequest( {currentMailbox.id: [emailSelected.id!]}, destinationMailbox.id, MoveAction.moving, session, EmailActionType.moveToTrash)); } else if (destinationMailbox.isSpam) { - _moveToSpamAction(context, accountId, MoveToMailboxRequest( + _moveToSpamAction( + context, + session, + accountId, + MoveToMailboxRequest( {currentMailbox.id: [emailSelected.id!]}, destinationMailbox.id, MoveAction.moving, session, EmailActionType.moveToSpam)); } else { - _moveToMailbox(context, accountId, MoveToMailboxRequest( + _moveToMailbox( + context, + session, + accountId, + MoveToMailboxRequest( {currentMailbox.id: [emailSelected.id!]}, destinationMailbox.id, 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); - consumeState(_moveToMailboxInteractor.execute(accountId, moveRequest)); + consumeState(_moveToMailboxInteractor.execute(session, accountId, moveRequest)); } void _moveToMailboxSuccess(MoveToMailboxSuccess success) { @@ -719,39 +732,55 @@ class SingleEmailController extends BaseController with AppLoaderMixin { void _revertedToOriginalMailbox(MoveToMailboxRequest newMoveRequest) { final accountId = mailboxDashBoardController.accountId.value; - if (accountId != null) { - _moveToMailbox(currentContext!, accountId, newMoveRequest); + final session = mailboxDashBoardController.sessionCurrent; + if (accountId != null && session != null) { + _moveToMailbox(currentContext!, session, accountId, newMoveRequest); } } void moveToTrash(BuildContext context, PresentationEmail email) async { + final session = mailboxDashBoardController.sessionCurrent; final accountId = mailboxDashBoardController.accountId.value; final trashMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleTrash); final currentMailbox = getMailboxContain(email); - if (accountId != null && currentMailbox != null && trashMailboxId != null) { - _moveToTrashAction(context, accountId, MoveToMailboxRequest( - {currentMailbox.id: [email.id!]}, - trashMailboxId, - MoveAction.moving, - mailboxDashBoardController.sessionCurrent!, - EmailActionType.moveToTrash) + if (session != null && accountId != null && currentMailbox != null && trashMailboxId != null) { + _moveToTrashAction( + context, + session, + accountId, + MoveToMailboxRequest( + {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); - mailboxDashBoardController.moveToMailbox(accountId, moveRequest); + mailboxDashBoardController.moveToMailbox(session, accountId, moveRequest); } void moveToSpam(BuildContext context, PresentationEmail email) async { + final session = mailboxDashBoardController.sessionCurrent; final accountId = mailboxDashBoardController.accountId.value; final spamMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleSpam); final currentMailbox = getMailboxContain(email); - if (accountId != null && currentMailbox != null && spamMailboxId != null) { - _moveToSpamAction(context, accountId, MoveToMailboxRequest( + if (session != null && accountId != null && currentMailbox != null && spamMailboxId != null) { + _moveToSpamAction( + context, + session, + accountId, + MoveToMailboxRequest( {currentMailbox.id: [email.id!]}, spamMailboxId, MoveAction.moving, @@ -762,12 +791,17 @@ class SingleEmailController extends BaseController with AppLoaderMixin { } void unSpam(BuildContext context, PresentationEmail email) async { + final session = mailboxDashBoardController.sessionCurrent; final accountId = mailboxDashBoardController.accountId.value; final spamMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleSpam); final inboxMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleInbox); - if (accountId != null && spamMailboxId != null && inboxMailboxId != null) { - _moveToSpamAction(context, accountId, MoveToMailboxRequest( + if (session != null && accountId != null && spamMailboxId != null && inboxMailboxId != null) { + _moveToSpamAction( + context, + session, + accountId, + MoveToMailboxRequest( {spamMailboxId: [email.id!]}, inboxMailboxId, 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); - mailboxDashBoardController.moveToMailbox(accountId, moveRequest); + mailboxDashBoardController.moveToMailbox(session, accountId, moveRequest); } void markAsStarEmail(PresentationEmail presentationEmail, MarkStarAction markStarAction) async { final accountId = mailboxDashBoardController.accountId.value; - if (accountId != null) { - consumeState(_markAsStarEmailInteractor.execute(accountId, presentationEmail.toEmail(), markStarAction)); + final session = mailboxDashBoardController.sessionCurrent; + if (accountId != null && session != null) { + consumeState(_markAsStarEmailInteractor.execute(session, accountId, presentationEmail.toEmail(), markStarAction)); } } diff --git a/lib/features/mailbox/data/network/mailbox_api.dart b/lib/features/mailbox/data/network/mailbox_api.dart index 0e77cd061..345b93825 100644 --- a/lib/features/mailbox/data/network/mailbox_api.dart +++ b/lib/features/mailbox/data/network/mailbox_api.dart @@ -52,9 +52,8 @@ class MailboxAPI with HandleSetErrorMixin { final queryInvocation = jmapRequestBuilder.invocation(getMailboxCreated); - final capabilities = [CapabilityIdentifier.jmapTeamMailboxes].isSupportTeamMailboxes(session, accountId) - ? getMailboxCreated.requiredCapabilitiesSupportTeamMailboxes - : getMailboxCreated.requiredCapabilities; + final capabilities = getMailboxCreated.requiredCapabilities + .toCapabilitiesSupportTeamMailboxes(session, accountId); final result = await (jmapRequestBuilder ..usings(capabilities)) @@ -93,9 +92,8 @@ class MailboxAPI with HandleSetErrorMixin { final getMailboxUpdatedInvocation = jmapRequestBuilder.invocation(getMailboxUpdated); final getMailboxCreatedInvocation = jmapRequestBuilder.invocation(getMailboxCreated); - final capabilities = [CapabilityIdentifier.jmapTeamMailboxes].isSupportTeamMailboxes(session, accountId) - ? getMailboxUpdated.requiredCapabilitiesSupportTeamMailboxes - : getMailboxUpdated.requiredCapabilities; + final capabilities = getMailboxUpdated.requiredCapabilities + .toCapabilitiesSupportTeamMailboxes(session, accountId); final result = await (jmapRequestBuilder ..usings(capabilities)) @@ -141,9 +139,8 @@ class MailboxAPI with HandleSetErrorMixin { final setMailboxInvocation = requestBuilder.invocation(setMailboxMethod); - final capabilities = [CapabilityIdentifier.jmapTeamMailboxes].isSupportTeamMailboxes(session, accountId) - ? setMailboxMethod.requiredCapabilities.add(CapabilityIdentifier.jmapTeamMailboxes) as Set - : setMailboxMethod.requiredCapabilities; + final capabilities = setMailboxMethod.requiredCapabilities + .toCapabilitiesSupportTeamMailboxes(session, accountId); final response = await (requestBuilder ..usings(capabilities)) @@ -212,9 +209,8 @@ class MailboxAPI with HandleSetErrorMixin { .map(requestBuilder.invocation) .toList(); - final capabilities = [CapabilityIdentifier.jmapTeamMailboxes].isSupportTeamMailboxes(session, accountId) - ? {CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail, CapabilityIdentifier.jmapTeamMailboxes} - : {CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail}; + final capabilities = {CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail} + .toCapabilitiesSupportTeamMailboxes(session, accountId); final response = await (requestBuilder ..usings(capabilities)) @@ -258,9 +254,8 @@ class MailboxAPI with HandleSetErrorMixin { final setMailboxInvocation = requestBuilder.invocation(setMailboxMethod); - final capabilities = [CapabilityIdentifier.jmapTeamMailboxes].isSupportTeamMailboxes(session, accountId) - ? setMailboxMethod.requiredCapabilities.add(CapabilityIdentifier.jmapTeamMailboxes) as Set - : setMailboxMethod.requiredCapabilities; + final capabilities = setMailboxMethod.requiredCapabilities + .toCapabilitiesSupportTeamMailboxes(session, accountId); final response = await (requestBuilder ..usings(capabilities)) @@ -290,9 +285,8 @@ class MailboxAPI with HandleSetErrorMixin { final setMailboxInvocation = requestBuilder.invocation(setMailboxMethod); - final capabilities = [CapabilityIdentifier.jmapTeamMailboxes].isSupportTeamMailboxes(session, accountId) - ? setMailboxMethod.requiredCapabilities.add(CapabilityIdentifier.jmapTeamMailboxes) as Set - : setMailboxMethod.requiredCapabilities; + final capabilities = setMailboxMethod.requiredCapabilities + .toCapabilitiesSupportTeamMailboxes(session, accountId); final response = await (requestBuilder ..usings(capabilities)) @@ -322,9 +316,8 @@ class MailboxAPI with HandleSetErrorMixin { final setMailboxInvocation = requestBuilder.invocation(setMailboxMethod); - final capabilities = [CapabilityIdentifier.jmapTeamMailboxes].isSupportTeamMailboxes(session, accountId) - ? setMailboxMethod.requiredCapabilities.add(CapabilityIdentifier.jmapTeamMailboxes) as Set - : setMailboxMethod.requiredCapabilities; + final capabilities = setMailboxMethod.requiredCapabilities + .toCapabilitiesSupportTeamMailboxes(session, accountId); final response = await (requestBuilder ..usings(capabilities)) @@ -357,9 +350,8 @@ class MailboxAPI with HandleSetErrorMixin { final setMailboxInvocation = requestBuilder.invocation(setMailboxMethod); - final capabilities = [CapabilityIdentifier.jmapTeamMailboxes].isSupportTeamMailboxes(session, accountId) - ? setMailboxMethod.requiredCapabilities.add(CapabilityIdentifier.jmapTeamMailboxes) as Set - : setMailboxMethod.requiredCapabilities; + final capabilities = setMailboxMethod.requiredCapabilities + .toCapabilitiesSupportTeamMailboxes(session, accountId); final response = await (requestBuilder ..usings(capabilities)) diff --git a/lib/features/mailbox/data/network/mailbox_isolate_worker.dart b/lib/features/mailbox/data/network/mailbox_isolate_worker.dart index c8b7a6c4e..65a28bb7e 100644 --- a/lib/features/mailbox/data/network/mailbox_isolate_worker.dart +++ b/lib/features/mailbox/data/network/mailbox_isolate_worker.dart @@ -118,9 +118,10 @@ class MailboxIsolateWorker { lastReceivedDate = listEmailUnread.last.receivedAt; final result = await args.emailAPI.markAsRead( - args.accountId, - listEmailUnread, - ReadActions.markAsRead); + args.session, + args.accountId, + listEmailUnread, + ReadActions.markAsRead); log('MailboxIsolateWorker::_handleMarkAsMailboxRead(): MARK_READ: ${result.length}'); emailListCompleted.addAll(result); @@ -184,8 +185,7 @@ class MailboxIsolateWorker { lastEmailId = listEmailUnread.last.id; lastReceivedDate = listEmailUnread.last.receivedAt; - final result = await _emailApi.markAsRead( - accountId, listEmailUnread, ReadActions.markAsRead); + final result = await _emailApi.markAsRead(session, accountId, listEmailUnread, ReadActions.markAsRead); log('MailboxIsolateWorker::_handleMarkAsMailboxReadActionOnWeb(): MARK_READ: ${result.length}'); emailListCompleted.addAll(result); diff --git a/lib/features/mailbox_dashboard/data/network/spam_report_api.dart b/lib/features/mailbox_dashboard/data/network/spam_report_api.dart index c30692e41..3c0244b79 100644 --- a/lib/features/mailbox_dashboard/data/network/spam_report_api.dart +++ b/lib/features/mailbox_dashboard/data/network/spam_report_api.dart @@ -1,6 +1,5 @@ import 'package:jmap_dart_client/http/http_client.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/session/session.dart'; import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; @@ -40,9 +39,8 @@ class SpamReportApi { )); final getMailboxInvocation = requestBuilder.invocation(getMailBoxMethod); - final capabilities = [CapabilityIdentifier.jmapTeamMailboxes].isSupportTeamMailboxes(session, accountId) - ? getMailBoxMethod.requiredCapabilitiesSupportTeamMailboxes - : getMailBoxMethod.requiredCapabilities; + final capabilities = getMailBoxMethod.requiredCapabilities + .toCapabilitiesSupportTeamMailboxes(session, accountId); final result = await (requestBuilder ..usings(capabilities)) diff --git a/lib/features/mailbox_dashboard/domain/usecases/remove_email_drafts_interactor.dart b/lib/features/mailbox_dashboard/domain/usecases/remove_email_drafts_interactor.dart index e63f66687..7f2ff1095 100644 --- a/lib/features/mailbox_dashboard/domain/usecases/remove_email_drafts_interactor.dart +++ b/lib/features/mailbox_dashboard/domain/usecases/remove_email_drafts_interactor.dart @@ -1,6 +1,7 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.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:tmail_ui_user/features/email/domain/repository/email_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); - Stream> execute(AccountId accountId, EmailId emailId) async* { + Stream> execute(Session session, AccountId accountId, EmailId emailId) async* { try { final listState = await Future.wait([ _mailboxRepository.getMailboxState(), @@ -22,7 +23,7 @@ class RemoveEmailDraftsInteractor { final currentMailboxState = listState.first; final currentEmailState = listState.last; - final result = await _emailRepository.removeEmailDrafts(accountId, emailId); + final result = await _emailRepository.removeEmailDrafts(session, accountId, emailId); if (result) { yield Right(RemoveEmailDraftsSuccess( currentEmailState: currentEmailState, diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index 20790e43c..f96820c68 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -592,8 +592,8 @@ class MailboxDashBoardController extends ReloadableController { } } - void moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest) { - consumeState(_moveToMailboxInteractor.execute(accountId, moveRequest)); + void moveToMailbox(Session session, AccountId accountId, MoveToMailboxRequest moveRequest) { + consumeState(_moveToMailboxInteractor.execute(session, accountId, moveRequest)); } void _moveToMailboxSuccess(MoveToMailboxSuccess success) { @@ -621,22 +621,25 @@ class MailboxDashBoardController extends ReloadableController { void _revertedToOriginalMailbox(MoveToMailboxRequest newMoveRequest) { final currentAccountId = accountId.value; - if (currentAccountId != null) { - consumeState(_moveToMailboxInteractor.execute(currentAccountId, newMoveRequest)); + final session = sessionCurrent; + if (currentAccountId != null && session != null) { + consumeState(_moveToMailboxInteractor.execute(session, currentAccountId, newMoveRequest)); } } void _discardEmail(Email email) { final currentAccountId = accountId.value; - if (currentAccountId != null && email.id != null) { - consumeState(_removeEmailDraftsInteractor.execute(currentAccountId, email.id!)); + final session = sessionCurrent; + if (currentAccountId != null && session != null && email.id != null) { + consumeState(_removeEmailDraftsInteractor.execute(session, currentAccountId, email.id!)); } } void deleteEmailPermanently(PresentationEmail email) { final currentAccountId = accountId.value; - if (currentAccountId != null && email.id != null) { - consumeState(_deleteEmailPermanentlyInteractor.execute(currentAccountId, email.id!)); + final session = sessionCurrent; + 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 { - if (accountId.value != null) { + if (accountId.value != null && sessionCurrent != null) { consumeState(_markAsEmailReadInteractor.execute( - accountId.value!, - presentationEmail.toEmail(), - readActions)); + sessionCurrent!, + accountId.value!, + presentationEmail.toEmail(), + readActions)); } } void markAsStarEmail(PresentationEmail presentationEmail, MarkStarAction action) { - if (accountId.value != null) { + if (accountId.value != null && sessionCurrent != null) { consumeState(_markAsStarEmailInteractor.execute( - accountId.value!, - presentationEmail.toEmail(), - action)); + sessionCurrent!, + accountId.value!, + presentationEmail.toEmail(), + action)); } } @@ -673,11 +678,12 @@ class MailboxDashBoardController extends ReloadableController { .map((presentationEmail) => presentationEmail.toEmail()) .toList(); log('MailboxDashBoardController::markAsReadSelectedMultipleEmail(): listEmail: ${listEmail.length}'); - if (accountId.value != null) { + if (accountId.value != null && sessionCurrent != null) { consumeState(_markAsMultipleEmailReadInteractor.execute( - accountId.value!, - listEmail, - readActions)); + sessionCurrent!, + accountId.value!, + listEmail, + readActions)); } } @@ -709,11 +715,12 @@ class MailboxDashBoardController extends ReloadableController { final listEmail = listPresentationEmail .map((presentationEmail) => presentationEmail.toEmail()) .toList(); - if (accountId.value != null) { + if (accountId.value != null && sessionCurrent != null) { consumeState(_markAsStarMultipleEmailInteractor.execute( - accountId.value!, - listEmail, - markStarAction)); + sessionCurrent!, + accountId.value!, + listEmail, + markStarAction)); } } @@ -797,21 +804,30 @@ class MailboxDashBoardController extends ReloadableController { PresentationMailbox destinationMailbox ) { if (destinationMailbox.isTrash) { - _moveSelectedEmailMultipleToMailboxAction(accountId, MoveToMailboxRequest( + _moveSelectedEmailMultipleToMailboxAction( + session, + accountId, + MoveToMailboxRequest( {currentMailbox.id: listEmailIds}, destinationMailbox.id, MoveAction.moving, session, EmailActionType.moveToTrash)); } else if (destinationMailbox.isSpam) { - _moveSelectedEmailMultipleToMailboxAction(accountId, MoveToMailboxRequest( + _moveSelectedEmailMultipleToMailboxAction( + session, + accountId, + MoveToMailboxRequest( {currentMailbox.id: listEmailIds}, destinationMailbox.id, MoveAction.moving, session, EmailActionType.moveToSpam)); } else { - _moveSelectedEmailMultipleToMailboxAction(accountId, MoveToMailboxRequest( + _moveSelectedEmailMultipleToMailboxAction( + session, + accountId, + MoveToMailboxRequest( {currentMailbox.id: listEmailIds}, destinationMailbox.id, MoveAction.moving, @@ -850,9 +866,11 @@ class MailboxDashBoardController extends ReloadableController { Map> mapListEmails, PresentationMailbox destinationMailbox, ) async { - if (accountId.value != null ) { + if (accountId.value != null && sessionCurrent != null) { if (destinationMailbox.isTrash) { - moveToMailbox(accountId.value!, + moveToMailbox( + sessionCurrent!, + accountId.value!, MoveToMailboxRequest( mapListEmails, destinationMailbox.id, @@ -862,7 +880,9 @@ class MailboxDashBoardController extends ReloadableController { ), ); } else if (destinationMailbox.isSpam) { - moveToMailbox(accountId.value!, + moveToMailbox( + sessionCurrent!, + accountId.value!, MoveToMailboxRequest( mapListEmails, destinationMailbox.id, @@ -872,7 +892,9 @@ class MailboxDashBoardController extends ReloadableController { ), ); } else { - moveToMailbox(accountId.value!, + moveToMailbox( + sessionCurrent!, + accountId.value!, MoveToMailboxRequest( mapListEmails, destinationMailbox.id, @@ -888,10 +910,11 @@ class MailboxDashBoardController extends ReloadableController { } void _moveSelectedEmailMultipleToMailboxAction( - AccountId accountId, - MoveToMailboxRequest moveRequest + Session session, + AccountId accountId, + MoveToMailboxRequest moveRequest ) { - consumeState(_moveMultipleEmailToMailboxInteractor.execute(accountId, moveRequest)); + consumeState(_moveMultipleEmailToMailboxInteractor.execute(session, accountId, moveRequest)); } void _moveSelectedMultipleEmailToMailboxSuccess(Success success) { @@ -952,17 +975,21 @@ class MailboxDashBoardController extends ReloadableController { } void _revertedSelectionEmailToOriginalMailbox(MoveToMailboxRequest newMoveRequest) { - if (accountId.value != null) { + if (accountId.value != null && sessionCurrent != null) { consumeState(_moveMultipleEmailToMailboxInteractor.execute( - accountId.value!, - newMoveRequest)); + sessionCurrent!, + accountId.value!, + newMoveRequest)); } } void moveSelectedMultipleEmailToTrash(List listEmails, PresentationMailbox mailboxCurrent) { final trashMailboxId = getMailboxIdByRole(PresentationMailbox.roleTrash); - if (accountId.value != null && trashMailboxId != null) { - _moveSelectedEmailMultipleToMailboxAction(accountId.value!, MoveToMailboxRequest( + if (accountId.value != null && trashMailboxId != null && sessionCurrent != null) { + _moveSelectedEmailMultipleToMailboxAction( + sessionCurrent!, + accountId.value!, + MoveToMailboxRequest( {mailboxCurrent.id: listEmails.listEmailIds}, trashMailboxId, MoveAction.moving, @@ -974,8 +1001,11 @@ class MailboxDashBoardController extends ReloadableController { void moveSelectedMultipleEmailToSpam(List listEmail, PresentationMailbox mailboxCurrent) { final spamMailboxId = getMailboxIdByRole(PresentationMailbox.roleSpam); - if (accountId.value != null && spamMailboxId != null) { - _moveSelectedEmailMultipleToMailboxAction(accountId.value!, MoveToMailboxRequest( + if (accountId.value != null && spamMailboxId != null && sessionCurrent != null) { + _moveSelectedEmailMultipleToMailboxAction( + sessionCurrent!, + accountId.value!, + MoveToMailboxRequest( {mailboxCurrent.id: listEmail.listEmailIds}, spamMailboxId, MoveAction.moving, @@ -988,8 +1018,11 @@ class MailboxDashBoardController extends ReloadableController { void unSpamSelectedMultipleEmail(List listEmail) { final spamMailboxId = getMailboxIdByRole(PresentationMailbox.roleSpam); final inboxMailboxId = getMailboxIdByRole(PresentationMailbox.roleInbox); - if (inboxMailboxId != null && accountId.value != null && spamMailboxId != null) { - _moveSelectedEmailMultipleToMailboxAction(accountId.value!, MoveToMailboxRequest( + if (inboxMailboxId != null && accountId.value != null && spamMailboxId != null && sessionCurrent != null) { + _moveSelectedEmailMultipleToMailboxAction( + sessionCurrent!, + accountId.value!, + MoveToMailboxRequest( {spamMailboxId: listEmail.listEmailIds}, inboxMailboxId, MoveAction.moving, @@ -1090,10 +1123,11 @@ class MailboxDashBoardController extends ReloadableController { void _deleteMultipleEmailsPermanently(List listEmails, {Function? onCancelSelectionEmail}) { onCancelSelectionEmail?.call(); - if (accountId.value != null) { + if (accountId.value != null && sessionCurrent != null) { consumeState(_deleteMultipleEmailsPermanentlyInteractor.execute( - accountId.value!, - listEmails.listEmailIds)); + sessionCurrent!, + accountId.value!, + listEmails.listEmailIds)); } } @@ -1658,11 +1692,13 @@ class MailboxDashBoardController extends ReloadableController { } void handleSendEmailAction( + Session session, AccountId accountId, EmailRequest emailRequest, CreateNewMailboxRequest? mailboxRequest ) { consumeState(_sendEmailInteractor.execute( + session, accountId, emailRequest, mailboxRequest: mailboxRequest diff --git a/lib/features/thread/data/network/thread_api.dart b/lib/features/thread/data/network/thread_api.dart index ff513344f..a8737ae4d 100644 --- a/lib/features/thread/data/network/thread_api.dart +++ b/lib/features/thread/data/network/thread_api.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'package:jmap_dart_client/http/http_client.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/properties/properties.dart'; import 'package:jmap_dart_client/jmap/core/request/reference_path.dart'; @@ -27,23 +26,6 @@ class ThreadAPI { ThreadAPI(this.httpClient); - Set _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 getAllEmail( Session session, AccountId accountId, @@ -78,8 +60,11 @@ class ThreadAPI { final getEmailInvocation = jmapRequestBuilder.invocation(getEmailMethod); + final capabilities = getEmailMethod.requiredCapabilities + .toCapabilitiesSupportTeamMailboxes(session, accountId); + final result = await (jmapRequestBuilder - ..usings(_capabilitiesForEmailMethod(session, accountId))) + ..usings(capabilities)) .build() .execute(); @@ -133,8 +118,11 @@ class ThreadAPI { final getEmailUpdatedInvocation = jmapRequestBuilder.invocation(getMailboxUpdated); final getEmailCreatedInvocation = jmapRequestBuilder.invocation(getEmailCreated); + final capabilities = getEmailCreated.requiredCapabilities + .toCapabilitiesSupportTeamMailboxes(session, accountId); + final result = await (jmapRequestBuilder - ..usings(_capabilitiesForEmailMethod(session, accountId))) + ..usings(capabilities)) .build() .execute(); @@ -175,8 +163,11 @@ class ThreadAPI { final getEmailInvocation = jmapRequestBuilder.invocation(getEmailMethod); + final capabilities = getEmailMethod.requiredCapabilities + .toCapabilitiesSupportTeamMailboxes(session, accountId); + final result = await (jmapRequestBuilder - ..usings(_capabilitiesForEmailMethod(session, accountId))) + ..usings(capabilities)) .build() .execute(); diff --git a/lib/features/thread/data/network/thread_isolate_worker.dart b/lib/features/thread/data/network/thread_isolate_worker.dart index 6fa39de4c..e87bd9067 100644 --- a/lib/features/thread/data/network/thread_isolate_worker.dart +++ b/lib/features/thread/data/network/thread_isolate_worker.dart @@ -73,7 +73,7 @@ class ThreadIsolateWorker { if (newEmailList.isNotEmpty) { lastEmail = newEmailList.last; 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) { sendPort.send(listEmailIdDeleted); @@ -123,7 +123,7 @@ class ThreadIsolateWorker { if (newEmailList.isNotEmpty) { lastEmail = newEmailList.last; 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) { await updateDestroyedEmailCache(listEmailIdDeleted); diff --git a/lib/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart b/lib/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart index 0eaed2b0e..739cf4357 100644 --- a/lib/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart +++ b/lib/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart @@ -1,6 +1,7 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.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:model/model.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; @@ -14,9 +15,10 @@ class MarkAsMultipleEmailReadInteractor { MarkAsMultipleEmailReadInteractor(this._emailRepository, this._mailboxRepository); Stream> execute( - AccountId accountId, - List emails, - ReadActions readAction + Session session, + AccountId accountId, + List emails, + ReadActions readAction ) async* { try { yield Right(LoadingMarkAsMultipleEmailReadAll()); @@ -33,7 +35,7 @@ class MarkAsMultipleEmailReadInteractor { .where((email) => readAction == ReadActions.markAsUnread ? email.hasRead : !email.hasRead) .toList(); - final result = await _emailRepository.markAsRead(accountId, listEmailNeedMarkAsRead, readAction); + final result = await _emailRepository.markAsRead(session, accountId, listEmailNeedMarkAsRead, readAction); if (listEmailNeedMarkAsRead.length == result.length) { final countMarkAsReadSuccess = emails.length; diff --git a/lib/features/thread/domain/usecases/mark_as_star_multiple_email_interactor.dart b/lib/features/thread/domain/usecases/mark_as_star_multiple_email_interactor.dart index bdb0a747c..e68ffe5a5 100644 --- a/lib/features/thread/domain/usecases/mark_as_star_multiple_email_interactor.dart +++ b/lib/features/thread/domain/usecases/mark_as_star_multiple_email_interactor.dart @@ -1,6 +1,7 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.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:model/model.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; @@ -12,9 +13,10 @@ class MarkAsStarMultipleEmailInteractor { MarkAsStarMultipleEmailInteractor(this._emailRepository); Stream> execute( - AccountId accountId, - List emails, - MarkStarAction markStarAction + Session session, + AccountId accountId, + List emails, + MarkStarAction markStarAction ) async* { try { yield Right(LoadingMarkAsStarMultipleEmailAll()); @@ -25,7 +27,7 @@ class MarkAsStarMultipleEmailInteractor { .where((email) => markStarAction == MarkStarAction.unMarkStar ? email.hasStarred : !email.hasStarred) .toList(); - final result = await _emailRepository.markAsStar(accountId, listEmailNeedMarkStar, markStarAction); + final result = await _emailRepository.markAsStar(session, accountId, listEmailNeedMarkStar, markStarAction); if (listEmailNeedMarkStar.length == result.length) { final countMarkStarSuccess = emails.length; diff --git a/lib/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart b/lib/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart index 342b221be..5f3077d58 100644 --- a/lib/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart +++ b/lib/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:core/core.dart'; import 'package:dartz/dartz.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/repository/email_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); - Stream> execute(AccountId accountId, MoveToMailboxRequest moveRequest) async* { + Stream> execute( + Session session, + AccountId accountId, + MoveToMailboxRequest moveRequest + ) async* { try { yield Right(LoadingMoveMultipleEmailToMailboxAll()); @@ -26,7 +31,7 @@ class MoveMultipleEmailToMailboxInteractor { final currentMailboxState = listState.first; final currentEmailState = listState.last; - final result = await _emailRepository.moveToMailbox(accountId, moveRequest); + final result = await _emailRepository.moveToMailbox(session, accountId, moveRequest); int totalEmail = 0; for (var element in moveRequest.currentMailboxes.values) { totalEmail = totalEmail + element.length; diff --git a/lib/features/thread/presentation/mixin/email_action_controller.dart b/lib/features/thread/presentation/mixin/email_action_controller.dart index b3d233784..81600ad90 100644 --- a/lib/features/thread/presentation/mixin/email_action_controller.dart +++ b/lib/features/thread/presentation/mixin/email_action_controller.dart @@ -51,57 +51,69 @@ mixin EmailActionController on ViewAsDialogActionMixin { } void moveToTrash(PresentationEmail email, {PresentationMailbox? mailboxContain}) async { + final session = mailboxDashBoardController.sessionCurrent; final accountId = mailboxDashBoardController.accountId.value; final trashMailboxId = mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleTrash]; - if (mailboxContain != null && accountId != null && trashMailboxId != null) { - _moveToTrashAction(accountId, MoveToMailboxRequest( - {mailboxContain.id: email.id != null ? [email.id!] : []}, - trashMailboxId, - MoveAction.moving, - mailboxDashBoardController.sessionCurrent!, - EmailActionType.moveToTrash) + if (session != null && mailboxContain != null && accountId != null && trashMailboxId != null) { + _moveToTrashAction( + session, + accountId, + MoveToMailboxRequest( + {mailboxContain.id: email.id != null ? [email.id!] : []}, + trashMailboxId, + MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, + EmailActionType.moveToTrash) ); } } - void _moveToTrashAction(AccountId accountId, MoveToMailboxRequest moveRequest) { - mailboxDashBoardController.moveToMailbox(accountId, moveRequest); + void _moveToTrashAction(Session session, AccountId accountId, MoveToMailboxRequest moveRequest) { + mailboxDashBoardController.moveToMailbox(session, accountId, moveRequest); } void moveToSpam(PresentationEmail email, {PresentationMailbox? mailboxContain}) async { + final session = mailboxDashBoardController.sessionCurrent; final accountId = mailboxDashBoardController.accountId.value; final spamMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleSpam); - if (mailboxContain != null && accountId != null && spamMailboxId != null) { - moveToSpamAction(accountId, MoveToMailboxRequest( - {mailboxContain.id: email.id != null ? [email.id!] : []}, - spamMailboxId, - MoveAction.moving, - mailboxDashBoardController.sessionCurrent!, - EmailActionType.moveToSpam) + if (session != null && mailboxContain != null && accountId != null && spamMailboxId != null) { + moveToSpamAction( + session, + accountId, + MoveToMailboxRequest( + {mailboxContain.id: email.id != null ? [email.id!] : []}, + spamMailboxId, + MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, + EmailActionType.moveToSpam) ); } } void unSpam(PresentationEmail email) async { + final session = mailboxDashBoardController.sessionCurrent; final accountId = mailboxDashBoardController.accountId.value; final spamMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleSpam); final inboxMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleInbox); - if (inboxMailboxId != null && accountId != null && spamMailboxId != null) { - moveToSpamAction(accountId, MoveToMailboxRequest( - {spamMailboxId: email.id != null ? [email.id!] : []}, - inboxMailboxId, - MoveAction.moving, - mailboxDashBoardController.sessionCurrent!, - EmailActionType.unSpam) + if (session != null && inboxMailboxId != null && accountId != null && spamMailboxId != null) { + moveToSpamAction( + session, + accountId, + MoveToMailboxRequest( + {spamMailboxId: email.id != null ? [email.id!] : []}, + inboxMailboxId, + MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, + EmailActionType.unSpam) ); } } - void moveToSpamAction(AccountId accountId, MoveToMailboxRequest moveRequest) { - mailboxDashBoardController.moveToMailbox(accountId, moveRequest); + void moveToSpamAction(Session session, AccountId accountId, MoveToMailboxRequest moveRequest) { + mailboxDashBoardController.moveToMailbox(session, accountId, moveRequest); } void moveToMailbox( @@ -160,32 +172,41 @@ mixin EmailActionController on ViewAsDialogActionMixin { PresentationMailbox destinationMailbox ) { if (destinationMailbox.isTrash) { - moveToSpamAction(accountId, MoveToMailboxRequest( - {currentMailbox.id: emailSelected.id != null ? [emailSelected.id!] : []}, - destinationMailbox.id, - MoveAction.moving, + moveToSpamAction( session, - EmailActionType.moveToTrash)); + accountId, + MoveToMailboxRequest( + {currentMailbox.id: emailSelected.id != null ? [emailSelected.id!] : []}, + destinationMailbox.id, + MoveAction.moving, + session, + EmailActionType.moveToTrash)); } else if (destinationMailbox.isSpam) { - moveToSpamAction(accountId, MoveToMailboxRequest( - {currentMailbox.id: emailSelected.id != null ? [emailSelected.id!] : []}, - destinationMailbox.id, - MoveAction.moving, + moveToSpamAction( session, - EmailActionType.moveToSpam)); + accountId, + MoveToMailboxRequest( + {currentMailbox.id: emailSelected.id != null ? [emailSelected.id!] : []}, + destinationMailbox.id, + MoveAction.moving, + session, + EmailActionType.moveToSpam)); } else { - _moveToMailboxAction(accountId, MoveToMailboxRequest( - {currentMailbox.id: emailSelected.id != null ? [emailSelected.id!] : []}, - destinationMailbox.id, - MoveAction.moving, + _moveToMailboxAction( session, - EmailActionType.moveToMailbox, - destinationPath: destinationMailbox.mailboxPath)); + accountId, + MoveToMailboxRequest( + {currentMailbox.id: emailSelected.id != null ? [emailSelected.id!] : []}, + destinationMailbox.id, + MoveAction.moving, + session, + EmailActionType.moveToMailbox, + destinationPath: destinationMailbox.mailboxPath)); } } - void _moveToMailboxAction(AccountId accountId, MoveToMailboxRequest moveRequest) { - mailboxDashBoardController.moveToMailbox(accountId, moveRequest); + void _moveToMailboxAction(Session session, AccountId accountId, MoveToMailboxRequest moveRequest) { + mailboxDashBoardController.moveToMailbox(session, accountId, moveRequest); } void deleteEmailPermanently(BuildContext context, PresentationEmail email) { diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index 3223e3ac5..1e7599708 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -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": { "type": "text", diff --git a/lib/main/error/capability_validator.dart b/lib/main/error/capability_validator.dart index 358a84277..cce8db5ff 100644 --- a/lib/main/error/capability_validator.dart +++ b/lib/main/error/capability_validator.dart @@ -28,16 +28,6 @@ void requireCapability(Session session, AccountId accountId, List { - 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) { try { requireCapability(session, accountId, this); @@ -47,4 +37,18 @@ extension CapabilityIdentifierExtension on List { return false; } } +} + +extension CapabilityIdentifierSetExtension on Set { + + Set toCapabilitiesSupportTeamMailboxes(Session session, AccountId accountId) { + try { + requireCapability(session, accountId, [CapabilityIdentifier.jmapTeamMailboxes]); + add(CapabilityIdentifier.jmapTeamMailboxes); + return this; + } catch (error) { + logError('CapabilityIdentifierExtension::toCapabilitiesSupportTeamMailboxes(): $error'); + return this; + } + } } \ No newline at end of file