From 50bf856688dabab913fa9cea35a86c0232783922 Mon Sep 17 00:00:00 2001 From: dab246 Date: Mon, 4 Oct 2021 13:36:42 +0700 Subject: [PATCH] TF-103 [BUG] Given a mail in sent box, i open it, click reply, it sends it to myself --- .../presentation/composer_controller.dart | 36 +++++++++++-------- .../composer/presentation/composer_view.dart | 2 +- .../email/presentation/email_controller.dart | 1 + .../model/composer_arguments.dart | 3 ++ .../list_email_address_extension.dart | 9 +++++ .../presentation_email_extension.dart | 32 +++++++++++++++-- 6 files changed, 65 insertions(+), 18 deletions(-) diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index 9b5c80155..c83a7160d 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -47,7 +47,6 @@ class ComposerController extends BaseController { final expandMode = ExpandMode.COLLAPSE.obs; final composerArguments = Rxn(); final isEnableEmailSendButton = false.obs; - final listReplyToEmailAddress = [].obs; final attachments = [].obs; final SendEmailInteractor _sendEmailInteractor; @@ -177,17 +176,28 @@ class ComposerController extends BaseController { } void _initToEmailAddress() { - if (composerArguments.value != null - && composerArguments.value?.presentationEmail != null - && composerArguments.value?.emailActionType == EmailActionType.reply) { - final replyToEmailAddress = composerArguments.value!.presentationEmail?.replyTo; - final fromEmailAddress = composerArguments.value!.presentationEmail?.from; - if (replyToEmailAddress != null && replyToEmailAddress.isNotEmpty) { - listReplyToEmailAddress.value = replyToEmailAddress.toList(); - } else if (fromEmailAddress != null && fromEmailAddress.isNotEmpty) { - listReplyToEmailAddress.value = fromEmailAddress.toList(); + if (composerArguments.value != null && composerArguments.value?.presentationEmail != null) { + final userEmailAddress = EmailAddress(null, composerArguments.value!.userProfile.email); + + final recipients = composerArguments.value!.presentationEmail!.generateRecipientsEmailAddressForComposer( + composerArguments.value?.emailActionType, + composerArguments.value?.mailboxRole); + + if (composerArguments.value?.mailboxRole == PresentationMailbox.roleSent) { + listToEmailAddress = recipients.value1; + listCcEmailAddress = recipients.value2; + listBccEmailAddress = recipients.value3; + } else { + listToEmailAddress = recipients.value1.toSet().filterEmailAddress(userEmailAddress); + listCcEmailAddress = recipients.value2.toSet().filterEmailAddress(userEmailAddress); + listBccEmailAddress = recipients.value3.toSet().filterEmailAddress(userEmailAddress); + } + + if (listCcEmailAddress.isNotEmpty || listBccEmailAddress.isNotEmpty) { + expandMode.value = ExpandMode.EXPAND; + } else { + expandMode.value = ExpandMode.COLLAPSE; } - listToEmailAddress = listReplyToEmailAddress; } _updateStatusEmailSendButton(); } @@ -196,7 +206,6 @@ class ComposerController extends BaseController { switch(prefixEmailAddress) { case PrefixEmailAddress.to: listToEmailAddress = newListEmailAddress; - listReplyToEmailAddress.clear(); break; case PrefixEmailAddress.cc: listCcEmailAddress = newListEmailAddress; @@ -211,8 +220,7 @@ class ComposerController extends BaseController { void _updateStatusEmailSendButton() { if (listToEmailAddress.isNotEmpty || listBccEmailAddress.isNotEmpty - || listCcEmailAddress.isNotEmpty - || listReplyToEmailAddress.isNotEmpty) { + || listCcEmailAddress.isNotEmpty) { isEnableEmailSendButton.value = true; } else { isEnableEmailSendButton.value = false; diff --git a/lib/features/composer/presentation/composer_view.dart b/lib/features/composer/presentation/composer_view.dart index e2fb37a12..917a57c70 100644 --- a/lib/features/composer/presentation/composer_view.dart +++ b/lib/features/composer/presentation/composer_view.dart @@ -110,7 +110,7 @@ class ComposerView extends GetWidget { context, imagePaths, controller.expandMode.value, - controller.listReplyToEmailAddress.isNotEmpty ? controller.listReplyToEmailAddress : controller.listToEmailAddress, + controller.listToEmailAddress, controller.listCcEmailAddress, controller.listBccEmailAddress, controller.composerArguments.value?.userProfile) diff --git a/lib/features/email/presentation/email_controller.dart b/lib/features/email/presentation/email_controller.dart index 47ffbf8cb..eadc73be2 100644 --- a/lib/features/email/presentation/email_controller.dart +++ b/lib/features/email/presentation/email_controller.dart @@ -341,6 +341,7 @@ class EmailController extends BaseController { emailActionType: emailActionType, presentationEmail: mailboxDashBoardController.selectedEmail.value!, emailContent: emailContent.value, + mailboxRole: mailboxDashBoardController.selectedMailbox.value?.role, session: mailboxDashBoardController.sessionCurrent!, userProfile: mailboxDashBoardController.userProfile.value!, mapMailboxId: mailboxDashBoardController.mapMailboxId)); diff --git a/lib/features/email/presentation/model/composer_arguments.dart b/lib/features/email/presentation/model/composer_arguments.dart index fb5199be8..e57fda001 100644 --- a/lib/features/email/presentation/model/composer_arguments.dart +++ b/lib/features/email/presentation/model/composer_arguments.dart @@ -11,11 +11,13 @@ class ComposerArguments with EquatableMixin { final Session session; final UserProfile userProfile; final Map mapMailboxId; + final Role? mailboxRole; ComposerArguments({ this.emailActionType = EmailActionType.compose, this.presentationEmail, this.emailContent, + this.mailboxRole, required this.session, required this.userProfile, required this.mapMailboxId, @@ -26,6 +28,7 @@ class ComposerArguments with EquatableMixin { emailActionType, presentationEmail, emailContent, + mailboxRole, session, userProfile, mapMailboxId, diff --git a/model/lib/extensions/list_email_address_extension.dart b/model/lib/extensions/list_email_address_extension.dart index 38b46f714..4b1386cd6 100644 --- a/model/lib/extensions/list_email_address_extension.dart +++ b/model/lib/extensions/list_email_address_extension.dart @@ -6,6 +6,8 @@ extension ListEmailAddressExtension on Set? { List? getListAddress() => this?.map((emailAddress) => emailAddress.getEmail()).toList(); + List asList() => this != null ? this!.toList() : List.empty(); + List getListEmailAddress({ExpandMode expandMode = ExpandMode.EXPAND, int limitAddress = 1, bool isFullEmailAddress = false}) { if (this != null) { if (expandMode == ExpandMode.EXPAND) { @@ -24,4 +26,11 @@ extension ListEmailAddressExtension on Set? { } int numberEmailAddress() => this != null ? this!.length : 0; + + List filterEmailAddress(EmailAddress emailAddressNotExist) { + return this != null + ? this!.where((emailAddress) => emailAddress.email != emailAddressNotExist.email) + .toList() + : List.empty(); + } } \ No newline at end of file diff --git a/model/lib/extensions/presentation_email_extension.dart b/model/lib/extensions/presentation_email_extension.dart index 942ca123c..6cb64be1c 100644 --- a/model/lib/extensions/presentation_email_extension.dart +++ b/model/lib/extensions/presentation_email_extension.dart @@ -1,5 +1,8 @@ import 'package:core/core.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:dartz/dartz.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; +import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:model/model.dart'; extension PresentationEmailExtension on PresentationEmail { @@ -18,7 +21,7 @@ extension PresentationEmailExtension on PresentationEmail { PresentationEmail toggleSelect() { return PresentationEmail( - id, + this.id, keywords: keywords, size: size, receivedAt: receivedAt, @@ -37,7 +40,7 @@ extension PresentationEmailExtension on PresentationEmail { PresentationEmail toSelectedEmail({required SelectMode selectMode}) { return PresentationEmail( - id, + this.id, keywords: keywords, size: size, receivedAt: receivedAt, @@ -56,7 +59,7 @@ extension PresentationEmailExtension on PresentationEmail { Email toEmail() { return Email( - id, + this.id, keywords: keywords, size: size, receivedAt: receivedAt, @@ -75,4 +78,27 @@ extension PresentationEmailExtension on PresentationEmail { String recipientsName() { return to.listEmailAddressToString() + cc.listEmailAddressToString() + bcc.listEmailAddressToString(); } + + Tuple3, List, List> generateRecipientsEmailAddressForComposer( + EmailActionType? emailActionType, + Role? mailboxRole + ) { + switch(emailActionType) { + case EmailActionType.reply: + if (mailboxRole == PresentationMailbox.roleSent) { + return Tuple3(to.asList(), [], []); + } else { + final replyToAddress = replyTo.asList().isNotEmpty ? replyTo.asList() : from.asList(); + return Tuple3(replyToAddress, [], []); + } + case EmailActionType.replyAll: + if (mailboxRole == PresentationMailbox.roleSent) { + return Tuple3(to.asList(), cc.asList(), bcc.asList()); + } else { + return Tuple3(to.asList() + from.asList(), cc.asList(), bcc.asList()); + } + default: + return Tuple3([], [], []); + } + } } \ No newline at end of file