TF-372 Fix after deleted a mailbox, tmail does not refresh and update the result

This commit is contained in:
dab246
2022-03-25 11:23:22 +07:00
committed by Dat H. Pham
parent 50b8c5d35b
commit 90cad03f56
6 changed files with 37 additions and 23 deletions
@@ -71,4 +71,9 @@ abstract class BaseMailboxController extends BaseController {
}
return mailboxNodePath;
}
MailboxNode? findMailboxNodeByRole(Role role) {
final mailboxNode = defaultMailboxTree.value.findNode((node) => node.item.role == role);
return mailboxNode;
}
}
@@ -1,11 +1,14 @@
import 'package:core/core.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
class DeleteMultipleMailboxSuccess extends UIState {
DeleteMultipleMailboxSuccess();
final MailboxId mailboxIdDeleted;
DeleteMultipleMailboxSuccess(this.mailboxIdDeleted);
@override
List<Object?> get props => [];
List<Object?> get props => [mailboxIdDeleted];
}
class DeleteMultipleMailboxFailure extends FeatureFailure {
@@ -11,11 +11,11 @@ class DeleteMultipleMailboxInteractor {
DeleteMultipleMailboxInteractor(this.mailboxRepository);
Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, List<MailboxId> mailboxIds) async* {
Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, List<MailboxId> mailboxIds, MailboxId mailboxIdDeleted) async* {
try {
final result = await mailboxRepository.deleteMultipleMailbox(session, accountId, mailboxIds);
if (result) {
yield Right<Failure, Success>(DeleteMultipleMailboxSuccess());
yield Right<Failure, Success>(DeleteMultipleMailboxSuccess(mailboxIdDeleted));
} else {
yield Left<Failure, Success>(DeleteMultipleMailboxFailure(null));
}
@@ -48,11 +48,8 @@ class MailboxBindings extends BaseBindings {
Get.find<DeleteMultipleMailboxInteractor>(),
Get.find<VerifyNameInteractor>(),
Get.find<RenameMailboxInteractor>(),
Get.find<TreeBuilder>(),
Get.find<Uuid>(),
Get.find<AppToast>(),
Get.find<ImagePaths>(),
Get.find<ResponsiveUtils>(),
Get.find<TreeBuilder>(),
));
}
@@ -57,6 +57,10 @@ import 'package:uuid/uuid.dart';
class MailboxController extends BaseMailboxController {
final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
final _appToast = Get.find<AppToast>();
final _imagePaths = Get.find<ImagePaths>();
final _responsiveUtils = Get.find<ResponsiveUtils>();
final GetAllMailboxInteractor _getAllMailboxInteractor;
final RefreshAllMailboxInteractor _refreshAllMailboxInteractor;
final CreateNewMailboxInteractor _createNewMailboxInteractor;
@@ -65,9 +69,6 @@ class MailboxController extends BaseMailboxController {
final VerifyNameInteractor _verifyNameInteractor;
final RenameMailboxInteractor _renameMailboxInteractor;
final Uuid _uuid;
final AppToast _appToast;
final ImagePaths _imagePaths;
final ResponsiveUtils responsiveUtils;
final listMailboxSearched = <PresentationMailbox>[].obs;
final searchState = SearchState.initial().obs;
@@ -75,11 +76,11 @@ class MailboxController extends BaseMailboxController {
final currentSelectMode = SelectMode.INACTIVE.obs;
final _openMailboxEventController = StreamController<OpenMailboxViewEvent>();
final searchInputController = TextEditingController();
final searchFocus = FocusNode();
final mailboxListScrollController = ScrollController();
List<PresentationMailbox> allMailboxes = <PresentationMailbox>[];
TextEditingController searchInputController = TextEditingController();
FocusNode searchFocus = FocusNode();
jmapState.State? currentMailboxState;
MailboxController(
@@ -90,11 +91,8 @@ class MailboxController extends BaseMailboxController {
this._deleteMultipleMailboxInteractor,
this._verifyNameInteractor,
this._renameMailboxInteractor,
treeBuilder,
this._uuid,
this._appToast,
this._imagePaths,
this.responsiveUtils,
treeBuilder,
) : super(treeBuilder);
@override
@@ -266,7 +264,7 @@ class MailboxController extends BaseMailboxController {
mailboxDashBoardController.disableSearch();
}
if (!responsiveUtils.isDesktop(context) && !responsiveUtils.isTabletLarge(context)) {
if (!_responsiveUtils.isDesktop(context) && !_responsiveUtils.isTabletLarge(context)) {
mailboxDashBoardController.closeDrawer();
} else {
mailboxDashBoardController.dispatchRoute(AppRoutes.THREAD);
@@ -450,7 +448,7 @@ class MailboxController extends BaseMailboxController {
}
void _openConfirmationDialogDeleteMailboxAction(BuildContext context, PresentationMailbox presentationMailbox) {
if (responsiveUtils.isMobile(context) || responsiveUtils.isMobileDevice(context)) {
if (_responsiveUtils.isMobile(context) || _responsiveUtils.isMobileDevice(context)) {
(ConfirmationDialogActionSheetBuilder(context)
..messageText(AppLocalizations.of(context).message_confirmation_dialog_delete_mailbox(presentationMailbox.name?.name ?? ''))
..onCancelAction(AppLocalizations.of(context).cancel, () => popBack())
@@ -487,7 +485,8 @@ class MailboxController extends BaseMailboxController {
.toList();
final descendantIdsReversed = descendantIds.reversed.toList();
consumeState(_deleteMultipleMailboxInteractor.execute(session, accountId, descendantIdsReversed));
consumeState(_deleteMultipleMailboxInteractor.execute(
session, accountId, descendantIdsReversed, presentationMailbox.id));
} else {
_deleteMailboxFailure(DeleteMultipleMailboxFailure(null));
}
@@ -504,9 +503,18 @@ class MailboxController extends BaseMailboxController {
message: AppLocalizations.of(currentContext!).delete_mailboxes_successfully,
icon: _imagePaths.icSelected);
}
if (success.mailboxIdDeleted == mailboxDashBoardController.selectedMailbox.value?.id) {
_switchBackToMailboxDefault();
}
refreshMailboxChanges();
}
void _switchBackToMailboxDefault() {
final inboxMailbox = findMailboxNodeByRole(PresentationMailbox.roleInbox);
mailboxDashBoardController.setSelectedMailbox(inboxMailbox?.item);
mailboxListScrollController.animateTo(0, duration: Duration(milliseconds: 500), curve: Curves.fastOutSlowIn);
}
void _deleteMailboxFailure(DeleteMultipleMailboxFailure failure) {
if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastWithIcon(
@@ -517,12 +525,12 @@ class MailboxController extends BaseMailboxController {
}
void _openDialogRenameMailboxAction(BuildContext context, PresentationMailbox presentationMailbox) {
if (responsiveUtils.isMobile(context) || responsiveUtils.isMobileDevice(context)) {
if (_responsiveUtils.isMobile(context) || _responsiveUtils.isMobileDevice(context)) {
(EditTextModalSheetBuilder()
..key(Key('rename_mailbox_modal_sheet'))
..title(AppLocalizations.of(context).rename_mailbox)
..cancelText(AppLocalizations.of(context).cancel)
..boxConstraints(responsiveUtils.isMobileDevice(context) && responsiveUtils.isLandscape(context)
..boxConstraints(_responsiveUtils.isMobileDevice(context) && _responsiveUtils.isLandscape(context)
? BoxConstraints(maxWidth: 400)
: null)
..onConfirmAction(AppLocalizations.of(context).rename,
@@ -226,6 +226,7 @@ class MailboxView extends GetWidget<MailboxController> {
Widget _buildListMailbox(BuildContext context) {
return ListView(
controller: controller.mailboxListScrollController,
key: PageStorageKey('mailbox_list'),
primary: false,
shrinkWrap: true,