TF-343 list scroll ot sorted well because multiple requests to back-end at the same time

This commit is contained in:
Dat PHAM HOANG
2022-03-16 12:51:33 +07:00
committed by Dat H. Pham
parent 6ea7305333
commit c0b654d5a9
3 changed files with 17 additions and 7 deletions
@@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_comparator.dart';
@@ -19,8 +20,8 @@ import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.da
import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_request.dart';
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_star_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_star_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_interactor.dart';
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
@@ -33,15 +34,15 @@ import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
import 'package:tmail_ui_user/features/thread/domain/state/get_all_email_state.dart';
import 'package:tmail_ui_user/features/thread/domain/state/load_more_emails_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/move_multiple_email_to_mailbox_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/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/domain/usecases/get_emails_in_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/load_more_emails_in_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_star_multiple_email_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/refresh_all_emails_in_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/search_email_interactor.dart';
@@ -50,7 +51,6 @@ import 'package:tmail_ui_user/features/thread/presentation/extensions/filter_mes
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
class ThreadController extends BaseController {
@@ -77,6 +77,8 @@ class ThreadController extends BaseController {
bool canLoadMore = true;
bool canSearchMore = true;
bool _isLoadingMore = false;
get isLoadingMore => _isLoadingMore;
MailboxId? _currentMailboxId;
jmap.State? _currentEmailState;
@@ -159,8 +161,10 @@ class ThreadController extends BaseController {
super.onData(newState);
newState.fold(
(failure) {
if (failure is SearchEmailFailure) {
if (failure is SearchEmailFailure) {
emailListSearch.clear();
} else if (failure is SearchMoreEmailFailure || failure is LoadMoreEmailsFailure) {
_isLoadingMore = false;
}
},
(success) {
@@ -172,6 +176,8 @@ class ThreadController extends BaseController {
_searchEmailsSuccess(success);
} else if (success is SearchMoreEmailSuccess) {
_searchMoreEmailsSuccess(success);
} else if (success is SearchingMoreState || success is LoadingMoreState) {
_isLoadingMore = true;
}
}
);
@@ -319,6 +325,7 @@ class ThreadController extends BaseController {
void loadMoreEmails() {
if (canLoadMore && _accountId != null) {
log('ThreadController::loadMoreEmails(): latest: ${emailList.last.receivedAt}');
consumeState(_loadMoreEmailsInMailboxInteractor.execute(
_accountId!,
limit: ThreadConstants.defaultLimit,
@@ -336,6 +343,7 @@ class ThreadController extends BaseController {
} else {
canLoadMore = false;
}
_isLoadingMore = false;
}
SelectMode getSelectMode(PresentationEmail presentationEmail, PresentationEmail? selectedEmail) {
@@ -673,6 +681,7 @@ class ThreadController extends BaseController {
} else {
canSearchMore = false;
}
_isLoadingMore = false;
}
bool isSelectionEnabled() => currentSelectMode.value == SelectMode.ACTIVE;
@@ -350,7 +350,9 @@ class ThreadView extends GetWidget<ThreadController> {
return NotificationListener<ScrollNotification>(
onNotification: (ScrollNotification scrollInfo) {
if (scrollInfo is ScrollEndNotification
&& scrollInfo.metrics.pixels == scrollInfo.metrics.maxScrollExtent) {
&& !controller.isLoadingMore
&& scrollInfo.metrics.pixels == scrollInfo.metrics.maxScrollExtent
) {
if (controller.isSearchActive()) {
controller.searchMoreEmails();
} else {
-1
View File
@@ -8,7 +8,6 @@ import 'package:tmail_ui_user/main/bindings/main_bindings.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations_delegate.dart';
import 'package:tmail_ui_user/main/pages/app_pages.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart';
import 'package:core/utils/app_logger.dart';
void main() async {
initLogger(() async {