TF-2387 Add loading bar when click sign in saas

This commit is contained in:
dab246
2024-10-17 16:31:36 +07:00
committed by Dat H. Pham
parent 6c0eea0238
commit ce3d73310e
9 changed files with 107 additions and 37 deletions
@@ -36,7 +36,7 @@ abstract class ReloadableController extends BaseController {
goToLogin(); goToLogin();
} else if (failure is GetSessionFailure) { } else if (failure is GetSessionFailure) {
logError('$runtimeType::handleFailureViewState():Failure = $failure'); logError('$runtimeType::handleFailureViewState():Failure = $failure');
_handleGetSessionFailure(failure.exception); handleGetSessionFailure(failure.exception);
} else if (failure is UpdateAccountCacheFailure) { } else if (failure is UpdateAccountCacheFailure) {
logError('$runtimeType::handleFailureViewState():Failure = $failure'); logError('$runtimeType::handleFailureViewState():Failure = $failure');
_handleUpdateAccountCacheCompleted( _handleUpdateAccountCacheCompleted(
@@ -127,7 +127,7 @@ abstract class ReloadableController extends BaseController {
consumeState(_getSessionInteractor.execute()); consumeState(_getSessionInteractor.execute());
} }
void _handleGetSessionFailure(GetSessionFailure failure) { void handleGetSessionFailure(GetSessionFailure failure) {
if (failure.exception is! BadCredentialsException) { if (failure.exception is! BadCredentialsException) {
toastManager.showMessageFailure(failure); toastManager.showMessageFailure(failure);
} }
@@ -1,13 +1,11 @@
import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart'; import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:flutter/services.dart';
import 'package:model/account/authentication_type.dart'; import 'package:model/account/authentication_type.dart';
import 'package:model/account/personal_account.dart'; import 'package:model/account/personal_account.dart';
import 'package:model/oidc/oidc_configuration.dart'; import 'package:model/oidc/oidc_configuration.dart';
import 'package:model/oidc/token_oidc.dart'; import 'package:model/oidc/token_oidc.dart';
import 'package:rich_text_composer/views/commons/logger.dart'; import 'package:rich_text_composer/views/commons/logger.dart';
import 'package:tmail_ui_user/features/login/domain/exceptions/login_exception.dart';
import 'package:tmail_ui_user/features/login/domain/repository/account_repository.dart'; import 'package:tmail_ui_user/features/login/domain/repository/account_repository.dart';
import 'package:tmail_ui_user/features/login/domain/repository/authentication_oidc_repository.dart'; import 'package:tmail_ui_user/features/login/domain/repository/authentication_oidc_repository.dart';
import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart'; import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart';
@@ -51,13 +49,6 @@ class SignInSaasInteractor {
); );
yield Right<Failure, Success>(SignInSaasSuccess(tokenOIDC, baseUri, oidcConfiguration)); yield Right<Failure, Success>(SignInSaasSuccess(tokenOIDC, baseUri, oidcConfiguration));
} on PlatformException catch (e) {
logError('SignInSaasInteractor::execute():PlatformException ${e.message} - ${e.stacktrace}');
if (NoSuitableBrowserForOIDCException.verifyException(e)) {
yield Left<Failure, Success>(SignInSaasFailure(NoSuitableBrowserForOIDCException()));
} else {
yield Left<Failure, Success>(SignInSaasFailure(e));
}
} catch (e) { } catch (e) {
logError('SignInSaasInteractor::execute():Exception = $e'); logError('SignInSaasInteractor::execute():Exception = $e');
yield Left<Failure, Success>(SignInSaasFailure(e)); yield Left<Failure, Success>(SignInSaasFailure(e));
@@ -1,14 +1,19 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart'; import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:flutter/cupertino.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:tip_dialog/tip_dialog.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/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/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_saas_state.dart'; import 'package:tmail_ui_user/features/starting_page/domain/state/sign_in_saas_state.dart';
import 'package:tmail_ui_user/features/starting_page/domain/usecase/sign_in_saas_interactor.dart'; import 'package:tmail_ui_user/features/starting_page/domain/usecase/sign_in_saas_interactor.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.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/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:tmail_ui_user/main/routes/route_utils.dart'; import 'package:tmail_ui_user/main/routes/route_utils.dart';
@@ -31,7 +36,9 @@ class TwakeWelcomeController extends ReloadableController {
AppUtils.launchLink(AppConfig.linagoraPrivacyUrl); AppUtils.launchLink(AppConfig.linagoraPrivacyUrl);
} }
void onClickSignIn() { void onClickSignIn(BuildContext context) {
TipDialogHelper.loading(AppLocalizations.of(context).loadingPleaseWait);
if (AppConfig.saasServerUrl.isEmpty) { if (AppConfig.saasServerUrl.isEmpty) {
consumeState(Stream.value(Left(SignInSaasFailure(CanNotFoundSaasServerUrl())))); consumeState(Stream.value(Left(SignInSaasFailure(CanNotFoundSaasServerUrl()))));
return; return;
@@ -63,13 +70,31 @@ class TwakeWelcomeController extends ReloadableController {
} }
} }
@override
void handleFailureViewState(Failure failure) {
if (failure is SignInSaasFailure) {
_handleSignInSaasFailure(failure);
} else {
super.handleFailureViewState(failure);
}
}
@override @override
void handleReloaded(Session session) { void handleReloaded(Session session) {
TipDialogHelper.dismiss();
popAndPush( popAndPush(
RouteUtils.generateNavigationRoute(AppRoutes.dashboard), RouteUtils.generateNavigationRoute(AppRoutes.dashboard),
arguments: session); arguments: session);
} }
@override
void handleGetSessionFailure(GetSessionFailure failure) {
TipDialogHelper.dismiss();
toastManager.showMessageFailure(failure);
}
void _handleSignInSaasSuccess(SignInSaasSuccess success) { void _handleSignInSaasSuccess(SignInSaasSuccess success) {
dynamicUrlInterceptors.setJmapUrl(success.baseUri.toString()); dynamicUrlInterceptors.setJmapUrl(success.baseUri.toString());
dynamicUrlInterceptors.changeBaseUrl(success.baseUri.toString()); dynamicUrlInterceptors.changeBaseUrl(success.baseUri.toString());
@@ -81,4 +106,10 @@ class TwakeWelcomeController extends ReloadableController {
newConfig: success.oidcConfiguration); newConfig: success.oidcConfiguration);
getSessionAction(); getSessionAction();
} }
void _handleSignInSaasFailure(SignInSaasFailure failure) {
TipDialogHelper.dismiss();
toastManager.showMessageFailure(failure);
}
} }
@@ -3,6 +3,7 @@ import 'package:flutter/services.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:linagora_design_flutter/linagora_design_flutter.dart'; import 'package:linagora_design_flutter/linagora_design_flutter.dart';
import 'package:tip_dialog/tip_dialog.dart';
import 'package:tmail_ui_user/features/starting_page/presentation/twake_welcome/twake_welcome_controller.dart'; import 'package:tmail_ui_user/features/starting_page/presentation/twake_welcome/twake_welcome_controller.dart';
import 'package:tmail_ui_user/features/starting_page/presentation/twake_welcome/twake_welcome_view_style.dart'; import 'package:tmail_ui_user/features/starting_page/presentation/twake_welcome/twake_welcome_view_style.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
@@ -19,32 +20,45 @@ class TwakeWelcomeView extends GetWidget<TwakeWelcomeController> {
DeviceOrientation.portraitDown DeviceOrientation.portraitDown
]); ]);
return TwakeWelcomeScreen( return Stack(
logo: Padding( children: [
padding: const EdgeInsetsDirectional.only(bottom: 16), TwakeWelcomeScreen(
child: SvgPicture.asset( logo: Padding(
controller.imagePaths.icLogoTwakeWelcome, padding: const EdgeInsetsDirectional.only(bottom: 16),
width: TwakeWelcomeViewStyle.logoWidth, child: SvgPicture.asset(
height: TwakeWelcomeViewStyle.logoHeight, controller.imagePaths.icLogoTwakeWelcome,
width: TwakeWelcomeViewStyle.logoWidth,
height: TwakeWelcomeViewStyle.logoHeight,
),
),
focusColor: Colors.transparent,
hoverColor: Colors.transparent,
highlightColor: Colors.transparent,
overlayColor: WidgetStateProperty.all(Colors.transparent),
signInTitle: AppConfig.isSaasPlatForm
? AppLocalizations.of(context).signIn.capitalizeFirst ?? ''
: null,
onSignInOnTap: () => controller.onClickSignIn(context),
createTwakeIdTitle: AppConfig.isSaasPlatForm
? AppLocalizations.of(context).createTwakeId
: null,
useCompanyServerTitle: AppLocalizations.of(context).useCompanyServer,
description: AppLocalizations.of(context).descriptionWelcomeTo,
privacyPolicy: AppLocalizations.of(context).privacyPolicy,
descriptionPrivacyPolicy: AppLocalizations.of(context).byContinuingYouAreAgreeingToOur,
onPrivacyPolicyOnTap: controller.onClickPrivacyPolicy,
onUseCompanyServerOnTap: controller.handleUseCompanyServer,
), ),
), TipDialogContainer(
focusColor: Colors.transparent, duration: const Duration(seconds: 2),
hoverColor: Colors.transparent, outsideTouchable: true,
highlightColor: Colors.transparent, onOutsideTouch: (tipDialog) {
overlayColor: WidgetStateProperty.all(Colors.transparent), if (tipDialog is TipDialog && tipDialog.type == TipDialogType.LOADING) {
signInTitle: AppConfig.isSaasPlatForm TipDialogHelper.dismiss();
? AppLocalizations.of(context).signIn.capitalizeFirst ?? '' }
: null, }
onSignInOnTap: controller.onClickSignIn, )
createTwakeIdTitle: AppConfig.isSaasPlatForm ],
? AppLocalizations.of(context).createTwakeId
: null,
useCompanyServerTitle: AppLocalizations.of(context).useCompanyServer,
description: AppLocalizations.of(context).descriptionWelcomeTo,
privacyPolicy: AppLocalizations.of(context).privacyPolicy,
descriptionPrivacyPolicy: AppLocalizations.of(context).byContinuingYouAreAgreeingToOur,
onPrivacyPolicyOnTap: controller.onClickPrivacyPolicy,
onUseCompanyServerOnTap: controller.handleUseCompanyServer,
); );
} }
} }
+6
View File
@@ -4059,5 +4059,11 @@
"type": "text", "type": "text",
"placeholders_order": [], "placeholders_order": [],
"placeholders": {} "placeholders": {}
},
"sigInSaasFailed": "Login failed. Please check again.",
"@sigInSaasFailed": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
} }
} }
@@ -4259,4 +4259,11 @@ class AppLocalizations {
name: 'useCompanyServer', name: 'useCompanyServer',
); );
} }
String get sigInSaasFailed {
return Intl.message(
'Login failed. Please check again.',
name: 'sigInSaasFailed',
);
}
} }
+3
View File
@@ -8,6 +8,7 @@ import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.d
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/oidc_error.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/exceptions/authentication_exception.dart';
import 'package:tmail_ui_user/features/starting_page/domain/state/sign_in_saas_state.dart';
import 'package:tmail_ui_user/features/thread/domain/state/empty_spam_folder_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/empty_spam_folder_state.dart';
import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart';
import 'package:tmail_ui_user/main/exceptions/remote_exception.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception.dart';
@@ -64,6 +65,8 @@ class ToastManager {
&& failure.emailActionType == EmailActionType.moveToSpam && failure.emailActionType == EmailActionType.moveToSpam
&& failure.moveAction == MoveAction.moving) { && failure.moveAction == MoveAction.moving) {
message = AppLocalizations.of(currentContext!).markAsSpamFailed; message = AppLocalizations.of(currentContext!).markAsSpamFailed;
} else if (failure is SignInSaasFailure) {
message = AppLocalizations.of(currentContext!).sigInSaasFailed;
} }
if (message?.isNotEmpty == true) { if (message?.isNotEmpty == true) {
+16
View File
@@ -1330,6 +1330,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.1" version: "2.1.1"
loading_view:
dependency: transitive
description:
name: loading_view
sha256: "3d31c2c5293c2e3518b7330ffdc2fab5c83daaa9218cc45d4406c875f08f0795"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
logging: logging:
dependency: transitive dependency: transitive
description: description:
@@ -2016,6 +2024,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.1" version: "1.0.1"
tip_dialog:
dependency: "direct main"
description:
name: tip_dialog
sha256: edc1ebbb4b9f9575220c85206cf6986921c2b63d173744be0babac00c2e48bd0
url: "https://pub.dev"
source: hosted
version: "4.0.0"
typed_data: typed_data:
dependency: transitive dependency: transitive
description: description:
+2
View File
@@ -255,6 +255,8 @@ dependencies:
web_socket_channel: 2.4.3 web_socket_channel: 2.4.3
tip_dialog: 4.0.0
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
sdk: flutter sdk: flutter