Skip to content

Commit 651115c

Browse files
dab246hoangdat
authored andcommitted
TF-4368 Auto trigger load more when get all email return < 20 emails
1 parent 7907df3 commit 651115c

File tree

2 files changed

+137
-65
lines changed

2 files changed

+137
-65
lines changed

lib/features/thread/domain/constants/thread_constants.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ class ThreadConstants {
7373
});
7474

7575
static const int defaultMaxHeightEmailItemOnBrowser = 40;
76-
static const int defaultMaxHeightBrowser = 1200;
7776

7877
static final propertiesParseEmailByBlobId = Properties({
7978
EmailProperty.id,

lib/features/thread/presentation/thread_controller.dart

Lines changed: 137 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,8 @@ class ThreadController extends BaseController with EmailActionController {
9797
final openingEmail = RxBool(false);
9898
final loadingMoreStatus = Rx(LoadingMoreStatus.idle);
9999

100-
bool canLoadMore = false;
101-
bool canSearchMore = false;
100+
bool canLoadMore = true;
101+
bool canSearchMore = true;
102102
MailboxId? _currentMemoryMailboxId;
103103
int _peakEmailCount = 0;
104104
final ScrollController listEmailController = ScrollController();
@@ -203,6 +203,7 @@ class ThreadController extends BaseController with EmailActionController {
203203
if (failure is SearchEmailFailure) {
204204
mailboxDashBoardController.updateRefreshAllEmailState(Left(RefreshAllEmailFailure()));
205205
canSearchMore = false;
206+
loadingMoreStatus.value = LoadingMoreStatus.idle;
206207
mailboxDashBoardController.emailsInCurrentMailbox.clear();
207208
showRetryToast(failure);
208209
} else if (failure is SearchMoreEmailFailure) {
@@ -245,7 +246,7 @@ class ThreadController extends BaseController with EmailActionController {
245246
},
246247
(success) {
247248
if (success is GetAllEmailSuccess) {
248-
_handleOnDoneGetAllEmailSuccess();
249+
_handleOnDoneGetAllEmailSuccess(success);
249250
}
250251
},
251252
);
@@ -411,7 +412,7 @@ class ThreadController extends BaseController with EmailActionController {
411412

412413
ever(mailboxDashBoardController.emailsInCurrentMailbox, (emails) {
413414
final countEmails = emails.length;
414-
log(
415+
logTrace(
415416
'ThreadController::Ever(mailboxDashBoardController.emailsInCurrentMailbox): '
416417
'Count emails is $countEmails, '
417418
'_peakEmailCount is $_peakEmailCount',
@@ -472,27 +473,56 @@ class ThreadController extends BaseController with EmailActionController {
472473
}
473474

474475
void _validateBrowserHeight() {
476+
if (_isAutoLoadMore) {
477+
_performAutomaticallyLoadMoreEmails();
478+
}
479+
}
480+
481+
bool get _isAutoLoadMore {
482+
if (!PlatformInfo.isWeb) {
483+
return _isNonWebAutoLoadMore;
484+
}
475485
final browserInnerHeight = html.window.innerHeight ?? 0;
476486
final currentListEmails = mailboxDashBoardController.emailsInCurrentMailbox;
477487
final totalHeightListEmails = currentListEmails.isEmpty
478-
? 0
479-
: currentListEmails.length * ThreadConstants.defaultMaxHeightEmailItemOnBrowser;
480-
final isAutoLoadMore =
481-
browserInnerHeight >= ThreadConstants.defaultMaxHeightBrowser &&
482-
totalHeightListEmails <= browserInnerHeight;
488+
? 0
489+
: currentListEmails.length *
490+
ThreadConstants.defaultMaxHeightEmailItemOnBrowser;
491+
final isAutoLoadMore = totalHeightListEmails > 0 &&
492+
totalHeightListEmails <= browserInnerHeight;
483493
logTrace(
484-
'ThreadController::_validateBrowserHeight():'
494+
'ThreadController::_isAutoLoadMore():'
485495
'BrowserInnerHeight = $browserInnerHeight, '
486496
'TotalHeightListEmails = $totalHeightListEmails, '
487-
'ThreadConstants.defaultMaxHeightBrowser = ${ThreadConstants.defaultMaxHeightBrowser}, '
488497
'ThreadConstants.defaultMaxHeightEmailItemOnBrowser = ${ThreadConstants.defaultMaxHeightEmailItemOnBrowser}, '
498+
'CountCurrentListEmails = ${currentListEmails.length}, '
489499
'CanLoadMore = $canLoadMore, '
490-
'isAutoLoadMore = $isAutoLoadMore, '
491-
'CountCurrentListEmails = ${currentListEmails.length}',
500+
'isAutoLoadMore = $isAutoLoadMore ',
492501
);
493-
if (isAutoLoadMore) {
494-
_performAutomaticallyLoadMoreEmails();
502+
return isAutoLoadMore;
503+
}
504+
505+
bool get _isNonWebAutoLoadMore {
506+
if (!listEmailController.hasClients) {
507+
logTrace(
508+
'ThreadController::_isNonWebAutoLoadMore(): listEmailController.hasClients = false',
509+
);
510+
return false;
495511
}
512+
513+
final maxScroll = listEmailController.position.maxScrollExtent;
514+
final viewport = listEmailController.position.viewportDimension;
515+
final isAutoLoadMore = maxScroll <= viewport;
516+
517+
logTrace(
518+
'ThreadController::_isNonWebAutoLoadMore():'
519+
'maxScroll = $maxScroll, '
520+
'viewport = $viewport, '
521+
'CanLoadMore = $canLoadMore, '
522+
'isAutoLoadMore = $isAutoLoadMore ',
523+
);
524+
525+
return isAutoLoadMore;
496526
}
497527

498528
void _performAutomaticallyLoadMoreEmails() {
@@ -525,10 +555,14 @@ class ThreadController extends BaseController with EmailActionController {
525555
mailboxDashBoardController.listEmailSelected.clear();
526556
mailboxDashBoardController.currentSelectMode.value = SelectMode.INACTIVE;
527557
canLoadMore = true;
558+
canSearchMore = true;
528559
loadingMoreStatus.value = LoadingMoreStatus.idle;
529560
}
530561

531-
void _getAllEmailSuccess(GetAllEmailSuccess success) {
562+
void _getAllEmailSuccess(
563+
GetAllEmailSuccess success, {
564+
bool shouldJumpToFirstEmail = true,
565+
}) {
532566
log('ThreadController::_getAllEmailSuccess: GetAllForMailboxId = ${success.currentMailboxId?.asString} | SELECTED_MAILBOX_ID = ${selectedMailboxId?.asString} | SELECTED_MAILBOX_NAME = ${selectedMailbox?.name?.name}');
533567
mailboxDashBoardController.updateRefreshAllEmailState(Right(RefreshAllEmailSuccess()));
534568
final currentMailboxId = success.currentMailboxId;
@@ -539,42 +573,54 @@ class ThreadController extends BaseController with EmailActionController {
539573
return;
540574
}
541575
mailboxDashBoardController.setCurrentEmailState(success.currentEmailState);
542-
log('ThreadController::_getAllEmailSuccess():COUNT = ${success.emailList.length} | EMAIL_STATE = ${mailboxDashBoardController.currentEmailState}');
543576
final newListEmail = success.emailList.syncPresentationEmail(
544577
mapMailboxById: mailboxDashBoardController.mapMailboxById,
545578
selectedMailbox: selectedMailbox,
546579
searchQuery: searchController.searchQuery,
547580
isSearchEmailRunning: searchController.isSearchEmailRunning
548581
);
582+
logTrace(
583+
'ThreadController::_getAllEmailSuccess():'
584+
'MailboxId = ${success.currentMailboxId?.asString}, '
585+
'ServerEmailCount = ${success.emailList.length}, '
586+
'DisplayedEmailCount = ${newListEmail.length}, '
587+
'EmailState = ${success.currentEmailState?.value}',
588+
);
549589
mailboxDashBoardController.updateEmailList(newListEmail);
550590
if (mailboxDashBoardController.isSelectionEnabled()) {
551591
mailboxDashBoardController.listEmailSelected.value = listEmailSelected;
552592
}
553-
canLoadMore = newListEmail.length >= ThreadConstants.maxCountEmails;
554-
loadingMoreStatus.value = LoadingMoreStatus.completed;
555593

556-
if (listEmailController.hasClients) {
594+
if (shouldJumpToFirstEmail && listEmailController.hasClients) {
557595
listEmailController.jumpTo(0);
558596
}
559597
}
560598

561-
void _handleOnDoneGetAllEmailSuccess() {
562-
if (PlatformInfo.isWeb) {
563-
_validateBrowserHeight();
564-
565-
if (mailboxDashBoardController.isEmailListDisplayed) {
566-
refocusMailShortcutFocus();
567-
}
599+
void _handleOnDoneGetAllEmailSuccess(GetAllEmailSuccess success) {
600+
if (PlatformInfo.isWeb && mailboxDashBoardController.isEmailListDisplayed) {
601+
refocusMailShortcutFocus();
602+
}
603+
final emailList = success.emailList;
604+
log('ThreadController::_handleOnDoneGetAllEmailSuccess: EmailCount = ${emailList.length}');
605+
if (_isAutoLoadMore && emailList.isNotEmpty) {
606+
_performAutomaticallyLoadMoreEmails();
607+
} else {
608+
canLoadMore = emailList.isNotEmpty;
568609
}
569610
}
570611

571612
void _handleOnDoneGetAllEmailFailure() {
572-
if (PlatformInfo.isWeb) {
573-
_validateBrowserHeight();
574-
}
613+
log('ThreadController::_handleOnDoneGetAllEmailFailure');
575614
if (PlatformInfo.isWeb && mailboxDashBoardController.isEmailListDisplayed) {
576615
refocusMailShortcutFocus();
577616
}
617+
618+
if (_isAutoLoadMore) {
619+
_performAutomaticallyLoadMoreEmails();
620+
} else {
621+
canLoadMore = false;
622+
loadingMoreStatus.value = LoadingMoreStatus.idle;
623+
}
578624
}
579625

580626
void _refreshChangesAllEmailSuccess(RefreshChangesAllEmailSuccess success) {
@@ -602,8 +648,17 @@ class ThreadController extends BaseController with EmailActionController {
602648
mailboxDashBoardController.listEmailSelected.value = listEmailSelected;
603649
}
604650

605-
if (PlatformInfo.isWeb) {
606-
_validateBrowserHeight();
651+
logTrace(
652+
'ThreadController::_refreshChangesAllEmailSuccess():'
653+
'MailboxId = ${success.currentMailboxId?.asString}, '
654+
'CurrentEmailCount = ${emailsBeforeChanges.length}, '
655+
'ServerEmailCount = ${success.emailList.length}, '
656+
'DisplayedEmailCount = ${emailListSynced.length}, '
657+
'EmailState = ${success.currentEmailState?.value}',
658+
);
659+
660+
if (_isAutoLoadMore) {
661+
_performAutomaticallyLoadMoreEmails();
607662
}
608663
}
609664

@@ -700,7 +755,8 @@ class ThreadController extends BaseController with EmailActionController {
700755
await _refreshChangeListEmailCache();
701756

702757
log('ThreadController::_refreshChangeSearchEmail:');
703-
canSearchMore = false;
758+
canSearchMore = true;
759+
loadingMoreStatus.value = LoadingMoreStatus.idle;
704760
searchController.updateFilterEmail(
705761
positionOption: option(
706762
_searchEmailFilter.sortOrderType.isScrollByPosition(),
@@ -737,6 +793,7 @@ class ThreadController extends BaseController with EmailActionController {
737793
mailboxDashBoardController.updateRefreshAllEmailState(
738794
Left(RefreshAllEmailFailure()));
739795
canSearchMore = false;
796+
loadingMoreStatus.value = LoadingMoreStatus.completed;
740797
mailboxDashBoardController.emailsInCurrentMailbox.clear();
741798
if (searchState != null) {
742799
onDataFailureViewState(searchState);
@@ -820,7 +877,7 @@ class ThreadController extends BaseController with EmailActionController {
820877
.foldSuccessWithResult<GetAllEmailSuccess>();
821878

822879
if (emailSuccessState is GetAllEmailSuccess) {
823-
_getAllEmailSuccess(emailSuccessState);
880+
_getAllEmailSuccess(emailSuccessState, shouldJumpToFirstEmail: false);
824881
} else if (emailSuccessState != null) {
825882
onDataFailureViewState(emailSuccessState);
826883
}
@@ -831,16 +888,20 @@ class ThreadController extends BaseController with EmailActionController {
831888
if (!canLoadMore) return;
832889

833890
if (_session != null && _accountId != null) {
834-
final oldestEmail = mailboxDashBoardController.emailsInCurrentMailbox.isNotEmpty
835-
? mailboxDashBoardController.emailsInCurrentMailbox.last
836-
: null;
891+
final currentListEmail =
892+
mailboxDashBoardController.emailsInCurrentMailbox;
893+
final oldestEmail =
894+
currentListEmail.isNotEmpty ? currentListEmail.last : null;
837895
final useCache = selectedMailbox?.isCacheable ?? false;
838896
final filterOption = mailboxDashBoardController.filterMessageOption.value;
897+
839898
logTrace(
840-
'ThreadController::_loadMoreEmails: OldestEmailID = ${oldestEmail?.id?.asString}, '
899+
'ThreadController::_loadMoreEmails: '
900+
'OldestEmailID = ${oldestEmail?.id?.asString}, '
841901
'useCache = $useCache, '
842902
'filterOption = ${filterOption.name}',
843903
);
904+
844905
consumeState(_loadMoreEmailsInMailboxInteractor.execute(
845906
GetEmailRequest(
846907
_session!,
@@ -851,7 +912,7 @@ class ThreadController extends BaseController with EmailActionController {
851912
filter: getFilterConditionForLoadMailbox(oldestEmail: oldestEmail),
852913
properties: EmailUtils.getPropertiesForEmailGetMethod(_session!, _accountId!),
853914
lastEmailId: oldestEmail?.id,
854-
useCache: selectedMailbox?.isCacheable ?? false,
915+
useCache: useCache,
855916
)
856917
));
857918
} else {
@@ -879,18 +940,24 @@ class ThreadController extends BaseController with EmailActionController {
879940
}
880941

881942
void _loadMoreEmailsSuccess(LoadMoreEmailsSuccess success) {
882-
canLoadMore = success.emailList.isNotEmpty;
883-
loadingMoreStatus.value = LoadingMoreStatus.completed;
884-
final appendableList = validateListEmailsLoadMore(success.emailList);
943+
final emailList = success.emailList;
944+
final appendableList = validateListEmailsLoadMore(emailList);
945+
885946
logTrace(
886-
'ThreadController::_loadMoreEmailsSuccess: emailList = ${success.emailList.length}, '
887-
'appendableList = ${appendableList.length}',
947+
'ThreadController::_loadMoreEmailsSuccess: '
948+
'ServerEmailCount = ${emailList.length}, '
949+
'EmailAppendableCount = ${appendableList.length}',
888950
);
951+
889952
if (appendableList.isNotEmpty) {
890953
mailboxDashBoardController.emailsInCurrentMailbox.addAll(appendableList);
891954
}
892-
if (PlatformInfo.isWeb) {
893-
_validateBrowserHeight();
955+
956+
if (_isAutoLoadMore && emailList.isNotEmpty) {
957+
_performAutomaticallyLoadMoreEmails();
958+
} else {
959+
canLoadMore = emailList.isNotEmpty;
960+
loadingMoreStatus.value = LoadingMoreStatus.completed;
894961
}
895962
}
896963

@@ -1059,7 +1126,8 @@ class ThreadController extends BaseController with EmailActionController {
10591126
if (!needRefreshSearchState) {
10601127
mailboxDashBoardController.emailsInCurrentMailbox.clear();
10611128
}
1062-
canSearchMore = false;
1129+
canSearchMore = true;
1130+
loadingMoreStatus.value = LoadingMoreStatus.idle;
10631131

10641132
searchController.updateFilterEmail(
10651133
positionOption: option(_searchEmailFilter.sortOrderType.isScrollByPosition(), 0),
@@ -1105,8 +1173,9 @@ class ThreadController extends BaseController with EmailActionController {
11051173

11061174
void _searchEmailsSuccess(SearchEmailSuccess success) {
11071175
mailboxDashBoardController.updateRefreshAllEmailState(Right(RefreshAllEmailSuccess()));
1108-
log('ThreadController::_searchEmailsSuccess: COUNT = ${success.emailList.length}');
1109-
final resultEmailSearchList = success.emailList
1176+
final emailList = success.emailList;
1177+
log('ThreadController::_searchEmailsSuccess: COUNT = ${emailList.length}');
1178+
final resultEmailSearchList = emailList
11101179
.map((email) => email.toSearchPresentationEmail(mailboxDashBoardController.mapMailboxById))
11111180
.toList();
11121181

@@ -1123,11 +1192,12 @@ class ThreadController extends BaseController with EmailActionController {
11231192
if (mailboxDashBoardController.isSelectionEnabled()) {
11241193
mailboxDashBoardController.listEmailSelected.value = listEmailSelected;
11251194
}
1126-
canSearchMore = newEmailListSynced.length >= ThreadConstants.maxCountEmails;
1127-
loadingMoreStatus.value = LoadingMoreStatus.completed;
11281195

1129-
if (PlatformInfo.isWeb) {
1130-
_validateBrowserHeight();
1196+
if (_isAutoLoadMore && emailList.isNotEmpty) {
1197+
_performAutomaticallyLoadMoreEmails();
1198+
} else {
1199+
canSearchMore = emailList.isNotEmpty;
1200+
loadingMoreStatus.value = LoadingMoreStatus.completed;
11311201
}
11321202
}
11331203

@@ -1139,12 +1209,13 @@ class ThreadController extends BaseController with EmailActionController {
11391209
if (!canSearchMore) return;
11401210

11411211
if (_session != null && _accountId != null) {
1142-
final lastEmail = mailboxDashBoardController.emailsInCurrentMailbox.isNotEmpty
1143-
? mailboxDashBoardController.emailsInCurrentMailbox.last
1144-
: null;
1212+
final currentEmailList =
1213+
mailboxDashBoardController.emailsInCurrentMailbox;
1214+
final lastEmail =
1215+
currentEmailList.isNotEmpty ? currentEmailList.last : null;
11451216

11461217
if (_searchEmailFilter.sortOrderType.isScrollByPosition()) {
1147-
final nextPosition = mailboxDashBoardController.emailsInCurrentMailbox.length;
1218+
final nextPosition = currentEmailList.length;
11481219
log('ThreadController::_searchMoreEmails:nextPosition: $nextPosition');
11491220
searchController.updateFilterEmail(positionOption: Some(nextPosition));
11501221
} else if (_searchEmailFilter.sortOrderType == EmailSortOrderType.oldest) {
@@ -1173,9 +1244,10 @@ class ThreadController extends BaseController with EmailActionController {
11731244
}
11741245

11751246
void _searchMoreEmailsSuccess(SearchMoreEmailSuccess success) {
1176-
log('ThreadController::_searchMoreEmailsSuccess: COUNT = ${success.emailList.length}');
1177-
if (success.emailList.isNotEmpty) {
1178-
final resultEmailSearchList = success.emailList
1247+
final emailList = success.emailList;
1248+
log('ThreadController::_searchMoreEmailsSuccess: COUNT = ${emailList.length}');
1249+
if (emailList.isNotEmpty) {
1250+
final resultEmailSearchList = emailList
11791251
.map((email) => email.toSearchPresentationEmail(mailboxDashBoardController.mapMailboxById))
11801252
.where((email) => mailboxDashBoardController.emailsInCurrentMailbox.every((emailInCurrentMailbox) => emailInCurrentMailbox.id != email.id))
11811253
.toList()
@@ -1187,11 +1259,12 @@ class ThreadController extends BaseController with EmailActionController {
11871259
);
11881260
mailboxDashBoardController.emailsInCurrentMailbox.addAll(resultEmailSearchList);
11891261
}
1190-
canSearchMore = success.emailList.isNotEmpty;
1191-
loadingMoreStatus.value = LoadingMoreStatus.completed;
11921262

1193-
if (PlatformInfo.isWeb) {
1194-
_validateBrowserHeight();
1263+
if (_isAutoLoadMore && emailList.isNotEmpty) {
1264+
_performAutomaticallyLoadMoreEmails();
1265+
} else {
1266+
canSearchMore = emailList.isNotEmpty;
1267+
loadingMoreStatus.value = LoadingMoreStatus.completed;
11951268
}
11961269
}
11971270

0 commit comments

Comments
 (0)