From e264880f9d6f67995d0f9fdec7acddd3e9d5d84e Mon Sep 17 00:00:00 2001 From: ManhNTX Date: Mon, 31 Oct 2022 23:41:32 +0700 Subject: [PATCH] TF-996: add email_parent_controller.dart --- .../{ => controller}/email_controller.dart | 82 +++++-------------- .../controller/email_parent_controller.dart | 71 ++++++++++++++++ .../email/presentation/email_bindings.dart | 4 +- .../email/presentation/email_view.dart | 18 ++-- 4 files changed, 105 insertions(+), 70 deletions(-) rename lib/features/email/presentation/{ => controller}/email_controller.dart (93%) create mode 100644 lib/features/email/presentation/controller/email_parent_controller.dart diff --git a/lib/features/email/presentation/email_controller.dart b/lib/features/email/presentation/controller/email_controller.dart similarity index 93% rename from lib/features/email/presentation/email_controller.dart rename to lib/features/email/presentation/controller/email_controller.dart index 71ef1eec8..3428dde15 100644 --- a/lib/features/email/presentation/email_controller.dart +++ b/lib/features/email/presentation/controller/email_controller.dart @@ -1,12 +1,10 @@ import 'dart:async'; -import 'dart:collection'; import 'dart:io'; 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'; @@ -29,6 +27,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/presentation/controller/email_parent_controller.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'; @@ -69,6 +68,7 @@ import 'package:uuid/uuid.dart'; class EmailController extends BaseController with AppLoaderMixin { final mailboxDashBoardController = Get.find(); + final emailParentController = Get.find(); final responsiveUtils = Get.find(); final imagePaths = Get.find(); final _appToast = Get.find(); @@ -99,25 +99,16 @@ class EmailController extends BaseController with AppLoaderMixin { const Duration(milliseconds: 800), initialValue: null, ); - final Queue presentationEmailsLoaded = Queue(); - PageController? pageController; - int currentIndexPageView = -1; - final canGetNewerEmail = true.obs; - final canGetOlderEmail = true.obs; final StreamController> _downloadProgressStateController = StreamController>.broadcast(); Stream> get downloadProgressState => _downloadProgressStateController.stream; - PresentationEmail? get currentEmail => mailboxDashBoardController.selectedEmail.value; + PresentationEmail? get currentEmail => emailParentController.selectedEmail.value; bool get isDisplayFullEmailAddress => emailAddressExpandMode.value == ExpandMode.EXPAND; bool get isDisplayFullAttachments => attachmentsExpandMode.value == ExpandMode.EXPAND; - RxList get listEmail => mailboxDashBoardController.searchController.isSearchEmailRunning && !kIsWeb ? - mailboxDashBoardController.listResultSearch : mailboxDashBoardController.emailsInCurrentMailbox; - - EmailController( this._getEmailContentInteractor, this._markAsEmailReadInteractor, @@ -141,8 +132,9 @@ class EmailController extends BaseController with AppLoaderMixin { @override void onReady() { injectMdnBindings( - mailboxDashBoardController.sessionCurrent, - mailboxDashBoardController.accountId.value); + emailParentController.sessionCurrent, + emailParentController.accountId, + ); try { _sendReceiptToSenderInteractor = Get.find(); } catch (e) { @@ -154,57 +146,27 @@ class EmailController extends BaseController with AppLoaderMixin { @override void onClose() { _downloadProgressStateController.close(); - pageController?.dispose(); _getEmailDeBouncer.cancel(); _clearWorker(); super.onClose(); } - void _setCurrentPositionEmailInListEmail(EmailId? currentEmailId) { - currentIndexPageView = listEmail.indexWhere((e) => e.id == currentEmailId); - if(pageController != null && pageController!.hasClients && pageController!.page?.toInt() != currentIndexPageView) { - pageController!.jumpToPage(currentIndexPageView); - } else { - pageController = PageController(initialPage: currentIndexPageView); - } - _checkEnableNavigatorPageView(); - } - - void onPageChanged(int index) { - mailboxDashBoardController.selectedEmail.value = listEmail[index]; - } - - void _checkEnableNavigatorPageView() { - canGetNewerEmail.value = currentIndexPageView > 0; - canGetOlderEmail.value = listEmail.length > 1 && currentIndexPageView < listEmail.length - 1; - } - - void getNewerEmail() { - currentIndexPageView = currentIndexPageView - 1; - pageController?.jumpToPage(currentIndexPageView); - } - - void getOlderEmail() { - currentIndexPageView = currentIndexPageView + 1; - pageController?.jumpToPage(currentIndexPageView); - } - void _initializeDebounceTimeIndexPageViewChange() { _getEmailDeBouncer.values.listen((value) async { if(value !=null) { - _getEmailContentAction(listEmail[value].id); + _getEmailContentAction(emailParentController.listEmail[value].id); } }); } void _initWorker() { - emailWorker = ever(mailboxDashBoardController.selectedEmail, (presentationEmail) { + emailWorker = ever(emailParentController.selectedEmail, (presentationEmail) { log('EmailController::_initWorker(): $presentationEmail'); if (presentationEmail is PresentationEmail) { if (_currentEmailId != presentationEmail.id) { _currentEmailId = presentationEmail.id; - _setCurrentPositionEmailInListEmail(_currentEmailId); - _getEmailDeBouncer.value = currentIndexPageView; + emailParentController.setCurrentPositionEmailInListEmail(_currentEmailId); + _getEmailDeBouncer.value = emailParentController.currentIndexPageView; _resetToOriginalValue(); if (!presentationEmail.hasRead) { markAsEmailRead(presentationEmail, ReadActions.markAsRead); @@ -228,7 +190,7 @@ class EmailController extends BaseController with AppLoaderMixin { (failure) => null, (success) { if (success is StartDownloadAttachmentForWeb) { - mailboxDashBoardController.addDownloadTask( + emailParentController.mailboxDashBoardController.addDownloadTask( DownloadTaskState( taskId: success.taskId, attachment: success.attachment)); @@ -243,7 +205,7 @@ class EmailController extends BaseController with AppLoaderMixin { final percent = success.progress.round(); log('EmailController::DownloadingAttachmentForWeb(): $percent%'); - mailboxDashBoardController.updateDownloadTask( + emailParentController.mailboxDashBoardController.updateDownloadTask( success.taskId, (currentTask) { final newTask = currentTask.copyWith( @@ -259,7 +221,7 @@ class EmailController extends BaseController with AppLoaderMixin { } void _getAllIdentities() { - final accountId = mailboxDashBoardController.accountId.value; + final accountId = emailParentController.accountId; if (accountId != null) { consumeState(_getAllIdentitiesInteractor.execute(accountId)); } @@ -279,9 +241,9 @@ class EmailController extends BaseController with AppLoaderMixin { } void _getEmailContentAction(EmailId emailId) async { - final accountId = mailboxDashBoardController.accountId.value; - final baseDownloadUrl = mailboxDashBoardController.sessionCurrent?.getDownloadUrl(); - final currentEmail = presentationEmailsLoaded.where((e) => e.emailCurrent!.id == emailId); + final accountId = emailParentController.accountId; + final baseDownloadUrl = emailParentController.sessionCurrent?.getDownloadUrl(); + final currentEmail = emailParentController.presentationEmailsLoaded.where((e) => e.emailCurrent!.id == emailId); EmailLoaded? emailLoaded; if(currentEmail.isNotEmpty) { emailLoaded = currentEmail.first; @@ -333,8 +295,8 @@ class EmailController extends BaseController with AppLoaderMixin { } void _getEmailContentSuccess(GetEmailContentSuccess success) { - if(presentationEmailsLoaded.length > ThreadConstants.defaultLimit.value.toInt()) { - presentationEmailsLoaded.removeFirst(); + if(emailParentController.presentationEmailsLoaded.length > ThreadConstants.defaultLimit.value.toInt()) { + emailParentController.presentationEmailsLoaded.removeFirst(); } final emailLoaded = EmailLoaded( success.emailContents.toList(), @@ -342,8 +304,8 @@ class EmailController extends BaseController with AppLoaderMixin { success.attachments.toList(), success.emailCurrent, ); - presentationEmailsLoaded.removeWhere((e) => e.emailCurrent!.id == emailLoaded.emailCurrent!.id); - presentationEmailsLoaded.add(emailLoaded); + emailParentController.presentationEmailsLoaded.removeWhere((e) => e.emailCurrent!.id == emailLoaded.emailCurrent!.id); + emailParentController.presentationEmailsLoaded.add(emailLoaded); if(success.emailCurrent?.id == mailboxDashBoardController.selectedEmail.value?.id) { emailContents.value = success.emailContentsDisplayed; initialEmailContents = success.emailContents; @@ -1004,8 +966,8 @@ class EmailController extends BaseController with AppLoaderMixin { } void closeEmailView(BuildContext context) { - presentationEmailsLoaded.removeWhere((e) => e.emailCurrent?.id == currentEmail?.id); - currentIndexPageView = -1; + emailParentController.presentationEmailsLoaded.removeWhere((e) => e.emailCurrent?.id == currentEmail?.id); + emailParentController.currentIndexPageView = -1; _getEmailDeBouncer.value = null; mailboxDashBoardController.clearSelectedEmail(); _currentEmailId = null; diff --git a/lib/features/email/presentation/controller/email_parent_controller.dart b/lib/features/email/presentation/controller/email_parent_controller.dart new file mode 100644 index 000000000..35212d15e --- /dev/null +++ b/lib/features/email/presentation/controller/email_parent_controller.dart @@ -0,0 +1,71 @@ +import 'dart:collection'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:model/model.dart'; +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/email/presentation/model/email_loaded.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; + +class EmailParentController extends BaseController with AppLoaderMixin { + + final mailboxDashBoardController = Get.find(); + + final Queue presentationEmailsLoaded = Queue(); + PageController? pageController; + int currentIndexPageView = -1; + final canGetNewerEmail = true.obs; + final canGetOlderEmail = true.obs; + + Rxn get selectedEmail => mailboxDashBoardController.selectedEmail; + Session? get sessionCurrent => mailboxDashBoardController.sessionCurrent; + AccountId? get accountId => mailboxDashBoardController.accountId.value; + + RxList get listEmail => mailboxDashBoardController.searchController.isSearchEmailRunning && !kIsWeb ? + mailboxDashBoardController.listResultSearch : mailboxDashBoardController.emailsInCurrentMailbox; + + + @override + void onClose() { + pageController?.dispose(); + super.onClose(); + } + + void setCurrentPositionEmailInListEmail(EmailId? currentEmailId) { + currentIndexPageView = listEmail.indexWhere((e) => e.id == currentEmailId); + if(pageController != null && pageController!.hasClients && pageController!.page?.toInt() != currentIndexPageView) { + pageController!.jumpToPage(currentIndexPageView); + } else { + pageController = PageController(initialPage: currentIndexPageView); + } + _checkEnableNavigatorPageView(); + } + + void onPageChanged(int index) { + mailboxDashBoardController.selectedEmail.value = listEmail[index]; + } + + void _checkEnableNavigatorPageView() { + canGetNewerEmail.value = currentIndexPageView > 0; + canGetOlderEmail.value = listEmail.length > 1 && currentIndexPageView < listEmail.length - 1; + } + + void getNewerEmail() { + currentIndexPageView = currentIndexPageView - 1; + pageController?.jumpToPage(currentIndexPageView); + } + + void getOlderEmail() { + currentIndexPageView = currentIndexPageView + 1; + pageController?.jumpToPage(currentIndexPageView); + } + + @override + void onDone() { + } +} \ No newline at end of file diff --git a/lib/features/email/presentation/email_bindings.dart b/lib/features/email/presentation/email_bindings.dart index 25e21d245..18c49002f 100644 --- a/lib/features/email/presentation/email_bindings.dart +++ b/lib/features/email/presentation/email_bindings.dart @@ -17,7 +17,8 @@ import 'package:tmail_ui_user/features/email/domain/usecases/get_email_content_i import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_email_read_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_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/email_controller.dart'; +import 'package:tmail_ui_user/features/email/presentation/controller/email_controller.dart'; +import 'package:tmail_ui_user/features/email/presentation/controller/email_parent_controller.dart'; import 'package:tmail_ui_user/features/login/data/datasource/account_datasource.dart'; import 'package:tmail_ui_user/features/login/data/datasource/authentication_oidc_datasource.dart'; import 'package:tmail_ui_user/features/login/data/datasource_impl/authentication_oidc_datasource_impl.dart'; @@ -53,6 +54,7 @@ class EmailBindings extends BaseBindings { @override void bindingsController() { + Get.put(EmailParentController()); Get.put(EmailController( Get.find(), Get.find(), diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index f18f47475..2570e37c8 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -8,7 +8,7 @@ import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:model/model.dart'; import 'package:tmail_ui_user/features/composer/presentation/extensions/prefix_email_address_extension.dart'; -import 'package:tmail_ui_user/features/email/presentation/email_controller.dart'; +import 'package:tmail_ui_user/features/email/presentation/controller/email_controller.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/app_bar_mail_widget_builder.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/attachment_file_tile_builder.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/bottom_bar_mail_widget_builder.dart'; @@ -93,11 +93,11 @@ class EmailView extends GetWidget { Expanded( child: PageView.builder( physics: kIsWeb ? const NeverScrollableScrollPhysics() : null, - itemCount: controller.listEmail.length, - controller: controller.pageController, - onPageChanged: controller.onPageChanged, + itemCount: controller.emailParentController.listEmail.length, + controller: controller.emailParentController.pageController, + onPageChanged: controller.emailParentController.onPageChanged, itemBuilder: (context, index) { - return _buildEmailBody(context, controller.listEmail[index]); + return _buildEmailBody(context, controller.emailParentController.listEmail[index]); }), ), const Divider(color: AppColor.colorDividerHorizontal, height: 1), @@ -165,21 +165,21 @@ class EmailView extends GetWidget { buildIconWeb( icon: SvgPicture.asset( imagePaths.icNewer, - color: controller.canGetNewerEmail.value ? AppColor.primaryColor : AppColor.colorAttachmentIcon, + color: controller.emailParentController.canGetNewerEmail.value ? AppColor.primaryColor : AppColor.colorAttachmentIcon, width: IconUtils.defaultIconSize, height: IconUtils.defaultIconSize, fit: BoxFit.fill), tooltip: AppLocalizations.of(context).newer, - onTap: controller.canGetNewerEmail.value ? controller.getNewerEmail : null), + onTap: controller.emailParentController.canGetNewerEmail.value ? controller.emailParentController.getNewerEmail : null), buildIconWeb( icon: SvgPicture.asset( imagePaths.icOlder, width: IconUtils.defaultIconSize, height: IconUtils.defaultIconSize, - color: controller.canGetOlderEmail.value ? AppColor.primaryColor : AppColor.colorAttachmentIcon, + color: controller.emailParentController.canGetOlderEmail.value ? AppColor.primaryColor : AppColor.colorAttachmentIcon, fit: BoxFit.fill), tooltip: AppLocalizations.of(context).older, - onTap: controller.canGetOlderEmail.value ? controller.getOlderEmail : null), + onTap: controller.emailParentController.canGetOlderEmail.value ? controller.emailParentController.getOlderEmail : null), ]; }