TF-2667 Use Username replace UserProfile

This commit is contained in:
dab246
2024-03-05 10:02:08 +07:00
committed by Dat H. Pham
parent de4849f551
commit c9fed1fa41
36 changed files with 148 additions and 245 deletions
@@ -19,6 +19,7 @@ import 'package:get/get.dart';
import 'package:html_editor_enhanced/html_editor.dart' as web_html_editor; import 'package:html_editor_enhanced/html_editor.dart' as web_html_editor;
import 'package:http_parser/http_parser.dart'; import 'package:http_parser/http_parser.dart';
import 'package:jmap_dart_client/jmap/core/id.dart'; import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:jmap_dart_client/jmap/core/user_name.dart';
import 'package:jmap_dart_client/jmap/identities/identity.dart'; import 'package:jmap_dart_client/jmap/identities/identity.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.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/email/email_address.dart';
@@ -368,13 +369,13 @@ class ComposerController extends BaseController with DragDropFileMixin {
}); });
} }
void _listenBrowserEventAction() { void _listenBrowserTabRefresh() {
log('ComposerController::_listenBrowserEventAction:'); _subscriptionOnBeforeUnload = html.window.onBeforeUnload.listen((event) async {
_subscriptionOnBeforeUnload = html.window.onBeforeUnload.listen((event) async {
final userProfile = mailboxDashBoardController.userProfile.value;
_removeComposerCacheOnWebInteractor.execute(); _removeComposerCacheOnWebInteractor.execute();
if (userProfile != null) { if (mailboxDashBoardController.sessionCurrent != null) {
final draftEmail = await _generateEmail(currentContext!, userProfile); final draftEmail = await _generateEmail(
currentContext!,
mailboxDashBoardController.sessionCurrent!.username);
_saveComposerCacheOnWebInteractor.execute(draftEmail); _saveComposerCacheOnWebInteractor.execute(draftEmail);
} }
}); });
@@ -624,17 +625,17 @@ class ComposerController extends BaseController with DragDropFileMixin {
emailActionType: actionType, emailActionType: actionType,
mailboxRole: mailboxRole mailboxRole: mailboxRole
); );
final userProfile = mailboxDashBoardController.userProfile.value; final userName = mailboxDashBoardController.sessionCurrent?.username;
if (userProfile != null) { if (userName != null) {
final isSender = presentationEmail.from.asList().every((element) => element.email == userProfile.email); final isSender = presentationEmail.from.asList().every((element) => element.email == userName.value);
if (isSender) { if (isSender) {
listToEmailAddress = List.from(recipients.value1.toSet()); listToEmailAddress = List.from(recipients.value1.toSet());
listCcEmailAddress = List.from(recipients.value2.toSet()); listCcEmailAddress = List.from(recipients.value2.toSet());
listBccEmailAddress = List.from(recipients.value3.toSet()); listBccEmailAddress = List.from(recipients.value3.toSet());
} else { } else {
listToEmailAddress = List.from(recipients.value1.toSet().filterEmailAddress(userProfile.email)); listToEmailAddress = List.from(recipients.value1.toSet().filterEmailAddress(userName.value));
listCcEmailAddress = List.from(recipients.value2.toSet().filterEmailAddress(userProfile.email)); listCcEmailAddress = List.from(recipients.value2.toSet().filterEmailAddress(userName.value));
listBccEmailAddress = List.from(recipients.value3.toSet().filterEmailAddress(userProfile.email)); listBccEmailAddress = List.from(recipients.value3.toSet().filterEmailAddress(userName.value));
} }
} else { } else {
listToEmailAddress = List.from(recipients.value1.toSet()); listToEmailAddress = List.from(recipients.value1.toSet());
@@ -692,7 +693,7 @@ class ComposerController extends BaseController with DragDropFileMixin {
Future<Email> _generateEmail( Future<Email> _generateEmail(
BuildContext context, BuildContext context,
UserProfile userProfile, UserName userName,
{ {
bool asDrafts = false, bool asDrafts = false,
MailboxId? draftMailboxId, MailboxId? draftMailboxId,
@@ -700,7 +701,7 @@ class ComposerController extends BaseController with DragDropFileMixin {
ComposerArguments? arguments, ComposerArguments? arguments,
} }
) async { ) async {
Set<EmailAddress> listFromEmailAddress = {EmailAddress(null, userProfile.email)}; Set<EmailAddress> listFromEmailAddress = {EmailAddress(null, userName.value)};
if (identitySelected.value?.email?.isNotEmpty == true) { if (identitySelected.value?.email?.isNotEmpty == true) {
listFromEmailAddress = { listFromEmailAddress = {
EmailAddress( EmailAddress(
@@ -709,7 +710,7 @@ class ComposerController extends BaseController with DragDropFileMixin {
) )
}; };
} }
Set<EmailAddress> listReplyToEmailAddress = {EmailAddress(null, userProfile.email)}; Set<EmailAddress> listReplyToEmailAddress = {EmailAddress(null, userName.value)};
if (identitySelected.value?.replyTo?.isNotEmpty == true) { if (identitySelected.value?.replyTo?.isNotEmpty == true) {
listReplyToEmailAddress = identitySelected.value!.replyTo!; listReplyToEmailAddress = identitySelected.value!.replyTo!;
} }
@@ -925,7 +926,6 @@ class ComposerController extends BaseController with DragDropFileMixin {
bool get _isParamUserNull { bool get _isParamUserNull {
if (composerArguments.value == null || if (composerArguments.value == null ||
mailboxDashBoardController.userProfile.value == null ||
mailboxDashBoardController.sessionCurrent == null || mailboxDashBoardController.sessionCurrent == null ||
mailboxDashBoardController.accountId.value == null mailboxDashBoardController.accountId.value == null
) { ) {
@@ -942,19 +942,18 @@ class ComposerController extends BaseController with DragDropFileMixin {
return; return;
} }
final sendingArgs = await _createSendingEmailArguments(context); final sendingArgs = await createSendingEmailArguments(context);
_closeComposerAction(result: sendingArgs); _closeComposerAction(result: sendingArgs);
} }
Future<SendingEmailArguments> _createSendingEmailArguments(BuildContext context) async { Future<SendingEmailArguments> createSendingEmailArguments(BuildContext context) async {
final session = mailboxDashBoardController.sessionCurrent!; final session = mailboxDashBoardController.sessionCurrent!;
final arguments = composerArguments.value!; final arguments = composerArguments.value!;
final accountId = mailboxDashBoardController.accountId.value!; final accountId = mailboxDashBoardController.accountId.value!;
final userProfile = mailboxDashBoardController.userProfile.value!;
final createdEmail = await _generateEmail( final createdEmail = await _generateEmail(
context, context,
userProfile, session.username,
outboxMailboxId: mailboxDashBoardController.outboxMailbox?.id, outboxMailboxId: mailboxDashBoardController.outboxMailbox?.id,
arguments: arguments arguments: arguments
); );
@@ -1187,14 +1186,12 @@ class ComposerController extends BaseController with DragDropFileMixin {
Future<SaveToDraftArguments?> _generateSaveAsDraftsArguments(BuildContext context) async { Future<SaveToDraftArguments?> _generateSaveAsDraftsArguments(BuildContext context) async {
log('ComposerController::_generateSaveAsDraftsArguments:'); log('ComposerController::_generateSaveAsDraftsArguments:');
final arguments = composerArguments.value; final arguments = composerArguments.value;
final userProfile = mailboxDashBoardController.userProfile.value;
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
final session = mailboxDashBoardController.sessionCurrent; final session = mailboxDashBoardController.sessionCurrent;
final draftMailboxId = mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleDrafts]; final draftMailboxId = mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleDrafts];
if (arguments == null || if (arguments == null ||
draftMailboxId == null || draftMailboxId == null ||
userProfile == null ||
session == null || session == null ||
accountId == null accountId == null
) { ) {
@@ -1204,7 +1201,7 @@ class ComposerController extends BaseController with DragDropFileMixin {
if (_emailIdEditing != null && _emailIdEditing != arguments.presentationEmail?.id) { if (_emailIdEditing != null && _emailIdEditing != arguments.presentationEmail?.id) {
final newEmail = await _generateEmail( final newEmail = await _generateEmail(
context, context,
userProfile, session.username,
asDrafts: true, asDrafts: true,
draftMailboxId: draftMailboxId, draftMailboxId: draftMailboxId,
arguments: arguments, arguments: arguments,
@@ -1226,7 +1223,7 @@ class ComposerController extends BaseController with DragDropFileMixin {
if (isChanged && context.mounted) { if (isChanged && context.mounted) {
final newEmail = await _generateEmail( final newEmail = await _generateEmail(
context, context,
userProfile, session.username,
asDrafts: true, asDrafts: true,
draftMailboxId: draftMailboxId, draftMailboxId: draftMailboxId,
arguments: arguments, arguments: arguments,
@@ -1253,19 +1250,18 @@ class ComposerController extends BaseController with DragDropFileMixin {
_saveToDraftButtonState = ButtonState.disabled; _saveToDraftButtonState = ButtonState.disabled;
final userProfile = mailboxDashBoardController.userProfile.value;
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
final session = mailboxDashBoardController.sessionCurrent; final session = mailboxDashBoardController.sessionCurrent;
final draftMailboxId = mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleDrafts]; final draftMailboxId = mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleDrafts];
if (draftMailboxId == null || userProfile == null || session == null || accountId == null) { if (draftMailboxId == null || session == null || accountId == null) {
log('ComposerController::saveToDraftAction: Param is NULL'); log('ComposerController::saveToDraftAction: Param is NULL');
return; return;
} }
final newEmail = await _generateEmail( final newEmail = await _generateEmail(
context, context,
userProfile, session.username,
asDrafts: true, asDrafts: true,
draftMailboxId: draftMailboxId, draftMailboxId: draftMailboxId,
arguments: mailboxDashBoardController.composerArguments); arguments: mailboxDashBoardController.composerArguments);
@@ -1383,7 +1379,7 @@ class ComposerController extends BaseController with DragDropFileMixin {
if (arguments.emailActionType == EmailActionType.editDraft) { if (arguments.emailActionType == EmailActionType.editDraft) {
return arguments.presentationEmail?.firstEmailAddressInFrom ?? ''; return arguments.presentationEmail?.firstEmailAddressInFrom ?? '';
} else { } else {
return mailboxDashBoardController.userProfile.value?.email ?? ''; return mailboxDashBoardController.sessionCurrent?.username.value ?? '';
} }
} }
return ''; return '';
@@ -1912,8 +1908,6 @@ class ComposerController extends BaseController with DragDropFileMixin {
bool get isNetworkConnectionAvailable => networkConnectionController.isNetworkConnectionAvailable(); bool get isNetworkConnectionAvailable => networkConnectionController.isNetworkConnectionAvailable();
UserProfile? get userProfile => mailboxDashBoardController.userProfile.value;
String? get textEditorWeb => _textEditorWeb; String? get textEditorWeb => _textEditorWeb;
HtmlEditorApi? get htmlEditorApi => richTextMobileTabletController.htmlEditorApi; HtmlEditorApi? get htmlEditorApi => richTextMobileTabletController.htmlEditorApi;
@@ -4,14 +4,12 @@ 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/session/session.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/user/user_profile.dart';
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
class SaveToDraftViewEvent extends ViewEvent { class SaveToDraftViewEvent extends ViewEvent {
final BuildContext context; final BuildContext context;
final Session session; final Session session;
final AccountId accountId; final AccountId accountId;
final UserProfile userProfile;
final MailboxId draftMailboxId; final MailboxId draftMailboxId;
final EmailId? emailIdEditing; final EmailId? emailIdEditing;
final ComposerArguments? arguments; final ComposerArguments? arguments;
@@ -20,7 +18,6 @@ class SaveToDraftViewEvent extends ViewEvent {
required this.context, required this.context,
required this.session, required this.session,
required this.accountId, required this.accountId,
required this.userProfile,
required this.draftMailboxId, required this.draftMailboxId,
this.emailIdEditing, this.emailIdEditing,
this.arguments, this.arguments,
@@ -31,7 +28,6 @@ class SaveToDraftViewEvent extends ViewEvent {
context, context,
session, session,
accountId, accountId,
userProfile,
draftMailboxId, draftMailboxId,
emailIdEditing, emailIdEditing,
arguments, arguments,
@@ -2,21 +2,20 @@
import 'package:core/presentation/utils/keyboard_utils.dart'; import 'package:core/presentation/utils/keyboard_utils.dart';
import 'package:core/utils/app_logger.dart'; import 'package:core/utils/app_logger.dart';
import 'package:core/utils/platform_info.dart'; import 'package:core/utils/platform_info.dart';
import 'package:debounce_throttle/debounce_throttle.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/account_id.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/session/session.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:model/autocomplete/auto_complete_pattern.dart'; import 'package:model/autocomplete/auto_complete_pattern.dart';
import 'package:model/user/user_profile.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:debounce_throttle/debounce_throttle.dart';
import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart';
import 'package:tmail_ui_user/features/composer/domain/model/contact_suggestion_source.dart'; import 'package:tmail_ui_user/features/composer/domain/model/contact_suggestion_source.dart';
import 'package:tmail_ui_user/features/composer/domain/state/get_autocomplete_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/get_autocomplete_state.dart';
import 'package:tmail_ui_user/features/composer/domain/state/get_device_contact_suggestions_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/get_device_contact_suggestions_state.dart';
import 'package:tmail_ui_user/features/composer/domain/usecases/get_autocomplete_interactor.dart';
import 'package:tmail_ui_user/features/composer/domain/usecases/get_all_autocomplete_interactor.dart'; import 'package:tmail_ui_user/features/composer/domain/usecases/get_all_autocomplete_interactor.dart';
import 'package:tmail_ui_user/features/composer/domain/usecases/get_autocomplete_interactor.dart';
import 'package:tmail_ui_user/features/composer/domain/usecases/get_device_contact_suggestions_interactor.dart'; import 'package:tmail_ui_user/features/composer/domain/usecases/get_device_contact_suggestions_interactor.dart';
import 'package:tmail_ui_user/features/contact/presentation/model/contact_arguments.dart'; import 'package:tmail_ui_user/features/contact/presentation/model/contact_arguments.dart';
import 'package:tmail_ui_user/features/contact/presentation/widgets/contact_suggestion_box_item.dart'; import 'package:tmail_ui_user/features/contact/presentation/widgets/contact_suggestion_box_item.dart';
@@ -32,7 +31,6 @@ class ContactController extends BaseController {
final searchQuery = SearchQuery.initial().obs; final searchQuery = SearchQuery.initial().obs;
final listContactSearched = RxList<EmailAddress>(); final listContactSearched = RxList<EmailAddress>();
final scrollListViewController = ScrollController(); final scrollListViewController = ScrollController();
final userProfile = Rxn<UserProfile>();
GetAllAutoCompleteInteractor? _getAllAutoCompleteInteractor; GetAllAutoCompleteInteractor? _getAllAutoCompleteInteractor;
GetAutoCompleteInteractor? _getAutoCompleteInteractor; GetAutoCompleteInteractor? _getAutoCompleteInteractor;
@@ -40,7 +38,7 @@ class ContactController extends BaseController {
final Debouncer<String> _deBouncerTime = Debouncer<String>(const Duration(milliseconds: 300), initialValue: ''); final Debouncer<String> _deBouncerTime = Debouncer<String>(const Duration(milliseconds: 300), initialValue: '');
AccountId? _accountId; AccountId? _accountId;
Session? _session; Session? session;
ContactArguments? arguments; ContactArguments? arguments;
EmailAddress? contactSelected; EmailAddress? contactSelected;
@@ -65,17 +63,14 @@ class ContactController extends BaseController {
textInputSearchFocus.requestFocus(); textInputSearchFocus.requestFocus();
if (arguments != null) { if (arguments != null) {
_accountId = arguments!.accountId; _accountId = arguments!.accountId;
_session = arguments!.session; session = arguments!.session;
if (_session != null) {
userProfile.value = UserProfile(_session!.username.value);
}
final listContactSelected = arguments!.listContactSelected; final listContactSelected = arguments!.listContactSelected;
log('ContactController::onReady(): arguments: $arguments'); log('ContactController::onReady(): arguments: $arguments');
log('ContactController::onReady(): listContactSelected: $listContactSelected'); log('ContactController::onReady(): listContactSelected: $listContactSelected');
if (listContactSelected.isNotEmpty) { if (listContactSelected.isNotEmpty) {
contactSelected = EmailAddress(listContactSelected.first, listContactSelected.first); contactSelected = EmailAddress(listContactSelected.first, listContactSelected.first);
} }
injectAutoCompleteBindings(_session, _accountId); injectAutoCompleteBindings(session, _accountId);
} }
if (PlatformInfo.isMobile) { if (PlatformInfo.isMobile) {
Future.delayed( Future.delayed(
@@ -80,9 +80,10 @@ class ContactView extends GetWidget<ContactController> {
), ),
if (PlatformInfo.isWeb) if (PlatformInfo.isWeb)
Obx(() { Obx(() {
final userEmail = controller.userProfile.value?.email; if (controller.session?.username.value.isNotEmpty == true) {
if (userEmail != null && userEmail.isNotEmpty) { final userEmailAddress = EmailAddress(
final userEmailAddress = EmailAddress(AppLocalizations.of(context).me, controller.userProfile.value?.email); AppLocalizations.of(context).me,
controller.session?.username.value);
final fromMeSuggestionEmailAddress = SuggestionEmailAddress(userEmailAddress, state: SuggestionEmailState.valid); final fromMeSuggestionEmailAddress = SuggestionEmailAddress(userEmailAddress, state: SuggestionEmailState.valid);
return Padding( return Padding(
padding: const EdgeInsets.symmetric(horizontal: 4), padding: const EdgeInsets.symmetric(horizontal: 4),
@@ -1193,8 +1193,8 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
void _handleSendReceiptToSenderAction(BuildContext context) { void _handleSendReceiptToSenderAction(BuildContext context) {
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
final userProfile = mailboxDashBoardController.userProfile.value; final session = mailboxDashBoardController.sessionCurrent;
if (accountId == null || userProfile == null) { if (accountId == null || session == null) {
return; return;
} }
@@ -1219,7 +1219,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
return; return;
} }
final receiverEmailAddress = _getReceiverEmailAddress(currentEmail!) ?? userProfile.email; final receiverEmailAddress = _getReceiverEmailAddress(currentEmail!) ?? session.username.value;
log('SingleEmailController::_handleSendReceiptToSenderAction():receiverEmailAddress: $receiverEmailAddress'); log('SingleEmailController::_handleSendReceiptToSenderAction():receiverEmailAddress: $receiverEmailAddress');
final mdnToSender = _generateMDN(context, currentEmail!, receiverEmailAddress); final mdnToSender = _generateMDN(context, currentEmail!, receiverEmailAddress);
final sendReceiptRequest = SendReceiptToSenderRequest( final sendReceiptRequest = SendReceiptToSenderRequest(
@@ -23,7 +23,6 @@ import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:model/extensions/email_address_extension.dart'; import 'package:model/extensions/email_address_extension.dart';
import 'package:model/extensions/identity_extension.dart'; import 'package:model/extensions/identity_extension.dart';
import 'package:model/extensions/session_extension.dart'; import 'package:model/extensions/session_extension.dart';
import 'package:model/user/user_profile.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:rich_text_composer/rich_text_composer.dart'; import 'package:rich_text_composer/rich_text_composer.dart';
import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart';
@@ -81,7 +80,6 @@ class IdentityCreatorController extends BaseController {
String? _contentHtmlEditor; String? _contentHtmlEditor;
AccountId? accountId; AccountId? accountId;
Session? session; Session? session;
UserProfile? userProfile;
Identity? identity; Identity? identity;
IdentityCreatorArguments? arguments; IdentityCreatorArguments? arguments;
@@ -123,7 +121,6 @@ class IdentityCreatorController extends BaseController {
if (arguments != null) { if (arguments != null) {
accountId = arguments!.accountId; accountId = arguments!.accountId;
session = arguments!.session; session = arguments!.session;
userProfile = arguments!.userProfile;
identity = arguments!.identity; identity = arguments!.identity;
actionType.value = arguments!.actionType; actionType.value = arguments!.actionType;
_checkDefaultIdentityIsSupported(); _checkDefaultIdentityIsSupported();
@@ -214,8 +211,8 @@ class IdentityCreatorController extends BaseController {
void _setDefaultEmailAddressList() { void _setDefaultEmailAddressList() {
listEmailAddressOfReplyTo.add(noneEmailAddress); listEmailAddressOfReplyTo.add(noneEmailAddress);
if (userProfile != null && userProfile?.email.isNotEmpty == true) { if (session?.username.value.isNotEmpty == true) {
final userEmailAddress = EmailAddress(null, userProfile!.email); final userEmailAddress = EmailAddress(null, session?.username.value);
listEmailAddressDefault.add(userEmailAddress); listEmailAddressDefault.add(userEmailAddress);
listEmailAddressOfReplyTo.addAll(listEmailAddressDefault); listEmailAddressOfReplyTo.addAll(listEmailAddressDefault);
} }
@@ -3,20 +3,17 @@ import 'package:equatable/equatable.dart';
import 'package:jmap_dart_client/jmap/account_id.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/session/session.dart';
import 'package:jmap_dart_client/jmap/identities/identity.dart'; import 'package:jmap_dart_client/jmap/identities/identity.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/model/identity_action_type.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/identity_action_type.dart';
class IdentityCreatorArguments with EquatableMixin { class IdentityCreatorArguments with EquatableMixin {
final AccountId accountId; final AccountId accountId;
final Session session; final Session session;
final UserProfile userProfile;
final IdentityActionType actionType; final IdentityActionType actionType;
final Identity? identity; final Identity? identity;
IdentityCreatorArguments( IdentityCreatorArguments(
this.accountId, this.accountId,
this.session, this.session,
this.userProfile,
{ {
this.identity, this.identity,
this.actionType = IdentityActionType.create this.actionType = IdentityActionType.create
@@ -27,7 +24,6 @@ class IdentityCreatorArguments with EquatableMixin {
List<Object?> get props => [ List<Object?> get props => [
accountId, accountId,
session, session,
userProfile, identity,
identity,
actionType]; actionType];
} }
@@ -1,7 +1,6 @@
import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart';
import 'package:model/account/password.dart'; import 'package:model/account/password.dart';
import 'package:model/user/user_profile.dart';
abstract class AuthenticationDataSource { abstract class AuthenticationDataSource {
Future<UserProfile> authenticationUser(Uri baseUrl, UserName userName, Password password); Future<UserName> authenticationUser(Uri baseUrl, UserName userName, Password password);
} }
@@ -1,16 +1,18 @@
import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart';
import 'package:model/account/password.dart'; import 'package:model/account/password.dart';
import 'package:model/user/user_profile.dart';
import 'package:tmail_ui_user/features/login/data/datasource/authentication_datasource.dart'; import 'package:tmail_ui_user/features/login/data/datasource/authentication_datasource.dart';
import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';
class AuthenticationDataSourceImpl extends AuthenticationDataSource { class AuthenticationDataSourceImpl extends AuthenticationDataSource {
AuthenticationDataSourceImpl(); final ExceptionThrower _exceptionThrower;
AuthenticationDataSourceImpl(this._exceptionThrower);
@override @override
Future<UserProfile> authenticationUser(Uri baseUrl, UserName userName, Password password) { Future<UserName> authenticationUser(Uri baseUrl, UserName userName, Password password) async {
return Future.sync(() { return Future.sync(() async {
return UserProfile(userName.value); return userName;
}); }).catchError(_exceptionThrower.throwException);
} }
} }
@@ -1,6 +1,5 @@
import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart';
import 'package:model/account/password.dart'; import 'package:model/account/password.dart';
import 'package:model/user/user_profile.dart';
import 'package:tmail_ui_user/features/login/data/datasource/authentication_datasource.dart'; import 'package:tmail_ui_user/features/login/data/datasource/authentication_datasource.dart';
import 'package:tmail_ui_user/features/login/domain/repository/authentication_repository.dart'; import 'package:tmail_ui_user/features/login/domain/repository/authentication_repository.dart';
@@ -10,7 +9,7 @@ class AuthenticationRepositoryImpl extends AuthenticationRepository {
AuthenticationRepositoryImpl(this.loginDataSource); AuthenticationRepositoryImpl(this.loginDataSource);
@override @override
Future<UserProfile> authenticationUser(Uri baseUrl, UserName userName, Password password) { Future<UserName> authenticationUser(Uri baseUrl, UserName userName, Password password) {
return loginDataSource.authenticationUser(baseUrl, userName, password); return loginDataSource.authenticationUser(baseUrl, userName, password);
} }
} }
@@ -1,8 +1,7 @@
import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart';
import 'package:model/account/password.dart'; import 'package:model/account/password.dart';
import 'package:model/user/user_profile.dart';
abstract class AuthenticationRepository { abstract class AuthenticationRepository {
Future<UserProfile> authenticationUser(Uri baseUrl, UserName userName, Password password); Future<UserName> authenticationUser(Uri baseUrl, UserName userName, Password password);
} }
@@ -1,16 +1,16 @@
import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart'; import 'package:core/presentation/state/success.dart';
import 'package:model/user/user_profile.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart';
class AuthenticationUserLoading extends LoadingState {} class AuthenticationUserLoading extends LoadingState {}
class AuthenticationUserSuccess extends UIState { class AuthenticationUserSuccess extends UIState {
final UserProfile userProfile; final UserName userName;
AuthenticationUserSuccess(this.userProfile); AuthenticationUserSuccess(this.userName);
@override @override
List<Object> get props => [userProfile]; List<Object> get props => [userName];
} }
class AuthenticationUserFailure extends FeatureFailure { class AuthenticationUserFailure extends FeatureFailure {
@@ -29,24 +29,24 @@ class AuthenticationInteractor {
}) async* { }) async* {
try { try {
yield Right(AuthenticationUserLoading()); yield Right(AuthenticationUserLoading());
final user = await authenticationRepository.authenticationUser(baseUrl, userName, password); final username = await authenticationRepository.authenticationUser(baseUrl, userName, password);
await Future.wait([ await Future.wait([
credentialRepository.saveBaseUrl(baseUrl), credentialRepository.saveBaseUrl(baseUrl),
credentialRepository.storeAuthenticationInfo( credentialRepository.storeAuthenticationInfo(
AuthenticationInfoCache( AuthenticationInfoCache(
userName.value, username.value,
password.value password.value
) )
), ),
]); ]);
await _accountRepository.setCurrentAccount( await _accountRepository.setCurrentAccount(
PersonalAccount( PersonalAccount(
userName.value, username.value,
AuthenticationType.basic, AuthenticationType.basic,
isSelected: true isSelected: true
) )
); );
yield Right(AuthenticationUserSuccess(user)); yield Right(AuthenticationUserSuccess(username));
} catch (e) { } catch (e) {
yield Left(AuthenticationUserFailure(e)); yield Left(AuthenticationUserFailure(e));
} }
@@ -167,7 +167,7 @@ class MailboxView extends BaseMailboxView {
return const SizedBox.shrink(); return const SizedBox.shrink();
} }
return UserInformationWidget( return UserInformationWidget(
userProfile: controller.mailboxDashBoardController.userProfile.value, userName: controller.mailboxDashBoardController.sessionCurrent?.username,
subtitle: AppLocalizations.of(context).manage_account, subtitle: AppLocalizations.of(context).manage_account,
onSubtitleClick: controller.mailboxDashBoardController.goToSettings, onSubtitleClick: controller.mailboxDashBoardController.goToSettings,
border: const Border( border: const Border(
@@ -103,7 +103,7 @@ class MailboxView extends BaseMailboxView {
child: Column(children: [ child: Column(children: [
if (!controller.responsiveUtils.isDesktop(context)) if (!controller.responsiveUtils.isDesktop(context))
Obx(() => UserInformationWidget( Obx(() => UserInformationWidget(
userProfile: controller.mailboxDashBoardController.userProfile.value, userName: controller.mailboxDashBoardController.sessionCurrent?.username,
subtitle: AppLocalizations.of(context).manage_account, subtitle: AppLocalizations.of(context).manage_account,
onSubtitleClick: controller.mailboxDashBoardController.goToSettings, onSubtitleClick: controller.mailboxDashBoardController.goToSettings,
border: const Border( border: const Border(
@@ -4,14 +4,17 @@ import 'package:core/presentation/views/image/avatar_builder.dart';
import 'package:core/presentation/views/text/text_overflow_builder.dart'; import 'package:core/presentation/views/text/text_overflow_builder.dart';
import 'package:core/utils/platform_info.dart'; import 'package:core/utils/platform_info.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:model/user/user_profile.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/core/user_name.dart';
import 'package:model/extensions/username_extension.dart';
import 'package:tmail_ui_user/features/base/widget/material_text_button.dart'; import 'package:tmail_ui_user/features/base/widget/material_text_button.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
typedef OnSubtitleClick = void Function(); typedef OnSubtitleClick = void Function();
class UserInformationWidget extends StatelessWidget { class UserInformationWidget extends StatelessWidget {
final UserProfile? userProfile; final UserName? userName;
final String? subtitle; final String? subtitle;
final EdgeInsetsGeometry? titlePadding; final EdgeInsetsGeometry? titlePadding;
final OnSubtitleClick? onSubtitleClick; final OnSubtitleClick? onSubtitleClick;
@@ -20,7 +23,7 @@ class UserInformationWidget extends StatelessWidget {
const UserInformationWidget({ const UserInformationWidget({
Key? key, Key? key,
this.userProfile, this.userName,
this.subtitle, this.subtitle,
this.titlePadding, this.titlePadding,
this.onSubtitleClick, this.onSubtitleClick,
@@ -35,7 +38,7 @@ class UserInformationWidget extends StatelessWidget {
decoration: BoxDecoration(border: border), decoration: BoxDecoration(border: border),
child: Row(children: [ child: Row(children: [
(AvatarBuilder() (AvatarBuilder()
..text(userProfile != null ? userProfile!.getAvatarText() : '') ..text(userName?.firstCharacter ?? '')
..backgroundColor(Colors.white) ..backgroundColor(Colors.white)
..textColor(Colors.black) ..textColor(Colors.black)
..addBoxShadows([const BoxShadow( ..addBoxShadows([const BoxShadow(
@@ -48,7 +51,7 @@ class UserInformationWidget extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
TextOverflowBuilder( TextOverflowBuilder(
userProfile != null ? '${userProfile?.email}' : '', userName?.value ?? '',
style: const TextStyle( style: const TextStyle(
fontSize: 17, fontSize: 17,
color: AppColor.colorNameEmail, color: AppColor.colorNameEmail,
@@ -1,17 +0,0 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:model/user/user_profile.dart';
class GetUserProfileSuccess extends UIState {
final UserProfile userProfile;
GetUserProfileSuccess(this.userProfile);
@override
List<Object> get props => [];
}
class GetUserProfileFailure extends FeatureFailure {
GetUserProfileFailure(dynamic exception) : super(exception: exception);
}
@@ -199,7 +199,6 @@ class MailboxDashBoardController extends ReloadableController {
final selectedMailbox = Rxn<PresentationMailbox>(); final selectedMailbox = Rxn<PresentationMailbox>();
final selectedEmail = Rxn<PresentationEmail>(); final selectedEmail = Rxn<PresentationEmail>();
final accountId = Rxn<AccountId>(); final accountId = Rxn<AccountId>();
final userProfile = Rxn<UserProfile>();
final dashBoardAction = Rxn<UIAction>(); final dashBoardAction = Rxn<UIAction>();
final mailboxUIAction = Rxn<MailboxUIAction>(); final mailboxUIAction = Rxn<MailboxUIAction>();
final emailUIAction = Rxn<EmailUIAction>(); final emailUIAction = Rxn<EmailUIAction>();
@@ -514,7 +513,6 @@ class MailboxDashBoardController extends ReloadableController {
final currentAccountId = session.personalAccount.accountId; final currentAccountId = session.personalAccount.accountId;
sessionCurrent = session; sessionCurrent = session;
accountId.value = currentAccountId; accountId.value = currentAccountId;
userProfile.value = UserProfile(session.username.value);
injectAutoCompleteBindings(session, currentAccountId); injectAutoCompleteBindings(session, currentAccountId);
injectRuleFilterBindings(session, currentAccountId); injectRuleFilterBindings(session, currentAccountId);
@@ -1447,13 +1445,12 @@ class MailboxDashBoardController extends ReloadableController {
} }
void selectQuickSearchFilter(QuickSearchFilter filter) { void selectQuickSearchFilter(QuickSearchFilter filter) {
return searchController.selectQuickSearchFilter(filter, userProfile.value!); return searchController.selectQuickSearchFilter(filter);
} }
void selectQuickSearchFilterFrom(EmailAddress fromEmailFilter) { void selectQuickSearchFilterFrom(EmailAddress fromEmailFilter) {
return searchController.selectQuickSearchFilter( return searchController.selectQuickSearchFilter(
QuickSearchFilter.fromMe, QuickSearchFilter.fromMe,
userProfile.value!,
fromEmailFilter: fromEmailFilter fromEmailFilter: fromEmailFilter
); );
} }
@@ -1463,11 +1460,10 @@ class MailboxDashBoardController extends ReloadableController {
} }
Future<List<PresentationEmail>> quickSearchEmails(String query) async { Future<List<PresentationEmail>> quickSearchEmails(String query) async {
if (sessionCurrent != null && accountId.value != null && userProfile.value != null) { if (sessionCurrent != null && accountId.value != null) {
return searchController.quickSearchEmails( return searchController.quickSearchEmails(
session: sessionCurrent!, session: sessionCurrent!,
accountId: accountId.value!, accountId: accountId.value!,
userProfile: userProfile.value!,
query: query query: query
); );
} else { } else {
@@ -9,6 +9,7 @@ import 'package:jmap_dart_client/jmap/core/filter/filter.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
import 'package:jmap_dart_client/jmap/core/user_name.dart';
import 'package:jmap_dart_client/jmap/core/utc_date.dart'; import 'package:jmap_dart_client/jmap/core/utc_date.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_comparator.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_comparator.dart';
@@ -17,7 +18,6 @@ import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart';
import 'package:model/email/presentation_email.dart'; import 'package:model/email/presentation_email.dart';
import 'package:model/extensions/email_filter_condition_extension.dart'; import 'package:model/extensions/email_filter_condition_extension.dart';
import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:model/user/user_profile.dart';
import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart';
import 'package:tmail_ui_user/features/base/mixin/date_range_picker_mixin.dart'; import 'package:tmail_ui_user/features/base/mixin/date_range_picker_mixin.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart';
@@ -73,10 +73,9 @@ class SearchController extends BaseController with DateRangePickerMixin {
void selectQuickSearchFilter( void selectQuickSearchFilter(
QuickSearchFilter quickSearchFilter, QuickSearchFilter quickSearchFilter,
UserProfile userProfile,
{EmailAddress? fromEmailFilter} {EmailAddress? fromEmailFilter}
) { ) {
final isFilterSelected = quickSearchFilter.isSelected(searchEmailFilter.value, userProfile); final isFilterSelected = quickSearchFilter.isSelected(searchEmailFilter.value);
switch (quickSearchFilter) { switch (quickSearchFilter) {
case QuickSearchFilter.hasAttachment: case QuickSearchFilter.hasAttachment:
@@ -110,7 +109,6 @@ class SearchController extends BaseController with DateRangePickerMixin {
required Session session, required Session session,
required AccountId accountId, required AccountId accountId,
required String query, required String query,
required UserProfile userProfile,
}) async { }) async {
return await _quickSearchEmailInteractor.execute( return await _quickSearchEmailInteractor.execute(
session, session,
@@ -119,7 +117,7 @@ class SearchController extends BaseController with DateRangePickerMixin {
sort: <Comparator>{}..add( sort: <Comparator>{}..add(
EmailComparator(EmailComparatorProperty.receivedAt) EmailComparator(EmailComparatorProperty.receivedAt)
..setIsAscending(false)), ..setIsAscending(false)),
filter: _mappingToFilterOnSuggestionForm(userProfile: userProfile, query: query), filter: _mappingToFilterOnSuggestionForm(userName: session.username, query: query),
properties: ThreadConstants.propertiesQuickSearch properties: ThreadConstants.propertiesQuickSearch
).then((result) => result.fold( ).then((result) => result.fold(
(failure) => <PresentationEmail>[], (failure) => <PresentationEmail>[],
@@ -129,7 +127,7 @@ class SearchController extends BaseController with DateRangePickerMixin {
)); ));
} }
Filter? _mappingToFilterOnSuggestionForm({required String query, required UserProfile userProfile}) { Filter? _mappingToFilterOnSuggestionForm({required String query, required UserName userName}) {
log('SearchController::_mappingToFilterOnSuggestionForm():query: $query'); log('SearchController::_mappingToFilterOnSuggestionForm():query: $query');
final filterCondition = EmailFilterCondition( final filterCondition = EmailFilterCondition(
text: query.isNotEmpty == true ? query : null, text: query.isNotEmpty == true ? query : null,
@@ -143,7 +141,7 @@ class SearchController extends BaseController with DateRangePickerMixin {
? true ? true
: null, : null,
from: listFilterOnSuggestionForm.contains(QuickSearchFilter.fromMe) from: listFilterOnSuggestionForm.contains(QuickSearchFilter.fromMe)
? userProfile.email ? userName.value
: null : null
); );
@@ -152,7 +150,7 @@ class SearchController extends BaseController with DateRangePickerMixin {
: null; : null;
} }
void applyFilterSuggestionToSearchFilter(UserProfile? userProfile) { void applyFilterSuggestionToSearchFilter(UserName? userName) {
final receiveTime = listFilterOnSuggestionForm.contains(QuickSearchFilter.last7Days) final receiveTime = listFilterOnSuggestionForm.contains(QuickSearchFilter.last7Days)
? EmailReceiveTimeType.last7Days ? EmailReceiveTimeType.last7Days
: EmailReceiveTimeType.allTime; : EmailReceiveTimeType.allTime;
@@ -160,11 +158,11 @@ class SearchController extends BaseController with DateRangePickerMixin {
final hasAttachment = listFilterOnSuggestionForm.contains(QuickSearchFilter.hasAttachment) ? true : false; final hasAttachment = listFilterOnSuggestionForm.contains(QuickSearchFilter.hasAttachment) ? true : false;
var listFromAddress = searchEmailFilter.value.from; var listFromAddress = searchEmailFilter.value.from;
if (userProfile != null) { if (userName != null) {
if (listFilterOnSuggestionForm.contains(QuickSearchFilter.fromMe)) { if (listFilterOnSuggestionForm.contains(QuickSearchFilter.fromMe)) {
listFromAddress.add(userProfile.email); listFromAddress.add(userName.value);
} else { } else {
listFromAddress.remove(userProfile.email); listFromAddress.remove(userName.value);
} }
} }
@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_portal/flutter_portal.dart'; import 'package:flutter_portal/flutter_portal.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:model/extensions/username_extension.dart';
import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:tmail_ui_user/features/base/widget/popup_item_no_icon_widget.dart'; import 'package:tmail_ui_user/features/base/widget/popup_item_no_icon_widget.dart';
import 'package:tmail_ui_user/features/composer/presentation/composer_view_web.dart'; import 'package:tmail_ui_user/features/composer/presentation/composer_view_web.dart';
@@ -339,13 +340,13 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
: const SizedBox.shrink(), : const SizedBox.shrink(),
const SizedBox(width: 24), const SizedBox(width: 24),
Obx(() => (AvatarBuilder() Obx(() => (AvatarBuilder()
..text(controller.userProfile.value?.getAvatarText() ?? '') ..text(controller.sessionCurrent?.username.firstCharacter ?? '')
..backgroundColor(Colors.white) ..backgroundColor(Colors.white)
..textColor(Colors.black) ..textColor(Colors.black)
..context(context) ..context(context)
..addOnTapAvatarActionWithPositionClick((position) => ..addOnTapAvatarActionWithPositionClick((position) =>
controller.openPopupMenuAction(context, position, popupMenuUserSettingActionTile(context, controller.openPopupMenuAction(context, position, popupMenuUserSettingActionTile(context,
controller.userProfile.value, controller.sessionCurrent?.username,
onLogoutAction: () { onLogoutAction: () {
popBack(); popBack();
controller.logout(controller.sessionCurrent, controller.accountId.value); controller.logout(controller.sessionCurrent, controller.accountId.value);
@@ -598,7 +599,6 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
return Obx(() { return Obx(() {
final isFilterSelected = filter.isSelected( final isFilterSelected = filter.isSelected(
controller.searchController.searchEmailFilter.value, controller.searchController.searchEmailFilter.value,
controller.userProfile.value
); );
return Padding( return Padding(
@@ -776,7 +776,8 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
String _getQuickSearchFilterFromTitle(BuildContext context) { String _getQuickSearchFilterFromTitle(BuildContext context) {
final searchEmailFilterFromFiled = controller.searchController.searchEmailFilter.value.from; final searchEmailFilterFromFiled = controller.searchController.searchEmailFilter.value.from;
if (searchEmailFilterFromFiled.length == 1) { if (searchEmailFilterFromFiled.length == 1) {
if (searchEmailFilterFromFiled.first == controller.userProfile.value?.email) { if (searchEmailFilterFromFiled.first == controller.sessionCurrent?.username.value &&
controller.sessionCurrent?.username.value.isNotEmpty == true) {
return QuickSearchFilter.fromMe.getTitle(context); return QuickSearchFilter.fromMe.getTitle(context);
} else { } else {
return '${AppLocalizations.of(context).from_email_address_prefix} ${searchEmailFilterFromFiled.first}'; return '${AppLocalizations.of(context).from_email_address_prefix} ${searchEmailFilterFromFiled.first}';
@@ -1,8 +1,10 @@
import 'package:core/core.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/views/popup_menu/popup_menu_item_widget.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:model/model.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
mixin UserSettingPopupMenuMixin { mixin UserSettingPopupMenuMixin {
@@ -10,18 +12,33 @@ mixin UserSettingPopupMenuMixin {
List<PopupMenuEntry> popupMenuUserSettingActionTile( List<PopupMenuEntry> popupMenuUserSettingActionTile(
BuildContext context, BuildContext context,
UserProfile? userProfile, UserName? userName,
{ {
Function? onLogoutAction, Function? onLogoutAction,
Function? onSettingAction Function? onSettingAction
} }
) { ) {
return [ return [
PopupMenuItem( if (userName != null)
enabled: false, PopupMenuItem(
padding: EdgeInsets.zero, enabled: false,
child: _userInformation(context, userProfile) padding: EdgeInsets.zero,
), child: SizedBox(
width: 300,
child: ListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 20),
title: Text(
userName.value,
maxLines: 1,
style: const TextStyle(
fontSize: 15,
color: AppColor.colorHintSearchBar,
fontWeight: FontWeight.normal
)
)
),
)
),
if (onSettingAction != null) if (onSettingAction != null)
...[ ...[
const PopupMenuDivider(height: 0.5), const PopupMenuDivider(height: 0.5),
@@ -42,21 +59,6 @@ mixin UserSettingPopupMenuMixin {
]; ];
} }
Widget _userInformation(BuildContext context, UserProfile? userProfile) {
if (userProfile != null) {
return SizedBox(
width: 300,
child: ListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 20),
title: Text(userProfile.email, maxLines: 1, style: const TextStyle(
fontSize: 15,
color: AppColor.colorHintSearchBar,
fontWeight: FontWeight.normal))),
);
}
return const SizedBox.shrink();
}
Widget _settingAction(BuildContext context, Function? onCallBack) { Widget _settingAction(BuildContext context, Function? onCallBack) {
return PopupMenuItemWidget( return PopupMenuItemWidget(
_imagePaths.icSetting, _imagePaths.icSetting,
@@ -2,7 +2,6 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/resources/image_paths.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:model/user/user_profile.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart';
@@ -89,7 +88,7 @@ enum QuickSearchFilter {
bool isApplied(List<QuickSearchFilter> listFilter) => listFilter.contains(this); bool isApplied(List<QuickSearchFilter> listFilter) => listFilter.contains(this);
bool isSelected(SearchEmailFilter filter, UserProfile? userProfile) { bool isSelected(SearchEmailFilter filter) {
switch (this) { switch (this) {
case QuickSearchFilter.hasAttachment: case QuickSearchFilter.hasAttachment:
return filter.hasAttachment == true; return filter.hasAttachment == true;
@@ -125,7 +125,7 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin {
} }
if (query.isNotEmpty || _searchController.listFilterOnSuggestionForm.isNotEmpty) { if (query.isNotEmpty || _searchController.listFilterOnSuggestionForm.isNotEmpty) {
_searchController.applyFilterSuggestionToSearchFilter(_dashBoardController.userProfile.value); _searchController.applyFilterSuggestionToSearchFilter(_dashBoardController.sessionCurrent?.username);
_dashBoardController.searchEmail(context, queryString: query); _dashBoardController.searchEmail(context, queryString: query);
} else { } else {
_dashBoardController.clearSearchEmail(); _dashBoardController.clearSearchEmail();
@@ -146,7 +146,7 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin {
_searchController.searchFocus.unfocus(); _searchController.searchFocus.unfocus();
_searchController.enableSearch(); _searchController.enableSearch();
_searchController.applyFilterSuggestionToSearchFilter(_dashBoardController.userProfile.value); _searchController.applyFilterSuggestionToSearchFilter(_dashBoardController.sessionCurrent?.username);
_dashBoardController.searchEmail(context, queryString: recent.value); _dashBoardController.searchEmail(context, queryString: recent.value);
} }
@@ -16,7 +16,6 @@ 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/action/ui_action.dart';
import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart'; import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart';
import 'package:tmail_ui_user/features/base/state/banner_state.dart'; import 'package:tmail_ui_user/features/base/state/banner_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_user_profile_state.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_vacation_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_vacation_state.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/update_vacation_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/update_vacation_state.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_vacation_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_vacation_interactor.dart';
@@ -46,7 +45,6 @@ class ManageAccountDashBoardController extends ReloadableController {
UpdateVacationInteractor? _updateVacationInteractor; UpdateVacationInteractor? _updateVacationInteractor;
final appInformation = Rxn<PackageInfo>(); final appInformation = Rxn<PackageInfo>();
final userProfile = Rxn<UserProfile>();
final accountId = Rxn<AccountId>(); final accountId = Rxn<AccountId>();
final accountMenuItemSelected = AccountMenuItem.profiles.obs; final accountMenuItemSelected = AccountMenuItem.profiles.obs;
final settingsPageLevel = SettingsPageLevel.universal.obs; final settingsPageLevel = SettingsPageLevel.universal.obs;
@@ -74,9 +72,7 @@ class ManageAccountDashBoardController extends ReloadableController {
@override @override
void handleSuccessViewState(Success success) { void handleSuccessViewState(Success success) {
if (success is GetUserProfileSuccess) { if (success is GetAllVacationSuccess) {
userProfile.value = success.userProfile;
} else if (success is GetAllVacationSuccess) {
if (success.listVacationResponse.isNotEmpty) { if (success.listVacationResponse.isNotEmpty) {
vacationResponse.value = success.listVacationResponse.first; vacationResponse.value = success.listVacationResponse.first;
} }
@@ -92,7 +88,6 @@ class ManageAccountDashBoardController extends ReloadableController {
log('ManageAccountDashBoardController::handleReloaded:'); log('ManageAccountDashBoardController::handleReloaded:');
sessionCurrent = session; sessionCurrent = session;
accountId.value = session.personalAccount.accountId; accountId.value = session.personalAccount.accountId;
_getUserProfile();
_bindingInteractorForMenuItemView(sessionCurrent, accountId.value); _bindingInteractorForMenuItemView(sessionCurrent, accountId.value);
_getVacationResponse(); _getVacationResponse();
_getParametersRouter(); _getParametersRouter();
@@ -104,7 +99,6 @@ class ManageAccountDashBoardController extends ReloadableController {
sessionCurrent = arguments.session; sessionCurrent = arguments.session;
accountId.value = arguments.session?.personalAccount.accountId; accountId.value = arguments.session?.personalAccount.accountId;
previousUri = arguments.previousUri; previousUri = arguments.previousUri;
_getUserProfile();
_bindingInteractorForMenuItemView(sessionCurrent, accountId.value); _bindingInteractorForMenuItemView(sessionCurrent, accountId.value);
_getVacationResponse(); _getVacationResponse();
if (arguments.menuSettingCurrent != null) { if (arguments.menuSettingCurrent != null) {
@@ -163,11 +157,6 @@ class ManageAccountDashBoardController extends ReloadableController {
appInformation.value = info; appInformation.value = info;
} }
void _getUserProfile() async {
log('ManageAccountDashBoardController::_getUserProfile(): $sessionCurrent');
userProfile.value = sessionCurrent != null ? UserProfile(sessionCurrent!.username.value) : null;
}
void _getVacationResponse() { void _getVacationResponse() {
if (accountId.value != null && _getAllVacationInteractor != null) { if (accountId.value != null && _getAllVacationInteractor != null) {
consumeState(_getAllVacationInteractor!.execute(accountId.value!)); consumeState(_getAllVacationInteractor!.execute(accountId.value!));
@@ -7,6 +7,7 @@ import 'package:core/presentation/views/text/slogan_builder.dart';
import 'package:core/utils/platform_info.dart'; import 'package:core/utils/platform_info.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/base/state/banner_state.dart'; import 'package:tmail_ui_user/features/base/state/banner_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mixin/user_setting_popup_menu_mixin.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mixin/user_setting_popup_menu_mixin.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/always_read_receipt/always_read_receipt_view.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/always_read_receipt/always_read_receipt_view.dart';
@@ -139,7 +140,7 @@ class ManageAccountDashBoardView extends GetWidget<ManageAccountDashBoardControl
const Spacer(), const Spacer(),
const SizedBox(width: 16), const SizedBox(width: 16),
Obx(() => (AvatarBuilder() Obx(() => (AvatarBuilder()
..text(controller.userProfile.value?.getAvatarText() ?? '') ..text(controller.sessionCurrent?.username.firstCharacter ?? '')
..backgroundColor(Colors.white) ..backgroundColor(Colors.white)
..textColor(Colors.black) ..textColor(Colors.black)
..context(context) ..context(context)
@@ -149,7 +150,7 @@ class ManageAccountDashBoardView extends GetWidget<ManageAccountDashBoardControl
position, position,
popupMenuUserSettingActionTile( popupMenuUserSettingActionTile(
context, context,
controller.userProfile.value, controller.sessionCurrent?.username,
onLogoutAction: () { onLogoutAction: () {
popBack(); popBack();
controller.logout(controller.sessionCurrent, controller.accountId.value); controller.logout(controller.sessionCurrent, controller.accountId.value);
@@ -19,7 +19,7 @@ class SettingsFirstLevelView extends GetWidget<SettingsController> {
controller: PlatformInfo.isMobile ? null : controller.settingScrollController, controller: PlatformInfo.isMobile ? null : controller.settingScrollController,
child: Column(children: [ child: Column(children: [
Obx(() => UserInformationWidget( Obx(() => UserInformationWidget(
userProfile: controller.manageAccountDashboardController.userProfile.value, userName: controller.manageAccountDashboardController.sessionCurrent?.username,
padding: SettingsUtils.getPaddingInFirstLevel(context, controller.responsiveUtils), padding: SettingsUtils.getPaddingInFirstLevel(context, controller.responsiveUtils),
titlePadding: const EdgeInsetsDirectional.only(start: 16))), titlePadding: const EdgeInsetsDirectional.only(start: 16))),
Divider( Divider(
@@ -142,10 +142,9 @@ class IdentitiesController extends BaseController {
void goToCreateNewIdentity(BuildContext context) async { void goToCreateNewIdentity(BuildContext context) async {
final accountId = _accountDashBoardController.accountId.value; final accountId = _accountDashBoardController.accountId.value;
final userProfile = _accountDashBoardController.userProfile.value;
final session = _accountDashBoardController.sessionCurrent; final session = _accountDashBoardController.sessionCurrent;
if (accountId != null && session != null && userProfile != null) { if (accountId != null && session != null) {
final arguments = IdentityCreatorArguments(accountId, session, userProfile); final arguments = IdentityCreatorArguments(accountId, session);
final newIdentityArguments = PlatformInfo.isWeb final newIdentityArguments = PlatformInfo.isWeb
? await DialogRouter.pushGeneralDialog(routeName: AppRoutes.identityCreator, arguments: arguments) ? await DialogRouter.pushGeneralDialog(routeName: AppRoutes.identityCreator, arguments: arguments)
@@ -249,13 +248,11 @@ class IdentitiesController extends BaseController {
void goToEditIdentity(BuildContext context, Identity identity) async { void goToEditIdentity(BuildContext context, Identity identity) async {
final accountId = _accountDashBoardController.accountId.value; final accountId = _accountDashBoardController.accountId.value;
final userProfile = _accountDashBoardController.userProfile.value;
final session = _accountDashBoardController.sessionCurrent; final session = _accountDashBoardController.sessionCurrent;
if (accountId != null && session != null && userProfile != null) { if (accountId != null && session != null) {
final arguments = IdentityCreatorArguments( final arguments = IdentityCreatorArguments(
accountId, accountId,
session, session,
userProfile,
identity: identity, identity: identity,
actionType: IdentityActionType.edit); actionType: IdentityActionType.edit);
@@ -24,7 +24,6 @@ import 'package:model/extensions/presentation_email_extension.dart';
import 'package:model/extensions/presentation_mailbox_extension.dart'; import 'package:model/extensions/presentation_mailbox_extension.dart';
import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:model/mailbox/select_mode.dart'; import 'package:model/mailbox/select_mode.dart';
import 'package:model/user/user_profile.dart';
import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart';
import 'package:tmail_ui_user/features/base/mixin/date_range_picker_mixin.dart'; import 'package:tmail_ui_user/features/base/mixin/date_range_picker_mixin.dart';
import 'package:tmail_ui_user/features/contact/presentation/model/contact_arguments.dart'; import 'package:tmail_ui_user/features/contact/presentation/model/contact_arguments.dart';
@@ -112,8 +111,6 @@ class SearchEmailController extends BaseController
Session? get session => mailboxDashBoardController.sessionCurrent; Session? get session => mailboxDashBoardController.sessionCurrent;
UserProfile? get userProfile => mailboxDashBoardController.userProfile.value;
SearchQuery? get searchQuery => simpleSearchFilter.value.text; SearchQuery? get searchQuery => simpleSearchFilter.value.text;
RxList<PresentationEmail> get listResultSearch => mailboxDashBoardController.listResultSearch; RxList<PresentationEmail> get listResultSearch => mailboxDashBoardController.listResultSearch;
@@ -71,7 +71,7 @@ class CredentialBindings extends InteractorsBindings {
Get.find<IOSSharingManager>(), Get.find<IOSSharingManager>(),
Get.find<CacheExceptionThrower>()) Get.find<CacheExceptionThrower>())
); );
Get.put(AuthenticationDataSourceImpl()); Get.put(AuthenticationDataSourceImpl(Get.find<RemoteExceptionThrower>()));
Get.put(AuthenticationOIDCDataSourceImpl( Get.put(AuthenticationOIDCDataSourceImpl(
Get.find<OIDCHttpClient>(), Get.find<OIDCHttpClient>(),
Get.find<AuthenticationClientBase>(), Get.find<AuthenticationClientBase>(),
@@ -3944,4 +3944,22 @@ class AppLocalizations {
name: 'loadingPleaseWait', name: 'loadingPleaseWait',
); );
} }
String get status {
return Intl.message(
'Status',
name: 'status');
}
String get progress {
return Intl.message(
'Progress',
name: 'progress');
}
String get sendingMessage {
return Intl.message(
'Sending message',
name: 'sendingMessage');
}
} }
@@ -1,7 +0,0 @@
import 'package:model/model.dart';
extension UserProfileExtension on UserProfile {
UserProfileResponse toUserProfileResponse() {
return UserProfileResponse(email);
}
}
@@ -0,0 +1,7 @@
import 'package:core/presentation/extensions/string_extension.dart';
import 'package:jmap_dart_client/jmap/core/user_name.dart';
extension UsernameExtension on UserName {
String get firstCharacter => value.firstLetterToUpperCase.toUpperCase();
}
+2 -5
View File
@@ -57,7 +57,7 @@ export 'extensions/presentation_email_extension.dart';
export 'extensions/presentation_mailbox_extension.dart'; export 'extensions/presentation_mailbox_extension.dart';
export 'extensions/properties_extension.dart'; export 'extensions/properties_extension.dart';
export 'extensions/session_extension.dart'; export 'extensions/session_extension.dart';
export 'extensions/user_profile_extension.dart'; export 'extensions/username_extension.dart';
export 'extensions/utc_date_extension.dart'; export 'extensions/utc_date_extension.dart';
// Identity // Identity
export 'identity/identity_request_dto.dart'; export 'identity/identity_request_dto.dart';
@@ -79,7 +79,4 @@ export 'oidc/token_id.dart';
export 'oidc/token_oidc.dart'; export 'oidc/token_oidc.dart';
// Upload // Upload
export 'upload/file_info.dart'; export 'upload/file_info.dart';
export 'upload/upload_response.dart'; export 'upload/upload_response.dart';
// User
export 'user/user_profile.dart';
export 'user/user_profile_response.dart';
-15
View File
@@ -1,15 +0,0 @@
import 'package:equatable/equatable.dart';
class AvatarId with EquatableMixin {
final String id;
AvatarId(this.id);
factory AvatarId.initial() {
return AvatarId('');
}
@override
List<Object?> get props => [id];
}
-15
View File
@@ -1,15 +0,0 @@
import 'package:equatable/equatable.dart';
class UserProfile with EquatableMixin {
final String email;
UserProfile(this.email);
String getAvatarText() {
return email[0].toUpperCase();
}
@override
List<Object> get props => [email];
}
-26
View File
@@ -1,26 +0,0 @@
import 'package:equatable/equatable.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:model/model.dart';
part 'user_profile_response.g.dart';
@JsonSerializable()
class UserProfileResponse with EquatableMixin {
final String email;
UserProfileResponse(this.email);
factory UserProfileResponse.fromJson(Map<String, dynamic> json) => _$UserProfileResponseFromJson(json);
Map<String, dynamic> toJson() => _$UserProfileResponseToJson(this);
@override
List<Object?> get props => [email];
}
extension UserProfileResponseExtension on UserProfileResponse {
UserProfile toUserProfile() {
return UserProfile(email);
}
}