TF-3042 Create PublicAsset and display after pick image
This commit is contained in:
@@ -121,4 +121,18 @@ class FileUtils {
|
||||
final base64Data = base64Encode(Uint8List.view(buffer));
|
||||
return base64Data;
|
||||
}
|
||||
|
||||
Future<void> 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');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -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<PublicAssetController>(tag: BindingTag.publicAssetBindingsTag);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void onClose() {
|
||||
log('IdentityCreatorController::onClose():');
|
||||
@@ -152,6 +167,8 @@ class IdentityCreatorController extends BaseController {
|
||||
richTextMobileTabletController?.onClose();
|
||||
richTextMobileTabletController = null;
|
||||
}
|
||||
Get.delete<PublicAssetController>(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<FileUtils>()?.deleteCompressedFileOnMobile(
|
||||
file.path!,
|
||||
pathContains: IdentityCreatorConstants.prefixCompressedInlineImageTemp);
|
||||
}
|
||||
} else {
|
||||
logError("IdentityCreatorController::_insertInlineImage: Platform not supported");
|
||||
@@ -643,18 +665,6 @@ class IdentityCreatorController extends BaseController {
|
||||
return compressedFilePath;
|
||||
}
|
||||
|
||||
Future<void> _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);
|
||||
|
||||
@@ -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<PublicAssetId> 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();
|
||||
}
|
||||
}
|
||||
@@ -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<Object?> get props => [exception];
|
||||
}
|
||||
@@ -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<Either<Failure, Success>> execute(
|
||||
Session session,
|
||||
AccountId accountId,
|
||||
{
|
||||
required Id blobId,
|
||||
required IdentityId? identityId
|
||||
}
|
||||
) async* {
|
||||
try {
|
||||
yield Right<Failure, Success>(CreatingPublicAssetState());
|
||||
final publicAsset = await _publicAssetRepository.createPublicAsset(
|
||||
session,
|
||||
accountId,
|
||||
blobId: blobId,
|
||||
identityId: identityId);
|
||||
yield Right<Failure, Success>(CreatePublicAssetSuccessState(publicAsset));
|
||||
} catch (exception) {
|
||||
logError('CreatePublicAssetInteractor::execute():error: $exception');
|
||||
yield Left<Failure, Success>(CreatePublicAssetFailureState(exception: exception));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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<Object?> get props => [accountId, session, identity];
|
||||
}
|
||||
@@ -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<DioClient>(tag: BindingTag.isolateTag), Get.find<Executor>()),
|
||||
tag: BindingTag.publicAssetBindingsTag);
|
||||
Get.lazyPut(
|
||||
() => PublicAssetApi(Get.find<HttpClient>(), Get.find<Uuid>()),
|
||||
tag: BindingTag.publicAssetBindingsTag);
|
||||
|
||||
super.dependencies();
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsController() {
|
||||
Get.create(
|
||||
() => PublicAssetController(
|
||||
Get.find<UploadAttachmentInteractor>(tag: BindingTag.publicAssetBindingsTag),
|
||||
Get.find<CreatePublicAssetInteractor>(tag: BindingTag.publicAssetBindingsTag),
|
||||
Get.find<DeletePublicAssetsInteractor>(tag: BindingTag.publicAssetBindingsTag),
|
||||
arguments: _publicAssetArguments),
|
||||
tag: BindingTag.publicAssetBindingsTag);
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsDataSource() {
|
||||
Get.lazyPut<AttachmentUploadDataSource>(
|
||||
() => Get.find<AttachmentUploadDataSourceImpl>(tag: BindingTag.publicAssetBindingsTag),
|
||||
tag: BindingTag.publicAssetBindingsTag);
|
||||
Get.lazyPut<ComposerDataSource>(
|
||||
() => Get.find<ComposerDataSourceImpl>(tag: BindingTag.publicAssetBindingsTag),
|
||||
tag: BindingTag.publicAssetBindingsTag);
|
||||
Get.lazyPut<HtmlDataSource>(
|
||||
() => Get.find<HtmlDataSourceImpl>(tag: BindingTag.publicAssetBindingsTag),
|
||||
tag: BindingTag.publicAssetBindingsTag);
|
||||
Get.lazyPut<PublicAssetDatasource>(
|
||||
() => Get.find<RemotePublicAssetDatasourceImpl>(tag: BindingTag.publicAssetBindingsTag),
|
||||
tag: BindingTag.publicAssetBindingsTag);
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsDataSourceImpl() {
|
||||
Get.lazyPut(
|
||||
() => AttachmentUploadDataSourceImpl(
|
||||
Get.find<FileUploader>(tag: BindingTag.publicAssetBindingsTag),
|
||||
Get.find<Uuid>(),
|
||||
Get.find<RemoteExceptionThrower>()),
|
||||
tag: BindingTag.publicAssetBindingsTag);
|
||||
Get.lazyPut(
|
||||
() => ComposerDataSourceImpl(
|
||||
Get.find<DownloadClient>(),
|
||||
Get.find<RemoteExceptionThrower>()),
|
||||
tag: BindingTag.publicAssetBindingsTag);
|
||||
Get.lazyPut(
|
||||
() => HtmlDataSourceImpl(
|
||||
Get.find<HtmlAnalyzer>(),
|
||||
Get.find<CacheExceptionThrower>()),
|
||||
tag: BindingTag.publicAssetBindingsTag);
|
||||
Get.lazyPut(
|
||||
() => RemotePublicAssetDatasourceImpl(
|
||||
Get.find<PublicAssetApi>(tag: BindingTag.publicAssetBindingsTag),
|
||||
Get.find<RemoteExceptionThrower>()),
|
||||
tag: BindingTag.publicAssetBindingsTag);
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsInteractor() {
|
||||
Get.lazyPut(
|
||||
() => UploadAttachmentInteractor(Get.find<ComposerRepository>(tag: BindingTag.publicAssetBindingsTag)),
|
||||
tag: BindingTag.publicAssetBindingsTag);
|
||||
Get.lazyPut(
|
||||
() => CreatePublicAssetInteractor(Get.find<PublicAssetRepository>(tag: BindingTag.publicAssetBindingsTag)),
|
||||
tag: BindingTag.publicAssetBindingsTag);
|
||||
Get.lazyPut(
|
||||
() => DeletePublicAssetsInteractor(Get.find<PublicAssetRepository>(tag: BindingTag.publicAssetBindingsTag)),
|
||||
tag: BindingTag.publicAssetBindingsTag);
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsRepository() {
|
||||
Get.lazyPut<ComposerRepository>(
|
||||
() => Get.find<ComposerRepositoryImpl>(tag: BindingTag.publicAssetBindingsTag),
|
||||
tag: BindingTag.publicAssetBindingsTag);
|
||||
Get.lazyPut<PublicAssetRepository>(
|
||||
() => Get.find<PublicAssetRepositoryImpl>(tag: BindingTag.publicAssetBindingsTag),
|
||||
tag: BindingTag.publicAssetBindingsTag);
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsRepositoryImpl() {
|
||||
Get.lazyPut(
|
||||
() => ComposerRepositoryImpl(
|
||||
Get.find<AttachmentUploadDataSource>(tag: BindingTag.publicAssetBindingsTag),
|
||||
Get.find<ComposerDataSource>(tag: BindingTag.publicAssetBindingsTag),
|
||||
Get.find<HtmlDataSource>(tag: BindingTag.publicAssetBindingsTag),
|
||||
Get.find<ApplicationManager>(),
|
||||
Get.find<Uuid>()),
|
||||
tag: BindingTag.publicAssetBindingsTag);
|
||||
Get.lazyPut(
|
||||
() => PublicAssetRepositoryImpl(Get.find<PublicAssetDatasource>(tag: BindingTag.publicAssetBindingsTag)),
|
||||
tag: BindingTag.publicAssetBindingsTag);
|
||||
}
|
||||
}
|
||||
@@ -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<PublicAssetId> preExistingPublicAssetIds = [];
|
||||
List<PublicAssetId> newlyPickedPublicAssetIds = [];
|
||||
final _publicAssetStreamGroup = StreamGroup<Either<Failure, Success>>();
|
||||
StreamSubscription<Either<Failure, Success>>? _publicAssetStreamSubscription;
|
||||
|
||||
StreamSubscription<Either<Failure, Success>>? get publicAssetStreamSubscription
|
||||
=> _publicAssetStreamSubscription;
|
||||
Session? get session => arguments?.session;
|
||||
AccountId? get accountId => arguments?.accountId;
|
||||
Identity? get identity => arguments?.identity;
|
||||
|
||||
void _handleUploadState(Either<Failure, Success> 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<FileUtils>()?.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<void> _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 = '<img '
|
||||
'src="${publicAsset.publicURI!}" '
|
||||
'public-asset-id="${publicAsset.id!.value}">';
|
||||
if (PlatformInfo.isWeb) {
|
||||
Get
|
||||
.find<IdentityCreatorController>()
|
||||
.richTextWebController
|
||||
?.editorController
|
||||
.insertHtml(imageTag);
|
||||
} else {
|
||||
Get
|
||||
.find<IdentityCreatorController>()
|
||||
.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));
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,5 @@
|
||||
class BindingTag {
|
||||
static const isolateTag = 'isolateTag';
|
||||
static const cleanUpPublicAssetsInteractorBindingsTag = 'CleanUpPublicAssetsInteractorBindingsTag';
|
||||
static const publicAssetBindingsTag = 'PublicAssetBindingsTag';
|
||||
}
|
||||
Reference in New Issue
Block a user