TF-996: add email_parent_controller.dart

This commit is contained in:
ManhNTX
2022-10-31 23:41:32 +07:00
committed by Dat H. Pham
parent b652f17acc
commit e264880f9d
4 changed files with 105 additions and 70 deletions
@@ -1,12 +1,10 @@
import 'dart:async'; import 'dart:async';
import 'dart:collection';
import 'dart:io'; import 'dart:io';
import 'package:core/core.dart'; import 'package:core/core.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_svg/flutter_svg.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/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/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/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/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_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/move_to_mailbox_request.dart';
@@ -69,6 +68,7 @@ import 'package:uuid/uuid.dart';
class EmailController extends BaseController with AppLoaderMixin { class EmailController extends BaseController with AppLoaderMixin {
final mailboxDashBoardController = Get.find<MailboxDashBoardController>(); final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
final emailParentController = Get.find<EmailParentController>();
final responsiveUtils = Get.find<ResponsiveUtils>(); final responsiveUtils = Get.find<ResponsiveUtils>();
final imagePaths = Get.find<ImagePaths>(); final imagePaths = Get.find<ImagePaths>();
final _appToast = Get.find<AppToast>(); final _appToast = Get.find<AppToast>();
@@ -99,25 +99,16 @@ class EmailController extends BaseController with AppLoaderMixin {
const Duration(milliseconds: 800), const Duration(milliseconds: 800),
initialValue: null, initialValue: null,
); );
final Queue<EmailLoaded> presentationEmailsLoaded = Queue();
PageController? pageController;
int currentIndexPageView = -1;
final canGetNewerEmail = true.obs;
final canGetOlderEmail = true.obs;
final StreamController<Either<Failure, Success>> _downloadProgressStateController = final StreamController<Either<Failure, Success>> _downloadProgressStateController =
StreamController<Either<Failure, Success>>.broadcast(); StreamController<Either<Failure, Success>>.broadcast();
Stream<Either<Failure, Success>> get downloadProgressState => _downloadProgressStateController.stream; Stream<Either<Failure, Success>> 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 isDisplayFullEmailAddress => emailAddressExpandMode.value == ExpandMode.EXPAND;
bool get isDisplayFullAttachments => attachmentsExpandMode.value == ExpandMode.EXPAND; bool get isDisplayFullAttachments => attachmentsExpandMode.value == ExpandMode.EXPAND;
RxList<PresentationEmail> get listEmail => mailboxDashBoardController.searchController.isSearchEmailRunning && !kIsWeb ?
mailboxDashBoardController.listResultSearch : mailboxDashBoardController.emailsInCurrentMailbox;
EmailController( EmailController(
this._getEmailContentInteractor, this._getEmailContentInteractor,
this._markAsEmailReadInteractor, this._markAsEmailReadInteractor,
@@ -141,8 +132,9 @@ class EmailController extends BaseController with AppLoaderMixin {
@override @override
void onReady() { void onReady() {
injectMdnBindings( injectMdnBindings(
mailboxDashBoardController.sessionCurrent, emailParentController.sessionCurrent,
mailboxDashBoardController.accountId.value); emailParentController.accountId,
);
try { try {
_sendReceiptToSenderInteractor = Get.find<SendReceiptToSenderInteractor>(); _sendReceiptToSenderInteractor = Get.find<SendReceiptToSenderInteractor>();
} catch (e) { } catch (e) {
@@ -154,57 +146,27 @@ class EmailController extends BaseController with AppLoaderMixin {
@override @override
void onClose() { void onClose() {
_downloadProgressStateController.close(); _downloadProgressStateController.close();
pageController?.dispose();
_getEmailDeBouncer.cancel(); _getEmailDeBouncer.cancel();
_clearWorker(); _clearWorker();
super.onClose(); 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() { void _initializeDebounceTimeIndexPageViewChange() {
_getEmailDeBouncer.values.listen((value) async { _getEmailDeBouncer.values.listen((value) async {
if(value !=null) { if(value !=null) {
_getEmailContentAction(listEmail[value].id); _getEmailContentAction(emailParentController.listEmail[value].id);
} }
}); });
} }
void _initWorker() { void _initWorker() {
emailWorker = ever(mailboxDashBoardController.selectedEmail, (presentationEmail) { emailWorker = ever(emailParentController.selectedEmail, (presentationEmail) {
log('EmailController::_initWorker(): $presentationEmail'); log('EmailController::_initWorker(): $presentationEmail');
if (presentationEmail is PresentationEmail) { if (presentationEmail is PresentationEmail) {
if (_currentEmailId != presentationEmail.id) { if (_currentEmailId != presentationEmail.id) {
_currentEmailId = presentationEmail.id; _currentEmailId = presentationEmail.id;
_setCurrentPositionEmailInListEmail(_currentEmailId); emailParentController.setCurrentPositionEmailInListEmail(_currentEmailId);
_getEmailDeBouncer.value = currentIndexPageView; _getEmailDeBouncer.value = emailParentController.currentIndexPageView;
_resetToOriginalValue(); _resetToOriginalValue();
if (!presentationEmail.hasRead) { if (!presentationEmail.hasRead) {
markAsEmailRead(presentationEmail, ReadActions.markAsRead); markAsEmailRead(presentationEmail, ReadActions.markAsRead);
@@ -228,7 +190,7 @@ class EmailController extends BaseController with AppLoaderMixin {
(failure) => null, (failure) => null,
(success) { (success) {
if (success is StartDownloadAttachmentForWeb) { if (success is StartDownloadAttachmentForWeb) {
mailboxDashBoardController.addDownloadTask( emailParentController.mailboxDashBoardController.addDownloadTask(
DownloadTaskState( DownloadTaskState(
taskId: success.taskId, taskId: success.taskId,
attachment: success.attachment)); attachment: success.attachment));
@@ -243,7 +205,7 @@ class EmailController extends BaseController with AppLoaderMixin {
final percent = success.progress.round(); final percent = success.progress.round();
log('EmailController::DownloadingAttachmentForWeb(): $percent%'); log('EmailController::DownloadingAttachmentForWeb(): $percent%');
mailboxDashBoardController.updateDownloadTask( emailParentController.mailboxDashBoardController.updateDownloadTask(
success.taskId, success.taskId,
(currentTask) { (currentTask) {
final newTask = currentTask.copyWith( final newTask = currentTask.copyWith(
@@ -259,7 +221,7 @@ class EmailController extends BaseController with AppLoaderMixin {
} }
void _getAllIdentities() { void _getAllIdentities() {
final accountId = mailboxDashBoardController.accountId.value; final accountId = emailParentController.accountId;
if (accountId != null) { if (accountId != null) {
consumeState(_getAllIdentitiesInteractor.execute(accountId)); consumeState(_getAllIdentitiesInteractor.execute(accountId));
} }
@@ -279,9 +241,9 @@ class EmailController extends BaseController with AppLoaderMixin {
} }
void _getEmailContentAction(EmailId emailId) async { void _getEmailContentAction(EmailId emailId) async {
final accountId = mailboxDashBoardController.accountId.value; final accountId = emailParentController.accountId;
final baseDownloadUrl = mailboxDashBoardController.sessionCurrent?.getDownloadUrl(); final baseDownloadUrl = emailParentController.sessionCurrent?.getDownloadUrl();
final currentEmail = presentationEmailsLoaded.where((e) => e.emailCurrent!.id == emailId); final currentEmail = emailParentController.presentationEmailsLoaded.where((e) => e.emailCurrent!.id == emailId);
EmailLoaded? emailLoaded; EmailLoaded? emailLoaded;
if(currentEmail.isNotEmpty) { if(currentEmail.isNotEmpty) {
emailLoaded = currentEmail.first; emailLoaded = currentEmail.first;
@@ -333,8 +295,8 @@ class EmailController extends BaseController with AppLoaderMixin {
} }
void _getEmailContentSuccess(GetEmailContentSuccess success) { void _getEmailContentSuccess(GetEmailContentSuccess success) {
if(presentationEmailsLoaded.length > ThreadConstants.defaultLimit.value.toInt()) { if(emailParentController.presentationEmailsLoaded.length > ThreadConstants.defaultLimit.value.toInt()) {
presentationEmailsLoaded.removeFirst(); emailParentController.presentationEmailsLoaded.removeFirst();
} }
final emailLoaded = EmailLoaded( final emailLoaded = EmailLoaded(
success.emailContents.toList(), success.emailContents.toList(),
@@ -342,8 +304,8 @@ class EmailController extends BaseController with AppLoaderMixin {
success.attachments.toList(), success.attachments.toList(),
success.emailCurrent, success.emailCurrent,
); );
presentationEmailsLoaded.removeWhere((e) => e.emailCurrent!.id == emailLoaded.emailCurrent!.id); emailParentController.presentationEmailsLoaded.removeWhere((e) => e.emailCurrent!.id == emailLoaded.emailCurrent!.id);
presentationEmailsLoaded.add(emailLoaded); emailParentController.presentationEmailsLoaded.add(emailLoaded);
if(success.emailCurrent?.id == mailboxDashBoardController.selectedEmail.value?.id) { if(success.emailCurrent?.id == mailboxDashBoardController.selectedEmail.value?.id) {
emailContents.value = success.emailContentsDisplayed; emailContents.value = success.emailContentsDisplayed;
initialEmailContents = success.emailContents; initialEmailContents = success.emailContents;
@@ -1004,8 +966,8 @@ class EmailController extends BaseController with AppLoaderMixin {
} }
void closeEmailView(BuildContext context) { void closeEmailView(BuildContext context) {
presentationEmailsLoaded.removeWhere((e) => e.emailCurrent?.id == currentEmail?.id); emailParentController.presentationEmailsLoaded.removeWhere((e) => e.emailCurrent?.id == currentEmail?.id);
currentIndexPageView = -1; emailParentController.currentIndexPageView = -1;
_getEmailDeBouncer.value = null; _getEmailDeBouncer.value = null;
mailboxDashBoardController.clearSelectedEmail(); mailboxDashBoardController.clearSelectedEmail();
_currentEmailId = null; _currentEmailId = null;
@@ -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<MailboxDashBoardController>();
final Queue<EmailLoaded> presentationEmailsLoaded = Queue();
PageController? pageController;
int currentIndexPageView = -1;
final canGetNewerEmail = true.obs;
final canGetOlderEmail = true.obs;
Rxn<PresentationEmail> get selectedEmail => mailboxDashBoardController.selectedEmail;
Session? get sessionCurrent => mailboxDashBoardController.sessionCurrent;
AccountId? get accountId => mailboxDashBoardController.accountId.value;
RxList<PresentationEmail> 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() {
}
}
@@ -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/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/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/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/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/authentication_oidc_datasource.dart';
import 'package:tmail_ui_user/features/login/data/datasource_impl/authentication_oidc_datasource_impl.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 @override
void bindingsController() { void bindingsController() {
Get.put(EmailParentController());
Get.put(EmailController( Get.put(EmailController(
Get.find<GetEmailContentInteractor>(), Get.find<GetEmailContentInteractor>(),
Get.find<MarkAsEmailReadInteractor>(), Get.find<MarkAsEmailReadInteractor>(),
@@ -8,7 +8,7 @@ import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:model/model.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/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/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/attachment_file_tile_builder.dart';
import 'package:tmail_ui_user/features/email/presentation/widgets/bottom_bar_mail_widget_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<EmailController> {
Expanded( Expanded(
child: PageView.builder( child: PageView.builder(
physics: kIsWeb ? const NeverScrollableScrollPhysics() : null, physics: kIsWeb ? const NeverScrollableScrollPhysics() : null,
itemCount: controller.listEmail.length, itemCount: controller.emailParentController.listEmail.length,
controller: controller.pageController, controller: controller.emailParentController.pageController,
onPageChanged: controller.onPageChanged, onPageChanged: controller.emailParentController.onPageChanged,
itemBuilder: (context, index) { itemBuilder: (context, index) {
return _buildEmailBody(context, controller.listEmail[index]); return _buildEmailBody(context, controller.emailParentController.listEmail[index]);
}), }),
), ),
const Divider(color: AppColor.colorDividerHorizontal, height: 1), const Divider(color: AppColor.colorDividerHorizontal, height: 1),
@@ -165,21 +165,21 @@ class EmailView extends GetWidget<EmailController> {
buildIconWeb( buildIconWeb(
icon: SvgPicture.asset( icon: SvgPicture.asset(
imagePaths.icNewer, imagePaths.icNewer,
color: controller.canGetNewerEmail.value ? AppColor.primaryColor : AppColor.colorAttachmentIcon, color: controller.emailParentController.canGetNewerEmail.value ? AppColor.primaryColor : AppColor.colorAttachmentIcon,
width: IconUtils.defaultIconSize, width: IconUtils.defaultIconSize,
height: IconUtils.defaultIconSize, height: IconUtils.defaultIconSize,
fit: BoxFit.fill), fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).newer, tooltip: AppLocalizations.of(context).newer,
onTap: controller.canGetNewerEmail.value ? controller.getNewerEmail : null), onTap: controller.emailParentController.canGetNewerEmail.value ? controller.emailParentController.getNewerEmail : null),
buildIconWeb( buildIconWeb(
icon: SvgPicture.asset( icon: SvgPicture.asset(
imagePaths.icOlder, imagePaths.icOlder,
width: IconUtils.defaultIconSize, width: IconUtils.defaultIconSize,
height: 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), fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).older, tooltip: AppLocalizations.of(context).older,
onTap: controller.canGetOlderEmail.value ? controller.getOlderEmail : null), onTap: controller.emailParentController.canGetOlderEmail.value ? controller.emailParentController.getOlderEmail : null),
]; ];
} }