From 02789d527f15d44bc560c78b90cc6e4da8cce218 Mon Sep 17 00:00:00 2001 From: dab246 Date: Wed, 19 Oct 2022 16:21:15 +0700 Subject: [PATCH] TF-657 Add `headers` and `keywords` property when get email content --- .../email/data/network/email_api.dart | 20 ++++++++----------- .../domain/state/get_email_content_state.dart | 15 ++++++++++++-- .../get_email_content_interactor.dart | 18 +++++++++++++++-- model/lib/email/email_property.dart | 5 +++++ model/lib/extensions/email_extension.dart | 6 ++++++ .../list_email_header_extension.dart | 14 +++++++++++++ model/lib/model.dart | 1 + 7 files changed, 63 insertions(+), 16 deletions(-) create mode 100644 model/lib/extensions/list_email_header_extension.dart diff --git a/lib/features/email/data/network/email_api.dart b/lib/features/email/data/network/email_api.dart index 4f60d1ff7..1b95b7d0c 100644 --- a/lib/features/email/data/network/email_api.dart +++ b/lib/features/email/data/network/email_api.dart @@ -27,17 +27,7 @@ import 'package:jmap_dart_client/jmap/mail/email/submission/envelope.dart'; import 'package:jmap_dart_client/jmap/mail/email/submission/set/set_email_submission_method.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/set/set_mailbox_method.dart'; -import 'package:model/account/account_request.dart'; -import 'package:model/account/authentication_type.dart'; -import 'package:model/download/download_task_id.dart'; -import 'package:model/email/attachment.dart'; -import 'package:model/email/mark_star_action.dart'; -import 'package:model/email/read_actions.dart'; -import 'package:model/extensions/email_extension.dart'; -import 'package:model/extensions/keyword_identifier_extension.dart'; -import 'package:model/extensions/list_email_id_extension.dart'; -import 'package:model/extensions/mailbox_id_extension.dart'; -import 'package:model/oidc/token.dart'; +import 'package:model/model.dart'; import 'package:path_provider/path_provider.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart'; @@ -60,7 +50,13 @@ class EmailAPI { final getEmailMethod = GetEmailMethod(accountId) ..addIds({emailId.id}) - ..addProperties(Properties({'bodyValues', 'htmlBody', 'attachments'})) + ..addProperties(Properties({ + EmailProperty.bodyValues, + EmailProperty.htmlBody, + EmailProperty.attachments, + EmailProperty.headers, + EmailProperty.keywords + })) ..addFetchHTMLBodyValues(true); final getEmailInvocation = jmapRequestBuilder.invocation(getEmailMethod); diff --git a/lib/features/email/domain/state/get_email_content_state.dart b/lib/features/email/domain/state/get_email_content_state.dart index e2ba3da6f..d7d19c85a 100644 --- a/lib/features/email/domain/state/get_email_content_state.dart +++ b/lib/features/email/domain/state/get_email_content_state.dart @@ -13,11 +13,22 @@ class GetEmailContentSuccess extends UIState { final List emailContents; final List emailContentsDisplayed; final List attachments; + final bool readReceiptRequested; - GetEmailContentSuccess(this.emailContents, this.emailContentsDisplayed, this.attachments); + GetEmailContentSuccess( + this.emailContents, + this.emailContentsDisplayed, + this.attachments, + this.readReceiptRequested + ); @override - List get props => [emailContents, emailContentsDisplayed, attachments]; + List get props => [ + emailContents, + emailContentsDisplayed, + attachments, + readReceiptRequested + ]; } class GetEmailContentFailure extends FeatureFailure { 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 dc3f49a78..90fafd256 100644 --- a/lib/features/email/domain/usecases/get_email_content_interactor.dart +++ b/lib/features/email/domain/usecases/get_email_content_interactor.dart @@ -26,9 +26,23 @@ class GetEmailContentInteractor { final newEmailContentsDisplayed = kIsWeb ? await emailRepository.addTooltipWhenHoverOnLink(newEmailContents) : newEmailContents; - yield Right(GetEmailContentSuccess(newEmailContents, newEmailContentsDisplayed, email.allAttachments)); + yield Right(GetEmailContentSuccess( + newEmailContents, + newEmailContentsDisplayed, + email.allAttachments, + email.needShowNotificationMessageReadReceipt)); } else if (email.allAttachments.isNotEmpty) { - yield Right(GetEmailContentSuccess([], [], email.allAttachments)); + yield Right(GetEmailContentSuccess( + [], + [], + email.allAttachments, + email.needShowNotificationMessageReadReceipt)); + } else if (email.headers?.isNotEmpty == true) { + yield Right(GetEmailContentSuccess( + [], + [], + [], + email.needShowNotificationMessageReadReceipt)); } else { yield Left(GetEmailContentFailure(null)); } diff --git a/model/lib/email/email_property.dart b/model/lib/email/email_property.dart index 03359299b..cfb7010f7 100644 --- a/model/lib/email/email_property.dart +++ b/model/lib/email/email_property.dart @@ -14,4 +14,9 @@ class EmailProperty { static const String bcc = 'bcc'; static const String replyTo = 'replyTo'; static const String mailboxIds = 'mailboxIds'; + static const String bodyValues = 'bodyValues'; + static const String htmlBody = 'htmlBody'; + static const String attachments = 'attachments'; + static const String headers = 'headers'; + static final String headerMdnKey = 'Disposition-Notification-To'; } \ No newline at end of file diff --git a/model/lib/extensions/email_extension.dart b/model/lib/extensions/email_extension.dart index 33b34640e..755600915 100644 --- a/model/lib/extensions/email_extension.dart +++ b/model/lib/extensions/email_extension.dart @@ -13,8 +13,14 @@ extension EmailExtension on Email { bool get hasStarred => keywords?.containsKey(KeyWordIdentifier.emailFlagged) == true; + bool get hasMdnSent => keywords?.containsKey(KeyWordIdentifier.mdnSent) == true; + bool get withAttachments => hasAttachment == true; + bool get needShowNotificationMessageReadReceipt { + return !hasMdnSent && headers.readReceiptHasBeenRequested; + } + Set getRecipientEmailAddressList() { final listEmailAddress = Set(); final listToAddress = to.getListAddress() ?? []; diff --git a/model/lib/extensions/list_email_header_extension.dart b/model/lib/extensions/list_email_header_extension.dart new file mode 100644 index 000000000..039b3c996 --- /dev/null +++ b/model/lib/extensions/list_email_header_extension.dart @@ -0,0 +1,14 @@ + +import 'package:jmap_dart_client/jmap/mail/email/email_header.dart'; +import 'package:model/email/email_property.dart'; + +extension ListEmailHeaderExtension on Set? { + bool get readReceiptHasBeenRequested { + try { + final headerMdn = this?.firstWhere((header) => header.name == EmailProperty.headerMdnKey); + return headerMdn != null; + } catch (e) { + return false; + } + } +} \ No newline at end of file diff --git a/model/lib/model.dart b/model/lib/model.dart index 500367399..996753a92 100644 --- a/model/lib/model.dart +++ b/model/lib/model.dart @@ -52,6 +52,7 @@ export 'extensions/session_extension.dart'; export 'extensions/user_profile_extension.dart'; export 'extensions/utc_date_extension.dart'; export 'extensions/email_filter_condition_extension.dart'; +export 'extensions/list_email_header_extension.dart'; // Identity export 'identity/identity_request_dto.dart'; export 'mailbox/expand_mode.dart';