TF-3095 public asset handle base64 on paste (#3098)
This commit is contained in:
@@ -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
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user