From ee91963e53aa6ffdfbc0db4be11a043949dba041 Mon Sep 17 00:00:00 2001 From: dab246 Date: Wed, 15 Mar 2023 11:27:21 +0700 Subject: [PATCH] TF-1371 Update position of Identity in edit email (cherry picked from commit f0c6a5716cd55c963606550b09d4f5ec4b2140a5) --- .../transform_configuration.dart | 18 ++++++-- .../presentation/composer_controller.dart | 21 ++++++--- .../data/datasource/html_datasource.dart | 3 +- .../datasource_impl/html_datasource_impl.dart | 12 +++-- .../email/data/local/html_analyzer.dart | 30 ++++++++---- .../repository/email_repository_impl.dart | 9 +++- .../domain/repository/email_repository.dart | 3 +- .../get_email_content_interactor.dart | 46 +++++++++++++------ 8 files changed, 100 insertions(+), 42 deletions(-) diff --git a/core/lib/presentation/utils/html_transformer/transform_configuration.dart b/core/lib/presentation/utils/html_transformer/transform_configuration.dart index 228cb2065..e9c15b7ef 100644 --- a/core/lib/presentation/utils/html_transformer/transform_configuration.dart +++ b/core/lib/presentation/utils/html_transformer/transform_configuration.dart @@ -39,11 +39,13 @@ class TransformConfiguration { List? customTextTransformers }) { final domTransformers = (customDomTransformers != null && customDomTransformers.isNotEmpty) - ? [...customDomTransformers] - : [...standardDomTransformers]; + ? customDomTransformers + : standardDomTransformers; + final textTransformers = (customTextTransformers != null && customTextTransformers.isNotEmpty) - ? [...customTextTransformers] - : standardTextTransformers; + ? customTextTransformers + : standardTextTransformers; + return TransformConfiguration( domTransformers, textTransformers @@ -59,5 +61,13 @@ class TransformConfiguration { ImageTransformer(), ]; + static const List domTransformersForDraftEmail = [ + RemoveScriptTransformer(), + BlockQuotedTransformer(), + BlockCodeTransformer(), + AddTargetBlankInTagATransformer(), + ImageTransformer(), + ]; + static const List standardTextTransformers = []; } \ No newline at end of file diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index d805f5518..49b2fec18 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -1086,7 +1086,13 @@ class ComposerController extends BaseController { final accountId = mailboxDashBoardController.sessionCurrent?.accounts.keys.first; final emailId = arguments.presentationEmail?.id; if (emailId != null && baseDownloadUrl != null && accountId != null) { - consumeState(_getEmailContentInteractor.execute(accountId, emailId, baseDownloadUrl)); + consumeState(_getEmailContentInteractor.execute( + accountId, + emailId, + baseDownloadUrl, + composeEmail: true, + draftsEmail: arguments.presentationEmail?.isDraft ?? false + )); } } } @@ -1133,7 +1139,11 @@ class ComposerController extends BaseController { _updateTextForEditor(); screenDisplayMode.value = displayMode; _autoFocusFieldWhenLauncher(); - selectIdentity(identitySelected.value); + + Future.delayed( + const Duration(milliseconds: 500), + () => selectIdentity(identitySelected.value) + ); } void _updateTextForEditor() async { @@ -1340,19 +1350,16 @@ class ComposerController extends BaseController { _removeBccEmailAddressFromFormerIdentity(formerIdentity.bcc!); } - if (!_isMobileApp && newIdentity != formerIdentity) { + if (!_isMobileApp) { _removeSignature(); } } - // Add new identity if (newIdentity.bcc?.isNotEmpty == true) { await _applyBccEmailAddressFromIdentity(newIdentity.bcc!); } - if (!_isMobileApp - && newIdentity != formerIdentity - && newIdentity.signatureAsString.isNotEmpty == true) { + if (!_isMobileApp && newIdentity.signatureAsString.isNotEmpty == true) { _applySignature(newIdentity.signatureAsString.asSignatureHtml()); } diff --git a/lib/features/email/data/datasource/html_datasource.dart b/lib/features/email/data/datasource/html_datasource.dart index bcf7b6792..8cce703fb 100644 --- a/lib/features/email/data/datasource/html_datasource.dart +++ b/lib/features/email/data/datasource/html_datasource.dart @@ -4,7 +4,8 @@ import 'package:model/model.dart'; abstract class HtmlDataSource { Future transformEmailContent( EmailContent emailContent, - Map mapUrlDownloadCID + Map mapUrlDownloadCID, + {bool draftsEmail = false} ); Future addTooltipWhenHoverOnLink(EmailContent emailContent); diff --git a/lib/features/email/data/datasource_impl/html_datasource_impl.dart b/lib/features/email/data/datasource_impl/html_datasource_impl.dart index 4ae646578..992ac9a9d 100644 --- a/lib/features/email/data/datasource_impl/html_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/html_datasource_impl.dart @@ -14,11 +14,17 @@ class HtmlDataSourceImpl extends HtmlDataSource { @override Future transformEmailContent( - EmailContent emailContent, - Map? mapUrlDownloadCID + EmailContent emailContent, + Map? mapUrlDownloadCID, + {bool draftsEmail = false} ) { return Future.sync(() async { - return await _htmlAnalyzer.transformEmailContent(emailContent, mapUrlDownloadCID, _dioClient); + return await _htmlAnalyzer.transformEmailContent( + emailContent, + mapUrlDownloadCID, + _dioClient, + draftsEmail: draftsEmail + ); }).catchError(_exceptionThrower.throwException); } diff --git a/lib/features/email/data/local/html_analyzer.dart b/lib/features/email/data/local/html_analyzer.dart index 9517a38e3..e98423989 100644 --- a/lib/features/email/data/local/html_analyzer.dart +++ b/lib/features/email/data/local/html_analyzer.dart @@ -1,22 +1,34 @@ -import 'package:core/core.dart'; +import 'package:core/data/network/dio_client.dart'; +import 'package:core/presentation/utils/html_transformer/dom/add_tooltip_link_transformers.dart'; +import 'package:core/presentation/utils/html_transformer/html_transform.dart'; import 'package:core/presentation/utils/html_transformer/text/convert_url_string_to_html_links_transformers.dart'; -import 'package:model/model.dart'; +import 'package:core/presentation/utils/html_transformer/transform_configuration.dart'; +import 'package:model/email/email_content.dart'; +import 'package:model/email/email_content_type.dart'; class HtmlAnalyzer { Future transformEmailContent( - EmailContent emailContent, - Map? mapUrlDownloadCID, - DioClient dioClient + EmailContent emailContent, + Map? mapUrlDownloadCID, + DioClient dioClient, + {bool draftsEmail = false} ) async { switch(emailContent.type) { case EmailContentType.textHtml: final htmlTransform = HtmlTransform( - emailContent.content, - dioClient: dioClient, - mapUrlDownloadCID: mapUrlDownloadCID); - final htmlContent = await htmlTransform.transformToHtml(); + emailContent.content, + dioClient: dioClient, + mapUrlDownloadCID: mapUrlDownloadCID + ); + + final htmlContent = await htmlTransform.transformToHtml( + transformConfiguration: draftsEmail + ? TransformConfiguration.create(customDomTransformers: TransformConfiguration.domTransformersForDraftEmail) + : null + ); + return EmailContent(emailContent.type, htmlContent); case EmailContentType.textPlain: final htmlTransform = HtmlTransform(emailContent.content); diff --git a/lib/features/email/data/repository/email_repository_impl.dart b/lib/features/email/data/repository/email_repository_impl.dart index 5bb0d53cc..729dc4c1f 100644 --- a/lib/features/email/data/repository/email_repository_impl.dart +++ b/lib/features/email/data/repository/email_repository_impl.dart @@ -90,7 +90,8 @@ class EmailRepositoryImpl extends EmailRepository { List emailContents, List attachmentInlines, String? baseUrlDownload, - AccountId accountId + AccountId accountId, + {bool draftsEmail = false} ) async { final mapUrlDownloadCID = { for (var attachment in attachmentInlines) @@ -98,7 +99,11 @@ class EmailRepositoryImpl extends EmailRepository { }; return await Future.wait(emailContents .map((emailContent) async { - return await _htmlDataSource.transformEmailContent(emailContent, mapUrlDownloadCID); + return await _htmlDataSource.transformEmailContent( + emailContent, + mapUrlDownloadCID, + draftsEmail: draftsEmail + ); }) .toList()); } diff --git a/lib/features/email/domain/repository/email_repository.dart b/lib/features/email/domain/repository/email_repository.dart index db79b31c2..2828f6cf7 100644 --- a/lib/features/email/domain/repository/email_repository.dart +++ b/lib/features/email/domain/repository/email_repository.dart @@ -55,7 +55,8 @@ abstract class EmailRepository { List emailContents, List attachmentInlines, String? baseUrlDownload, - AccountId accountId + AccountId accountId, + {bool draftsEmail = false} ); Future> addTooltipWhenHoverOnLink(List emailContents); 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 92dc0a600..4a23bfe2d 100644 --- a/lib/features/email/domain/usecases/get_email_content_interactor.dart +++ b/lib/features/email/domain/usecases/get_email_content_interactor.dart @@ -1,9 +1,12 @@ -import 'package:core/core.dart'; +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:core/utils/app_logger.dart'; +import 'package:core/utils/build_utils.dart'; import 'package:dartz/dartz.dart'; -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:model/extensions/email_extension.dart'; +import 'package:model/extensions/list_attachment_extension.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'; @@ -12,25 +15,38 @@ class GetEmailContentInteractor { GetEmailContentInteractor(this.emailRepository); - Stream> execute(AccountId accountId, EmailId emailId, String? baseDownloadUrl) async* { + Stream> execute( + AccountId accountId, + EmailId emailId, + String? baseDownloadUrl, + { + bool composeEmail = false, + bool draftsEmail = false + } + ) async* { try { yield Right(GetEmailContentLoading()); 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; + email.emailContentList, + email.allAttachments.listAttachmentsDisplayedInContent, + baseDownloadUrl, + accountId, + draftsEmail: draftsEmail + ); + + final newEmailContentsDisplayed = BuildUtils.isWeb && !composeEmail + ? await emailRepository.addTooltipWhenHoverOnLink(newEmailContents) + : newEmailContents; + yield Right(GetEmailContentSuccess( - newEmailContents, - newEmailContentsDisplayed, - email.allAttachments, - email)); + newEmailContents, + newEmailContentsDisplayed, + email.allAttachments, + email + )); } else if (email.allAttachments.isNotEmpty) { yield Right(GetEmailContentSuccess([], [], email.allAttachments, email)); } else if (email.headers?.isNotEmpty == true) {