From 89d32cb88cd18184b0bd98832582f044b5aa3e9d Mon Sep 17 00:00:00 2001 From: dab246 Date: Tue, 11 Jul 2023 22:54:39 +0700 Subject: [PATCH] TF-1868 Fix a mailbox is visible then it's parents needs to be visible too (cherry picked from commit 02a505fc6241ffb4df7559004e8dae718f13d39e) --- .../base/base_mailbox_controller.dart | 79 +++++++++++++++++-- .../presentation/model/mailbox_node.dart | 2 + .../presentation/model/mailbox_tree.dart | 14 ++++ 3 files changed, 87 insertions(+), 8 deletions(-) diff --git a/lib/features/base/base_mailbox_controller.dart b/lib/features/base/base_mailbox_controller.dart index 78cfe838e..cfd89ba1a 100644 --- a/lib/features/base/base_mailbox_controller.dart +++ b/lib/features/base/base_mailbox_controller.dart @@ -440,22 +440,85 @@ abstract class BaseMailboxController extends BaseController { } } + List getAncestorOfMailboxNode(MailboxNode mailboxNode) { + final listAncestor = defaultMailboxTree.value.getAncestorList(mailboxNode) + ?? personalMailboxTree.value.getAncestorList(mailboxNode) + ?? teamMailboxesTree.value.getAncestorList(mailboxNode); + return listAncestor ?? []; + } + SubscribeRequest? generateSubscribeRequest( MailboxId mailboxId, MailboxSubscribeState subscribeState, MailboxSubscribeAction subscribeAction + ) { + switch(subscribeState) { + case MailboxSubscribeState.enabled: + return _generateSubscribeRequestWhenSubscribeEnabled(mailboxId, subscribeAction); + case MailboxSubscribeState.disabled: + return _generateSubscribeRequestWhenSubscribeDisabled(mailboxId, subscribeAction); + } + } + + SubscribeRequest? _generateSubscribeRequestWhenSubscribeDisabled( + MailboxId mailboxId, + MailboxSubscribeAction subscribeAction ) { final mailboxNode = findMailboxNodeById(mailboxId); - if (mailboxNode != null) { - if (mailboxNode.hasChildren()) { - final listDescendantMailboxIds = mailboxNode.descendantsAsList().mailboxIds; - return SubscribeMultipleMailboxRequest(mailboxId, listDescendantMailboxIds, subscribeState, subscribeAction); - } else { - return SubscribeMailboxRequest(mailboxId, subscribeState, subscribeAction); - } + if (mailboxNode == null) return null; + + if (mailboxNode.hasChildren()) { + final listDescendantMailboxIds = mailboxNode.descendantsAsList().mailboxIds; + log("BaseMailboxController::_generateSubscribeRequestWhenSubscribeDisabled:listDescendantMailboxIds $listDescendantMailboxIds"); + return SubscribeMultipleMailboxRequest( + mailboxId, + listDescendantMailboxIds, + MailboxSubscribeState.disabled, + subscribeAction + ); + } else { + return SubscribeMailboxRequest( + mailboxId, + MailboxSubscribeState.disabled, + subscribeAction + ); + } + } + + SubscribeRequest? _generateSubscribeRequestWhenSubscribeEnabled( + MailboxId mailboxId, + MailboxSubscribeAction subscribeAction + ) { + final mailboxNode = findMailboxNodeById(mailboxId); + + if (mailboxNode == null) return null; + + if (mailboxNode.hasParents()) { + final listAncestorMailboxIds = getAncestorOfMailboxNode(mailboxNode).mailboxIds; + listAncestorMailboxIds.add(mailboxId); + log("BaseMailboxController::_generateSubscribeRequestWhenSubscribeEnabled:listAncestorMailboxIds $listAncestorMailboxIds"); + if (listAncestorMailboxIds.isNotEmpty) { + return SubscribeMultipleMailboxRequest( + mailboxId, + listAncestorMailboxIds, + MailboxSubscribeState.enabled, + subscribeAction + ); + } else { + return SubscribeMailboxRequest( + mailboxId, + MailboxSubscribeState.enabled, + subscribeAction + ); + } + } else { + return SubscribeMailboxRequest( + mailboxId, + MailboxSubscribeState.enabled, + subscribeAction + ); } - return null; } void getAllMailbox(Session session, AccountId accountId) async { diff --git a/lib/features/mailbox/presentation/model/mailbox_node.dart b/lib/features/mailbox/presentation/model/mailbox_node.dart index 4e59f4254..befd5a321 100644 --- a/lib/features/mailbox/presentation/model/mailbox_node.dart +++ b/lib/features/mailbox/presentation/model/mailbox_node.dart @@ -21,6 +21,8 @@ class MailboxNode with EquatableMixin{ bool hasChildren() => childrenItems?.isNotEmpty ?? false; + bool hasParents() => item.hasParentId(); + bool get isActivated => nodeState == MailboxState.activated; bool get isSelected => selectMode == SelectMode.ACTIVE; diff --git a/lib/features/mailbox/presentation/model/mailbox_tree.dart b/lib/features/mailbox/presentation/model/mailbox_tree.dart index 40c22a1dd..7cdcd1d8a 100644 --- a/lib/features/mailbox/presentation/model/mailbox_tree.dart +++ b/lib/features/mailbox/presentation/model/mailbox_tree.dart @@ -111,6 +111,20 @@ class MailboxTree with EquatableMixin { return path; } + List? getAncestorList(MailboxNode mailboxNode) { + var parentId = mailboxNode.item.parentId; + List ancestor = []; + while(parentId != null) { + final parentNode = findNode((node) => node.item.id == parentId); + if (parentNode == null) { + break; + } + ancestor.add(parentNode); + parentId = parentNode.item.parentId; + } + return ancestor.isNotEmpty ? ancestor : null; + } + Map get mapPresentationMailboxByRole { if (root.childrenItems?.isEmpty == true) { return {};