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/scheduler.dart';
|
||||||
import 'package:flutter_image_compress/flutter_image_compress.dart';
|
import 'package:flutter_image_compress/flutter_image_compress.dart';
|
||||||
import 'package:get/get.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/account_id.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart';
|
import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/capability/core_capability.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/email_address_extension.dart';
|
||||||
import 'package:model/extensions/identity_extension.dart';
|
import 'package:model/extensions/identity_extension.dart';
|
||||||
import 'package:model/extensions/session_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:path_provider/path_provider.dart';
|
||||||
import 'package:rich_text_composer/rich_text_composer.dart';
|
import 'package:rich_text_composer/rich_text_composer.dart';
|
||||||
import 'package:rich_text_composer/views/commons/constants.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/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/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_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/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/bindings/network/binding_tag.dart';
|
||||||
import 'package:tmail_ui_user/main/error/capability_validator.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({
|
void onLocalFileDropZoneListener({
|
||||||
required BuildContext context,
|
required BuildContext context,
|
||||||
required DropDoneDetails details,
|
required DropDoneDetails details,
|
||||||
required double maxWidth
|
required double maxWidth
|
||||||
}) async {
|
}) 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;
|
final listImages = listFileInfo.listInlineFiles;
|
||||||
|
|
||||||
if (listImages.isEmpty && listFileInfo.isNotEmpty && context.mounted) {
|
if (listImages.isEmpty && listFileInfo.isNotEmpty && context.mounted) {
|
||||||
@@ -817,7 +854,7 @@ class IdentityCreatorController extends BaseController with DragDropFileMixin {
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
logError("IdentityCreatorController::onLocalFileDropZoneListener: context is unmounted");
|
logError("IdentityCreatorController::_uploadMultipleFilesToPublicAsset: context is unmounted");
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -832,7 +869,7 @@ class IdentityCreatorController extends BaseController with DragDropFileMixin {
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
} catch (e) {
|
} 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),
|
border: Border.all(color: AppColor.colorInputBorderCreateMailbox),
|
||||||
),
|
),
|
||||||
padding: const EdgeInsetsDirectional.all(16),
|
padding: const EdgeInsetsDirectional.all(16),
|
||||||
child: _buildSignatureHtmlTemplate(context),
|
child: _buildSignatureHtmlTemplate(context, constraintsEditor.maxWidth),
|
||||||
),
|
),
|
||||||
Obx(() {
|
Obx(() {
|
||||||
if (controller.draggableAppState.value == DraggableAppState.inActive) {
|
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) {
|
if (PlatformInfo.isWeb) {
|
||||||
return Column(
|
return Column(
|
||||||
children: [
|
children: [
|
||||||
@@ -465,7 +468,8 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController>
|
|||||||
children: [
|
children: [
|
||||||
_buildHtmlEditorWeb(
|
_buildHtmlEditorWeb(
|
||||||
context,
|
context,
|
||||||
controller.contentHtmlEditor),
|
controller.contentHtmlEditor,
|
||||||
|
maxWidth),
|
||||||
Obx(() {
|
Obx(() {
|
||||||
bool isInserting = controller.publicAssetController?.isUploading.isTrue == true
|
bool isInserting = controller.publicAssetController?.isUploading.isTrue == true
|
||||||
|| controller.isCompressingInlineImage.isTrue;
|
|| 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(
|
return html_editor_browser.HtmlEditor(
|
||||||
key: const Key('identity_create_editor_web'),
|
key: const Key('identity_create_editor_web'),
|
||||||
controller: controller.richTextWebController!.editorController,
|
controller: controller.richTextWebController!.editorController,
|
||||||
@@ -531,7 +539,18 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController>
|
|||||||
onChangeSelection: controller.richTextWebController?.onEditorSettingsChange,
|
onChangeSelection: controller.richTextWebController?.onEditorSettingsChange,
|
||||||
onChangeCodeview: controller.updateContentHtmlEditor,
|
onChangeCodeview: controller.updateContentHtmlEditor,
|
||||||
onDragEnter: controller.handleOnDragEnterSignatureEditorWeb,
|
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