TF-3278 Handle open app via deep link at MailboxDashboard screen
This commit is contained in:
@@ -6,6 +6,7 @@ import 'package:core/utils/app_logger.dart';
|
||||
import 'package:core/utils/platform_info.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter_downloader/flutter_downloader.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||
import 'package:model/account/personal_account.dart';
|
||||
import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart';
|
||||
@@ -21,9 +22,12 @@ import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_recent_lo
|
||||
import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_recent_search_cache_interactor.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/domain/exceptions/logout_exception.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/state/get_credential_state.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/state/get_stored_token_oidc_state.dart';
|
||||
import 'package:tmail_ui_user/main/deep_links/deep_link_data.dart';
|
||||
import 'package:tmail_ui_user/features/login/presentation/model/login_navigate_arguments.dart';
|
||||
import 'package:tmail_ui_user/features/login/presentation/model/login_navigate_type.dart';
|
||||
import 'package:tmail_ui_user/main/deep_links/open_app_deep_link_data.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';
|
||||
@@ -65,7 +69,7 @@ class HomeController extends ReloadableController {
|
||||
|
||||
@override
|
||||
void onReady() {
|
||||
_cleanupCache();
|
||||
_handleNavigateToScreen();
|
||||
super.onReady();
|
||||
}
|
||||
|
||||
@@ -76,6 +80,11 @@ class HomeController extends ReloadableController {
|
||||
arguments: session);
|
||||
}
|
||||
|
||||
@override
|
||||
void onCancelReconnectWhenSessionExpired() {
|
||||
clearDataAndGoToLoginPage();
|
||||
}
|
||||
|
||||
void _initFlutterDownloader() {
|
||||
FlutterDownloader
|
||||
.initialize(debug: kDebugMode)
|
||||
@@ -84,6 +93,15 @@ class HomeController extends ReloadableController {
|
||||
|
||||
static void downloadCallback(String id, DownloadTaskStatus status, int progress) {}
|
||||
|
||||
void _handleNavigateToScreen() {
|
||||
final arguments = Get.arguments;
|
||||
if (arguments is LoginNavigateArguments) {
|
||||
_handleLoginNavigateArguments(arguments);
|
||||
} else {
|
||||
_cleanupCache();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _cleanupCache() async {
|
||||
await HiveCacheConfig.instance.onUpgradeDatabase(cachingManager);
|
||||
|
||||
@@ -95,6 +113,17 @@ class HomeController extends ReloadableController {
|
||||
], eagerError: true).then((_) => getAuthenticatedAccountAction());
|
||||
}
|
||||
|
||||
void _handleLoginNavigateArguments(LoginNavigateArguments arguments) {
|
||||
switch (arguments.navigateType) {
|
||||
case LoginNavigateType.autoSignIn:
|
||||
_handleAutoSignInViaDeepLinkSuccess(arguments.autoSignInViaDeepLinkSuccess!);
|
||||
break;
|
||||
default:
|
||||
_cleanupCache();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void _registerReceivingFileSharing() {
|
||||
_emailReceiveManager.registerReceivingFileSharingStreamWhileAppClosed();
|
||||
}
|
||||
@@ -124,7 +153,7 @@ class HomeController extends ReloadableController {
|
||||
void _handleLogOutAndSignInNewAccount({
|
||||
required Success authenticationViewStateSuccess,
|
||||
required PersonalAccount personalAccount,
|
||||
required DeepLinkData deepLinkData,
|
||||
required OpenAppDeepLinkData openAppDeepLinkData,
|
||||
}) {
|
||||
if (authenticationViewStateSuccess is GetCredentialViewState) {
|
||||
setDataToInterceptors(
|
||||
@@ -143,14 +172,14 @@ class HomeController extends ReloadableController {
|
||||
_getSessionActionToLogOut(
|
||||
authenticationViewStateSuccess: authenticationViewStateSuccess,
|
||||
personalAccount: personalAccount,
|
||||
deepLinkData: deepLinkData,
|
||||
openAppDeepLinkData: openAppDeepLinkData,
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> _getSessionActionToLogOut({
|
||||
required Success authenticationViewStateSuccess,
|
||||
required PersonalAccount personalAccount,
|
||||
required DeepLinkData deepLinkData,
|
||||
required OpenAppDeepLinkData openAppDeepLinkData,
|
||||
}) async {
|
||||
try {
|
||||
final sessionViewState = await getSessionInteractor.execute().last;
|
||||
@@ -161,7 +190,7 @@ class HomeController extends ReloadableController {
|
||||
sessionViewStateSuccess: success,
|
||||
authenticationViewStateSuccess: authenticationViewStateSuccess,
|
||||
personalAccount: personalAccount,
|
||||
deepLinkData: deepLinkData,
|
||||
openAppDeepLinkData: openAppDeepLinkData,
|
||||
),
|
||||
);
|
||||
} catch (e) {
|
||||
@@ -174,18 +203,27 @@ class HomeController extends ReloadableController {
|
||||
required Success sessionViewStateSuccess,
|
||||
required Success authenticationViewStateSuccess,
|
||||
required PersonalAccount personalAccount,
|
||||
required DeepLinkData deepLinkData,
|
||||
required OpenAppDeepLinkData openAppDeepLinkData,
|
||||
}) {
|
||||
if (sessionViewStateSuccess is GetSessionSuccess) {
|
||||
logoutToSignInNewAccount(
|
||||
session: sessionViewStateSuccess.session,
|
||||
accountId: personalAccount.accountId!,
|
||||
onFailureCallback: () =>
|
||||
_continueUsingTheApp(authenticationViewStateSuccess),
|
||||
onFailureCallback: ({exception}) {
|
||||
if (exception is UserCancelledLogoutOIDCFlowException) {
|
||||
_deepLinksManager?.autoSignInViaDeepLink(
|
||||
openAppDeepLinkData: openAppDeepLinkData,
|
||||
onFailureCallback: () => _continueUsingTheApp(authenticationViewStateSuccess),
|
||||
onAutoSignInSuccessCallback: _handleAutoSignInViaDeepLinkSuccess,
|
||||
);
|
||||
} else {
|
||||
_continueUsingTheApp(authenticationViewStateSuccess);
|
||||
}
|
||||
},
|
||||
onSuccessCallback: () => _deepLinksManager?.autoSignInViaDeepLink(
|
||||
deepLinkData: deepLinkData,
|
||||
openAppDeepLinkData: openAppDeepLinkData,
|
||||
onFailureCallback: () => _continueUsingTheApp(authenticationViewStateSuccess),
|
||||
onSuccessCallback: _handleAutoSignInViaDeepLinkSuccess,
|
||||
onAutoSignInSuccessCallback: _handleAutoSignInViaDeepLinkSuccess,
|
||||
),
|
||||
);
|
||||
} else {
|
||||
@@ -234,8 +272,19 @@ class HomeController extends ReloadableController {
|
||||
@override
|
||||
void handleFailureViewState(Failure failure) {
|
||||
if (_validateToHandleDeepLinksNotSignedIn(failure)) {
|
||||
_deepLinksManager!.handleDeepLinksWhenAppTerminatedNotSignedIn(
|
||||
onSuccessCallback: _handleAutoSignInViaDeepLinkSuccess,
|
||||
_deepLinksManager!.handleDeepLinksWhenAppTerminated(
|
||||
onSuccessCallback: (deepLinkData) {
|
||||
if (deepLinkData is OpenAppDeepLinkData) {
|
||||
_deepLinksManager!.handleOpenAppDeepLinks(
|
||||
openAppDeepLinkData: deepLinkData,
|
||||
isSignedIn: false,
|
||||
onFailureCallback: goToLogin,
|
||||
onAutoSignInSuccessCallback: _handleAutoSignInViaDeepLinkSuccess
|
||||
);
|
||||
} else {
|
||||
goToLogin();
|
||||
}
|
||||
},
|
||||
onFailureCallback: goToLogin,
|
||||
);
|
||||
} else {
|
||||
@@ -248,14 +297,25 @@ class HomeController extends ReloadableController {
|
||||
if (_validateToHandleDeepLinksSignedIn(success)) {
|
||||
final personalAccount = _getPersonalAccountFromViewStateSuccess(success);
|
||||
|
||||
_deepLinksManager!.handleDeepLinksWhenAppTerminatedSignedIn(
|
||||
username: personalAccount?.userName?.value,
|
||||
_deepLinksManager!.handleDeepLinksWhenAppTerminated(
|
||||
onSuccessCallback: (deepLinkData) {
|
||||
if (deepLinkData is OpenAppDeepLinkData) {
|
||||
_deepLinksManager!.handleOpenAppDeepLinks(
|
||||
openAppDeepLinkData: deepLinkData,
|
||||
isSignedIn: true,
|
||||
username: personalAccount?.userName,
|
||||
onConfirmLogoutCallback: (openAppDeepLinkData) => _handleLogOutAndSignInNewAccount(
|
||||
authenticationViewStateSuccess: success,
|
||||
personalAccount: personalAccount!,
|
||||
openAppDeepLinkData: openAppDeepLinkData,
|
||||
),
|
||||
onFailureCallback: () => _continueUsingTheApp(success),
|
||||
);
|
||||
} else {
|
||||
_continueUsingTheApp(success);
|
||||
}
|
||||
},
|
||||
onFailureCallback: () => _continueUsingTheApp(success),
|
||||
onConfirmCallback: (deepLinkData) => _handleLogOutAndSignInNewAccount(
|
||||
authenticationViewStateSuccess: success,
|
||||
personalAccount: personalAccount!,
|
||||
deepLinkData: deepLinkData,
|
||||
),
|
||||
);
|
||||
} else {
|
||||
super.handleSuccessViewState(success);
|
||||
|
||||
Reference in New Issue
Block a user