diff --git a/core/lib/presentation/utils/html_transformer/dom/hide_draft_signature_transformer.dart b/core/lib/presentation/utils/html_transformer/dom/hide_draft_signature_transformer.dart new file mode 100644 index 000000000..e22d081a0 --- /dev/null +++ b/core/lib/presentation/utils/html_transformer/dom/hide_draft_signature_transformer.dart @@ -0,0 +1,26 @@ +import 'package:core/data/network/dio_client.dart'; +import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart'; +import 'package:html/dom.dart'; + +class HideDraftSignatureTransformer extends DomTransformer { + + const HideDraftSignatureTransformer(); + + @override + Future process({ + required Document document, + required DioClient dioClient, + Map? mapUrlDownloadCID + }) async { + final signature = document.querySelector('div.tmail-signature'); + if (signature == null) return; + final currentStyle = signature.attributes['style']?.trim(); + if (currentStyle == null) { + signature.attributes['style'] = 'display: none;'; + } else if (currentStyle.endsWith(';')) { + signature.attributes['style'] = '$currentStyle display: none;'; + } else { + signature.attributes['style'] = '$currentStyle; display: none;'; + } + } +} \ No newline at end of file diff --git a/core/lib/presentation/utils/html_transformer/transform_configuration.dart b/core/lib/presentation/utils/html_transformer/transform_configuration.dart index 45a009175..aee876b22 100644 --- a/core/lib/presentation/utils/html_transformer/transform_configuration.dart +++ b/core/lib/presentation/utils/html_transformer/transform_configuration.dart @@ -6,6 +6,7 @@ import 'package:core/presentation/utils/html_transformer/dom/add_target_blank_in import 'package:core/presentation/utils/html_transformer/dom/add_tooltip_link_transformers.dart'; import 'package:core/presentation/utils/html_transformer/dom/blockcode_transformers.dart'; import 'package:core/presentation/utils/html_transformer/dom/blockquoted_transformers.dart'; +import 'package:core/presentation/utils/html_transformer/dom/hide_draft_signature_transformer.dart'; import 'package:core/presentation/utils/html_transformer/dom/image_transformers.dart'; import 'package:core/presentation/utils/html_transformer/dom/remove_collapsed_signature_button_transformers.dart'; import 'package:core/presentation/utils/html_transformer/dom/remove_lazy_loading_for_background_image_transformers.dart'; @@ -47,6 +48,9 @@ class TransformConfiguration { ]); factory TransformConfiguration.forDraftsEmail() => TransformConfiguration.fromDomTransformers([const ImageTransformer()]); + factory TransformConfiguration.forEditDraftsEmail() => TransformConfiguration.fromDomTransformers([ + ...TransformConfiguration.forDraftsEmail().domTransformers, + const HideDraftSignatureTransformer()]); factory TransformConfiguration.forPreviewEmailOnWeb() => TransformConfiguration.create( customDomTransformers: [ diff --git a/lib/features/composer/data/repository/composer_repository_impl.dart b/lib/features/composer/data/repository/composer_repository_impl.dart index 2f502bd40..f435699ba 100644 --- a/lib/features/composer/data/repository/composer_repository_impl.dart +++ b/lib/features/composer/data/repository/composer_repository_impl.dart @@ -44,7 +44,10 @@ class ComposerRepositoryImpl extends ComposerRepository { } @override - Future generateEmail(CreateEmailRequest createEmailRequest) async { + Future generateEmail( + CreateEmailRequest createEmailRequest, + {bool withIdentityHeader = false} + ) async { String emailContent = createEmailRequest.emailContent; Set emailAttachments = Set.from(createEmailRequest.createAttachments()); @@ -69,7 +72,8 @@ class ComposerRepositoryImpl extends ComposerRepository { newEmailContent: emailContent, newEmailAttachments: emailAttachments, userAgent: userAgent, - partId: emailBodyPartId + partId: emailBodyPartId, + withIdentityHeader: withIdentityHeader, ); return emailObject; diff --git a/lib/features/composer/domain/repository/composer_repository.dart b/lib/features/composer/domain/repository/composer_repository.dart index 8ba787980..caeac9e62 100644 --- a/lib/features/composer/domain/repository/composer_repository.dart +++ b/lib/features/composer/domain/repository/composer_repository.dart @@ -5,7 +5,9 @@ import 'package:tmail_ui_user/features/composer/presentation/model/create_email_ import 'package:tmail_ui_user/features/upload/domain/model/upload_attachment.dart'; abstract class ComposerRepository { - Future generateEmail(CreateEmailRequest createEmailRequest); + Future generateEmail( + CreateEmailRequest createEmailRequest, + {bool withIdentityHeader = false}); Future uploadAttachment(FileInfo fileInfo, Uri uploadUri, {CancelToken? cancelToken}); diff --git a/lib/features/composer/domain/usecases/create_new_and_save_email_to_drafts_interactor.dart b/lib/features/composer/domain/usecases/create_new_and_save_email_to_drafts_interactor.dart index 0c20eeff1..dd7649a7d 100644 --- a/lib/features/composer/domain/usecases/create_new_and_save_email_to_drafts_interactor.dart +++ b/lib/features/composer/domain/usecases/create_new_and_save_email_to_drafts_interactor.dart @@ -103,7 +103,9 @@ class CreateNewAndSaveEmailToDraftsInteractor { Future _createEmailObject(CreateEmailRequest createEmailRequest) async { try { - final emailCreated = await _composerRepository.generateEmail(createEmailRequest); + final emailCreated = await _composerRepository.generateEmail( + createEmailRequest, + withIdentityHeader: true); return emailCreated; } catch (e) { logError('CreateNewAndSaveEmailToDraftsInteractor::_createEmailObject: Exception: $e'); diff --git a/lib/features/composer/domain/usecases/save_composer_cache_on_web_interactor.dart b/lib/features/composer/domain/usecases/save_composer_cache_on_web_interactor.dart index 4877dc469..4abf6166e 100644 --- a/lib/features/composer/domain/usecases/save_composer_cache_on_web_interactor.dart +++ b/lib/features/composer/domain/usecases/save_composer_cache_on_web_interactor.dart @@ -24,13 +24,14 @@ class SaveComposerCacheOnWebInteractor { UserName userName, ) async { try { - final emailCreated = await _composerRepository.generateEmail(createEmailRequest); + final emailCreated = await _composerRepository.generateEmail( + createEmailRequest, + withIdentityHeader: true); await _composerCacheRepository.saveComposerCacheOnWeb( accountId: accountId, userName: userName, composerCache: ComposerCache( email: emailCreated, - identity: createEmailRequest.identity, hasRequestReadReceipt: createEmailRequest.hasRequestReadReceipt, displayMode: createEmailRequest.displayMode )); diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index 032bafe1b..c55a1107a 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -17,9 +17,11 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; import 'package:html_editor_enhanced/html_editor.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/identities/identity.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; +import 'package:jmap_dart_client/jmap/mail/email/individual_header_identifier.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:model/model.dart'; import 'package:permission_handler/permission_handler.dart'; @@ -58,6 +60,7 @@ import 'package:tmail_ui_user/features/composer/presentation/extensions/list_sha import 'package:tmail_ui_user/features/composer/presentation/mixin/drag_drog_file_mixin.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/create_email_request.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/draggable_email_address.dart'; +import 'package:tmail_ui_user/features/composer/presentation/model/signature_status.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/inline_image.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/prefix_recipient_state.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/screen_display_mode.dart'; @@ -191,6 +194,7 @@ class ComposerController extends BaseController with DragDropFileMixin implement ButtonState _closeComposerButtonState = ButtonState.enabled; ButtonState _saveToDraftButtonState = ButtonState.enabled; ButtonState _sendButtonState = ButtonState.enabled; + SignatureStatus _identityContentOnOpenPolicy = SignatureStatus.editedAvailable; late Worker uploadInlineImageWorker; late Worker dashboardViewStateWorker; @@ -258,6 +262,7 @@ class ComposerController extends BaseController with DragDropFileMixin implement } else { richTextMobileTabletController = null; } + _identityContentOnOpenPolicy = SignatureStatus.editedAvailable; super.onClose(); } @@ -716,14 +721,21 @@ class ComposerController extends BaseController with DragDropFileMixin implement } } + Identity? _selectIdentityFromId(IdentityId? identityId) { + if (identityId == null) return null; + + return listFromIdentities.firstWhereOrNull( + (identity) => identity.id == identityId); + } + void _initIdentities(ComposerArguments composerArguments) { listFromIdentities.value = composerArguments.identities ?? []; + final selectedIdentityFromId = _selectIdentityFromId( + composerArguments.selectedIdentityId); if (listFromIdentities.isEmpty) { _getAllIdentities(); - } else if (composerArguments.selectedIdentity != null - && listFromIdentities.contains(composerArguments.selectedIdentity!) - ) { - _selectIdentity(composerArguments.selectedIdentity!); + } else if (selectedIdentityFromId != null) { + _selectIdentity(selectedIdentityFromId); } else if (composerArguments.identities?.isNotEmpty == true) { _selectIdentity(composerArguments.identities!.first); } @@ -744,11 +756,10 @@ class ComposerController extends BaseController with DragDropFileMixin implement listFromIdentities.value = listIdentitiesMayDeleted; if (identitySelected.value == null) { - final selectedIdentityFromArguments = composerArguments.value?.selectedIdentity; - if (selectedIdentityFromArguments != null - && listFromIdentities.contains(selectedIdentityFromArguments) - ) { - await _selectIdentity(selectedIdentityFromArguments); + final selectedIdentityFromId = _selectIdentityFromId( + composerArguments.value?.selectedIdentityId); + if (selectedIdentityFromId != null) { + await _selectIdentity(selectedIdentityFromId); } else { await _selectIdentity(listIdentitiesMayDeleted.firstOrNull); } @@ -1389,7 +1400,9 @@ class ComposerController extends BaseController with DragDropFileMixin implement accountId, emailId, mailboxDashBoardController.baseDownloadUrl, - TransformConfiguration.forDraftsEmail() + TransformConfiguration.forEditDraftsEmail(), + additionalProperties: Properties({ + IndividualHeaderIdentifier.identityHeader.value}), )); } @@ -1412,9 +1425,18 @@ class ComposerController extends BaseController with DragDropFileMixin implement if (composerArguments.value?.emailActionType == EmailActionType.editDraft) { _setUpRequestReadReceiptForDraftEmail(success.emailCurrent); + _restoreIdentityFromHeader(success.emailCurrent); } } + void _restoreIdentityFromHeader(Email? email) { + final identityIdFromHeader = email?.identityIdFromHeader; + if (identityIdFromHeader == null) return; + final selectedIdentityFromHeader = _selectIdentityFromId(identityIdFromHeader); + if (selectedIdentityFromHeader == null) return; + identitySelected.value = selectedIdentityFromHeader; + } + void _transformHtmlEmailContent(String? emailContent) { emailContentsViewState(Right(TransformHtmlEmailContentLoading())); if (emailContent?.isEmpty == true) { @@ -1662,11 +1684,18 @@ class ComposerController extends BaseController with DragDropFileMixin implement identitySelected.value = newIdentity; if (newIdentity == null) return; - if (composerArguments.value?.emailActionType == EmailActionType.reopenComposerBrowser) { - composerArguments.value = composerArguments.value?.copyWith( - emailActionType: EmailActionType.editDraft); - } else { - await _applyIdentityForAllFieldComposer(formerIdentity, newIdentity); + final emailActionType = composerArguments.value?.emailActionType; + switch (emailActionType) { + case EmailActionType.reopenComposerBrowser: + case EmailActionType.editDraft: + if (_identityContentOnOpenPolicy == SignatureStatus.editedAvailable) { + _identityContentOnOpenPolicy = SignatureStatus.editedApplied; + } else { + await _applyIdentityForAllFieldComposer(formerIdentity, newIdentity); + } + break; + default: + await _applyIdentityForAllFieldComposer(formerIdentity, newIdentity); } } @@ -1891,7 +1920,9 @@ class ComposerController extends BaseController with DragDropFileMixin implement if (identitySelected.value == null) { _getAllIdentities(); } else { - await _selectIdentity(identitySelected.value); + if (composerArguments.value?.emailActionType != EmailActionType.editDraft) { + await _selectIdentity(identitySelected.value); + } _autoFocusFieldWhenLauncher(); } } diff --git a/lib/features/composer/presentation/extensions/create_email_request_extension.dart b/lib/features/composer/presentation/extensions/create_email_request_extension.dart index cd0e6d0bc..f6de928bb 100644 --- a/lib/features/composer/presentation/extensions/create_email_request_extension.dart +++ b/lib/features/composer/presentation/extensions/create_email_request_extension.dart @@ -105,6 +105,7 @@ extension CreateEmailRequestExtension on CreateEmailRequest { required Set newEmailAttachments, required String userAgent, required PartId partId, + bool withIdentityHeader = false, }) { return Email( mailboxIds: createMailboxIds(), @@ -145,6 +146,9 @@ extension CreateEmailRequestExtension on CreateEmailRequest { headerMdn: hasRequestReadReceipt ? { IndividualHeaderIdentifier.headerMdn: createMdnEmailAddress() } : null, + identityHeader: withIdentityHeader + ? {IndividualHeaderIdentifier.identityHeader: identity?.id?.id.value} + : null ); } diff --git a/lib/features/composer/presentation/model/signature_status.dart b/lib/features/composer/presentation/model/signature_status.dart new file mode 100644 index 000000000..773978344 --- /dev/null +++ b/lib/features/composer/presentation/model/signature_status.dart @@ -0,0 +1,4 @@ +enum SignatureStatus { + editedAvailable, + editedApplied, +} \ No newline at end of file diff --git a/lib/features/email/data/datasource/email_datasource.dart b/lib/features/email/data/datasource/email_datasource.dart index 612468edf..2cfa7a9b4 100644 --- a/lib/features/email/data/datasource/email_datasource.dart +++ b/lib/features/email/data/datasource/email_datasource.dart @@ -9,6 +9,7 @@ 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:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; @@ -26,7 +27,11 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_r import 'package:tmail_ui_user/features/sending_queue/domain/model/sending_email.dart'; abstract class EmailDataSource { - Future getEmailContent(Session session, AccountId accountId, EmailId emailId); + Future getEmailContent( + Session session, + AccountId accountId, + EmailId emailId, + {Properties? additionalProperties}); Future sendEmail( Session session, 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 407c1c1a0..c64e3ea66 100644 --- a/lib/features/email/data/datasource_impl/email_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_datasource_impl.dart @@ -10,6 +10,7 @@ import 'package:email_recovery/email_recovery/email_recovery_action.dart'; import 'package:email_recovery/email_recovery/email_recovery_action_id.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; @@ -35,9 +36,18 @@ class EmailDataSourceImpl extends EmailDataSource { EmailDataSourceImpl(this.emailAPI, this._exceptionThrower); @override - Future getEmailContent(Session session, AccountId accountId, EmailId emailId) { + Future getEmailContent( + Session session, + AccountId accountId, + EmailId emailId, + {Properties? additionalProperties} + ) { return Future.sync(() async { - return await emailAPI.getEmailContent(session, accountId, emailId); + return await emailAPI.getEmailContent( + session, + accountId, + emailId, + additionalProperties: additionalProperties); }).catchError(_exceptionThrower.throwException); } 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 fe9a6eade..e866992c1 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 @@ -12,6 +12,7 @@ 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:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; @@ -109,7 +110,12 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource { } @override - Future getEmailContent(Session session, AccountId accountId, EmailId emailId) { + Future getEmailContent( + Session session, + AccountId accountId, + EmailId emailId, + {Properties? additionalProperties} + ) { throw UnimplementedError(); } diff --git a/lib/features/email/data/network/email_api.dart b/lib/features/email/data/network/email_api.dart index 4a148a663..4ff128005 100644 --- a/lib/features/email/data/network/email_api.dart +++ b/lib/features/email/data/network/email_api.dart @@ -81,7 +81,12 @@ class EmailAPI with HandleSetErrorMixin { EmailAPI(this._httpClient, this._downloadManager, this._dioClient, this._uuid); - Future getEmailContent(Session session, AccountId accountId, EmailId emailId) async { + Future getEmailContent( + Session session, + AccountId accountId, + EmailId emailId, + {Properties? additionalProperties} + ) async { final processingInvocation = ProcessingInvocation(); final jmapRequestBuilder = JmapRequestBuilder(_httpClient, processingInvocation); @@ -90,6 +95,9 @@ class EmailAPI with HandleSetErrorMixin { ..addIds({emailId.id}) ..addProperties(ThreadConstants.propertiesGetEmailContent) ..addFetchHTMLBodyValues(true); + if (additionalProperties != null) { + getEmailMethod.addProperties(additionalProperties); + } final getEmailInvocation = jmapRequestBuilder.invocation(getEmailMethod); diff --git a/lib/features/email/data/repository/email_repository_impl.dart b/lib/features/email/data/repository/email_repository_impl.dart index 2d699dc11..57860f7ef 100644 --- a/lib/features/email/data/repository/email_repository_impl.dart +++ b/lib/features/email/data/repository/email_repository_impl.dart @@ -11,6 +11,7 @@ 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:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; @@ -49,8 +50,17 @@ class EmailRepositoryImpl extends EmailRepository { ); @override - Future getEmailContent(Session session, AccountId accountId, EmailId emailId) { - return emailDataSource[DataSourceType.network]!.getEmailContent(session ,accountId, emailId); + Future getEmailContent( + Session session, + AccountId accountId, + EmailId emailId, + {Properties? additionalProperties} + ) { + return emailDataSource[DataSourceType.network]!.getEmailContent( + session, + accountId, + emailId, + additionalProperties: additionalProperties); } @override diff --git a/lib/features/email/domain/repository/email_repository.dart b/lib/features/email/domain/repository/email_repository.dart index 38488b058..88ae516c2 100644 --- a/lib/features/email/domain/repository/email_repository.dart +++ b/lib/features/email/domain/repository/email_repository.dart @@ -10,6 +10,7 @@ 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:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; @@ -28,7 +29,11 @@ import 'package:tmail_ui_user/features/email/domain/model/restore_deleted_messag import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; abstract class EmailRepository { - Future getEmailContent(Session session, AccountId accountId, EmailId emailId); + Future getEmailContent( + Session session, + AccountId accountId, + EmailId emailId, + {Properties? additionalProperties}); Future sendEmail( Session session, diff --git a/lib/features/email/domain/usecases/get_email_content_interactor.dart b/lib/features/email/domain/usecases/get_email_content_interactor.dart index 7480304b6..19622cbc5 100644 --- a/lib/features/email/domain/usecases/get_email_content_interactor.dart +++ b/lib/features/email/domain/usecases/get_email_content_interactor.dart @@ -6,6 +6,7 @@ import 'package:core/utils/app_logger.dart'; import 'package:core/utils/platform_info.dart'; import 'package:dartz/dartz.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/model.dart'; @@ -23,14 +24,27 @@ class GetEmailContentInteractor { EmailId emailId, String baseDownloadUrl, TransformConfiguration transformConfiguration, + {Properties? additionalProperties} ) async* { try { yield Right(GetEmailContentLoading()); if (PlatformInfo.isMobile) { - yield* _getStoredOpenedEmail(session, accountId, emailId, baseDownloadUrl, transformConfiguration); + yield* _getStoredOpenedEmail( + session, + accountId, + emailId, + baseDownloadUrl, + transformConfiguration, + additionalProperties: additionalProperties); } else { - yield* _getContentEmailFromServer(session, accountId, emailId, baseDownloadUrl, transformConfiguration); + yield* _getContentEmailFromServer( + session, + accountId, + emailId, + baseDownloadUrl, + transformConfiguration, + additionalProperties: additionalProperties); } } catch (e) { log('GetEmailContentInteractor::execute(): exception = $e'); @@ -44,9 +58,14 @@ class GetEmailContentInteractor { EmailId emailId, String baseDownloadUrl, TransformConfiguration transformConfiguration, + {Properties? additionalProperties} ) async* { try { - final email = await emailRepository.getEmailContent(session, accountId, emailId); + final email = await emailRepository.getEmailContent( + session, + accountId, + emailId, + additionalProperties: additionalProperties); final listAttachments = email.allAttachments.getListAttachmentsDisplayedOutside(email.htmlBodyAttachments); final listInlineImages = email.allAttachments.listAttachmentsDisplayedInContent; @@ -87,6 +106,7 @@ class GetEmailContentInteractor { EmailId emailId, String baseDownloadUrl, TransformConfiguration transformConfiguration, + {Properties? additionalProperties} ) async* { try { log('GetEmailContentInteractor::_getStoredOpenedEmail(): CALLED'); @@ -109,7 +129,8 @@ class GetEmailContentInteractor { accountId, emailId, baseDownloadUrl, - transformConfiguration + transformConfiguration, + additionalProperties: additionalProperties ); } } @@ -120,6 +141,7 @@ class GetEmailContentInteractor { EmailId emailId, String baseDownloadUrl, TransformConfiguration transformConfiguration, + {Properties? additionalProperties} ) async* { try { log('GetEmailContentInteractor::_getStoredNewEmail():CALLED'); @@ -142,7 +164,8 @@ class GetEmailContentInteractor { accountId, emailId, baseDownloadUrl, - transformConfiguration + transformConfiguration, + additionalProperties: additionalProperties ); } } diff --git a/lib/features/email/presentation/extensions/composer_arguments_extension.dart b/lib/features/email/presentation/extensions/composer_arguments_extension.dart index 3840d6ece..7653000fe 100644 --- a/lib/features/email/presentation/extensions/composer_arguments_extension.dart +++ b/lib/features/email/presentation/extensions/composer_arguments_extension.dart @@ -3,10 +3,10 @@ import 'package:tmail_ui_user/features/email/presentation/model/composer_argumen extension ComposerArgumentsExtension on ComposerArguments { - ComposerArguments withIdentity({List? identities, Identity? selectedIdentity}) { + ComposerArguments withIdentity({List? identities, IdentityId? selectedIdentityId}) { return copyWith( identities: identities, - selectedIdentity: selectedIdentity, + selectedIdentityId: selectedIdentityId, ); } } \ No newline at end of file diff --git a/lib/features/email/presentation/model/composer_arguments.dart b/lib/features/email/presentation/model/composer_arguments.dart index edaebe3c6..fc9b9f281 100644 --- a/lib/features/email/presentation/model/composer_arguments.dart +++ b/lib/features/email/presentation/model/composer_arguments.dart @@ -26,7 +26,7 @@ class ComposerArguments extends RouterArguments { final MessageIdsHeaderValue? references; final EmailId? previousEmailId; final List? identities; - final Identity? selectedIdentity; + final IdentityId? selectedIdentityId; final List? inlineImages; final bool? hasRequestReadReceipt; final ScreenDisplayMode displayMode; @@ -46,7 +46,7 @@ class ComposerArguments extends RouterArguments { this.references, this.previousEmailId, this.identities, - this.selectedIdentity, + this.selectedIdentityId, this.inlineImages, this.hasRequestReadReceipt, this.displayMode = ScreenDisplayMode.normal @@ -87,7 +87,7 @@ class ComposerArguments extends RouterArguments { factory ComposerArguments.editDraftEmail(PresentationEmail presentationEmail) => ComposerArguments( emailActionType: EmailActionType.editDraft, - presentationEmail: presentationEmail + presentationEmail: presentationEmail, ); factory ComposerArguments.fromSessionStorageBrowser(ComposerCache composerCache) => @@ -96,7 +96,7 @@ class ComposerArguments extends RouterArguments { presentationEmail: composerCache.email?.toPresentationEmail(), emailContents: composerCache.email?.emailContentList.asHtmlString, attachments: composerCache.email?.allAttachments.getListAttachmentsDisplayedOutside(composerCache.email?.htmlBodyAttachments ?? []), - selectedIdentity: composerCache.identity, + selectedIdentityId: composerCache.email?.identityIdFromHeader, inlineImages: composerCache.email?.allAttachments.listAttachmentsDisplayedInContent, hasRequestReadReceipt: composerCache.hasRequestReadReceipt, displayMode: composerCache.displayMode, @@ -189,7 +189,7 @@ class ComposerArguments extends RouterArguments { references, previousEmailId, identities, - selectedIdentity, + selectedIdentityId, inlineImages, hasRequestReadReceipt, displayMode, @@ -210,7 +210,7 @@ class ComposerArguments extends RouterArguments { MessageIdsHeaderValue? references, EmailId? previousEmailId, List? identities, - Identity? selectedIdentity, + IdentityId? selectedIdentityId, List? inlineImages, bool? hasRequestReadReceipt, ScreenDisplayMode? displayMode, @@ -230,7 +230,7 @@ class ComposerArguments extends RouterArguments { references: references ?? this.references, previousEmailId: previousEmailId ?? this.previousEmailId, identities: identities ?? this.identities, - selectedIdentity: selectedIdentity ?? this.selectedIdentity, + selectedIdentityId: selectedIdentityId ?? this.selectedIdentityId, inlineImages: inlineImages ?? this.inlineImages, hasRequestReadReceipt: hasRequestReadReceipt ?? this.hasRequestReadReceipt, displayMode: displayMode ?? this.displayMode, diff --git a/lib/features/mailbox_dashboard/data/model/composer_cache.dart b/lib/features/mailbox_dashboard/data/model/composer_cache.dart index 359980234..39cb541c4 100644 --- a/lib/features/mailbox_dashboard/data/model/composer_cache.dart +++ b/lib/features/mailbox_dashboard/data/model/composer_cache.dart @@ -1,5 +1,4 @@ import 'package:equatable/equatable.dart'; -import 'package:jmap_dart_client/jmap/identities/identity.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/screen_display_mode.dart'; @@ -10,13 +9,11 @@ part 'composer_cache.g.dart'; class ComposerCache with EquatableMixin { final Email? email; - final Identity? identity; final bool? hasRequestReadReceipt; final ScreenDisplayMode displayMode; ComposerCache({ this.email, - this.identity, this.hasRequestReadReceipt, this.displayMode = ScreenDisplayMode.normal }); @@ -28,7 +25,6 @@ class ComposerCache with EquatableMixin { @override List get props => [ email, - identity, hasRequestReadReceipt, displayMode ]; diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index c9a4f1910..b7da72f93 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -1485,7 +1485,7 @@ class MailboxDashBoardController extends ReloadableController with UserSettingPo void goToComposer(ComposerArguments arguments) async { final argumentsWithIdentity = arguments.withIdentity( identities: List.from(_identities ?? []), - selectedIdentity: arguments.selectedIdentity); + selectedIdentityId: arguments.selectedIdentityId); if (PlatformInfo.isWeb) { if (composerOverlayState.value == ComposerOverlayState.inActive) { diff --git a/model/lib/extensions/email_extension.dart b/model/lib/extensions/email_extension.dart index 92440dde0..4fbaf6dfc 100644 --- a/model/lib/extensions/email_extension.dart +++ b/model/lib/extensions/email_extension.dart @@ -2,7 +2,9 @@ import 'dart:convert'; import 'package:core/domain/extensions/datetime_extension.dart'; +import 'package:jmap_dart_client/jmap/core/id.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; +import 'package:jmap_dart_client/jmap/identities/identity.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_body_part.dart'; import 'package:jmap_dart_client/jmap/mail/email/individual_header_identifier.dart'; @@ -34,6 +36,13 @@ extension EmailExtension on Email { String get sMimeStatusHeaderParsed => sMimeStatusHeader?[IndividualHeaderIdentifier.sMimeStatusHeader]?.trim() ?? ''; + IdentityId? get identityIdFromHeader { + final rawIdentityId = identityHeader?[IndividualHeaderIdentifier.identityHeader]; + if (rawIdentityId == null) return null; + + return IdentityId(Id(rawIdentityId)); + } + bool hasReadReceipt(Map mapMailbox) { final mailboxCurrent = findMailboxContain(mapMailbox); return !hasMdnSent &&