@@ -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