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: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));
}
}
}