Skip to content

Commit 9a7a6d3

Browse files
committed
TF-3894 Fix blank email content when opening email
Signed-off-by: dab246 <tdvu@linagora.com>
1 parent 6e86946 commit 9a7a6d3

File tree

43 files changed

+317
-172
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+317
-172
lines changed

integration_test/mixin/scenario_utils_mixin.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ mixin ScenarioUtilsMixin {
6161
session: mailboxDashBoardController.sessionCurrent!,
6262
accountId: mailboxDashBoardController.accountId.value!,
6363
emailActionType: EmailActionType.compose,
64+
ownEmailAddress: mailboxDashBoardController.ownEmailAddress.value,
6465
subject: provisioningEmail.subject,
6566
emailContent: provisioningEmail.content,
6667
toRecipients: {EmailAddress(null, provisioningEmail.toEmail)},

lib/features/base/base_controller.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -424,11 +424,12 @@ abstract class BaseController extends GetxController
424424
BuildContext context,
425425
Session? session,
426426
AccountId? accountId,
427+
String ownEmailAddress,
427428
) {
428429
if (PlatformInfo.isMobile) {
429430
showLogoutConfirmDialog(
430431
context: context,
431-
userAddress: session?.getOwnEmailAddressOrEmpty() ?? '',
432+
userAddress: ownEmailAddress,
432433
onConfirmAction: () => _handleLogoutAction(session, accountId),
433434
);
434435
} else {
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import 'package:core/utils/app_logger.dart';
2+
import 'package:get/get.dart';
3+
import 'package:jmap_dart_client/jmap/core/session/session.dart';
4+
import 'package:jmap_dart_client/jmap/identities/identity.dart';
5+
import 'package:model/extensions/session_extension.dart';
6+
import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart';
7+
8+
mixin OwnEmailAddressMixin {
9+
static const String emptyOwnEmailAddress = '';
10+
11+
final RxString ownEmailAddress = RxString('');
12+
Session? sessionCurrent;
13+
14+
void synchronizeOwnEmailAddress(String emailAddress) {
15+
log('$runtimeType::synchronizeOwnEmailAddress:OwnEmailAddress = ${ownEmailAddress.value}, NewEmailAddress = $emailAddress');
16+
if (ownEmailAddress.value.trim().isNotEmpty) return;
17+
ownEmailAddress.value = emailAddress;
18+
}
19+
20+
void updateOwnEmailAddressFromIdentities(List<Identity> listIdentities) {
21+
if (ownEmailAddress.value.trim().isNotEmpty) return;
22+
23+
if (listIdentities.isEmpty) {
24+
synchronizeOwnEmailAddress(emptyOwnEmailAddress);
25+
ownEmailAddress.refresh();
26+
return;
27+
}
28+
29+
final identityEmailAddress = listIdentities.firstOrNull?.email ?? '';
30+
final domain = EmailUtils.getDomainByEmailAddress(identityEmailAddress);
31+
final userEmailAddress =
32+
sessionCurrent?.generateOwnEmailAddressFromDomain(domain) ?? '';
33+
log('$runtimeType::updateOwnEmailAddressFromIdentities: UserEmailAddress = $userEmailAddress');
34+
35+
if (userEmailAddress.isNotEmpty) {
36+
synchronizeOwnEmailAddress(userEmailAddress);
37+
} else {
38+
synchronizeOwnEmailAddress(emptyOwnEmailAddress);
39+
ownEmailAddress.refresh();
40+
}
41+
}
42+
}

lib/features/composer/presentation/composer_controller.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,9 @@ class ComposerController extends BaseController
250250

251251
TransformHtmlEmailContentInteractor get transformHtmlEmailContentInteractor => _transformHtmlEmailContentInteractor;
252252

253+
String get ownEmailAddress =>
254+
mailboxDashBoardController.ownEmailAddress.value;
255+
253256
late Worker uploadInlineImageWorker;
254257
late Worker dashboardViewStateWorker;
255258
late bool _isEmailBodyLoaded;
@@ -513,6 +516,7 @@ class ComposerController extends BaseController
513516
session: session,
514517
accountId: accountId,
515518
emailActionType: arguments.emailActionType,
519+
ownEmailAddress: ownEmailAddress,
516520
subject: subjectEmail.value ?? '',
517521
emailContent: emailContent,
518522
fromSender: arguments.presentationEmail?.from ?? {},
@@ -687,7 +691,7 @@ class ComposerController extends BaseController
687691
required EmailActionType actionType,
688692
String? listPost,
689693
}) {
690-
final senderEmailAddress = mailboxDashBoardController.sessionCurrent?.getOwnEmailAddressOrEmpty();
694+
final senderEmailAddress = ownEmailAddress;
691695
final isSender = presentationEmail.from
692696
.asList()
693697
.any((element) => element.emailAddress.isNotEmpty && element.emailAddress == senderEmailAddress);
@@ -932,6 +936,7 @@ class ComposerController extends BaseController
932936
session: session,
933937
accountId: accountId,
934938
emailActionType: arguments.emailActionType,
939+
ownEmailAddress: ownEmailAddress,
935940
subject: subjectEmail.value ?? '',
936941
emailContent: emailContent,
937942
fromSender: arguments.presentationEmail?.from ?? {},
@@ -2087,6 +2092,7 @@ class ComposerController extends BaseController
20872092
session: session,
20882093
accountId: accountId,
20892094
emailActionType: arguments.emailActionType,
2095+
ownEmailAddress: ownEmailAddress,
20902096
subject: subjectEmail.value ?? '',
20912097
emailContent: emailContent,
20922098
fromSender: arguments.presentationEmail?.from ?? {},
@@ -2137,6 +2143,7 @@ class ComposerController extends BaseController
21372143
session: mailboxDashBoardController.sessionCurrent!,
21382144
accountId: mailboxDashBoardController.accountId.value!,
21392145
emailActionType: composerArguments.value!.emailActionType,
2146+
ownEmailAddress: ownEmailAddress,
21402147
subject: subjectEmail.value ?? '',
21412148
emailContent: emailContent,
21422149
fromSender: composerArguments.value!.presentationEmail?.from ?? {},

lib/features/composer/presentation/extensions/composer_print_draft_extension.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:model/email/email_action_type.dart';
88
import 'package:model/extensions/identity_extension.dart';
99
import 'package:model/extensions/list_email_address_extension.dart';
1010
import 'package:model/extensions/presentation_email_extension.dart';
11+
import 'package:model/extensions/session_extension.dart';
1112
import 'package:pointer_interceptor/pointer_interceptor.dart';
1213
import 'package:tmail_ui_user/features/base/state/button_state.dart';
1314
import 'package:tmail_ui_user/features/composer/presentation/composer_controller.dart';
@@ -80,12 +81,18 @@ extension ComposerPrintDraftExtension on ComposerController {
8081
pattern: currentTime.toPatternForPrinting(locale.toLanguageTag()),
8182
);
8283
}
84+
String accountDisplayName = ownEmailAddress;
85+
if (accountDisplayName.trim().isEmpty) {
86+
accountDisplayName = mailboxDashBoardController
87+
.sessionCurrent
88+
?.getOwnEmailAddressOrUsername() ?? '';
89+
}
8390
log('ComposerPrintDraftExtension::_showPrintDraftsDialog:receiveTime = $receiveTime | emailActionType = $emailActionType');
8491
final childWidget = PointerInterceptor(
8592
child: PrintDraftDialogView(
8693
emailPrint: DraftEmailPrint(
8794
appName: appLocalizations.app_name,
88-
userName: mailboxDashBoardController.ownEmailAddress.value,
95+
userName: accountDisplayName,
8996
attachments: uploadController.allAttachmentsUploaded,
9097
emailContent: emailContent,
9198
fromPrefix: appLocalizations.from_email_address_prefix,

lib/features/composer/presentation/extensions/create_email_request_extension.dart

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
1010
import 'package:model/email/email_action_type.dart';
1111
import 'package:model/email/mail_priority_header.dart';
1212
import 'package:model/extensions/email_address_extension.dart';
13-
import 'package:model/extensions/session_extension.dart';
1413
import 'package:model/mailbox/presentation_mailbox.dart';
1514
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
1615
import 'package:tmail_ui_user/features/composer/presentation/extensions/identity_extension.dart';
@@ -26,8 +25,8 @@ extension CreateEmailRequestExtension on CreateEmailRequest {
2625
Set<EmailAddress> createSenders() {
2726
if (identity?.email?.isNotEmpty == true) {
2827
return { identity!.toEmailAddress() };
29-
} else if (session.getOwnEmailAddressOrEmpty().isNotEmpty) {
30-
return { EmailAddress(null, session.getOwnEmailAddressOrEmpty()) };
28+
} else if (ownEmailAddress.isNotEmpty) {
29+
return { EmailAddress(null, ownEmailAddress) };
3130
} else {
3231
return {};
3332
}
@@ -36,8 +35,8 @@ extension CreateEmailRequestExtension on CreateEmailRequest {
3635
String createMdnEmailAddress() {
3736
if (emailActionType == EmailActionType.editDraft && fromSender?.isNotEmpty == true) {
3837
return fromSender!.first.emailAddress;
39-
} else if (session.getOwnEmailAddressOrEmpty().isNotEmpty) {
40-
return session.getOwnEmailAddressOrEmpty();
38+
} else if (ownEmailAddress.isNotEmpty) {
39+
return ownEmailAddress;
4140
} else {
4241
return '';
4342
}
@@ -52,8 +51,8 @@ extension CreateEmailRequestExtension on CreateEmailRequest {
5251

5352
return identity?.replyTo?.isNotEmpty == true
5453
? identity!.replyTo!
55-
: session.getOwnEmailAddressOrEmpty().isNotEmpty
56-
? {EmailAddress(null, session.getOwnEmailAddressOrEmpty())}
54+
: ownEmailAddress.isNotEmpty
55+
? {EmailAddress(null, ownEmailAddress)}
5756
: null;
5857
}
5958

lib/features/composer/presentation/model/create_email_request.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class CreateEmailRequest with EquatableMixin {
1616
final Session session;
1717
final AccountId accountId;
1818
final EmailActionType emailActionType;
19+
final String ownEmailAddress;
1920
final String subject;
2021
final String emailContent;
2122
final bool hasRequestReadReceipt;
@@ -51,6 +52,7 @@ class CreateEmailRequest with EquatableMixin {
5152
required this.session,
5253
required this.accountId,
5354
required this.emailActionType,
55+
required this.ownEmailAddress,
5456
required this.subject,
5557
required this.emailContent,
5658
this.fromSender,
@@ -88,6 +90,7 @@ class CreateEmailRequest with EquatableMixin {
8890
session,
8991
accountId,
9092
emailActionType,
93+
ownEmailAddress,
9194
subject,
9295
emailContent,
9396
fromSender,

lib/features/email/presentation/controller/single_email_controller.dart

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1527,7 +1527,11 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
15271527
return;
15281528
}
15291529

1530-
final receiverEmailAddress = _getReceiverEmailAddress(currentEmail!) ?? session!.getOwnEmailAddressOrEmpty();
1530+
String receiverEmailAddress = _getReceiverEmailAddress(currentEmail!)
1531+
?? ownEmailAddress;
1532+
if (receiverEmailAddress.trim().isEmpty) {
1533+
receiverEmailAddress = session!.getOwnEmailAddressOrUsername();
1534+
}
15311535
log('SingleEmailController::_handleSendReceiptToSenderAction():receiverEmailAddress: $receiverEmailAddress');
15321536
final mdnToSender = _generateMDN(context, currentEmail!, receiverEmailAddress);
15331537
final sendReceiptRequest = SendReceiptToSenderRequest(
@@ -1835,10 +1839,13 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
18351839
}
18361840

18371841
_printEmailButtonState = ButtonState.disabled;
1838-
1842+
String accountDisplayName = ownEmailAddress;
1843+
if (accountDisplayName.trim().isEmpty) {
1844+
accountDisplayName = session?.getOwnEmailAddressOrUsername() ?? '';
1845+
}
18391846
consumeState(emailActionReactor.printEmail(
18401847
email,
1841-
ownEmailAddress: mailboxDashBoardController.ownEmailAddress.value,
1848+
ownEmailAddress: accountDisplayName,
18421849
emailLoaded: currentEmailLoaded.value!,
18431850
));
18441851
}
@@ -2338,8 +2345,8 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
23382345

23392346
listEmailAddressAttendees.addAll(listEmailAddress);
23402347

2341-
final currentUserEmail = mailboxDashBoardController.ownEmailAddress.value;
2342-
final listEmailAddressMailTo = listEmailAddressAttendees.removeInvalidEmails(currentUserEmail);
2348+
final listEmailAddressMailTo =
2349+
listEmailAddressAttendees.removeInvalidEmails(ownEmailAddress);
23432350
log('SingleEmailController::handleMailToAttendees: listEmailAddressMailTo = $listEmailAddressMailTo');
23442351
mailboxDashBoardController.openComposer(
23452352
ComposerArguments.fromMailtoUri(listEmailAddress: listEmailAddressMailTo)
@@ -2355,8 +2362,6 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
23552362
}
23562363
}
23572364

2358-
String getOwnEmailAddress() => session?.getOwnEmailAddressOrEmpty() ?? '';
2359-
23602365
void onHtmlContentClippedAction(bool isClipped) {
23612366
log('SingleEmailController::onHtmlContentClippedAction:isClipped = $isClipped');
23622367
isEmailContentClipped.value = isClipped;

lib/features/email/presentation/email_view.dart

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class EmailView extends GetWidget<SingleEmailController> {
8686
position: position,
8787
responsiveUtils: controller.responsiveUtils,
8888
imagePaths: controller.imagePaths,
89-
username: controller.session?.username,
89+
ownEmailAddress: controller.ownEmailAddress,
9090
handleEmailAction: (email, action) => controller.handleEmailAction(context, email, action),
9191
additionalActions: [],
9292
emailIsRead: presentationEmail.hasRead,
@@ -160,7 +160,7 @@ class EmailView extends GetWidget<SingleEmailController> {
160160
responsiveUtils: controller.responsiveUtils,
161161
emailLoaded: emailLoaded,
162162
presentationEmail: currentEmail,
163-
userName: controller.getOwnEmailAddress(),
163+
userName: controller.ownEmailAddress,
164164
emailActionCallback: controller.pressEmailAction,
165165
);
166166
}),
@@ -260,7 +260,7 @@ class EmailView extends GetWidget<SingleEmailController> {
260260
position: position,
261261
responsiveUtils: controller.responsiveUtils,
262262
imagePaths: controller.imagePaths,
263-
username: controller.session?.username,
263+
ownEmailAddress: controller.ownEmailAddress,
264264
handleEmailAction: (email, action) => controller.handleEmailAction(context, email, action),
265265
additionalActions: [
266266
EmailActionType.forward,
@@ -312,10 +312,7 @@ class EmailView extends GetWidget<SingleEmailController> {
312312
),
313313
calendarEventReplying: controller.calendarEventProcessing,
314314
attendanceStatus: controller.attendanceStatus.value,
315-
ownEmailAddress: controller
316-
.mailboxDashBoardController
317-
.ownEmailAddress
318-
.value,
315+
ownEmailAddress: controller.ownEmailAddress,
319316
onMailtoAttendeesAction: controller.handleMailToAttendees,
320317
openEmailAddressDetailAction: (_, emailAddress) => controller.openEmailAddressDialog(emailAddress),
321318
isFree: controller.isCalendarEventFree,

lib/features/email/presentation/utils/email_action_reactor/email_action_reactor.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import 'package:flutter/services.dart';
2121
import 'package:get/get.dart';
2222
import 'package:jmap_dart_client/jmap/account_id.dart';
2323
import 'package:jmap_dart_client/jmap/core/session/session.dart';
24-
import 'package:jmap_dart_client/jmap/core/user_name.dart';
2524
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
2625
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
2726
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
@@ -527,7 +526,7 @@ class EmailActionReactor with MessageDialogActionMixin {
527526
required RelativeRect? position,
528527
required ResponsiveUtils responsiveUtils,
529528
required ImagePaths imagePaths,
530-
required UserName? username,
529+
required String ownEmailAddress,
531530
required void Function(
532531
PresentationEmail presentationEmail,
533532
EmailActionType action,
@@ -542,7 +541,7 @@ class EmailActionReactor with MessageDialogActionMixin {
542541
final moreActions = [
543542
if (additionalActions.contains(EmailActionType.forward))
544543
EmailActionType.forward,
545-
if (presentationEmail.getCountMailAddressWithoutMe(username?.value ?? '') > 1 &&
544+
if (presentationEmail.getCountMailAddressWithoutMe(ownEmailAddress) > 1 &&
546545
additionalActions.contains(EmailActionType.replyAll))
547546
EmailActionType.replyAll,
548547
if (EmailUtils.isReplyToListEnabled(presentationEmail.listPost ?? '') &&

0 commit comments

Comments
 (0)