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

This commit is contained in:
dab246
2024-11-22 23:30:37 +07:00
committed by Dat H. Pham
parent 8022559bc2
commit 223fdbf1fb
59 changed files with 1058 additions and 429 deletions
@@ -8,6 +8,7 @@ import 'package:email_recovery/email_recovery/email_recovery_action.dart';
import 'package:email_recovery/email_recovery/email_recovery_action_id.dart';
import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
@@ -74,9 +75,12 @@ import 'package:tmail_ui_user/features/email/presentation/model/composer_argumen
import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart';
import 'package:tmail_ui_user/features/email_recovery/presentation/model/email_recovery_arguments.dart';
import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.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/usecases/store_session_interactor.dart';
import 'package:tmail_ui_user/features/identity_creator/domain/state/get_identity_cache_on_web_state.dart';
import 'package:tmail_ui_user/features/identity_creator/domain/usecase/get_identity_cache_on_web_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/exceptions/logout_exception.dart';
import 'package:tmail_ui_user/features/login/presentation/model/login_navigate_arguments.dart';
import 'package:tmail_ui_user/features/mailbox/domain/exceptions/mailbox_exception.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read_state.dart';
@@ -157,6 +161,9 @@ import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_multiple_e
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_star_multiple_email_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.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/deep_links/open_app_deep_link_data.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/app_routes.dart';
@@ -254,6 +261,8 @@ class MailboxDashBoardController extends ReloadableController
StreamSubscription? _receivingFileSharingStreamSubscription;
StreamSubscription? _currentEmailIdInNotificationIOSStreamSubscription;
bool _isFirstSessionLoad = false;
DeepLinksManager? _deepLinksManager;
StreamSubscription<DeepLinkData?>? _deepLinkDataStreamSubscription;
final StreamController<Either<Failure, Success>> _progressStateController =
StreamController<Either<Failure, Success>>.broadcast();
@@ -301,6 +310,7 @@ class MailboxDashBoardController extends ReloadableController
void onInit() {
if (PlatformInfo.isMobile) {
_registerReceivingFileSharingStream();
_registerDeepLinks();
}
_registerStreamListener();
BackButtonInterceptor.add(_onBackButtonInterceptor, name: AppRoutes.dashboard);
@@ -467,6 +477,8 @@ class MailboxDashBoardController extends ReloadableController
@override
void handleUrgentExceptionOnMobile({Failure? failure, Exception? exception}) {
SmartDialog.dismiss();
if (failure is SendEmailFailure && exception is NoNetworkError) {
_storeSendingEmailInCaseOfSendingFailureInMobile(failure);
} else {
@@ -563,6 +575,71 @@ class MailboxDashBoardController extends ReloadableController
);
}
void _registerDeepLinks() {
_deepLinksManager = getBinding<DeepLinksManager>();
_deepLinksManager?.clearPendingDeepLinkData();
_deepLinkDataStreamSubscription = _deepLinksManager
?.pendingDeepLinkData.stream
.listen(_handlePendingDeepLinkDataStream);
}
void _handlePendingDeepLinkDataStream(DeepLinkData? deepLinkData) {
log('MailboxDashBoardController::_handlePendingDeepLinkDataStream:DeepLinkData = $deepLinkData');
_deepLinksManager?.handleDeepLinksWhenAppRunning(
deepLinkData: deepLinkData,
onSuccessCallback: (deepLinkData) {
if (deepLinkData is! OpenAppDeepLinkData) return;
_deepLinksManager?.handleOpenAppDeepLinks(
openAppDeepLinkData: deepLinkData,
isSignedIn: true,
username: sessionCurrent?.username,
onConfirmLogoutCallback: _handleLogOutAndSignInNewAccount,
);
},
);
}
void _handleLogOutAndSignInNewAccount(OpenAppDeepLinkData openAppDeepLinkData) {
if (sessionCurrent == null || accountId.value == null) return;
if (currentContext != null) {
SmartDialog.showLoading(msg: AppLocalizations.of(currentContext!).loadingPleaseWait);
}
logoutToSignInNewAccount(
session: sessionCurrent!,
accountId: accountId.value!,
onFailureCallback: ({exception}) {
if (exception is UserCancelledLogoutOIDCFlowException) {
_deepLinksManager?.autoSignInViaDeepLink(
openAppDeepLinkData: openAppDeepLinkData,
onFailureCallback: SmartDialog.dismiss,
onAutoSignInSuccessCallback: _handleAutoSignInViaDeepLinkSuccess,
);
} else {
SmartDialog.dismiss();
}
},
onSuccessCallback: () => _deepLinksManager?.autoSignInViaDeepLink(
openAppDeepLinkData: openAppDeepLinkData,
onFailureCallback: SmartDialog.dismiss,
onAutoSignInSuccessCallback: _handleAutoSignInViaDeepLinkSuccess,
),
);
}
void _handleAutoSignInViaDeepLinkSuccess(AutoSignInViaDeepLinkSuccess success) {
SmartDialog.dismiss();
pushAndPopAll(
AppRoutes.home,
arguments: LoginNavigateArguments.autoSignIn(
autoSignInViaDeepLinkSuccess: success,
),
);
}
void _registerPendingCurrentEmailIdInNotification() {
_iosNotificationManager = getBinding<IOSNotificationManager>();
_currentEmailIdInNotificationIOSStreamSubscription = _iosNotificationManager
@@ -1625,6 +1702,8 @@ class MailboxDashBoardController extends ReloadableController
@override
void handleReloaded(Session session) {
log('MailboxDashBoardController::handleReloaded():');
SmartDialog.dismiss();
_getRouteParameters();
_setUpComponentsFromSession(session);
if (PlatformInfo.isWeb) {
@@ -3144,6 +3223,7 @@ class MailboxDashBoardController extends ReloadableController
_pendingSharedFileInfoSubscription?.cancel();
_receivingFileSharingStreamSubscription?.cancel();
_emailReceiveManager.closeEmailReceiveManagerStream();
_deepLinkDataStreamSubscription?.cancel();
}
_progressStateController.close();
_refreshActionEventController.close();