TF-2928 Use default browser confirm dialog when token expired
This commit is contained in:
@@ -27,7 +27,7 @@ import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart
|
||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||
import 'package:model/account/authentication_type.dart';
|
||||
import 'package:rule_filter/rule_filter/capability_rule_filter.dart';
|
||||
import 'package:tmail_ui_user/features/base/before_unload_manager.dart';
|
||||
import 'package:tmail_ui_user/features/base/before_reconnect_manager.dart';
|
||||
import 'package:tmail_ui_user/features/base/mixin/message_dialog_action_mixin.dart';
|
||||
import 'package:tmail_ui_user/features/base/mixin/popup_context_menu_action_mixin.dart';
|
||||
import 'package:tmail_ui_user/features/caching/caching_manager.dart';
|
||||
@@ -64,7 +64,7 @@ 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/utils/app_config.dart';
|
||||
import 'package:tmail_ui_user/main/utils/app_utils.dart';
|
||||
import 'package:universal_html/html.dart' as html;
|
||||
import 'package:tmail_ui_user/main/universal_import/html_stub.dart' as html;
|
||||
import 'package:uuid/uuid.dart';
|
||||
|
||||
abstract class BaseController extends GetxController
|
||||
@@ -90,8 +90,8 @@ abstract class BaseController extends GetxController
|
||||
GetStoredFirebaseRegistrationInteractor? _getStoredFirebaseRegistrationInteractor;
|
||||
DestroyFirebaseRegistrationInteractor? _destroyFirebaseRegistrationInteractor;
|
||||
|
||||
StreamSubscription<html.Event>? _subscriptionBrowserOnBeforeUnload;
|
||||
StreamSubscription<html.Event>? _subscriptionBrowserOnUnload;
|
||||
StreamSubscription<html.Event>? _onBeforeUnloadBrowserSubscription;
|
||||
StreamSubscription<html.Event>? _onUnloadBrowserSubscription;
|
||||
|
||||
final viewState = Rx<Either<Failure, Success>>(Right(UIState.idle));
|
||||
FpsCallback? fpsCallback;
|
||||
@@ -105,21 +105,21 @@ abstract class BaseController extends GetxController
|
||||
}
|
||||
|
||||
void _triggerBrowserReloadListener() {
|
||||
_subscriptionBrowserOnBeforeUnload =
|
||||
html.window.onBeforeUnload.listen(handleBrowserBeforeReloadAction);
|
||||
_subscriptionBrowserOnUnload =
|
||||
html.window.onUnload.listen(handleBrowserReloadAction);
|
||||
_onBeforeUnloadBrowserSubscription =
|
||||
html.window.onBeforeUnload.listen(onBeforeUnloadBrowserListener);
|
||||
_onUnloadBrowserSubscription =
|
||||
html.window.onUnload.listen(onUnloadBrowserListener);
|
||||
}
|
||||
|
||||
Future<void> handleBrowserBeforeReloadAction(html.Event event) async {}
|
||||
Future<void> onBeforeUnloadBrowserListener(html.Event event) async {}
|
||||
|
||||
Future<void> handleBrowserReloadAction(html.Event event) async {}
|
||||
Future<void> onUnloadBrowserListener(html.Event event) async {}
|
||||
|
||||
@override
|
||||
void onClose() {
|
||||
if (PlatformInfo.isWeb) {
|
||||
_subscriptionBrowserOnBeforeUnload?.cancel();
|
||||
_subscriptionBrowserOnUnload?.cancel();
|
||||
_onBeforeUnloadBrowserSubscription?.cancel();
|
||||
_onUnloadBrowserSubscription?.cancel();
|
||||
}
|
||||
super.onClose();
|
||||
}
|
||||
@@ -204,8 +204,8 @@ abstract class BaseController extends GetxController
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _executeBeforeUnloadAndLogOut() async {
|
||||
await executeBeforeUnload();
|
||||
Future<void> _executeBeforeReconnectAndLogOut() async {
|
||||
await executeBeforeReconnect();
|
||||
clearDataAndGoToLoginPage();
|
||||
}
|
||||
|
||||
@@ -234,7 +234,7 @@ abstract class BaseController extends GetxController
|
||||
void _handleBadCredentialsException() {
|
||||
if (PlatformInfo.isWeb) {
|
||||
if (currentContext == null) {
|
||||
_executeBeforeUnloadAndLogOut();
|
||||
_executeBeforeReconnectAndLogOut();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -245,11 +245,25 @@ abstract class BaseController extends GetxController
|
||||
title: AppLocalizations.of(currentContext!).sessionExpired,
|
||||
alignCenter: true,
|
||||
outsideDismissible: false,
|
||||
titleActionButtonMaxLines: 1,
|
||||
icon: SvgPicture.asset(imagePaths.icTMailLogo, width: 64, height: 64),
|
||||
paddingButton: const EdgeInsets.symmetric(horizontal: 8, vertical: 16),
|
||||
onConfirmAction: _executeBeforeUnloadAndLogOut);
|
||||
onConfirmAction: _executeBeforeReconnectAndLogOut);
|
||||
} else if (PlatformInfo.isMobile) {
|
||||
clearDataAndGoToLoginPage();
|
||||
if (currentContext == null) {
|
||||
clearDataAndGoToLoginPage();
|
||||
return;
|
||||
}
|
||||
|
||||
showConfirmDialogAction(
|
||||
currentContext!,
|
||||
AppLocalizations.of(currentContext!).dialogMessageSessionHasExpired,
|
||||
AppLocalizations.of(currentContext!).reconnect,
|
||||
title: AppLocalizations.of(currentContext!).sessionExpired,
|
||||
alignCenter: true,
|
||||
outsideDismissible: false,
|
||||
titleActionButtonMaxLines: 1,
|
||||
icon: SvgPicture.asset(imagePaths.icTMailLogo, width: 64, height: 64),
|
||||
onConfirmAction: clearDataAndGoToLoginPage);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -413,9 +427,9 @@ abstract class BaseController extends GetxController
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> executeBeforeUnload() async {
|
||||
final beforeUnloadManager = getBinding<BeforeUnloadManager>();
|
||||
await beforeUnloadManager?.executeBeforeUnloadListeners();
|
||||
Future<void> executeBeforeReconnect() async {
|
||||
final beforeReconnectManager = getBinding<BeforeReconnectManager>();
|
||||
await beforeReconnectManager?.executeBeforeReconnectListeners();
|
||||
}
|
||||
|
||||
Future<void> clearDataAndGoToLoginPage() async {
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
abstract class BeforeReconnectHandler {
|
||||
Future<void> onBeforeReconnect();
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
import 'package:core/utils/app_logger.dart';
|
||||
|
||||
typedef BeforeReconnectListener = Future<void> Function();
|
||||
|
||||
class BeforeReconnectManager {
|
||||
static final BeforeReconnectManager _instance = BeforeReconnectManager._();
|
||||
factory BeforeReconnectManager() => _instance;
|
||||
BeforeReconnectManager._();
|
||||
|
||||
final _listeners = <BeforeReconnectListener>[];
|
||||
|
||||
void addListener(BeforeReconnectListener listener) {
|
||||
_listeners.add(listener);
|
||||
}
|
||||
|
||||
void removeListener(BeforeReconnectListener listener) {
|
||||
_listeners.remove(listener);
|
||||
}
|
||||
|
||||
Future<void> executeBeforeReconnectListeners() async {
|
||||
await Future.wait(_listeners.map((listener) => listener.call()))
|
||||
.onError((error, stackTrace) => [logError(error.toString())]);
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
abstract class BeforeUnloadHandler {
|
||||
Future<void> onBeforeUnload();
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
import 'package:core/utils/app_logger.dart';
|
||||
|
||||
typedef BeforeUnloadListener = Future<void> Function();
|
||||
|
||||
class BeforeUnloadManager {
|
||||
static final BeforeUnloadManager _instance = BeforeUnloadManager._();
|
||||
factory BeforeUnloadManager() => _instance;
|
||||
BeforeUnloadManager._();
|
||||
|
||||
final _listeners = <BeforeUnloadListener>[];
|
||||
|
||||
void addListener(BeforeUnloadListener listener) {
|
||||
_listeners.add(listener);
|
||||
}
|
||||
|
||||
void removeListener(BeforeUnloadListener listener) {
|
||||
_listeners.remove(listener);
|
||||
}
|
||||
|
||||
Future<void> executeBeforeUnloadListeners() async {
|
||||
await Future.wait(_listeners.map((listener) => listener.call()))
|
||||
.onError((error, stackTrace) => [logError(error.toString())]);
|
||||
}
|
||||
}
|
||||
@@ -27,8 +27,8 @@ import 'package:receive_sharing_intent/receive_sharing_intent.dart';
|
||||
import 'package:rich_text_composer/rich_text_composer.dart';
|
||||
import 'package:super_tag_editor/tag_editor.dart';
|
||||
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
||||
import 'package:tmail_ui_user/features/base/before_unload_handler.dart';
|
||||
import 'package:tmail_ui_user/features/base/before_unload_manager.dart';
|
||||
import 'package:tmail_ui_user/features/base/before_reconnect_handler.dart';
|
||||
import 'package:tmail_ui_user/features/base/before_reconnect_manager.dart';
|
||||
import 'package:tmail_ui_user/features/base/state/base_ui_state.dart';
|
||||
import 'package:tmail_ui_user/features/base/state/button_state.dart';
|
||||
import 'package:tmail_ui_user/features/composer/domain/exceptions/compose_email_exception.dart';
|
||||
@@ -95,14 +95,14 @@ import 'package:tmail_ui_user/features/upload/presentation/controller/upload_con
|
||||
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/route_navigation.dart';
|
||||
import 'package:universal_html/html.dart' as html;
|
||||
import 'package:tmail_ui_user/main/universal_import/html_stub.dart' as html;
|
||||
|
||||
class ComposerController extends BaseController with DragDropFileMixin implements BeforeUnloadHandler {
|
||||
class ComposerController extends BaseController with DragDropFileMixin implements BeforeReconnectHandler {
|
||||
|
||||
final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
|
||||
final networkConnectionController = Get.find<NetworkConnectionController>();
|
||||
final _dynamicUrlInterceptors = Get.find<DynamicUrlInterceptors>();
|
||||
final _beforeUnloadManager = Get.find<BeforeUnloadManager>();
|
||||
final _beforeReconnectManager = Get.find<BeforeReconnectManager>();
|
||||
|
||||
final composerArguments = Rxn<ComposerArguments>();
|
||||
final isEnableEmailSendButton = false.obs;
|
||||
@@ -220,7 +220,7 @@ class ComposerController extends BaseController with DragDropFileMixin implement
|
||||
scrollControllerEmailAddress.addListener(_scrollControllerEmailAddressListener);
|
||||
_listenStreamEvent();
|
||||
_getAlwaysReadReceiptSetting();
|
||||
_beforeUnloadManager.addListener(onBeforeUnload);
|
||||
_beforeReconnectManager.addListener(onBeforeReconnect);
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -250,7 +250,7 @@ class ComposerController extends BaseController with DragDropFileMixin implement
|
||||
_subscriptionOnDrop?.cancel();
|
||||
subjectEmailInputFocusNode?.removeListener(_subjectEmailInputFocusListener);
|
||||
_composerCacheListener?.cancel();
|
||||
_beforeUnloadManager.removeListener(onBeforeUnload);
|
||||
_beforeReconnectManager.removeListener(onBeforeReconnect);
|
||||
if (PlatformInfo.isWeb) {
|
||||
richTextWebController = null;
|
||||
} else {
|
||||
@@ -360,7 +360,7 @@ class ComposerController extends BaseController with DragDropFileMixin implement
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> handleBrowserReloadAction(html.Event event) async {
|
||||
Future<void> onUnloadBrowserListener(html.Event event) async {
|
||||
await _removeComposerCacheOnWebInteractor.execute();
|
||||
await _saveComposerCacheOnWebAction();
|
||||
}
|
||||
@@ -2302,7 +2302,7 @@ class ComposerController extends BaseController with DragDropFileMixin implement
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> onBeforeUnload() async {
|
||||
Future<void> onBeforeReconnect() async {
|
||||
if (mailboxDashBoardController.accountId.value != null &&
|
||||
mailboxDashBoardController.sessionCurrent?.username != null
|
||||
) {
|
||||
|
||||
+2
-2
@@ -151,9 +151,9 @@ import 'package:tmail_ui_user/main/routes/dialog_router.dart';
|
||||
import 'package:tmail_ui_user/main/routes/navigation_router.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/universal_import/html_stub.dart' as html;
|
||||
import 'package:tmail_ui_user/main/utils/email_receive_manager.dart';
|
||||
import 'package:tmail_ui_user/main/utils/ios_notification_manager.dart';
|
||||
import 'package:universal_html/html.dart' as html;
|
||||
import 'package:uuid/uuid.dart';
|
||||
|
||||
class MailboxDashBoardController extends ReloadableController {
|
||||
@@ -417,7 +417,7 @@ class MailboxDashBoardController extends ReloadableController {
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> handleBrowserBeforeReloadAction(html.Event event) async {
|
||||
Future<void> onBeforeUnloadBrowserListener(html.Event event) async {
|
||||
if (event is html.BeforeUnloadEvent
|
||||
&& composerOverlayState.value == ComposerOverlayState.active) {
|
||||
event.preventDefault();
|
||||
|
||||
Reference in New Issue
Block a user