From 4e740d2a2012ba911758d0aa01f1becb454fbcdf Mon Sep 17 00:00:00 2001 From: dab246 Date: Mon, 19 Jun 2023 16:38:45 +0700 Subject: [PATCH] TF-1931 Fix user cannot do infinity scroll when he turn off network and reconnect again (cherry picked from commit e19a644e10671089ac792cb1072cc1856b909940) --- .../model/loading_more_status.dart | 8 ++++++ .../presentation/thread_controller.dart | 27 +++++++++++++------ .../thread/presentation/thread_view.dart | 3 ++- 3 files changed, 29 insertions(+), 9 deletions(-) create mode 100644 lib/features/thread/presentation/model/loading_more_status.dart diff --git a/lib/features/thread/presentation/model/loading_more_status.dart b/lib/features/thread/presentation/model/loading_more_status.dart new file mode 100644 index 000000000..823362b9e --- /dev/null +++ b/lib/features/thread/presentation/model/loading_more_status.dart @@ -0,0 +1,8 @@ + +enum LoadingMoreStatus { + idle, + running, + completed; + + bool get isRunning => this == LoadingMoreStatus.running; +} \ 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 750615309..0ea8d2a66 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -61,6 +61,7 @@ import 'package:tmail_ui_user/features/thread/domain/usecases/search_more_email_ import 'package:tmail_ui_user/features/thread/presentation/extensions/list_presentation_email_extensions.dart'; import 'package:tmail_ui_user/features/thread/presentation/mixin/email_action_controller.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart'; +import 'package:tmail_ui_user/features/thread/presentation/model/loading_more_status.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; @@ -89,7 +90,7 @@ class ThreadController extends BaseController with EmailActionController { bool canLoadMore = true; bool canSearchMore = true; - bool _isLoadingMore = false; + LoadingMoreStatus loadingMoreStatus = LoadingMoreStatus.idle; MailboxId? _currentMailboxId; jmap.State? _currentEmailState; NavigationRouter? _navigationRouter; @@ -101,8 +102,6 @@ class ThreadController extends BaseController with EmailActionController { ..add(EmailComparator(EmailComparatorProperty.receivedAt) ..setIsAscending(false)); - bool get isLoadingMore => _isLoadingMore; - AccountId? get _accountId => mailboxDashBoardController.accountId.value; Session? get _session => mailboxDashBoardController.sessionCurrent; @@ -159,7 +158,7 @@ class ThreadController extends BaseController with EmailActionController { } else if (success is SearchMoreEmailSuccess) { _searchMoreEmailsSuccess(success); } else if (success is SearchingMoreState || success is LoadingMoreState) { - _isLoadingMore = true; + loadingMoreStatus = LoadingMoreStatus.running; } else if (success is GetEmailByIdLoading) { openingEmail.value = true; } else if (success is GetEmailByIdSuccess) { @@ -175,7 +174,7 @@ class ThreadController extends BaseController with EmailActionController { canSearchMore = false; mailboxDashBoardController.emailsInCurrentMailbox.clear(); } else if (failure is SearchMoreEmailFailure || failure is LoadMoreEmailsFailure) { - _isLoadingMore = false; + loadingMoreStatus = LoadingMoreStatus.completed; } else if (failure is GetEmailByIdFailure) { openingEmail.value = false; _navigationRouter = null; @@ -186,15 +185,25 @@ class ThreadController extends BaseController with EmailActionController { @override void handleErrorViewState(Object error, StackTrace stackTrace) { super.handleErrorViewState(error, stackTrace); + logError('ThreadController::handleErrorViewState(): error: $error | stackTrace: $stackTrace'); + _resetLoadingMore(); _handleErrorGetAllOrRefreshChangesEmail(error, stackTrace); } @override void handleExceptionAction({Failure? failure, Exception? exception}) { super.handleExceptionAction(failure: failure, exception: exception); + logError('ThreadController::handleExceptionAction(): failure: $failure | exception: $exception'); + _resetLoadingMore(); clearState(); } + void _resetLoadingMore() { + if (loadingMoreStatus == LoadingMoreStatus.running) { + loadingMoreStatus = LoadingMoreStatus.idle; + } + } + void _registerObxStreamListener() { ever(mailboxDashBoardController.selectedMailbox, (mailbox) { if (mailbox is PresentationMailbox) { @@ -356,7 +365,7 @@ class ThreadController extends BaseController with EmailActionController { dispatchState(Right(LoadingState())); mailboxDashBoardController.emailsInCurrentMailbox.clear(); canLoadMore = true; - _isLoadingMore = false; + loadingMoreStatus = LoadingMoreStatus.idle; cancelSelectEmail(); } @@ -443,6 +452,7 @@ class ThreadController extends BaseController with EmailActionController { void refreshAllEmail() { dispatchState(Right(LoadingState())); canLoadMore = true; + loadingMoreStatus == LoadingMoreStatus.idle; cancelSelectEmail(); if (searchController.isSearchEmailRunning) { @@ -517,6 +527,7 @@ class ThreadController extends BaseController with EmailActionController { } void _loadMoreEmailsSuccess(LoadMoreEmailsSuccess success) { + loadingMoreStatus = LoadingMoreStatus.completed; if (success.emailList.isNotEmpty) { final appendableList = success.emailList .where(_belongToCurrentMailboxId) @@ -533,7 +544,6 @@ class ThreadController extends BaseController with EmailActionController { } else { canLoadMore = false; } - _isLoadingMore = false; } SelectMode getSelectMode(PresentationEmail presentationEmail, PresentationEmail? selectedEmail) { @@ -746,6 +756,8 @@ class ThreadController extends BaseController with EmailActionController { } void _searchMoreEmailsSuccess(SearchMoreEmailSuccess success) { + loadingMoreStatus = LoadingMoreStatus.completed; + if (success.emailList.isNotEmpty) { canSearchMore = true; final resultEmailSearchList = success.emailList @@ -762,7 +774,6 @@ class ThreadController extends BaseController with EmailActionController { } else { canSearchMore = false; } - _isLoadingMore = false; } bool isSelectionEnabled() => mailboxDashBoardController.isSelectionEnabled(); diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index 5ba8e4264..1258b8efe 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -302,9 +302,10 @@ class ThreadView extends GetWidget return NotificationListener( onNotification: (ScrollNotification scrollInfo) { if (scrollInfo is ScrollEndNotification - && !controller.isLoadingMore + && !controller.loadingMoreStatus.isRunning && scrollInfo.metrics.pixels == scrollInfo.metrics.maxScrollExtent ) { + log('ThreadView::_buildListEmailBody(): CALL LOAD MORE'); if (controller.isSearchActive() || controller.searchController.advancedSearchIsActivated.isTrue) { controller.searchMoreEmails(); } else {