From 8022559bc2ff3613665d3d6a5b258941d51c051e Mon Sep 17 00:00:00 2001 From: dab246 Date: Tue, 19 Nov 2024 09:41:14 +0700 Subject: [PATCH] TF-3278 Handle open app via deep link at Login screen --- .../login/presentation/login_controller.dart | 62 ++++++++++++++++++- .../twake_welcome_controller.dart | 4 +- pubspec.yaml | 4 +- 3 files changed, 65 insertions(+), 5 deletions(-) diff --git a/lib/features/login/presentation/login_controller.dart b/lib/features/login/presentation/login_controller.dart index 7946426e3..19f993b8a 100644 --- a/lib/features/login/presentation/login_controller.dart +++ b/lib/features/login/presentation/login_controller.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:core/presentation/extensions/url_extension.dart'; import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; @@ -7,6 +9,7 @@ import 'package:core/utils/platform_info.dart'; import 'package:dartz/dartz.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart'; @@ -16,6 +19,7 @@ import 'package:model/oidc/request/oidc_request.dart'; import 'package:model/oidc/response/oidc_response.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/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/login/data/network/oidc_error.dart'; import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart'; @@ -52,6 +56,9 @@ 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/starting_page/domain/state/sign_in_twake_workplace_state.dart'; import 'package:tmail_ui_user/features/starting_page/domain/usecase/sign_in_twake_workplace_interactor.dart'; +import 'package:tmail_ui_user/main/deep_links/deep_link_data.dart'; +import 'package:tmail_ui_user/main/deep_links/deep_links_manager.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/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_utils.dart'; @@ -89,6 +96,9 @@ class LoginController extends ReloadableController { Password? _password; Uri? _baseUri; + DeepLinksManager? _deepLinksManager; + StreamSubscription? _deepLinkDataStreamSubscription; + LoginController( this._authenticationInteractor, this._checkOIDCIsAvailableInteractor, @@ -106,6 +116,14 @@ class LoginController extends ReloadableController { this._signInTwakeWorkplaceInteractor, ); + @override + void onInit() { + super.onInit(); + if (PlatformInfo.isMobile) { + _registerDeepLinks(); + } + } + @override void onReady() { super.onReady(); @@ -208,9 +226,48 @@ class LoginController extends ReloadableController { @override void handleReloaded(Session session) { + SmartDialog.dismiss(); + popAndPush( RouteUtils.generateNavigationRoute(AppRoutes.dashboard), - arguments: session + arguments: session, + ); + } + + @override + void handleGetSessionFailure(GetSessionFailure failure) { + SmartDialog.dismiss(); + super.handleGetSessionFailure(failure); + } + + void _registerDeepLinks() { + _deepLinksManager = getBinding(); + _deepLinksManager?.clearPendingDeepLinkData(); + _deepLinkDataStreamSubscription = _deepLinksManager + ?.pendingDeepLinkData.stream + .listen(_handlePendingDeepLinkDataStream); + } + + void _handlePendingDeepLinkDataStream(DeepLinkData? deepLinkData) { + log('LoginController::_handlePendingDeepLinkDataStream:DeepLinkData = $deepLinkData'); + if (deepLinkData == null) return; + + if (currentContext != null) { + SmartDialog.showLoading(msg: AppLocalizations.of(currentContext!).loadingPleaseWait); + } + + _deepLinksManager?.handleDeepLinksWhenAppOnForegroundNotSignedIn( + deepLinkData: deepLinkData, + onSuccessCallback: _handleAutoSignInViaDeepLinkSuccess, + onFailureCallback: SmartDialog.dismiss, + ); + } + + void _handleAutoSignInViaDeepLinkSuccess(AutoSignInViaDeepLinkSuccess success) { + _synchronizeTokenAndGetSession( + baseUri: success.baseUri, + tokenOIDC: success.tokenOIDC, + oidcConfiguration: success.oidcConfiguration, ); } @@ -570,6 +627,9 @@ class LoginController extends ReloadableController { urlInputController.dispose(); usernameInputController.dispose(); passwordInputController.dispose(); + if (PlatformInfo.isMobile) { + _deepLinkDataStreamSubscription?.cancel(); + } super.onClose(); } } \ No newline at end of file diff --git a/lib/features/starting_page/presentation/twake_welcome/twake_welcome_controller.dart b/lib/features/starting_page/presentation/twake_welcome/twake_welcome_controller.dart index 443bc186e..969a49b52 100644 --- a/lib/features/starting_page/presentation/twake_welcome/twake_welcome_controller.dart +++ b/lib/features/starting_page/presentation/twake_welcome/twake_welcome_controller.dart @@ -64,13 +64,13 @@ class TwakeWelcomeController extends ReloadableController { if (deepLinkData == null) return; if (currentContext != null) { - TipDialogHelper.loading(AppLocalizations.of(currentContext!).loadingPleaseWait); + SmartDialog.showLoading(msg: AppLocalizations.of(currentContext!).loadingPleaseWait); } _deepLinksManager?.handleDeepLinksWhenAppOnForegroundNotSignedIn( deepLinkData: deepLinkData, onSuccessCallback: _handleAutoSignInViaDeepLinkSuccess, - onFailureCallback: TipDialogHelper.dismiss + onFailureCallback: SmartDialog.dismiss, ); } diff --git a/pubspec.yaml b/pubspec.yaml index 37f2286ec..145e85430 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -247,14 +247,14 @@ dependencies: web_socket_channel: 2.4.3 - flutter_smart_dialog: 4.9.8+5 - flutter_web_auth_2: 3.1.1 app_links: 6.3.2 duration: 4.0.3 + flutter_smart_dialog: 4.9.8+5 + dev_dependencies: flutter_test: sdk: flutter