diff --git a/integration_test/mixin/scenario_utils_mixin.dart b/integration_test/mixin/scenario_utils_mixin.dart index 487476d73..c64df2e07 100644 --- a/integration_test/mixin/scenario_utils_mixin.dart +++ b/integration_test/mixin/scenario_utils_mixin.dart @@ -54,11 +54,7 @@ mixin ScenarioUtilsMixin { emailActionType: EmailActionType.compose, subject: provisioningEmail.subject, emailContent: provisioningEmail.content, - fromSender: {}, toRecipients: {EmailAddress(null, provisioningEmail.toEmail)}, - ccRecipients: {}, - bccRecipients: {}, - replyToRecipients: {}, outboxMailboxId: mailboxDashBoardController.outboxMailbox?.mailboxId, sentMailboxId: mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleSent], identity: identity, diff --git a/lib/features/composer/data/repository/composer_repository_impl.dart b/lib/features/composer/data/repository/composer_repository_impl.dart index ec1386230..dfaf649e6 100644 --- a/lib/features/composer/data/repository/composer_repository_impl.dart +++ b/lib/features/composer/data/repository/composer_repository_impl.dart @@ -46,7 +46,10 @@ class ComposerRepositoryImpl extends ComposerRepository { @override Future generateEmail( CreateEmailRequest createEmailRequest, - {bool withIdentityHeader = false} + { + bool withIdentityHeader = false, + bool isDraft = false, + } ) async { String emailContent = createEmailRequest.emailContent; Set emailAttachments = Set.from(createEmailRequest.createAttachments()); @@ -72,6 +75,7 @@ class ComposerRepositoryImpl extends ComposerRepository { userAgent: userAgent, partId: emailBodyPartId, withIdentityHeader: withIdentityHeader, + isDraft: isDraft, ); return emailObject; diff --git a/lib/features/composer/domain/repository/composer_repository.dart b/lib/features/composer/domain/repository/composer_repository.dart index caeac9e62..767104011 100644 --- a/lib/features/composer/domain/repository/composer_repository.dart +++ b/lib/features/composer/domain/repository/composer_repository.dart @@ -7,7 +7,10 @@ import 'package:tmail_ui_user/features/upload/domain/model/upload_attachment.dar abstract class ComposerRepository { Future generateEmail( CreateEmailRequest createEmailRequest, - {bool withIdentityHeader = false}); + { + bool withIdentityHeader = false, + bool isDraft = 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 65a3bd226..35d9bc56a 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 @@ -89,7 +89,9 @@ class CreateNewAndSaveEmailToDraftsInteractor { try { final emailCreated = await _composerRepository.generateEmail( createEmailRequest, - withIdentityHeader: true); + withIdentityHeader: true, + isDraft: 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 4abf6166e..b3092d467 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 @@ -26,7 +26,9 @@ class SaveComposerCacheOnWebInteractor { try { final emailCreated = await _composerRepository.generateEmail( createEmailRequest, - withIdentityHeader: true); + withIdentityHeader: true, + isDraft: true, + ); await _composerCacheRepository.saveComposerCacheOnWeb( accountId: accountId, userName: userName, 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 c2f0e3d5a..586a008de 100644 --- a/lib/features/composer/presentation/extensions/create_email_request_extension.dart +++ b/lib/features/composer/presentation/extensions/create_email_request_extension.dart @@ -22,7 +22,7 @@ import 'package:tmail_ui_user/main/localizations/localization_service.dart'; extension CreateEmailRequestExtension on CreateEmailRequest { - Set createSenders() { + Set? createSenders() { if (identity?.email?.isNotEmpty == true) { return { identity!.toEmailAddress() }; } else { @@ -31,23 +31,26 @@ extension CreateEmailRequestExtension on CreateEmailRequest { } String createMdnEmailAddress() { - if (emailActionType == EmailActionType.editDraft && fromSender.isNotEmpty) { - return fromSender.first.emailAddress; + if (emailActionType == EmailActionType.editDraft && fromSender?.isNotEmpty == true) { + return fromSender!.first.emailAddress; } else { return session.getOwnEmailAddress(); } } - Set createReplyToRecipients() { - if (replyToRecipients.isNotEmpty) { - return replyToRecipients.toSet(); - } else if (identity?.replyTo?.isNotEmpty == true) { - return identity!.replyTo!.toSet(); - } else { - return { EmailAddress(null, session.getOwnEmailAddress()) }; + Set? createReplyToRecipients({bool isDraft = false}) { + if (replyToRecipients?.isNotEmpty == true) { + return replyToRecipients; } + + if (isDraft) return null; + + return identity?.replyTo?.isNotEmpty == true + ? identity!.replyTo! + : {EmailAddress(null, session.getOwnEmailAddress())}; } + Set createAttachments() => attachments?.toEmailBodyPart() ?? {}; Map? createKeywords() { @@ -110,6 +113,7 @@ extension CreateEmailRequestExtension on CreateEmailRequest { required String userAgent, required PartId partId, bool withIdentityHeader = false, + bool isDraft = false, }) { return Email( mailboxIds: createMailboxIds(), @@ -117,7 +121,7 @@ extension CreateEmailRequestExtension on CreateEmailRequest { to: toRecipients, cc: ccRecipients, bcc: bccRecipients, - replyTo: createReplyToRecipients(), + replyTo: createReplyToRecipients(isDraft: isDraft), inReplyTo: createInReplyTo(), references: createReferences(), keywords: createKeywords(), diff --git a/lib/features/composer/presentation/model/create_email_request.dart b/lib/features/composer/presentation/model/create_email_request.dart index d6c82e44b..8b7a9a4bf 100644 --- a/lib/features/composer/presentation/model/create_email_request.dart +++ b/lib/features/composer/presentation/model/create_email_request.dart @@ -19,11 +19,11 @@ class CreateEmailRequest with EquatableMixin { final String subject; final String emailContent; final bool hasRequestReadReceipt; - final Set fromSender; - final Set toRecipients; - final Set ccRecipients; - final Set bccRecipients; - final Set replyToRecipients; + final Set? fromSender; + final Set? toRecipients; + final Set? ccRecipients; + final Set? bccRecipients; + final Set? replyToRecipients; final Identity? identity; final List? attachments; final Map? inlineAttachments; @@ -44,11 +44,11 @@ class CreateEmailRequest with EquatableMixin { required this.emailActionType, required this.subject, required this.emailContent, - required this.fromSender, - required this.toRecipients, - required this.ccRecipients, - required this.bccRecipients, - required this.replyToRecipients, + this.fromSender, + this.toRecipients, + this.ccRecipients, + this.bccRecipients, + this.replyToRecipients, this.hasRequestReadReceipt = true, this.identity, this.attachments, diff --git a/test/features/composer/domain/usecases/create_new_and_save_email_to_drafts_interactor_test.dart b/test/features/composer/domain/usecases/create_new_and_save_email_to_drafts_interactor_test.dart index f59149069..034881a88 100644 --- a/test/features/composer/domain/usecases/create_new_and_save_email_to_drafts_interactor_test.dart +++ b/test/features/composer/domain/usecases/create_new_and_save_email_to_drafts_interactor_test.dart @@ -43,15 +43,13 @@ void main() { emailActionType: EmailActionType.editDraft, subject: 'subject', emailContent: 'emailContent', - fromSender: {}, - toRecipients: {}, - ccRecipients: {}, - bccRecipients: {}, - replyToRecipients: {}, draftsEmailId: EmailId(Id('some-id')) ); - when(composerRepository.generateEmail(any, withIdentityHeader: anyNamed('withIdentityHeader'))) - .thenAnswer((_) async => Email()); + when(composerRepository.generateEmail( + any, + withIdentityHeader: anyNamed('withIdentityHeader'), + isDraft: anyNamed('isDraft'), + )).thenAnswer((_) async => Email()); when(emailRepository.updateEmailDrafts(any, any, any, any)) .thenAnswer((_) async => Email()); @@ -61,13 +59,16 @@ void main() { .last; await untilCalled(composerRepository.generateEmail( any, - withIdentityHeader: anyNamed('withIdentityHeader'))); + withIdentityHeader: anyNamed('withIdentityHeader'), + isDraft: anyNamed('isDraft'), + )); // assert verify(composerRepository.generateEmail( createEmailRequest, - withIdentityHeader: true) - ).called(1); + withIdentityHeader: true, + isDraft: true, + )).called(1); }); test( @@ -82,14 +83,12 @@ void main() { emailActionType: EmailActionType.editDraft, subject: 'subject', emailContent: 'emailContent', - fromSender: {}, - toRecipients: {}, - ccRecipients: {}, - bccRecipients: {}, - replyToRecipients: {}, ); - when(composerRepository.generateEmail(any, withIdentityHeader: anyNamed('withIdentityHeader'))) - .thenAnswer((_) async => Email()); + when(composerRepository.generateEmail( + any, + withIdentityHeader: anyNamed('withIdentityHeader'), + isDraft: anyNamed('isDraft'), + )).thenAnswer((_) async => Email()); when(emailRepository.saveEmailAsDrafts(any, any, any)) .thenAnswer((_) async => Email()); @@ -99,13 +98,16 @@ void main() { .last; await untilCalled(composerRepository.generateEmail( any, - withIdentityHeader: anyNamed('withIdentityHeader'))); + withIdentityHeader: anyNamed('withIdentityHeader'), + isDraft: anyNamed('isDraft'), + )); // assert verify(composerRepository.generateEmail( createEmailRequest, - withIdentityHeader: true) - ).called(1); + withIdentityHeader: true, + isDraft: true, + )).called(1); }); }); } \ No newline at end of file diff --git a/test/features/composer/domain/usecases/create_new_and_send_email_interactor_test.dart b/test/features/composer/domain/usecases/create_new_and_send_email_interactor_test.dart index 8cc95f22e..4eaeecca0 100644 --- a/test/features/composer/domain/usecases/create_new_and_send_email_interactor_test.dart +++ b/test/features/composer/domain/usecases/create_new_and_send_email_interactor_test.dart @@ -34,14 +34,12 @@ void main() { emailActionType: EmailActionType.editDraft, subject: 'subject', emailContent: 'emailContent', - fromSender: {}, - toRecipients: {}, - ccRecipients: {}, - bccRecipients: {}, - replyToRecipients: {}, ); - when(composerRepository.generateEmail(any, withIdentityHeader: anyNamed('withIdentityHeader'))) - .thenAnswer((_) async => Email()); + when(composerRepository.generateEmail( + any, + withIdentityHeader: anyNamed('withIdentityHeader'), + isDraft: anyNamed('isDraft'), + )).thenAnswer((_) async => Email()); // act createNewAndSendEmailInteractor @@ -49,13 +47,16 @@ void main() { .last; await untilCalled(composerRepository.generateEmail( any, - withIdentityHeader: anyNamed('withIdentityHeader'))); + withIdentityHeader: anyNamed('withIdentityHeader'), + isDraft: anyNamed('isDraft'), + )); // assert verify(composerRepository.generateEmail( createEmailRequest, - withIdentityHeader: false) - ).called(1); + withIdentityHeader: false, + isDraft: false, + )).called(1); }); }); } \ No newline at end of file diff --git a/test/features/composer/presentation/extensions/create_email_request_extension_test.dart b/test/features/composer/presentation/extensions/create_email_request_extension_test.dart index 956c807a2..06efcf0b7 100644 --- a/test/features/composer/presentation/extensions/create_email_request_extension_test.dart +++ b/test/features/composer/presentation/extensions/create_email_request_extension_test.dart @@ -15,11 +15,6 @@ void main() { emailActionType: EmailActionType.editDraft, subject: 'subject', emailContent: 'emailContent', - fromSender: {}, - toRecipients: {}, - ccRecipients: {}, - bccRecipients: {}, - replyToRecipients: {}, ); group('create email request extension test:', () {