TF-3911 Support mail keyboard shortcut actions in email list view on web

This commit is contained in:
dab246
2025-07-29 03:25:26 +07:00
committed by Dat H. Pham
parent b2989521d9
commit 226f6520a7
15 changed files with 515 additions and 266 deletions
@@ -157,4 +157,6 @@ class SynchronizeEmailSortOrderAction extends DashBoardAction {
List<Object?> get props => [emailSortOrderType];
}
class ReclaimMailListKeyboardShortcutFocusAction extends DashBoardAction {}
class ReclaimMailListKeyboardShortcutFocusAction extends DashBoardAction {}
class ClearMailListKeyboardShortcutFocusAction extends DashBoardAction {}
@@ -37,7 +37,7 @@ import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/restore_deleted_message_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/unsubscribe_email_interactor.dart';
import 'package:tmail_ui_user/features/email/presentation/bindings/email_interactor_bindings.dart';
import 'package:tmail_ui_user/features/email/presentation/bindings/email_bindings.dart';
import 'package:tmail_ui_user/features/home/domain/repository/session_repository.dart';
import 'package:tmail_ui_user/features/home/domain/usecases/store_session_interactor.dart';
import 'package:tmail_ui_user/features/identity_creator/data/datasource/identity_creator_data_source.dart';
@@ -155,7 +155,7 @@ class MailboxDashBoardBindings extends BaseBindings {
SendingQueueBindings().dependencies();
MailboxBindings().dependencies();
ThreadBindings().dependencies();
EmailInteractorBindings().dependencies();
EmailBindings().dependencies();
SearchEmailBindings().dependencies();
QuotasBindings().dependencies();
ThreadDetailBindings().dependencies();
@@ -3286,6 +3286,9 @@ class MailboxDashBoardController extends ReloadableController
bool get isEmailOpened =>
dashboardRoute.value == DashboardRoutes.threadDetailed;
bool get isEmailListDisplayed =>
dashboardRoute.value == DashboardRoutes.thread;
@override
void onClose() {
if (PlatformInfo.isWeb) {
@@ -1,6 +1,7 @@
import 'package:core/utils/app_logger.dart';
import 'package:get/get_rx/src/rx_workers/rx_workers.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/features/thread_detail/presentation/action/thread_detail_ui_action.dart';
@@ -14,7 +15,7 @@ extension HandleReactiveObxVariableExtension on MailboxDashBoardController {
searchInputFocusWorker = ever(
searchController.isSearchInputFocused,
_onSearchInputFocusChanged
onSearchInputFocusChanged
);
}
@@ -22,13 +23,17 @@ extension HandleReactiveObxVariableExtension on MailboxDashBoardController {
log('$runtimeType::_onAdvancedSearchVisibleChanged: visible is $visible | isEmailOpened = $isEmailOpened');
if (isEmailOpened) {
_performThreadDetailUIActionWhenEmailOpened(visible);
} else if (isEmailListDisplayed) {
_performDashboardUIActionWhenEmailListDisplayed(visible);
}
}
void _onSearchInputFocusChanged(bool focused) {
void onSearchInputFocusChanged(bool focused) {
log('$runtimeType::_onSearchInputFocusChanged: focused is $focused | isEmailOpened = $isEmailOpened');
if (isEmailOpened) {
_performThreadDetailUIActionWhenEmailOpened(focused);
} else if (isEmailListDisplayed) {
_performDashboardUIActionWhenEmailListDisplayed(focused);
}
}
@@ -40,6 +45,14 @@ extension HandleReactiveObxVariableExtension on MailboxDashBoardController {
dispatchThreadDetailUIAction(emailAction);
}
void _performDashboardUIActionWhenEmailListDisplayed(bool focused) {
final dashboardAction = focused
? ClearMailListKeyboardShortcutFocusAction()
: ReclaimMailListKeyboardShortcutFocusAction();
dispatchAction(dashboardAction);
}
void disposeReactiveObxVariableListener() {
advancedSearchVisibleWorker?.dispose();
advancedSearchVisibleWorker = null;