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
@@ -1,6 +1,7 @@
import 'package:core/utils/app_logger.dart';
import 'package:flutter/services.dart';
import 'package:tmail_ui_user/features/base/extensions/logical_key_set_helper.dart';
import 'package:tmail_ui_user/features/base/shortcut/mail/mail_list_action_shortcut_type.dart';
import 'package:tmail_ui_user/features/base/shortcut/mail/mail_view_action_shortcut_type.dart';
class AppShortcutManager {
@@ -24,4 +25,21 @@ class AppShortcutManager {
return null;
}
}
static MailListActionShortcutType? getMailListActionFromEvent(KeyEvent event) {
final keysPressed = HardwareKeyboard.instance.logicalKeysPressed;
log('AppShortcutManager::getMailListActionFromEvent: Keys pressed: $keysPressed');
if (keysPressed.isOnly(LogicalKeyboardKey.delete) ||
keysPressed.isOnly(LogicalKeyboardKey.backspace)) {
return MailListActionShortcutType.delete;
} else if (keysPressed.isOnly(LogicalKeyboardKey.keyN)) {
return MailListActionShortcutType.newMessage;
} else if (keysPressed.isOnly(LogicalKeyboardKey.keyQ)) {
return MailListActionShortcutType.markAsRead;
} else if (keysPressed.isOnly(LogicalKeyboardKey.keyU)) {
return MailListActionShortcutType.markAsUnread;
} else {
return null;
}
}
}
@@ -0,0 +1,40 @@
import 'package:model/email/email_action_type.dart';
import 'package:model/email/presentation_email.dart';
import 'package:model/extensions/list_presentation_email_extension.dart';
import 'package:model/extensions/presentation_mailbox_extension.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
enum MailListActionShortcutType {
delete,
newMessage,
markAsRead,
markAsUnread;
EmailActionType? getEmailActionType({
required List<PresentationEmail> selectedEmails,
PresentationMailbox? selectedMailbox,
}) {
if (selectedEmails.isEmpty &&
this != MailListActionShortcutType.newMessage) {
return null;
}
switch(this) {
case MailListActionShortcutType.delete:
return selectedMailbox?.isDeletePermanentlyEnabled == true
? EmailActionType.deletePermanently
: EmailActionType.moveToTrash;
case MailListActionShortcutType.newMessage:
return EmailActionType.compose;
case MailListActionShortcutType.markAsRead:
return selectedEmails.isAllEmailRead
? null
: EmailActionType.markAsRead;
case MailListActionShortcutType.markAsUnread:
return selectedEmails.isAllEmailUnread
? null
: EmailActionType.markAsUnread;
}
}
}