Skip to content

Commit

Permalink
fixup! TF-2965 Add retry capability for OIDC check request
Browse files Browse the repository at this point in the history
  • Loading branch information
tddang-linagora committed Sep 17, 2024
1 parent ce1a8fd commit fe8b93a
Show file tree
Hide file tree
Showing 8 changed files with 85 additions and 81 deletions.
2 changes: 1 addition & 1 deletion lib/features/login/data/network/oidc_error.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@ class CanNotFoundOIDCAuthority implements Exception {}

class CanNotFoundOIDCLinks implements Exception {}

class CanNotFoundToken implements Exception {}
class CanNotFindToken implements Exception {}

class CanRetryOIDCException implements Exception {}
26 changes: 0 additions & 26 deletions lib/features/login/presentation/base_login_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -36,32 +36,6 @@ abstract class BaseLoginView extends GetWidget<LoginController> {
);
}

Widget buildRetryButton(
BuildContext context,
{required Function() onRetry}
) {
return Container(
margin: const EdgeInsetsDirectional.only(bottom: 16, start: 24, end: 24),
width: controller.responsiveUtils.getDeviceWidth(context),
height: 48,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
foregroundColor: Colors.white,
backgroundColor: AppColor.primaryColor,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
side: const BorderSide(width: 0, color: AppColor.primaryColor)
)
),
onPressed: onRetry,
child: Text(
AppLocalizations.of(context).tryAgain,
style: const TextStyle(fontSize: 16, color: Colors.white)
)
)
);
}

Widget buildInputCredentialForm(BuildContext context) {
return AutofillGroup(
child: Padding(
Expand Down
8 changes: 4 additions & 4 deletions lib/features/login/presentation/login_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ class LoginController extends ReloadableController {
final FocusNode passFocusNode = FocusNode();

final loginFormType = LoginFormType.none.obs;
final oidcRetryEnabled = false.obs;
final isOidcRetryEnabled = false.obs;

OIDCResponse? _oidcResponse;
UserName? _username;
Expand Down Expand Up @@ -204,12 +204,12 @@ class LoginController extends ReloadableController {
if (failure.exception is CanNotFoundOIDCLinks) {
_handleCommonOIDCFailure();
} else {
oidcRetryEnabled.value = true;
isOidcRetryEnabled.value = true;
}
}

void retryCheckOidc() {
oidcRetryEnabled.value = false;
isOidcRetryEnabled.value = false;
_checkOIDCIsAvailable();
}

Expand Down Expand Up @@ -505,7 +505,7 @@ class LoginController extends ReloadableController {
urlInputController.dispose();
usernameInputController.dispose();
passwordInputController.dispose();
oidcRetryEnabled.value = false;
isOidcRetryEnabled.value = false;
super.onClose();
}
}
51 changes: 26 additions & 25 deletions lib/features/login/presentation/login_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import 'package:tmail_ui_user/features/login/presentation/widgets/login_back_but
import 'package:tmail_ui_user/features/login/presentation/widgets/login_input_decoration_builder.dart';
import 'package:tmail_ui_user/features/login/presentation/widgets/login_message_widget.dart';
import 'package:tmail_ui_user/features/login/presentation/widgets/password_input_form.dart';
import 'package:tmail_ui_user/features/login/presentation/widgets/try_again_button.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';

class LoginView extends BaseLoginView {
Expand Down Expand Up @@ -203,18 +204,36 @@ class LoginView extends BaseLoginView {

Widget _buildOidcRetryButton(BuildContext context) {
return Obx(() {
if (!controller.oidcRetryEnabled.value) {
if (!controller.isOidcRetryEnabled.value) {
return const SizedBox.shrink();
}

return buildRetryButton(context, onRetry: controller.retryCheckOidc);
return TryAgainButton(
onRetry: controller.retryCheckOidc,
responsiveUtils: controller.responsiveUtils);
});
}

Widget _buildLoadingProgress(BuildContext context) {
return Obx(() {
return controller.viewState.value.fold(
(failure) {
return Obx(() => controller.viewState.value.fold(
(failure) {
switch (controller.loginFormType.value) {
case LoginFormType.dnsLookupForm:
case LoginFormType.baseUrlForm:
return _buildNextButtonInContext(context);
case LoginFormType.passwordForm:
case LoginFormType.credentialForm:
return _buildLoginButtonInContext(context);
default:
return const SizedBox.shrink();
}
},
(success) {
if (success is LoadingState) {
return _supportScrollForm(context)
? const HorizontalProgressLoadingButton()
: _buildExpandedButton(context, const HorizontalProgressLoadingButton());
} else {
switch (controller.loginFormType.value) {
case LoginFormType.dnsLookupForm:
case LoginFormType.baseUrlForm:
Expand All @@ -225,26 +244,8 @@ class LoginView extends BaseLoginView {
default:
return const SizedBox.shrink();
}
},
(success) {
if (success is LoadingState) {
return _supportScrollForm(context)
? const HorizontalProgressLoadingButton()
: _buildExpandedButton(context, const HorizontalProgressLoadingButton());
} else {
switch (controller.loginFormType.value) {
case LoginFormType.dnsLookupForm:
case LoginFormType.baseUrlForm:
return _buildNextButtonInContext(context);
case LoginFormType.passwordForm:
case LoginFormType.credentialForm:
return _buildLoginButtonInContext(context);
default:
return const SizedBox.shrink();
}
}
}
);
});
}
));
}
}
39 changes: 20 additions & 19 deletions lib/features/login/presentation/login_view_web.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ 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/privacy_link_widget.dart';
import 'package:tmail_ui_user/features/login/presentation/widgets/login_message_widget.dart';
import 'package:tmail_ui_user/features/login/presentation/widgets/try_again_button.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';

class LoginView extends BaseLoginView {
Expand Down Expand Up @@ -226,38 +227,38 @@ class LoginView extends BaseLoginView {

Widget _buildOidcRetryButton(BuildContext context) {
return Obx(() {
if (!controller.oidcRetryEnabled.value) {
if (!controller.isOidcRetryEnabled.value) {
return const SizedBox.shrink();
}

return buildRetryButton(context, onRetry: controller.retryCheckOidc);
return TryAgainButton(
onRetry: controller.retryCheckOidc,
responsiveUtils: controller.responsiveUtils);
});
}

Widget _buildLoadingProgress(BuildContext context) {
return Obx(() {
return controller.viewState.value.fold(
(failure) {
return Obx(() => controller.viewState.value.fold(
(failure) {
switch (controller.loginFormType.value) {
case LoginFormType.credentialForm:
return buildLoginButton(context);
default:
return const SizedBox.shrink();
}
},
(success) {
if (success is LoadingState) {
return buildLoadingCircularProgress();
} else {
switch (controller.loginFormType.value) {
case LoginFormType.credentialForm:
return buildLoginButton(context);
default:
return const SizedBox.shrink();
}
},
(success) {
if (success is LoadingState) {
return buildLoadingCircularProgress();
} else {
switch (controller.loginFormType.value) {
case LoginFormType.credentialForm:
return buildLoginButton(context);
default:
return const SizedBox.shrink();
}
}
}
);
});
}
));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import 'package:tmail_ui_user/features/login/domain/state/dns_lookup_to_get_jmap
import 'package:tmail_ui_user/features/login/domain/state/get_oidc_configuration_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_form_type.dart';
import 'package:tmail_ui_user/main/exceptions/remote_exception.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:tmail_ui_user/main/utils/toast_manager.dart';
Expand Down Expand Up @@ -55,10 +54,6 @@ class LoginMessageWidget extends StatelessWidget {
} else if (failure is GetTokenOIDCFailure && failure.exception is NoSuitableBrowserForOIDCException) {
return AppLocalizations.of(context).noSuitableBrowserForOIDC;
} else if (failure is FeatureFailure) {
if (failure.exception is NoNetworkError) {
return AppLocalizations.of(context).youAreOffline;
}

return _toastManager?.getMessageByException(context, failure.exception)
?? AppLocalizations.of(context).unknownError;
} else {
Expand Down
31 changes: 31 additions & 0 deletions lib/features/login/presentation/widgets/try_again_button.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/views/button/tmail_button_widget.dart';
import 'package:flutter/material.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';

class TryAgainButton extends StatelessWidget {
const TryAgainButton({
super.key,
required this.onRetry,
required this.responsiveUtils,
});

final VoidCallback onRetry;
final ResponsiveUtils responsiveUtils;

@override
Widget build(BuildContext context) {
return TMailButtonWidget.fromText(
text: AppLocalizations.of(context).tryAgain,
textStyle: const TextStyle(fontSize: 16, color: Colors.white),
backgroundColor: AppColor.primaryColor,
onTapActionCallback: onRetry,
borderRadius: 10,
margin: const EdgeInsetsDirectional.only(bottom: 16, start: 24, end: 24),
width: responsiveUtils.getDeviceWidth(context),
textAlign: TextAlign.center,
padding: const EdgeInsets.symmetric(vertical: 12),
);
}
}
4 changes: 3 additions & 1 deletion lib/main/utils/toast_manager.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class ToastManager {
return AppLocalizations.of(context).requiredPassword;
} else if (exception is CanNotFoundOIDCLinks) {
return AppLocalizations.of(context).ssoNotAvailable;
} else if (exception is CanNotFoundToken) {
} else if (exception is CanNotFindToken) {
return AppLocalizations.of(context).canNotGetToken;
} else if (exception is ConnectionTimeout || exception is BadGateway || exception is SocketError) {
return AppLocalizations.of(context).wrongUrlMessage;
Expand All @@ -40,6 +40,8 @@ class ToastManager {
return '[${exception.code ?? ''}] ${exception.message}';
} else if (exception is NotFoundSessionException) {
return AppLocalizations.of(context).notFoundSession;
} else if (exception is NoNetworkError) {
return AppLocalizations.of(context).youAreOffline;
} else {
return null;
}
Expand Down

0 comments on commit fe8b93a

Please sign in to comment.