From 2e16cc7f6ccb0ee385b8e7111476020d9c7e7b58 Mon Sep 17 00:00:00 2001 From: ManhNTX Date: Fri, 28 Oct 2022 18:46:19 +0700 Subject: [PATCH] TF-996: Previous / Next message when searching email --- .../get_email_content_interactor.dart | 51 ++++++++----------- .../email/presentation/email_controller.dart | 47 +++++++++++------ .../email/presentation/email_view.dart | 2 +- .../model/email_loaded.dart | 10 ++-- .../mailbox_dashboard_controller.dart | 1 + .../presentation/search_email_controller.dart | 3 +- 6 files changed, 61 insertions(+), 53 deletions(-) rename lib/features/email/{domain => presentation}/model/email_loaded.dart (80%) diff --git a/lib/features/email/domain/usecases/get_email_content_interactor.dart b/lib/features/email/domain/usecases/get_email_content_interactor.dart index 646ba8ae9..92dc0a600 100644 --- a/lib/features/email/domain/usecases/get_email_content_interactor.dart +++ b/lib/features/email/domain/usecases/get_email_content_interactor.dart @@ -4,7 +4,6 @@ import 'package:flutter/foundation.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/model.dart'; -import 'package:tmail_ui_user/features/email/domain/model/email_loaded.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/email/domain/state/get_email_content_state.dart'; @@ -13,41 +12,31 @@ class GetEmailContentInteractor { GetEmailContentInteractor(this.emailRepository); - Stream> execute(AccountId accountId, EmailId emailId, String? baseDownloadUrl, {EmailLoaded? emailLoaded}) async* { + Stream> execute(AccountId accountId, EmailId emailId, String? baseDownloadUrl) async* { try { yield Right(GetEmailContentLoading()); + final email = await emailRepository.getEmailContent(accountId, emailId); - if(emailLoaded != null) { - await Future.delayed(const Duration(milliseconds: 300)); + if (email.emailContentList.isNotEmpty) { + final newEmailContents = await emailRepository.transformEmailContent( + email.emailContentList, + email.allAttachments.listAttachmentsDisplayedInContent, + baseDownloadUrl, + accountId); + final newEmailContentsDisplayed = kIsWeb + ? await emailRepository.addTooltipWhenHoverOnLink(newEmailContents) + : newEmailContents; yield Right(GetEmailContentSuccess( - emailLoaded.emailContents, - emailLoaded.emailContentsDisplayed, - emailLoaded.attachments, - emailLoaded.emailCurrent)); + newEmailContents, + newEmailContentsDisplayed, + email.allAttachments, + email)); + } else if (email.allAttachments.isNotEmpty) { + yield Right(GetEmailContentSuccess([], [], email.allAttachments, email)); + } else if (email.headers?.isNotEmpty == true) { + yield Right(GetEmailContentSuccess([], [], [], email)); } else { - final email = await emailRepository.getEmailContent(accountId, emailId); - - if (email.emailContentList.isNotEmpty) { - final newEmailContents = await emailRepository.transformEmailContent( - email.emailContentList, - email.allAttachments.listAttachmentsDisplayedInContent, - baseDownloadUrl, - accountId); - final newEmailContentsDisplayed = kIsWeb - ? await emailRepository.addTooltipWhenHoverOnLink(newEmailContents) - : newEmailContents; - yield Right(GetEmailContentSuccess( - newEmailContents, - newEmailContentsDisplayed, - email.allAttachments, - email)); - } else if (email.allAttachments.isNotEmpty) { - yield Right(GetEmailContentSuccess([], [], email.allAttachments, email)); - } else if (email.headers?.isNotEmpty == true) { - yield Right(GetEmailContentSuccess([], [], [], email)); - } else { - yield Left(GetEmailContentFailure(null)); - } + yield Left(GetEmailContentFailure(null)); } } catch (e) { log('GetEmailContentInteractor::execute(): exception = $e'); diff --git a/lib/features/email/presentation/email_controller.dart b/lib/features/email/presentation/email_controller.dart index ddf1507b2..5ce1df24a 100644 --- a/lib/features/email/presentation/email_controller.dart +++ b/lib/features/email/presentation/email_controller.dart @@ -6,6 +6,7 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; import 'package:dio/dio.dart'; import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -27,7 +28,7 @@ import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart'; import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart'; -import 'package:tmail_ui_user/features/email/domain/model/email_loaded.dart'; +import 'package:tmail_ui_user/features/email/presentation/model/email_loaded.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_action.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart'; import 'package:tmail_ui_user/features/email/domain/model/send_receipt_to_sender_request.dart'; @@ -57,6 +58,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/down import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/datetime_extension.dart'; +import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; @@ -107,6 +109,10 @@ class EmailController extends BaseController with AppLoaderMixin { bool get isDisplayFullAttachments => attachmentsExpandMode.value == ExpandMode.EXPAND; + RxList get listEmail => mailboxDashBoardController.searchController.isSearchEmailRunning && !kIsWeb ? + mailboxDashBoardController.listResultSearch : mailboxDashBoardController.emailsInCurrentMailbox; + + EmailController( this._getEmailContentInteractor, this._markAsEmailReadInteractor, @@ -147,8 +153,8 @@ class EmailController extends BaseController with AppLoaderMixin { super.onClose(); } - void _setCurrentPositionEmailInListEmail() { - currentIndexPageView = mailboxDashBoardController.emailsInCurrentMailbox.indexOf(mailboxDashBoardController.selectedEmail.value); + void _setCurrentPositionEmailInListEmail(EmailId? currentEmailId) { + currentIndexPageView = listEmail.indexWhere((e) => e.id == currentEmailId); if(pageController != null && pageController!.hasClients && pageController!.page?.toInt() != currentIndexPageView) { pageController!.jumpToPage(currentIndexPageView); } else { @@ -158,12 +164,12 @@ class EmailController extends BaseController with AppLoaderMixin { } void onPageChanged(int index) { - mailboxDashBoardController.selectedEmail.value = mailboxDashBoardController.emailsInCurrentMailbox[index]; + mailboxDashBoardController.selectedEmail.value = listEmail[index]; } void _checkEnableNavigatorPageView() { canGetNewerEmail.value = currentIndexPageView > 0; - canGetOlderEmail.value = mailboxDashBoardController.emailsInCurrentMailbox.length > 1 && currentIndexPageView < mailboxDashBoardController.emailsInCurrentMailbox.length - 1; + canGetOlderEmail.value = listEmail.length > 1 && currentIndexPageView < listEmail.length - 1; } void getNewerEmail() { @@ -180,9 +186,9 @@ class EmailController extends BaseController with AppLoaderMixin { emailWorker = ever(mailboxDashBoardController.selectedEmail, (presentationEmail) { log('EmailController::_initWorker(): $presentationEmail'); if (presentationEmail is PresentationEmail) { - _setCurrentPositionEmailInListEmail(); if (_currentEmailId != presentationEmail.id) { _currentEmailId = presentationEmail.id; + _setCurrentPositionEmailInListEmail(_currentEmailId); _resetToOriginalValue(); _getEmailContentAction(presentationEmail.id); if (!presentationEmail.hasRead) { @@ -260,13 +266,19 @@ class EmailController extends BaseController with AppLoaderMixin { void _getEmailContentAction(EmailId emailId) async { final accountId = mailboxDashBoardController.accountId.value; final baseDownloadUrl = mailboxDashBoardController.sessionCurrent?.getDownloadUrl(); - final listEmailIdLoaded = presentationEmailsLoaded.map((e) => e.emailCurrent!.id).toList(); + final currentEmail = presentationEmailsLoaded.where((e) => e.emailCurrent!.id == emailId); EmailLoaded? emailLoaded; - if(listEmailIdLoaded.contains(_currentEmailId)) { - emailLoaded = presentationEmailsLoaded.firstWhere((e) => e.emailCurrent!.id == _currentEmailId); - } - if (accountId != null && baseDownloadUrl != null) { - consumeState(_getEmailContentInteractor.execute(accountId, emailId, baseDownloadUrl, emailLoaded: emailLoaded)); + if(currentEmail.isNotEmpty) { + emailLoaded = currentEmail.first; + dispatchState(Right(GetEmailContentLoading())); + await Future.delayed(const Duration(milliseconds: 300)); + consumeState(Stream.value(Right(GetEmailContentSuccess( + emailLoaded.emailContents, + emailLoaded.emailContentsDisplayed, + emailLoaded.attachments, + emailLoaded.emailCurrent)))); + } else if (accountId != null && baseDownloadUrl != null) { + consumeState(_getEmailContentInteractor.execute(accountId, emailId, baseDownloadUrl)); } } @@ -306,11 +318,16 @@ class EmailController extends BaseController with AppLoaderMixin { } void _getEmailContentSuccess(GetEmailContentSuccess success) { - if(presentationEmailsLoaded.length > 100) { + if(presentationEmailsLoaded.length > ThreadConstants.defaultLimit.value.toInt()) { 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); + final emailLoaded = EmailLoaded( + success.emailContents.toList(), + success.emailContentsDisplayed.toList(), + success.attachments.toList(), + success.emailCurrent, + ); + presentationEmailsLoaded.removeWhere((e) => e == emailLoaded); presentationEmailsLoaded.add(emailLoaded); emailContents.value = success.emailContentsDisplayed; initialEmailContents = success.emailContents; diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index fb75fc12b..fe88983db 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.emailsInCurrentMailbox.length, + itemCount: controller.listEmail.length, controller: controller.pageController, onPageChanged: controller.onPageChanged, itemBuilder: (context, _) { diff --git a/lib/features/email/domain/model/email_loaded.dart b/lib/features/email/presentation/model/email_loaded.dart similarity index 80% rename from lib/features/email/domain/model/email_loaded.dart rename to lib/features/email/presentation/model/email_loaded.dart index 9afa427f8..a35f15b1f 100644 --- a/lib/features/email/domain/model/email_loaded.dart +++ b/lib/features/email/presentation/model/email_loaded.dart @@ -9,11 +9,11 @@ class EmailLoaded with EquatableMixin { final Email? emailCurrent; EmailLoaded( - this.emailContents, - this.emailContentsDisplayed, - this.attachments, - this.emailCurrent - ); + this.emailContents, + this.emailContentsDisplayed, + this.attachments, + this.emailCurrent, + ); @override List get props => [ 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 4b361b4b1..fcef73680 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -127,6 +127,7 @@ class MailboxDashBoardController extends ReloadableController { Map mapDefaultMailboxIdByRole = {}; Map mapMailboxById = {}; final emailsInCurrentMailbox = [].obs; + final listResultSearch = RxList(); PresentationMailbox? outboxMailbox; RouterArguments? routerArguments; diff --git a/lib/features/search/presentation/search_email_controller.dart b/lib/features/search/presentation/search_email_controller.dart index 748b8545e..19622f26e 100644 --- a/lib/features/search/presentation/search_email_controller.dart +++ b/lib/features/search/presentation/search_email_controller.dart @@ -71,7 +71,6 @@ class SearchEmailController extends BaseController final currentSearchText = RxString(''); final listRecentSearch = RxList(); final listSuggestionSearch = RxList(); - final listResultSearch = RxList(); final simpleSearchFilter = Rx(SimpleSearchFilter()); final searchIsRunning = RxBool(false); final emailReceiveTimeType = Rxn(); @@ -92,6 +91,8 @@ class SearchEmailController extends BaseController SearchQuery? get searchQuery => simpleSearchFilter.value.text; + RxList get listResultSearch => mailboxDashBoardController.listResultSearch; + SearchEmailController( this._quickSearchEmailInteractor, this._saveRecentSearchInteractor,