From 7342bbc11d87d503a6c3204e66bca58882494c49 Mon Sep 17 00:00:00 2001 From: dab246 Date: Mon, 31 Mar 2025 04:29:39 +0700 Subject: [PATCH] TF-3601 View entire message on dialog Signed-off-by: dab246 --- .../presentation/composer_bindings.dart | 1 + .../data/datasource/email_datasource.dart | 3 + .../email_datasource_impl.dart | 6 ++ .../email_hive_cache_datasource_impl.dart | 6 ++ .../email_local_storage_datasource_impl.dart | 88 +++++++++++++++++++ ...email_session_storage_datasource_impl.dart | 6 ++ .../repository/email_repository_impl.dart | 6 ++ .../model/view_entire_message_request.dart | 34 +++++++ .../domain/repository/email_repository.dart | 3 + .../get_entire_message_as_document_state.dart | 18 ++++ ...entire_message_as_document_interactor.dart | 22 +++++ .../presentation/bindings/email_bindings.dart | 7 ++ .../controller/single_email_controller.dart | 49 +++++++++++ .../email/presentation/email_view.dart | 7 +- .../email_previewer_bindings.dart | 2 + .../bindings/mailbox_dashboard_bindings.dart | 2 + .../sending_email_interactor_bindings.dart | 2 + .../bindings/fcm_interactor_bindings.dart | 2 + .../presentation_email_extension.dart | 10 +++ 19 files changed, 273 insertions(+), 1 deletion(-) create mode 100644 lib/features/email/domain/model/view_entire_message_request.dart create mode 100644 lib/features/email/domain/state/get_entire_message_as_document_state.dart create mode 100644 lib/features/email/domain/usecases/get_entire_message_as_document_interactor.dart diff --git a/lib/features/composer/presentation/composer_bindings.dart b/lib/features/composer/presentation/composer_bindings.dart index dee60c914..29727746a 100644 --- a/lib/features/composer/presentation/composer_bindings.dart +++ b/lib/features/composer/presentation/composer_bindings.dart @@ -136,6 +136,7 @@ class ComposerBindings extends BaseBindings { ), tag: composerId); Get.lazyPut(() => EmailLocalStorageDataSourceImpl( Get.find(), + Get.find(), Get.find(), ), tag: composerId); Get.lazyPut(() => EmailSessionStorageDatasourceImpl( diff --git a/lib/features/email/data/datasource/email_datasource.dart b/lib/features/email/data/datasource/email_datasource.dart index d2150a269..e96b700d7 100644 --- a/lib/features/email/data/datasource/email_datasource.dart +++ b/lib/features/email/data/datasource/email_datasource.dart @@ -26,6 +26,7 @@ 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/email/domain/model/view_entire_message_request.dart'; import 'package:tmail_ui_user/features/email/presentation/model/eml_previewer.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; import 'package:tmail_ui_user/features/sending_queue/domain/model/sending_email.dart'; @@ -221,4 +222,6 @@ abstract class EmailDataSource { AccountRequest accountRequest, {CancelToken? cancelToken} ); + + Future generateEntireMessageAsDocument(ViewEntireMessageRequest entireMessageRequest); } \ No newline at end of file diff --git a/lib/features/email/data/datasource_impl/email_datasource_impl.dart b/lib/features/email/data/datasource_impl/email_datasource_impl.dart index 804cd3d07..8cf17e351 100644 --- a/lib/features/email/data/datasource_impl/email_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_datasource_impl.dart @@ -36,6 +36,7 @@ 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/email/domain/model/view_entire_message_request.dart'; import 'package:tmail_ui_user/features/email/presentation/extensions/attachment_extension.dart'; import 'package:tmail_ui_user/features/email/presentation/model/eml_previewer.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; @@ -582,4 +583,9 @@ class EmailDataSourceImpl extends EmailDataSource { cancelToken: cancelToken, ); }).catchError(_exceptionThrower.throwException); + + @override + Future generateEntireMessageAsDocument(ViewEntireMessageRequest entireMessageRequest) { + throw UnimplementedError(); + } } \ No newline at end of file diff --git a/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart b/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart index eff48b11a..eb3f4c1cc 100644 --- a/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart @@ -36,6 +36,7 @@ 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/email/domain/model/view_entire_message_request.dart'; import 'package:tmail_ui_user/features/email/presentation/model/eml_previewer.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; import 'package:tmail_ui_user/features/offline_mode/extensions/list_sending_email_hive_cache_extension.dart'; @@ -582,4 +583,9 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource { Future exportAllAttachments(AccountId accountId, EmailId emailId, String baseDownloadAllUrl, String outputFileName, AccountRequest accountRequest, {CancelToken? cancelToken}) { throw UnimplementedError(); } + + @override + Future generateEntireMessageAsDocument(ViewEntireMessageRequest entireMessageRequest) { + throw UnimplementedError(); + } } \ No newline at end of file diff --git a/lib/features/email/data/datasource_impl/email_local_storage_datasource_impl.dart b/lib/features/email/data/datasource_impl/email_local_storage_datasource_impl.dart index e8d9d8a34..b53c505c8 100644 --- a/lib/features/email/data/datasource_impl/email_local_storage_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_local_storage_datasource_impl.dart @@ -3,13 +3,21 @@ import 'dart:async'; import 'dart:convert'; import 'dart:typed_data'; +import 'package:core/data/model/preview_attachment.dart'; import 'package:core/data/network/download/downloaded_response.dart'; +import 'package:core/domain/extensions/datetime_extension.dart'; +import 'package:core/presentation/extensions/html_extension.dart'; +import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; +import 'package:core/utils/file_utils.dart'; +import 'package:core/utils/preview_eml_file_utils.dart'; import 'package:dartz/dartz.dart'; import 'package:dio/dio.dart'; import 'package:email_recovery/email_recovery/email_recovery_action.dart'; import 'package:email_recovery/email_recovery/email_recovery_action_id.dart'; +import 'package:filesize/filesize.dart'; +import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/error/set_error.dart'; import 'package:jmap_dart_client/jmap/core/id.dart'; @@ -22,6 +30,8 @@ import 'package:model/download/download_task_id.dart'; import 'package:model/email/attachment.dart'; import 'package:model/email/mark_star_action.dart'; import 'package:model/email/read_actions.dart'; +import 'package:model/extensions/list_email_address_extension.dart'; +import 'package:model/extensions/presentation_email_extension.dart'; import 'package:tmail_ui_user/features/caching/utils/local_storage_manager.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart'; @@ -30,6 +40,8 @@ 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/email/domain/model/view_entire_message_request.dart'; +import 'package:tmail_ui_user/features/email/presentation/extensions/attachment_extension.dart'; import 'package:tmail_ui_user/features/email/presentation/model/eml_previewer.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; import 'package:tmail_ui_user/features/sending_queue/domain/model/sending_email.dart'; @@ -38,10 +50,14 @@ import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart'; class EmailLocalStorageDataSourceImpl extends EmailDataSource { final LocalStorageManager _localStorageManager; + final PreviewEmlFileUtils _previewEmlFileUtils; final ExceptionThrower _exceptionThrower; + final ImagePaths _imagePaths = Get.find(); + final FileUtils _fileUtils = Get.find(); EmailLocalStorageDataSourceImpl( this._localStorageManager, + this._previewEmlFileUtils, this._exceptionThrower, ); @@ -273,4 +289,76 @@ class EmailLocalStorageDataSourceImpl extends EmailDataSource { Future exportAllAttachments(AccountId accountId, EmailId emailId, String baseDownloadAllUrl, String outputFileName, AccountRequest accountRequest, {CancelToken? cancelToken}) { throw UnimplementedError(); } + + @override + Future generateEntireMessageAsDocument(ViewEntireMessageRequest entireMessageRequest) { + return Future.sync(() async { + final email = entireMessageRequest.presentationEmail; + final appLocalizations = entireMessageRequest.appLocalizations; + final locale = entireMessageRequest.locale.toLanguageTag(); + final listAttachments = entireMessageRequest.attachments; + final emailContentEscaped = entireMessageRequest.emailContent; + + final sender = email.from?.isNotEmpty == true + ? email.from!.first + : null; + + final receiveTime = email.getReceivedAt( + locale, + pattern: email.receivedAt?.value.toLocal().toPatternForPrinting(locale) + ); + + final sentTime = email.getSentAt( + locale, + pattern: email.sentAt?.value.toLocal().toPatternForPrinting(locale) + ); + + final List listPreviewAttachment = []; + + if (listAttachments.isNotEmpty) { + await Future.forEach(listAttachments, (attachment) async { + final iconBase64Data = await _fileUtils.convertImageAssetToBase64( + attachment.getIcon(_imagePaths)); + + final previewAttachment = PreviewAttachment( + iconBase64Data: iconBase64Data, + name: attachment.name.escapeLtGtHtmlString(), + size: filesize(attachment.size?.value), + link: attachment.hyperLink, + ); + + listPreviewAttachment.add(previewAttachment); + }); + } + + final attachmentIconBase64Data = email.hasAttachment == true + ? await _fileUtils.convertImageAssetToBase64(_imagePaths.icAttachment) + : ''; + + final htmlDocument = _previewEmlFileUtils.generatePreviewEml( + appName: appLocalizations.app_name, + userName: entireMessageRequest.userName.value, + subjectPrefix: appLocalizations.subject, + subject: email.subject?.escapeLtGtHtmlString() ?? '', + emailContent: emailContentEscaped, + senderName: sender?.name.escapeLtGtHtmlString() ?? '', + senderEmailAddress: sender?.email ?? '', + dateTime: receiveTime.isNotEmpty ? receiveTime : sentTime, + fromPrefix: appLocalizations.from_email_address_prefix, + toPrefix: appLocalizations.to_email_address_prefix, + ccPrefix: appLocalizations.cc_email_address_prefix, + bccPrefix: appLocalizations.bcc_email_address_prefix, + replyToPrefix: appLocalizations.replyToEmailAddressPrefix, + titleAttachment: appLocalizations.attachments.toLowerCase(), + attachmentIcon: attachmentIconBase64Data, + toAddress: email.to?.listEmailAddressToString(isFullEmailAddress: true), + ccAddress: email.cc?.listEmailAddressToString(isFullEmailAddress: true), + bccAddress: email.bcc?.listEmailAddressToString(isFullEmailAddress: true), + replyToAddress: email.replyTo?.listEmailAddressToString(isFullEmailAddress: true), + listAttachment: listPreviewAttachment, + ); + + return htmlDocument; + }).catchError(_exceptionThrower.throwException); + } } \ No newline at end of file diff --git a/lib/features/email/data/datasource_impl/email_session_storage_datasource_impl.dart b/lib/features/email/data/datasource_impl/email_session_storage_datasource_impl.dart index 2aebbc7ca..bd61a9ae1 100644 --- a/lib/features/email/data/datasource_impl/email_session_storage_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_session_storage_datasource_impl.dart @@ -30,6 +30,7 @@ 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/email/domain/model/view_entire_message_request.dart'; import 'package:tmail_ui_user/features/email/presentation/model/eml_previewer.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; import 'package:tmail_ui_user/features/sending_queue/domain/model/sending_email.dart'; @@ -271,4 +272,9 @@ class EmailSessionStorageDatasourceImpl extends EmailDataSource { Future exportAllAttachments(AccountId accountId, EmailId emailId, String baseDownloadAllUrl, String outputFileName, AccountRequest accountRequest, {CancelToken? cancelToken}) { throw UnimplementedError(); } + + @override + Future generateEntireMessageAsDocument(ViewEntireMessageRequest entireMessageRequest) { + throw UnimplementedError(); + } } \ No newline at end of file diff --git a/lib/features/email/data/repository/email_repository_impl.dart b/lib/features/email/data/repository/email_repository_impl.dart index b00fdaea5..78274d00c 100644 --- a/lib/features/email/data/repository/email_repository_impl.dart +++ b/lib/features/email/data/repository/email_repository_impl.dart @@ -34,6 +34,7 @@ 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/email/domain/model/view_entire_message_request.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/email/presentation/model/eml_previewer.dart'; import 'package:tmail_ui_user/features/mailbox/data/datasource/state_datasource.dart'; @@ -567,4 +568,9 @@ class EmailRepositoryImpl extends EmailRepository { outputFileName, accountRequest, ); + + @override + Future generateEntireMessageAsDocument(ViewEntireMessageRequest entireMessageRequest) { + return emailDataSource[DataSourceType.local]!.generateEntireMessageAsDocument(entireMessageRequest); + } } \ No newline at end of file diff --git a/lib/features/email/domain/model/view_entire_message_request.dart b/lib/features/email/domain/model/view_entire_message_request.dart new file mode 100644 index 000000000..956b7aa3c --- /dev/null +++ b/lib/features/email/domain/model/view_entire_message_request.dart @@ -0,0 +1,34 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter/material.dart'; +import 'package:jmap_dart_client/jmap/core/user_name.dart'; +import 'package:model/email/attachment.dart'; +import 'package:model/email/presentation_email.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +class ViewEntireMessageRequest with EquatableMixin { + final UserName userName; + final PresentationEmail presentationEmail; + final List attachments; + final String emailContent; + final Locale locale; + final AppLocalizations appLocalizations; + + ViewEntireMessageRequest({ + required this.userName, + required this.presentationEmail, + required this.attachments, + required this.emailContent, + required this.locale, + required this.appLocalizations, + }); + + @override + List get props => [ + userName, + presentationEmail, + attachments, + emailContent, + locale, + appLocalizations, + ]; +} \ No newline at end of file diff --git a/lib/features/email/domain/repository/email_repository.dart b/lib/features/email/domain/repository/email_repository.dart index 2496a5ac6..99e91b455 100644 --- a/lib/features/email/domain/repository/email_repository.dart +++ b/lib/features/email/domain/repository/email_repository.dart @@ -29,6 +29,7 @@ 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/email/domain/model/view_entire_message_request.dart'; import 'package:tmail_ui_user/features/email/presentation/model/eml_previewer.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; @@ -219,4 +220,6 @@ abstract class EmailRepository { AccountRequest accountRequest, {CancelToken? cancelToken} ); + + Future generateEntireMessageAsDocument(ViewEntireMessageRequest entireMessageRequest); } \ No newline at end of file diff --git a/lib/features/email/domain/state/get_entire_message_as_document_state.dart b/lib/features/email/domain/state/get_entire_message_as_document_state.dart new file mode 100644 index 000000000..4814db07e --- /dev/null +++ b/lib/features/email/domain/state/get_entire_message_as_document_state.dart @@ -0,0 +1,18 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; + +class GettingEntireMessageAsDocument extends LoadingState {} + +class GetEntireMessageAsDocumentSuccess extends UIState { + final String messageDocument; + + GetEntireMessageAsDocumentSuccess(this.messageDocument); + + @override + List get props => [messageDocument]; +} + +class GetEntireMessageAsDocumentFailure extends FeatureFailure { + + GetEntireMessageAsDocumentFailure({dynamic exception}) : super(exception: exception); +} \ No newline at end of file diff --git a/lib/features/email/domain/usecases/get_entire_message_as_document_interactor.dart b/lib/features/email/domain/usecases/get_entire_message_as_document_interactor.dart new file mode 100644 index 000000000..5b623ed09 --- /dev/null +++ b/lib/features/email/domain/usecases/get_entire_message_as_document_interactor.dart @@ -0,0 +1,22 @@ +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/view_entire_message_request.dart'; +import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; +import 'package:tmail_ui_user/features/email/domain/state/get_entire_message_as_document_state.dart'; + +class GetEntireMessageAsDocumentInteractor { + final EmailRepository _emailRepository; + + GetEntireMessageAsDocumentInteractor(this._emailRepository); + + Stream> execute(ViewEntireMessageRequest messageRequest) async* { + try { + yield Right(GettingEntireMessageAsDocument()); + final messageDocument = await _emailRepository.generateEntireMessageAsDocument(messageRequest); + yield Right(GetEntireMessageAsDocumentSuccess(messageDocument)); + } catch (e) { + yield Left(GetEntireMessageAsDocumentFailure(exception: e)); + } + } +} \ No newline at end of file diff --git a/lib/features/email/presentation/bindings/email_bindings.dart b/lib/features/email/presentation/bindings/email_bindings.dart index d8d56de82..a6a52aa86 100644 --- a/lib/features/email/presentation/bindings/email_bindings.dart +++ b/lib/features/email/presentation/bindings/email_bindings.dart @@ -22,6 +22,7 @@ import 'package:tmail_ui_user/features/email/domain/usecases/download_attachment import 'package:tmail_ui_user/features/email/domain/usecases/export_all_attachments_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/export_attachment_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/get_email_content_interactor.dart'; +import 'package:tmail_ui_user/features/email/domain/usecases/get_entire_message_as_document_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/get_stored_email_state_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_email_read_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_interactor.dart'; @@ -134,6 +135,7 @@ class EmailBindings extends BaseBindings { Get.find())); Get.lazyPut(() => EmailLocalStorageDataSourceImpl( Get.find(), + Get.find(), Get.find())); Get.lazyPut(() => EmailSessionStorageDatasourceImpl( Get.find(), @@ -182,6 +184,11 @@ class EmailBindings extends BaseBindings { Get.find(), Get.find(), Get.find())); + if (PlatformInfo.isIOS) { + Get.lazyPut(() => GetEntireMessageAsDocumentInteractor( + Get.find(), + )); + } } @override diff --git a/lib/features/email/presentation/controller/single_email_controller.dart b/lib/features/email/presentation/controller/single_email_controller.dart index 185cac018..f8f86ba93 100644 --- a/lib/features/email/presentation/controller/single_email_controller.dart +++ b/lib/features/email/presentation/controller/single_email_controller.dart @@ -54,6 +54,7 @@ import 'package:tmail_ui_user/features/email/domain/model/move_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/send_receipt_to_sender_request.dart'; +import 'package:tmail_ui_user/features/email/domain/model/view_entire_message_request.dart'; import 'package:tmail_ui_user/features/email/domain/state/calendar_event_accept_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/calendar_event_maybe_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/calendar_event_reject_state.dart'; @@ -64,6 +65,7 @@ import 'package:tmail_ui_user/features/email/domain/state/download_attachments_s import 'package:tmail_ui_user/features/email/domain/state/export_all_attachments_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/export_attachment_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/get_email_content_state.dart'; +import 'package:tmail_ui_user/features/email/domain/state/get_entire_message_as_document_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/get_html_content_from_attachment_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_star_state.dart'; @@ -79,6 +81,7 @@ import 'package:tmail_ui_user/features/email/domain/state/unsubscribe_email_stat import 'package:tmail_ui_user/features/email/domain/usecases/calendar_event_accept_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/download_all_attachments_for_web_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/export_all_attachments_interactor.dart'; +import 'package:tmail_ui_user/features/email/domain/usecases/get_entire_message_as_document_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/maybe_calendar_event_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/calendar_event_reject_interactor.dart'; @@ -2550,4 +2553,50 @@ class SingleEmailController extends BaseController with AppLoaderMixin { log('SingleEmailController::onHtmlContentClippedAction:isClipped = $isClipped'); isEmailContentClipped.value = isClipped; } + + Future onViewEntireMessage({ + required BuildContext context, + required PresentationEmail presentationEmail, + required String emailContent, + }) async { + final getEntireMessageAsDocumentInteractor = getBinding(); + if (getEntireMessageAsDocumentInteractor == null) return; + + final appLocalizations = AppLocalizations.of(context); + SmartDialog.showLoading( + msg: appLocalizations.loadingPleaseWait, + maskColor: Colors.black38, + ); + + final viewEntireMessageRequest = ViewEntireMessageRequest( + userName: userName ?? UserName(''), + presentationEmail: presentationEmail, + attachments: attachments, + emailContent: emailContent, + locale: Localizations.localeOf(context), + appLocalizations: appLocalizations, + ); + + final resultState = await getEntireMessageAsDocumentInteractor + .execute(viewEntireMessageRequest) + .last; + + resultState.foldSuccess( + onSuccess: (success) { + SmartDialog.dismiss(); + + showDialogToPreviewEMLAttachment( + context, + EMLPreviewer( + id: presentationEmail.id?.asString ?? '', + title: presentationEmail.subject ?? '', + content: success.messageDocument, + ), + ); + }, + onFailure: (_) { + SmartDialog.dismiss(); + } + ); + } } \ No newline at end of file diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index cd34cdca6..775e0d3e9 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -482,7 +482,12 @@ class EmailView extends GetWidget { bottom: 24, ), backgroundColor: Colors.transparent, - onTapActionCallback: () {}, + onTapActionCallback: () => + controller.onViewEntireMessage( + context: context, + emailContent: allEmailContents, + presentationEmail: presentationEmail, + ), ), ], ); diff --git a/lib/features/email_previewer/email_previewer_bindings.dart b/lib/features/email_previewer/email_previewer_bindings.dart index 1712d4602..ba6e56c22 100644 --- a/lib/features/email_previewer/email_previewer_bindings.dart +++ b/lib/features/email_previewer/email_previewer_bindings.dart @@ -3,6 +3,7 @@ import 'package:core/data/model/source_type/data_source_type.dart'; import 'package:core/data/network/download/download_manager.dart'; import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/utils/file_utils.dart'; +import 'package:core/utils/preview_eml_file_utils.dart'; import 'package:core/utils/print_utils.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/base/base_bindings.dart'; @@ -97,6 +98,7 @@ class EmailPreviewerBindings extends BaseBindings { Get.find())); Get.lazyPut(() => EmailLocalStorageDataSourceImpl( Get.find(), + Get.find(), Get.find())); Get.lazyPut(() => EmailSessionStorageDatasourceImpl( Get.find(), diff --git a/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart b/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart index b6b9e76ef..c0ee57225 100644 --- a/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart +++ b/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart @@ -3,6 +3,7 @@ import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/utils/html_transformer/html_transform.dart'; import 'package:core/utils/config/app_config_loader.dart'; import 'package:core/utils/file_utils.dart'; +import 'package:core/utils/preview_eml_file_utils.dart'; import 'package:core/utils/print_utils.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/base/base_bindings.dart'; @@ -276,6 +277,7 @@ class MailboxDashBoardBindings extends BaseBindings { Get.find())); Get.lazyPut(() => EmailLocalStorageDataSourceImpl( Get.find(), + Get.find(), Get.find())); Get.lazyPut(() => EmailSessionStorageDatasourceImpl( Get.find(), diff --git a/lib/features/offline_mode/bindings/sending_email_interactor_bindings.dart b/lib/features/offline_mode/bindings/sending_email_interactor_bindings.dart index 829fb2137..d3a137681 100644 --- a/lib/features/offline_mode/bindings/sending_email_interactor_bindings.dart +++ b/lib/features/offline_mode/bindings/sending_email_interactor_bindings.dart @@ -1,6 +1,7 @@ import 'package:core/data/model/source_type/data_source_type.dart'; import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/utils/file_utils.dart'; +import 'package:core/utils/preview_eml_file_utils.dart'; import 'package:core/utils/print_utils.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/base/interactors_bindings.dart'; @@ -95,6 +96,7 @@ class SendEmailInteractorBindings extends InteractorsBindings { Get.find())); Get.lazyPut(() => EmailLocalStorageDataSourceImpl( Get.find(), + Get.find(), Get.find())); Get.lazyPut(() => EmailSessionStorageDatasourceImpl( Get.find(), diff --git a/lib/features/push_notification/presentation/bindings/fcm_interactor_bindings.dart b/lib/features/push_notification/presentation/bindings/fcm_interactor_bindings.dart index 95e75d75f..714644e12 100644 --- a/lib/features/push_notification/presentation/bindings/fcm_interactor_bindings.dart +++ b/lib/features/push_notification/presentation/bindings/fcm_interactor_bindings.dart @@ -1,6 +1,7 @@ import 'package:core/data/model/source_type/data_source_type.dart'; import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/utils/file_utils.dart'; +import 'package:core/utils/preview_eml_file_utils.dart'; import 'package:core/utils/print_utils.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/base/interactors_bindings.dart'; @@ -133,6 +134,7 @@ class FcmInteractorBindings extends InteractorsBindings { Get.find())); Get.lazyPut(() => EmailLocalStorageDataSourceImpl( Get.find(), + Get.find(), Get.find())); Get.lazyPut(() => EmailSessionStorageDatasourceImpl( Get.find(), diff --git a/model/lib/extensions/presentation_email_extension.dart b/model/lib/extensions/presentation_email_extension.dart index c14a14ee3..39c34be71 100644 --- a/model/lib/extensions/presentation_email_extension.dart +++ b/model/lib/extensions/presentation_email_extension.dart @@ -58,6 +58,16 @@ extension PresentationEmailExtension on PresentationEmail { return ''; } + String getSentAt(String newLocale, {String? pattern}) { + if (sentAt != null) { + return sentAt!.formatDateToLocal( + pattern: pattern ?? sentAt!.value.toLocal().toPattern(), + locale: newLocale, + ); + } + return ''; + } + Set get listEmailAddressSender => from.asSet()..addAll(replyTo.asSet()); PresentationEmail toggleSelect() {