diff --git a/lib/features/destination_picker/presentation/destination_picker_controller.dart b/lib/features/destination_picker/presentation/destination_picker_controller.dart index 68c9411ae..c41465a41 100644 --- a/lib/features/destination_picker/presentation/destination_picker_controller.dart +++ b/lib/features/destination_picker/presentation/destination_picker_controller.dart @@ -13,6 +13,7 @@ import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/error/method/error_method_response.dart'; import 'package:jmap_dart_client/jmap/core/id.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; import 'package:model/mailbox/expand_mode.dart'; @@ -74,6 +75,7 @@ class DestinationPickerController extends BaseMailboxController { TextEditingController? searchInputController; FocusNode? searchFocus; DestinationPickerArguments? arguments; + Session? _session; AccountId? accountId; MailboxId? mailboxIdSelected; OnSelectedMailboxCallback? onSelectedMailboxCallback; @@ -156,7 +158,7 @@ class DestinationPickerController extends BaseMailboxController { void getAllMailboxAction() { if (accountId != null) { - consumeState(_getAllMailboxInteractor.execute(accountId!)); + consumeState(_getAllMailboxInteractor.execute(_session!, accountId!)); } } diff --git a/lib/features/mailbox/data/datasource/mailbox_datasource.dart b/lib/features/mailbox/data/datasource/mailbox_datasource.dart index 3342ee085..95f8d66fb 100644 --- a/lib/features/mailbox/data/datasource/mailbox_datasource.dart +++ b/lib/features/mailbox/data/datasource/mailbox_datasource.dart @@ -18,7 +18,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart'; abstract class MailboxDataSource { - Future getAllMailbox(AccountId accountId, {Properties? properties}); + Future getAllMailbox(Session session, AccountId accountId, {Properties? properties}); Future> getAllMailboxCache(); diff --git a/lib/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart b/lib/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart index 4bc6cb61e..38636bd99 100644 --- a/lib/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart +++ b/lib/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart @@ -28,7 +28,7 @@ class MailboxCacheDataSourceImpl extends MailboxDataSource { MailboxCacheDataSourceImpl(this._mailboxCacheManager, this._exceptionThrower); @override - Future getAllMailbox(AccountId accountId, {Properties? properties}) { + Future getAllMailbox(Session session, AccountId accountId, {Properties? properties}) { throw UnimplementedError(); } diff --git a/lib/features/mailbox/data/datasource_impl/mailbox_datasource_impl.dart b/lib/features/mailbox/data/datasource_impl/mailbox_datasource_impl.dart index 957201cf6..6768f3729 100644 --- a/lib/features/mailbox/data/datasource_impl/mailbox_datasource_impl.dart +++ b/lib/features/mailbox/data/datasource_impl/mailbox_datasource_impl.dart @@ -30,9 +30,9 @@ class MailboxDataSourceImpl extends MailboxDataSource { MailboxDataSourceImpl(this.mailboxAPI, this._mailboxIsolateWorker, this._exceptionThrower); @override - Future getAllMailbox(AccountId accountId, {Properties? properties}) { + Future getAllMailbox(Session session, AccountId accountId, {Properties? properties}) { return Future.sync(() async { - return await mailboxAPI.getAllMailbox(accountId, properties: properties); + return await mailboxAPI.getAllMailbox(session, accountId, properties: properties); }).catchError((error) { _exceptionThrower.throwException(error); }); diff --git a/lib/features/mailbox/data/network/mailbox_api.dart b/lib/features/mailbox/data/network/mailbox_api.dart index 9e66aee64..553fe50fe 100644 --- a/lib/features/mailbox/data/network/mailbox_api.dart +++ b/lib/features/mailbox/data/network/mailbox_api.dart @@ -38,7 +38,7 @@ class MailboxAPI with HandleSetErrorMixin { MailboxAPI(this.httpClient); - Future getAllMailbox(AccountId accountId, {Properties? properties}) async { + Future getAllMailbox(Session session, AccountId accountId, {Properties? properties}) async { final processingInvocation = ProcessingInvocation(); final jmapRequestBuilder = JmapRequestBuilder(httpClient, processingInvocation); @@ -47,8 +47,10 @@ class MailboxAPI with HandleSetErrorMixin { final queryInvocation = jmapRequestBuilder.invocation(getMailboxCreated); + final capabilities = checkCapabilities(session, accountId); + final result = await (jmapRequestBuilder - ..usings(getMailboxCreated.requiredCapabilities)) + ..usings(capabilities)) .build() .execute(); @@ -59,6 +61,23 @@ class MailboxAPI with HandleSetErrorMixin { return MailboxResponse(mailboxes: resultCreated?.list, state: resultCreated?.state); } + Set checkCapabilities(Session session, AccountId accountId) { + final getMailboxCreated = GetMailboxMethod(accountId); + try { + requireCapability( + session, + accountId, + [ + CapabilityIdentifier.jmapCore, + CapabilityIdentifier.jmapMail, + CapabilityIdentifier.jmapTeamMailboxes + ]); + return getMailboxCreated.requiredCapabilitiesSupportTeamMailboxes; + } catch (_) { + return getMailboxCreated.requiredCapabilities; + } + } + Future getChanges(AccountId accountId, State sinceState) async { final processingInvocation = ProcessingInvocation(); diff --git a/lib/features/mailbox/data/repository/mailbox_repository_impl.dart b/lib/features/mailbox/data/repository/mailbox_repository_impl.dart index f0298a03f..61e20a267 100644 --- a/lib/features/mailbox/data/repository/mailbox_repository_impl.dart +++ b/lib/features/mailbox/data/repository/mailbox_repository_impl.dart @@ -35,7 +35,7 @@ class MailboxRepositoryImpl extends MailboxRepository { ); @override - Stream getAllMailbox(AccountId accountId, {Properties? properties}) async* { + Stream getAllMailbox(Session session, AccountId accountId, {Properties? properties}) async* { final localMailboxResponse = await Future.wait([ mapDataSource[DataSourceType.local]!.getAllMailboxCache(), stateDataSource.getState(StateType.mailbox) @@ -70,7 +70,7 @@ class MailboxRepositoryImpl extends MailboxRepository { ]); } } else { - final mailboxResponse = await mapDataSource[DataSourceType.network]!.getAllMailbox(accountId); + final mailboxResponse = await mapDataSource[DataSourceType.network]!.getAllMailbox(session, accountId,); await Future.wait([ mapDataSource[DataSourceType.local]!.update(created: mailboxResponse.mailboxes), diff --git a/lib/features/mailbox/domain/repository/mailbox_repository.dart b/lib/features/mailbox/domain/repository/mailbox_repository.dart index e490c8641..41f94a276 100644 --- a/lib/features/mailbox/domain/repository/mailbox_repository.dart +++ b/lib/features/mailbox/domain/repository/mailbox_repository.dart @@ -17,7 +17,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart'; abstract class MailboxRepository { - Stream getAllMailbox(AccountId accountId, {Properties? properties}); + Stream getAllMailbox(Session session, AccountId accountId, {Properties? properties}); Stream refresh(AccountId accountId, State currentState); diff --git a/lib/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart b/lib/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart index 20b4a58b2..3f58fbea6 100644 --- a/lib/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart +++ b/lib/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart @@ -2,6 +2,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/properties/properties.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:model/model.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart'; import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; @@ -12,12 +13,15 @@ class GetAllMailboxInteractor { GetAllMailboxInteractor(this._mailboxRepository); - Stream> execute(AccountId accountId, {Properties? properties}) async* { + Stream> execute(Session session, AccountId accountId, {Properties? properties}) async* { try { yield Right(LoadingState()); yield* _mailboxRepository - .getAllMailbox(accountId, properties: properties) + .getAllMailbox( + session, + accountId, + properties: properties) .map(_toGetMailboxState); } catch (e) { yield Left(GetAllMailboxFailure(e)); diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index 153bf33d9..14bf684a4 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -9,6 +9,7 @@ import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/error/method/error_method_response.dart'; import 'package:jmap_dart_client/jmap/core/id.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; @@ -203,7 +204,7 @@ class MailboxController extends BaseMailboxController { void _registerObxStreamListener() { ever(mailboxDashBoardController.accountId, (accountId) { if (accountId is AccountId) { - getAllMailboxAction(accountId); + getAllMailboxAction(mailboxDashBoardController.sessionCurrent!, accountId); } }); @@ -297,15 +298,16 @@ class MailboxController extends BaseMailboxController { } } - void getAllMailboxAction(AccountId accountId) async { - consumeState(_getAllMailboxInteractor.execute(accountId)); + void getAllMailboxAction(Session session, AccountId accountId) async { + consumeState(_getAllMailboxInteractor.execute(session, accountId)); } void refreshAllMailbox() { if (!isSearchActive()) { + final session = mailboxDashBoardController.sessionCurrent; final accountId = mailboxDashBoardController.accountId.value; - if (accountId != null) { - consumeState(_getAllMailboxInteractor.execute(accountId)); + if (session != null && accountId != null) { + consumeState(_getAllMailboxInteractor.execute(session, accountId)); } } else { _searchMailboxAction(allMailboxes, searchQuery.value); @@ -1181,6 +1183,6 @@ class MailboxController extends BaseMailboxController { mailboxListScrollController.animateTo( mailboxListScrollController.offset, duration: const Duration(milliseconds: 300), - curve: Curves.fastOutSlowIn); + curve: Curves.fastOutSlowIn); } } \ No newline at end of file diff --git a/lib/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart b/lib/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart index d2fe570c0..89a781217 100644 --- a/lib/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart +++ b/lib/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart @@ -191,7 +191,7 @@ class RulesFilterCreatorController extends BaseMailboxController { void _getAllMailboxAction() { if (_accountId != null) { - consumeState(_getAllMailboxInteractor.execute(_accountId!)); + consumeState(_getAllMailboxInteractor.execute(_session!, _accountId!)); } }