From fd7e349929a39b567d9103d883b1489c4369670e Mon Sep 17 00:00:00 2001 From: dab246 Date: Mon, 4 Aug 2025 13:18:09 +0700 Subject: [PATCH] TF-3911 Support keyboard shortcut actions `ESC` to close multiple composer on web Signed-off-by: dab246 --- ...e_keyboard_shortcut_actions_extension.dart | 3 --- .../manager/composer_manager.dart | 24 +++++++++++++++++++ .../open_and_close_composer_extension.dart | 10 +++++--- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/lib/features/composer/presentation/extensions/handle_keyboard_shortcut_actions_extension.dart b/lib/features/composer/presentation/extensions/handle_keyboard_shortcut_actions_extension.dart index af226acde..f6db97185 100644 --- a/lib/features/composer/presentation/extensions/handle_keyboard_shortcut_actions_extension.dart +++ b/lib/features/composer/presentation/extensions/handle_keyboard_shortcut_actions_extension.dart @@ -19,9 +19,6 @@ extension HandleKeyboardShortcutActionsExtension on ComposerController { void onKeyboardShortcutInit() { if (PlatformInfo.isWeb) { keyboardShortcutFocusNode = FocusNode(); - keyboardShortcutFocusNode?.addListener(() { - log('$runtimeType::onKeyboardShortcutInit: keyboardShortcutFocusNode: ${keyboardShortcutFocusNode?.hasFocus}'); - }); } } diff --git a/lib/features/composer/presentation/manager/composer_manager.dart b/lib/features/composer/presentation/manager/composer_manager.dart index ee2e276c7..572962ef0 100644 --- a/lib/features/composer/presentation/manager/composer_manager.dart +++ b/lib/features/composer/presentation/manager/composer_manager.dart @@ -7,6 +7,7 @@ import 'package:get/get.dart'; import 'package:tmail_ui_user/features/composer/presentation/composer_bindings.dart'; import 'package:tmail_ui_user/features/composer/presentation/composer_controller.dart'; import 'package:tmail_ui_user/features/composer/presentation/composer_view_web.dart'; +import 'package:tmail_ui_user/features/composer/presentation/extensions/handle_keyboard_shortcut_actions_extension.dart'; import 'package:tmail_ui_user/features/composer/presentation/extensions/update_screen_display_mode_extension.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/screen_display_mode.dart'; import 'package:tmail_ui_user/features/composer/presentation/styles/composer_style.dart'; @@ -249,6 +250,14 @@ class ComposerManager extends GetxController { return composerIdsQueue.every((id) => getComposerView(id).controller.isHiddenScreen); } + bool get isAnyComposerOpened { + final isComposerOpened = composerIdsQueue.any((id) { + final controller = getComposerView(id).controller; + return controller.isNormalScreen || controller.isFullScreen; + }); + return hasComposer && isComposerOpened; + } + List get hiddenComposerIds { return composerIdsQueue .where((id) => getComposerView(id).controller.isHiddenScreen) @@ -293,6 +302,21 @@ class ComposerManager extends GetxController { ComposerView getComposerView(String id) => composers[id]!; + void refocusKeyboardShortcutFocusFirstComposer() { + if (!hasComposer) return; + + final listComposerIdOpened = composerIdsQueue.where((id) { + final controller = getComposerView(id).controller; + return controller.isNormalScreen || controller.isFullScreen; + }); + + if (listComposerIdOpened.isNotEmpty) { + final firstComposerIdOpened = listComposerIdOpened.first; + final composerView = getComposerView(firstComposerIdOpened); + composerView.controller.refocusKeyboardShortcutFocus(); + } + } + @override void onClose() { composerIdsQueue.clear(); diff --git a/lib/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart b/lib/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart index 60f55dbaa..03f36bfd6 100644 --- a/lib/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart +++ b/lib/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart @@ -113,11 +113,15 @@ extension OpenAndCloseComposerExtension on MailboxDashBoardController { twakeAppManager.setHasComposer(false); } - dispatchThreadDetailUIAction(ReclaimMailViewKeyboardShortcutFocusAction()); - dispatchAction(ReclaimMailListKeyboardShortcutFocusAction()); - _handleResultAfterCloseComposer(result); + if (!composerManager.isAnyComposerOpened) { + dispatchThreadDetailUIAction(ReclaimMailViewKeyboardShortcutFocusAction()); + dispatchAction(ReclaimMailListKeyboardShortcutFocusAction()); + } else { + composerManager.refocusKeyboardShortcutFocusFirstComposer(); + } + if (composerId != null) { await removeComposerCacheByIdOnWeb(composerId); }