diff --git a/lib/features/base/base_mailbox_controller.dart b/lib/features/base/base_mailbox_controller.dart index f252b9d71..d03c3e92e 100644 --- a/lib/features/base/base_mailbox_controller.dart +++ b/lib/features/base/base_mailbox_controller.dart @@ -539,4 +539,13 @@ abstract class BaseMailboxController extends BaseController { consumeState(refreshAllMailboxInteractor!.execute(session, accountId, newMailboxState)); } } + + MailboxNode? findNodeByNameOnFirstLevel(String name) { + MailboxNode? mailboxNode = defaultMailboxTree.value.findNodeOnFirstLevel((node) => node.item.name?.name.toLowerCase() == name); + if (mailboxNode != null) { + return mailboxNode; + } + mailboxNode = personalMailboxTree.value.findNodeOnFirstLevel((node) => node.item.name?.name.toLowerCase() == name); + return mailboxNode; + } } \ No newline at end of file diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index 10ed513d2..2cc16bc55 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -957,7 +957,7 @@ class ComposerController extends BaseController { final mailboxRequest = mailboxDashBoardController.outboxMailbox?.id == null ? CreateNewMailboxRequest( Id(_uuid.v1()), - PresentationMailbox.outboxMailboxName + MailboxName(PresentationMailbox.outboxRole.inCaps) ) : null; diff --git a/lib/features/mailbox/data/datasource/mailbox_datasource.dart b/lib/features/mailbox/data/datasource/mailbox_datasource.dart index 90c2161e5..e8a3e31b0 100644 --- a/lib/features/mailbox/data/datasource/mailbox_datasource.dart +++ b/lib/features/mailbox/data/datasource/mailbox_datasource.dart @@ -50,5 +50,5 @@ abstract class MailboxDataSource { Future> createDefaultMailbox(Session session, AccountId accountId, List listRole); - Future> setRoleDefaultMailbox(Session session, AccountId accountId, List listMailbox); + Future setRoleDefaultMailbox(Session session, AccountId accountId, List listMailbox); } \ No newline at end of file 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 59814f610..5027c8c12 100644 --- a/lib/features/mailbox/data/datasource_impl/mailbox_datasource_impl.dart +++ b/lib/features/mailbox/data/datasource_impl/mailbox_datasource_impl.dart @@ -127,7 +127,7 @@ class MailboxDataSourceImpl extends MailboxDataSource { } @override - Future> setRoleDefaultMailbox(Session session, AccountId accountId, List listMailbox) { + Future setRoleDefaultMailbox(Session session, AccountId accountId, List listMailbox) { return Future.sync(() async { return await mailboxAPI.setRoleDefaultMailbox(session, accountId, listMailbox); }).catchError(_exceptionThrower.throwException); diff --git a/lib/features/mailbox/data/network/mailbox_api.dart b/lib/features/mailbox/data/network/mailbox_api.dart index 485de2de0..da112b255 100644 --- a/lib/features/mailbox/data/network/mailbox_api.dart +++ b/lib/features/mailbox/data/network/mailbox_api.dart @@ -455,7 +455,7 @@ class MailboxAPI with HandleSetErrorMixin { .toList(); } - Future> setRoleDefaultMailbox( + Future setRoleDefaultMailbox( Session session, AccountId accountId, List listMailbox @@ -488,15 +488,6 @@ class MailboxAPI with HandleSetErrorMixin { if (mapErrors.isNotEmpty) { throw SetMailboxMethodException(mapErrors); - } else { - final mapMailboxUpdated = updateResponse?.updated ?? {}; - final listMailboxIdNotUpdated = listMailbox - .map((mailbox) => mailbox.id) - .whereNotNull() - .where((mailboxId) => !mapMailboxUpdated.containsKey(mailboxId.id)) - .toList(); - log('MailboxAPI::setRoleDefaultMailbox:listMailboxIdNotUpdated: ${listMailboxIdNotUpdated.length}'); - return listMailboxIdNotUpdated; } } } \ No newline at end of file diff --git a/lib/features/mailbox/data/repository/mailbox_repository_impl.dart b/lib/features/mailbox/data/repository/mailbox_repository_impl.dart index c379feeae..6a61a01d8 100644 --- a/lib/features/mailbox/data/repository/mailbox_repository_impl.dart +++ b/lib/features/mailbox/data/repository/mailbox_repository_impl.dart @@ -213,7 +213,7 @@ class MailboxRepositoryImpl extends MailboxRepository { } @override - Future> setRoleDefaultMailbox(Session session, AccountId accountId, List listMailbox) { + Future setRoleDefaultMailbox(Session session, AccountId accountId, List listMailbox) { return mapDataSource[DataSourceType.network]!.setRoleDefaultMailbox(session, accountId, listMailbox); } } \ No newline at end of file diff --git a/lib/features/mailbox/domain/extensions/role_extension.dart b/lib/features/mailbox/domain/extensions/role_extension.dart index e79a57f35..017949d66 100644 --- a/lib/features/mailbox/domain/extensions/role_extension.dart +++ b/lib/features/mailbox/domain/extensions/role_extension.dart @@ -17,6 +17,8 @@ extension RoleExtension on Role { return 'Trash'; } else if (this == PresentationMailbox.roleSpam) { return 'Spam'; + } else if (this == PresentationMailbox.roleTemplates) { + return 'Templates'; } else { return ''; } diff --git a/lib/features/mailbox/domain/repository/mailbox_repository.dart b/lib/features/mailbox/domain/repository/mailbox_repository.dart index 22cae0abc..392a60622 100644 --- a/lib/features/mailbox/domain/repository/mailbox_repository.dart +++ b/lib/features/mailbox/domain/repository/mailbox_repository.dart @@ -46,5 +46,5 @@ abstract class MailboxRepository { Future> createDefaultMailbox(Session session, AccountId accountId, List listRole); - Future> setRoleDefaultMailbox(Session session, AccountId accountId, List listMailbox); + Future setRoleDefaultMailbox(Session session, AccountId accountId, List listMailbox); } \ No newline at end of file diff --git a/lib/features/mailbox/domain/state/create_default_mailbox_state.dart b/lib/features/mailbox/domain/state/create_default_mailbox_state.dart index 403ce650d..3db23d0d5 100644 --- a/lib/features/mailbox/domain/state/create_default_mailbox_state.dart +++ b/lib/features/mailbox/domain/state/create_default_mailbox_state.dart @@ -15,16 +15,6 @@ class CreateDefaultMailboxAllSuccess extends UIActionState { List get props => [...super.props]; } -class CreateDefaultMailboxHasSomeFailure extends UIActionState { - CreateDefaultMailboxHasSomeFailure({ - jmap.State? currentEmailState, - jmap.State? currentMailboxState, - }) : super(currentEmailState, currentMailboxState); - - @override - List get props => [...super.props]; -} - class CreateDefaultMailboxFailure extends FeatureFailure { CreateDefaultMailboxFailure(dynamic exception) : super(exception: exception); diff --git a/lib/features/mailbox/domain/usecases/create_new_default_mailbox_interactor.dart b/lib/features/mailbox/domain/usecases/create_new_default_mailbox_interactor.dart index 7d9863af8..86cf1033f 100644 --- a/lib/features/mailbox/domain/usecases/create_new_default_mailbox_interactor.dart +++ b/lib/features/mailbox/domain/usecases/create_new_default_mailbox_interactor.dart @@ -29,24 +29,12 @@ class CreateDefaultMailboxInteractor { listRole ); log('CreateDefaultMailboxInteractor::execute:listMailboxCreated: ${listMailboxCreated.length}'); - final listMailboxIdNotSetRole = await _mailboxRepository.setRoleDefaultMailbox( + await _mailboxRepository.setRoleDefaultMailbox( session, accountId, listMailboxCreated ); - log('CreateDefaultMailboxInteractor::execute:listMailboxIdNotSetRole: ${listMailboxIdNotSetRole.length}'); - if (listMailboxIdNotSetRole.isEmpty) { - yield Right(CreateDefaultMailboxAllSuccess(currentMailboxState: currentMailboxState)); - } else if (listMailboxIdNotSetRole.length < listMailboxCreated.length) { - yield Right(CreateDefaultMailboxHasSomeFailure(currentMailboxState: currentMailboxState)); - } else { - final mapError = await _mailboxRepository.deleteMultipleMailbox( - session, - accountId, - listMailboxIdNotSetRole - ); - yield Left(CreateDefaultMailboxFailure(mapError)); - } + yield Right(CreateDefaultMailboxAllSuccess(currentMailboxState: currentMailboxState)); } catch (e) { yield Left(CreateDefaultMailboxFailure(e)); } diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index 32e7b2ee1..cb8d896b6 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -181,8 +181,6 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM _handleUnsubscribeMultipleMailboxHasSomeSuccess(success); } else if (success is CreateDefaultMailboxAllSuccess) { _refreshMailboxChanges(currentMailboxState: success.currentMailboxState); - } else if (success is CreateDefaultMailboxHasSomeFailure) { - _refreshMailboxChanges(currentMailboxState: success.currentMailboxState); } } @@ -196,7 +194,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM } else if (failure is RefreshChangesAllMailboxFailure) { _clearNewFolderId(); } else if (failure is CreateDefaultMailboxFailure) { - _refreshMailboxChanges(); + refreshAllMailbox(); } } @@ -364,8 +362,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM try { final outboxMailboxIdByRole = mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleOutbox]; if (outboxMailboxIdByRole == null) { - final outboxMailboxByName = allMailboxes - .firstWhere((mailbox) => mailbox.name?.toLowerCase() == PresentationMailbox.lowerCaseOutboxMailboxName); + final outboxMailboxByName = findNodeByNameOnFirstLevel(PresentationMailbox.outboxRole)?.item; mailboxDashBoardController.setOutboxMailbox(outboxMailboxByName); } else { mailboxDashBoardController.setOutboxMailbox(mailboxDashBoardController.mapMailboxById[outboxMailboxIdByRole]!); @@ -416,8 +413,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM void _handleCreateDefaultFolderIfMissing(Map mapDefaultMailboxRole) { final listRoleMissing = MailboxConstants.defaultMailboxRoles - .whereNot(mapDefaultMailboxRole.containsKey) - .toSet() + .whereNot((role) => mapDefaultMailboxRole.containsKey(role) || findNodeByNameOnFirstLevel(role.value) != null) .toList(); log('MailboxController::_handleCreateDefaultFolderIfMissing():listRoleMissing: $listRoleMissing'); final accountId = mailboxDashBoardController.accountId.value; diff --git a/lib/features/mailbox/presentation/model/mailbox_tree.dart b/lib/features/mailbox/presentation/model/mailbox_tree.dart index 7cdcd1d8a..fd4dbf766 100644 --- a/lib/features/mailbox/presentation/model/mailbox_tree.dart +++ b/lib/features/mailbox/presentation/model/mailbox_tree.dart @@ -1,6 +1,7 @@ import 'dart:collection'; +import 'package:collection/collection.dart'; import 'package:equatable/equatable.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:model/mailbox/expand_mode.dart'; @@ -141,6 +142,8 @@ class MailboxTree with EquatableMixin { } } + MailboxNode? findNodeOnFirstLevel(NodeQuery nodeQuery) => root.childrenItems?.firstWhereOrNull(nodeQuery); + @override List get props => [root]; } \ No newline at end of file diff --git a/lib/features/mailbox/presentation/utils/mailbox_constants.dart b/lib/features/mailbox/presentation/utils/mailbox_constants.dart index 2ae8f9607..366a9e772 100644 --- a/lib/features/mailbox/presentation/utils/mailbox_constants.dart +++ b/lib/features/mailbox/presentation/utils/mailbox_constants.dart @@ -5,8 +5,11 @@ import 'package:model/mailbox/presentation_mailbox.dart'; class MailboxConstants { static final List defaultMailboxRoles = [ PresentationMailbox.roleInbox, + PresentationMailbox.roleOutbox, PresentationMailbox.roleDrafts, PresentationMailbox.roleSent, - PresentationMailbox.roleTrash + PresentationMailbox.roleTrash, + PresentationMailbox.roleSpam, + PresentationMailbox.roleTemplates, ]; } \ No newline at end of file diff --git a/model/lib/extensions/presentation_mailbox_extension.dart b/model/lib/extensions/presentation_mailbox_extension.dart index 9efa5d714..66ff87faf 100644 --- a/model/lib/extensions/presentation_mailbox_extension.dart +++ b/model/lib/extensions/presentation_mailbox_extension.dart @@ -41,7 +41,7 @@ extension PresentationMailboxExtension on PresentationMailbox { bool get isSent => role == PresentationMailbox.roleSent; - bool get isOutbox => name == PresentationMailbox.lowerCaseOutboxMailboxName || role == PresentationMailbox.roleOutbox; + bool get isOutbox => name?.name == PresentationMailbox.outboxRole || role == PresentationMailbox.roleOutbox; bool get isSubscribedMailbox => isSubscribed != null && isSubscribed?.value == true; diff --git a/model/lib/mailbox/presentation_mailbox.dart b/model/lib/mailbox/presentation_mailbox.dart index 90ab329b1..94d3e0475 100644 --- a/model/lib/mailbox/presentation_mailbox.dart +++ b/model/lib/mailbox/presentation_mailbox.dart @@ -27,9 +27,6 @@ class PresentationMailbox with EquatableMixin { static final roleDrafts = Role(draftsRole); static final roleSpam = Role(spamRole); - static final outboxMailboxName = MailboxName('Outbox'); - static final lowerCaseOutboxMailboxName = MailboxName('outbox'); - final MailboxId id; final MailboxName? name; final MailboxId? parentId;