From 0f051bddfc48274b141a342bf39b34dd6cfd3c65 Mon Sep 17 00:00:00 2001 From: dab246 Date: Mon, 1 Apr 2024 09:33:57 +0700 Subject: [PATCH] TF-2717 Get identity when open app, if not get identity, get whenever open composer --- .../presentation/composer_controller.dart | 20 +++++++++- .../composer_arguments_extension.dart | 24 +++++++++++ .../model/composer_arguments.dart | 4 ++ .../bindings/mailbox_dashboard_bindings.dart | 12 +++++- .../mailbox_dashboard_controller.dart | 40 ++++++++++++++++--- 5 files changed, 92 insertions(+), 8 deletions(-) create mode 100644 lib/features/email/presentation/extensions/composer_arguments_extension.dart diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index 263e4857a..dfe25299c 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -450,10 +450,13 @@ class ComposerController extends BaseController with DragDropFileMixin { subjectEmailInputFocusNode?.unfocus(); } - void onLoadCompletedMobileEditorAction(HtmlEditorApi editorApi, WebUri? url) { + void onLoadCompletedMobileEditorAction(HtmlEditorApi editorApi, WebUri? url) async { _isEmailBodyLoaded = true; if (identitySelected.value == null) { _getAllIdentities(); + } else { + await _selectIdentity(identitySelected.value); + _autoFocusFieldWhenLauncher(); } } @@ -465,6 +468,8 @@ class ComposerController extends BaseController with DragDropFileMixin { if (arguments is ComposerArguments) { composerArguments.value = arguments; + _initIdentities(arguments.identities); + injectAutoCompleteBindings( mailboxDashBoardController.sessionCurrent, mailboxDashBoardController.accountId.value @@ -592,7 +597,15 @@ class ComposerController extends BaseController with DragDropFileMixin { } } + void _initIdentities(List? identities) { + if (identities?.isNotEmpty == true) { + listFromIdentities.value = identities!; + identitySelected.value = identities.first; + } + } + void _getAllIdentities() { + log('ComposerController::_getAllIdentities: Fetch again identity !'); final accountId = mailboxDashBoardController.accountId.value; final session = mailboxDashBoardController.sessionCurrent; if (accountId != null && session != null) { @@ -1692,7 +1705,7 @@ class ComposerController extends BaseController with DragDropFileMixin { bccAddressFocusNode?.hasFocus == true || subjectEmailInputFocusNode?.hasFocus == true; - void handleInitHtmlEditorWeb(String initContent) { + void handleInitHtmlEditorWeb(String initContent) async { log('ComposerController::handleInitHtmlEditorWeb:'); _isEmailBodyLoaded = true; richTextWebController.editorController.setFullScreen(); @@ -1701,6 +1714,9 @@ class ComposerController extends BaseController with DragDropFileMixin { richTextWebController.setEnableCodeView(); if (identitySelected.value == null) { _getAllIdentities(); + } else { + await _selectIdentity(identitySelected.value); + _autoFocusFieldWhenLauncher(); } } diff --git a/lib/features/email/presentation/extensions/composer_arguments_extension.dart b/lib/features/email/presentation/extensions/composer_arguments_extension.dart new file mode 100644 index 000000000..625576a76 --- /dev/null +++ b/lib/features/email/presentation/extensions/composer_arguments_extension.dart @@ -0,0 +1,24 @@ +import 'package:jmap_dart_client/jmap/identities/identity.dart'; +import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; + +extension ComposerArgumentsExtension on ComposerArguments { + + ComposerArguments withIdentity({List? identities}) { + return ComposerArguments( + emailActionType: emailActionType, + presentationEmail: presentationEmail, + emailContents: emailContents, + attachments: attachments, + mailboxRole: mailboxRole, + listEmailAddress: listEmailAddress, + listSharedMediaFile: listSharedMediaFile, + sendingEmail: sendingEmail, + subject: subject, + body: body, + messageId: messageId, + references: references, + previousEmailId: previousEmailId, + identities: identities, + ); + } +} \ No newline at end of file diff --git a/lib/features/email/presentation/model/composer_arguments.dart b/lib/features/email/presentation/model/composer_arguments.dart index 527ad67af..0b6291fd1 100644 --- a/lib/features/email/presentation/model/composer_arguments.dart +++ b/lib/features/email/presentation/model/composer_arguments.dart @@ -1,3 +1,4 @@ +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_address.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; @@ -22,6 +23,7 @@ class ComposerArguments extends RouterArguments { final MessageIdsHeaderValue? messageId; final MessageIdsHeaderValue? references; final EmailId? previousEmailId; + final List? identities; ComposerArguments({ this.emailActionType = EmailActionType.compose, @@ -37,6 +39,7 @@ class ComposerArguments extends RouterArguments { this.messageId, this.references, this.previousEmailId, + this.identities, }); factory ComposerArguments.fromSendingEmail(SendingEmail sendingEmail) => @@ -170,5 +173,6 @@ class ComposerArguments extends RouterArguments { body, messageId, references, + identities, ]; } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart b/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart index d4df25acd..375143f3e 100644 --- a/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart +++ b/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart @@ -78,6 +78,10 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/repository/identity_repository.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/identity_interactors_bindings.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/utils/identity_utils.dart'; import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_manager.dart'; import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_worker_queue.dart'; import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_manager.dart'; @@ -172,6 +176,7 @@ class MailboxDashBoardBindings extends BaseBindings { Get.find(), Get.find(), Get.find(), + Get.find(), )); Get.put(AdvancedFilterController()); } @@ -277,7 +282,6 @@ class MailboxDashBoardBindings extends BaseBindings { ); Get.lazyPut(() => GetComposerCacheOnWebInteractor(Get.find())); Get.lazyPut(() => RemoveComposerCacheOnWebInteractor(Get.find())); - Get.lazyPut(() => RemoveComposerCacheOnWebInteractor(Get.find())); Get.lazyPut(() => MarkAsEmailReadInteractor( Get.find(), Get.find() @@ -333,6 +337,12 @@ class MailboxDashBoardBindings extends BaseBindings { Get.find(), Get.find() )); + + IdentityInteractorsBindings().dependencies(); + Get.lazyPut(() => GetAllIdentitiesInteractor( + Get.find(), + Get.find() + )); } @override diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index b6ca0d644..99ae8dab8 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -18,6 +18,7 @@ import 'package:jmap_dart_client/jmap/core/id.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; import 'package:jmap_dart_client/jmap/core/unsigned_int.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_address.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; @@ -38,6 +39,7 @@ import 'package:tmail_ui_user/features/composer/domain/usecases/get_autocomplete import 'package:tmail_ui_user/features/composer/domain/usecases/send_email_interactor.dart'; import 'package:tmail_ui_user/features/composer/presentation/composer_bindings.dart'; import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart'; +import 'package:tmail_ui_user/features/composer/presentation/extensions/list_identities_extension.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/compose_action_mode.dart'; import 'package:tmail_ui_user/features/contact/presentation/model/contact_arguments.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart'; @@ -63,6 +65,7 @@ import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_int import 'package:tmail_ui_user/features/email/domain/usecases/restore_deleted_message_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/unsubscribe_email_interactor.dart'; import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart'; +import 'package:tmail_ui_user/features/email/presentation/extensions/composer_arguments_extension.dart'; import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart'; import 'package:tmail_ui_user/features/email_recovery/presentation/model/email_recovery_arguments.dart'; @@ -96,8 +99,10 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/sear 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/quick_search_filter.dart'; import 'package:tmail_ui_user/features/mailto/presentation/model/mailto_arguments.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_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/usecases/get_all_identities_interactor.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/update_vacation_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/datetime_extension.dart'; @@ -182,6 +187,7 @@ class MailboxDashBoardController extends ReloadableController { final RestoredDeletedMessageInteractor _restoreDeletedMessageInteractor; final GetRestoredDeletedMessageInterator _getRestoredDeletedMessageInteractor; final RemoveComposerCacheOnWebInteractor _removeComposerCacheOnWebInteractor; + final GetAllIdentitiesInteractor _getAllIdentitiesInteractor; GetAllVacationInteractor? _getAllVacationInteractor; UpdateVacationInteractor? _updateVacationInteractor; @@ -221,6 +227,7 @@ class MailboxDashBoardController extends ReloadableController { final listResultSearch = RxList(); PresentationMailbox? outboxMailbox; ComposerArguments? composerArguments; + List? _identities; late StreamSubscription _emailAddressStreamSubscription; late StreamSubscription _emailContentStreamSubscription; @@ -260,6 +267,7 @@ class MailboxDashBoardController extends ReloadableController { this._restoreDeletedMessageInteractor, this._getRestoredDeletedMessageInteractor, this._removeComposerCacheOnWebInteractor, + this._getAllIdentitiesInteractor, ); @override @@ -285,8 +293,8 @@ class MailboxDashBoardController extends ReloadableController { _getEmailCacheOnWebInteractor.execute().fold( (failure) {}, (success) { - if(success is GetComposerCacheSuccess){ - openComposerOverlay(ComposerArguments.fromSessionStorageBrowser(success.composerCache)); + if (success is GetComposerCacheSuccess) { + goToComposer(ComposerArguments.fromSessionStorageBrowser(success.composerCache)); } }, ); @@ -362,6 +370,8 @@ class MailboxDashBoardController extends ReloadableController { _handleRestoreDeletedMessageSuccess(success.emailRecoveryAction.id!); } else if (success is GetRestoredDeletedMessageSuccess) { _handleGetRestoredDeletedMessageSuccess(success); + } else if (success is GetAllIdentitiesSuccess) { + _handleGetAllIdentitiesSuccess(success); } } @@ -520,6 +530,7 @@ class MailboxDashBoardController extends ReloadableController { _getVacationResponse(); spamReportController.getSpamReportStateAction(); + _getAllIdentities(); if (PlatformInfo.isMobile) { getAllSendingEmails(); @@ -1391,14 +1402,16 @@ class MailboxDashBoardController extends ReloadableController { } void goToComposer(ComposerArguments arguments) async { + final argumentsWithIdentity = arguments.withIdentity(identities: _identities); + if (PlatformInfo.isWeb) { if (composerOverlayState.value == ComposerOverlayState.inActive) { - openComposerOverlay(arguments); + openComposerOverlay(argumentsWithIdentity); } } else { BackButtonInterceptor.removeByName(AppRoutes.dashboard); - final result = await push(AppRoutes.composer, arguments: arguments); + final result = await push(AppRoutes.composer, arguments: argumentsWithIdentity); BackButtonInterceptor.add(_onBackButtonInterceptor, name: AppRoutes.dashboard); @@ -2483,12 +2496,29 @@ class MailboxDashBoardController extends ReloadableController { await _removeComposerCacheOnWebInteractor.execute(); } - bool validateSendingEmailFailedWhenNetworkIsLostOnMobile(FeatureFailure failure) { + bool validateSendingEmailFailedWhenNetworkIsLostOnMobile(dynamic failure) { return failure is SendEmailFailure && failure.exception is NoNetworkError && PlatformInfo.isMobile; } + void _getAllIdentities() { + if (accountId.value != null && sessionCurrent != null) { + consumeState(_getAllIdentitiesInteractor.execute( + sessionCurrent!, + accountId.value! + )); + } + } + + void _handleGetAllIdentitiesSuccess(GetAllIdentitiesSuccess success) async { + final listIdentitiesMayDeleted = success.identities?.toListMayDeleted() ?? []; + if (listIdentitiesMayDeleted.isNotEmpty) { + _identities = listIdentitiesMayDeleted; + } + log('MailboxDashBoardController::_handleGetAllIdentitiesSuccess: IDENTITIES_SIZE = ${_identities?.length}'); + } + @override void onClose() { _emailReceiveManager.closeEmailReceiveManagerStream();