diff --git a/lib/features/email/presentation/action/email_ui_action.dart b/lib/features/email/presentation/action/email_ui_action.dart index 67fce9729b..9bf6c8b14a 100644 --- a/lib/features/email/presentation/action/email_ui_action.dart +++ b/lib/features/email/presentation/action/email_ui_action.dart @@ -26,4 +26,6 @@ class CloseEmailDetailedViewAction extends EmailUIAction {} class HideEmailContentViewAction extends EmailUIAction {} -class ShowEmailContentViewAction extends EmailUIAction {} \ No newline at end of file +class ShowEmailContentViewAction extends EmailUIAction {} + +class RefreshAllEmailAction extends EmailUIAction {} \ No newline at end of file diff --git a/lib/features/mailbox/domain/state/refresh_all_mailboxes_state.dart b/lib/features/mailbox/domain/state/refresh_all_mailboxes_state.dart new file mode 100644 index 0000000000..cb2c36546a --- /dev/null +++ b/lib/features/mailbox/domain/state/refresh_all_mailboxes_state.dart @@ -0,0 +1,11 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; + +class RefreshingAllMailbox extends LoadingState {} + +class RefreshAllMailboxSuccess extends UIState {} + +class RefreshAllMailboxFailure extends FeatureFailure { + + RefreshAllMailboxFailure({dynamic exception}) : super(exception: exception); +} \ No newline at end of file diff --git a/lib/features/mailbox/presentation/action/mailbox_ui_action.dart b/lib/features/mailbox/presentation/action/mailbox_ui_action.dart index 3cdf127db4..aee4db436f 100644 --- a/lib/features/mailbox/presentation/action/mailbox_ui_action.dart +++ b/lib/features/mailbox/presentation/action/mailbox_ui_action.dart @@ -33,4 +33,6 @@ class OpenMailboxAction extends MailboxUIAction { List get props => [presentationMailbox]; } -class SystemBackToInboxAction extends MailboxUIAction {} \ No newline at end of file +class SystemBackToInboxAction extends MailboxUIAction {} + +class RefreshAllMailboxAction extends MailboxUIAction {} \ No newline at end of file diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index 96121eff03..62b9027108 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:collection/collection.dart'; import 'package:core/core.dart'; +import 'package:dartz/dartz.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -28,6 +29,7 @@ import 'package:tmail_ui_user/features/email/domain/state/get_restored_deleted_m import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart'; import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; +import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart'; import 'package:tmail_ui_user/features/mailbox/domain/constants/mailbox_constants.dart'; import 'package:tmail_ui_user/features/mailbox/domain/exceptions/set_mailbox_name_exception.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; @@ -44,6 +46,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/state/delete_multiple_mail import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/move_mailbox_state.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/state/refresh_all_mailboxes_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/refresh_changes_all_mailboxes_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/rename_mailbox_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/subscribe_mailbox_state.dart'; @@ -207,23 +210,30 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM @override void onDone() { super.onDone(); - viewState.value.fold((failure) => null, (success) { - if (success is GetAllMailboxSuccess) { - _handleCreateDefaultFolderIfMissing(mailboxDashBoardController.mapDefaultMailboxIdByRole); - _handleDataFromNavigationRouter(); - mailboxDashBoardController.getSpamReportBanner(); - if (PlatformInfo.isIOS) { - _updateMailboxIdsBlockNotificationToKeychain(success.mailboxList); + viewState.value.fold( + (failure) { + if (failure is GetAllMailboxFailure) { + mailboxDashBoardController.updateRefreshAllMailboxState(Left(RefreshAllMailboxFailure())); } - } else if (success is RefreshChangesAllMailboxSuccess) { - _selectSelectedMailboxDefault(); - mailboxDashBoardController.refreshSpamReportBanner(); + }, + (success) { + if (success is GetAllMailboxSuccess) { + mailboxDashBoardController.updateRefreshAllMailboxState(Right(RefreshAllMailboxSuccess())); + _handleCreateDefaultFolderIfMissing(mailboxDashBoardController.mapDefaultMailboxIdByRole); + _handleDataFromNavigationRouter(); + mailboxDashBoardController.getSpamReportBanner(); + if (PlatformInfo.isIOS) { + _updateMailboxIdsBlockNotificationToKeychain(success.mailboxList); + } + } else if (success is RefreshChangesAllMailboxSuccess) { + _selectSelectedMailboxDefault(); + mailboxDashBoardController.refreshSpamReportBanner(); - if (_newFolderId != null) { - _redirectToNewFolder(); + if (_newFolderId != null) { + _redirectToNewFolder(); + } } - } - }); + }); } void _registerObxStreamListener() { @@ -307,6 +317,9 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM _disableAllSearchEmail(); _switchBackToMailboxDefault(); mailboxDashBoardController.clearMailboxUIAction(); + } else if (action is RefreshAllMailboxAction) { + refreshAllMailbox(); + mailboxDashBoardController.clearMailboxUIAction(); } }); } @@ -328,6 +341,8 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM final accountId = mailboxDashBoardController.accountId.value; if (session != null && accountId != null) { consumeState(getAllMailboxInteractor!.execute(session, accountId)); + } else { + consumeState(Stream.value(Left(GetAllMailboxFailure(NotFoundSessionException())))); } } diff --git a/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart b/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart index 0503b05103..e9383ba805 100644 --- a/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart +++ b/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart @@ -20,8 +20,6 @@ class DashBoardAction extends UIAction { List get props => []; } -class RefreshAllEmailAction extends DashBoardAction {} - class SelectionAllEmailAction extends DashBoardAction {} class CancelSelectionAllEmailAction extends DashBoardAction {} diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index f6b20c2687..f13d240849 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -77,6 +77,7 @@ import 'package:tmail_ui_user/features/identity_creator/domain/usecase/get_ident import 'package:tmail_ui_user/features/mailbox/domain/exceptions/mailbox_exception.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read_state.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/state/refresh_all_mailboxes_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/usecases/mark_as_mailbox_read_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/action/mailbox_ui_action.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart'; @@ -138,11 +139,11 @@ import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart'; import 'package:tmail_ui_user/features/thread/domain/state/empty_spam_folder_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/empty_trash_folder_state.dart'; -import 'package:tmail_ui_user/features/thread/domain/state/get_all_email_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/get_email_by_id_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/mark_as_star_multiple_email_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart'; +import 'package:tmail_ui_user/features/thread/domain/state/refresh_all_email_state.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/empty_spam_folder_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/empty_trash_folder_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/get_email_by_id_interactor.dart'; @@ -225,7 +226,8 @@ class MailboxDashBoardController extends ReloadableController with UserSettingPo final _isDraggingMailbox = RxBool(false); final searchMailboxActivated = RxBool(false); final listSendingEmails = RxList(); - final refreshingMailboxState = Rx>(Right(UIState.idle)); + final refreshingAllMailboxState = Rx>(Right(UIState.idle)); + final refreshingAllEmailState = Rx>(Right(UIState.idle)); final attachmentDraggableAppState = Rxn(); final isRecoveringDeletedMessage = RxBool(false); final localFileDraggableAppState = Rxn(); @@ -2266,10 +2268,33 @@ class MailboxDashBoardController extends ReloadableController with UserSettingPo } } - void refreshMailboxAction() async { - refreshingMailboxState.value = Right(RefreshAllEmailLoading()); + Future refreshMailboxAction() async { + updateRefreshAllMailboxState(Right(RefreshingAllMailbox())); + updateRefreshAllEmailState(Right(RefreshingAllEmail())); + await Future.delayed(const Duration(milliseconds: 500)); - dispatchAction(RefreshAllEmailAction()); + + dispatchMailboxUIAction(RefreshAllMailboxAction()); + dispatchEmailUIAction(RefreshAllEmailAction()); + } + + void updateRefreshAllMailboxState(Either newState) { + refreshingAllMailboxState.value = newState; + } + + void updateRefreshAllEmailState(Either newState) { + refreshingAllEmailState.value = newState; + } + + bool get isRefreshingAllMailboxAndEmail { + final isRefreshingMailbox = refreshingAllMailboxState.value.fold( + (failure) => false, + (success) => success is RefreshingAllMailbox); + final isRefreshingEmail = refreshingAllEmailState.value.fold( + (failure) => false, + (success) => success is RefreshingAllEmail); + log('MailboxDashBoardController::isRefreshingAllMailboxAndEmail:isRefreshingMailbox = $isRefreshingMailbox | isRefreshingEmail = $isRefreshingEmail'); + return isRefreshingMailbox && isRefreshingEmail; } void selectAllEmailAction() { diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart index 57ec4f22d3..0aa186da8c 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart @@ -29,7 +29,6 @@ import 'package:tmail_ui_user/features/quotas/presentation/widget/quotas_banner_ import 'package:tmail_ui_user/features/search/email/presentation/search_email_view.dart'; import 'package:tmail_ui_user/features/search/mailbox/presentation/search_mailbox_view.dart'; import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart'; -import 'package:tmail_ui_user/features/thread/domain/state/get_all_email_state.dart'; import 'package:tmail_ui_user/features/thread/presentation/styles/banner_delete_all_spam_emails_styles.dart'; import 'package:tmail_ui_user/features/thread/presentation/styles/banner_empty_trash_styles.dart'; import 'package:tmail_ui_user/features/thread/presentation/thread_view.dart'; @@ -267,33 +266,20 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { Widget _buildListButtonTopBar(BuildContext context) { return Row(children: [ Obx(() { - return controller.refreshingMailboxState.value.fold( - (failure) { - return TMailButtonWidget.fromIcon( - key: const Key('refresh_mailbox_button'), - icon: controller.imagePaths.icRefresh, - borderRadius: 10, - iconSize: 16, - onTapActionCallback: controller.refreshMailboxAction, - ); - }, - (success) { - if (success is RefreshAllEmailLoading) { - return const TMailContainerWidget( - borderRadius: 10, - padding: EdgeInsetsDirectional.symmetric(vertical: 8, horizontal: 8.5), - child: CupertinoLoadingWidget(size: 16)); - } else { - return TMailButtonWidget.fromIcon( - key: const Key('refresh_mailbox_button'), - icon: controller.imagePaths.icRefresh, - borderRadius: 10, - iconSize: 16, - onTapActionCallback: controller.refreshMailboxAction, - ); - } - } - ); + if (controller.isRefreshingAllMailboxAndEmail) { + return const TMailContainerWidget( + borderRadius: 10, + padding: EdgeInsetsDirectional.symmetric(vertical: 8, horizontal: 8.5), + child: CupertinoLoadingWidget(size: 16)); + } else { + return TMailButtonWidget.fromIcon( + key: const Key('refresh_all_mailbox_and_email_button'), + icon: controller.imagePaths.icRefresh, + borderRadius: 10, + iconSize: 16, + onTapActionCallback: controller.refreshMailboxAction, + ); + } }), Obx(() { if (controller.validateNoEmailsInTrashAndSpamFolder()) { diff --git a/lib/features/thread/domain/state/get_all_email_state.dart b/lib/features/thread/domain/state/get_all_email_state.dart index 7c302c2bbe..8e4ee637ff 100644 --- a/lib/features/thread/domain/state/get_all_email_state.dart +++ b/lib/features/thread/domain/state/get_all_email_state.dart @@ -4,8 +4,6 @@ import 'package:jmap_dart_client/jmap/core/state.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:model/email/presentation_email.dart'; -class RefreshAllEmailLoading extends LoadingState {} - class GetAllEmailLoading extends LoadingState {} class GetAllEmailSuccess extends UIState { diff --git a/lib/features/thread/domain/state/refresh_all_email_state.dart b/lib/features/thread/domain/state/refresh_all_email_state.dart new file mode 100644 index 0000000000..5d0f8cd7e0 --- /dev/null +++ b/lib/features/thread/domain/state/refresh_all_email_state.dart @@ -0,0 +1,11 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; + +class RefreshingAllEmail extends LoadingState {} + +class RefreshAllEmailSuccess extends UIState {} + +class RefreshAllEmailFailure extends FeatureFailure { + + RefreshAllEmailFailure({dynamic exception}) : super(exception: exception); +} \ No newline at end of file diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index d605c11624..408add795b 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -59,6 +59,7 @@ import 'package:tmail_ui_user/features/thread/domain/state/load_more_emails_stat import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/mark_as_star_multiple_email_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart'; +import 'package:tmail_ui_user/features/thread/domain/state/refresh_all_email_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/refresh_changes_all_email_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/search_more_email_state.dart'; @@ -203,7 +204,7 @@ class ThreadController extends BaseController with EmailActionController { void handleFailureViewState(Failure failure) { super.handleFailureViewState(failure); if (failure is SearchEmailFailure) { - mailboxDashBoardController.refreshingMailboxState.value = Left(failure); + mailboxDashBoardController.updateRefreshAllEmailState(Left(RefreshAllEmailFailure())); canSearchMore = false; mailboxDashBoardController.emailsInCurrentMailbox.clear(); } else if (failure is SearchMoreEmailFailure) { @@ -216,7 +217,7 @@ class ThreadController extends BaseController with EmailActionController { openingEmail.value = false; popAndPush(AppRoutes.unknownRoutePage); } else if (failure is GetAllEmailFailure) { - mailboxDashBoardController.refreshingMailboxState.value = Left(failure); + mailboxDashBoardController.updateRefreshAllEmailState(Left(RefreshAllEmailFailure())); canLoadMore = true; } } @@ -279,10 +280,7 @@ class ThreadController extends BaseController with EmailActionController { }); ever(mailboxDashBoardController.dashBoardAction, (action) { - if (action is RefreshAllEmailAction) { - refreshAllEmail(); - mailboxDashBoardController.clearDashBoardAction(); - } else if (action is SelectionAllEmailAction) { + if (action is SelectionAllEmailAction) { setSelectAllEmailAction(); mailboxDashBoardController.clearDashBoardAction(); } else if (action is CancelSelectionAllEmailAction) { @@ -343,6 +341,9 @@ class ThreadController extends BaseController with EmailActionController { _refreshEmailChanges(); } mailboxDashBoardController.clearEmailUIAction(); + } else if (action is RefreshAllEmailAction) { + refreshAllEmail(); + mailboxDashBoardController.clearEmailUIAction(); } }); @@ -448,12 +449,12 @@ class ThreadController extends BaseController with EmailActionController { } void _getAllEmailSuccess(GetAllEmailSuccess success) { + mailboxDashBoardController.updateRefreshAllEmailState(Right(RefreshAllEmailSuccess())); + if (success.currentMailboxId != selectedMailboxId) { log('ThreadController::_getAllEmailSuccess: GetAllForMailboxId = ${success.currentMailboxId?.asString} | SELECTED_MAILBOX_ID = ${selectedMailboxId?.asString} | SELECTED_MAILBOX_NAME = ${selectedMailbox?.name?.name}'); return; } - - mailboxDashBoardController.refreshingMailboxState.value = Right(success); _currentEmailState = success.currentEmailState; log('ThreadController::_getAllEmailSuccess():COUNT = ${success.emailList.length} | EMAIL_STATE = $_currentEmailState'); final newListEmail = success.emailList.syncPresentationEmail( @@ -863,7 +864,7 @@ class ThreadController extends BaseController with EmailActionController { } void _searchEmailsSuccess(SearchEmailSuccess success) { - mailboxDashBoardController.refreshingMailboxState.value = Right(success); + mailboxDashBoardController.updateRefreshAllEmailState(Right(RefreshAllEmailSuccess())); log('ThreadController::_searchEmailsSuccess: COUNT = ${success.emailList.length}'); final resultEmailSearchList = success.emailList .map((email) => email.toSearchPresentationEmail(mailboxDashBoardController.mapMailboxById))