TF-3278 Handle open app via deep link at Login screen
This commit is contained in:
@@ -1,3 +1,5 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:core/presentation/extensions/url_extension.dart';
|
import 'package:core/presentation/extensions/url_extension.dart';
|
||||||
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';
|
||||||
@@ -7,6 +9,7 @@ import 'package:core/utils/platform_info.dart';
|
|||||||
import 'package:dartz/dartz.dart';
|
import 'package:dartz/dartz.dart';
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/user_name.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/response/oidc_response.dart';
|
||||||
import 'package:model/oidc/token_oidc.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/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/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';
|
||||||
@@ -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/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/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/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/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';
|
||||||
@@ -89,6 +96,9 @@ class LoginController extends ReloadableController {
|
|||||||
Password? _password;
|
Password? _password;
|
||||||
Uri? _baseUri;
|
Uri? _baseUri;
|
||||||
|
|
||||||
|
DeepLinksManager? _deepLinksManager;
|
||||||
|
StreamSubscription<DeepLinkData?>? _deepLinkDataStreamSubscription;
|
||||||
|
|
||||||
LoginController(
|
LoginController(
|
||||||
this._authenticationInteractor,
|
this._authenticationInteractor,
|
||||||
this._checkOIDCIsAvailableInteractor,
|
this._checkOIDCIsAvailableInteractor,
|
||||||
@@ -106,6 +116,14 @@ class LoginController extends ReloadableController {
|
|||||||
this._signInTwakeWorkplaceInteractor,
|
this._signInTwakeWorkplaceInteractor,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@override
|
||||||
|
void onInit() {
|
||||||
|
super.onInit();
|
||||||
|
if (PlatformInfo.isMobile) {
|
||||||
|
_registerDeepLinks();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onReady() {
|
void onReady() {
|
||||||
super.onReady();
|
super.onReady();
|
||||||
@@ -208,9 +226,48 @@ class LoginController extends ReloadableController {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
void handleReloaded(Session session) {
|
void handleReloaded(Session session) {
|
||||||
|
SmartDialog.dismiss();
|
||||||
|
|
||||||
popAndPush(
|
popAndPush(
|
||||||
RouteUtils.generateNavigationRoute(AppRoutes.dashboard),
|
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();
|
urlInputController.dispose();
|
||||||
usernameInputController.dispose();
|
usernameInputController.dispose();
|
||||||
passwordInputController.dispose();
|
passwordInputController.dispose();
|
||||||
|
if (PlatformInfo.isMobile) {
|
||||||
|
_deepLinkDataStreamSubscription?.cancel();
|
||||||
|
}
|
||||||
super.onClose();
|
super.onClose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -64,13 +64,13 @@ class TwakeWelcomeController extends ReloadableController {
|
|||||||
if (deepLinkData == null) return;
|
if (deepLinkData == null) return;
|
||||||
|
|
||||||
if (currentContext != null) {
|
if (currentContext != null) {
|
||||||
TipDialogHelper.loading(AppLocalizations.of(currentContext!).loadingPleaseWait);
|
SmartDialog.showLoading(msg: AppLocalizations.of(currentContext!).loadingPleaseWait);
|
||||||
}
|
}
|
||||||
|
|
||||||
_deepLinksManager?.handleDeepLinksWhenAppOnForegroundNotSignedIn(
|
_deepLinksManager?.handleDeepLinksWhenAppOnForegroundNotSignedIn(
|
||||||
deepLinkData: deepLinkData,
|
deepLinkData: deepLinkData,
|
||||||
onSuccessCallback: _handleAutoSignInViaDeepLinkSuccess,
|
onSuccessCallback: _handleAutoSignInViaDeepLinkSuccess,
|
||||||
onFailureCallback: TipDialogHelper.dismiss
|
onFailureCallback: SmartDialog.dismiss,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -247,14 +247,14 @@ dependencies:
|
|||||||
|
|
||||||
web_socket_channel: 2.4.3
|
web_socket_channel: 2.4.3
|
||||||
|
|
||||||
flutter_smart_dialog: 4.9.8+5
|
|
||||||
|
|
||||||
flutter_web_auth_2: 3.1.1
|
flutter_web_auth_2: 3.1.1
|
||||||
|
|
||||||
app_links: 6.3.2
|
app_links: 6.3.2
|
||||||
|
|
||||||
duration: 4.0.3
|
duration: 4.0.3
|
||||||
|
|
||||||
|
flutter_smart_dialog: 4.9.8+5
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
|
|||||||
Reference in New Issue
Block a user