TF-3416 Implement preview EML attachment

This commit is contained in:
dab246
2025-01-13 10:02:50 +07:00
committed by Dat H. Pham
parent 7cbdfddb6d
commit d304083b2e
54 changed files with 1489 additions and 148 deletions
@@ -0,0 +1,40 @@
import 'package:equatable/equatable.dart';
import 'package:flutter/material.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/user_name.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class PreviewEmailEMLRequest with EquatableMixin {
final AccountId accountId;
final UserName userName;
final Id blobId;
final Email email;
final Locale locale;
final AppLocalizations appLocalizations;
final String baseDownloadUrl;
PreviewEmailEMLRequest({
required this.accountId,
required this.userName,
required this.blobId,
required this.email,
required this.locale,
required this.appLocalizations,
required this.baseDownloadUrl,
});
String get keyStored => blobId.value;
@override
List<Object?> get props => [
accountId,
userName,
blobId,
email,
locale,
appLocalizations,
baseDownloadUrl,
];
}
@@ -27,6 +27,7 @@ import 'package:tmail_ui_user/features/email/domain/model/detailed_email.dart';
import 'package:tmail_ui_user/features/email/domain/model/email_print.dart';
import 'package:tmail_ui_user/features/email/domain/model/event_action.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart';
import 'package:tmail_ui_user/features/email/domain/model/preview_email_eml_request.dart';
import 'package:tmail_ui_user/features/email/domain/model/restore_deleted_message_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
@@ -181,4 +182,10 @@ abstract class EmailRepository {
EventActionType eventActionType);
Future<List<Email>> parseEmailByBlobIds(AccountId accountId, Set<Id> blobIds);
Future<String> generatePreviewEmailEMLContent(PreviewEmailEMLRequest previewEmailEMLRequest);
Future<void> sharePreviewEmailEMLContent(String keyStored, String previewEMLContent);
Future<String> getPreviewEmailEMLContentShared(String keyStored);
}
@@ -0,0 +1,19 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
class GettingPreviewEmailEMLContentShared extends LoadingState {}
class GetPreviewEmailEMLContentSharedSuccess extends UIState {
final String previewEMLContent;
GetPreviewEmailEMLContentSharedSuccess(this.previewEMLContent);
@override
List<Object?> get props => [previewEMLContent];
}
class GetPreviewEmailEMLContentSharedFailure extends FeatureFailure {
GetPreviewEmailEMLContentSharedFailure(dynamic exception) : super(exception: exception);
}
@@ -1,5 +1,6 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
class ParsingEmailByBlobId extends LoadingState {}
@@ -7,11 +8,12 @@ class ParsingEmailByBlobId extends LoadingState {}
class ParseEmailByBlobIdSuccess extends UIState {
final Email email;
final Id blobId;
ParseEmailByBlobIdSuccess(this.email);
ParseEmailByBlobIdSuccess(this.email, this.blobId);
@override
List<Object> get props => [email];
List<Object> get props => [email, blobId];
}
class ParseEmailByBlobIdFailure extends FeatureFailure {
@@ -0,0 +1,19 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
class PreviewingEmailFromEmlFile extends LoadingState {}
class PreviewEmailFromEmlFileSuccess extends UIState {
final String storeKey;
PreviewEmailFromEmlFileSuccess(this.storeKey);
@override
List<Object?> get props => [storeKey];
}
class PreviewEmailFromEmlFileFailure extends FeatureFailure {
PreviewEmailFromEmlFileFailure(dynamic exception) : super(exception: exception);
}
@@ -0,0 +1,24 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/email/domain/state/get_preview_email_content_shared_state.dart';
class GetPreviewEmailEMLContentSharedInteractor {
final EmailRepository _emailRepository;
const GetPreviewEmailEMLContentSharedInteractor(this._emailRepository);
Stream<Either<Failure, Success>> execute(String keyStored) async* {
try {
yield Right<Failure, Success>(GettingPreviewEmailEMLContentShared());
final previewEMLContent = await _emailRepository
.getPreviewEmailEMLContentShared(keyStored);
yield Right<Failure, Success>(GetPreviewEmailEMLContentSharedSuccess(previewEMLContent));
} catch (e) {
yield Left<Failure, Success>(GetPreviewEmailEMLContentSharedFailure(e));
}
}
}
@@ -20,7 +20,10 @@ class ParseEmailByBlobIdInteractor {
{blobId},
);
yield Right<Failure, Success>(ParseEmailByBlobIdSuccess(emailParsed.first));
yield Right<Failure, Success>(ParseEmailByBlobIdSuccess(
emailParsed.first,
blobId,
));
} catch (e) {
yield Left<Failure, Success>(ParseEmailByBlobIdFailure(e));
}
@@ -0,0 +1,31 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:tmail_ui_user/features/email/domain/model/preview_email_eml_request.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/email/domain/state/preview_email_from_eml_file_state.dart';
class PreviewEmailFromEmlFileInteractor {
final EmailRepository _emailRepository;
const PreviewEmailFromEmlFileInteractor(this._emailRepository);
Stream<Either<Failure, Success>> execute(
PreviewEmailEMLRequest previewEmailEMLRequest,
) async* {
try {
yield Right<Failure, Success>(PreviewingEmailFromEmlFile());
final previewEMLContent = await _emailRepository
.generatePreviewEmailEMLContent(previewEmailEMLRequest);
final keyStored = previewEmailEMLRequest.keyStored;
await _emailRepository.sharePreviewEmailEMLContent(keyStored, previewEMLContent);
yield Right<Failure, Success>(PreviewEmailFromEmlFileSuccess(keyStored));
} catch (e) {
yield Left<Failure, Success>(PreviewEmailFromEmlFileFailure(e));
}
}
}