TF-3385 Update mailbox name

This commit is contained in:
DatDang
2024-12-31 10:12:19 +07:00
committed by Dat H. Pham
parent 6421d3c8ee
commit a94513efb4
7 changed files with 89 additions and 2 deletions
@@ -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;
}
}
}
}
@@ -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<Object> get props => [request];
}
class RenameMailboxFailure extends FeatureFailure {
@@ -18,7 +18,7 @@ class RenameMailboxInteractor {
yield Right<Failure, Success>(LoadingRenameMailbox());
final result = await _mailboxRepository.renameMailbox(session, accountId, request);
if (result) {
yield Right<Failure, Success>(RenameMailboxSuccess());
yield Right<Failure, Success>(RenameMailboxSuccess(request: request));
} else {
yield Left<Failure, Success>(RenameMailboxFailure(null));
}
@@ -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) {
@@ -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) {
@@ -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) {
@@ -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,
);
}
}