From df692d8d43121494c554987bd02ac3e09340ffad Mon Sep 17 00:00:00 2001 From: Dat Dang Date: Wed, 21 Aug 2024 10:24:49 +0700 Subject: [PATCH] TF-3095 public asset handle base64 on paste (#3098) --- .../identity_creator_controller.dart | 47 +++++++++++++++++-- .../presentation/identity_creator_view.dart | 29 ++++++++++-- 2 files changed, 66 insertions(+), 10 deletions(-) diff --git a/lib/features/identity_creator/presentation/identity_creator_controller.dart b/lib/features/identity_creator/presentation/identity_creator_controller.dart index e36b6dacc..709dd4663 100644 --- a/lib/features/identity_creator/presentation/identity_creator_controller.dart +++ b/lib/features/identity_creator/presentation/identity_creator_controller.dart @@ -17,6 +17,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter_image_compress/flutter_image_compress.dart'; import 'package:get/get.dart'; +import 'package:html_editor_enhanced/html_editor.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart'; import 'package:jmap_dart_client/jmap/core/capability/core_capability.dart'; @@ -29,6 +30,7 @@ import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:model/extensions/email_address_extension.dart'; import 'package:model/extensions/identity_extension.dart'; import 'package:model/extensions/session_extension.dart'; +import 'package:model/upload/file_info.dart'; import 'package:path_provider/path_provider.dart'; import 'package:rich_text_composer/rich_text_composer.dart'; import 'package:rich_text_composer/views/commons/constants.dart'; @@ -57,6 +59,7 @@ import 'package:tmail_ui_user/features/public_asset/presentation/public_asset_bi import 'package:tmail_ui_user/features/public_asset/presentation/public_asset_controller.dart'; import 'package:tmail_ui_user/features/upload/domain/extensions/file_info_extension.dart'; import 'package:tmail_ui_user/features/upload/domain/extensions/list_file_info_extension.dart'; +import 'package:tmail_ui_user/features/upload/domain/extensions/list_file_upload_extension.dart'; import 'package:tmail_ui_user/features/upload/domain/extensions/list_platform_file_extensions.dart'; import 'package:tmail_ui_user/main/bindings/network/binding_tag.dart'; import 'package:tmail_ui_user/main/error/capability_validator.dart'; @@ -782,15 +785,49 @@ class IdentityCreatorController extends BaseController with DragDropFileMixin { }); } + Future onPasteImageSuccess( + BuildContext context, + List listFileUpload, + {required double maxWidth} + ) async { + await _uploadMultipleFilesToPublicAsset( + context, + listFileUpload.toListFileInfo(), + maxWidth: maxWidth); + } + + void onPasteImageFailure( + BuildContext context, + List? listFileUpload, + {String? base64, + required UploadError uploadError} + ) { + logError('$runtimeType::onPasteImageFailure: $uploadError'); + appToast.showToastErrorMessage( + context, + AppLocalizations.of(context).thisImageCannotBePastedIntoTheEditor); + } + void onLocalFileDropZoneListener({ required BuildContext context, required DropDoneDetails details, required double maxWidth }) async { - try { - clearFocusEditor(context); + clearFocusEditor(context); - final listFileInfo = await onDragDone(context: context, details: details); + final listFileInfo = await onDragDone(context: context, details: details); + await _uploadMultipleFilesToPublicAsset( + context, + listFileInfo, + maxWidth: maxWidth); + } + + Future _uploadMultipleFilesToPublicAsset( + BuildContext context, + List listFileInfo, + {required double maxWidth} + ) async { + try { final listImages = listFileInfo.listInlineFiles; if (listImages.isEmpty && listFileInfo.isNotEmpty && context.mounted) { @@ -817,7 +854,7 @@ class IdentityCreatorController extends BaseController with DragDropFileMixin { ) ); } else { - logError("IdentityCreatorController::onLocalFileDropZoneListener: context is unmounted"); + logError("IdentityCreatorController::_uploadMultipleFilesToPublicAsset: context is unmounted"); } return; } @@ -832,7 +869,7 @@ class IdentityCreatorController extends BaseController with DragDropFileMixin { ) ); } catch (e) { - logError("IdentityCreatorController::onLocalFileDropZoneListener: error: $e"); + logError("IdentityCreatorController::_uploadMultipleFilesToPublicAsset: error: $e"); } } } \ No newline at end of file diff --git a/lib/features/identity_creator/presentation/identity_creator_view.dart b/lib/features/identity_creator/presentation/identity_creator_view.dart index 132782401..571841e69 100644 --- a/lib/features/identity_creator/presentation/identity_creator_view.dart +++ b/lib/features/identity_creator/presentation/identity_creator_view.dart @@ -129,7 +129,7 @@ class IdentityCreatorView extends GetWidget border: Border.all(color: AppColor.colorInputBorderCreateMailbox), ), padding: const EdgeInsetsDirectional.all(16), - child: _buildSignatureHtmlTemplate(context), + child: _buildSignatureHtmlTemplate(context, constraintsEditor.maxWidth), ), Obx(() { if (controller.draggableAppState.value == DraggableAppState.inActive) { @@ -440,7 +440,10 @@ class IdentityCreatorView extends GetWidget ); } - Widget _buildSignatureHtmlTemplate(BuildContext context) { + Widget _buildSignatureHtmlTemplate( + BuildContext context, + double maxWidth + ) { if (PlatformInfo.isWeb) { return Column( children: [ @@ -465,7 +468,8 @@ class IdentityCreatorView extends GetWidget children: [ _buildHtmlEditorWeb( context, - controller.contentHtmlEditor), + controller.contentHtmlEditor, + maxWidth), Obx(() { bool isInserting = controller.publicAssetController?.isUploading.isTrue == true || controller.isCompressingInlineImage.isTrue; @@ -491,7 +495,11 @@ class IdentityCreatorView extends GetWidget } } - Widget _buildHtmlEditorWeb(BuildContext context, String initContent) { + Widget _buildHtmlEditorWeb( + BuildContext context, + String initContent, + double maxWidth + ) { return html_editor_browser.HtmlEditor( key: const Key('identity_create_editor_web'), controller: controller.richTextWebController!.editorController, @@ -531,7 +539,18 @@ class IdentityCreatorView extends GetWidget onChangeSelection: controller.richTextWebController?.onEditorSettingsChange, onChangeCodeview: controller.updateContentHtmlEditor, onDragEnter: controller.handleOnDragEnterSignatureEditorWeb, - onDragLeave: (_) {} + onDragLeave: (_) {}, + onImageUpload: (listFileUpload) => controller.onPasteImageSuccess( + context, + listFileUpload, + maxWidth: maxWidth), + onImageUploadError: (listFileUpload, base64, uploadError) => + controller.onPasteImageFailure( + context, + listFileUpload, + base64: base64, + uploadError: uploadError + ), ), ); }