Skip to content

Commit b466556

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

File tree

41 files changed

+309
-167
lines changed

Some content is hidden

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

41 files changed

+309
-167
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
@@ -421,11 +421,12 @@ abstract class BaseController extends GetxController
421421
BuildContext context,
422422
Session? session,
423423
AccountId? accountId,
424+
String ownEmailAddress,
424425
) {
425426
if (PlatformInfo.isMobile) {
426427
showLogoutConfirmDialog(
427428
context: context,
428-
userAddress: session?.getOwnEmailAddressOrEmpty() ?? '',
429+
userAddress: ownEmailAddress,
429430
onConfirmAction: () => _handleLogoutAction(session, accountId),
430431
);
431432
} 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
@@ -252,6 +252,9 @@ class ComposerController extends BaseController
252252

253253
TransformHtmlEmailContentInteractor get transformHtmlEmailContentInteractor => _transformHtmlEmailContentInteractor;
254254

255+
String get ownEmailAddress =>
256+
mailboxDashBoardController.ownEmailAddress.value;
257+
255258
late Worker uploadInlineImageWorker;
256259
late Worker dashboardViewStateWorker;
257260
late bool _isEmailBodyLoaded;
@@ -521,6 +524,7 @@ class ComposerController extends BaseController
521524
session: session,
522525
accountId: accountId,
523526
emailActionType: arguments.emailActionType,
527+
ownEmailAddress: ownEmailAddress,
524528
subject: subjectEmail.value ?? '',
525529
emailContent: emailContent,
526530
fromSender: arguments.presentationEmail?.from ?? {},
@@ -698,7 +702,7 @@ class ComposerController extends BaseController
698702
required EmailActionType actionType,
699703
String? listPost,
700704
}) {
701-
final senderEmailAddress = mailboxDashBoardController.sessionCurrent?.getOwnEmailAddressOrEmpty();
705+
final senderEmailAddress = ownEmailAddress;
702706
final isSender = presentationEmail.from
703707
.asList()
704708
.any((element) => element.emailAddress.isNotEmpty && element.emailAddress == senderEmailAddress);
@@ -946,6 +950,7 @@ class ComposerController extends BaseController
946950
session: session,
947951
accountId: accountId,
948952
emailActionType: arguments.emailActionType,
953+
ownEmailAddress: ownEmailAddress,
949954
subject: subjectEmail.value ?? '',
950955
emailContent: emailContent,
951956
fromSender: arguments.presentationEmail?.from ?? {},
@@ -2121,6 +2126,7 @@ class ComposerController extends BaseController
21212126
session: session,
21222127
accountId: accountId,
21232128
emailActionType: arguments.emailActionType,
2129+
ownEmailAddress: ownEmailAddress,
21242130
subject: subjectEmail.value ?? '',
21252131
emailContent: emailContent,
21262132
fromSender: arguments.presentationEmail?.from ?? {},
@@ -2171,6 +2177,7 @@ class ComposerController extends BaseController
21712177
session: mailboxDashBoardController.sessionCurrent!,
21722178
accountId: mailboxDashBoardController.accountId.value!,
21732179
emailActionType: composerArguments.value!.emailActionType,
2180+
ownEmailAddress: ownEmailAddress,
21742181
subject: subjectEmail.value ?? '',
21752182
emailContent: emailContent,
21762183
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
@@ -1513,7 +1513,11 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
15131513
return;
15141514
}
15151515

1516-
final receiverEmailAddress = _getReceiverEmailAddress(currentEmail!) ?? session!.getOwnEmailAddressOrEmpty();
1516+
String receiverEmailAddress = _getReceiverEmailAddress(currentEmail!)
1517+
?? ownEmailAddress;
1518+
if (receiverEmailAddress.trim().isEmpty) {
1519+
receiverEmailAddress = session!.getOwnEmailAddressOrUsername();
1520+
}
15171521
log('SingleEmailController::_handleSendReceiptToSenderAction():receiverEmailAddress: $receiverEmailAddress');
15181522
final mdnToSender = _generateMDN(context, currentEmail!, receiverEmailAddress);
15191523
final sendReceiptRequest = SendReceiptToSenderRequest(
@@ -1821,10 +1825,13 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
18211825
}
18221826

18231827
_printEmailButtonState = ButtonState.disabled;
1824-
1828+
String accountDisplayName = ownEmailAddress;
1829+
if (accountDisplayName.trim().isEmpty) {
1830+
accountDisplayName = session?.getOwnEmailAddressOrUsername() ?? '';
1831+
}
18251832
consumeState(emailActionReactor.printEmail(
18261833
email,
1827-
ownEmailAddress: mailboxDashBoardController.ownEmailAddress.value,
1834+
ownEmailAddress: accountDisplayName,
18281835
emailLoaded: currentEmailLoaded.value!,
18291836
));
18301837
}
@@ -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
@@ -89,7 +89,7 @@ class EmailView extends GetWidget<SingleEmailController> {
8989
position: position,
9090
responsiveUtils: controller.responsiveUtils,
9191
imagePaths: controller.imagePaths,
92-
username: controller.session?.username,
92+
ownEmailAddress: controller.ownEmailAddress,
9393
handleEmailAction: (email, action) => controller.handleEmailAction(context, email, action),
9494
additionalActions: [],
9595
emailIsRead: presentationEmail.hasRead,
@@ -163,7 +163,7 @@ class EmailView extends GetWidget<SingleEmailController> {
163163
responsiveUtils: controller.responsiveUtils,
164164
emailLoaded: emailLoaded,
165165
presentationEmail: currentEmail,
166-
userName: controller.getOwnEmailAddress(),
166+
userName: controller.ownEmailAddress,
167167
emailActionCallback: controller.pressEmailAction,
168168
);
169169
}),
@@ -261,7 +261,7 @@ class EmailView extends GetWidget<SingleEmailController> {
261261
position: position,
262262
responsiveUtils: controller.responsiveUtils,
263263
imagePaths: controller.imagePaths,
264-
username: controller.session?.username,
264+
ownEmailAddress: controller.ownEmailAddress,
265265
handleEmailAction: (email, action) => controller.handleEmailAction(context, email, action),
266266
additionalActions: [
267267
EmailActionType.reply,
@@ -310,10 +310,7 @@ class EmailView extends GetWidget<SingleEmailController> {
310310
),
311311
calendarEventReplying: controller.calendarEventProcessing,
312312
attendanceStatus: controller.attendanceStatus.value,
313-
ownEmailAddress: controller
314-
.mailboxDashBoardController
315-
.ownEmailAddress
316-
.value,
313+
ownEmailAddress: controller.ownEmailAddress,
317314
onMailtoAttendeesAction: controller.handleMailToAttendees,
318315
openEmailAddressDetailAction: (_, emailAddress) => controller.openEmailAddressDialog(emailAddress),
319316
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
@@ -20,7 +20,6 @@ import 'package:flutter/services.dart';
2020
import 'package:get/get.dart';
2121
import 'package:jmap_dart_client/jmap/account_id.dart';
2222
import 'package:jmap_dart_client/jmap/core/session/session.dart';
23-
import 'package:jmap_dart_client/jmap/core/user_name.dart';
2423
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
2524
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
2625
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
@@ -524,7 +523,7 @@ class EmailActionReactor {
524523
required RelativeRect? position,
525524
required ResponsiveUtils responsiveUtils,
526525
required ImagePaths imagePaths,
527-
required UserName? username,
526+
required String ownEmailAddress,
528527
required void Function(
529528
PresentationEmail presentationEmail,
530529
EmailActionType action,
@@ -541,7 +540,7 @@ class EmailActionReactor {
541540
EmailActionType.reply,
542541
if (additionalActions.contains(EmailActionType.forward))
543542
EmailActionType.forward,
544-
if (presentationEmail.getCountMailAddressWithoutMe(username?.value ?? '') > 1 &&
543+
if (presentationEmail.getCountMailAddressWithoutMe(ownEmailAddress) > 1 &&
545544
additionalActions.contains(EmailActionType.replyAll))
546545
EmailActionType.replyAll,
547546
if (EmailUtils.isReplyToListEnabled(presentationEmail.listPost ?? '') &&

0 commit comments

Comments
 (0)