TF-1963 Use viewState to update result from interactor
(cherry picked from commit 335536fb94b32d978082578048ec06f70d21edcb)
This commit is contained in:
@@ -101,7 +101,6 @@ export 'data/network/download/downloaded_response.dart';
|
|||||||
// State
|
// State
|
||||||
export 'presentation/state/success.dart';
|
export 'presentation/state/success.dart';
|
||||||
export 'presentation/state/failure.dart';
|
export 'presentation/state/failure.dart';
|
||||||
export 'presentation/state/app_state.dart';
|
|
||||||
|
|
||||||
// Model
|
// Model
|
||||||
export 'data/model/source_type/data_source_type.dart';
|
export 'data/model/source_type/data_source_type.dart';
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
import 'package:core/presentation/state/failure.dart';
|
|
||||||
import 'package:core/presentation/state/success.dart';
|
|
||||||
import 'package:dartz/dartz.dart';
|
|
||||||
import 'package:equatable/equatable.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
@immutable
|
|
||||||
abstract class AppState with EquatableMixin {
|
|
||||||
final Either<Failure, Success> viewState;
|
|
||||||
|
|
||||||
AppState(this.viewState);
|
|
||||||
|
|
||||||
@override
|
|
||||||
List<Object?> get props => [viewState];
|
|
||||||
}
|
|
||||||
@@ -126,7 +126,7 @@ class HomeController extends BaseController {
|
|||||||
failure is GetAuthenticatedAccountFailure ||
|
failure is GetAuthenticatedAccountFailure ||
|
||||||
failure is GetStoredTokenOidcFailure ||
|
failure is GetStoredTokenOidcFailure ||
|
||||||
failure is GetCredentialFailure) {
|
failure is GetCredentialFailure) {
|
||||||
_goToLogin(arguments: LoginArguments(LoginFormType.credentialForm));
|
_goToLogin(arguments: LoginArguments(LoginFormType.baseUrlForm));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,25 @@
|
|||||||
import 'package:core/presentation/extensions/color_extension.dart';
|
import 'package:core/presentation/extensions/color_extension.dart';
|
||||||
import 'package:core/presentation/resources/image_paths.dart';
|
import 'package:core/presentation/resources/image_paths.dart';
|
||||||
|
import 'package:core/presentation/state/failure.dart';
|
||||||
|
import 'package:core/presentation/state/success.dart';
|
||||||
import 'package:core/presentation/utils/responsive_utils.dart';
|
import 'package:core/presentation/utils/responsive_utils.dart';
|
||||||
import 'package:core/presentation/views/text/type_ahead_form_field_builder.dart';
|
import 'package:core/presentation/views/text/type_ahead_form_field_builder.dart';
|
||||||
|
import 'package:dartz/dartz.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_typeahead/flutter_typeahead.dart';
|
import 'package:flutter_typeahead/flutter_typeahead.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:tmail_ui_user/features/base/widget/recent_item_tile_widget.dart';
|
import 'package:tmail_ui_user/features/base/widget/recent_item_tile_widget.dart';
|
||||||
|
import 'package:tmail_ui_user/features/login/data/network/oidc_error.dart';
|
||||||
|
import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart';
|
||||||
import 'package:tmail_ui_user/features/login/domain/model/recent_login_username.dart';
|
import 'package:tmail_ui_user/features/login/domain/model/recent_login_username.dart';
|
||||||
|
import 'package:tmail_ui_user/features/login/domain/state/authenticate_oidc_on_browser_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/login/domain/state/authentication_user_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/login/domain/state/check_oidc_is_available_state.dart';
|
||||||
import 'package:tmail_ui_user/features/login/domain/state/get_oidc_configuration_state.dart';
|
import 'package:tmail_ui_user/features/login/domain/state/get_oidc_configuration_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/login/domain/state/get_oidc_is_available_state.dart';
|
||||||
import 'package:tmail_ui_user/features/login/domain/state/get_token_oidc_state.dart';
|
import 'package:tmail_ui_user/features/login/domain/state/get_token_oidc_state.dart';
|
||||||
import 'package:tmail_ui_user/features/login/presentation/login_controller.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/login_form_type.dart';
|
||||||
import 'package:tmail_ui_user/features/login/presentation/state/login_state.dart';
|
|
||||||
import 'package:tmail_ui_user/features/login/presentation/widgets/login_input_decoration_builder.dart';
|
import 'package:tmail_ui_user/features/login/presentation/widgets/login_input_decoration_builder.dart';
|
||||||
import 'package:tmail_ui_user/features/login/presentation/widgets/login_text_input_builder.dart';
|
import 'package:tmail_ui_user/features/login/presentation/widgets/login_text_input_builder.dart';
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
@@ -25,27 +33,26 @@ abstract class BaseLoginView extends GetWidget<LoginController> {
|
|||||||
|
|
||||||
final FocusNode passFocusNode = FocusNode();
|
final FocusNode passFocusNode = FocusNode();
|
||||||
|
|
||||||
Widget buildLoginMessage(BuildContext context, LoginState loginState) {
|
Widget buildLoginMessage(BuildContext context, Either<Failure, Success> viewState) {
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: const EdgeInsets.only(top: 11, bottom: 36, left: 58, right: 58),
|
padding: const EdgeInsets.only(top: 11, bottom: 36, left: 58, right: 58),
|
||||||
child: SizedBox(
|
child: SizedBox(
|
||||||
width: responsiveUtils.getWidthLoginTextField(context),
|
width: responsiveUtils.getWidthLoginTextField(context),
|
||||||
child: Text(
|
child: Text(
|
||||||
loginState.viewState.fold(
|
viewState.fold(
|
||||||
(failure) {
|
(failure) {
|
||||||
if (failure is LoginMissUrlAction) {
|
if (failure is CheckOIDCIsAvailableFailure) {
|
||||||
return AppLocalizations.of(context).requiredUrl;
|
return _getMessageFailure(context, failure.exception);
|
||||||
} else if (failure is LoginMissUsernameAction) {
|
} else if (failure is AuthenticationUserFailure) {
|
||||||
return AppLocalizations.of(context).requiredEmail;
|
return _getMessageFailure(context, failure.exception);
|
||||||
} else if (failure is LoginMissPasswordAction) {
|
} else if (failure is GetOIDCIsAvailableFailure) {
|
||||||
return AppLocalizations.of(context).requiredPassword;
|
return _getMessageFailure(context, failure.exception);
|
||||||
} else if (failure is LoginSSONotAvailableAction) {
|
} else if (failure is GetTokenOIDCFailure) {
|
||||||
return AppLocalizations.of(context).ssoNotAvailable;
|
return _getMessageFailure(context, failure.exception);
|
||||||
} else if (failure is GetOIDCConfigurationFailure
|
} else if (failure is AuthenticateOidcOnBrowserFailure) {
|
||||||
|| failure is LoginCanNotVerifySSOConfigurationAction) {
|
return _getMessageFailure(context, failure.exception);
|
||||||
|
} else if (failure is GetOIDCConfigurationFailure) {
|
||||||
return AppLocalizations.of(context).canNotVerifySSOConfiguration;
|
return AppLocalizations.of(context).canNotVerifySSOConfiguration;
|
||||||
} else if (failure is GetTokenOIDCFailure || failure is LoginCanNotGetTokenAction) {
|
|
||||||
return AppLocalizations.of(context).canNotGetToken;
|
|
||||||
} else {
|
} else {
|
||||||
return AppLocalizations.of(context).unknownError;
|
return AppLocalizations.of(context).unknownError;
|
||||||
}
|
}
|
||||||
@@ -63,13 +70,29 @@ abstract class BaseLoginView extends GetWidget<LoginController> {
|
|||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 15,
|
fontSize: 15,
|
||||||
fontWeight: FontWeight.w400,
|
fontWeight: FontWeight.w400,
|
||||||
color: loginState.viewState.fold(
|
color: viewState.fold(
|
||||||
(failure) => AppColor.textFieldErrorBorderColor,
|
(failure) => AppColor.textFieldErrorBorderColor,
|
||||||
(success) => AppColor.colorNameEmail)),
|
(success) => AppColor.colorNameEmail)),
|
||||||
))
|
))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String _getMessageFailure(BuildContext context, dynamic exception) {
|
||||||
|
if (exception is CanNotFoundBaseUrl) {
|
||||||
|
return AppLocalizations.of(context).requiredUrl;
|
||||||
|
} else if (exception is CanNotFoundUserName) {
|
||||||
|
return AppLocalizations.of(context).requiredEmail;
|
||||||
|
} else if (exception is CanNotFoundPassword) {
|
||||||
|
return AppLocalizations.of(context).requiredPassword;
|
||||||
|
} else if (exception is CanNotFoundOIDCLinks) {
|
||||||
|
return AppLocalizations.of(context).ssoNotAvailable;
|
||||||
|
} else if (exception is CanNotFoundToken) {
|
||||||
|
return AppLocalizations.of(context).canNotGetToken;
|
||||||
|
} else {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Widget buildLoginButton(BuildContext context) {
|
Widget buildLoginButton(BuildContext context) {
|
||||||
return Container(
|
return Container(
|
||||||
margin: const EdgeInsets.only(bottom: 16, left: 24, right: 24),
|
margin: const EdgeInsets.only(bottom: 16, left: 24, right: 24),
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import 'package:core/utils/app_logger.dart';
|
|||||||
import 'package:core/utils/platform_info.dart';
|
import 'package:core/utils/platform_info.dart';
|
||||||
import 'package:dartz/dartz.dart';
|
import 'package:dartz/dartz.dart';
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||||
@@ -17,6 +16,8 @@ import 'package:model/oidc/request/oidc_request.dart';
|
|||||||
import 'package:model/oidc/response/oidc_response.dart';
|
import 'package:model/oidc/response/oidc_response.dart';
|
||||||
import 'package:model/oidc/token_oidc.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/login/data/network/oidc_error.dart';
|
||||||
|
import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart';
|
||||||
import 'package:tmail_ui_user/features/login/domain/model/login_constants.dart';
|
import 'package:tmail_ui_user/features/login/domain/model/login_constants.dart';
|
||||||
import 'package:tmail_ui_user/features/login/domain/model/recent_login_url.dart';
|
import 'package:tmail_ui_user/features/login/domain/model/recent_login_url.dart';
|
||||||
import 'package:tmail_ui_user/features/login/domain/model/recent_login_username.dart';
|
import 'package:tmail_ui_user/features/login/domain/model/recent_login_username.dart';
|
||||||
@@ -47,7 +48,6 @@ import 'package:tmail_ui_user/features/login/domain/usecases/save_login_username
|
|||||||
import 'package:tmail_ui_user/features/login/domain/usecases/update_authentication_account_interactor.dart';
|
import 'package:tmail_ui_user/features/login/domain/usecases/update_authentication_account_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/login/presentation/state/login_state.dart';
|
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/app_routes.dart';
|
import 'package:tmail_ui_user/main/routes/app_routes.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/navigation_router.dart';
|
import 'package:tmail_ui_user/main/routes/navigation_router.dart';
|
||||||
@@ -98,7 +98,6 @@ class LoginController extends ReloadableController {
|
|||||||
updateAuthenticationAccountInteractor
|
updateAuthenticationAccountInteractor
|
||||||
);
|
);
|
||||||
|
|
||||||
var loginState = LoginState(Right(LoginInitAction())).obs;
|
|
||||||
final loginFormType = LoginFormType.baseUrlForm.obs;
|
final loginFormType = LoginFormType.baseUrlForm.obs;
|
||||||
|
|
||||||
String? _urlText;
|
String? _urlText;
|
||||||
@@ -144,17 +143,9 @@ class LoginController extends ReloadableController {
|
|||||||
if (failure is GetAuthenticationInfoFailure) {
|
if (failure is GetAuthenticationInfoFailure) {
|
||||||
getAuthenticatedAccountAction();
|
getAuthenticatedAccountAction();
|
||||||
} else if (failure is CheckOIDCIsAvailableFailure ||
|
} else if (failure is CheckOIDCIsAvailableFailure ||
|
||||||
failure is GetStoredOidcConfigurationFailure) {
|
failure is GetStoredOidcConfigurationFailure ||
|
||||||
|
failure is GetOIDCIsAvailableFailure) {
|
||||||
_showFormLoginWithCredentialAction();
|
_showFormLoginWithCredentialAction();
|
||||||
} else if (failure is GetOIDCIsAvailableFailure) {
|
|
||||||
loginState.value = LoginState(Left(LoginSSONotAvailableAction()));
|
|
||||||
_showFormLoginWithCredentialAction();
|
|
||||||
} else if (failure is AuthenticationUserFailure) {
|
|
||||||
_loginFailureAction(failure);
|
|
||||||
} else if (failure is GetOIDCConfigurationFailure ||
|
|
||||||
failure is GetTokenOIDCFailure ||
|
|
||||||
failure is AuthenticateOidcOnBrowserFailure) {
|
|
||||||
loginState.value = LoginState(Left(failure));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,9 +157,8 @@ class LoginController extends ReloadableController {
|
|||||||
} else if (success is GetStoredOidcConfigurationSuccess) {
|
} else if (success is GetStoredOidcConfigurationSuccess) {
|
||||||
_getTokenOIDCAction(success.oidcConfiguration);
|
_getTokenOIDCAction(success.oidcConfiguration);
|
||||||
} else if (success is CheckOIDCIsAvailableSuccess) {
|
} else if (success is CheckOIDCIsAvailableSuccess) {
|
||||||
_showFormLoginWithSSOAction(success);
|
_redirectToSSOLoginScreen(success);
|
||||||
} else if (success is GetOIDCIsAvailableSuccess) {
|
} else if (success is GetOIDCIsAvailableSuccess) {
|
||||||
loginState.value = LoginState(Right(success));
|
|
||||||
_oidcResponse = success.oidcResponse;
|
_oidcResponse = success.oidcResponse;
|
||||||
_getOIDCConfiguration();
|
_getOIDCConfiguration();
|
||||||
} else if (success is GetOIDCConfigurationSuccess) {
|
} else if (success is GetOIDCConfigurationSuccess) {
|
||||||
@@ -177,21 +167,13 @@ class LoginController extends ReloadableController {
|
|||||||
_getTokenOIDCSuccess(success);
|
_getTokenOIDCSuccess(success);
|
||||||
} else if (success is AuthenticationUserSuccess) {
|
} else if (success is AuthenticationUserSuccess) {
|
||||||
_loginSuccessAction(success);
|
_loginSuccessAction(success);
|
||||||
} else if (success is GetAuthenticationInfoLoading ||
|
|
||||||
success is CheckOIDCIsAvailableLoading ||
|
|
||||||
success is GetStoredOidcConfigurationLoading ||
|
|
||||||
success is GetOIDCConfigurationLoading ||
|
|
||||||
success is GetTokenOIDCLoading ||
|
|
||||||
success is AuthenticationUserLoading ||
|
|
||||||
success is GetOIDCIsAvailableLoading) {
|
|
||||||
loginState.value = LoginState(Right(LoginLoadingAction()));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void handleExceptionAction({Failure? failure, Exception? exception}) {
|
void handleExceptionAction({Failure? failure, Exception? exception}) {
|
||||||
super.handleExceptionAction(failure: failure, exception: exception);
|
super.handleExceptionAction(failure: failure, exception: exception);
|
||||||
loginState.value = LoginState(Right(LoginInitAction()));
|
clearState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -215,29 +197,31 @@ class LoginController extends ReloadableController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _checkOIDCIsAvailable() {
|
void _checkOIDCIsAvailable() {
|
||||||
final baseUri = PlatformInfo.isWeb ? _parseUri(AppConfig.baseUrl) : _parseUri(_urlText);
|
final baseUrl = _getBaseUrl();
|
||||||
if (baseUri == null) {
|
if (baseUrl == null) {
|
||||||
loginState.value = LoginState(Left(LoginMissUrlAction()));
|
dispatchState(Left(CheckOIDCIsAvailableFailure(CanNotFoundBaseUrl())));
|
||||||
} else {
|
} else {
|
||||||
consumeState(_checkOIDCIsAvailableInteractor.execute(OIDCRequest(
|
consumeState(_checkOIDCIsAvailableInteractor.execute(
|
||||||
baseUrl: baseUri.toString(),
|
OIDCRequest(
|
||||||
resourceUrl: baseUri.origin)));
|
baseUrl: baseUrl.toString(),
|
||||||
|
resourceUrl: baseUrl.origin
|
||||||
|
)
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _showFormLoginWithSSOAction(CheckOIDCIsAvailableSuccess success) {
|
void _redirectToSSOLoginScreen(CheckOIDCIsAvailableSuccess success) {
|
||||||
loginState.value = LoginState(Right(success));
|
|
||||||
loginFormType.value = LoginFormType.ssoForm;
|
|
||||||
_oidcResponse = success.oidcResponse;
|
_oidcResponse = success.oidcResponse;
|
||||||
|
handleSSOPressed();
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleBackInCredentialForm() {
|
void handleBackInCredentialForm() {
|
||||||
loginState.value = LoginState(Right(LoginInitAction()));
|
clearState();
|
||||||
loginFormType.value = LoginFormType.baseUrlForm;
|
loginFormType.value = LoginFormType.baseUrlForm;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _showFormLoginWithCredentialAction() {
|
void _showFormLoginWithCredentialAction() {
|
||||||
loginState.value = LoginState(Right(InputUrlCompletion()));
|
clearState();
|
||||||
loginFormType.value = LoginFormType.credentialForm;
|
loginFormType.value = LoginFormType.credentialForm;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -249,29 +233,25 @@ class LoginController extends ReloadableController {
|
|||||||
if (loginFormType.value == LoginFormType.ssoForm) {
|
if (loginFormType.value == LoginFormType.ssoForm) {
|
||||||
_getOIDCConfiguration();
|
_getOIDCConfiguration();
|
||||||
} else {
|
} else {
|
||||||
final baseUri = kIsWeb ? _parseUri(AppConfig.baseUrl) : _parseUri(_urlText);
|
final baseUrl = _getBaseUrl();
|
||||||
final userName = _parseUserName(_userNameText);
|
final userName = _parseUserName(_userNameText);
|
||||||
final password = _parsePassword(_passwordText);
|
final password = _parsePassword(_passwordText);
|
||||||
if (baseUri != null && userName != null && password != null) {
|
|
||||||
_loginAction(baseUri, userName, password);
|
_loginAction(baseUrl: baseUrl, userName: userName, password: password);
|
||||||
} else if (baseUri == null) {
|
|
||||||
loginState.value = LoginState(Left(LoginMissUrlAction()));
|
|
||||||
} else if (userName == null) {
|
|
||||||
loginState.value = LoginState(Left(LoginMissUsernameAction()));
|
|
||||||
} else if (password == null) {
|
|
||||||
loginState.value = LoginState(Left(LoginMissPasswordAction()));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleSSOPressed() {
|
void handleSSOPressed() {
|
||||||
final baseUri = _parseUri(AppConfig.baseUrl);
|
final baseUrl = _getBaseUrl();
|
||||||
if (baseUri != null) {
|
if (baseUrl != null) {
|
||||||
consumeState(_getOIDCIsAvailableInteractor.execute(OIDCRequest(
|
consumeState(_getOIDCIsAvailableInteractor.execute(
|
||||||
baseUrl: baseUri.toString(),
|
OIDCRequest(
|
||||||
resourceUrl: baseUri.origin)));
|
baseUrl: baseUrl.toString(),
|
||||||
} else {
|
resourceUrl: baseUrl.origin
|
||||||
loginState.value = LoginState(Left(LoginCanNotAuthenticationSSOAction()));
|
)
|
||||||
|
));
|
||||||
|
} else {
|
||||||
|
dispatchState(Left(GetOIDCIsAvailableFailure(CanNotFoundBaseUrl())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -279,13 +259,12 @@ class LoginController extends ReloadableController {
|
|||||||
if (_oidcResponse != null) {
|
if (_oidcResponse != null) {
|
||||||
consumeState(_getOIDCConfigurationInteractor.execute(_oidcResponse!));
|
consumeState(_getOIDCConfigurationInteractor.execute(_oidcResponse!));
|
||||||
} else {
|
} else {
|
||||||
loginState.value = LoginState(Left(LoginCanNotAuthenticationSSOAction()));
|
dispatchState(Left(GetOIDCIsAvailableFailure(CanNotFoundOIDCLinks())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _getOIDCConfigurationSuccess(GetOIDCConfigurationSuccess success) {
|
void _getOIDCConfigurationSuccess(GetOIDCConfigurationSuccess success) {
|
||||||
log('LoginController::_getOIDCConfigurationSuccess():success: $success');
|
log('LoginController::_getOIDCConfigurationSuccess():success: $success');
|
||||||
loginState.value = LoginState(Right(success));
|
|
||||||
if (PlatformInfo.isWeb) {
|
if (PlatformInfo.isWeb) {
|
||||||
_authenticateOidcOnBrowserAction(success.oidcConfiguration);
|
_authenticateOidcOnBrowserAction(success.oidcConfiguration);
|
||||||
} else {
|
} else {
|
||||||
@@ -294,11 +273,11 @@ class LoginController extends ReloadableController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _getTokenOIDCAction(OIDCConfiguration config) async {
|
void _getTokenOIDCAction(OIDCConfiguration config) async {
|
||||||
final baseUri = kIsWeb ? _parseUri(AppConfig.baseUrl) : _parseUri(_urlText);
|
final baseUri = _getBaseUrl();
|
||||||
if (baseUri != null) {
|
if (baseUri != null) {
|
||||||
consumeState(_getTokenOIDCInteractor.execute(baseUri, config));
|
consumeState(_getTokenOIDCInteractor.execute(baseUri, config));
|
||||||
} else {
|
} else {
|
||||||
loginState.value = LoginState(Left(LoginCanNotGetTokenAction()));
|
dispatchState(Left(GetTokenOIDCFailure(CanNotFoundBaseUrl())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -309,7 +288,7 @@ class LoginController extends ReloadableController {
|
|||||||
if (baseUri != null) {
|
if (baseUri != null) {
|
||||||
consumeState(_authenticateOidcOnBrowserInteractor.execute(baseUri, config));
|
consumeState(_authenticateOidcOnBrowserInteractor.execute(baseUri, config));
|
||||||
} else {
|
} else {
|
||||||
loginState.value = LoginState(Left(LoginCanNotAuthenticationSSOAction()));
|
dispatchState(Left(AuthenticateOidcOnBrowserFailure(CanNotFoundBaseUrl())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -322,9 +301,8 @@ class LoginController extends ReloadableController {
|
|||||||
|
|
||||||
void _getTokenOIDCSuccess(GetTokenOIDCSuccess success) {
|
void _getTokenOIDCSuccess(GetTokenOIDCSuccess success) {
|
||||||
log('LoginController::_getTokenOIDCSuccess(): ${success.tokenOIDC.toString()}');
|
log('LoginController::_getTokenOIDCSuccess(): ${success.tokenOIDC.toString()}');
|
||||||
loginState.value = LoginState(Right(success));
|
_dynamicUrlInterceptors.setJmapUrl(_getBaseUrl().toString());
|
||||||
_dynamicUrlInterceptors.setJmapUrl(PlatformInfo.isWeb ? AppConfig.baseUrl : _urlText);
|
_dynamicUrlInterceptors.changeBaseUrl(_getBaseUrl().toString());
|
||||||
_dynamicUrlInterceptors.changeBaseUrl(PlatformInfo.isWeb ? AppConfig.baseUrl : _urlText);
|
|
||||||
authorizationInterceptors.setTokenAndAuthorityOidc(
|
authorizationInterceptors.setTokenAndAuthorityOidc(
|
||||||
newToken: success.tokenOIDC.toToken(),
|
newToken: success.tokenOIDC.toToken(),
|
||||||
newConfig: success.configuration);
|
newConfig: success.configuration);
|
||||||
@@ -334,24 +312,22 @@ class LoginController extends ReloadableController {
|
|||||||
pushAndPop(AppRoutes.session, arguments: _dynamicUrlInterceptors.baseUrl);
|
pushAndPop(AppRoutes.session, arguments: _dynamicUrlInterceptors.baseUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _loginAction(Uri baseUrl, UserName userName, Password password) async {
|
void _loginAction({Uri? baseUrl, UserName? userName, Password? password}) {
|
||||||
consumeState(_authenticationInteractor.execute(baseUrl, userName, password));
|
consumeState(_authenticationInteractor.execute(
|
||||||
|
baseUrl: baseUrl,
|
||||||
|
userName: userName,
|
||||||
|
password: password
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
void _loginSuccessAction(AuthenticationUserSuccess success) {
|
void _loginSuccessAction(AuthenticationUserSuccess success) {
|
||||||
loginState.value = LoginState(Right(success));
|
_dynamicUrlInterceptors.setJmapUrl(_getBaseUrl().toString());
|
||||||
_dynamicUrlInterceptors.setJmapUrl(PlatformInfo.isWeb ? AppConfig.baseUrl : _urlText);
|
_dynamicUrlInterceptors.changeBaseUrl(_getBaseUrl().toString());
|
||||||
_dynamicUrlInterceptors.changeBaseUrl(PlatformInfo.isWeb ? AppConfig.baseUrl : _urlText);
|
|
||||||
authorizationInterceptors.setBasicAuthorization(_userNameText, _passwordText);
|
authorizationInterceptors.setBasicAuthorization(_userNameText, _passwordText);
|
||||||
authorizationIsolateInterceptors.setBasicAuthorization(_userNameText, _passwordText);
|
authorizationIsolateInterceptors.setBasicAuthorization(_userNameText, _passwordText);
|
||||||
pushAndPop(AppRoutes.session, arguments: _dynamicUrlInterceptors.baseUrl);
|
pushAndPop(AppRoutes.session, arguments: _dynamicUrlInterceptors.baseUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _loginFailureAction(FeatureFailure failure) {
|
|
||||||
logError('LoginController::_loginFailureAction(): $failure');
|
|
||||||
loginState.value = LoginState(Left(failure));
|
|
||||||
}
|
|
||||||
|
|
||||||
void formatUrl(String url) {
|
void formatUrl(String url) {
|
||||||
log('LoginController::formatUrl(): $url');
|
log('LoginController::formatUrl(): $url');
|
||||||
if (url.isValid()) {
|
if (url.isValid()) {
|
||||||
@@ -364,7 +340,7 @@ class LoginController extends ReloadableController {
|
|||||||
if (_urlText?.isNotEmpty == true && PlatformInfo.isMobile) {
|
if (_urlText?.isNotEmpty == true && PlatformInfo.isMobile) {
|
||||||
final recentLoginUrl = RecentLoginUrl.now(_urlText!);
|
final recentLoginUrl = RecentLoginUrl.now(_urlText!);
|
||||||
log('LoginController::_saveRecentLoginUrl(): $recentLoginUrl');
|
log('LoginController::_saveRecentLoginUrl(): $recentLoginUrl');
|
||||||
consumeState(_saveLoginUrlOnMobileInteractor.execute(recentLoginUrl));
|
_saveLoginUrlOnMobileInteractor.execute(recentLoginUrl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -391,7 +367,7 @@ class LoginController extends ReloadableController {
|
|||||||
}
|
}
|
||||||
final recentLoginUsername = RecentLoginUsername.now(_userNameText!);
|
final recentLoginUsername = RecentLoginUsername.now(_userNameText!);
|
||||||
log('LoginController::_saveRecentLoginUsername(): $recentLoginUsername');
|
log('LoginController::_saveRecentLoginUsername(): $recentLoginUsername');
|
||||||
consumeState(_saveLoginUsernameOnMobileInteractor.execute(recentLoginUsername));
|
_saveLoginUsernameOnMobileInteractor.execute(recentLoginUsername);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<RecentLoginUsername>> getAllRecentLoginUsernameAction(String pattern) async {
|
Future<List<RecentLoginUsername>> getAllRecentLoginUsernameAction(String pattern) async {
|
||||||
@@ -405,9 +381,12 @@ class LoginController extends ReloadableController {
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Uri? _getBaseUrl() => PlatformInfo.isWeb ? _parseUri(AppConfig.baseUrl) : _parseUri(_urlText);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onClose() {
|
void onClose() {
|
||||||
urlInputController.clear();
|
urlInputController.dispose();
|
||||||
|
usernameInputController.dispose();
|
||||||
super.onClose();
|
super.onClose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
import 'package:core/presentation/extensions/color_extension.dart';
|
import 'package:core/presentation/extensions/color_extension.dart';
|
||||||
|
import 'package:core/presentation/state/success.dart';
|
||||||
import 'package:core/presentation/views/text/type_ahead_form_field_builder.dart';
|
import 'package:core/presentation/views/text/type_ahead_form_field_builder.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_svg/flutter_svg.dart';
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
@@ -9,7 +10,6 @@ import 'package:tmail_ui_user/features/login/domain/model/recent_login_url.dart'
|
|||||||
import 'package:tmail_ui_user/features/login/presentation/base_login_view.dart';
|
import 'package:tmail_ui_user/features/login/presentation/base_login_view.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/privacy_link_widget.dart';
|
import 'package:tmail_ui_user/features/login/presentation/privacy_link_widget.dart';
|
||||||
import 'package:tmail_ui_user/features/login/presentation/state/login_state.dart';
|
|
||||||
import 'package:tmail_ui_user/features/login/presentation/widgets/login_input_decoration_builder.dart';
|
import 'package:tmail_ui_user/features/login/presentation/widgets/login_input_decoration_builder.dart';
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
|
|
||||||
@@ -72,7 +72,7 @@ class LoginView extends BaseLoginView {
|
|||||||
style: const TextStyle(fontSize: 32, color: AppColor.colorNameEmail, fontWeight: FontWeight.w900)
|
style: const TextStyle(fontSize: 32, color: AppColor.colorNameEmail, fontWeight: FontWeight.w900)
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
Obx(() => buildLoginMessage(context, loginController.loginState.value)),
|
Obx(() => buildLoginMessage(context, loginController.viewState.value)),
|
||||||
Obx(() {
|
Obx(() {
|
||||||
switch (controller.loginFormType.value) {
|
switch (controller.loginFormType.value) {
|
||||||
case LoginFormType.baseUrlForm:
|
case LoginFormType.baseUrlForm:
|
||||||
@@ -83,30 +83,7 @@ class LoginView extends BaseLoginView {
|
|||||||
return const SizedBox.shrink();
|
return const SizedBox.shrink();
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
Obx(() {
|
_buildLoadingProgress(context),
|
||||||
switch (controller.loginFormType.value) {
|
|
||||||
case LoginFormType.baseUrlForm:
|
|
||||||
return Obx(() => loginController.loginState.value.viewState.fold(
|
|
||||||
(failure) => _buildNextButtonInContext(context),
|
|
||||||
(success) => success is LoginLoadingAction
|
|
||||||
? buildLoadingCircularProgress()
|
|
||||||
: _buildNextButtonInContext(context)));
|
|
||||||
case LoginFormType.credentialForm:
|
|
||||||
return Obx(() => loginController.loginState.value.viewState.fold(
|
|
||||||
(failure) => _buildLoginButtonInContext(context),
|
|
||||||
(success) => success is LoginLoadingAction
|
|
||||||
? buildLoadingCircularProgress()
|
|
||||||
: _buildLoginButtonInContext(context)));
|
|
||||||
case LoginFormType.ssoForm:
|
|
||||||
return Obx(() => loginController.loginState.value.viewState.fold(
|
|
||||||
(failure) => _buildLoginButtonInContext(context),
|
|
||||||
(success) => success is LoginLoadingAction
|
|
||||||
? buildLoadingCircularProgress()
|
|
||||||
: _buildLoginButtonInContext(context)));
|
|
||||||
default:
|
|
||||||
return const SizedBox.shrink();
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
const Padding(
|
const Padding(
|
||||||
padding: EdgeInsets.only(top: 16),
|
padding: EdgeInsets.only(top: 16),
|
||||||
child: PrivacyLinkWidget(),
|
child: PrivacyLinkWidget(),
|
||||||
@@ -209,4 +186,37 @@ class LoginView extends BaseLoginView {
|
|||||||
bool _supportScrollForm(BuildContext context) {
|
bool _supportScrollForm(BuildContext context) {
|
||||||
return !(responsiveUtils.isMobile(context) && responsiveUtils.isPortrait(context));
|
return !(responsiveUtils.isMobile(context) && responsiveUtils.isPortrait(context));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Widget _buildLoadingProgress(BuildContext context) {
|
||||||
|
return Obx(() => loginController.viewState.value.fold(
|
||||||
|
(failure) {
|
||||||
|
switch (controller.loginFormType.value) {
|
||||||
|
case LoginFormType.baseUrlForm:
|
||||||
|
return _buildNextButtonInContext(context);
|
||||||
|
case LoginFormType.credentialForm:
|
||||||
|
return _buildLoginButtonInContext(context);
|
||||||
|
case LoginFormType.ssoForm:
|
||||||
|
return _buildLoginButtonInContext(context);
|
||||||
|
default:
|
||||||
|
return const SizedBox.shrink();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
(success) {
|
||||||
|
if (success is LoadingState) {
|
||||||
|
return buildLoadingCircularProgress();
|
||||||
|
} else {
|
||||||
|
switch (controller.loginFormType.value) {
|
||||||
|
case LoginFormType.baseUrlForm:
|
||||||
|
return _buildNextButtonInContext(context);
|
||||||
|
case LoginFormType.credentialForm:
|
||||||
|
return _buildLoginButtonInContext(context);
|
||||||
|
case LoginFormType.ssoForm:
|
||||||
|
return _buildLoginButtonInContext(context);
|
||||||
|
default:
|
||||||
|
return const SizedBox.shrink();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,11 +1,13 @@
|
|||||||
import 'package:core/core.dart';
|
import 'package:core/presentation/extensions/color_extension.dart';
|
||||||
|
import 'package:core/presentation/state/success.dart';
|
||||||
|
import 'package:core/presentation/views/responsive/responsive_widget.dart';
|
||||||
|
import 'package:core/presentation/views/text/slogan_builder.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_svg/flutter_svg.dart';
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
import 'package:get/get_state_manager/src/rx_flutter/rx_obx_widget.dart';
|
import 'package:get/get_state_manager/src/rx_flutter/rx_obx_widget.dart';
|
||||||
import 'package:tmail_ui_user/features/login/presentation/base_login_view.dart';
|
import 'package:tmail_ui_user/features/login/presentation/base_login_view.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/privacy_link_widget.dart';
|
import 'package:tmail_ui_user/features/login/presentation/privacy_link_widget.dart';
|
||||||
import 'package:tmail_ui_user/features/login/presentation/state/login_state.dart';
|
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
|
|
||||||
class LoginView extends BaseLoginView {
|
class LoginView extends BaseLoginView {
|
||||||
@@ -45,7 +47,7 @@ class LoginView extends BaseLoginView {
|
|||||||
style: const TextStyle(fontSize: 32, color: AppColor.colorNameEmail, fontWeight: FontWeight.w900)
|
style: const TextStyle(fontSize: 32, color: AppColor.colorNameEmail, fontWeight: FontWeight.w900)
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
Obx(() => buildLoginMessage(context, loginController.loginState.value)),
|
Obx(() => buildLoginMessage(context, loginController.viewState.value)),
|
||||||
Obx(() {
|
Obx(() {
|
||||||
switch (controller.loginFormType.value) {
|
switch (controller.loginFormType.value) {
|
||||||
case LoginFormType.credentialForm:
|
case LoginFormType.credentialForm:
|
||||||
@@ -56,30 +58,7 @@ class LoginView extends BaseLoginView {
|
|||||||
return const SizedBox.shrink();
|
return const SizedBox.shrink();
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
Obx(() {
|
_buildLoadingProgress(context),
|
||||||
switch (controller.loginFormType.value) {
|
|
||||||
case LoginFormType.baseUrlForm:
|
|
||||||
return Obx(() => loginController.loginState.value.viewState.fold(
|
|
||||||
(failure) => const SizedBox.shrink(),
|
|
||||||
(success) => success is LoginLoadingAction
|
|
||||||
? buildLoadingCircularProgress()
|
|
||||||
: const SizedBox.shrink()));
|
|
||||||
case LoginFormType.credentialForm:
|
|
||||||
return Obx(() => loginController.loginState.value.viewState.fold(
|
|
||||||
(failure) => buildLoginButton(context),
|
|
||||||
(success) => success is LoginLoadingAction
|
|
||||||
? buildLoadingCircularProgress()
|
|
||||||
: buildLoginButton(context)));
|
|
||||||
case LoginFormType.ssoForm:
|
|
||||||
return Obx(() => loginController.loginState.value.viewState.fold(
|
|
||||||
(failure) => _buildSSOButton(context),
|
|
||||||
(success) => success is LoginLoadingAction
|
|
||||||
? buildLoadingCircularProgress()
|
|
||||||
: _buildSSOButton(context)));
|
|
||||||
default:
|
|
||||||
return const SizedBox.shrink();
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
const Padding(
|
const Padding(
|
||||||
padding: EdgeInsets.only(top: 16),
|
padding: EdgeInsets.only(top: 16),
|
||||||
child: PrivacyLinkWidget(),
|
child: PrivacyLinkWidget(),
|
||||||
@@ -200,7 +179,7 @@ class LoginView extends BaseLoginView {
|
|||||||
style: const TextStyle(fontSize: 32, color: AppColor.colorNameEmail, fontWeight: FontWeight.w900)
|
style: const TextStyle(fontSize: 32, color: AppColor.colorNameEmail, fontWeight: FontWeight.w900)
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
Obx(() => buildLoginMessage(context, loginController.loginState.value)),
|
Obx(() => buildLoginMessage(context, loginController.viewState.value)),
|
||||||
Obx(() {
|
Obx(() {
|
||||||
switch (controller.loginFormType.value) {
|
switch (controller.loginFormType.value) {
|
||||||
case LoginFormType.credentialForm:
|
case LoginFormType.credentialForm:
|
||||||
@@ -211,30 +190,7 @@ class LoginView extends BaseLoginView {
|
|||||||
return const SizedBox.shrink();
|
return const SizedBox.shrink();
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
Obx(() {
|
_buildLoadingProgress(context),
|
||||||
switch (controller.loginFormType.value) {
|
|
||||||
case LoginFormType.baseUrlForm:
|
|
||||||
return Obx(() => loginController.loginState.value.viewState.fold(
|
|
||||||
(failure) => const SizedBox.shrink(),
|
|
||||||
(success) => success is LoginLoadingAction
|
|
||||||
? buildLoadingCircularProgress()
|
|
||||||
: const SizedBox.shrink()));
|
|
||||||
case LoginFormType.credentialForm:
|
|
||||||
return Obx(() => loginController.loginState.value.viewState.fold(
|
|
||||||
(failure) => buildLoginButton(context),
|
|
||||||
(success) => success is LoginLoadingAction
|
|
||||||
? buildLoadingCircularProgress()
|
|
||||||
: buildLoginButton(context)));
|
|
||||||
case LoginFormType.ssoForm:
|
|
||||||
return Obx(() => loginController.loginState.value.viewState.fold(
|
|
||||||
(failure) => _buildSSOButton(context),
|
|
||||||
(success) => success is LoginLoadingAction
|
|
||||||
? buildLoadingCircularProgress()
|
|
||||||
: _buildSSOButton(context)));
|
|
||||||
default:
|
|
||||||
return const SizedBox.shrink();
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
const Padding(
|
const Padding(
|
||||||
padding: EdgeInsets.only(top: 16),
|
padding: EdgeInsets.only(top: 16),
|
||||||
child: PrivacyLinkWidget()
|
child: PrivacyLinkWidget()
|
||||||
@@ -300,4 +256,37 @@ class LoginView extends BaseLoginView {
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Widget _buildLoadingProgress(BuildContext context) {
|
||||||
|
return Obx(() => loginController.viewState.value.fold(
|
||||||
|
(failure) {
|
||||||
|
switch (controller.loginFormType.value) {
|
||||||
|
case LoginFormType.baseUrlForm:
|
||||||
|
return const SizedBox.shrink();
|
||||||
|
case LoginFormType.credentialForm:
|
||||||
|
return buildLoginButton(context);
|
||||||
|
case LoginFormType.ssoForm:
|
||||||
|
return _buildSSOButton(context);
|
||||||
|
default:
|
||||||
|
return const SizedBox.shrink();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
(success) {
|
||||||
|
if (success is LoadingState) {
|
||||||
|
return buildLoadingCircularProgress();
|
||||||
|
} else {
|
||||||
|
switch (controller.loginFormType.value) {
|
||||||
|
case LoginFormType.baseUrlForm:
|
||||||
|
return const SizedBox.shrink();
|
||||||
|
case LoginFormType.credentialForm:
|
||||||
|
return buildLoginButton(context);
|
||||||
|
case LoginFormType.ssoForm:
|
||||||
|
return _buildSSOButton(context);
|
||||||
|
default:
|
||||||
|
return const SizedBox.shrink();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
import 'package:core/core.dart';
|
|
||||||
import 'package:dartz/dartz.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
@immutable
|
|
||||||
class LoginState extends AppState {
|
|
||||||
LoginState(Either<Failure, Success> viewState) : super(viewState);
|
|
||||||
}
|
|
||||||
|
|
||||||
@immutable
|
|
||||||
class InputUrlCompletion extends ViewState {
|
|
||||||
@override
|
|
||||||
List<Object?> get props => [];
|
|
||||||
}
|
|
||||||
|
|
||||||
@immutable
|
|
||||||
class LoginLoadingAction extends ViewState {
|
|
||||||
@override
|
|
||||||
List<Object?> get props => [];
|
|
||||||
}
|
|
||||||
|
|
||||||
@immutable
|
|
||||||
class LoginInitAction extends ViewState {
|
|
||||||
@override
|
|
||||||
List<Object?> get props => [];
|
|
||||||
}
|
|
||||||
|
|
||||||
@immutable
|
|
||||||
class LoginMissUrlAction extends Failure {
|
|
||||||
@override
|
|
||||||
List<Object?> get props => [];
|
|
||||||
}
|
|
||||||
|
|
||||||
@immutable
|
|
||||||
class LoginMissUsernameAction extends Failure {
|
|
||||||
@override
|
|
||||||
List<Object?> get props => [];
|
|
||||||
}
|
|
||||||
|
|
||||||
@immutable
|
|
||||||
class LoginMissPasswordAction extends Failure {
|
|
||||||
@override
|
|
||||||
List<Object?> get props => [];
|
|
||||||
}
|
|
||||||
|
|
||||||
@immutable
|
|
||||||
class LoginCanNotVerifySSOConfigurationAction extends Failure {
|
|
||||||
@override
|
|
||||||
List<Object?> get props => [];
|
|
||||||
}
|
|
||||||
|
|
||||||
@immutable
|
|
||||||
class LoginCanNotGetTokenAction extends Failure {
|
|
||||||
@override
|
|
||||||
List<Object?> get props => [];
|
|
||||||
}
|
|
||||||
|
|
||||||
class LoginSSONotAvailableAction extends Failure {
|
|
||||||
@override
|
|
||||||
List<Object?> get props => [];
|
|
||||||
}
|
|
||||||
|
|
||||||
class LoginCanNotAuthenticationSSOAction extends Failure {
|
|
||||||
@override
|
|
||||||
List<Object?> get props => [];
|
|
||||||
}
|
|
||||||
@@ -102,8 +102,10 @@ class SessionController extends ReloadableController {
|
|||||||
} else if (sessionException is BadCredentialsException && currentContext != null) {
|
} else if (sessionException is BadCredentialsException && currentContext != null) {
|
||||||
errorMessage = AppLocalizations.of(currentContext!).badCredentials;
|
errorMessage = AppLocalizations.of(currentContext!).badCredentials;
|
||||||
} else if (sessionException is UnknownError && currentContext != null) {
|
} else if (sessionException is UnknownError && currentContext != null) {
|
||||||
if (sessionException.message != null) {
|
if (sessionException.message != null && sessionException.code != null) {
|
||||||
errorMessage = '[${sessionException.code}] ${sessionException.message}';
|
errorMessage = '[${sessionException.code}] ${sessionException.message}';
|
||||||
|
} else if (sessionException.message != null) {
|
||||||
|
errorMessage = sessionException.message!;
|
||||||
} else {
|
} else {
|
||||||
errorMessage = AppLocalizations.of(currentContext!).unknownError;
|
errorMessage = AppLocalizations.of(currentContext!).unknownError;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user