TF-343 list scroll ot sorted well because multiple requests to back-end at the same time
This commit is contained in:
committed by
Dat H. Pham
parent
6ea7305333
commit
c0b654d5a9
@@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:jmap_dart_client/jmap/account_id.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/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/core/unsigned_int.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/email_comparator.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/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/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/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_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/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/domain/usecases/mark_as_star_email_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.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/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/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/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/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_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/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/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/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/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/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_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/refresh_changes_emails_in_mailbox_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/usecases/search_email_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/localizations/app_localizations.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/app_routes.dart';
|
import 'package:tmail_ui_user/main/routes/app_routes.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/route_navigation.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 {
|
class ThreadController extends BaseController {
|
||||||
|
|
||||||
@@ -77,6 +77,8 @@ class ThreadController extends BaseController {
|
|||||||
|
|
||||||
bool canLoadMore = true;
|
bool canLoadMore = true;
|
||||||
bool canSearchMore = true;
|
bool canSearchMore = true;
|
||||||
|
bool _isLoadingMore = false;
|
||||||
|
get isLoadingMore => _isLoadingMore;
|
||||||
MailboxId? _currentMailboxId;
|
MailboxId? _currentMailboxId;
|
||||||
jmap.State? _currentEmailState;
|
jmap.State? _currentEmailState;
|
||||||
|
|
||||||
@@ -159,8 +161,10 @@ class ThreadController extends BaseController {
|
|||||||
super.onData(newState);
|
super.onData(newState);
|
||||||
newState.fold(
|
newState.fold(
|
||||||
(failure) {
|
(failure) {
|
||||||
if (failure is SearchEmailFailure) {
|
if (failure is SearchEmailFailure) {
|
||||||
emailListSearch.clear();
|
emailListSearch.clear();
|
||||||
|
} else if (failure is SearchMoreEmailFailure || failure is LoadMoreEmailsFailure) {
|
||||||
|
_isLoadingMore = false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
(success) {
|
(success) {
|
||||||
@@ -172,6 +176,8 @@ class ThreadController extends BaseController {
|
|||||||
_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) {
|
||||||
|
_isLoadingMore = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -319,6 +325,7 @@ class ThreadController extends BaseController {
|
|||||||
|
|
||||||
void loadMoreEmails() {
|
void loadMoreEmails() {
|
||||||
if (canLoadMore && _accountId != null) {
|
if (canLoadMore && _accountId != null) {
|
||||||
|
log('ThreadController::loadMoreEmails(): latest: ${emailList.last.receivedAt}');
|
||||||
consumeState(_loadMoreEmailsInMailboxInteractor.execute(
|
consumeState(_loadMoreEmailsInMailboxInteractor.execute(
|
||||||
_accountId!,
|
_accountId!,
|
||||||
limit: ThreadConstants.defaultLimit,
|
limit: ThreadConstants.defaultLimit,
|
||||||
@@ -336,6 +343,7 @@ class ThreadController extends BaseController {
|
|||||||
} else {
|
} else {
|
||||||
canLoadMore = false;
|
canLoadMore = false;
|
||||||
}
|
}
|
||||||
|
_isLoadingMore = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
SelectMode getSelectMode(PresentationEmail presentationEmail, PresentationEmail? selectedEmail) {
|
SelectMode getSelectMode(PresentationEmail presentationEmail, PresentationEmail? selectedEmail) {
|
||||||
@@ -673,6 +681,7 @@ class ThreadController extends BaseController {
|
|||||||
} else {
|
} else {
|
||||||
canSearchMore = false;
|
canSearchMore = false;
|
||||||
}
|
}
|
||||||
|
_isLoadingMore = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isSelectionEnabled() => currentSelectMode.value == SelectMode.ACTIVE;
|
bool isSelectionEnabled() => currentSelectMode.value == SelectMode.ACTIVE;
|
||||||
|
|||||||
@@ -350,7 +350,9 @@ class ThreadView extends GetWidget<ThreadController> {
|
|||||||
return NotificationListener<ScrollNotification>(
|
return NotificationListener<ScrollNotification>(
|
||||||
onNotification: (ScrollNotification scrollInfo) {
|
onNotification: (ScrollNotification scrollInfo) {
|
||||||
if (scrollInfo is ScrollEndNotification
|
if (scrollInfo is ScrollEndNotification
|
||||||
&& scrollInfo.metrics.pixels == scrollInfo.metrics.maxScrollExtent) {
|
&& !controller.isLoadingMore
|
||||||
|
&& scrollInfo.metrics.pixels == scrollInfo.metrics.maxScrollExtent
|
||||||
|
) {
|
||||||
if (controller.isSearchActive()) {
|
if (controller.isSearchActive()) {
|
||||||
controller.searchMoreEmails();
|
controller.searchMoreEmails();
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -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/localizations/app_localizations_delegate.dart';
|
||||||
import 'package:tmail_ui_user/main/pages/app_pages.dart';
|
import 'package:tmail_ui_user/main/pages/app_pages.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/app_routes.dart';
|
import 'package:tmail_ui_user/main/routes/app_routes.dart';
|
||||||
import 'package:core/utils/app_logger.dart';
|
|
||||||
|
|
||||||
void main() async {
|
void main() async {
|
||||||
initLogger(() async {
|
initLogger(() async {
|
||||||
|
|||||||
Reference in New Issue
Block a user