diff --git a/lib/features/base/base_mailbox_controller.dart b/lib/features/base/base_mailbox_controller.dart index aa62a5145..e72f03f6d 100644 --- a/lib/features/base/base_mailbox_controller.dart +++ b/lib/features/base/base_mailbox_controller.dart @@ -553,4 +553,19 @@ abstract class BaseMailboxController extends BaseController { mailboxNode = personalMailboxTree.value.findNodeOnFirstLevel((node) => node.item.name?.name.toLowerCase() == name); return mailboxNode; } + + void updateMailboxNameById(MailboxId mailboxId, MailboxName mailboxName) { + final mailboxTrees = [ + defaultMailboxTree, + personalMailboxTree, + teamMailboxesTree, + ]; + + for (var mailboxTree in mailboxTrees) { + if (mailboxTree.value.updateMailboxNameById(mailboxId, mailboxName)) { + mailboxTree.refresh(); + break; + } + } + } } \ No newline at end of file diff --git a/lib/features/mailbox/domain/state/rename_mailbox_state.dart b/lib/features/mailbox/domain/state/rename_mailbox_state.dart index 1861185bc..f3300267a 100644 --- a/lib/features/mailbox/domain/state/rename_mailbox_state.dart +++ b/lib/features/mailbox/domain/state/rename_mailbox_state.dart @@ -1,9 +1,17 @@ import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart'; class LoadingRenameMailbox extends UIState {} -class RenameMailboxSuccess extends UIState {} +class RenameMailboxSuccess extends UIState { + RenameMailboxSuccess({required this.request}); + + final RenameMailboxRequest request; + + @override + List get props => [request]; +} class RenameMailboxFailure extends FeatureFailure { diff --git a/lib/features/mailbox/domain/usecases/rename_mailbox_interactor.dart b/lib/features/mailbox/domain/usecases/rename_mailbox_interactor.dart index 8e2ef950d..267be4519 100644 --- a/lib/features/mailbox/domain/usecases/rename_mailbox_interactor.dart +++ b/lib/features/mailbox/domain/usecases/rename_mailbox_interactor.dart @@ -18,7 +18,7 @@ class RenameMailboxInteractor { yield Right(LoadingRenameMailbox()); final result = await _mailboxRepository.renameMailbox(session, accountId, request); if (result) { - yield Right(RenameMailboxSuccess()); + yield Right(RenameMailboxSuccess(request: request)); } else { yield Left(RenameMailboxFailure(null)); } diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index 904068006..837bf1612 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -167,6 +167,8 @@ class MailboxController extends BaseMailboxController _deleteMultipleMailboxSuccess(success.listMailboxIdDeleted, success.currentMailboxState); } else if (success is DeleteMultipleMailboxHasSomeSuccess) { _deleteMultipleMailboxSuccess(success.listMailboxIdDeleted, success.currentMailboxState); + } else if (success is RenameMailboxSuccess) { + _renameMailboxSuccess(success); } else if (success is MoveMailboxSuccess) { _moveMailboxSuccess(success); } else if (success is SubscribeMailboxSuccess) { diff --git a/lib/features/mailbox/presentation/model/mailbox_tree.dart b/lib/features/mailbox/presentation/model/mailbox_tree.dart index 125e6e3c6..a682cecd1 100644 --- a/lib/features/mailbox/presentation/model/mailbox_tree.dart +++ b/lib/features/mailbox/presentation/model/mailbox_tree.dart @@ -3,6 +3,7 @@ import 'dart:collection'; import 'package:collection/collection.dart'; import 'package:equatable/equatable.dart'; +import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:model/mailbox/expand_mode.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; @@ -83,6 +84,27 @@ class MailboxTree with EquatableMixin { } } + bool updateMailboxNameById(MailboxId mailboxId, MailboxName mailboxName) { + final matchedNode = findNode((node) => node.item.id == mailboxId); + if (matchedNode != null) { + matchedNode.item = matchedNode.item.copyWith(name: mailboxName); + return true; + } + return false; + } + + void updateMailboxUnreadCountById(MailboxId mailboxId, int unreadCount) { + final matchedNode = findNode((node) => node.item.id == mailboxId); + if (matchedNode != null) { + final currentUnreadCount = matchedNode.item.unreadEmails?.value.value ?? 0; + final updatedUnreadCount = currentUnreadCount + unreadCount; + if (updatedUnreadCount < 0) return; + matchedNode.item = matchedNode.item.copyWith( + unreadEmails: UnreadEmails(UnsignedInt(updatedUnreadCount)), + ); + } + } + String? getNodePath(MailboxId mailboxId) { final matchedNode = findNode((node) => node.item.id == mailboxId); if (matchedNode == null) { diff --git a/lib/features/search/mailbox/presentation/search_mailbox_controller.dart b/lib/features/search/mailbox/presentation/search_mailbox_controller.dart index 2ae4bc445..e28d98aeb 100644 --- a/lib/features/search/mailbox/presentation/search_mailbox_controller.dart +++ b/lib/features/search/mailbox/presentation/search_mailbox_controller.dart @@ -147,6 +147,8 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa searchMailboxAction(); } else if (success is SearchMailboxSuccess) { _handleSearchMailboxSuccess(success); + } else if (success is RenameMailboxSuccess) { + updateMailboxNameById(success.request.mailboxId, success.request.newName); } else if (success is MoveMailboxSuccess) { _moveMailboxSuccess(success); } else if (success is DeleteMultipleMailboxAllSuccess) { diff --git a/model/lib/mailbox/presentation_mailbox.dart b/model/lib/mailbox/presentation_mailbox.dart index a810e1037..576597513 100644 --- a/model/lib/mailbox/presentation_mailbox.dart +++ b/model/lib/mailbox/presentation_mailbox.dart @@ -89,4 +89,42 @@ class PresentationMailbox with EquatableMixin { namespace, displayName, ]; + + PresentationMailbox copyWith({ + MailboxId? id, + MailboxName? name, + MailboxId? parentId, + Role? role, + SortOrder? sortOrder, + TotalEmails? totalEmails, + UnreadEmails? unreadEmails, + TotalThreads? totalThreads, + UnreadThreads? unreadThreads, + MailboxRights? myRights, + IsSubscribed? isSubscribed, + SelectMode? selectMode, + String? mailboxPath, + MailboxState? state, + Namespace? namespace, + String? displayName, + }) { + return PresentationMailbox( + id ?? this.id, + name: name ?? this.name, + parentId: parentId ?? this.parentId, + role: role ?? this.role, + sortOrder: sortOrder ?? this.sortOrder, + totalEmails: totalEmails ?? this.totalEmails, + unreadEmails: unreadEmails ?? this.unreadEmails, + totalThreads: totalThreads ?? this.totalThreads, + unreadThreads: unreadThreads ?? this.unreadThreads, + myRights: myRights ?? this.myRights, + isSubscribed: isSubscribed ?? this.isSubscribed, + selectMode: selectMode ?? this.selectMode, + mailboxPath: mailboxPath ?? this.mailboxPath, + state: state ?? this.state, + namespace: namespace ?? this.namespace, + displayName: displayName ?? this.displayName, + ); + } } \ No newline at end of file