Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,12 +1,19 @@
import 'dart:collection';
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:core/utils/app_logger.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/mailbox/mailbox.dart';
import 'package:model/extensions/mailbox_extension.dart';
import 'package:model/extensions/presentation_mailbox_extension.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
import 'package:tmail_ui_user/features/mailbox/domain/state/delete_multiple_mailbox_state.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_utils.dart';

class DeleteMultipleMailboxInteractor {
final MailboxRepository _mailboxRepository;
Expand All @@ -16,14 +23,32 @@ class DeleteMultipleMailboxInteractor {
Stream<Either<Failure, Success>> execute(
Session session,
AccountId accountId,
Map<MailboxId, List<MailboxId>> mapMailboxIdToDelete,
List<MailboxId> listMailboxIdToDelete
List<PresentationMailbox> listMailboxToDelete
) async* {
try {
yield Right<Failure, Success>(LoadingDeleteMultipleMailboxAll());

final currentMailboxState = await _mailboxRepository.getMailboxState(session, accountId);

final mailboxResponse = await _mailboxRepository.getAllMailbox(session, accountId).last;

final listAllMailbox = mailboxResponse.mailboxes
.map((mailbox) => mailbox.toPresentationMailbox())
.toList();

final mailboxTree = buildMailboxTree(listAllMailbox);
final defaultMailboxTree = mailboxTree.value1;
final personalMailboxTree = mailboxTree.value2;

final mapDescendant = MailboxUtils.generateMapDescendantIdsAndMailboxIdList(
listMailboxToDelete,
defaultMailboxTree,
personalMailboxTree
);

final mapMailboxIdToDelete = mapDescendant.value1;
final listMailboxIdToDelete = mapDescendant.value2;

final listResult = await Future.wait(
mapMailboxIdToDelete.keys.map((mailboxId) {
final mailboxIdsToDelete = mapMailboxIdToDelete[mailboxId]!;
Expand Down Expand Up @@ -53,4 +78,41 @@ class DeleteMultipleMailboxInteractor {
yield Left<Failure, Success>(DeleteMultipleMailboxFailure(e));
}
}

Tuple2<MailboxTree, MailboxTree> buildMailboxTree(
List<PresentationMailbox> mailboxList,
) {
Map<MailboxId, MailboxNode> mailboxDictionary = HashMap();
final defaultTree = MailboxTree(MailboxNode.root());
final personalTree = MailboxTree(MailboxNode.root());
final teamMailboxes = MailboxTree(MailboxNode.root());

for (var mailbox in mailboxList) {
mailboxDictionary[mailbox.id] = MailboxNode(mailbox);
}

for (var mailbox in mailboxList) {
final parentId = mailbox.parentId;
final parentNode = mailboxDictionary[parentId];
final node = mailboxDictionary[mailbox.id];
if (node != null) {
if (parentNode != null) {
parentNode.addChildNode(node);
} else if (parentId == null) {
MailboxTree tree;
if (mailbox.hasRole()) {
tree = defaultTree;
} else if (mailbox.isPersonal) {
tree = personalTree;
} else {
tree = teamMailboxes;
}

tree.root.addChildNode(node);
}
}
}

return Tuple2(defaultTree, personalTree);
}
}
20 changes: 2 additions & 18 deletions lib/features/mailbox/presentation/mailbox_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,6 @@ import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_catego
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/open_mailbox_view_event.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_utils.dart';
import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/mailbox_creator_arguments.dart';
import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/new_mailbox_arguments.dart';
Expand Down Expand Up @@ -738,18 +737,10 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
final session = mailboxDashBoardController.sessionCurrent;

if (session != null && accountId != null) {
final tupleMap = MailboxUtils.generateMapDescendantIdsAndMailboxIdList(
[presentationMailbox],
defaultMailboxTree.value,
personalMailboxTree.value);
final mapDescendantIds = tupleMap.value1;
final listMailboxId = tupleMap.value2;

consumeState(_deleteMultipleMailboxInteractor.execute(
session,
accountId,
mapDescendantIds,
listMailboxId));
[presentationMailbox]));
} else {
_deleteMailboxFailure(DeleteMultipleMailboxFailure(null));
}
Expand Down Expand Up @@ -818,17 +809,10 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
final session = mailboxDashBoardController.sessionCurrent;

if (session != null && accountId != null) {
final tupleMap = MailboxUtils.generateMapDescendantIdsAndMailboxIdList(
selectedMailboxList,
defaultMailboxTree.value,
personalMailboxTree.value);
final mapDescendantIds = tupleMap.value1;
final listMailboxId = tupleMap.value2;
consumeState(_deleteMultipleMailboxInteractor.execute(
session,
accountId,
mapDescendantIds,
listMailboxId));
selectedMailboxList));
} else {
_deleteMailboxFailure(DeleteMultipleMailboxFailure(null));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ import 'package:tmail_ui_user/features/mailbox/presentation/action/mailbox_ui_ac
import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_utils.dart';
import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/mailbox_creator_arguments.dart';
import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/new_mailbox_arguments.dart';
Expand Down Expand Up @@ -419,19 +418,10 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
final session = dashboardController.sessionCurrent;

if (session != null && accountId != null) {
final tupleMap = MailboxUtils.generateMapDescendantIdsAndMailboxIdList(
[presentationMailbox],
defaultMailboxTree.value,
personalMailboxTree.value
);
final mapDescendantIds = tupleMap.value1;
final listMailboxId = tupleMap.value2;

consumeState(_deleteMultipleMailboxInteractor.execute(
session,
accountId,
mapDescendantIds,
listMailboxId
[presentationMailbox]
));
} else {
_deleteMailboxFailure(DeleteMultipleMailboxFailure(null));
Expand Down
3 changes: 3 additions & 0 deletions model/lib/extensions/list_presentation_mailbox_extension.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ extension ListPresentationMailboxExtension on List<PresentationMailbox> {

List<PresentationMailbox> get listSubscribedMailboxesAndDefaultMailboxes =>
where((mailbox) => mailbox.isSubscribedMailbox || mailbox.isDefault).toList();

List<PresentationMailbox> get listUnsubscribedMailboxes =>
where((mailbox) => !mailbox.isSubscribedMailbox).toList();

List<PresentationMailbox> get listPersonalMailboxes =>
where((mailbox) => mailbox.isPersonal).toList();
Expand Down
Loading