TF-3095 public asset handle base64 on paste (#3098)

This commit is contained in:
Dat Dang
2024-08-21 10:24:49 +07:00
committed by GitHub
parent f0d6080ad9
commit df692d8d43
2 changed files with 66 additions and 10 deletions
@@ -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<void> onPasteImageSuccess(
BuildContext context,
List<FileUpload> listFileUpload,
{required double maxWidth}
) async {
await _uploadMultipleFilesToPublicAsset(
context,
listFileUpload.toListFileInfo(),
maxWidth: maxWidth);
}
void onPasteImageFailure(
BuildContext context,
List<FileUpload>? 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<void> _uploadMultipleFilesToPublicAsset(
BuildContext context,
List<FileInfo> 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");
}
}
}
@@ -129,7 +129,7 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController>
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<IdentityCreatorController>
);
}
Widget _buildSignatureHtmlTemplate(BuildContext context) {
Widget _buildSignatureHtmlTemplate(
BuildContext context,
double maxWidth
) {
if (PlatformInfo.isWeb) {
return Column(
children: [
@@ -465,7 +468,8 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController>
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<IdentityCreatorController>
}
}
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<IdentityCreatorController>
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
),
),
);
}