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) {