From c87d3229ce0dad88cb96e22a5978ccc3bb35294f Mon Sep 17 00:00:00 2001 From: dab246 Date: Mon, 8 Dec 2025 15:42:07 +0700 Subject: [PATCH] TF-4186 Implement remember choose organisation server --- lib/features/base/base_controller.dart | 12 +++- ...e_company_server_login_info_extension.dart | 48 +++++++++++++ .../reloadable/reloadable_controller.dart | 15 ++-- .../get_company_server_login_info_state.dart | 19 +++-- ...emove_company_server_login_info_state.dart | 11 +++ ..._company_server_login_info_interactor.dart | 12 +++- ..._company_server_login_info_interactor.dart | 23 ++++++ .../login/presentation/base_login_view.dart | 3 +- ...pany_server_login_interactor_bindings.dart | 72 +++++++++++++++++++ ...e_company_server_login_info_extension.dart | 62 ++++++++++++++++ .../login/presentation/login_controller.dart | 31 +++++++- .../login/presentation/login_view.dart | 3 +- .../presentation/model/login_arguments.dart | 7 +- .../twake_welcome_controller.dart | 42 ++++++----- lib/main/bindings/main_bindings.dart | 2 + 15 files changed, 317 insertions(+), 45 deletions(-) create mode 100644 lib/features/base/extensions/handle_company_server_login_info_extension.dart create mode 100644 lib/features/login/domain/state/remove_company_server_login_info_state.dart create mode 100644 lib/features/login/domain/usecases/remove_company_server_login_info_interactor.dart create mode 100644 lib/features/login/presentation/bindings/company_server_login_interactor_bindings.dart create mode 100644 lib/features/login/presentation/extensions/handle_company_server_login_info_extension.dart diff --git a/lib/features/base/base_controller.dart b/lib/features/base/base_controller.dart index 839be6126..95504bade 100644 --- a/lib/features/base/base_controller.dart +++ b/lib/features/base/base_controller.dart @@ -17,6 +17,7 @@ import 'package:model/model.dart'; import 'package:rule_filter/rule_filter/capability_rule_filter.dart'; import 'package:tmail_ui_user/features/base/before_reconnect_manager.dart'; import 'package:tmail_ui_user/features/base/mixin/emit_state_mixin.dart'; +import 'package:tmail_ui_user/features/base/extensions/handle_company_server_login_info_extension.dart'; import 'package:tmail_ui_user/features/base/mixin/logout_mixin.dart'; import 'package:tmail_ui_user/features/base/mixin/popup_context_menu_action_mixin.dart'; import 'package:tmail_ui_user/features/caching/caching_manager.dart'; @@ -25,8 +26,10 @@ import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions import 'package:tmail_ui_user/features/login/data/network/config/oidc_constant.dart'; import 'package:tmail_ui_user/features/login/data/network/interceptors/authorization_interceptors.dart'; import 'package:tmail_ui_user/features/login/domain/exceptions/logout_exception.dart'; +import 'package:tmail_ui_user/features/login/domain/state/get_company_server_login_info_state.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/delete_authority_oidc_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/get_company_server_login_info_interactor.dart'; import 'package:tmail_ui_user/features/login/presentation/login_form_type.dart'; import 'package:tmail_ui_user/features/login/presentation/model/login_arguments.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/contact_autocomplete_bindings.dart'; @@ -86,6 +89,7 @@ abstract class BaseController extends GetxController GetStoredFirebaseRegistrationInteractor? _getStoredFirebaseRegistrationInteractor; DestroyFirebaseRegistrationInteractor? _destroyFirebaseRegistrationInteractor; + GetCompanyServerLoginInfoInteractor? getCompanyServerLoginInfoInteractor; StreamSubscription? _onBeforeUnloadBrowserSubscription; StreamSubscription? _onUnloadBrowserSubscription; @@ -264,6 +268,8 @@ abstract class BaseController extends GetxController } else if (failure is GetStoredFirebaseRegistrationFailure || failure is DestroyFirebaseRegistrationFailure) { await clearDataAndGoToLoginPage(); + } else if (failure is GetCompanyServerLoginInfoFailure) { + handleGetCompanyServerLoginInfoFailure(); } } @@ -279,6 +285,8 @@ abstract class BaseController extends GetxController _destroyFirebaseRegistration(success.firebaseRegistration.id!); } else if (success is DestroyFirebaseRegistrationSuccess) { await clearDataAndGoToLoginPage(); + } else if (success is GetCompanyServerLoginInfoSuccess) { + handleGetCompanyServerLoginInfoSuccess(success.serverLoginInfo); } } @@ -391,7 +399,7 @@ abstract class BaseController extends GetxController void goToLogin() { if (PlatformInfo.isMobile) { - navigateToTwakeWelcomePage(); + getCompanyServerLoginInfo(popAllRoute: false); } else { navigateToLoginPage(); } @@ -399,7 +407,7 @@ abstract class BaseController extends GetxController void removeAllPageAndGoToLogin() { if (PlatformInfo.isMobile) { - pushAndPopAll(AppRoutes.twakeWelcome); + getCompanyServerLoginInfo(popAllRoute: true); } else { navigateToLoginPage(); } diff --git a/lib/features/base/extensions/handle_company_server_login_info_extension.dart b/lib/features/base/extensions/handle_company_server_login_info_extension.dart new file mode 100644 index 000000000..7f2e5a051 --- /dev/null +++ b/lib/features/base/extensions/handle_company_server_login_info_extension.dart @@ -0,0 +1,48 @@ +import 'package:core/utils/app_logger.dart'; +import 'package:tmail_ui_user/features/base/base_controller.dart'; +import 'package:tmail_ui_user/features/login/domain/model/company_server_login_info.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/get_company_server_login_info_interactor.dart'; +import 'package:tmail_ui_user/features/login/presentation/login_form_type.dart'; +import 'package:tmail_ui_user/features/login/presentation/model/login_arguments.dart'; +import 'package:tmail_ui_user/main/routes/app_routes.dart'; +import 'package:tmail_ui_user/main/routes/route_navigation.dart'; + +extension HandleCompanyServerLoginInfoExtension on BaseController { + void getCompanyServerLoginInfo({bool popAllRoute = true}) { + final getLoginInfoInteractor = + getBinding(); + + if (getLoginInfoInteractor == null) { + handleGetCompanyServerLoginInfoFailure(popAllRoute: popAllRoute); + return; + } + + consumeState( + getLoginInfoInteractor.execute(popAllRoute: popAllRoute), + ); + } + + void handleGetCompanyServerLoginInfoSuccess( + CompanyServerLoginInfo info, { + bool popAllRoute = true, + }) { + log('$runtimeType::handleGetCompanyServerLoginInfoSuccess: Info = $info, popAllRoute = $popAllRoute'); + final arguments = LoginArguments( + LoginFormType.dnsLookupForm, + loginInfo: info, + ); + if (popAllRoute) { + pushAndPopAll(AppRoutes.login, arguments: arguments); + } else { + popAndPush(AppRoutes.login, arguments: arguments); + } + } + + void handleGetCompanyServerLoginInfoFailure({bool popAllRoute = true}) { + if (popAllRoute) { + pushAndPopAll(AppRoutes.twakeWelcome); + } else { + popAndPush(AppRoutes.twakeWelcome); + } + } +} diff --git a/lib/features/base/reloadable/reloadable_controller.dart b/lib/features/base/reloadable/reloadable_controller.dart index a4d7fa3f1..761317364 100644 --- a/lib/features/base/reloadable/reloadable_controller.dart +++ b/lib/features/base/reloadable/reloadable_controller.dart @@ -178,19 +178,12 @@ abstract class ReloadableController extends BaseController { required TokenOIDC tokenOIDC, required OIDCConfiguration oidcConfiguration, }) { - final baseUrl = baseUri.toString(); - dynamicUrlInterceptors.setJmapUrl(baseUrl); - dynamicUrlInterceptors.changeBaseUrl(baseUrl); - authorizationInterceptors.setTokenAndAuthorityOidc( - newToken: tokenOIDC, - newConfig: oidcConfiguration, - ); - authorizationIsolateInterceptors.setTokenAndAuthorityOidc( - newToken: tokenOIDC, - newConfig: oidcConfiguration, + setDataToInterceptors( + baseUrl: baseUri.toString(), + tokenOIDC: tokenOIDC, + oidcConfiguration: oidcConfiguration, ); - getOidcUserInfo(oidcConfiguration); getSessionAction(); } } \ No newline at end of file diff --git a/lib/features/login/domain/state/get_company_server_login_info_state.dart b/lib/features/login/domain/state/get_company_server_login_info_state.dart index 2a699b068..505b4523f 100644 --- a/lib/features/login/domain/state/get_company_server_login_info_state.dart +++ b/lib/features/login/domain/state/get_company_server_login_info_state.dart @@ -6,14 +6,25 @@ class GettingCompanyServerLoginInfo extends LoadingState {} class GetCompanyServerLoginInfoSuccess extends UIState { final CompanyServerLoginInfo serverLoginInfo; + final bool popAllRoute; - GetCompanyServerLoginInfoSuccess(this.serverLoginInfo); + GetCompanyServerLoginInfoSuccess( + this.serverLoginInfo, { + this.popAllRoute = true, + }); @override - List get props => [serverLoginInfo]; + List get props => [serverLoginInfo, popAllRoute]; } class GetCompanyServerLoginInfoFailure extends FeatureFailure { - GetCompanyServerLoginInfoFailure(dynamic exception) - : super(exception: exception); + final bool popAllRoute; + + GetCompanyServerLoginInfoFailure( + dynamic exception, { + this.popAllRoute = true, + }) : super(exception: exception); + + @override + List get props => [exception, popAllRoute]; } diff --git a/lib/features/login/domain/state/remove_company_server_login_info_state.dart b/lib/features/login/domain/state/remove_company_server_login_info_state.dart new file mode 100644 index 000000000..5a4b2d46e --- /dev/null +++ b/lib/features/login/domain/state/remove_company_server_login_info_state.dart @@ -0,0 +1,11 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; + +class RemovingCompanyServerLoginInfo extends LoadingState {} + +class RemoveCompanyServerLoginInfoSuccess extends UIState {} + +class RemoveCompanyServerLoginInfoFailure extends FeatureFailure { + RemoveCompanyServerLoginInfoFailure(dynamic exception) + : super(exception: exception); +} diff --git a/lib/features/login/domain/usecases/get_company_server_login_info_interactor.dart b/lib/features/login/domain/usecases/get_company_server_login_info_interactor.dart index fafbd8b3b..5326a1cb3 100644 --- a/lib/features/login/domain/usecases/get_company_server_login_info_interactor.dart +++ b/lib/features/login/domain/usecases/get_company_server_login_info_interactor.dart @@ -11,14 +11,20 @@ class GetCompanyServerLoginInfoInteractor { GetCompanyServerLoginInfoInteractor(this._serverLoginRepository); - Stream> execute() async* { + Stream> execute({bool popAllRoute = true}) async* { try { yield Right(GettingCompanyServerLoginInfo()); final serverLoginInfo = await _serverLoginRepository.getCompanyServerLoginInfo(); - yield Right(GetCompanyServerLoginInfoSuccess(serverLoginInfo)); + yield Right(GetCompanyServerLoginInfoSuccess( + serverLoginInfo, + popAllRoute: popAllRoute, + )); } catch (exception) { - yield Left(GetCompanyServerLoginInfoFailure(exception)); + yield Left(GetCompanyServerLoginInfoFailure( + exception, + popAllRoute: popAllRoute, + )); } } } diff --git a/lib/features/login/domain/usecases/remove_company_server_login_info_interactor.dart b/lib/features/login/domain/usecases/remove_company_server_login_info_interactor.dart new file mode 100644 index 000000000..c9413184c --- /dev/null +++ b/lib/features/login/domain/usecases/remove_company_server_login_info_interactor.dart @@ -0,0 +1,23 @@ +import 'dart:core'; + +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:dartz/dartz.dart'; +import 'package:tmail_ui_user/features/login/domain/repository/company_server_login_repository.dart'; +import 'package:tmail_ui_user/features/login/domain/state/remove_company_server_login_info_state.dart'; + +class RemoveCompanyServerLoginInfoInteractor { + final CompanyServerLoginRepository _serverLoginRepository; + + RemoveCompanyServerLoginInfoInteractor(this._serverLoginRepository); + + Stream> execute() async* { + try { + yield Right(RemovingCompanyServerLoginInfo()); + await _serverLoginRepository.removeCompanyServerLoginInfo(); + yield Right(RemoveCompanyServerLoginInfoSuccess()); + } catch (exception) { + yield Left(RemoveCompanyServerLoginInfoFailure(exception)); + } + } +} diff --git a/lib/features/login/presentation/base_login_view.dart b/lib/features/login/presentation/base_login_view.dart index 9b77203aa..cf321c6a6 100644 --- a/lib/features/login/presentation/base_login_view.dart +++ b/lib/features/login/presentation/base_login_view.dart @@ -75,7 +75,8 @@ abstract class BaseLoginView extends GetWidget { ..setHintText(AppLocalizations.of(context).email)) .build(), debounceDuration: const Duration(milliseconds: 300), - suggestionsCallback: controller.getAllRecentLoginUsernameAction, + suggestionsCallback: (query) => + controller.getAllRecentLoginUsernameAction(pattern: query), itemBuilder: (_, loginUsername) => RecentItemTileWidget(loginUsername), onSuggestionSelected: controller.selectUsernameFromSuggestion, noItemsFoundBuilder: (context) => const SizedBox(), diff --git a/lib/features/login/presentation/bindings/company_server_login_interactor_bindings.dart b/lib/features/login/presentation/bindings/company_server_login_interactor_bindings.dart new file mode 100644 index 000000000..a1e1257bf --- /dev/null +++ b/lib/features/login/presentation/bindings/company_server_login_interactor_bindings.dart @@ -0,0 +1,72 @@ +import 'package:get/get.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:tmail_ui_user/features/base/interactors_bindings.dart'; +import 'package:tmail_ui_user/features/login/data/datasource/company_server_login_datasource.dart'; +import 'package:tmail_ui_user/features/login/data/datasource_impl/company_server_login_datasource_impl.dart'; +import 'package:tmail_ui_user/features/login/data/local/company_server_login_cache_manager.dart'; +import 'package:tmail_ui_user/features/login/data/repository/company_server_login_repository_impl.dart'; +import 'package:tmail_ui_user/features/login/domain/repository/company_server_login_repository.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/get_company_server_login_info_interactor.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/remove_company_server_login_info_interactor.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/save_company_server_login_info_interactor.dart'; +import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; + +class CompanyServerLoginInteractorBindings extends InteractorsBindings { + @override + void dependencies() { + Get.put(CompanyServerLoginCacheManager(Get.find())); + super.dependencies(); + } + + @override + void bindingsDataSource() { + Get.put( + Get.find(), + ); + } + + @override + void bindingsDataSourceImpl() { + Get.put( + CompanyServerLoginDatasourceImpl( + Get.find(), + Get.find(), + ), + ); + } + + @override + void bindingsInteractor() { + Get.put( + SaveCompanyServerLoginInfoInteractor( + Get.find(), + ), + ); + Get.put( + GetCompanyServerLoginInfoInteractor( + Get.find(), + ), + ); + Get.put( + RemoveCompanyServerLoginInfoInteractor( + Get.find(), + ), + ); + } + + @override + void bindingsRepository() { + Get.put( + Get.find(), + ); + } + + @override + void bindingsRepositoryImpl() { + Get.put( + CompanyServerLoginRepositoryImpl( + Get.find(), + ), + ); + } +} diff --git a/lib/features/login/presentation/extensions/handle_company_server_login_info_extension.dart b/lib/features/login/presentation/extensions/handle_company_server_login_info_extension.dart new file mode 100644 index 000000000..b5a3de048 --- /dev/null +++ b/lib/features/login/presentation/extensions/handle_company_server_login_info_extension.dart @@ -0,0 +1,62 @@ +import 'package:core/utils/app_logger.dart'; +import 'package:core/utils/platform_info.dart'; +import 'package:tmail_ui_user/features/login/domain/model/company_server_login_info.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/remove_company_server_login_info_interactor.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/save_company_server_login_info_interactor.dart'; +import 'package:tmail_ui_user/features/login/presentation/login_controller.dart'; +import 'package:tmail_ui_user/features/login/presentation/login_form_type.dart'; +import 'package:tmail_ui_user/features/login/presentation/model/login_arguments.dart'; +import 'package:tmail_ui_user/main/routes/route_navigation.dart'; + +extension HandleCompanyServerLoginInfoExtension on LoginController { + bool get isDnsLookupFormOnMobile => + PlatformInfo.isMobile && + loginFormType.value == LoginFormType.dnsLookupForm; + + bool hasPreviousCompanyServerLogin(LoginArguments arguments) { + return PlatformInfo.isMobile && + arguments.loginFormType == LoginFormType.dnsLookupForm && + arguments.loginInfo != null; + } + + bool isCompanyServerLoginFlow(LoginArguments arguments) { + return PlatformInfo.isMobile && + arguments.loginFormType == LoginFormType.dnsLookupForm; + } + + void saveCompanyServerLoginInfo(String username) { + log('$runtimeType::saveCompanyServerLoginInfo: Username = $username'); + saveLoginInfoInteractor = getBinding(); + + if (saveLoginInfoInteractor != null) { + consumeState( + saveLoginInfoInteractor!.execute( + CompanyServerLoginInfo(email: username), + ), + ); + } + } + + void autoFillPreviousCompanyServerMail(CompanyServerLoginInfo loginInfo) { + final userEmail = loginInfo.email; + onUsernameChange(userEmail); + usernameInputController.text = userEmail; + } + + Future autoFillCompanyServerMail() async { + final listUsername = await getAllRecentLoginUsernameAction(); + if (listUsername.isNotEmpty) { + final username = listUsername.first.username; + onUsernameChange(username); + usernameInputController.text = username; + } + } + + void removeCompanyServerLoginInfo() { + removeLoginInfoInteractor = + getBinding(); + if (removeLoginInfoInteractor != null) { + consumeState(removeLoginInfoInteractor!.execute()); + } + } +} diff --git a/lib/features/login/presentation/login_controller.dart b/lib/features/login/presentation/login_controller.dart index 7de167224..e4a242987 100644 --- a/lib/features/login/presentation/login_controller.dart +++ b/lib/features/login/presentation/login_controller.dart @@ -47,10 +47,13 @@ import 'package:tmail_ui_user/features/login/domain/usecases/get_oidc_configurat import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_oidc_configuration_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_token_oidc_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/remove_auth_destination_url_interactor.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/remove_company_server_login_info_interactor.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/save_company_server_login_info_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/save_login_url_on_mobile_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/save_login_username_on_mobile_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/try_guessing_web_finger_interactor.dart'; import 'package:tmail_ui_user/features/login/presentation/extensions/generate_oidc_guessing_urls.dart'; +import 'package:tmail_ui_user/features/login/presentation/extensions/handle_company_server_login_info_extension.dart'; import 'package:tmail_ui_user/features/login/presentation/extensions/handle_openid_configuration.dart'; import 'package:tmail_ui_user/features/login/presentation/login_form_type.dart'; import 'package:tmail_ui_user/features/login/presentation/model/login_arguments.dart'; @@ -84,6 +87,9 @@ class LoginController extends ReloadableController { final TryGuessingWebFingerInteractor _tryGuessingWebFingerInteractor; final RemoveAuthDestinationUrlInteractor _removeAuthDestinationUrlInteractor; + SaveCompanyServerLoginInfoInteractor? saveLoginInfoInteractor; + RemoveCompanyServerLoginInfoInteractor? removeLoginInfoInteractor; + final TextEditingController urlInputController = TextEditingController(); final TextEditingController usernameInputController = TextEditingController(); final TextEditingController passwordInputController = TextEditingController(); @@ -137,7 +143,11 @@ class LoginController extends ReloadableController { ? LoginFormType.dnsLookupForm : arguments.loginFormType; - if (PlatformInfo.isWeb) { + if (hasPreviousCompanyServerLogin(arguments)) { + autoFillPreviousCompanyServerMail(arguments.loginInfo!); + } else if (isCompanyServerLoginFlow(arguments)) { + autoFillCompanyServerMail(); + } else if (PlatformInfo.isWeb) { _checkOIDCIsAvailable(); } } else if (PlatformInfo.isWeb) { @@ -199,6 +209,9 @@ class LoginController extends ReloadableController { onBaseUrlChange(success.oidcResponse.subject); getOIDCConfiguration(success.oidcResponse); } else if (success is SignInTwakeWorkplaceSuccess) { + if (PlatformInfo.isMobile) { + removeCompanyServerLoginInfo(); + } synchronizeTokenAndGetSession( baseUri: success.baseUri, tokenOIDC: success.tokenOIDC, @@ -288,6 +301,9 @@ class LoginController extends ReloadableController { } void _handleAutoSignInViaDeepLinkSuccess(AutoSignInViaDeepLinkSuccess success) { + if (PlatformInfo.isMobile) { + removeCompanyServerLoginInfo(); + } synchronizeTokenAndGetSession( baseUri: success.baseUri, tokenOIDC: success.tokenOIDC, @@ -463,6 +479,11 @@ class LoginController extends ReloadableController { } void _getTokenOIDCSuccess(GetTokenOIDCSuccess success) { + if (isDnsLookupFormOnMobile && _username != null) { + saveCompanyServerLoginInfo(_username!.value); + } else if (PlatformInfo.isMobile) { + removeCompanyServerLoginInfo(); + } synchronizeTokenAndGetSession( baseUri: _currentBaseUrl!, tokenOIDC: success.tokenOIDC, @@ -516,7 +537,7 @@ class LoginController extends ReloadableController { _saveLoginUsernameOnMobileInteractor.execute(RecentLoginUsername.now(userName)); } - Future> getAllRecentLoginUsernameAction(String pattern) async { + Future> getAllRecentLoginUsernameAction({String? pattern}) async { return await _getAllRecentLoginUsernameOnMobileInteractor .execute(pattern: pattern) .then((result) => result.fold( @@ -555,6 +576,10 @@ class LoginController extends ReloadableController { } void _handleCommonOIDCFailure() { + if (PlatformInfo.isMobile) { + removeCompanyServerLoginInfo(); + } + if (PlatformInfo.isMobile && loginFormType.value == LoginFormType.dnsLookupForm) { _showPasswordForm(); } else { @@ -635,6 +660,8 @@ class LoginController extends ReloadableController { passwordInputController.dispose(); if (PlatformInfo.isMobile) { _deepLinkDataStreamSubscription?.cancel(); + saveLoginInfoInteractor = null; + removeLoginInfoInteractor = null; } super.onClose(); } diff --git a/lib/features/login/presentation/login_view.dart b/lib/features/login/presentation/login_view.dart index 43f5666b2..4b86b5647 100644 --- a/lib/features/login/presentation/login_view.dart +++ b/lib/features/login/presentation/login_view.dart @@ -103,7 +103,8 @@ class LoginView extends BaseLoginView { textEditingController: controller.usernameInputController, onTextChange: controller.onUsernameChange, onTextSubmitted: (_) => controller.invokeDNSLookupToGetJmapUrl(), - suggestionsCallback: controller.getAllRecentLoginUsernameAction, + suggestionsCallback: (query) => + controller.getAllRecentLoginUsernameAction(pattern: query), onSuggestionSelected: controller.selectUsernameFromSuggestion ); case LoginFormType.passwordForm: diff --git a/lib/features/login/presentation/model/login_arguments.dart b/lib/features/login/presentation/model/login_arguments.dart index b87eb6b9f..01963d817 100644 --- a/lib/features/login/presentation/model/login_arguments.dart +++ b/lib/features/login/presentation/model/login_arguments.dart @@ -1,13 +1,14 @@ - +import 'package:tmail_ui_user/features/login/domain/model/company_server_login_info.dart'; import 'package:tmail_ui_user/features/login/presentation/login_form_type.dart'; import 'package:tmail_ui_user/main/routes/router_arguments.dart'; class LoginArguments extends RouterArguments { final LoginFormType loginFormType; + final CompanyServerLoginInfo? loginInfo; - LoginArguments(this.loginFormType); + LoginArguments(this.loginFormType, {this.loginInfo}); @override - List get props => [loginFormType]; + List get props => [loginFormType, loginInfo]; } \ No newline at end of file diff --git a/lib/features/starting_page/presentation/twake_welcome/twake_welcome_controller.dart b/lib/features/starting_page/presentation/twake_welcome/twake_welcome_controller.dart index dd48e2a25..ed1728a2c 100644 --- a/lib/features/starting_page/presentation/twake_welcome/twake_welcome_controller.dart +++ b/lib/features/starting_page/presentation/twake_welcome/twake_welcome_controller.dart @@ -9,12 +9,12 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:model/oidc/oidc_configuration.dart'; -import 'package:model/oidc/token_oidc.dart'; import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart'; import 'package:tmail_ui_user/features/home/domain/state/auto_sign_in_via_deep_link_state.dart'; import 'package:tmail_ui_user/features/home/domain/state/get_session_state.dart'; import 'package:tmail_ui_user/features/login/data/network/config/oidc_constant.dart'; import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/remove_company_server_login_info_interactor.dart'; import 'package:tmail_ui_user/features/login/presentation/login_form_type.dart'; import 'package:tmail_ui_user/features/login/presentation/model/login_arguments.dart'; import 'package:tmail_ui_user/features/starting_page/domain/state/sign_in_twake_workplace_state.dart'; @@ -36,6 +36,8 @@ class TwakeWelcomeController extends ReloadableController { final SignInTwakeWorkplaceInteractor _signInTwakeWorkplaceInteractor; final SignUpTwakeWorkplaceInteractor _signUpTwakeWorkplaceInteractor; + RemoveCompanyServerLoginInfoInteractor? _removeCompanyServerLoginInfoInteractor; + DeepLinksManager? _deepLinksManager; StreamSubscription? _deepLinkDataStreamSubscription; @@ -81,7 +83,10 @@ class TwakeWelcomeController extends ReloadableController { } void _handleAutoSignInViaDeepLinkSuccess(AutoSignInViaDeepLinkSuccess success) { - _synchronizeTokenAndGetSession( + if (PlatformInfo.isMobile) { + removeCompanyServerLoginInfo(); + } + synchronizeTokenAndGetSession( baseUri: success.baseUri, tokenOIDC: success.tokenOIDC, oidcConfiguration: success.oidcConfiguration, @@ -140,16 +145,30 @@ class TwakeWelcomeController extends ReloadableController { )); } + void removeCompanyServerLoginInfo() { + _removeCompanyServerLoginInfoInteractor = + getBinding(); + if (_removeCompanyServerLoginInfoInteractor != null) { + consumeState(_removeCompanyServerLoginInfoInteractor!.execute()); + } + } + @override void handleSuccessViewState(Success success) { if (success is SignInTwakeWorkplaceSuccess) { - _synchronizeTokenAndGetSession( + if (PlatformInfo.isMobile) { + removeCompanyServerLoginInfo(); + } + synchronizeTokenAndGetSession( baseUri: success.baseUri, tokenOIDC: success.tokenOIDC, oidcConfiguration: success.oidcConfiguration, ); } else if (success is SignUpTwakeWorkplaceSuccess) { - _synchronizeTokenAndGetSession( + if (PlatformInfo.isMobile) { + removeCompanyServerLoginInfo(); + } + synchronizeTokenAndGetSession( baseUri: success.baseUri, tokenOIDC: success.tokenOIDC, oidcConfiguration: success.oidcConfiguration, @@ -192,20 +211,6 @@ class TwakeWelcomeController extends ReloadableController { super.handleUrgentExceptionOnMobile(failure: failure, exception: exception); } - void _synchronizeTokenAndGetSession({ - required Uri baseUri, - required TokenOIDC tokenOIDC, - required OIDCConfiguration oidcConfiguration, - }) { - setDataToInterceptors( - baseUrl: baseUri.toString(), - tokenOIDC: tokenOIDC, - oidcConfiguration: oidcConfiguration, - ); - - getSessionAction(); - } - void _handleSignInTwakeWorkplaceFailure(SignInTwakeWorkplaceFailure failure) { SmartDialog.dismiss(); @@ -222,6 +227,7 @@ class TwakeWelcomeController extends ReloadableController { void onClose() { if (PlatformInfo.isMobile) { _deepLinkDataStreamSubscription?.cancel(); + _removeCompanyServerLoginInfoInteractor = null; } super.onClose(); } diff --git a/lib/main/bindings/main_bindings.dart b/lib/main/bindings/main_bindings.dart index fc5618e0f..ba64c2f8c 100644 --- a/lib/main/bindings/main_bindings.dart +++ b/lib/main/bindings/main_bindings.dart @@ -1,5 +1,6 @@ import 'package:core/utils/platform_info.dart'; import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/login/presentation/bindings/company_server_login_interactor_bindings.dart'; import 'package:tmail_ui_user/main/bindings/core/core_bindings.dart'; import 'package:tmail_ui_user/main/bindings/credential/credential_bindings.dart'; import 'package:tmail_ui_user/main/bindings/deep_link/deep_link_bindings.dart'; @@ -22,6 +23,7 @@ class MainBindings extends Bindings { SessionBindings().dependencies(); NetWorkConnectionBindings().dependencies(); if (PlatformInfo.isMobile) { + CompanyServerLoginInteractorBindings().dependencies(); DeepLinkBindings().dependencies(); } }