From c42a913d8250d5770c929ea8427528106bdbef59 Mon Sep 17 00:00:00 2001 From: DatDang Date: Wed, 7 Aug 2024 15:32:13 +0700 Subject: [PATCH] TF-3042 Create PublicAsset and display after pick image --- core/lib/utils/file_utils.dart | 14 ++ core/test/utils/file_utils_test.dart | 36 ++++ .../identity_creator_controller.dart | 36 ++-- .../string_to_public_asset_extension.dart | 15 ++ .../state/create_public_asset_state.dart | 19 +++ .../create_public_asset_interactor.dart | 38 +++++ .../model/public_asset_arguments.dart | 15 ++ .../presentation/public_asset_bindings.dart | 138 +++++++++++++++ .../presentation/public_asset_controller.dart | 158 ++++++++++++++++++ lib/main/bindings/network/binding_tag.dart | 2 + 10 files changed, 458 insertions(+), 13 deletions(-) create mode 100644 lib/features/public_asset/domain/extensions/string_to_public_asset_extension.dart create mode 100644 lib/features/public_asset/domain/state/create_public_asset_state.dart create mode 100644 lib/features/public_asset/domain/usecase/create_public_asset_interactor.dart create mode 100644 lib/features/public_asset/presentation/model/public_asset_arguments.dart create mode 100644 lib/features/public_asset/presentation/public_asset_bindings.dart create mode 100644 lib/features/public_asset/presentation/public_asset_controller.dart diff --git a/core/lib/utils/file_utils.dart b/core/lib/utils/file_utils.dart index f513fec90..282310ad3 100644 --- a/core/lib/utils/file_utils.dart +++ b/core/lib/utils/file_utils.dart @@ -121,4 +121,18 @@ class FileUtils { final base64Data = base64Encode(Uint8List.view(buffer)); return base64Data; } + + Future deleteCompressedFileOnMobile(String filePath, {required String pathContains}) async { + log('$runtimeType::deleteCompressedFileOnMobile: filePath: $filePath'); + if (!PlatformInfo.isMobile) return; + + try { + final File file = File(filePath); + if (await file.exists() && file.path.contains(pathContains)) { + await file.delete(); + } + } catch (e) { + logError('$runtimeType::deleteCompressedFileOnMobile: error: $e'); + } + } } \ No newline at end of file diff --git a/core/test/utils/file_utils_test.dart b/core/test/utils/file_utils_test.dart index 6596881b2..995c19a91 100644 --- a/core/test/utils/file_utils_test.dart +++ b/core/test/utils/file_utils_test.dart @@ -1,4 +1,5 @@ import 'package:core/utils/file_utils.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:path_provider_platform_interface/path_provider_platform_interface.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; @@ -38,6 +39,41 @@ void main() { file.delete(); }); + + test( + 'Should delete file ' + 'when deleteCompressedFileOnMobile is called ' + 'and file exists ' + 'and Platform is mobile', + () async { + // arrange + final file = await FileUtils().saveToFile(nameFile: fileName, content: fileContent); + + // act + await FileUtils().deleteCompressedFileOnMobile(file.path, pathContains: fileName); + + // assert + expect(await file.exists(), equals(false)); + }); + + test( + 'Should not delete file ' + 'when deleteCompressedFileOnMobile is called ' + 'and file exists ' + 'and Platform is not mobile', + () async { + // arrange + debugDefaultTargetPlatformOverride = TargetPlatform.macOS; + final file = await FileUtils().saveToFile(nameFile: fileName, content: fileContent); + expect(await file.exists(), equals(true)); + + // act + await FileUtils().deleteCompressedFileOnMobile(file.path, pathContains: fileName); + + // assert + expect(await file.exists(), equals(true)); + debugDefaultTargetPlatformOverride = null; + }); }); } diff --git a/lib/features/identity_creator/presentation/identity_creator_controller.dart b/lib/features/identity_creator/presentation/identity_creator_controller.dart index 4e6900dc6..bd812b6e8 100644 --- a/lib/features/identity_creator/presentation/identity_creator_controller.dart +++ b/lib/features/identity_creator/presentation/identity_creator_controller.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:io'; import 'dart:math' as math; import 'dart:typed_data'; @@ -6,6 +7,7 @@ import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; import 'package:core/presentation/utils/keyboard_utils.dart'; import 'package:core/utils/app_logger.dart'; +import 'package:core/utils/file_utils.dart'; import 'package:core/utils/platform_info.dart'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/cupertino.dart'; @@ -45,6 +47,10 @@ import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_id import 'package:tmail_ui_user/features/manage_account/presentation/extensions/identity_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/identity_action_type.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/utils/identity_utils.dart'; +import 'package:tmail_ui_user/features/public_asset/presentation/model/public_asset_arguments.dart'; +import 'package:tmail_ui_user/features/public_asset/presentation/public_asset_bindings.dart'; +import 'package:tmail_ui_user/features/public_asset/presentation/public_asset_controller.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/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; @@ -83,6 +89,7 @@ class IdentityCreatorController extends BaseController { Session? session; Identity? identity; IdentityCreatorArguments? arguments; + PublicAssetController? publicAssetController; final GlobalKey htmlKey = GlobalKey(); final htmlEditorMinHeight = 150; @@ -131,11 +138,19 @@ class IdentityCreatorController extends BaseController { identity = arguments!.identity; actionType.value = arguments!.actionType; _checkDefaultIdentityIsSupported(); + _checkPublicAssetCapability(); _setUpValueFromIdentity(); _getAllIdentities(); } } + void _checkPublicAssetCapability() { + if (CapabilityIdentifier.jmapPublicAsset.isSupported(session!, accountId!)) { + PublicAssetBindings(PublicAssetArguments(session!, accountId!, identity: identity)).dependencies(); + publicAssetController = Get.find(tag: BindingTag.publicAssetBindingsTag); + } + } + @override void onClose() { log('IdentityCreatorController::onClose():'); @@ -152,6 +167,8 @@ class IdentityCreatorController extends BaseController { richTextMobileTabletController?.onClose(); richTextMobileTabletController = null; } + Get.delete(tag: BindingTag.publicAssetBindingsTag); + publicAssetController = null; super.onClose(); } @@ -186,6 +203,7 @@ class IdentityCreatorController extends BaseController { if (PlatformInfo.isWeb) { richTextWebController?.editorController.setText(arguments?.identity?.signatureAsString ?? ''); } + publicAssetController?.getOldPublicAssetFromHtmlContent(arguments!.identity!.signatureAsString); } } @@ -567,13 +585,17 @@ class IdentityCreatorController extends BaseController { } else { logError("IdentityCreatorController::_insertInlineImage: context is unmounted"); } + } else if (publicAssetController != null) { + publicAssetController!.uploadFileToBlob(file); } else { if (PlatformInfo.isWeb) { richTextWebController?.insertImageAsBase64(platformFile: file, maxWidth: maxWidth); } else if (PlatformInfo.isMobile) { richTextMobileTabletController?.insertImageData(platformFile: file, maxWidth: maxWidth); if (file.path != null) { - _deleteCompressedFileOnMobile(file.path!); + getBinding()?.deleteCompressedFileOnMobile( + file.path!, + pathContains: IdentityCreatorConstants.prefixCompressedInlineImageTemp); } } else { logError("IdentityCreatorController::_insertInlineImage: Platform not supported"); @@ -643,18 +665,6 @@ class IdentityCreatorController extends BaseController { return compressedFilePath; } - Future _deleteCompressedFileOnMobile(String filePath) async { - log('IdentityCreatorController::_deleteCompressedFileOnMobile: filePath: $filePath'); - try { - final File file = File(filePath); - if (await file.exists() && file.path.contains(IdentityCreatorConstants.prefixCompressedInlineImageTemp)) { - await file.delete(); - } - } catch (e) { - logError('IdentityCreatorController::_deleteCompressedFileOnMobile: error: $e'); - } - } - bool isMobile(BuildContext context) => responsiveUtils.isPortraitMobile(context) || responsiveUtils.isLandscapeMobile(context); diff --git a/lib/features/public_asset/domain/extensions/string_to_public_asset_extension.dart b/lib/features/public_asset/domain/extensions/string_to_public_asset_extension.dart new file mode 100644 index 000000000..e10a460ea --- /dev/null +++ b/lib/features/public_asset/domain/extensions/string_to_public_asset_extension.dart @@ -0,0 +1,15 @@ +import 'package:html/parser.dart'; +import 'package:jmap_dart_client/jmap/core/id.dart'; +import 'package:tmail_ui_user/features/public_asset/presentation/public_asset_controller.dart'; + +extension StringToPublicAssetExtension on String { + List get publicAssetIdsFromHtmlContent { + final document = parse(this); + final images = document + .querySelectorAll('img[public-asset-id]') + .where((element) => element.attributes['public-asset-id'] != null); + return images + .map((element) => Id(element.attributes['public-asset-id']!)) + .toList(); + } +} \ No newline at end of file diff --git a/lib/features/public_asset/domain/state/create_public_asset_state.dart b/lib/features/public_asset/domain/state/create_public_asset_state.dart new file mode 100644 index 000000000..0746a108c --- /dev/null +++ b/lib/features/public_asset/domain/state/create_public_asset_state.dart @@ -0,0 +1,19 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:jmap_dart_client/jmap/mail/extensions/public_asset/public_asset.dart'; + +class CreatingPublicAssetState extends LoadingState {} + +class CreatePublicAssetSuccessState extends UIState { + CreatePublicAssetSuccessState(this.publicAsset); + + final PublicAsset publicAsset; +} + +class CreatePublicAssetFailureState extends FeatureFailure { + + CreatePublicAssetFailureState({super.exception}); + + @override + List get props => [exception]; +} \ No newline at end of file diff --git a/lib/features/public_asset/domain/usecase/create_public_asset_interactor.dart b/lib/features/public_asset/domain/usecase/create_public_asset_interactor.dart new file mode 100644 index 000000000..c2663d00d --- /dev/null +++ b/lib/features/public_asset/domain/usecase/create_public_asset_interactor.dart @@ -0,0 +1,38 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:core/utils/app_logger.dart'; +import 'package:dartz/dartz.dart'; +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/id.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; +import 'package:jmap_dart_client/jmap/identities/identity.dart'; +import 'package:tmail_ui_user/features/public_asset/domain/state/create_public_asset_state.dart'; +import 'package:tmail_ui_user/features/public_asset/domain/repository/public_asset_repository.dart'; + +class CreatePublicAssetInteractor { + CreatePublicAssetInteractor(this._publicAssetRepository); + + final PublicAssetRepository _publicAssetRepository; + + Stream> execute( + Session session, + AccountId accountId, + { + required Id blobId, + required IdentityId? identityId + } + ) async* { + try { + yield Right(CreatingPublicAssetState()); + final publicAsset = await _publicAssetRepository.createPublicAsset( + session, + accountId, + blobId: blobId, + identityId: identityId); + yield Right(CreatePublicAssetSuccessState(publicAsset)); + } catch (exception) { + logError('CreatePublicAssetInteractor::execute():error: $exception'); + yield Left(CreatePublicAssetFailureState(exception: exception)); + } + } +} \ No newline at end of file diff --git a/lib/features/public_asset/presentation/model/public_asset_arguments.dart b/lib/features/public_asset/presentation/model/public_asset_arguments.dart new file mode 100644 index 000000000..da7cade5a --- /dev/null +++ b/lib/features/public_asset/presentation/model/public_asset_arguments.dart @@ -0,0 +1,15 @@ +import 'package:equatable/equatable.dart'; +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; +import 'package:jmap_dart_client/jmap/identities/identity.dart'; + +class PublicAssetArguments with EquatableMixin { + final Session session; + final AccountId accountId; + final Identity? identity; + + const PublicAssetArguments(this.session, this.accountId, {this.identity}); + + @override + List get props => [accountId, session, identity]; +} \ No newline at end of file diff --git a/lib/features/public_asset/presentation/public_asset_bindings.dart b/lib/features/public_asset/presentation/public_asset_bindings.dart new file mode 100644 index 000000000..a0bb30e60 --- /dev/null +++ b/lib/features/public_asset/presentation/public_asset_bindings.dart @@ -0,0 +1,138 @@ +import 'package:core/data/network/dio_client.dart'; +import 'package:core/data/network/download/download_client.dart'; +import 'package:core/utils/application_manager.dart'; +import 'package:get/get.dart'; +import 'package:jmap_dart_client/http/http_client.dart'; +import 'package:tmail_ui_user/features/base/base_bindings.dart'; +import 'package:tmail_ui_user/features/composer/data/datasource/composer_datasource.dart'; +import 'package:tmail_ui_user/features/composer/data/datasource_impl/composer_datasource_impl.dart'; +import 'package:tmail_ui_user/features/composer/data/repository/composer_repository_impl.dart'; +import 'package:tmail_ui_user/features/composer/domain/repository/composer_repository.dart'; +import 'package:tmail_ui_user/features/composer/domain/usecases/upload_attachment_interactor.dart'; +import 'package:tmail_ui_user/features/email/data/datasource/html_datasource.dart'; +import 'package:tmail_ui_user/features/email/data/datasource_impl/html_datasource_impl.dart'; +import 'package:tmail_ui_user/features/email/data/local/html_analyzer.dart'; +import 'package:tmail_ui_user/features/public_asset/domain/usecase/create_public_asset_interactor.dart'; +import 'package:tmail_ui_user/features/public_asset/data/datasource/public_asset_datasource.dart'; +import 'package:tmail_ui_user/features/public_asset/data/datasource_impl/remote_public_asset_datasource_impl.dart'; +import 'package:tmail_ui_user/features/public_asset/data/network/public_asset_api.dart'; +import 'package:tmail_ui_user/features/public_asset/data/repository/public_asset_repository_impl.dart'; +import 'package:tmail_ui_user/features/public_asset/domain/repository/public_asset_repository.dart'; +import 'package:tmail_ui_user/features/public_asset/presentation/model/public_asset_arguments.dart'; +import 'package:tmail_ui_user/features/public_asset/presentation/public_asset_controller.dart'; +import 'package:tmail_ui_user/features/upload/data/datasource/attachment_upload_datasource.dart'; +import 'package:tmail_ui_user/features/upload/data/datasource_impl/attachment_upload_datasource_impl.dart'; +import 'package:tmail_ui_user/features/upload/data/network/file_uploader.dart'; +import 'package:tmail_ui_user/main/bindings/network/binding_tag.dart'; +import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; +import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; +import 'package:uuid/uuid.dart'; +import 'package:worker_manager/worker_manager.dart'; + +class PublicAssetBindings extends BaseBindings { + PublicAssetBindings(this._publicAssetArguments); + + final PublicAssetArguments _publicAssetArguments; + + @override + void dependencies() { + Get.lazyPut( + () => FileUploader(Get.find(tag: BindingTag.isolateTag), Get.find()), + tag: BindingTag.publicAssetBindingsTag); + Get.lazyPut( + () => PublicAssetApi(Get.find(), Get.find()), + tag: BindingTag.publicAssetBindingsTag); + + super.dependencies(); + } + + @override + void bindingsController() { + Get.create( + () => PublicAssetController( + Get.find(tag: BindingTag.publicAssetBindingsTag), + Get.find(tag: BindingTag.publicAssetBindingsTag), + Get.find(tag: BindingTag.publicAssetBindingsTag), + arguments: _publicAssetArguments), + tag: BindingTag.publicAssetBindingsTag); + } + + @override + void bindingsDataSource() { + Get.lazyPut( + () => Get.find(tag: BindingTag.publicAssetBindingsTag), + tag: BindingTag.publicAssetBindingsTag); + Get.lazyPut( + () => Get.find(tag: BindingTag.publicAssetBindingsTag), + tag: BindingTag.publicAssetBindingsTag); + Get.lazyPut( + () => Get.find(tag: BindingTag.publicAssetBindingsTag), + tag: BindingTag.publicAssetBindingsTag); + Get.lazyPut( + () => Get.find(tag: BindingTag.publicAssetBindingsTag), + tag: BindingTag.publicAssetBindingsTag); + } + + @override + void bindingsDataSourceImpl() { + Get.lazyPut( + () => AttachmentUploadDataSourceImpl( + Get.find(tag: BindingTag.publicAssetBindingsTag), + Get.find(), + Get.find()), + tag: BindingTag.publicAssetBindingsTag); + Get.lazyPut( + () => ComposerDataSourceImpl( + Get.find(), + Get.find()), + tag: BindingTag.publicAssetBindingsTag); + Get.lazyPut( + () => HtmlDataSourceImpl( + Get.find(), + Get.find()), + tag: BindingTag.publicAssetBindingsTag); + Get.lazyPut( + () => RemotePublicAssetDatasourceImpl( + Get.find(tag: BindingTag.publicAssetBindingsTag), + Get.find()), + tag: BindingTag.publicAssetBindingsTag); + } + + @override + void bindingsInteractor() { + Get.lazyPut( + () => UploadAttachmentInteractor(Get.find(tag: BindingTag.publicAssetBindingsTag)), + tag: BindingTag.publicAssetBindingsTag); + Get.lazyPut( + () => CreatePublicAssetInteractor(Get.find(tag: BindingTag.publicAssetBindingsTag)), + tag: BindingTag.publicAssetBindingsTag); + Get.lazyPut( + () => DeletePublicAssetsInteractor(Get.find(tag: BindingTag.publicAssetBindingsTag)), + tag: BindingTag.publicAssetBindingsTag); + } + + @override + void bindingsRepository() { + Get.lazyPut( + () => Get.find(tag: BindingTag.publicAssetBindingsTag), + tag: BindingTag.publicAssetBindingsTag); + Get.lazyPut( + () => Get.find(tag: BindingTag.publicAssetBindingsTag), + tag: BindingTag.publicAssetBindingsTag); + } + + @override + void bindingsRepositoryImpl() { + Get.lazyPut( + () => ComposerRepositoryImpl( + Get.find(tag: BindingTag.publicAssetBindingsTag), + Get.find(tag: BindingTag.publicAssetBindingsTag), + Get.find(tag: BindingTag.publicAssetBindingsTag), + Get.find(), + Get.find()), + tag: BindingTag.publicAssetBindingsTag); + Get.lazyPut( + () => PublicAssetRepositoryImpl(Get.find(tag: BindingTag.publicAssetBindingsTag)), + tag: BindingTag.publicAssetBindingsTag); + } +} \ No newline at end of file diff --git a/lib/features/public_asset/presentation/public_asset_controller.dart b/lib/features/public_asset/presentation/public_asset_controller.dart new file mode 100644 index 000000000..f143ffa72 --- /dev/null +++ b/lib/features/public_asset/presentation/public_asset_controller.dart @@ -0,0 +1,158 @@ +import 'dart:async'; + +import 'package:async/async.dart'; +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:core/utils/app_logger.dart'; +import 'package:core/utils/file_utils.dart'; +import 'package:core/utils/platform_info.dart'; +import 'package:dartz/dartz.dart'; +import 'package:file_picker/file_picker.dart'; +import 'package:get/get.dart'; +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/id.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; +import 'package:jmap_dart_client/jmap/identities/identity.dart'; +import 'package:model/extensions/session_extension.dart'; +import 'package:tmail_ui_user/features/base/base_controller.dart'; +import 'package:tmail_ui_user/features/composer/domain/state/upload_attachment_state.dart'; +import 'package:tmail_ui_user/features/composer/domain/usecases/upload_attachment_interactor.dart'; +import 'package:tmail_ui_user/features/public_asset/domain/extensions/string_to_public_asset_extension.dart'; +import 'package:tmail_ui_user/features/public_asset/domain/state/create_public_asset_state.dart'; +import 'package:tmail_ui_user/features/public_asset/domain/usecase/create_public_asset_interactor.dart'; +import 'package:tmail_ui_user/features/identity_creator/presentation/identity_creator_controller.dart'; +import 'package:tmail_ui_user/features/identity_creator/presentation/utils/identity_creator_constants.dart'; +import 'package:tmail_ui_user/features/public_asset/presentation/model/public_asset_arguments.dart'; +import 'package:tmail_ui_user/features/upload/domain/extensions/platform_file_extension.dart'; +import 'package:tmail_ui_user/features/upload/domain/state/attachment_upload_state.dart'; +import 'package:tmail_ui_user/main/routes/route_navigation.dart'; + +typedef PublicAssetId = Id; + +class PublicAssetController extends BaseController { + PublicAssetController( + this._uploadAttachmentInteractor, + this._createPublicAssetInteractor, + {required this.arguments} + ); + + final UploadAttachmentInteractor _uploadAttachmentInteractor; + final CreatePublicAssetInteractor _createPublicAssetInteractor; + final PublicAssetArguments? arguments; + + List preExistingPublicAssetIds = []; + List newlyPickedPublicAssetIds = []; + final _publicAssetStreamGroup = StreamGroup>(); + StreamSubscription>? _publicAssetStreamSubscription; + + StreamSubscription>? get publicAssetStreamSubscription + => _publicAssetStreamSubscription; + Session? get session => arguments?.session; + AccountId? get accountId => arguments?.accountId; + Identity? get identity => arguments?.identity; + + void _handleUploadState(Either uploadState) { + log('PublicAssetController::handleUploadState::${uploadState.runtimeType}'); + uploadState.fold( + (failure) {}, + (success) { + log('PublicAssetController::handleUploadState::success::$success'); + if (success is SuccessAttachmentUploadState) { + final filePath = success.fileInfo.filePath; + if (PlatformInfo.isMobile && filePath != null) { + getBinding()?.deleteCompressedFileOnMobile( + filePath, + pathContains: IdentityCreatorConstants.prefixCompressedInlineImageTemp); + } + + final blobId = success.attachment.blobId; + if (session == null + || accountId == null + || blobId == null) return; + + consumeState(_createPublicAssetInteractor.execute( + session!, + accountId!, + blobId: blobId, + identityId: identity?.id)); + } + } + ); + } + + @override + void onInit() { + super.onInit(); + _publicAssetStreamSubscription = _publicAssetStreamGroup.stream.listen(_handleUploadState); + } + + @override + void onClose() { + preExistingPublicAssetIds.clear(); + newlyPickedPublicAssetIds.clear(); + _publicAssetStreamSubscription?.cancel(); + _publicAssetStreamGroup.close(); + super.onClose(); + } + + @override + void handleSuccessViewState(Success success) { + super.handleSuccessViewState(success); + if (success is UploadAttachmentSuccess) { + _handleUploadAttachmentSuccess(success); + } else if (success is CreatePublicAssetSuccessState) { + _handleCreatePublicAssetSuccessState(success); + } + } + + Future _handleUploadAttachmentSuccess(UploadAttachmentSuccess success) async { + await _publicAssetStreamGroup.add(success.uploadAttachment.progressState); + } + + void _handleCreatePublicAssetSuccessState(CreatePublicAssetSuccessState success) { + final publicAsset = success.publicAsset; + if (publicAsset.id == null || publicAsset.publicURI == null) return; + + newlyPickedPublicAssetIds.add(publicAsset.id!); + final imageTag = ''; + if (PlatformInfo.isWeb) { + Get + .find() + .richTextWebController + ?.editorController + .insertHtml(imageTag); + } else { + Get + .find() + .richTextMobileTabletController + ?.htmlEditorApi + ?.insertHtml(imageTag); + } + } + + void getOldPublicAssetFromHtmlContent(String htmlContent) { + preExistingPublicAssetIds = htmlContent.publicAssetIdsFromHtmlContent; + } + + void uploadFileToBlob(PlatformFile platformFile) { + _uploadFileToBlobAction(platformFile); + } + + void _uploadFileToBlobAction(PlatformFile platformFile) { + if (session == null || accountId == null) return; + + final fileInfo = platformFile.toFileInfo(); + final uploadUri = session!.getUploadUri(accountId!, jmapUrl: dynamicUrlInterceptors.jmapUrl); + consumeState(_uploadAttachmentInteractor.execute(fileInfo, uploadUri)); + } + + void discardChanges() { + if (session == null || accountId == null) return; + consumeState(_deletePublicAssetsInteractor.execute( + session!, + accountId!, + publicAssetIds: newlyPickedPublicAssetIds)); + } +} \ No newline at end of file diff --git a/lib/main/bindings/network/binding_tag.dart b/lib/main/bindings/network/binding_tag.dart index 660cdef60..27123bd42 100644 --- a/lib/main/bindings/network/binding_tag.dart +++ b/lib/main/bindings/network/binding_tag.dart @@ -1,3 +1,5 @@ class BindingTag { static const isolateTag = 'isolateTag'; + static const cleanUpPublicAssetsInteractorBindingsTag = 'CleanUpPublicAssetsInteractorBindingsTag'; + static const publicAssetBindingsTag = 'PublicAssetBindingsTag'; } \ No newline at end of file