TF-3278 Handle open app via deep link at Login screen

This commit is contained in:
dab246
2024-11-19 09:41:14 +07:00
committed by Dat H. Pham
parent 4817b31191
commit 8022559bc2
3 changed files with 65 additions and 5 deletions
@@ -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<DeepLinkData?>? _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>();
_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();
}
}
@@ -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,
);
}
+2 -2
View File
@@ -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