diff --git a/integration_test/mixin/scenario_utils_mixin.dart b/integration_test/mixin/scenario_utils_mixin.dart index 8611c89c8..10b460c99 100644 --- a/integration_test/mixin/scenario_utils_mixin.dart +++ b/integration_test/mixin/scenario_utils_mixin.dart @@ -61,6 +61,7 @@ mixin ScenarioUtilsMixin { session: mailboxDashBoardController.sessionCurrent!, accountId: mailboxDashBoardController.accountId.value!, emailActionType: EmailActionType.compose, + ownEmailAddress: mailboxDashBoardController.ownEmailAddress.value, subject: provisioningEmail.subject, emailContent: provisioningEmail.content, toRecipients: {EmailAddress(null, provisioningEmail.toEmail)}, diff --git a/lib/features/base/base_controller.dart b/lib/features/base/base_controller.dart index b80459a9f..081472b13 100644 --- a/lib/features/base/base_controller.dart +++ b/lib/features/base/base_controller.dart @@ -421,11 +421,12 @@ abstract class BaseController extends GetxController BuildContext context, Session? session, AccountId? accountId, + String ownEmailAddress, ) { if (PlatformInfo.isMobile) { showLogoutConfirmDialog( context: context, - userAddress: session?.getOwnEmailAddressOrEmpty() ?? '', + userAddress: ownEmailAddress, onConfirmAction: () => _handleLogoutAction(session, accountId), ); } else { diff --git a/lib/features/base/mixin/own_email_address_mixin.dart b/lib/features/base/mixin/own_email_address_mixin.dart new file mode 100644 index 000000000..e4e6dda6b --- /dev/null +++ b/lib/features/base/mixin/own_email_address_mixin.dart @@ -0,0 +1,42 @@ +import 'package:core/utils/app_logger.dart'; +import 'package:get/get.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; +import 'package:jmap_dart_client/jmap/identities/identity.dart'; +import 'package:model/extensions/session_extension.dart'; +import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart'; + +mixin OwnEmailAddressMixin { + static const String emptyOwnEmailAddress = ''; + + final RxString ownEmailAddress = RxString(''); + Session? sessionCurrent; + + void synchronizeOwnEmailAddress(String emailAddress) { + log('$runtimeType::synchronizeOwnEmailAddress:OwnEmailAddress = ${ownEmailAddress.value}, NewEmailAddress = $emailAddress'); + if (ownEmailAddress.value.trim().isNotEmpty) return; + ownEmailAddress.value = emailAddress; + } + + void updateOwnEmailAddressFromIdentities(List listIdentities) { + if (ownEmailAddress.value.trim().isNotEmpty) return; + + if (listIdentities.isEmpty) { + synchronizeOwnEmailAddress(emptyOwnEmailAddress); + ownEmailAddress.refresh(); + return; + } + + final identityEmailAddress = listIdentities.firstOrNull?.email ?? ''; + final domain = EmailUtils.getDomainByEmailAddress(identityEmailAddress); + final userEmailAddress = + sessionCurrent?.generateOwnEmailAddressFromDomain(domain) ?? ''; + log('$runtimeType::updateOwnEmailAddressFromIdentities: UserEmailAddress = $userEmailAddress'); + + if (userEmailAddress.isNotEmpty) { + synchronizeOwnEmailAddress(userEmailAddress); + } else { + synchronizeOwnEmailAddress(emptyOwnEmailAddress); + ownEmailAddress.refresh(); + } + } +} diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index 8ad2bf57d..500bfb039 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -252,6 +252,9 @@ class ComposerController extends BaseController TransformHtmlEmailContentInteractor get transformHtmlEmailContentInteractor => _transformHtmlEmailContentInteractor; + String get ownEmailAddress => + mailboxDashBoardController.ownEmailAddress.value; + late Worker uploadInlineImageWorker; late Worker dashboardViewStateWorker; late bool _isEmailBodyLoaded; @@ -521,6 +524,7 @@ class ComposerController extends BaseController session: session, accountId: accountId, emailActionType: arguments.emailActionType, + ownEmailAddress: ownEmailAddress, subject: subjectEmail.value ?? '', emailContent: emailContent, fromSender: arguments.presentationEmail?.from ?? {}, @@ -698,7 +702,7 @@ class ComposerController extends BaseController required EmailActionType actionType, String? listPost, }) { - final senderEmailAddress = mailboxDashBoardController.sessionCurrent?.getOwnEmailAddressOrEmpty(); + final senderEmailAddress = ownEmailAddress; final isSender = presentationEmail.from .asList() .any((element) => element.emailAddress.isNotEmpty && element.emailAddress == senderEmailAddress); @@ -946,6 +950,7 @@ class ComposerController extends BaseController session: session, accountId: accountId, emailActionType: arguments.emailActionType, + ownEmailAddress: ownEmailAddress, subject: subjectEmail.value ?? '', emailContent: emailContent, fromSender: arguments.presentationEmail?.from ?? {}, @@ -2121,6 +2126,7 @@ class ComposerController extends BaseController session: session, accountId: accountId, emailActionType: arguments.emailActionType, + ownEmailAddress: ownEmailAddress, subject: subjectEmail.value ?? '', emailContent: emailContent, fromSender: arguments.presentationEmail?.from ?? {}, @@ -2171,6 +2177,7 @@ class ComposerController extends BaseController session: mailboxDashBoardController.sessionCurrent!, accountId: mailboxDashBoardController.accountId.value!, emailActionType: composerArguments.value!.emailActionType, + ownEmailAddress: ownEmailAddress, subject: subjectEmail.value ?? '', emailContent: emailContent, fromSender: composerArguments.value!.presentationEmail?.from ?? {}, diff --git a/lib/features/composer/presentation/extensions/composer_print_draft_extension.dart b/lib/features/composer/presentation/extensions/composer_print_draft_extension.dart index e0b754d8a..8742f4b84 100644 --- a/lib/features/composer/presentation/extensions/composer_print_draft_extension.dart +++ b/lib/features/composer/presentation/extensions/composer_print_draft_extension.dart @@ -8,6 +8,7 @@ import 'package:model/email/email_action_type.dart'; import 'package:model/extensions/identity_extension.dart'; import 'package:model/extensions/list_email_address_extension.dart'; import 'package:model/extensions/presentation_email_extension.dart'; +import 'package:model/extensions/session_extension.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:tmail_ui_user/features/base/state/button_state.dart'; import 'package:tmail_ui_user/features/composer/presentation/composer_controller.dart'; @@ -80,12 +81,18 @@ extension ComposerPrintDraftExtension on ComposerController { pattern: currentTime.toPatternForPrinting(locale.toLanguageTag()), ); } + String accountDisplayName = ownEmailAddress; + if (accountDisplayName.trim().isEmpty) { + accountDisplayName = mailboxDashBoardController + .sessionCurrent + ?.getOwnEmailAddressOrUsername() ?? ''; + } log('ComposerPrintDraftExtension::_showPrintDraftsDialog:receiveTime = $receiveTime | emailActionType = $emailActionType'); final childWidget = PointerInterceptor( child: PrintDraftDialogView( emailPrint: DraftEmailPrint( appName: appLocalizations.app_name, - userName: mailboxDashBoardController.ownEmailAddress.value, + userName: accountDisplayName, attachments: uploadController.allAttachmentsUploaded, emailContent: emailContent, fromPrefix: appLocalizations.from_email_address_prefix, 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 129ef9cc6..090546bae 100644 --- a/lib/features/composer/presentation/extensions/create_email_request_extension.dart +++ b/lib/features/composer/presentation/extensions/create_email_request_extension.dart @@ -10,7 +10,6 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:model/email/email_action_type.dart'; import 'package:model/email/mail_priority_header.dart'; import 'package:model/extensions/email_address_extension.dart'; -import 'package:model/extensions/session_extension.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; import 'package:tmail_ui_user/features/composer/presentation/extensions/identity_extension.dart'; @@ -26,8 +25,8 @@ extension CreateEmailRequestExtension on CreateEmailRequest { Set createSenders() { if (identity?.email?.isNotEmpty == true) { return { identity!.toEmailAddress() }; - } else if (session.getOwnEmailAddressOrEmpty().isNotEmpty) { - return { EmailAddress(null, session.getOwnEmailAddressOrEmpty()) }; + } else if (ownEmailAddress.isNotEmpty) { + return { EmailAddress(null, ownEmailAddress) }; } else { return {}; } @@ -36,8 +35,8 @@ extension CreateEmailRequestExtension on CreateEmailRequest { String createMdnEmailAddress() { if (emailActionType == EmailActionType.editDraft && fromSender?.isNotEmpty == true) { return fromSender!.first.emailAddress; - } else if (session.getOwnEmailAddressOrEmpty().isNotEmpty) { - return session.getOwnEmailAddressOrEmpty(); + } else if (ownEmailAddress.isNotEmpty) { + return ownEmailAddress; } else { return ''; } @@ -52,8 +51,8 @@ extension CreateEmailRequestExtension on CreateEmailRequest { return identity?.replyTo?.isNotEmpty == true ? identity!.replyTo! - : session.getOwnEmailAddressOrEmpty().isNotEmpty - ? {EmailAddress(null, session.getOwnEmailAddressOrEmpty())} + : ownEmailAddress.isNotEmpty + ? {EmailAddress(null, ownEmailAddress)} : null; } diff --git a/lib/features/composer/presentation/model/create_email_request.dart b/lib/features/composer/presentation/model/create_email_request.dart index f5d98e93d..b21069b32 100644 --- a/lib/features/composer/presentation/model/create_email_request.dart +++ b/lib/features/composer/presentation/model/create_email_request.dart @@ -16,6 +16,7 @@ class CreateEmailRequest with EquatableMixin { final Session session; final AccountId accountId; final EmailActionType emailActionType; + final String ownEmailAddress; final String subject; final String emailContent; final bool hasRequestReadReceipt; @@ -51,6 +52,7 @@ class CreateEmailRequest with EquatableMixin { required this.session, required this.accountId, required this.emailActionType, + required this.ownEmailAddress, required this.subject, required this.emailContent, this.fromSender, @@ -88,6 +90,7 @@ class CreateEmailRequest with EquatableMixin { session, accountId, emailActionType, + ownEmailAddress, subject, emailContent, fromSender, diff --git a/lib/features/email/presentation/controller/single_email_controller.dart b/lib/features/email/presentation/controller/single_email_controller.dart index 5a05875ac..173152cb6 100644 --- a/lib/features/email/presentation/controller/single_email_controller.dart +++ b/lib/features/email/presentation/controller/single_email_controller.dart @@ -1513,7 +1513,11 @@ class SingleEmailController extends BaseController with AppLoaderMixin { return; } - final receiverEmailAddress = _getReceiverEmailAddress(currentEmail!) ?? session!.getOwnEmailAddressOrEmpty(); + String receiverEmailAddress = _getReceiverEmailAddress(currentEmail!) + ?? ownEmailAddress; + if (receiverEmailAddress.trim().isEmpty) { + receiverEmailAddress = session!.getOwnEmailAddressOrUsername(); + } log('SingleEmailController::_handleSendReceiptToSenderAction():receiverEmailAddress: $receiverEmailAddress'); final mdnToSender = _generateMDN(context, currentEmail!, receiverEmailAddress); final sendReceiptRequest = SendReceiptToSenderRequest( @@ -1821,10 +1825,13 @@ class SingleEmailController extends BaseController with AppLoaderMixin { } _printEmailButtonState = ButtonState.disabled; - + String accountDisplayName = ownEmailAddress; + if (accountDisplayName.trim().isEmpty) { + accountDisplayName = session?.getOwnEmailAddressOrUsername() ?? ''; + } consumeState(emailActionReactor.printEmail( email, - ownEmailAddress: mailboxDashBoardController.ownEmailAddress.value, + ownEmailAddress: accountDisplayName, emailLoaded: currentEmailLoaded.value!, )); } @@ -2324,8 +2331,8 @@ class SingleEmailController extends BaseController with AppLoaderMixin { listEmailAddressAttendees.addAll(listEmailAddress); - final currentUserEmail = mailboxDashBoardController.ownEmailAddress.value; - final listEmailAddressMailTo = listEmailAddressAttendees.removeInvalidEmails(currentUserEmail); + final listEmailAddressMailTo = + listEmailAddressAttendees.removeInvalidEmails(ownEmailAddress); log('SingleEmailController::handleMailToAttendees: listEmailAddressMailTo = $listEmailAddressMailTo'); mailboxDashBoardController.openComposer( ComposerArguments.fromMailtoUri(listEmailAddress: listEmailAddressMailTo) @@ -2341,8 +2348,6 @@ class SingleEmailController extends BaseController with AppLoaderMixin { } } - String getOwnEmailAddress() => session?.getOwnEmailAddressOrEmpty() ?? ''; - void onHtmlContentClippedAction(bool isClipped) { log('SingleEmailController::onHtmlContentClippedAction:isClipped = $isClipped'); isEmailContentClipped.value = isClipped; diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index 8a103ce2a..8203e3b50 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -89,7 +89,7 @@ class EmailView extends GetWidget { position: position, responsiveUtils: controller.responsiveUtils, imagePaths: controller.imagePaths, - username: controller.session?.username, + ownEmailAddress: controller.ownEmailAddress, handleEmailAction: (email, action) => controller.handleEmailAction(context, email, action), additionalActions: [], emailIsRead: presentationEmail.hasRead, @@ -163,7 +163,7 @@ class EmailView extends GetWidget { responsiveUtils: controller.responsiveUtils, emailLoaded: emailLoaded, presentationEmail: currentEmail, - userName: controller.getOwnEmailAddress(), + userName: controller.ownEmailAddress, emailActionCallback: controller.pressEmailAction, ); }), @@ -261,7 +261,7 @@ class EmailView extends GetWidget { position: position, responsiveUtils: controller.responsiveUtils, imagePaths: controller.imagePaths, - username: controller.session?.username, + ownEmailAddress: controller.ownEmailAddress, handleEmailAction: (email, action) => controller.handleEmailAction(context, email, action), additionalActions: [ EmailActionType.reply, @@ -310,10 +310,7 @@ class EmailView extends GetWidget { ), calendarEventReplying: controller.calendarEventProcessing, attendanceStatus: controller.attendanceStatus.value, - ownEmailAddress: controller - .mailboxDashBoardController - .ownEmailAddress - .value, + ownEmailAddress: controller.ownEmailAddress, onMailtoAttendeesAction: controller.handleMailToAttendees, openEmailAddressDetailAction: (_, emailAddress) => controller.openEmailAddressDialog(emailAddress), isFree: controller.isCalendarEventFree, diff --git a/lib/features/email/presentation/utils/email_action_reactor/email_action_reactor.dart b/lib/features/email/presentation/utils/email_action_reactor/email_action_reactor.dart index 10c9cd31b..c2e18b23c 100644 --- a/lib/features/email/presentation/utils/email_action_reactor/email_action_reactor.dart +++ b/lib/features/email/presentation/utils/email_action_reactor/email_action_reactor.dart @@ -20,7 +20,6 @@ import 'package:flutter/services.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; -import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; @@ -524,7 +523,7 @@ class EmailActionReactor { required RelativeRect? position, required ResponsiveUtils responsiveUtils, required ImagePaths imagePaths, - required UserName? username, + required String ownEmailAddress, required void Function( PresentationEmail presentationEmail, EmailActionType action, @@ -541,7 +540,7 @@ class EmailActionReactor { EmailActionType.reply, if (additionalActions.contains(EmailActionType.forward)) EmailActionType.forward, - if (presentationEmail.getCountMailAddressWithoutMe(username?.value ?? '') > 1 && + if (presentationEmail.getCountMailAddressWithoutMe(ownEmailAddress) > 1 && additionalActions.contains(EmailActionType.replyAll)) EmailActionType.replyAll, if (EmailUtils.isReplyToListEnabled(presentationEmail.listPost ?? '') && diff --git a/lib/features/email/presentation/utils/email_utils.dart b/lib/features/email/presentation/utils/email_utils.dart index 199fd92da..6202be5bb 100644 --- a/lib/features/email/presentation/utils/email_utils.dart +++ b/lib/features/email/presentation/utils/email_utils.dart @@ -264,4 +264,14 @@ class EmailUtils { : attachments.sublist(0, possibleDisplayedCount); } } + + static String getDomainByEmailAddress(String emailAddress) { + try { + MailAddress mailAddress = MailAddress.validateAddress(emailAddress); + return mailAddress.domain.asString(); + } catch (e) { + logError('EmailUtils::getDomainByEmailAddress:Exception is $e'); + return ''; + } + } } \ No newline at end of file diff --git a/lib/features/email_previewer/email_previewer_controller.dart b/lib/features/email_previewer/email_previewer_controller.dart index ffd9b2750..371142912 100644 --- a/lib/features/email_previewer/email_previewer_controller.dart +++ b/lib/features/email_previewer/email_previewer_controller.dart @@ -271,7 +271,7 @@ class EmailPreviewerController extends ReloadableController { consumeState(_previewEmailFromEmlFileInteractor.execute( PreviewEmailEMLRequest( accountId: _accountId!, - ownEmailAddress: _session!.getOwnEmailAddressOrEmpty(), + ownEmailAddress: _session!.getOwnEmailAddressOrUsername(), blobId: success.blobId, email: success.email, locale: Localizations.localeOf(currentContext!), diff --git a/lib/features/identity_creator/presentation/identity_creator_controller.dart b/lib/features/identity_creator/presentation/identity_creator_controller.dart index 35dbdb480..8da885f36 100644 --- a/lib/features/identity_creator/presentation/identity_creator_controller.dart +++ b/lib/features/identity_creator/presentation/identity_creator_controller.dart @@ -359,12 +359,12 @@ class IdentityCreatorController extends BaseController with DragDropFileMixin im .toSet() .toList(); - if(session?.getOwnEmailAddressOrEmpty().isNotEmpty == true - && !listEmailAddressDefault.any((emailAddress) => emailAddress.email == session?.getOwnEmailAddressOrEmpty())) { - listEmailAddressDefault.add(EmailAddress( - null, - session?.getOwnEmailAddressOrEmpty(), - )); + final ownEmailAddress = arguments?.ownerEmailAddress ?? ''; + final isOwnEmailAddressInList = listEmailAddressDefault + .any((emailAddress) => emailAddress.email == ownEmailAddress); + + if (ownEmailAddress.isNotEmpty && !isOwnEmailAddressInList) { + listEmailAddressDefault.add(EmailAddress(null, ownEmailAddress)); } listEmailAddressOfReplyTo.add(noneEmailAddress); listEmailAddressOfReplyTo.addAll(listEmailAddressDefault); @@ -385,11 +385,9 @@ class IdentityCreatorController extends BaseController with DragDropFileMixin im void _setDefaultEmailAddressList() { listEmailAddressOfReplyTo.add(noneEmailAddress); - if (session?.getOwnEmailAddressOrEmpty().isNotEmpty == true) { - final userEmailAddress = EmailAddress( - null, - session?.getOwnEmailAddressOrEmpty(), - ); + final ownEmailAddress = arguments?.ownerEmailAddress ?? ''; + if (ownEmailAddress.isNotEmpty) { + final userEmailAddress = EmailAddress(null, ownEmailAddress); listEmailAddressDefault.add(userEmailAddress); listEmailAddressOfReplyTo.addAll(listEmailAddressDefault); } diff --git a/lib/features/identity_creator/presentation/model/identity_creator_arguments.dart b/lib/features/identity_creator/presentation/model/identity_creator_arguments.dart index d84b22085..b2e550777 100644 --- a/lib/features/identity_creator/presentation/model/identity_creator_arguments.dart +++ b/lib/features/identity_creator/presentation/model/identity_creator_arguments.dart @@ -9,6 +9,7 @@ import 'package:tmail_ui_user/features/public_asset/domain/model/public_assets_i class IdentityCreatorArguments with EquatableMixin { final AccountId accountId; final Session session; + final String ownerEmailAddress; final IdentityActionType actionType; final PublicAssetsInIdentityArguments? publicAssetsInIdentityArguments; final bool? isDefault; @@ -17,6 +18,7 @@ class IdentityCreatorArguments with EquatableMixin { IdentityCreatorArguments( this.accountId, this.session, + this.ownerEmailAddress, { this.identity, this.publicAssetsInIdentityArguments, diff --git a/lib/features/mailbox/presentation/base_mailbox_view.dart b/lib/features/mailbox/presentation/base_mailbox_view.dart index 6e070b370..b8b0fc557 100644 --- a/lib/features/mailbox/presentation/base_mailbox_view.dart +++ b/lib/features/mailbox/presentation/base_mailbox_view.dart @@ -4,6 +4,7 @@ import 'package:core/presentation/views/list/tree_view.dart'; import 'package:core/utils/platform_info.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:model/extensions/session_extension.dart'; import 'package:model/mailbox/expand_mode.dart'; import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart'; import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart'; @@ -34,7 +35,10 @@ abstract class BaseMailboxView extends GetWidget final dashboardController = controller.mailboxDashBoardController; final accountId = dashboardController.accountId.value; final session = dashboardController.sessionCurrent; - final username = dashboardController.ownEmailAddress.value; + String username = dashboardController.ownEmailAddress.value; + if (username.trim().isEmpty) { + username = session?.getOwnEmailAddressOrUsername() ?? ''; + } final linagoraApps = dashboardController .appGridDashboardController diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index f51e7f074..52d85dc43 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -31,6 +31,7 @@ import 'package:rxdart/transformers.dart'; import 'package:tmail_ui_user/features/base/action/ui_action.dart'; import 'package:tmail_ui_user/features/base/mixin/contact_support_mixin.dart'; import 'package:tmail_ui_user/features/base/mixin/message_dialog_action_manager.dart'; +import 'package:tmail_ui_user/features/base/mixin/own_email_address_mixin.dart'; import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart'; import 'package:tmail_ui_user/features/composer/domain/exceptions/set_method_exception.dart'; import 'package:tmail_ui_user/features/composer/domain/extensions/email_request_extension.dart'; @@ -126,7 +127,6 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/reopen_composer_cache_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/set_error_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/update_current_emails_flags_extension.dart'; -import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/update_own_email_address_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/web_auth_redirect_processor_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/download/download_task_state.dart'; @@ -203,7 +203,7 @@ import 'package:server_settings/server_settings/tmail_server_settings_extension. import 'package:uuid/uuid.dart'; class MailboxDashBoardController extends ReloadableController - with ContactSupportMixin { + with ContactSupportMixin, OwnEmailAddressMixin { final RemoveEmailDraftsInteractor _removeEmailDraftsInteractor = Get.find(); final EmailReceiveManager _emailReceiveManager = Get.find(); @@ -285,9 +285,7 @@ class MailboxDashBoardController extends ReloadableController final isDrawerOpened = RxBool(false); final isContextMenuOpened = RxBool(false); final isPopupMenuOpened = RxBool(false); - final ownEmailAddress = RxString(''); - Session? sessionCurrent; Map mapDefaultMailboxIdByRole = {}; Map mapMailboxById = {}; final emailsInCurrentMailbox = [].obs; @@ -1986,6 +1984,7 @@ class MailboxDashBoardController extends ReloadableController return searchController.quickSearchEmails( session: sessionCurrent!, accountId: accountId.value!, + ownEmailAddress: ownEmailAddress.value, query: query ); } else { @@ -3226,7 +3225,7 @@ class MailboxDashBoardController extends ReloadableController void _handleGetAllIdentitiesFailure() { _identities = null; - synchronizeOwnEmailAddress(sessionCurrent?.getUserDisplayName() ?? ''); + updateOwnEmailAddressFromIdentities([]); } List get listIdentities => _identities ?? []; diff --git a/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart index f12ee7868..9fbc9b7c1 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart @@ -17,7 +17,6 @@ import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart'; import 'package:jmap_dart_client/jmap/mail/email/keyword_identifier.dart'; import 'package:model/email/presentation_email.dart'; import 'package:model/extensions/email_filter_condition_extension.dart'; -import 'package:model/extensions/session_extension.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/base/mixin/date_range_picker_mixin.dart'; @@ -91,6 +90,7 @@ class SearchController extends BaseController with DateRangePickerMixin { Future> quickSearchEmails({ required Session session, required AccountId accountId, + required String ownEmailAddress, required String query, }) async { currentSearchText = query; @@ -102,7 +102,7 @@ class SearchController extends BaseController with DateRangePickerMixin { EmailComparator(EmailComparatorProperty.receivedAt) ..setIsAscending(false)), filter: _mappingToFilterOnSuggestionForm( - currentUserEmail: session.getOwnEmailAddressOrEmpty(), + currentUserEmail: ownEmailAddress, query: query, ), properties: EmailUtils.getPropertiesForEmailGetMethod(session, accountId), @@ -127,7 +127,7 @@ class SearchController extends BaseController with DateRangePickerMixin { hasAttachment: listFilterOnSuggestionForm.contains(QuickSearchFilter.hasAttachment) ? true : null, - from: listFilterOnSuggestionForm.contains(QuickSearchFilter.fromMe) + from: listFilterOnSuggestionForm.contains(QuickSearchFilter.fromMe) && currentUserEmail.isNotEmpty ? currentUserEmail : null, hasKeyword: listFilterOnSuggestionForm.contains(QuickSearchFilter.starred) @@ -140,7 +140,7 @@ class SearchController extends BaseController with DateRangePickerMixin { : null; } - void applyFilterSuggestionToSearchFilter(String? currentUserEmail) { + void applyFilterSuggestionToSearchFilter(String currentUserEmail) { final receiveTime = listFilterOnSuggestionForm.contains(QuickSearchFilter.last7Days) ? EmailReceiveTimeType.last7Days : EmailReceiveTimeType.allTime; @@ -148,7 +148,7 @@ class SearchController extends BaseController with DateRangePickerMixin { final hasAttachment = listFilterOnSuggestionForm.contains(QuickSearchFilter.hasAttachment) ? true : false; var listFromAddress = searchEmailFilter.value.from; - if (currentUserEmail != null) { + if (currentUserEmail.isNotEmpty) { if (listFilterOnSuggestionForm.contains(QuickSearchFilter.fromMe)) { listFromAddress.add(currentUserEmail); } else { diff --git a/lib/features/mailbox_dashboard/presentation/extensions/handle_profile_setting_action_type_click_extension.dart b/lib/features/mailbox_dashboard/presentation/extensions/handle_profile_setting_action_type_click_extension.dart index 3b6d34a3b..d815e21ab 100644 --- a/lib/features/mailbox_dashboard/presentation/extensions/handle_profile_setting_action_type_click_extension.dart +++ b/lib/features/mailbox_dashboard/presentation/extensions/handle_profile_setting_action_type_click_extension.dart @@ -1,5 +1,6 @@ import 'package:flutter/cupertino.dart'; +import 'package:model/extensions/session_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/profile_setting/profile_setting_action_type.dart'; @@ -10,7 +11,12 @@ extension HandleProfileSettingActionTypeClickExtension on MailboxDashBoardContro }) { switch (actionType) { case ProfileSettingActionType.signOut: - logout(context, sessionCurrent, accountId.value); + String accountDisplayName = ownEmailAddress.value; + if (accountDisplayName.trim().isEmpty) { + accountDisplayName = + sessionCurrent?.getOwnEmailAddressOrUsername() ?? ''; + } + logout(context, sessionCurrent, accountId.value, accountDisplayName); break; case ProfileSettingActionType.manageAccount: goToSettings(); diff --git a/lib/features/mailbox_dashboard/presentation/extensions/update_own_email_address_extension.dart b/lib/features/mailbox_dashboard/presentation/extensions/update_own_email_address_extension.dart deleted file mode 100644 index 213b5f79a..000000000 --- a/lib/features/mailbox_dashboard/presentation/extensions/update_own_email_address_extension.dart +++ /dev/null @@ -1,24 +0,0 @@ - -import 'package:core/utils/app_logger.dart'; -import 'package:jmap_dart_client/jmap/identities/identity.dart'; -import 'package:model/extensions/session_extension.dart'; -import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; - -extension UpdateOwnEmailAddressExtension on MailboxDashBoardController { - - void synchronizeOwnEmailAddress(String emailAddress) { - log('UpdateOwnEmailAddressExtension::synchronizeOwnEmailAddress:OwnEmailAddress = ${ownEmailAddress.value}, NewEmailAddress = $emailAddress'); - if (ownEmailAddress.value.isNotEmpty || emailAddress.isEmpty) return; - ownEmailAddress.value = emailAddress; - } - - void updateOwnEmailAddressFromIdentities(List listIdentities) { - final identityEmailAddress = listIdentities.firstOrNull?.email ?? ''; - - if (identityEmailAddress.isNotEmpty) { - synchronizeOwnEmailAddress(identityEmailAddress); - } else { - synchronizeOwnEmailAddress(sessionCurrent?.getUserDisplayName() ?? ''); - } - } -} \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart index f56187800..c3c90e18e 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart @@ -81,15 +81,20 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { return Obx(() { final accountId = controller.accountId.value; - final ownEmailAddress = controller.ownEmailAddress.value; + String accountDisplayName = controller.ownEmailAddress.value; final contactSupportCapability = accountId != null ? controller.sessionCurrent?.getContactSupportCapability(accountId) : null; + if (accountDisplayName.trim().isEmpty) { + accountDisplayName = controller + .sessionCurrent + ?.getOwnEmailAddressOrUsername() ?? ''; + } return NavigationBarWidget( imagePaths: controller.imagePaths, accountId: accountId, - ownEmailAddress: ownEmailAddress, + ownEmailAddress: accountDisplayName, contactSupportCapability: contactSupportCapability, searchForm: SearchInputFormWidget(), appGridController: @@ -151,8 +156,15 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { ), const Spacer(), Obx(() { + String accountDisplayName = + controller.ownEmailAddress.value; + if (accountDisplayName.trim().isEmpty) { + accountDisplayName = controller + .sessionCurrent + ?.getOwnEmailAddressOrUsername() ?? ''; + } return ProfileSettingIcon( - ownEmailAddress: controller.ownEmailAddress.value, + ownEmailAddress: accountDisplayName, settingActionTypes: ProfileSettingActionType.values, onProfileSettingActionTypeClick: (actionType) => controller.handleProfileSettingActionTypeClick( diff --git a/lib/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart b/lib/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart index 6c3d47a44..a0ec733d7 100644 --- a/lib/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart +++ b/lib/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart @@ -17,7 +17,6 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:model/email/presentation_email.dart'; -import 'package:model/extensions/session_extension.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart'; @@ -173,7 +172,7 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin { sortOrderType: _dashBoardController.currentSortOrder, ); _searchController.applyFilterSuggestionToSearchFilter( - _dashBoardController.sessionCurrent?.getOwnEmailAddressOrEmpty(), + _dashBoardController.ownEmailAddress.value, ); _dashBoardController.searchEmailByQueryString(queryString); } else { @@ -213,7 +212,7 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin { sortOrderType: _dashBoardController.currentSortOrder, ); _searchController.applyFilterSuggestionToSearchFilter( - _dashBoardController.sessionCurrent?.getOwnEmailAddressOrEmpty(), + _dashBoardController.ownEmailAddress.value, ); _dashBoardController.searchEmailByQueryString(recent.value); } diff --git a/lib/features/manage_account/presentation/extensions/handle_profile_setting_action_type_click_extension.dart b/lib/features/manage_account/presentation/extensions/handle_profile_setting_action_type_click_extension.dart index 301f2f9f6..81f812486 100644 --- a/lib/features/manage_account/presentation/extensions/handle_profile_setting_action_type_click_extension.dart +++ b/lib/features/manage_account/presentation/extensions/handle_profile_setting_action_type_click_extension.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:model/extensions/session_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/profile_setting/profile_setting_action_type.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart'; @@ -10,7 +11,12 @@ extension HandleProfileSettingActionTypeClickExtension on ManageAccountDashBoard }) { switch (actionType) { case ProfileSettingActionType.signOut: - logout(context, sessionCurrent, accountId.value); + String accountDisplayName = ownEmailAddress.value; + if (accountDisplayName.trim().isEmpty) { + accountDisplayName = + sessionCurrent?.getOwnEmailAddressOrUsername() ?? ''; + } + logout(context, sessionCurrent, accountId.value, accountDisplayName); break; default: break; diff --git a/lib/features/manage_account/presentation/extensions/update_own_email_address_extension.dart b/lib/features/manage_account/presentation/extensions/update_own_email_address_extension.dart deleted file mode 100644 index bd0a6b6c5..000000000 --- a/lib/features/manage_account/presentation/extensions/update_own_email_address_extension.dart +++ /dev/null @@ -1,24 +0,0 @@ - -import 'package:core/utils/app_logger.dart'; -import 'package:jmap_dart_client/jmap/identities/identity.dart'; -import 'package:model/extensions/session_extension.dart'; -import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart'; - -extension UpdateOwnEmailAddressExtension on ManageAccountDashBoardController { - - void synchronizeOwnEmailAddress(String emailAddress) { - log('UpdateOwnEmailAddressExtension::synchronizeOwnEmailAddress:OwnEmailAddress = ${ownEmailAddress.value}, NewEmailAddress = $emailAddress'); - if (ownEmailAddress.value.isNotEmpty || emailAddress.isEmpty) return; - ownEmailAddress.value = emailAddress; - } - - void updateOwnEmailAddressFromIdentities(List listIdentities) { - final identityEmailAddress = listIdentities.firstOrNull?.email ?? ''; - - if (identityEmailAddress.isNotEmpty) { - synchronizeOwnEmailAddress(identityEmailAddress); - } else { - synchronizeOwnEmailAddress(sessionCurrent?.getUserDisplayName() ?? ''); - } - } -} \ No newline at end of file diff --git a/lib/features/manage_account/presentation/identities/identities_controller.dart b/lib/features/manage_account/presentation/identities/identities_controller.dart index 51bb9d66b..6811c67a8 100644 --- a/lib/features/manage_account/presentation/identities/identities_controller.dart +++ b/lib/features/manage_account/presentation/identities/identities_controller.dart @@ -11,7 +11,6 @@ import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/identities/identity.dart'; import 'package:model/extensions/identity_request_dto_extension.dart'; -import 'package:model/extensions/session_extension.dart'; import 'package:tmail_ui_user/features/base/before_reconnect_handler.dart'; import 'package:tmail_ui_user/features/base/before_reconnect_manager.dart'; import 'package:tmail_ui_user/features/base/mixin/message_dialog_action_manager.dart'; @@ -40,7 +39,6 @@ import 'package:tmail_ui_user/features/manage_account/domain/usecases/edit_ident import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/transform_list_signature_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/identity_extension.dart'; -import 'package:tmail_ui_user/features/manage_account/presentation/extensions/update_own_email_address_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/list_identity_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/identity_action_type.dart'; @@ -142,6 +140,7 @@ class IdentitiesController extends ReloadableController implements BeforeReconne void handleFailureViewState(Failure failure) { if (failure is GetAllIdentitiesFailure) { identitiesViewState.value = Left(failure); + accountDashBoardController.updateOwnEmailAddressFromIdentities([]); } else if (failure is DeleteIdentityFailure) { _deleteIdentityFailure(failure); } else if (failure is RemoveIdentityFromPublicAssetsFailureState) { @@ -150,10 +149,6 @@ class IdentitiesController extends ReloadableController implements BeforeReconne _deleteIdentityAction(failure.identityId); } else if (failure is GetIdentityCacheOnWebFailure) { _removeIdentityCache(); - } else if (failure is GetAllIdentitiesFailure) { - accountDashBoardController.synchronizeOwnEmailAddress( - accountDashBoardController.sessionCurrent?.getUserDisplayName() ?? '', - ); } else if (failure is TransformListSignatureFailure) { signatureViewState.value = Left(failure); _syncMapIdentitySignatures(failure.identitySignatures); @@ -204,7 +199,7 @@ class IdentitiesController extends ReloadableController implements BeforeReconne _transformSignature(); } - + bool _validateIdentity(Identity identity) { return identity.mayDelete == true && identity.name?.trim().isNotEmpty == true; @@ -228,7 +223,11 @@ class IdentitiesController extends ReloadableController implements BeforeReconne final accountId = accountDashBoardController.accountId.value; final session = accountDashBoardController.sessionCurrent; if (accountId != null && session != null) { - final arguments = IdentityCreatorArguments(accountId, session); + final arguments = IdentityCreatorArguments( + accountId, + session, + accountDashBoardController.ownEmailAddress.value, + ); newIdentityArguments = PlatformInfo.isWeb ? await DialogRouter.pushGeneralDialog(routeName: AppRoutes.identityCreator, arguments: arguments) @@ -378,6 +377,7 @@ class IdentitiesController extends ReloadableController implements BeforeReconne final arguments = IdentityCreatorArguments( accountId, session, + accountDashBoardController.ownEmailAddress.value, identity: identity, actionType: IdentityActionType.edit); @@ -474,6 +474,7 @@ class IdentitiesController extends ReloadableController implements BeforeReconne final arguments = IdentityCreatorArguments( accountId, session, + accountDashBoardController.ownEmailAddress.value, identity: identityCache.identity, isDefault: identityCache.isDefault, publicAssetsInIdentityArguments: identityCache.publicAssetsInIdentityArguments, diff --git a/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart b/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart index 5193a244c..33a44f2d1 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart @@ -14,6 +14,7 @@ import 'package:model/model.dart'; import 'package:rule_filter/rule_filter/capability_rule_filter.dart'; import 'package:server_settings/server_settings/capability_server_settings.dart'; import 'package:tmail_ui_user/features/base/action/ui_action.dart'; +import 'package:tmail_ui_user/features/base/mixin/own_email_address_mixin.dart'; import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart'; import 'package:tmail_ui_user/features/base/widget/dialog_picker/color_dialog_picker.dart'; import 'package:tmail_ui_user/features/base/widget/dialog_picker/date_time_dialog_picker.dart'; @@ -26,7 +27,6 @@ import 'package:tmail_ui_user/features/manage_account/domain/usecases/update_vac import 'package:tmail_ui_user/features/manage_account/presentation/action/dashboard_setting_action.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/bindings/email_rules_bindings.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/export_trace_log_extension.dart'; -import 'package:tmail_ui_user/features/manage_account/presentation/extensions/update_own_email_address_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/forward/bindings/forward_bindings.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/identities/identity_bindings.dart'; @@ -46,7 +46,8 @@ import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_utils.dart'; import 'package:tmail_ui_user/main/utils/app_config.dart'; -class ManageAccountDashBoardController extends ReloadableController { +class ManageAccountDashBoardController extends ReloadableController + with OwnEmailAddressMixin { GetAllVacationInteractor? _getAllVacationInteractor; UpdateVacationInteractor? _updateVacationInteractor; @@ -56,9 +57,7 @@ class ManageAccountDashBoardController extends ReloadableController { final settingsPageLevel = SettingsPageLevel.universal.obs; final vacationResponse = Rxn(); final dashboardSettingAction = Rxn(); - final ownEmailAddress = Rx(''); - Session? sessionCurrent; Uri? previousUri; int minInputLengthAutocomplete = AppConfig.defaultMinInputLengthAutocomplete; diff --git a/lib/features/manage_account/presentation/manage_account_dashboard_view.dart b/lib/features/manage_account/presentation/manage_account_dashboard_view.dart index 342fc1d95..a4e3c80a2 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_view.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_view.dart @@ -5,6 +5,7 @@ import 'package:cozy/cozy_config_manager/cozy_config_manager.dart'; import 'package:flutter/material.dart'; import 'package:flutter_portal/flutter_portal.dart'; import 'package:get/get.dart'; +import 'package:model/extensions/session_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/profile_setting/profile_setting_action_type.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/navigation_bar/navigation_bar_widget.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/email_rules_view.dart'; @@ -40,25 +41,36 @@ class ManageAccountDashBoardView extends GetWidget NavigationBarWidget( - imagePaths: controller.imagePaths, - accountId: controller.accountId.value, - ownEmailAddress: controller.ownEmailAddress.value, - onTapApplicationLogoAction: () => - controller.backToMailboxDashBoard(context: context), - settingActionTypes: const [ProfileSettingActionType.signOut], - onProfileSettingActionTypeClick: (actionType) => - controller.handleProfileSettingActionTypeClick( - context: context, - actionType: actionType, - ), - )); - } - ), + return Obx(() { + final accountId = controller.accountId.value; + String accountDisplayName = controller.ownEmailAddress.value; + + if (accountDisplayName.trim().isEmpty) { + accountDisplayName = controller + .sessionCurrent + ?.getOwnEmailAddressOrUsername() ?? ''; + } + + return NavigationBarWidget( + imagePaths: controller.imagePaths, + accountId: accountId, + ownEmailAddress: accountDisplayName, + onTapApplicationLogoAction: () => + controller.backToMailboxDashBoard(context: context), + settingActionTypes: const [ProfileSettingActionType.signOut], + onProfileSettingActionTypeClick: (actionType) => + controller.handleProfileSettingActionTypeClick( + context: context, + actionType: actionType, + ), + ); + }); + }, + ), Expanded(child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ diff --git a/lib/features/manage_account/presentation/menu/manage_account_menu_view.dart b/lib/features/manage_account/presentation/menu/manage_account_menu_view.dart index 3e28363bd..458cba118 100644 --- a/lib/features/manage_account/presentation/menu/manage_account_menu_view.dart +++ b/lib/features/manage_account/presentation/menu/manage_account_menu_view.dart @@ -6,6 +6,8 @@ import 'package:core/utils/direction_utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/profile_setting/profile_setting_action_type.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/extensions/handle_profile_setting_action_type_click_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/manage_account_menu_controller.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/widgets/account_menu_item_tile_builder.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart'; @@ -140,11 +142,11 @@ class ManageAccountMenuView extends GetWidget { top: 4, ), onSelectAccountMenuItemAction: (_) { - controller.dashBoardController.logout( - context, - controller.dashBoardController.sessionCurrent, - controller.dashBoardController.accountId.value, - ); + controller.dashBoardController + .handleProfileSettingActionTypeClick( + context: context, + actionType: ProfileSettingActionType.signOut, + ); } ), ] diff --git a/lib/features/manage_account/presentation/menu/settings/settings_first_level_view.dart b/lib/features/manage_account/presentation/menu/settings/settings_first_level_view.dart index 2798d3609..f28aa9f36 100644 --- a/lib/features/manage_account/presentation/menu/settings/settings_first_level_view.dart +++ b/lib/features/manage_account/presentation/menu/settings/settings_first_level_view.dart @@ -2,8 +2,11 @@ import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/utils/platform_info.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:model/extensions/session_extension.dart'; import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/user_information_widget.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/profile_setting/profile_setting_action_type.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/extensions/handle_profile_setting_action_type_click_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings/settings_controller.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings_utils.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/widgets/setting_first_level_tile_builder.dart'; @@ -19,17 +22,27 @@ class SettingsFirstLevelView extends GetWidget { return SingleChildScrollView( key: const Key('setting_menu'), child: Column(children: [ - Obx(() => UserInformationWidget( - ownEmailAddress: controller + Obx(() { + String accountDisplayName = controller .manageAccountDashboardController .ownEmailAddress - .value, - padding: SettingsUtils.getPaddingInFirstLevel( - context, - controller.responsiveUtils, - ), - titlePadding: const EdgeInsetsDirectional.only(start: 16), - )), + .value; + + if (accountDisplayName.trim().isEmpty) { + accountDisplayName = controller + .manageAccountDashboardController + .sessionCurrent + ?.getOwnEmailAddressOrUsername() ?? ''; + } + return UserInformationWidget( + ownEmailAddress: accountDisplayName, + padding: SettingsUtils.getPaddingInFirstLevel( + context, + controller.responsiveUtils, + ), + titlePadding: const EdgeInsetsDirectional.only(start: 16), + ); + }), Divider( color: AppColor.colorDividerHorizontal, height: 1, @@ -222,10 +235,12 @@ class SettingsFirstLevelView extends GetWidget { SettingFirstLevelTileBuilder( AppLocalizations.of(context).sign_out, controller.imagePaths.icSignOut, - () => controller.manageAccountDashboardController.logout( - context, - controller.manageAccountDashboardController.sessionCurrent, - controller.manageAccountDashboardController.accountId.value) + () => controller + .manageAccountDashboardController + .handleProfileSettingActionTypeClick( + context: context, + actionType: ProfileSettingActionType.signOut, + ) ), ]), ); diff --git a/lib/features/search/email/presentation/search_email_controller.dart b/lib/features/search/email/presentation/search_email_controller.dart index e335b061e..4913a9b0f 100644 --- a/lib/features/search/email/presentation/search_email_controller.dart +++ b/lib/features/search/email/presentation/search_email_controller.dart @@ -121,6 +121,8 @@ class SearchEmailController extends BaseController Session? get session => mailboxDashBoardController.sessionCurrent; + String get ownEmailAddress => mailboxDashBoardController.ownEmailAddress.value; + SearchQuery? get searchQuery => searchEmailFilter.value.text; RxList get listResultSearch => mailboxDashBoardController.listResultSearch; diff --git a/lib/features/search/email/presentation/search_email_view.dart b/lib/features/search/email/presentation/search_email_view.dart index 39c5e1ac6..37fb6d9c2 100644 --- a/lib/features/search/email/presentation/search_email_view.dart +++ b/lib/features/search/email/presentation/search_email_view.dart @@ -307,7 +307,7 @@ class SearchEmailView extends GetWidget final searchEmailFilter = controller.searchEmailFilter.value; final sortOrderType = controller.emailSortOrderType.value; final listAddressOfFrom = controller.listAddressOfFromFiltered; - final currentUserEmail = controller.session?.getOwnEmailAddressOrEmpty(); + final currentUserEmail = controller.ownEmailAddress; final startDate = controller.startDateFiltered; final endDate = controller.endDateFiltered; final receiveTimeType = controller.receiveTimeFiltered; diff --git a/lib/features/thread_detail/presentation/extension/handle_refresh_thread_detail_action.dart b/lib/features/thread_detail/presentation/extension/handle_refresh_thread_detail_action.dart index 924e7a176..c7f681e43 100644 --- a/lib/features/thread_detail/presentation/extension/handle_refresh_thread_detail_action.dart +++ b/lib/features/thread_detail/presentation/extension/handle_refresh_thread_detail_action.dart @@ -124,8 +124,8 @@ extension HandleRefreshThreadDetailAction on ThreadDetailController { return true; } - return ownEmailAddress != null && - (!email.fromMe(ownEmailAddress!) || - !email.recipientsHasMe(ownEmailAddress!)); + return ownEmailAddress.isNotEmpty && + (!email.fromMe(ownEmailAddress) || + !email.recipientsHasMe(ownEmailAddress)); } } \ No newline at end of file diff --git a/lib/features/thread_detail/presentation/thread_detail_controller.dart b/lib/features/thread_detail/presentation/thread_detail_controller.dart index 6187d9518..a4316abd1 100644 --- a/lib/features/thread_detail/presentation/thread_detail_controller.dart +++ b/lib/features/thread_detail/presentation/thread_detail_controller.dart @@ -16,7 +16,6 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:model/email/email_property.dart'; import 'package:model/email/presentation_email.dart'; import 'package:model/extensions/keyword_identifier_extension.dart'; -import 'package:model/extensions/session_extension.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/email/domain/state/print_email_state.dart'; @@ -107,7 +106,7 @@ class ThreadDetailController extends BaseController { session!, accountId!, sentMailboxId!, - ownEmailAddress!, + ownEmailAddress, isSentMailbox: value.isSentMailbox, )); } @@ -130,7 +129,10 @@ class ThreadDetailController extends BaseController { MailboxId? get sentMailboxId => mailboxDashBoardController.getMailboxIdByRole( PresentationMailbox.roleSent, ); - String? get ownEmailAddress => session?.getOwnEmailAddress(); + + String get ownEmailAddress => + mailboxDashBoardController.ownEmailAddress.value; + bool get isSearchRunning { final isWebSearchRunning = mailboxDashBoardController .searchController @@ -217,7 +219,7 @@ class ThreadDetailController extends BaseController { session != null && accountId != null && sentMailboxId != null && - ownEmailAddress != null && + ownEmailAddress.isNotEmpty && networkConnected && isThreadDetailEnabled; } diff --git a/lib/features/thread_detail/presentation/thread_detail_view.dart b/lib/features/thread_detail/presentation/thread_detail_view.dart index 72af34e7f..318c95c98 100644 --- a/lib/features/thread_detail/presentation/thread_detail_view.dart +++ b/lib/features/thread_detail/presentation/thread_detail_view.dart @@ -6,7 +6,6 @@ import 'package:core/utils/platform_info.dart'; import 'package:dartz/dartz.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:model/extensions/session_extension.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart'; import 'package:tmail_ui_user/features/email/presentation/styles/email_view_app_bar_widget_styles.dart'; @@ -175,7 +174,7 @@ class ThreadDetailView extends GetWidget { responsiveUtils: controller.responsiveUtils, emailLoaded: currentEmailLoaded, presentationEmail: expandedPresentationEmail, - userName: controller.session?.getOwnEmailAddress() ?? '', + userName: controller.ownEmailAddress, emailActionCallback: (action, email) { controller.mailboxDashBoardController ..dispatchEmailUIAction(PerformEmailActionInThreadDetailAction( diff --git a/model/lib/extensions/session_extension.dart b/model/lib/extensions/session_extension.dart index 48a4542a3..95a4de506 100644 --- a/model/lib/extensions/session_extension.dart +++ b/model/lib/extensions/session_extension.dart @@ -129,6 +129,26 @@ extension SessionExtension on Session { return null; } + String generateOwnEmailAddressFromDomain(String domain) { + try { + final userName = username.value; + if (domain.trim().isEmpty || userName.trim().isEmpty) return ''; + + if (userName.endsWith(domain)) return userName; + + return '$userName@$domain'; + } catch (e) { + logError('$runtimeType::generateOwnEmailAddressFromDomain: Exception: $e'); + return ''; + } + } + + String getOwnEmailAddressOrUsername() { + final emailAddress = getOwnEmailAddressOrEmpty(); + if (emailAddress.isNotEmpty) return emailAddress; + return getUserDisplayName(); + } + JmapAccount get personalAccount { if (accounts.isNotEmpty) { final listPersonalAccount = accounts.entries diff --git a/test/features/composer/data/repository/composer_repository_impl_test.dart b/test/features/composer/data/repository/composer_repository_impl_test.dart index 9beebca85..1bbd209f9 100644 --- a/test/features/composer/data/repository/composer_repository_impl_test.dart +++ b/test/features/composer/data/repository/composer_repository_impl_test.dart @@ -61,6 +61,7 @@ void main() { when(mockCreateEmailRequest.session).thenReturn(mockSession); when(mockCreateEmailRequest.identity).thenReturn(mockIdentity); when(mockCreateEmailRequest.replyToRecipients).thenReturn({}); + when(mockCreateEmailRequest.ownEmailAddress).thenReturn('test@example.com'); repository = ComposerRepositoryImpl( mockAttachmentUploadDataSource, 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 034881a88..d2ac8b84a 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 @@ -4,6 +4,7 @@ import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:mockito/annotations.dart'; import 'package:mockito/mockito.dart'; import 'package:model/email/email_action_type.dart'; +import 'package:model/extensions/session_extension.dart'; import 'package:tmail_ui_user/features/composer/domain/repository/composer_repository.dart'; import 'package:tmail_ui_user/features/composer/domain/usecases/create_new_and_save_email_to_drafts_interactor.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/create_email_request.dart'; @@ -41,6 +42,9 @@ void main() { session: SessionFixtures.aliceSession, accountId: AccountFixtures.aliceAccountId, emailActionType: EmailActionType.editDraft, + ownEmailAddress: SessionFixtures + .aliceSession + .getOwnEmailAddressOrEmpty(), subject: 'subject', emailContent: 'emailContent', draftsEmailId: EmailId(Id('some-id')) @@ -81,6 +85,9 @@ void main() { session: SessionFixtures.aliceSession, accountId: AccountFixtures.aliceAccountId, emailActionType: EmailActionType.editDraft, + ownEmailAddress: SessionFixtures + .aliceSession + .getOwnEmailAddressOrEmpty(), subject: 'subject', emailContent: 'emailContent', ); 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 4eaeecca0..8cb725187 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 @@ -3,6 +3,7 @@ import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:mockito/annotations.dart'; import 'package:mockito/mockito.dart'; import 'package:model/email/email_action_type.dart'; +import 'package:model/extensions/session_extension.dart'; import 'package:tmail_ui_user/features/composer/domain/repository/composer_repository.dart'; import 'package:tmail_ui_user/features/composer/domain/usecases/create_new_and_send_email_interactor.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/create_email_request.dart'; @@ -32,6 +33,9 @@ void main() { session: SessionFixtures.aliceSession, accountId: AccountFixtures.aliceAccountId, emailActionType: EmailActionType.editDraft, + ownEmailAddress: SessionFixtures + .aliceSession + .getOwnEmailAddressOrEmpty(), subject: 'subject', emailContent: 'emailContent', ); diff --git a/test/features/composer/presentation/composer_controller_test.dart b/test/features/composer/presentation/composer_controller_test.dart index b56cb6637..5f1355f50 100644 --- a/test/features/composer/presentation/composer_controller_test.dart +++ b/test/features/composer/presentation/composer_controller_test.dart @@ -22,6 +22,7 @@ import 'package:mockito/annotations.dart'; import 'package:mockito/mockito.dart'; import 'package:model/email/attachment.dart'; import 'package:model/email/email_action_type.dart'; +import 'package:model/extensions/session_extension.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:rich_text_composer/rich_text_composer.dart'; import 'package:tmail_ui_user/features/base/before_reconnect_manager.dart'; @@ -106,6 +107,9 @@ class MockMailboxDashBoardController extends Mock implements MailboxDashBoardCon @override Session? get sessionCurrent => SessionFixtures.aliceSession; + @override + RxString get ownEmailAddress => SessionFixtures.aliceSession.getOwnEmailAddressOrEmpty().obs; + @override Rxn get attachmentDraggableAppState => Rxn(DraggableAppState.inActive); @override 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 78c966494..8fdbd5db6 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 @@ -13,6 +13,9 @@ void main() { session: SessionFixtures.aliceSession, accountId: AccountFixtures.aliceAccountId, emailActionType: EmailActionType.editDraft, + ownEmailAddress: SessionFixtures + .aliceSession + .getOwnEmailAddressOrEmpty(), subject: 'subject', emailContent: 'emailContent', ); @@ -67,6 +70,9 @@ void main() { session: SessionFixtures.aliceSession, accountId: AccountFixtures.aliceAccountId, emailActionType: EmailActionType.editDraft, + ownEmailAddress: SessionFixtures + .aliceSession + .getOwnEmailAddressOrEmpty(), subject: 'subject', emailContent: 'emailContent', hasRequestReadReceipt: true, diff --git a/test/features/identity_creator/presentation/identity_creator_controller_test.dart b/test/features/identity_creator/presentation/identity_creator_controller_test.dart index a712dd8a8..0abe834ba 100644 --- a/test/features/identity_creator/presentation/identity_creator_controller_test.dart +++ b/test/features/identity_creator/presentation/identity_creator_controller_test.dart @@ -196,6 +196,7 @@ void main() { {}, {accountId: account}, {}, UserName('value'), Uri(), Uri(), Uri(), Uri(), State('value')); + String ownEmailAddress = 'user@example.com'; test( 'should call deletePublicAssetsInteractor.execute() ' @@ -213,7 +214,11 @@ void main() { {}, {accountId: account}, {}, UserName('value'), Uri(), Uri(), Uri(), Uri(), State('value')); - identityCreatorController.arguments = IdentityCreatorArguments(accountId, session); + identityCreatorController.arguments = IdentityCreatorArguments( + accountId, + session, + ownEmailAddress, + ); // act identityCreatorController.onReady(); @@ -242,7 +247,11 @@ void main() { 'and user has not picked any image', () { // arrange - identityCreatorController.arguments = IdentityCreatorArguments(accountId, session); + identityCreatorController.arguments = IdentityCreatorArguments( + accountId, + session, + ownEmailAddress, + ); // act identityCreatorController.onReady(); @@ -272,7 +281,11 @@ void main() { PlatformInfo.isTestingForWeb = true; const htmlContent = '

test

'; const identityName = 'test'; - identityCreatorController.arguments = IdentityCreatorArguments(accountId, session); + identityCreatorController.arguments = IdentityCreatorArguments( + accountId, + session, + ownEmailAddress, + ); when(mockVerifyNameInteractor.execute(any, any)).thenAnswer((_) => Right(VerifyNameViewState())); // act @@ -322,7 +335,11 @@ void main() { PlatformInfo.isTestingForWeb = true; const htmlContent = '

test

'; const identityName = 'test'; - identityCreatorController.arguments = IdentityCreatorArguments(accountId, session); + identityCreatorController.arguments = IdentityCreatorArguments( + accountId, + session, + ownEmailAddress, + ); when(mockVerifyNameInteractor.execute(any, any)).thenAnswer((_) => Right(VerifyNameViewState())); // act diff --git a/test/features/manage_account/presentation/profiles/identities/identities_controller_test.dart b/test/features/manage_account/presentation/profiles/identities/identities_controller_test.dart index fad87a0b0..213a732bf 100644 --- a/test/features/manage_account/presentation/profiles/identities/identities_controller_test.dart +++ b/test/features/manage_account/presentation/profiles/identities/identities_controller_test.dart @@ -243,7 +243,7 @@ void main() { .thenAnswer((_) => Stream.value(Right(GetAllIdentitiesSuccess( [identity1, identity2, identity3, identity4], null)))); - when(mockManageAccountDashBoardController.ownEmailAddress).thenReturn(Rx('')); + when(mockManageAccountDashBoardController.ownEmailAddress).thenReturn(RxString('')); when(mockManageAccountDashBoardController.accountId).thenReturn(Rxn()); when(mockManageAccountDashBoardController.sessionCurrent).thenReturn(SessionFixtures.aliceSession);