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; 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:core/core.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
class DeleteMultipleMailboxSuccess extends UIState { class DeleteMultipleMailboxSuccess extends UIState {
DeleteMultipleMailboxSuccess(); final MailboxId mailboxIdDeleted;
DeleteMultipleMailboxSuccess(this.mailboxIdDeleted);
@override @override
List<Object?> get props => []; List<Object?> get props => [mailboxIdDeleted];
} }
class DeleteMultipleMailboxFailure extends FeatureFailure { class DeleteMultipleMailboxFailure extends FeatureFailure {
@@ -11,11 +11,11 @@ class DeleteMultipleMailboxInteractor {
DeleteMultipleMailboxInteractor(this.mailboxRepository); 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 { try {
final result = await mailboxRepository.deleteMultipleMailbox(session, accountId, mailboxIds); final result = await mailboxRepository.deleteMultipleMailbox(session, accountId, mailboxIds);
if (result) { if (result) {
yield Right<Failure, Success>(DeleteMultipleMailboxSuccess()); yield Right<Failure, Success>(DeleteMultipleMailboxSuccess(mailboxIdDeleted));
} else { } else {
yield Left<Failure, Success>(DeleteMultipleMailboxFailure(null)); yield Left<Failure, Success>(DeleteMultipleMailboxFailure(null));
} }
@@ -48,11 +48,8 @@ class MailboxBindings extends BaseBindings {
Get.find<DeleteMultipleMailboxInteractor>(), Get.find<DeleteMultipleMailboxInteractor>(),
Get.find<VerifyNameInteractor>(), Get.find<VerifyNameInteractor>(),
Get.find<RenameMailboxInteractor>(), Get.find<RenameMailboxInteractor>(),
Get.find<TreeBuilder>(),
Get.find<Uuid>(), Get.find<Uuid>(),
Get.find<AppToast>(), Get.find<TreeBuilder>(),
Get.find<ImagePaths>(),
Get.find<ResponsiveUtils>(),
)); ));
} }
@@ -57,6 +57,10 @@ import 'package:uuid/uuid.dart';
class MailboxController extends BaseMailboxController { class MailboxController extends BaseMailboxController {
final mailboxDashBoardController = Get.find<MailboxDashBoardController>(); final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
final _appToast = Get.find<AppToast>();
final _imagePaths = Get.find<ImagePaths>();
final _responsiveUtils = Get.find<ResponsiveUtils>();
final GetAllMailboxInteractor _getAllMailboxInteractor; final GetAllMailboxInteractor _getAllMailboxInteractor;
final RefreshAllMailboxInteractor _refreshAllMailboxInteractor; final RefreshAllMailboxInteractor _refreshAllMailboxInteractor;
final CreateNewMailboxInteractor _createNewMailboxInteractor; final CreateNewMailboxInteractor _createNewMailboxInteractor;
@@ -65,9 +69,6 @@ class MailboxController extends BaseMailboxController {
final VerifyNameInteractor _verifyNameInteractor; final VerifyNameInteractor _verifyNameInteractor;
final RenameMailboxInteractor _renameMailboxInteractor; final RenameMailboxInteractor _renameMailboxInteractor;
final Uuid _uuid; final Uuid _uuid;
final AppToast _appToast;
final ImagePaths _imagePaths;
final ResponsiveUtils responsiveUtils;
final listMailboxSearched = <PresentationMailbox>[].obs; final listMailboxSearched = <PresentationMailbox>[].obs;
final searchState = SearchState.initial().obs; final searchState = SearchState.initial().obs;
@@ -75,11 +76,11 @@ class MailboxController extends BaseMailboxController {
final currentSelectMode = SelectMode.INACTIVE.obs; final currentSelectMode = SelectMode.INACTIVE.obs;
final _openMailboxEventController = StreamController<OpenMailboxViewEvent>(); final _openMailboxEventController = StreamController<OpenMailboxViewEvent>();
final searchInputController = TextEditingController();
final searchFocus = FocusNode();
final mailboxListScrollController = ScrollController();
List<PresentationMailbox> allMailboxes = <PresentationMailbox>[]; List<PresentationMailbox> allMailboxes = <PresentationMailbox>[];
TextEditingController searchInputController = TextEditingController();
FocusNode searchFocus = FocusNode();
jmapState.State? currentMailboxState; jmapState.State? currentMailboxState;
MailboxController( MailboxController(
@@ -90,11 +91,8 @@ class MailboxController extends BaseMailboxController {
this._deleteMultipleMailboxInteractor, this._deleteMultipleMailboxInteractor,
this._verifyNameInteractor, this._verifyNameInteractor,
this._renameMailboxInteractor, this._renameMailboxInteractor,
treeBuilder,
this._uuid, this._uuid,
this._appToast, treeBuilder,
this._imagePaths,
this.responsiveUtils,
) : super(treeBuilder); ) : super(treeBuilder);
@override @override
@@ -266,7 +264,7 @@ class MailboxController extends BaseMailboxController {
mailboxDashBoardController.disableSearch(); mailboxDashBoardController.disableSearch();
} }
if (!responsiveUtils.isDesktop(context) && !responsiveUtils.isTabletLarge(context)) { if (!_responsiveUtils.isDesktop(context) && !_responsiveUtils.isTabletLarge(context)) {
mailboxDashBoardController.closeDrawer(); mailboxDashBoardController.closeDrawer();
} else { } else {
mailboxDashBoardController.dispatchRoute(AppRoutes.THREAD); mailboxDashBoardController.dispatchRoute(AppRoutes.THREAD);
@@ -450,7 +448,7 @@ class MailboxController extends BaseMailboxController {
} }
void _openConfirmationDialogDeleteMailboxAction(BuildContext context, PresentationMailbox presentationMailbox) { void _openConfirmationDialogDeleteMailboxAction(BuildContext context, PresentationMailbox presentationMailbox) {
if (responsiveUtils.isMobile(context) || responsiveUtils.isMobileDevice(context)) { if (_responsiveUtils.isMobile(context) || _responsiveUtils.isMobileDevice(context)) {
(ConfirmationDialogActionSheetBuilder(context) (ConfirmationDialogActionSheetBuilder(context)
..messageText(AppLocalizations.of(context).message_confirmation_dialog_delete_mailbox(presentationMailbox.name?.name ?? '')) ..messageText(AppLocalizations.of(context).message_confirmation_dialog_delete_mailbox(presentationMailbox.name?.name ?? ''))
..onCancelAction(AppLocalizations.of(context).cancel, () => popBack()) ..onCancelAction(AppLocalizations.of(context).cancel, () => popBack())
@@ -487,7 +485,8 @@ class MailboxController extends BaseMailboxController {
.toList(); .toList();
final descendantIdsReversed = descendantIds.reversed.toList(); final descendantIdsReversed = descendantIds.reversed.toList();
consumeState(_deleteMultipleMailboxInteractor.execute(session, accountId, descendantIdsReversed)); consumeState(_deleteMultipleMailboxInteractor.execute(
session, accountId, descendantIdsReversed, presentationMailbox.id));
} else { } else {
_deleteMailboxFailure(DeleteMultipleMailboxFailure(null)); _deleteMailboxFailure(DeleteMultipleMailboxFailure(null));
} }
@@ -504,9 +503,18 @@ class MailboxController extends BaseMailboxController {
message: AppLocalizations.of(currentContext!).delete_mailboxes_successfully, message: AppLocalizations.of(currentContext!).delete_mailboxes_successfully,
icon: _imagePaths.icSelected); icon: _imagePaths.icSelected);
} }
if (success.mailboxIdDeleted == mailboxDashBoardController.selectedMailbox.value?.id) {
_switchBackToMailboxDefault();
}
refreshMailboxChanges(); 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) { void _deleteMailboxFailure(DeleteMultipleMailboxFailure failure) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastWithIcon( _appToast.showToastWithIcon(
@@ -517,12 +525,12 @@ class MailboxController extends BaseMailboxController {
} }
void _openDialogRenameMailboxAction(BuildContext context, PresentationMailbox presentationMailbox) { void _openDialogRenameMailboxAction(BuildContext context, PresentationMailbox presentationMailbox) {
if (responsiveUtils.isMobile(context) || responsiveUtils.isMobileDevice(context)) { if (_responsiveUtils.isMobile(context) || _responsiveUtils.isMobileDevice(context)) {
(EditTextModalSheetBuilder() (EditTextModalSheetBuilder()
..key(Key('rename_mailbox_modal_sheet')) ..key(Key('rename_mailbox_modal_sheet'))
..title(AppLocalizations.of(context).rename_mailbox) ..title(AppLocalizations.of(context).rename_mailbox)
..cancelText(AppLocalizations.of(context).cancel) ..cancelText(AppLocalizations.of(context).cancel)
..boxConstraints(responsiveUtils.isMobileDevice(context) && responsiveUtils.isLandscape(context) ..boxConstraints(_responsiveUtils.isMobileDevice(context) && _responsiveUtils.isLandscape(context)
? BoxConstraints(maxWidth: 400) ? BoxConstraints(maxWidth: 400)
: null) : null)
..onConfirmAction(AppLocalizations.of(context).rename, ..onConfirmAction(AppLocalizations.of(context).rename,
@@ -226,6 +226,7 @@ class MailboxView extends GetWidget<MailboxController> {
Widget _buildListMailbox(BuildContext context) { Widget _buildListMailbox(BuildContext context) {
return ListView( return ListView(
controller: controller.mailboxListScrollController,
key: PageStorageKey('mailbox_list'), key: PageStorageKey('mailbox_list'),
primary: false, primary: false,
shrinkWrap: true, shrinkWrap: true,