TF-1714 Display animation loading when click refresh mailbox button
(cherry picked from commit d4912afe2e38fdcb15fe4c2d37bde9ae30ff214d)
This commit is contained in:
+8
@@ -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/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_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/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/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_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/mark_as_star_multiple_email_state.dart';
|
||||||
@@ -192,6 +193,7 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
final _isDraggingMailbox = RxBool(false);
|
final _isDraggingMailbox = RxBool(false);
|
||||||
final searchMailboxActivated = RxBool(false);
|
final searchMailboxActivated = RxBool(false);
|
||||||
final listSendingEmails = RxList<SendingEmail>();
|
final listSendingEmails = RxList<SendingEmail>();
|
||||||
|
final refreshingMailboxState = Rx<Either<Failure, Success>>(Right(UIState.idle));
|
||||||
|
|
||||||
Session? sessionCurrent;
|
Session? sessionCurrent;
|
||||||
Map<Role, MailboxId> mapDefaultMailboxIdByRole = {};
|
Map<Role, MailboxId> mapDefaultMailboxIdByRole = {};
|
||||||
@@ -2060,6 +2062,12 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void refreshMailboxAction() async {
|
||||||
|
refreshingMailboxState.value = Right(RefreshAllEmailLoading());
|
||||||
|
await Future.delayed(const Duration(milliseconds: 500));
|
||||||
|
dispatchAction(RefreshAllEmailAction());
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onClose() {
|
void onClose() {
|
||||||
_emailReceiveManager.closeEmailReceiveManagerStream();
|
_emailReceiveManager.closeEmailReceiveManagerStream();
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:flutter_portal/flutter_portal.dart';
|
import 'package:flutter_portal/flutter_portal.dart';
|
||||||
import 'package:flutter_svg/flutter_svg.dart';
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
import 'package:get/get.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/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/composer/presentation/composer_view_web.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/email_view.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/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/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/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_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/styles/banner_empty_trash_styles.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/presentation/widgets/banner_delete_all_spam_emails_widget.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) {
|
Widget _buildListButtonTopBar(BuildContext context) {
|
||||||
return Row(children: [
|
return Row(children: [
|
||||||
(ButtonBuilder(imagePaths.icRefresh)
|
Obx(() {
|
||||||
..key(const Key('button_reload_thread'))
|
return controller.refreshingMailboxState.value.fold(
|
||||||
..decoration(const BoxDecoration(
|
(failure) {
|
||||||
borderRadius: BorderRadius.all(Radius.circular(10)),
|
return TMailButtonWidget.fromIcon(
|
||||||
color: AppColor.colorButtonHeaderThread))
|
key: const Key('refresh_mailbox_button'),
|
||||||
..paddingIcon(EdgeInsets.zero)
|
icon: imagePaths.icRefresh,
|
||||||
..size(16)
|
borderRadius: 10,
|
||||||
..radiusSplash(10)
|
iconSize: 16,
|
||||||
..padding(const EdgeInsets.symmetric(horizontal: 8, vertical: 8))
|
onTapActionCallback: controller.refreshMailboxAction,
|
||||||
..onPressActionClick(() => controller.dispatchAction(RefreshAllEmailAction())))
|
);
|
||||||
.build(),
|
},
|
||||||
|
(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),
|
const SizedBox(width: 16),
|
||||||
(ButtonBuilder(imagePaths.icSelectAll)
|
(ButtonBuilder(imagePaths.icSelectAll)
|
||||||
..key(const Key('button_select_all'))
|
..key(const Key('button_select_all'))
|
||||||
|
|||||||
@@ -161,7 +161,7 @@ class ThreadController extends BaseController with EmailActionController {
|
|||||||
_searchEmailsSuccess(success);
|
_searchEmailsSuccess(success);
|
||||||
} else if (success is SearchMoreEmailSuccess) {
|
} else if (success is SearchMoreEmailSuccess) {
|
||||||
_searchMoreEmailsSuccess(success);
|
_searchMoreEmailsSuccess(success);
|
||||||
} else if (success is SearchingMoreState || success is LoadingMoreState) {
|
} else if (success is SearchingMoreState || success is LoadingMoreEmails) {
|
||||||
loadingMoreStatus = LoadingMoreStatus.running;
|
loadingMoreStatus = LoadingMoreStatus.running;
|
||||||
} else if (success is GetEmailByIdLoading) {
|
} else if (success is GetEmailByIdLoading) {
|
||||||
openingEmail.value = true;
|
openingEmail.value = true;
|
||||||
@@ -175,6 +175,7 @@ class ThreadController extends BaseController with EmailActionController {
|
|||||||
void handleFailureViewState(Failure failure) {
|
void handleFailureViewState(Failure failure) {
|
||||||
super.handleFailureViewState(failure);
|
super.handleFailureViewState(failure);
|
||||||
if (failure is SearchEmailFailure) {
|
if (failure is SearchEmailFailure) {
|
||||||
|
mailboxDashBoardController.refreshingMailboxState.value = Left(failure);
|
||||||
canSearchMore = false;
|
canSearchMore = false;
|
||||||
mailboxDashBoardController.emailsInCurrentMailbox.clear();
|
mailboxDashBoardController.emailsInCurrentMailbox.clear();
|
||||||
} else if (failure is SearchMoreEmailFailure || failure is LoadMoreEmailsFailure) {
|
} else if (failure is SearchMoreEmailFailure || failure is LoadMoreEmailsFailure) {
|
||||||
@@ -183,6 +184,8 @@ class ThreadController extends BaseController with EmailActionController {
|
|||||||
openingEmail.value = false;
|
openingEmail.value = false;
|
||||||
_navigationRouter = null;
|
_navigationRouter = null;
|
||||||
popAndPush(AppRoutes.unknownRoutePage);
|
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) {
|
void _getAllEmailSuccess(GetAllEmailSuccess success) {
|
||||||
|
mailboxDashBoardController.refreshingMailboxState.value = Right(success);
|
||||||
_currentEmailState = success.currentEmailState;
|
_currentEmailState = success.currentEmailState;
|
||||||
log('ThreadController::_getAllEmailSuccess():_currentEmailState: $_currentEmailState');
|
log('ThreadController::_getAllEmailSuccess():_currentEmailState: $_currentEmailState');
|
||||||
final newListEmail = success.emailList.syncPresentationEmail(
|
final newListEmail = success.emailList.syncPresentationEmail(
|
||||||
@@ -724,6 +728,7 @@ class ThreadController extends BaseController with EmailActionController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _searchEmailsSuccess(SearchEmailSuccess success) {
|
void _searchEmailsSuccess(SearchEmailSuccess success) {
|
||||||
|
mailboxDashBoardController.refreshingMailboxState.value = Right(success);
|
||||||
canSearchMore = true;
|
canSearchMore = true;
|
||||||
final resultEmailSearchList = success.emailList
|
final resultEmailSearchList = success.emailList
|
||||||
.map((email) => email.toSearchPresentationEmail(mailboxDashBoardController.mapMailboxById))
|
.map((email) => email.toSearchPresentationEmail(mailboxDashBoardController.mapMailboxById))
|
||||||
|
|||||||
@@ -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/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/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_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/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_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/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';
|
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/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/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/localizations/app_localizations.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
||||||
|
|
||||||
@@ -109,9 +110,9 @@ class ThreadView extends GetWidget<ThreadController>
|
|||||||
}),
|
}),
|
||||||
if (!_responsiveUtils.isDesktop(context))
|
if (!_responsiveUtils.isDesktop(context))
|
||||||
_buildMarkAsMailboxReadLoading(context),
|
_buildMarkAsMailboxReadLoading(context),
|
||||||
_buildLoadingView(),
|
Obx(() => ThreadViewLoadingBarWidget(viewState: controller.viewState.value)),
|
||||||
Expanded(child: _buildListEmail(context)),
|
Expanded(child: _buildListEmail(context)),
|
||||||
_buildLoadingViewLoadMore(),
|
Obx(() => ThreadViewBottomLoadingBarWidget(viewState: controller.viewState.value)),
|
||||||
_buildListButtonSelectionForMobile(context),
|
_buildListButtonSelectionForMobile(context),
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
@@ -270,38 +271,6 @@ class ThreadView extends GetWidget<ThreadController>
|
|||||||
.build()).toList();
|
.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) {
|
Widget _buildListEmail(BuildContext context) {
|
||||||
return Container(
|
return Container(
|
||||||
margin: PlatformInfo.isWeb && _responsiveUtils.isDesktop(context)
|
margin: PlatformInfo.isWeb && _responsiveUtils.isDesktop(context)
|
||||||
|
|||||||
Reference in New Issue
Block a user