TF-4186 Implement remember choose organisation server
This commit is contained in:
@@ -17,6 +17,7 @@ import 'package:model/model.dart';
|
|||||||
import 'package:rule_filter/rule_filter/capability_rule_filter.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/before_reconnect_manager.dart';
|
||||||
import 'package:tmail_ui_user/features/base/mixin/emit_state_mixin.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/logout_mixin.dart';
|
||||||
import 'package:tmail_ui_user/features/base/mixin/popup_context_menu_action_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';
|
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/config/oidc_constant.dart';
|
||||||
import 'package:tmail_ui_user/features/login/data/network/interceptors/authorization_interceptors.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/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_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/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/login_form_type.dart';
|
||||||
import 'package:tmail_ui_user/features/login/presentation/model/login_arguments.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';
|
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;
|
GetStoredFirebaseRegistrationInteractor? _getStoredFirebaseRegistrationInteractor;
|
||||||
DestroyFirebaseRegistrationInteractor? _destroyFirebaseRegistrationInteractor;
|
DestroyFirebaseRegistrationInteractor? _destroyFirebaseRegistrationInteractor;
|
||||||
|
GetCompanyServerLoginInfoInteractor? getCompanyServerLoginInfoInteractor;
|
||||||
|
|
||||||
StreamSubscription<html.Event>? _onBeforeUnloadBrowserSubscription;
|
StreamSubscription<html.Event>? _onBeforeUnloadBrowserSubscription;
|
||||||
StreamSubscription<html.Event>? _onUnloadBrowserSubscription;
|
StreamSubscription<html.Event>? _onUnloadBrowserSubscription;
|
||||||
@@ -264,6 +268,8 @@ abstract class BaseController extends GetxController
|
|||||||
} else if (failure is GetStoredFirebaseRegistrationFailure ||
|
} else if (failure is GetStoredFirebaseRegistrationFailure ||
|
||||||
failure is DestroyFirebaseRegistrationFailure) {
|
failure is DestroyFirebaseRegistrationFailure) {
|
||||||
await clearDataAndGoToLoginPage();
|
await clearDataAndGoToLoginPage();
|
||||||
|
} else if (failure is GetCompanyServerLoginInfoFailure) {
|
||||||
|
handleGetCompanyServerLoginInfoFailure();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -279,6 +285,8 @@ abstract class BaseController extends GetxController
|
|||||||
_destroyFirebaseRegistration(success.firebaseRegistration.id!);
|
_destroyFirebaseRegistration(success.firebaseRegistration.id!);
|
||||||
} else if (success is DestroyFirebaseRegistrationSuccess) {
|
} else if (success is DestroyFirebaseRegistrationSuccess) {
|
||||||
await clearDataAndGoToLoginPage();
|
await clearDataAndGoToLoginPage();
|
||||||
|
} else if (success is GetCompanyServerLoginInfoSuccess) {
|
||||||
|
handleGetCompanyServerLoginInfoSuccess(success.serverLoginInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -391,7 +399,7 @@ abstract class BaseController extends GetxController
|
|||||||
|
|
||||||
void goToLogin() {
|
void goToLogin() {
|
||||||
if (PlatformInfo.isMobile) {
|
if (PlatformInfo.isMobile) {
|
||||||
navigateToTwakeWelcomePage();
|
getCompanyServerLoginInfo(popAllRoute: false);
|
||||||
} else {
|
} else {
|
||||||
navigateToLoginPage();
|
navigateToLoginPage();
|
||||||
}
|
}
|
||||||
@@ -399,7 +407,7 @@ abstract class BaseController extends GetxController
|
|||||||
|
|
||||||
void removeAllPageAndGoToLogin() {
|
void removeAllPageAndGoToLogin() {
|
||||||
if (PlatformInfo.isMobile) {
|
if (PlatformInfo.isMobile) {
|
||||||
pushAndPopAll(AppRoutes.twakeWelcome);
|
getCompanyServerLoginInfo(popAllRoute: true);
|
||||||
} else {
|
} else {
|
||||||
navigateToLoginPage();
|
navigateToLoginPage();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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<GetCompanyServerLoginInfoInteractor>();
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -178,19 +178,12 @@ abstract class ReloadableController extends BaseController {
|
|||||||
required TokenOIDC tokenOIDC,
|
required TokenOIDC tokenOIDC,
|
||||||
required OIDCConfiguration oidcConfiguration,
|
required OIDCConfiguration oidcConfiguration,
|
||||||
}) {
|
}) {
|
||||||
final baseUrl = baseUri.toString();
|
setDataToInterceptors(
|
||||||
dynamicUrlInterceptors.setJmapUrl(baseUrl);
|
baseUrl: baseUri.toString(),
|
||||||
dynamicUrlInterceptors.changeBaseUrl(baseUrl);
|
tokenOIDC: tokenOIDC,
|
||||||
authorizationInterceptors.setTokenAndAuthorityOidc(
|
oidcConfiguration: oidcConfiguration,
|
||||||
newToken: tokenOIDC,
|
|
||||||
newConfig: oidcConfiguration,
|
|
||||||
);
|
|
||||||
authorizationIsolateInterceptors.setTokenAndAuthorityOidc(
|
|
||||||
newToken: tokenOIDC,
|
|
||||||
newConfig: oidcConfiguration,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
getOidcUserInfo(oidcConfiguration);
|
|
||||||
getSessionAction();
|
getSessionAction();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6,14 +6,25 @@ class GettingCompanyServerLoginInfo extends LoadingState {}
|
|||||||
|
|
||||||
class GetCompanyServerLoginInfoSuccess extends UIState {
|
class GetCompanyServerLoginInfoSuccess extends UIState {
|
||||||
final CompanyServerLoginInfo serverLoginInfo;
|
final CompanyServerLoginInfo serverLoginInfo;
|
||||||
|
final bool popAllRoute;
|
||||||
|
|
||||||
GetCompanyServerLoginInfoSuccess(this.serverLoginInfo);
|
GetCompanyServerLoginInfoSuccess(
|
||||||
|
this.serverLoginInfo, {
|
||||||
|
this.popAllRoute = true,
|
||||||
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object> get props => [serverLoginInfo];
|
List<Object> get props => [serverLoginInfo, popAllRoute];
|
||||||
}
|
}
|
||||||
|
|
||||||
class GetCompanyServerLoginInfoFailure extends FeatureFailure {
|
class GetCompanyServerLoginInfoFailure extends FeatureFailure {
|
||||||
GetCompanyServerLoginInfoFailure(dynamic exception)
|
final bool popAllRoute;
|
||||||
: super(exception: exception);
|
|
||||||
|
GetCompanyServerLoginInfoFailure(
|
||||||
|
dynamic exception, {
|
||||||
|
this.popAllRoute = true,
|
||||||
|
}) : super(exception: exception);
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [exception, popAllRoute];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
@@ -11,14 +11,20 @@ class GetCompanyServerLoginInfoInteractor {
|
|||||||
|
|
||||||
GetCompanyServerLoginInfoInteractor(this._serverLoginRepository);
|
GetCompanyServerLoginInfoInteractor(this._serverLoginRepository);
|
||||||
|
|
||||||
Stream<Either<Failure, Success>> execute() async* {
|
Stream<Either<Failure, Success>> execute({bool popAllRoute = true}) async* {
|
||||||
try {
|
try {
|
||||||
yield Right(GettingCompanyServerLoginInfo());
|
yield Right(GettingCompanyServerLoginInfo());
|
||||||
final serverLoginInfo =
|
final serverLoginInfo =
|
||||||
await _serverLoginRepository.getCompanyServerLoginInfo();
|
await _serverLoginRepository.getCompanyServerLoginInfo();
|
||||||
yield Right(GetCompanyServerLoginInfoSuccess(serverLoginInfo));
|
yield Right(GetCompanyServerLoginInfoSuccess(
|
||||||
|
serverLoginInfo,
|
||||||
|
popAllRoute: popAllRoute,
|
||||||
|
));
|
||||||
} catch (exception) {
|
} catch (exception) {
|
||||||
yield Left(GetCompanyServerLoginInfoFailure(exception));
|
yield Left(GetCompanyServerLoginInfoFailure(
|
||||||
|
exception,
|
||||||
|
popAllRoute: popAllRoute,
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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<Either<Failure, Success>> execute() async* {
|
||||||
|
try {
|
||||||
|
yield Right(RemovingCompanyServerLoginInfo());
|
||||||
|
await _serverLoginRepository.removeCompanyServerLoginInfo();
|
||||||
|
yield Right(RemoveCompanyServerLoginInfoSuccess());
|
||||||
|
} catch (exception) {
|
||||||
|
yield Left(RemoveCompanyServerLoginInfoFailure(exception));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -75,7 +75,8 @@ abstract class BaseLoginView extends GetWidget<LoginController> {
|
|||||||
..setHintText(AppLocalizations.of(context).email))
|
..setHintText(AppLocalizations.of(context).email))
|
||||||
.build(),
|
.build(),
|
||||||
debounceDuration: const Duration(milliseconds: 300),
|
debounceDuration: const Duration(milliseconds: 300),
|
||||||
suggestionsCallback: controller.getAllRecentLoginUsernameAction,
|
suggestionsCallback: (query) =>
|
||||||
|
controller.getAllRecentLoginUsernameAction(pattern: query),
|
||||||
itemBuilder: (_, loginUsername) => RecentItemTileWidget(loginUsername),
|
itemBuilder: (_, loginUsername) => RecentItemTileWidget(loginUsername),
|
||||||
onSuggestionSelected: controller.selectUsernameFromSuggestion,
|
onSuggestionSelected: controller.selectUsernameFromSuggestion,
|
||||||
noItemsFoundBuilder: (context) => const SizedBox(),
|
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_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/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_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_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/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/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/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/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/login_form_type.dart';
|
||||||
import 'package:tmail_ui_user/features/login/presentation/model/login_arguments.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 TryGuessingWebFingerInteractor _tryGuessingWebFingerInteractor;
|
||||||
final RemoveAuthDestinationUrlInteractor _removeAuthDestinationUrlInteractor;
|
final RemoveAuthDestinationUrlInteractor _removeAuthDestinationUrlInteractor;
|
||||||
|
|
||||||
|
SaveCompanyServerLoginInfoInteractor? saveLoginInfoInteractor;
|
||||||
|
RemoveCompanyServerLoginInfoInteractor? removeLoginInfoInteractor;
|
||||||
|
|
||||||
final TextEditingController urlInputController = TextEditingController();
|
final TextEditingController urlInputController = TextEditingController();
|
||||||
final TextEditingController usernameInputController = TextEditingController();
|
final TextEditingController usernameInputController = TextEditingController();
|
||||||
final TextEditingController passwordInputController = TextEditingController();
|
final TextEditingController passwordInputController = TextEditingController();
|
||||||
@@ -137,7 +143,11 @@ class LoginController extends ReloadableController {
|
|||||||
? LoginFormType.dnsLookupForm
|
? LoginFormType.dnsLookupForm
|
||||||
: arguments.loginFormType;
|
: arguments.loginFormType;
|
||||||
|
|
||||||
if (PlatformInfo.isWeb) {
|
if (hasPreviousCompanyServerLogin(arguments)) {
|
||||||
|
autoFillPreviousCompanyServerMail(arguments.loginInfo!);
|
||||||
|
} else if (isCompanyServerLoginFlow(arguments)) {
|
||||||
|
autoFillCompanyServerMail();
|
||||||
|
} else if (PlatformInfo.isWeb) {
|
||||||
_checkOIDCIsAvailable();
|
_checkOIDCIsAvailable();
|
||||||
}
|
}
|
||||||
} else if (PlatformInfo.isWeb) {
|
} else if (PlatformInfo.isWeb) {
|
||||||
@@ -199,6 +209,9 @@ class LoginController extends ReloadableController {
|
|||||||
onBaseUrlChange(success.oidcResponse.subject);
|
onBaseUrlChange(success.oidcResponse.subject);
|
||||||
getOIDCConfiguration(success.oidcResponse);
|
getOIDCConfiguration(success.oidcResponse);
|
||||||
} else if (success is SignInTwakeWorkplaceSuccess) {
|
} else if (success is SignInTwakeWorkplaceSuccess) {
|
||||||
|
if (PlatformInfo.isMobile) {
|
||||||
|
removeCompanyServerLoginInfo();
|
||||||
|
}
|
||||||
synchronizeTokenAndGetSession(
|
synchronizeTokenAndGetSession(
|
||||||
baseUri: success.baseUri,
|
baseUri: success.baseUri,
|
||||||
tokenOIDC: success.tokenOIDC,
|
tokenOIDC: success.tokenOIDC,
|
||||||
@@ -288,6 +301,9 @@ class LoginController extends ReloadableController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _handleAutoSignInViaDeepLinkSuccess(AutoSignInViaDeepLinkSuccess success) {
|
void _handleAutoSignInViaDeepLinkSuccess(AutoSignInViaDeepLinkSuccess success) {
|
||||||
|
if (PlatformInfo.isMobile) {
|
||||||
|
removeCompanyServerLoginInfo();
|
||||||
|
}
|
||||||
synchronizeTokenAndGetSession(
|
synchronizeTokenAndGetSession(
|
||||||
baseUri: success.baseUri,
|
baseUri: success.baseUri,
|
||||||
tokenOIDC: success.tokenOIDC,
|
tokenOIDC: success.tokenOIDC,
|
||||||
@@ -463,6 +479,11 @@ class LoginController extends ReloadableController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _getTokenOIDCSuccess(GetTokenOIDCSuccess success) {
|
void _getTokenOIDCSuccess(GetTokenOIDCSuccess success) {
|
||||||
|
if (isDnsLookupFormOnMobile && _username != null) {
|
||||||
|
saveCompanyServerLoginInfo(_username!.value);
|
||||||
|
} else if (PlatformInfo.isMobile) {
|
||||||
|
removeCompanyServerLoginInfo();
|
||||||
|
}
|
||||||
synchronizeTokenAndGetSession(
|
synchronizeTokenAndGetSession(
|
||||||
baseUri: _currentBaseUrl!,
|
baseUri: _currentBaseUrl!,
|
||||||
tokenOIDC: success.tokenOIDC,
|
tokenOIDC: success.tokenOIDC,
|
||||||
@@ -516,7 +537,7 @@ class LoginController extends ReloadableController {
|
|||||||
_saveLoginUsernameOnMobileInteractor.execute(RecentLoginUsername.now(userName));
|
_saveLoginUsernameOnMobileInteractor.execute(RecentLoginUsername.now(userName));
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<RecentLoginUsername>> getAllRecentLoginUsernameAction(String pattern) async {
|
Future<List<RecentLoginUsername>> getAllRecentLoginUsernameAction({String? pattern}) async {
|
||||||
return await _getAllRecentLoginUsernameOnMobileInteractor
|
return await _getAllRecentLoginUsernameOnMobileInteractor
|
||||||
.execute(pattern: pattern)
|
.execute(pattern: pattern)
|
||||||
.then((result) => result.fold(
|
.then((result) => result.fold(
|
||||||
@@ -555,6 +576,10 @@ class LoginController extends ReloadableController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _handleCommonOIDCFailure() {
|
void _handleCommonOIDCFailure() {
|
||||||
|
if (PlatformInfo.isMobile) {
|
||||||
|
removeCompanyServerLoginInfo();
|
||||||
|
}
|
||||||
|
|
||||||
if (PlatformInfo.isMobile && loginFormType.value == LoginFormType.dnsLookupForm) {
|
if (PlatformInfo.isMobile && loginFormType.value == LoginFormType.dnsLookupForm) {
|
||||||
_showPasswordForm();
|
_showPasswordForm();
|
||||||
} else {
|
} else {
|
||||||
@@ -635,6 +660,8 @@ class LoginController extends ReloadableController {
|
|||||||
passwordInputController.dispose();
|
passwordInputController.dispose();
|
||||||
if (PlatformInfo.isMobile) {
|
if (PlatformInfo.isMobile) {
|
||||||
_deepLinkDataStreamSubscription?.cancel();
|
_deepLinkDataStreamSubscription?.cancel();
|
||||||
|
saveLoginInfoInteractor = null;
|
||||||
|
removeLoginInfoInteractor = null;
|
||||||
}
|
}
|
||||||
super.onClose();
|
super.onClose();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -103,7 +103,8 @@ class LoginView extends BaseLoginView {
|
|||||||
textEditingController: controller.usernameInputController,
|
textEditingController: controller.usernameInputController,
|
||||||
onTextChange: controller.onUsernameChange,
|
onTextChange: controller.onUsernameChange,
|
||||||
onTextSubmitted: (_) => controller.invokeDNSLookupToGetJmapUrl(),
|
onTextSubmitted: (_) => controller.invokeDNSLookupToGetJmapUrl(),
|
||||||
suggestionsCallback: controller.getAllRecentLoginUsernameAction,
|
suggestionsCallback: (query) =>
|
||||||
|
controller.getAllRecentLoginUsernameAction(pattern: query),
|
||||||
onSuggestionSelected: controller.selectUsernameFromSuggestion
|
onSuggestionSelected: controller.selectUsernameFromSuggestion
|
||||||
);
|
);
|
||||||
case LoginFormType.passwordForm:
|
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/features/login/presentation/login_form_type.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/router_arguments.dart';
|
import 'package:tmail_ui_user/main/routes/router_arguments.dart';
|
||||||
|
|
||||||
class LoginArguments extends RouterArguments {
|
class LoginArguments extends RouterArguments {
|
||||||
|
|
||||||
final LoginFormType loginFormType;
|
final LoginFormType loginFormType;
|
||||||
|
final CompanyServerLoginInfo? loginInfo;
|
||||||
|
|
||||||
LoginArguments(this.loginFormType);
|
LoginArguments(this.loginFormType, {this.loginInfo});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [loginFormType];
|
List<Object?> get props => [loginFormType, loginInfo];
|
||||||
}
|
}
|
||||||
+24
-18
@@ -9,12 +9,12 @@ import 'package:flutter/cupertino.dart';
|
|||||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||||
import 'package:model/oidc/oidc_configuration.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/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/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/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/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/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/login_form_type.dart';
|
||||||
import 'package:tmail_ui_user/features/login/presentation/model/login_arguments.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';
|
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 SignInTwakeWorkplaceInteractor _signInTwakeWorkplaceInteractor;
|
||||||
final SignUpTwakeWorkplaceInteractor _signUpTwakeWorkplaceInteractor;
|
final SignUpTwakeWorkplaceInteractor _signUpTwakeWorkplaceInteractor;
|
||||||
|
|
||||||
|
RemoveCompanyServerLoginInfoInteractor? _removeCompanyServerLoginInfoInteractor;
|
||||||
|
|
||||||
DeepLinksManager? _deepLinksManager;
|
DeepLinksManager? _deepLinksManager;
|
||||||
StreamSubscription<DeepLinkData?>? _deepLinkDataStreamSubscription;
|
StreamSubscription<DeepLinkData?>? _deepLinkDataStreamSubscription;
|
||||||
|
|
||||||
@@ -81,7 +83,10 @@ class TwakeWelcomeController extends ReloadableController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _handleAutoSignInViaDeepLinkSuccess(AutoSignInViaDeepLinkSuccess success) {
|
void _handleAutoSignInViaDeepLinkSuccess(AutoSignInViaDeepLinkSuccess success) {
|
||||||
_synchronizeTokenAndGetSession(
|
if (PlatformInfo.isMobile) {
|
||||||
|
removeCompanyServerLoginInfo();
|
||||||
|
}
|
||||||
|
synchronizeTokenAndGetSession(
|
||||||
baseUri: success.baseUri,
|
baseUri: success.baseUri,
|
||||||
tokenOIDC: success.tokenOIDC,
|
tokenOIDC: success.tokenOIDC,
|
||||||
oidcConfiguration: success.oidcConfiguration,
|
oidcConfiguration: success.oidcConfiguration,
|
||||||
@@ -140,16 +145,30 @@ class TwakeWelcomeController extends ReloadableController {
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void removeCompanyServerLoginInfo() {
|
||||||
|
_removeCompanyServerLoginInfoInteractor =
|
||||||
|
getBinding<RemoveCompanyServerLoginInfoInteractor>();
|
||||||
|
if (_removeCompanyServerLoginInfoInteractor != null) {
|
||||||
|
consumeState(_removeCompanyServerLoginInfoInteractor!.execute());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void handleSuccessViewState(Success success) {
|
void handleSuccessViewState(Success success) {
|
||||||
if (success is SignInTwakeWorkplaceSuccess) {
|
if (success is SignInTwakeWorkplaceSuccess) {
|
||||||
_synchronizeTokenAndGetSession(
|
if (PlatformInfo.isMobile) {
|
||||||
|
removeCompanyServerLoginInfo();
|
||||||
|
}
|
||||||
|
synchronizeTokenAndGetSession(
|
||||||
baseUri: success.baseUri,
|
baseUri: success.baseUri,
|
||||||
tokenOIDC: success.tokenOIDC,
|
tokenOIDC: success.tokenOIDC,
|
||||||
oidcConfiguration: success.oidcConfiguration,
|
oidcConfiguration: success.oidcConfiguration,
|
||||||
);
|
);
|
||||||
} else if (success is SignUpTwakeWorkplaceSuccess) {
|
} else if (success is SignUpTwakeWorkplaceSuccess) {
|
||||||
_synchronizeTokenAndGetSession(
|
if (PlatformInfo.isMobile) {
|
||||||
|
removeCompanyServerLoginInfo();
|
||||||
|
}
|
||||||
|
synchronizeTokenAndGetSession(
|
||||||
baseUri: success.baseUri,
|
baseUri: success.baseUri,
|
||||||
tokenOIDC: success.tokenOIDC,
|
tokenOIDC: success.tokenOIDC,
|
||||||
oidcConfiguration: success.oidcConfiguration,
|
oidcConfiguration: success.oidcConfiguration,
|
||||||
@@ -192,20 +211,6 @@ class TwakeWelcomeController extends ReloadableController {
|
|||||||
super.handleUrgentExceptionOnMobile(failure: failure, exception: exception);
|
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) {
|
void _handleSignInTwakeWorkplaceFailure(SignInTwakeWorkplaceFailure failure) {
|
||||||
SmartDialog.dismiss();
|
SmartDialog.dismiss();
|
||||||
|
|
||||||
@@ -222,6 +227,7 @@ class TwakeWelcomeController extends ReloadableController {
|
|||||||
void onClose() {
|
void onClose() {
|
||||||
if (PlatformInfo.isMobile) {
|
if (PlatformInfo.isMobile) {
|
||||||
_deepLinkDataStreamSubscription?.cancel();
|
_deepLinkDataStreamSubscription?.cancel();
|
||||||
|
_removeCompanyServerLoginInfoInteractor = null;
|
||||||
}
|
}
|
||||||
super.onClose();
|
super.onClose();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import 'package:core/utils/platform_info.dart';
|
import 'package:core/utils/platform_info.dart';
|
||||||
import 'package:get/get.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/core/core_bindings.dart';
|
||||||
import 'package:tmail_ui_user/main/bindings/credential/credential_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';
|
import 'package:tmail_ui_user/main/bindings/deep_link/deep_link_bindings.dart';
|
||||||
@@ -22,6 +23,7 @@ class MainBindings extends Bindings {
|
|||||||
SessionBindings().dependencies();
|
SessionBindings().dependencies();
|
||||||
NetWorkConnectionBindings().dependencies();
|
NetWorkConnectionBindings().dependencies();
|
||||||
if (PlatformInfo.isMobile) {
|
if (PlatformInfo.isMobile) {
|
||||||
|
CompanyServerLoginInteractorBindings().dependencies();
|
||||||
DeepLinkBindings().dependencies();
|
DeepLinkBindings().dependencies();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user