Skip to content

Commit 68dc9e9

Browse files
committed
TF-3894 Fix blank email content when opening email
Signed-off-by: dab246 <tdvu@linagora.com>
1 parent be0ef81 commit 68dc9e9

File tree

43 files changed

+321
-173
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

+321
-173
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 ?? {},
@@ -2082,6 +2087,7 @@ class ComposerController extends BaseController
20822087
session: session,
20832088
accountId: accountId,
20842089
emailActionType: arguments.emailActionType,
2090+
ownEmailAddress: ownEmailAddress,
20852091
subject: subjectEmail.value ?? '',
20862092
emailContent: emailContent,
20872093
fromSender: arguments.presentationEmail?.from ?? {},
@@ -2132,6 +2138,7 @@ class ComposerController extends BaseController
21322138
session: mailboxDashBoardController.sessionCurrent!,
21332139
accountId: mailboxDashBoardController.accountId.value!,
21342140
emailActionType: composerArguments.value!.emailActionType,
2141+
ownEmailAddress: ownEmailAddress,
21352142
subject: subjectEmail.value ?? '',
21362143
emailContent: emailContent,
21372144
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
@@ -1508,7 +1508,11 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
15081508
return;
15091509
}
15101510

1511-
final receiverEmailAddress = _getReceiverEmailAddress(currentEmail!) ?? session!.getOwnEmailAddressOrEmpty();
1511+
String receiverEmailAddress = _getReceiverEmailAddress(currentEmail!)
1512+
?? ownEmailAddress;
1513+
if (receiverEmailAddress.trim().isEmpty) {
1514+
receiverEmailAddress = session!.getOwnEmailAddressOrUsername();
1515+
}
15121516
log('SingleEmailController::_handleSendReceiptToSenderAction():receiverEmailAddress: $receiverEmailAddress');
15131517
final mdnToSender = _generateMDN(context, currentEmail!, receiverEmailAddress);
15141518
final sendReceiptRequest = SendReceiptToSenderRequest(
@@ -1816,10 +1820,13 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
18161820
}
18171821

18181822
_printEmailButtonState = ButtonState.disabled;
1819-
1823+
String accountDisplayName = ownEmailAddress;
1824+
if (accountDisplayName.trim().isEmpty) {
1825+
accountDisplayName = session?.getOwnEmailAddressOrUsername() ?? '';
1826+
}
18201827
consumeState(emailActionReactor.printEmail(
18211828
email,
1822-
ownEmailAddress: mailboxDashBoardController.ownEmailAddress.value,
1829+
ownEmailAddress: accountDisplayName,
18231830
emailLoaded: currentEmailLoaded.value!,
18241831
));
18251832
}
@@ -2324,8 +2331,8 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
23242331

23252332
listEmailAddressAttendees.addAll(listEmailAddress);
23262333

2327-
final currentUserEmail = mailboxDashBoardController.ownEmailAddress.value;
2328-
final listEmailAddressMailTo = listEmailAddressAttendees.removeInvalidEmails(currentUserEmail);
2334+
final listEmailAddressMailTo =
2335+
listEmailAddressAttendees.removeInvalidEmails(ownEmailAddress);
23292336
log('SingleEmailController::handleMailToAttendees: listEmailAddressMailTo = $listEmailAddressMailTo');
23302337
mailboxDashBoardController.openComposer(
23312338
ComposerArguments.fromMailtoUri(listEmailAddress: listEmailAddressMailTo)
@@ -2341,8 +2348,6 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
23412348
}
23422349
}
23432350

2344-
String getOwnEmailAddress() => session?.getOwnEmailAddressOrEmpty() ?? '';
2345-
23462351
void onHtmlContentClippedAction(bool isClipped) {
23472352
log('SingleEmailController::onHtmlContentClippedAction:isClipped = $isClipped');
23482353
isEmailContentClipped.value = isClipped;

lib/features/email/presentation/email_view.dart

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ class EmailView extends GetWidget<SingleEmailController> {
9595
position: position,
9696
responsiveUtils: controller.responsiveUtils,
9797
imagePaths: controller.imagePaths,
98-
username: controller.session?.username,
98+
ownEmailAddress: controller.ownEmailAddress,
9999
handleEmailAction: (email, action) => controller.handleEmailAction(context, email, action),
100100
additionalActions: [],
101101
emailIsRead: presentationEmail.hasRead,
@@ -194,7 +194,7 @@ class EmailView extends GetWidget<SingleEmailController> {
194194
responsiveUtils: controller.responsiveUtils,
195195
emailLoaded: emailLoaded,
196196
presentationEmail: currentEmail,
197-
userName: controller.getOwnEmailAddress(),
197+
userName: controller.ownEmailAddress,
198198
emailActionCallback: controller.pressEmailAction,
199199
);
200200
}),
@@ -289,7 +289,7 @@ class EmailView extends GetWidget<SingleEmailController> {
289289
position: position,
290290
responsiveUtils: controller.responsiveUtils,
291291
imagePaths: controller.imagePaths,
292-
username: controller.session?.username,
292+
ownEmailAddress: controller.ownEmailAddress,
293293
handleEmailAction: (email, action) => controller.handleEmailAction(context, email, action),
294294
additionalActions: [
295295
EmailActionType.forward,
@@ -362,10 +362,7 @@ class EmailView extends GetWidget<SingleEmailController> {
362362
),
363363
calendarEventReplying: controller.calendarEventProcessing,
364364
attendanceStatus: controller.attendanceStatus.value,
365-
ownEmailAddress: controller
366-
.mailboxDashBoardController
367-
.ownEmailAddress
368-
.value,
365+
ownEmailAddress: controller.ownEmailAddress,
369366
onMailtoAttendeesAction: controller.handleMailToAttendees,
370367
openEmailAddressDetailAction: (_, emailAddress) => controller.openEmailAddressDialog(emailAddress),
371368
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)