diff --git a/core/lib/presentation/views/dialog/confirm_dialog_button.dart b/core/lib/presentation/views/dialog/confirm_dialog_button.dart new file mode 100644 index 000000000..03e8a35f2 --- /dev/null +++ b/core/lib/presentation/views/dialog/confirm_dialog_button.dart @@ -0,0 +1,60 @@ + +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/material.dart'; + +class ConfirmDialogButton extends StatelessWidget { + + final String label; + final double? borderRadius; + final Color? backgroundColor; + final EdgeInsetsGeometry? padding; + final int? maxLines; + final TextStyle? textStyle; + final VoidCallback? onTapAction; + + const ConfirmDialogButton({ + super.key, + required this.label, + this.borderRadius, + this.backgroundColor, + this.padding, + this.maxLines, + this.textStyle, + this.onTapAction + }); + + @override + Widget build(BuildContext context) { + return Material( + type: MaterialType.transparency, + child: InkWell( + onTap: onTapAction, + borderRadius: BorderRadius.all(Radius.circular(borderRadius ?? 10)), + child: Container( + width: double.infinity, + height: maxLines == 1 ? 44 : null, + decoration: BoxDecoration( + color: backgroundColor ?? AppColor.primaryColor, + borderRadius: BorderRadius.all(Radius.circular(borderRadius ?? 10)), + ), + alignment: Alignment.center, + padding: maxLines == 1 + ? null + : padding ?? const EdgeInsets.symmetric(horizontal: 8, vertical: 12), + child: Text( + label, + textAlign: TextAlign.center, + maxLines: maxLines, + overflow: TextOverflow.ellipsis, + style: textStyle ?? Theme.of(context).textTheme.bodyMedium?.copyWith( + fontSize: 16, + height: 20 / 16, + fontWeight: FontWeight.w500, + color: Colors.white + ) + ), + ), + ), + ); + } +} diff --git a/core/lib/presentation/views/dialog/confirmation_dialog_builder.dart b/core/lib/presentation/views/dialog/confirmation_dialog_builder.dart index 667274418..8cb4d41c7 100644 --- a/core/lib/presentation/views/dialog/confirmation_dialog_builder.dart +++ b/core/lib/presentation/views/dialog/confirmation_dialog_builder.dart @@ -1,5 +1,6 @@ import 'package:core/core.dart'; +import 'package:core/presentation/views/dialog/confirm_dialog_button.dart'; import 'package:flutter/material.dart'; typedef OnConfirmButtonAction = void Function(); @@ -237,22 +238,26 @@ class ConfirmDialogBuilder { if (_cancelText.isNotEmpty) Padding( padding: const EdgeInsetsDirectional.only(top: 8, start: 16, end: 16), - child: _buildButton( - name: _cancelText, - bgColor: _colorCancelButton, - radius: _radiusButton, + child: ConfirmDialogButton( + label: _cancelText, + backgroundColor: _colorCancelButton, + borderRadius: _radiusButton, textStyle: _styleTextCancelButton, - action: _onCancelButtonAction), + padding: _paddingButton, + maxLines: titleActionButtonMaxLines, + onTapAction: _onCancelButtonAction), ), if (_confirmText.isNotEmpty) Padding( padding: const EdgeInsetsDirectional.only(top: 8, start: 16, end: 16), - child: _buildButton( - name: _confirmText, - bgColor: _colorConfirmButton, - radius: _radiusButton, + child: ConfirmDialogButton( + label: _confirmText, + backgroundColor: _colorConfirmButton, + borderRadius: _radiusButton, textStyle: _styleTextConfirmButton, - action: _onConfirmButtonAction), + padding: _paddingButton, + maxLines: titleActionButtonMaxLines, + onTapAction: _onConfirmButtonAction), ), const SizedBox(height: 16), ] @@ -262,59 +267,28 @@ class ConfirmDialogBuilder { child: Row( children: [ if (_cancelText.isNotEmpty) - Expanded(child: _buildButton( - name: _cancelText, - bgColor: _colorCancelButton, - radius: _radiusButton, - textStyle: _styleTextCancelButton, - action: _onCancelButtonAction)), + Expanded(child: ConfirmDialogButton( + label: _cancelText, + backgroundColor: _colorCancelButton, + borderRadius: _radiusButton, + textStyle: _styleTextCancelButton, + padding: _paddingButton, + maxLines: titleActionButtonMaxLines, + onTapAction: _onCancelButtonAction)), if (_confirmText.isNotEmpty && _cancelText.isNotEmpty) const SizedBox(width: 8), if (_confirmText.isNotEmpty) - Expanded(child: _buildButton( - name: _confirmText, - bgColor: _colorConfirmButton, - radius: _radiusButton, - textStyle: _styleTextConfirmButton, - action: _onConfirmButtonAction)) + Expanded(child: ConfirmDialogButton( + label: _confirmText, + backgroundColor: _colorConfirmButton, + borderRadius: _radiusButton, + textStyle: _styleTextConfirmButton, + padding: _paddingButton, + maxLines: titleActionButtonMaxLines, + onTapAction: _onConfirmButtonAction,)) ] )) ] ) ); } - - Widget _buildButton({ - String? name, - TextStyle? textStyle, - Color? bgColor, - double? radius, - Function()? action - }) { - return SizedBox( - width: double.infinity, - height: titleActionButtonMaxLines == 1 ? 45 : null, - child: ElevatedButton( - onPressed: action, - style: ElevatedButton.styleFrom( - foregroundColor: bgColor ?? AppColor.colorTextButton, - backgroundColor: bgColor ?? AppColor.colorTextButton, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(radius ?? 8), - side: BorderSide(width: 0, color: bgColor ?? AppColor.colorTextButton), - ), - padding: _paddingButton ?? const EdgeInsets.all(8), - elevation: 0 - ), - child: Text( - name ?? '', - textAlign: TextAlign.center, - maxLines: titleActionButtonMaxLines, - style: textStyle ?? const TextStyle( - fontSize: 17, - fontWeight: FontWeight.w500, - color: Colors.white - )), - ), - ); - } } diff --git a/lib/features/base/base_controller.dart b/lib/features/base/base_controller.dart index f24dd2b48..aa67abef3 100644 --- a/lib/features/base/base_controller.dart +++ b/lib/features/base/base_controller.dart @@ -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? _subscriptionBrowserOnBeforeUnload; - StreamSubscription? _subscriptionBrowserOnUnload; + StreamSubscription? _onBeforeUnloadBrowserSubscription; + StreamSubscription? _onUnloadBrowserSubscription; final viewState = Rx>(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 handleBrowserBeforeReloadAction(html.Event event) async {} + Future onBeforeUnloadBrowserListener(html.Event event) async {} - Future handleBrowserReloadAction(html.Event event) async {} + Future 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 _executeBeforeUnloadAndLogOut() async { - await executeBeforeUnload(); + Future _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 executeBeforeUnload() async { - final beforeUnloadManager = getBinding(); - await beforeUnloadManager?.executeBeforeUnloadListeners(); + Future executeBeforeReconnect() async { + final beforeReconnectManager = getBinding(); + await beforeReconnectManager?.executeBeforeReconnectListeners(); } Future clearDataAndGoToLoginPage() async { diff --git a/lib/features/base/before_reconnect_handler.dart b/lib/features/base/before_reconnect_handler.dart new file mode 100644 index 000000000..139d4fcbe --- /dev/null +++ b/lib/features/base/before_reconnect_handler.dart @@ -0,0 +1,3 @@ +abstract class BeforeReconnectHandler { + Future onBeforeReconnect(); +} \ No newline at end of file diff --git a/lib/features/base/before_reconnect_manager.dart b/lib/features/base/before_reconnect_manager.dart new file mode 100644 index 000000000..99b34a027 --- /dev/null +++ b/lib/features/base/before_reconnect_manager.dart @@ -0,0 +1,24 @@ +import 'package:core/utils/app_logger.dart'; + +typedef BeforeReconnectListener = Future Function(); + +class BeforeReconnectManager { + static final BeforeReconnectManager _instance = BeforeReconnectManager._(); + factory BeforeReconnectManager() => _instance; + BeforeReconnectManager._(); + + final _listeners = []; + + void addListener(BeforeReconnectListener listener) { + _listeners.add(listener); + } + + void removeListener(BeforeReconnectListener listener) { + _listeners.remove(listener); + } + + Future executeBeforeReconnectListeners() async { + await Future.wait(_listeners.map((listener) => listener.call())) + .onError((error, stackTrace) => [logError(error.toString())]); + } +} \ No newline at end of file diff --git a/lib/features/base/before_unload_handler.dart b/lib/features/base/before_unload_handler.dart deleted file mode 100644 index 2c4bdc110..000000000 --- a/lib/features/base/before_unload_handler.dart +++ /dev/null @@ -1,3 +0,0 @@ -abstract class BeforeUnloadHandler { - Future onBeforeUnload(); -} \ No newline at end of file diff --git a/lib/features/base/before_unload_manager.dart b/lib/features/base/before_unload_manager.dart deleted file mode 100644 index 6b45ffad4..000000000 --- a/lib/features/base/before_unload_manager.dart +++ /dev/null @@ -1,24 +0,0 @@ -import 'package:core/utils/app_logger.dart'; - -typedef BeforeUnloadListener = Future Function(); - -class BeforeUnloadManager { - static final BeforeUnloadManager _instance = BeforeUnloadManager._(); - factory BeforeUnloadManager() => _instance; - BeforeUnloadManager._(); - - final _listeners = []; - - void addListener(BeforeUnloadListener listener) { - _listeners.add(listener); - } - - void removeListener(BeforeUnloadListener listener) { - _listeners.remove(listener); - } - - Future executeBeforeUnloadListeners() async { - await Future.wait(_listeners.map((listener) => listener.call())) - .onError((error, stackTrace) => [logError(error.toString())]); - } -} \ No newline at end of file diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index 452754248..11f087024 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -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(); final networkConnectionController = Get.find(); final _dynamicUrlInterceptors = Get.find(); - final _beforeUnloadManager = Get.find(); + final _beforeReconnectManager = Get.find(); final composerArguments = Rxn(); 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 handleBrowserReloadAction(html.Event event) async { + Future onUnloadBrowserListener(html.Event event) async { await _removeComposerCacheOnWebInteractor.execute(); await _saveComposerCacheOnWebAction(); } @@ -2302,7 +2302,7 @@ class ComposerController extends BaseController with DragDropFileMixin implement } @override - Future onBeforeUnload() async { + Future onBeforeReconnect() async { if (mailboxDashBoardController.accountId.value != null && mailboxDashBoardController.sessionCurrent?.username != null ) { diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index 5e7837de5..a1272447e 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -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 handleBrowserBeforeReloadAction(html.Event event) async { + Future onBeforeUnloadBrowserListener(html.Event event) async { if (event is html.BeforeUnloadEvent && composerOverlayState.value == ComposerOverlayState.active) { event.preventDefault(); diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index 4d6bd53f3..72f7bf426 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2024-07-12T12:54:25.065342", + "@@last_modified": "2024-07-17T01:36:03.095458", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", diff --git a/lib/main/bindings/core/core_bindings.dart b/lib/main/bindings/core/core_bindings.dart index 069808895..4eda5e448 100644 --- a/lib/main/bindings/core/core_bindings.dart +++ b/lib/main/bindings/core/core_bindings.dart @@ -12,7 +12,7 @@ import 'package:device_info_plus/device_info_plus.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:get/get.dart'; import 'package:shared_preferences/shared_preferences.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/sending_queue/presentation/utils/sending_queue_isolate_manager.dart'; import 'package:tmail_ui_user/main/utils/app_config.dart'; import 'package:tmail_ui_user/main/utils/email_receive_manager.dart'; @@ -66,7 +66,7 @@ class CoreBindings extends Bindings { Get.put(FileUtils()); Get.put(PrintUtils()); Get.put(ApplicationManager(Get.find())); - Get.put(BeforeUnloadManager()); + Get.put(BeforeReconnectManager()); if (PlatformInfo.isIOS) { Get.put(IOSNotificationManager()); } diff --git a/lib/main/universal_import/html_io.dart b/lib/main/universal_import/html_io.dart new file mode 100644 index 000000000..47966813a --- /dev/null +++ b/lib/main/universal_import/html_io.dart @@ -0,0 +1 @@ +export 'package:universal_html/src/html.dart'; \ No newline at end of file diff --git a/lib/main/universal_import/html_stub.dart b/lib/main/universal_import/html_stub.dart new file mode 100644 index 000000000..f6130709a --- /dev/null +++ b/lib/main/universal_import/html_stub.dart @@ -0,0 +1 @@ +export 'html_io.dart' if (dart.library.html) 'html_web.dart'; \ No newline at end of file diff --git a/lib/main/universal_import/html_web.dart b/lib/main/universal_import/html_web.dart new file mode 100644 index 000000000..2e56e820e --- /dev/null +++ b/lib/main/universal_import/html_web.dart @@ -0,0 +1 @@ +export 'package:universal_html/html.dart'; \ No newline at end of file diff --git a/test/features/base/before_unload_manager_test.dart b/test/features/base/before_reconnect_manager_test.dart similarity index 63% rename from test/features/base/before_unload_manager_test.dart rename to test/features/base/before_reconnect_manager_test.dart index d5c4fb1d3..406a0849b 100644 --- a/test/features/base/before_unload_manager_test.dart +++ b/test/features/base/before_reconnect_manager_test.dart @@ -1,9 +1,9 @@ import 'package:flutter_test/flutter_test.dart'; -import 'package:tmail_ui_user/features/base/before_unload_manager.dart'; +import 'package:tmail_ui_user/features/base/before_reconnect_manager.dart'; void main() { - group('before unload manager test:', () { + group('before reconnect manager test:', () { test( 'should finish all futures ' 'when no future fails', @@ -13,13 +13,13 @@ void main() { future1Second() => Future.delayed(const Duration(seconds: 1), () => result.add(1)); future2Second() => Future.delayed(const Duration(seconds: 2), () => result.add(2)); future3Second() => Future.delayed(const Duration(seconds: 3), () => result.add(3)); - final beforeUnloadManager = BeforeUnloadManager(); - beforeUnloadManager.addListener(future1Second); - beforeUnloadManager.addListener(future2Second); - beforeUnloadManager.addListener(future3Second); + final beforeReconnectManager = BeforeReconnectManager(); + beforeReconnectManager.addListener(future1Second); + beforeReconnectManager.addListener(future2Second); + beforeReconnectManager.addListener(future3Second); // act - await beforeUnloadManager.executeBeforeUnloadListeners(); + await beforeReconnectManager.executeBeforeReconnectListeners(); // assert expect(result.length, 3); @@ -35,13 +35,13 @@ void main() { future1Second() => Future.delayed(const Duration(seconds: 1), () => result.add(1)); future2Second() => Future.delayed(const Duration(seconds: 2), () => throw exception); future3Second() => Future.delayed(const Duration(seconds: 3), () => result.add(3)); - final beforeUnloadManager = BeforeUnloadManager(); - beforeUnloadManager.addListener(future1Second); - beforeUnloadManager.addListener(future2Second); - beforeUnloadManager.addListener(future3Second); + final beforeReconnectManager = BeforeReconnectManager(); + beforeReconnectManager.addListener(future1Second); + beforeReconnectManager.addListener(future2Second); + beforeReconnectManager.addListener(future3Second); // act - await beforeUnloadManager.executeBeforeUnloadListeners(); + await beforeReconnectManager.executeBeforeReconnectListeners(); // assert expect(result.length, 2); @@ -58,13 +58,13 @@ void main() { future1Second() => Future.delayed(const Duration(seconds: 1), () => throw exception1); future2Second() => Future.delayed(const Duration(seconds: 2), () => throw exception2); future3Second() => Future.delayed(const Duration(seconds: 3), () => result.add(3)); - final beforeUnloadManager = BeforeUnloadManager(); - beforeUnloadManager.addListener(future1Second); - beforeUnloadManager.addListener(future2Second); - beforeUnloadManager.addListener(future3Second); + final beforeReconnectManager = BeforeReconnectManager(); + beforeReconnectManager.addListener(future1Second); + beforeReconnectManager.addListener(future2Second); + beforeReconnectManager.addListener(future3Second); // act - await beforeUnloadManager.executeBeforeUnloadListeners(); + await beforeReconnectManager.executeBeforeReconnectListeners(); // assert expect(result.length, 1); @@ -81,13 +81,13 @@ void main() { future1Second() => Future.delayed(const Duration(seconds: 1), () => result.add(1)); future2Second() => Future.delayed(const Duration(seconds: 2), () => throw exception2); future3Second() => Future.delayed(const Duration(seconds: 3), () => throw exception3); - final beforeUnloadManager = BeforeUnloadManager(); - beforeUnloadManager.addListener(future1Second); - beforeUnloadManager.addListener(future2Second); - beforeUnloadManager.addListener(future3Second); + final beforeReconnectManager = BeforeReconnectManager(); + beforeReconnectManager.addListener(future1Second); + beforeReconnectManager.addListener(future2Second); + beforeReconnectManager.addListener(future3Second); // act - await beforeUnloadManager.executeBeforeUnloadListeners(); + await beforeReconnectManager.executeBeforeReconnectListeners(); // assert expect(result.length, 1);