From 195ef578db3069dd0424f763c76c7208141aa629 Mon Sep 17 00:00:00 2001 From: dab246 Date: Tue, 8 Aug 2023 12:24:12 +0700 Subject: [PATCH] TF-1714 Display animation loading when click refresh mailbox button (cherry picked from commit d4912afe2e38fdcb15fe4c2d37bde9ae30ff214d) --- .../mailbox_dashboard_controller.dart | 8 ++++ .../mailbox_dashboard_view_web.dart | 42 ++++++++++++++----- .../presentation/thread_controller.dart | 7 +++- .../thread/presentation/thread_view.dart | 39 ++--------------- 4 files changed, 49 insertions(+), 47 deletions(-) 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 2b38146da..d51b631ba 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -110,6 +110,7 @@ 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'; @@ -192,6 +193,7 @@ class MailboxDashBoardController extends ReloadableController { final _isDraggingMailbox = RxBool(false); final searchMailboxActivated = RxBool(false); final listSendingEmails = RxList(); + final refreshingMailboxState = Rx>(Right(UIState.idle)); Session? sessionCurrent; Map mapDefaultMailboxIdByRole = {}; @@ -2059,6 +2061,12 @@ class MailboxDashBoardController extends ReloadableController { ); } } + + void refreshMailboxAction() async { + refreshingMailboxState.value = Right(RefreshAllEmailLoading()); + await Future.delayed(const Duration(milliseconds: 500)); + dispatchAction(RefreshAllEmailAction()); + } @override void onClose() { 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 334e7502a..5cdddfd6a 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_portal/flutter_portal.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/base/widget/cupertino_loading_widget.dart'; import 'package:tmail_ui_user/features/base/widget/popup_item_no_icon_widget.dart'; import 'package:tmail_ui_user/features/composer/presentation/composer_view_web.dart'; import 'package:tmail_ui_user/features/email/presentation/email_view.dart'; @@ -17,6 +18,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/sear import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/quick_search_filter.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/download/download_task_item_widget.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.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/widgets/banner_delete_all_spam_emails_widget.dart'; @@ -365,17 +367,35 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { Widget _buildListButtonTopBar(BuildContext context) { return Row(children: [ - (ButtonBuilder(imagePaths.icRefresh) - ..key(const Key('button_reload_thread')) - ..decoration(const BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(10)), - color: AppColor.colorButtonHeaderThread)) - ..paddingIcon(EdgeInsets.zero) - ..size(16) - ..radiusSplash(10) - ..padding(const EdgeInsets.symmetric(horizontal: 8, vertical: 8)) - ..onPressActionClick(() => controller.dispatchAction(RefreshAllEmailAction()))) - .build(), + Obx(() { + return controller.refreshingMailboxState.value.fold( + (failure) { + return TMailButtonWidget.fromIcon( + key: const Key('refresh_mailbox_button'), + icon: 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: imagePaths.icRefresh, + borderRadius: 10, + iconSize: 16, + onTapActionCallback: controller.refreshMailboxAction, + ); + } + } + ); + }), const SizedBox(width: 16), (ButtonBuilder(imagePaths.icSelectAll) ..key(const Key('button_select_all')) diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index 91b4b1379..a9feafdac 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -161,7 +161,7 @@ class ThreadController extends BaseController with EmailActionController { _searchEmailsSuccess(success); } else if (success is SearchMoreEmailSuccess) { _searchMoreEmailsSuccess(success); - } else if (success is SearchingMoreState || success is LoadingMoreState) { + } else if (success is SearchingMoreState || success is LoadingMoreEmails) { loadingMoreStatus = LoadingMoreStatus.running; } else if (success is GetEmailByIdLoading) { openingEmail.value = true; @@ -175,6 +175,7 @@ class ThreadController extends BaseController with EmailActionController { void handleFailureViewState(Failure failure) { super.handleFailureViewState(failure); if (failure is SearchEmailFailure) { + mailboxDashBoardController.refreshingMailboxState.value = Left(failure); canSearchMore = false; mailboxDashBoardController.emailsInCurrentMailbox.clear(); } else if (failure is SearchMoreEmailFailure || failure is LoadMoreEmailsFailure) { @@ -183,6 +184,8 @@ class ThreadController extends BaseController with EmailActionController { openingEmail.value = false; _navigationRouter = null; popAndPush(AppRoutes.unknownRoutePage); + } else if (failure is GetAllEmailFailure) { + mailboxDashBoardController.refreshingMailboxState.value = Left(failure); } } @@ -374,6 +377,7 @@ class ThreadController extends BaseController with EmailActionController { } void _getAllEmailSuccess(GetAllEmailSuccess success) { + mailboxDashBoardController.refreshingMailboxState.value = Right(success); _currentEmailState = success.currentEmailState; log('ThreadController::_getAllEmailSuccess():_currentEmailState: $_currentEmailState'); final newListEmail = success.emailList.syncPresentationEmail( @@ -724,6 +728,7 @@ class ThreadController extends BaseController with EmailActionController { } void _searchEmailsSuccess(SearchEmailSuccess success) { + mailboxDashBoardController.refreshingMailboxState.value = Right(success); canSearchMore = true; final resultEmailSearchList = success.emailList .map((email) => email.toSearchPresentationEmail(mailboxDashBoardController.mapMailboxById)) diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index 28d1de917..d9d86a1eb 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -18,7 +18,6 @@ import 'package:tmail_ui_user/features/network_connection/presentation/network_c import 'package:tmail_ui_user/features/quotas/presentation/widget/quotas_banner_widget.dart'; import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.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'; import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.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'; @@ -31,6 +30,8 @@ import 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_bu if (dart.library.html) 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_web_builder.dart'; import 'package:tmail_ui_user/features/thread/presentation/widgets/filter_message_cupertino_action_sheet_action_builder.dart'; import 'package:tmail_ui_user/features/thread/presentation/widgets/spam_banner/spam_report_banner_widget.dart'; +import 'package:tmail_ui_user/features/thread/presentation/widgets/thread_view_bottom_loading_bar_widget.dart'; +import 'package:tmail_ui_user/features/thread/presentation/widgets/thread_view_loading_bar_widget.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; @@ -109,9 +110,9 @@ class ThreadView extends GetWidget }), if (!_responsiveUtils.isDesktop(context)) _buildMarkAsMailboxReadLoading(context), - _buildLoadingView(), + Obx(() => ThreadViewLoadingBarWidget(viewState: controller.viewState.value)), Expanded(child: _buildListEmail(context)), - _buildLoadingViewLoadMore(), + Obx(() => ThreadViewBottomLoadingBarWidget(viewState: controller.viewState.value)), _buildListButtonSelectionForMobile(context), ] ) @@ -270,38 +271,6 @@ class ThreadView extends GetWidget .build()).toList(); } - Widget _buildLoadingView() { - return Obx(() => controller.viewState.value.fold( - (failure) => const SizedBox.shrink(), - (success) { - if (controller.isSearchActive() || controller.searchController.advancedSearchIsActivated.isTrue) { - return success is SearchingState - ? Padding(padding: const EdgeInsets.symmetric(vertical: 16), child: loadingWidget) - : const SizedBox.shrink(); - } else { - return success is LoadingState || controller.openingEmail.isTrue - ? Padding(padding: const EdgeInsets.symmetric(vertical: 16), child: loadingWidget) - : const SizedBox.shrink(); - } - })); - } - - Widget _buildLoadingViewLoadMore() { - return Obx(() => controller.viewState.value.fold( - (failure) => const SizedBox.shrink(), - (success) { - if (controller.isSearchActive()) { - return success is SearchingMoreState - ? Padding(padding: const EdgeInsets.only(bottom: 16), child: loadingWidget) - : const SizedBox.shrink(); - } else { - return success is LoadingMoreState - ? Padding(padding: const EdgeInsets.only(bottom: 16), child: loadingWidget) - : const SizedBox.shrink(); - } - })); - } - Widget _buildListEmail(BuildContext context) { return Container( margin: PlatformInfo.isWeb && _responsiveUtils.isDesktop(context)