TF-4186 Implement remember choose organisation server
This commit is contained in:
@@ -75,7 +75,8 @@ abstract class BaseLoginView extends GetWidget<LoginController> {
|
||||
..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(),
|
||||
|
||||
+72
@@ -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<SharedPreferences>()));
|
||||
super.dependencies();
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsDataSource() {
|
||||
Get.put<CompanyServerLoginDataSource>(
|
||||
Get.find<CompanyServerLoginDatasourceImpl>(),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsDataSourceImpl() {
|
||||
Get.put(
|
||||
CompanyServerLoginDatasourceImpl(
|
||||
Get.find<CompanyServerLoginCacheManager>(),
|
||||
Get.find<CacheExceptionThrower>(),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsInteractor() {
|
||||
Get.put(
|
||||
SaveCompanyServerLoginInfoInteractor(
|
||||
Get.find<CompanyServerLoginRepository>(),
|
||||
),
|
||||
);
|
||||
Get.put(
|
||||
GetCompanyServerLoginInfoInteractor(
|
||||
Get.find<CompanyServerLoginRepository>(),
|
||||
),
|
||||
);
|
||||
Get.put(
|
||||
RemoveCompanyServerLoginInfoInteractor(
|
||||
Get.find<CompanyServerLoginRepository>(),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsRepository() {
|
||||
Get.put<CompanyServerLoginRepository>(
|
||||
Get.find<CompanyServerLoginRepositoryImpl>(),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsRepositoryImpl() {
|
||||
Get.put(
|
||||
CompanyServerLoginRepositoryImpl(
|
||||
Get.find<CompanyServerLoginDataSource>(),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
+62
@@ -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<SaveCompanyServerLoginInfoInteractor>();
|
||||
|
||||
if (saveLoginInfoInteractor != null) {
|
||||
consumeState(
|
||||
saveLoginInfoInteractor!.execute(
|
||||
CompanyServerLoginInfo(email: username),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
void autoFillPreviousCompanyServerMail(CompanyServerLoginInfo loginInfo) {
|
||||
final userEmail = loginInfo.email;
|
||||
onUsernameChange(userEmail);
|
||||
usernameInputController.text = userEmail;
|
||||
}
|
||||
|
||||
Future<void> autoFillCompanyServerMail() async {
|
||||
final listUsername = await getAllRecentLoginUsernameAction();
|
||||
if (listUsername.isNotEmpty) {
|
||||
final username = listUsername.first.username;
|
||||
onUsernameChange(username);
|
||||
usernameInputController.text = username;
|
||||
}
|
||||
}
|
||||
|
||||
void removeCompanyServerLoginInfo() {
|
||||
removeLoginInfoInteractor =
|
||||
getBinding<RemoveCompanyServerLoginInfoInteractor>();
|
||||
if (removeLoginInfoInteractor != null) {
|
||||
consumeState(removeLoginInfoInteractor!.execute());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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<List<RecentLoginUsername>> getAllRecentLoginUsernameAction(String pattern) async {
|
||||
Future<List<RecentLoginUsername>> 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();
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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<Object?> get props => [loginFormType];
|
||||
List<Object?> get props => [loginFormType, loginInfo];
|
||||
}
|
||||
Reference in New Issue
Block a user