TF-3042 Create PublicAsset and display after pick image

This commit is contained in:
DatDang
2024-08-07 15:32:13 +07:00
committed by Dat H. Pham
parent f77d62831c
commit c42a913d82
10 changed files with 458 additions and 13 deletions
@@ -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));
}
}