TF-3894 Fix blank email content when opening email

This commit is contained in:
dab246
2025-09-03 10:37:01 +07:00
committed by Dat H. Pham
parent 949c1a698c
commit 5a64ff7e8f
41 changed files with 309 additions and 169 deletions
@@ -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)},
+2 -1
View File
@@ -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 {
@@ -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<Identity> 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();
}
}
}
@@ -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 ?? {},
@@ -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,
@@ -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<EmailAddress> 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;
}
@@ -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,
@@ -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;
@@ -89,7 +89,7 @@ class EmailView extends GetWidget<SingleEmailController> {
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<SingleEmailController> {
responsiveUtils: controller.responsiveUtils,
emailLoaded: emailLoaded,
presentationEmail: currentEmail,
userName: controller.getOwnEmailAddress(),
userName: controller.ownEmailAddress,
emailActionCallback: controller.pressEmailAction,
);
}),
@@ -261,7 +261,7 @@ class EmailView extends GetWidget<SingleEmailController> {
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<SingleEmailController> {
),
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,
@@ -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 ?? '') &&
@@ -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 '';
}
}
}
@@ -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!),
@@ -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);
}
@@ -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,
@@ -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<MailboxController>
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
@@ -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<RemoveEmailDraftsInteractor>();
final EmailReceiveManager _emailReceiveManager = Get.find<EmailReceiveManager>();
@@ -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<Role, MailboxId> mapDefaultMailboxIdByRole = {};
Map<MailboxId, PresentationMailbox> mapMailboxById = {};
final emailsInCurrentMailbox = <PresentationEmail>[].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<Identity> get listIdentities => _identities ?? [];
@@ -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<List<PresentationEmail>> 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 {
@@ -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();
@@ -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<Identity> listIdentities) {
final identityEmailAddress = listIdentities.firstOrNull?.email ?? '';
if (identityEmailAddress.isNotEmpty) {
synchronizeOwnEmailAddress(identityEmailAddress);
} else {
synchronizeOwnEmailAddress(sessionCurrent?.getUserDisplayName() ?? '');
}
}
}
@@ -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(
@@ -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);
}
@@ -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;
@@ -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<Identity> listIdentities) {
final identityEmailAddress = listIdentities.firstOrNull?.email ?? '';
if (identityEmailAddress.isNotEmpty) {
synchronizeOwnEmailAddress(identityEmailAddress);
} else {
synchronizeOwnEmailAddress(sessionCurrent?.getUserDisplayName() ?? '');
}
}
}
@@ -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,
@@ -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<VacationResponse>();
final dashboardSettingAction = Rxn<UIAction>();
final ownEmailAddress = Rx<String>('');
Session? sessionCurrent;
Uri? previousUri;
int minInputLengthAutocomplete = AppConfig.defaultMinInputLengthAutocomplete;
@@ -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<ManageAccountDashBoardControl
responsiveUtils: controller.responsiveUtils,
desktop: Column(children: [
FutureBuilder(
future: CozyConfigManager().isInsideCozy,
builder: (context, snapshot) {
if (snapshot.data == true) return const SizedBox.shrink();
future: CozyConfigManager().isInsideCozy,
builder: (context, snapshot) {
if (snapshot.data == true) return const SizedBox.shrink();
return Obx(() => 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: [
@@ -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<ManageAccountMenuController> {
top: 4,
),
onSelectAccountMenuItemAction: (_) {
controller.dashBoardController.logout(
context,
controller.dashBoardController.sessionCurrent,
controller.dashBoardController.accountId.value,
);
controller.dashBoardController
.handleProfileSettingActionTypeClick(
context: context,
actionType: ProfileSettingActionType.signOut,
);
}
),
]
@@ -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<SettingsController> {
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<SettingsController> {
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,
)
),
]),
);
@@ -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<PresentationEmail> get listResultSearch => mailboxDashBoardController.listResultSearch;
@@ -307,7 +307,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
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;
@@ -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));
}
}
@@ -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;
}
@@ -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<ThreadDetailController> {
responsiveUtils: controller.responsiveUtils,
emailLoaded: currentEmailLoaded,
presentationEmail: expandedPresentationEmail,
userName: controller.session?.getOwnEmailAddress() ?? '',
userName: controller.ownEmailAddress,
emailActionCallback: (action, email) {
controller.mailboxDashBoardController
..dispatchEmailUIAction(PerformEmailActionInThreadDetailAction(
@@ -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
@@ -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,
@@ -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',
);
@@ -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',
);
@@ -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<DraggableAppState> get attachmentDraggableAppState => Rxn(DraggableAppState.inActive);
@override
@@ -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,
@@ -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 = '<p>test</p>';
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 = '<p>test</p>';
const identityName = 'test';
identityCreatorController.arguments = IdentityCreatorArguments(accountId, session);
identityCreatorController.arguments = IdentityCreatorArguments(
accountId,
session,
ownEmailAddress,
);
when(mockVerifyNameInteractor.execute(any, any)).thenAnswer((_) => Right(VerifyNameViewState()));
// act
@@ -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);