diff --git a/lib/features/login/presentation/base_login_view.dart b/lib/features/login/presentation/base_login_view.dart index b147aa87e..8ce39a53a 100644 --- a/lib/features/login/presentation/base_login_view.dart +++ b/lib/features/login/presentation/base_login_view.dart @@ -37,6 +37,8 @@ abstract class BaseLoginView extends GetWidget { return AppLocalizations.of(context).requiredEmail; } else if (failure is LoginMissPasswordAction) { return AppLocalizations.of(context).requiredPassword; + } else if (failure is LoginSSONotAvailableAction) { + return AppLocalizations.of(context).ssoNotAvailable; } else if (failure is GetOIDCConfigurationFailure || failure is LoginCanNotVerifySSOConfigurationAction) { return AppLocalizations.of(context).canNotVerifySSOConfiguration; diff --git a/lib/features/login/presentation/login_controller.dart b/lib/features/login/presentation/login_controller.dart index 9144bedac..d61b38da3 100644 --- a/lib/features/login/presentation/login_controller.dart +++ b/lib/features/login/presentation/login_controller.dart @@ -123,6 +123,28 @@ class LoginController extends GetxController { } } + void handleSSOPressed() async { + final baseUri = _parseUri(AppConfig.baseUrl); + + if (baseUri != null) { + log('LoginController::handleSSOPressed(): baseUri: ${baseUri.toString()}'); + loginState.value = LoginState(Right(LoginLoadingAction())); + await _checkOIDCIsAvailableInteractor + .execute(OIDCRequest(baseUrl: baseUri.toString(), resourceUrl: baseUri.origin)) + .then((response) => response.fold( + (failure) => loginState.value = LoginState(Left(LoginSSONotAvailableAction())), + (success) { + if (success is CheckOIDCIsAvailableSuccess) { + loginState.value = LoginState(Right(success)); + _oidcResponse = success.oidcResponse; + _getOIDCConfiguration(); + } else { + loginState.value = LoginState(Left(LoginSSONotAvailableAction())); + } + })); + } + } + void _getOIDCConfiguration() async { loginState.value = LoginState(Right(LoginLoadingAction())); if (_oidcResponse != null) { diff --git a/lib/features/login/presentation/login_view_web.dart b/lib/features/login/presentation/login_view_web.dart index 150d324e7..5cc8bd49f 100644 --- a/lib/features/login/presentation/login_view_web.dart +++ b/lib/features/login/presentation/login_view_web.dart @@ -46,7 +46,8 @@ class LoginView extends BaseLoginView { ), Obx(() => buildLoginMessage(context, loginController.loginState.value)), buildInputCredentialForm(context), - buildLoginButton(context) + buildLoginButton(context), + buildSSOButton(context), ], ) ), @@ -161,7 +162,8 @@ class LoginView extends BaseLoginView { ), Obx(() => buildLoginMessage(context, loginController.loginState.value)), buildInputCredentialForm(context), - buildLoginButton(context) + buildLoginButton(context), + buildSSOButton(context), ], ) ) @@ -198,4 +200,28 @@ class LoginView extends BaseLoginView { ] ); } + + Widget buildSSOButton(BuildContext context) { + return Container( + margin: const EdgeInsets.only(bottom: 16, left: 24, right: 24), + width: responsiveUtils.getDeviceWidth(context),height: 48, + child: ElevatedButton( + key: const Key('ssoSubmitForm'), + style: ButtonStyle( + foregroundColor: MaterialStateProperty.resolveWith((Set states) => Colors.white), + backgroundColor: MaterialStateProperty.resolveWith((Set states) => AppColor.textFieldErrorBorderColor), + shape: MaterialStateProperty.all(RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + side: const BorderSide(width: 0, color: AppColor.textFieldErrorBorderColor) + )) + ), + child: Text(AppLocalizations.of(context).singleSignOn, + style: const TextStyle(fontSize: 16, color: Colors.white) + ), + onPressed: () { + loginController.handleSSOPressed(); + } + ) + ); + } } \ No newline at end of file diff --git a/lib/features/login/presentation/state/login_state.dart b/lib/features/login/presentation/state/login_state.dart index cc412a98e..bd2573889 100644 --- a/lib/features/login/presentation/state/login_state.dart +++ b/lib/features/login/presentation/state/login_state.dart @@ -53,4 +53,9 @@ class LoginCanNotVerifySSOConfigurationAction extends Failure { class LoginCanNotGetTokenAction extends Failure { @override List get props => []; +} + +class LoginSSONotAvailableAction extends Failure { + @override + List get props => []; } \ No newline at end of file diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index 82741c0e0..0c39a0d1c 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2022-06-01T17:23:21.677245", + "@@last_modified": "2022-06-06T13:32:00.583993", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -1399,5 +1399,17 @@ "type": "text", "placeholders_order": [], "placeholders": {} + }, + "singleSignOn": "Single Sign-On", + "@singleSignOn": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "ssoNotAvailable": "Single sign-on (SSO) is not available", + "@ssoNotAvailable": { + "type": "text", + "placeholders_order": [], + "placeholders": {} } } \ No newline at end of file diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index 5ffc07691..3ce222825 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -1431,4 +1431,14 @@ class AppLocalizations { 'All mailboxes', name: 'allMailboxes'); } + + String get singleSignOn { + return Intl.message('Single Sign-On', + name: 'singleSignOn'); + } + + String get ssoNotAvailable { + return Intl.message('Single sign-on (SSO) is not available', + name: 'ssoNotAvailable'); + } } \ No newline at end of file