From fc83cae62b88624da737ccb5bd8c7f02ec4bbf6b Mon Sep 17 00:00:00 2001 From: dab246 Date: Tue, 2 Aug 2022 14:30:39 +0700 Subject: [PATCH] TF-764 Fix inline images are not saved and shown successfully in Draft --- .../network/download/download_client.dart | 2 +- .../dom/image_transformers.dart | 30 ++++++++--------- .../presentation/composer_controller.dart | 2 ++ .../controller/base_rich_text_controller.dart | 33 +++++++++++++++++++ .../rich_text_mobile_tablet_controller.dart | 32 ------------------ .../controller/rich_text_web_controller.dart | 32 ------------------ 6 files changed, 49 insertions(+), 82 deletions(-) diff --git a/core/lib/data/network/download/download_client.dart b/core/lib/data/network/download/download_client.dart index 0f2d748e9..b8da1522a 100644 --- a/core/lib/data/network/download/download_client.dart +++ b/core/lib/data/network/download/download_client.dart @@ -112,7 +112,7 @@ class DownloadClient { if (fileName.contains('.')) { fileName = fileName.split('.').first; } - final base64Uri = '$fileName'; + final base64Uri = '$fileName'; return base64Uri; } } \ No newline at end of file diff --git a/core/lib/presentation/utils/html_transformer/dom/image_transformers.dart b/core/lib/presentation/utils/html_transformer/dom/image_transformers.dart index eaba1445e..df16fa0e2 100644 --- a/core/lib/presentation/utils/html_transformer/dom/image_transformers.dart +++ b/core/lib/presentation/utils/html_transformer/dom/image_transformers.dart @@ -21,26 +21,22 @@ class ImageTransformer extends DomTransformer { } ) async { final compressFileUtils = CompressFileUtils(); - final imageElements = document.getElementsByTagName('img'); - + final imageElements = document.querySelectorAll('img[src^="cid:"]'); + log('ImageTransformer::process(): imageElements: ${imageElements.length}'); await Future.wait(imageElements.map((imageElement) async { imageElement.attributes['style'] = 'display: inline;max-width: 100%;height: auto;'; final src = imageElement.attributes['src']; - if (src != null - && src.isNotEmpty - && src.startsWith('cid:') - && mapUrlDownloadCID != null - ) { - final cid = src.replaceFirst('cid:', '').trim(); - final cidUrlDownload = mapUrlDownloadCID[cid]; - if (cidUrlDownload != null && cidUrlDownload.isNotEmpty && dioClient != null) { - final imgBase64Uri = await loadAsyncNetworkImageToBase64( - dioClient, - compressFileUtils, - cidUrlDownload); - if (imgBase64Uri.isNotEmpty) { - imageElement.attributes['src'] = imgBase64Uri; - } + log('ImageTransformer::process(): src: $src'); + final cid = src?.replaceFirst('cid:', '').trim(); + final urlDownloadCid = mapUrlDownloadCID?[cid]; + log('ImageTransformer::process(): urlDownloadCid: $urlDownloadCid'); + if (urlDownloadCid?.isNotEmpty == true && dioClient != null) { + final imgBase64Uri = await loadAsyncNetworkImageToBase64( + dioClient, + compressFileUtils, + urlDownloadCid!); + if (imgBase64Uri.isNotEmpty) { + imageElement.attributes['src'] = imgBase64Uri; } } })); diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index 97833f600..d688ee2db 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -890,6 +890,8 @@ class ComposerController extends BaseController { mailboxDashBoardController.consumeState( _saveEmailAsDraftsInteractor.execute(accountId, newEmail)); } + + uploadController.clearInlineFileUploaded(); } } diff --git a/lib/features/composer/presentation/controller/base_rich_text_controller.dart b/lib/features/composer/presentation/controller/base_rich_text_controller.dart index 49801bbda..86aee1fff 100644 --- a/lib/features/composer/presentation/controller/base_rich_text_controller.dart +++ b/lib/features/composer/presentation/controller/base_rich_text_controller.dart @@ -1,9 +1,14 @@ +import 'package:collection/collection.dart'; import 'package:core/presentation/views/dialog/color_picker_dialog_builder.dart'; +import 'package:core/utils/app_logger.dart'; +import 'package:dartz/dartz.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:model/email/attachment.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; +import 'package:html/parser.dart' show parse; abstract class BaseRichTextController extends GetxController { @@ -33,4 +38,32 @@ abstract class BaseRichTextController extends GetxController { } ).show(); } + + Future>> refactorContentHasInlineImage( + String emailContent, + Map mapInlineAttachments + ) async { + final document = parse(emailContent); + final listImgTag = document.querySelectorAll('img[src^="data:image/"][id^="cid:"]'); + final listInlineAttachment = await Future.wait(listImgTag.map((imgTag) async { + final idImg = imgTag.attributes['id']; + final cid = idImg!.replaceFirst('cid:', '').trim(); + log('BaseRichTextController::refactorContentHasInlineImage(): $cid'); + imgTag.attributes['src'] = 'cid:$cid'; + imgTag.attributes.remove('id'); + return cid; + })).then((listCid) { + log('BaseRichTextController::refactorContentHasInlineImage(): $listCid'); + final listInlineAttachment = listCid + .whereNotNull() + .map((cid) => mapInlineAttachments[cid]) + .whereNotNull() + .toList(); + return listInlineAttachment; + }); + final newContent = document.body?.innerHtml ?? emailContent; + log('BaseRichTextController::refactorContentHasInlineImage(): $newContent'); + log('BaseRichTextController::refactorContentHasInlineImage(): listInlineAttachment: $listInlineAttachment'); + return Tuple2(newContent, listInlineAttachment); + } } \ No newline at end of file diff --git a/lib/features/composer/presentation/controller/rich_text_mobile_tablet_controller.dart b/lib/features/composer/presentation/controller/rich_text_mobile_tablet_controller.dart index 10ff8ca2f..eb3b65934 100644 --- a/lib/features/composer/presentation/controller/rich_text_mobile_tablet_controller.dart +++ b/lib/features/composer/presentation/controller/rich_text_mobile_tablet_controller.dart @@ -1,12 +1,8 @@ -import 'package:collection/collection.dart'; import 'package:core/core.dart'; import 'package:custom_pop_up_menu/custom_pop_up_menu.dart'; -import 'package:dartz/dartz.dart'; import 'package:enough_html_editor/enough_html_editor.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:html/parser.dart'; -import 'package:model/model.dart'; import 'package:tmail_ui_user/features/composer/presentation/controller/base_rich_text_controller.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/dropdown_menu_font_status.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/header_style_type.dart'; @@ -128,34 +124,6 @@ class RichTextMobileTabletController extends BaseRichTextController { } } - Future>> refactorContentHasInlineImage( - String emailContent, - Map mapInlineAttachments, - ) async { - final document = parse(emailContent); - final listImgTag = document.querySelectorAll('img[src^="data:image/"]'); - final listInlineAttachment = - await Future.wait(listImgTag.map((imgTag) async { - final cid = imgTag.attributes['id']; - log('RichTextMobileTabletController::refactorContentHasInlineImage(): cid: $cid'); - imgTag.attributes['src'] = 'cid:$cid'; - imgTag.attributes.remove('id'); - return cid; - })).then((listCid) { - log('RichTextMobileTabletController::refactorContentHasInlineImage(): $listCid'); - final listInlineAttachment = listCid - .whereNotNull() - .map((cid) => mapInlineAttachments[cid]) - .whereNotNull() - .toList(); - return listInlineAttachment; - }); - final newContent = document.body?.innerHtml ?? emailContent; - log('RichTextMobileTabletController::refactorContentHasInlineImage(): $newContent'); - log('RichTextMobileTabletController::refactorContentHasInlineImage(): listInlineAttachment: $listInlineAttachment'); - return Tuple2(newContent, listInlineAttachment); - } - bool isTextStyleTypeSelected(RichTextStyleType richTextStyleType) { return listTextStyleApply.contains(richTextStyleType); } diff --git a/lib/features/composer/presentation/controller/rich_text_web_controller.dart b/lib/features/composer/presentation/controller/rich_text_web_controller.dart index daa64f315..d32638bce 100644 --- a/lib/features/composer/presentation/controller/rich_text_web_controller.dart +++ b/lib/features/composer/presentation/controller/rich_text_web_controller.dart @@ -1,14 +1,9 @@ -import 'package:collection/collection.dart'; import 'package:custom_pop_up_menu/custom_pop_up_menu.dart'; -import 'package:dartz/dartz.dart'; -import 'package:html/parser.dart' show parse; - import 'package:core/utils/app_logger.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:html_editor_enhanced/html_editor.dart'; -import 'package:model/email/attachment.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/code_view_state.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/dropdown_menu_font_status.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/header_style_type.dart'; @@ -164,33 +159,6 @@ class RichTextWebController extends BaseRichTextController { } } - Future>> refactorContentHasInlineImage( - String emailContent, - Map mapInlineAttachments - ) async { - final document = parse(emailContent); - final listImgTag = document.querySelectorAll('img[src^="data:image/"]'); - final listInlineAttachment = await Future.wait(listImgTag.map((imgTag) async { - final cid = imgTag.attributes['id']; - log('RichTextWebController::refactorContentHasInlineImage(): cid: $cid'); - imgTag.attributes['src'] = 'cid:$cid'; - imgTag.attributes.remove('id'); - return cid; - })).then((listCid) { - log('RichTextWebController::refactorContentHasInlineImage(): $listCid'); - final listInlineAttachment = listCid - .whereNotNull() - .map((cid) => mapInlineAttachments[cid]) - .whereNotNull() - .toList(); - return listInlineAttachment; - }); - final newContent = document.body?.innerHtml ?? emailContent; - log('RichTextWebController::refactorContentHasInlineImage(): $newContent'); - log('RichTextWebController::refactorContentHasInlineImage(): listInlineAttachment: $listInlineAttachment'); - return Tuple2(newContent, listInlineAttachment); - } - void applyNewFontStyle(FontNameType? newFont) { final fontSelected = newFont ?? FontNameType.sansSerif; selectedFontName.value = fontSelected;