From 4e3385dc845328141f7c0b1dbb43cba589e5912e Mon Sep 17 00:00:00 2001 From: ManhNTX Date: Fri, 28 Oct 2022 00:12:32 +0700 Subject: [PATCH] TF-996: add limit size listEmailLoaded --- .../email/presentation/email_controller.dart | 22 ++++++++++++------- .../email/presentation/email_view.dart | 2 +- .../mailbox_dashboard_controller.dart | 2 +- .../presentation/thread_controller.dart | 2 +- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/lib/features/email/presentation/email_controller.dart b/lib/features/email/presentation/email_controller.dart index f781fa77b..ddf1507b2 100644 --- a/lib/features/email/presentation/email_controller.dart +++ b/lib/features/email/presentation/email_controller.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:collection'; import 'dart:io'; import 'package:core/core.dart'; @@ -91,7 +92,7 @@ class EmailController extends BaseController with AppLoaderMixin { Identity? _identitySelected; List? initialEmailContents; late Worker emailWorker; - final Map presentationEmailsLoaded = {}; + final Queue presentationEmailsLoaded = Queue(); PageController? pageController; int currentIndexPageView = 0; final canGetNewerEmail = true.obs; @@ -147,8 +148,8 @@ class EmailController extends BaseController with AppLoaderMixin { } void _setCurrentPositionEmailInListEmail() { - currentIndexPageView = mailboxDashBoardController.emailList.indexOf(mailboxDashBoardController.selectedEmail.value); - if(pageController != null && pageController!.page?.toInt() != currentIndexPageView) { + currentIndexPageView = mailboxDashBoardController.emailsInCurrentMailbox.indexOf(mailboxDashBoardController.selectedEmail.value); + if(pageController != null && pageController!.hasClients && pageController!.page?.toInt() != currentIndexPageView) { pageController!.jumpToPage(currentIndexPageView); } else { pageController = PageController(initialPage: currentIndexPageView); @@ -157,12 +158,12 @@ class EmailController extends BaseController with AppLoaderMixin { } void onPageChanged(int index) { - mailboxDashBoardController.selectedEmail.value = mailboxDashBoardController.emailList[index]; + mailboxDashBoardController.selectedEmail.value = mailboxDashBoardController.emailsInCurrentMailbox[index]; } void _checkEnableNavigatorPageView() { canGetNewerEmail.value = currentIndexPageView > 0; - canGetOlderEmail.value = mailboxDashBoardController.emailList.length > 1 && currentIndexPageView < mailboxDashBoardController.emailList.length - 1; + canGetOlderEmail.value = mailboxDashBoardController.emailsInCurrentMailbox.length > 1 && currentIndexPageView < mailboxDashBoardController.emailsInCurrentMailbox.length - 1; } void getNewerEmail() { @@ -259,10 +260,10 @@ class EmailController extends BaseController with AppLoaderMixin { void _getEmailContentAction(EmailId emailId) async { final accountId = mailboxDashBoardController.accountId.value; final baseDownloadUrl = mailboxDashBoardController.sessionCurrent?.getDownloadUrl(); - final listEmailIdLoaded = presentationEmailsLoaded.keys.toList(); + final listEmailIdLoaded = presentationEmailsLoaded.map((e) => e.emailCurrent!.id).toList(); EmailLoaded? emailLoaded; if(listEmailIdLoaded.contains(_currentEmailId)) { - emailLoaded = presentationEmailsLoaded[_currentEmailId]; + emailLoaded = presentationEmailsLoaded.firstWhere((e) => e.emailCurrent!.id == _currentEmailId); } if (accountId != null && baseDownloadUrl != null) { consumeState(_getEmailContentInteractor.execute(accountId, emailId, baseDownloadUrl, emailLoaded: emailLoaded)); @@ -305,7 +306,12 @@ class EmailController extends BaseController with AppLoaderMixin { } void _getEmailContentSuccess(GetEmailContentSuccess success) { - presentationEmailsLoaded[success.emailCurrent!.id] = EmailLoaded(success.emailContents.toList(), success.emailContentsDisplayed.toList(), success.attachments.toList(), success.emailCurrent); + if(presentationEmailsLoaded.length > 100) { + presentationEmailsLoaded.removeFirst(); + } + final emailLoaded = EmailLoaded(success.emailContents.toList(), success.emailContentsDisplayed.toList(), success.attachments.toList(), success.emailCurrent); + presentationEmailsLoaded.removeWhere((e) => e.emailCurrent!.id == emailLoaded.emailCurrent!.id); + presentationEmailsLoaded.add(emailLoaded); emailContents.value = success.emailContentsDisplayed; initialEmailContents = success.emailContents; attachments.value = success.attachments; diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index 1b95f4c0d..fb75fc12b 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -93,7 +93,7 @@ class EmailView extends GetWidget { Expanded( child: PageView.builder( physics: kIsWeb ? const NeverScrollableScrollPhysics() : null, - itemCount: controller.mailboxDashBoardController.emailList.length, + itemCount: controller.mailboxDashBoardController.emailsInCurrentMailbox.length, controller: controller.pageController, onPageChanged: controller.onPageChanged, itemBuilder: (context, _) { diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index b34de62e0..4b361b4b1 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -126,7 +126,7 @@ class MailboxDashBoardController extends ReloadableController { Session? sessionCurrent; Map mapDefaultMailboxIdByRole = {}; Map mapMailboxById = {}; - final emailList = [].obs; + final emailsInCurrentMailbox = [].obs; PresentationMailbox? outboxMailbox; RouterArguments? routerArguments; diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index 8abdd0686..b559a17e5 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -127,7 +127,7 @@ class ThreadController extends BaseController { SearchQuery? get searchQuery => searchController.searchEmailFilter.value.text; - RxList get emailList => mailboxDashBoardController.emailList; + RxList get emailList => mailboxDashBoardController.emailsInCurrentMailbox; ThreadController( this._getEmailsInMailboxInteractor,