TF-3517 Fix "Reply to *me*" field is added when save an email as draft

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-02-24 16:31:25 +07:00
committed by Dat H. Pham
parent aac478b374
commit bd8c5ccfbf
10 changed files with 73 additions and 64 deletions
@@ -54,11 +54,7 @@ mixin ScenarioUtilsMixin {
emailActionType: EmailActionType.compose, emailActionType: EmailActionType.compose,
subject: provisioningEmail.subject, subject: provisioningEmail.subject,
emailContent: provisioningEmail.content, emailContent: provisioningEmail.content,
fromSender: {},
toRecipients: {EmailAddress(null, provisioningEmail.toEmail)}, toRecipients: {EmailAddress(null, provisioningEmail.toEmail)},
ccRecipients: {},
bccRecipients: {},
replyToRecipients: {},
outboxMailboxId: mailboxDashBoardController.outboxMailbox?.mailboxId, outboxMailboxId: mailboxDashBoardController.outboxMailbox?.mailboxId,
sentMailboxId: mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleSent], sentMailboxId: mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleSent],
identity: identity, identity: identity,
@@ -46,7 +46,10 @@ class ComposerRepositoryImpl extends ComposerRepository {
@override @override
Future<Email> generateEmail( Future<Email> generateEmail(
CreateEmailRequest createEmailRequest, CreateEmailRequest createEmailRequest,
{bool withIdentityHeader = false} {
bool withIdentityHeader = false,
bool isDraft = false,
}
) async { ) async {
String emailContent = createEmailRequest.emailContent; String emailContent = createEmailRequest.emailContent;
Set<EmailBodyPart> emailAttachments = Set.from(createEmailRequest.createAttachments()); Set<EmailBodyPart> emailAttachments = Set.from(createEmailRequest.createAttachments());
@@ -72,6 +75,7 @@ class ComposerRepositoryImpl extends ComposerRepository {
userAgent: userAgent, userAgent: userAgent,
partId: emailBodyPartId, partId: emailBodyPartId,
withIdentityHeader: withIdentityHeader, withIdentityHeader: withIdentityHeader,
isDraft: isDraft,
); );
return emailObject; return emailObject;
@@ -7,7 +7,10 @@ import 'package:tmail_ui_user/features/upload/domain/model/upload_attachment.dar
abstract class ComposerRepository { abstract class ComposerRepository {
Future<Email> generateEmail( Future<Email> generateEmail(
CreateEmailRequest createEmailRequest, CreateEmailRequest createEmailRequest,
{bool withIdentityHeader = false}); {
bool withIdentityHeader = false,
bool isDraft = false,
});
Future<UploadAttachment> uploadAttachment(FileInfo fileInfo, Uri uploadUri, {CancelToken? cancelToken}); Future<UploadAttachment> uploadAttachment(FileInfo fileInfo, Uri uploadUri, {CancelToken? cancelToken});
@@ -89,7 +89,9 @@ class CreateNewAndSaveEmailToDraftsInteractor {
try { try {
final emailCreated = await _composerRepository.generateEmail( final emailCreated = await _composerRepository.generateEmail(
createEmailRequest, createEmailRequest,
withIdentityHeader: true); withIdentityHeader: true,
isDraft: true,
);
return emailCreated; return emailCreated;
} catch (e) { } catch (e) {
logError('CreateNewAndSaveEmailToDraftsInteractor::_createEmailObject: Exception: $e'); logError('CreateNewAndSaveEmailToDraftsInteractor::_createEmailObject: Exception: $e');
@@ -26,7 +26,9 @@ class SaveComposerCacheOnWebInteractor {
try { try {
final emailCreated = await _composerRepository.generateEmail( final emailCreated = await _composerRepository.generateEmail(
createEmailRequest, createEmailRequest,
withIdentityHeader: true); withIdentityHeader: true,
isDraft: true,
);
await _composerCacheRepository.saveComposerCacheOnWeb( await _composerCacheRepository.saveComposerCacheOnWeb(
accountId: accountId, accountId: accountId,
userName: userName, userName: userName,
@@ -22,7 +22,7 @@ import 'package:tmail_ui_user/main/localizations/localization_service.dart';
extension CreateEmailRequestExtension on CreateEmailRequest { extension CreateEmailRequestExtension on CreateEmailRequest {
Set<EmailAddress> createSenders() { Set<EmailAddress>? createSenders() {
if (identity?.email?.isNotEmpty == true) { if (identity?.email?.isNotEmpty == true) {
return { identity!.toEmailAddress() }; return { identity!.toEmailAddress() };
} else { } else {
@@ -31,23 +31,26 @@ extension CreateEmailRequestExtension on CreateEmailRequest {
} }
String createMdnEmailAddress() { String createMdnEmailAddress() {
if (emailActionType == EmailActionType.editDraft && fromSender.isNotEmpty) { if (emailActionType == EmailActionType.editDraft && fromSender?.isNotEmpty == true) {
return fromSender.first.emailAddress; return fromSender!.first.emailAddress;
} else { } else {
return session.getOwnEmailAddress(); return session.getOwnEmailAddress();
} }
} }
Set<EmailAddress> createReplyToRecipients() { Set<EmailAddress>? createReplyToRecipients({bool isDraft = false}) {
if (replyToRecipients.isNotEmpty) { if (replyToRecipients?.isNotEmpty == true) {
return replyToRecipients.toSet(); return replyToRecipients;
} else if (identity?.replyTo?.isNotEmpty == true) {
return identity!.replyTo!.toSet();
} else {
return { EmailAddress(null, session.getOwnEmailAddress()) };
} }
if (isDraft) return null;
return identity?.replyTo?.isNotEmpty == true
? identity!.replyTo!
: {EmailAddress(null, session.getOwnEmailAddress())};
} }
Set<EmailBodyPart> createAttachments() => attachments?.toEmailBodyPart() ?? {}; Set<EmailBodyPart> createAttachments() => attachments?.toEmailBodyPart() ?? {};
Map<KeyWordIdentifier, bool>? createKeywords() { Map<KeyWordIdentifier, bool>? createKeywords() {
@@ -110,6 +113,7 @@ extension CreateEmailRequestExtension on CreateEmailRequest {
required String userAgent, required String userAgent,
required PartId partId, required PartId partId,
bool withIdentityHeader = false, bool withIdentityHeader = false,
bool isDraft = false,
}) { }) {
return Email( return Email(
mailboxIds: createMailboxIds(), mailboxIds: createMailboxIds(),
@@ -117,7 +121,7 @@ extension CreateEmailRequestExtension on CreateEmailRequest {
to: toRecipients, to: toRecipients,
cc: ccRecipients, cc: ccRecipients,
bcc: bccRecipients, bcc: bccRecipients,
replyTo: createReplyToRecipients(), replyTo: createReplyToRecipients(isDraft: isDraft),
inReplyTo: createInReplyTo(), inReplyTo: createInReplyTo(),
references: createReferences(), references: createReferences(),
keywords: createKeywords(), keywords: createKeywords(),
@@ -19,11 +19,11 @@ class CreateEmailRequest with EquatableMixin {
final String subject; final String subject;
final String emailContent; final String emailContent;
final bool hasRequestReadReceipt; final bool hasRequestReadReceipt;
final Set<EmailAddress> fromSender; final Set<EmailAddress>? fromSender;
final Set<EmailAddress> toRecipients; final Set<EmailAddress>? toRecipients;
final Set<EmailAddress> ccRecipients; final Set<EmailAddress>? ccRecipients;
final Set<EmailAddress> bccRecipients; final Set<EmailAddress>? bccRecipients;
final Set<EmailAddress> replyToRecipients; final Set<EmailAddress>? replyToRecipients;
final Identity? identity; final Identity? identity;
final List<Attachment>? attachments; final List<Attachment>? attachments;
final Map<String, Attachment>? inlineAttachments; final Map<String, Attachment>? inlineAttachments;
@@ -44,11 +44,11 @@ class CreateEmailRequest with EquatableMixin {
required this.emailActionType, required this.emailActionType,
required this.subject, required this.subject,
required this.emailContent, required this.emailContent,
required this.fromSender, this.fromSender,
required this.toRecipients, this.toRecipients,
required this.ccRecipients, this.ccRecipients,
required this.bccRecipients, this.bccRecipients,
required this.replyToRecipients, this.replyToRecipients,
this.hasRequestReadReceipt = true, this.hasRequestReadReceipt = true,
this.identity, this.identity,
this.attachments, this.attachments,
@@ -43,15 +43,13 @@ void main() {
emailActionType: EmailActionType.editDraft, emailActionType: EmailActionType.editDraft,
subject: 'subject', subject: 'subject',
emailContent: 'emailContent', emailContent: 'emailContent',
fromSender: {},
toRecipients: {},
ccRecipients: {},
bccRecipients: {},
replyToRecipients: {},
draftsEmailId: EmailId(Id('some-id')) draftsEmailId: EmailId(Id('some-id'))
); );
when(composerRepository.generateEmail(any, withIdentityHeader: anyNamed('withIdentityHeader'))) when(composerRepository.generateEmail(
.thenAnswer((_) async => Email()); any,
withIdentityHeader: anyNamed('withIdentityHeader'),
isDraft: anyNamed('isDraft'),
)).thenAnswer((_) async => Email());
when(emailRepository.updateEmailDrafts(any, any, any, any)) when(emailRepository.updateEmailDrafts(any, any, any, any))
.thenAnswer((_) async => Email()); .thenAnswer((_) async => Email());
@@ -61,13 +59,16 @@ void main() {
.last; .last;
await untilCalled(composerRepository.generateEmail( await untilCalled(composerRepository.generateEmail(
any, any,
withIdentityHeader: anyNamed('withIdentityHeader'))); withIdentityHeader: anyNamed('withIdentityHeader'),
isDraft: anyNamed('isDraft'),
));
// assert // assert
verify(composerRepository.generateEmail( verify(composerRepository.generateEmail(
createEmailRequest, createEmailRequest,
withIdentityHeader: true) withIdentityHeader: true,
).called(1); isDraft: true,
)).called(1);
}); });
test( test(
@@ -82,14 +83,12 @@ void main() {
emailActionType: EmailActionType.editDraft, emailActionType: EmailActionType.editDraft,
subject: 'subject', subject: 'subject',
emailContent: 'emailContent', emailContent: 'emailContent',
fromSender: {},
toRecipients: {},
ccRecipients: {},
bccRecipients: {},
replyToRecipients: {},
); );
when(composerRepository.generateEmail(any, withIdentityHeader: anyNamed('withIdentityHeader'))) when(composerRepository.generateEmail(
.thenAnswer((_) async => Email()); any,
withIdentityHeader: anyNamed('withIdentityHeader'),
isDraft: anyNamed('isDraft'),
)).thenAnswer((_) async => Email());
when(emailRepository.saveEmailAsDrafts(any, any, any)) when(emailRepository.saveEmailAsDrafts(any, any, any))
.thenAnswer((_) async => Email()); .thenAnswer((_) async => Email());
@@ -99,13 +98,16 @@ void main() {
.last; .last;
await untilCalled(composerRepository.generateEmail( await untilCalled(composerRepository.generateEmail(
any, any,
withIdentityHeader: anyNamed('withIdentityHeader'))); withIdentityHeader: anyNamed('withIdentityHeader'),
isDraft: anyNamed('isDraft'),
));
// assert // assert
verify(composerRepository.generateEmail( verify(composerRepository.generateEmail(
createEmailRequest, createEmailRequest,
withIdentityHeader: true) withIdentityHeader: true,
).called(1); isDraft: true,
)).called(1);
}); });
}); });
} }
@@ -34,14 +34,12 @@ void main() {
emailActionType: EmailActionType.editDraft, emailActionType: EmailActionType.editDraft,
subject: 'subject', subject: 'subject',
emailContent: 'emailContent', emailContent: 'emailContent',
fromSender: {},
toRecipients: {},
ccRecipients: {},
bccRecipients: {},
replyToRecipients: {},
); );
when(composerRepository.generateEmail(any, withIdentityHeader: anyNamed('withIdentityHeader'))) when(composerRepository.generateEmail(
.thenAnswer((_) async => Email()); any,
withIdentityHeader: anyNamed('withIdentityHeader'),
isDraft: anyNamed('isDraft'),
)).thenAnswer((_) async => Email());
// act // act
createNewAndSendEmailInteractor createNewAndSendEmailInteractor
@@ -49,13 +47,16 @@ void main() {
.last; .last;
await untilCalled(composerRepository.generateEmail( await untilCalled(composerRepository.generateEmail(
any, any,
withIdentityHeader: anyNamed('withIdentityHeader'))); withIdentityHeader: anyNamed('withIdentityHeader'),
isDraft: anyNamed('isDraft'),
));
// assert // assert
verify(composerRepository.generateEmail( verify(composerRepository.generateEmail(
createEmailRequest, createEmailRequest,
withIdentityHeader: false) withIdentityHeader: false,
).called(1); isDraft: false,
)).called(1);
}); });
}); });
} }
@@ -15,11 +15,6 @@ void main() {
emailActionType: EmailActionType.editDraft, emailActionType: EmailActionType.editDraft,
subject: 'subject', subject: 'subject',
emailContent: 'emailContent', emailContent: 'emailContent',
fromSender: {},
toRecipients: {},
ccRecipients: {},
bccRecipients: {},
replyToRecipients: {},
); );
group('create email request extension test:', () { group('create email request extension test:', () {