[RFC] 100 - Hotkey setting panel 快捷键设置面板 #7111
canisminor1990
started this conversation in
RFCs
Replies: 3 comments 1 reply
-
Beta Was this translation helpful? Give feedback.
1 reply
-
|
Beta Was this translation helpful? Give feedback.
0 replies
-
如何添加新的快捷键:开发者指南本指南将带您一步步地向 LobeChat 添加一个新的快捷键功能。我们将通过一个完整示例,演示从定义到实现的整个过程。 示例场景假设我们要添加一个新的快捷键功能:快速清空聊天记录,快捷键为 步骤 1:更新快捷键常量定义首先,在 export const HotkeyEnum = {
// 已有的快捷键...
AddUserMessage: 'addUserMessage',
EditMessage: 'editMessage',
// 新增快捷键
ClearChat: 'clearChat', // 添加这一行
// 其他已有快捷键...
} as const;步骤 2:注册默认快捷键在 import { KeyMapEnum as Key, combineKeys } from '@lobehub/ui';
// ...现有代码
export const HOTKEYS_REGISTRATION: HotkeyRegistration = [
// 现有的快捷键配置...
// 添加新的快捷键配置
{
group: HotkeyGroupEnum.Conversation, // 归类到会话操作组
id: HotkeyEnum.ClearChat,
keys: combineKeys([Key.Mod, Key.Shift, Key.Backspace]),
scopes: [HotkeyScopeEnum.Chat], // 在聊天作用域下生效
},
// 其他现有快捷键...
];步骤 3:添加国际化翻译在 import { HotkeyI18nTranslations } from '@/types/hotkey';
const hotkey: HotkeyI18nTranslations = {
// 现有翻译...
// 添加新快捷键的翻译
clearChat: {
desc: '清空当前会话的所有消息记录',
title: '清空聊天记录',
},
// 其他现有翻译...
};
export default hotkey;如需支持其他语言,还需要在相应的语言文件中添加对应翻译。 步骤 4:创建并注册快捷键 Hook在 export const useClearChatHotkey = () => {
const clearMessages = useChatStore((s) => s.clearMessages);
const { t } = useTranslation();
return useHotkeyById(HotkeyEnum.ClearChat, showConfirm);
};
// 注册聚合
export const useRegisterChatHotkeys = () => {
const { enableScope, disableScope } = useHotkeysContext();
useOpenChatSettingsHotkey();
// ...其他快捷键
useClearChatHotkey();
useEffect(() => {
enableScope(HotkeyScopeEnum.Chat);
return () => disableScope(HotkeyScopeEnum.Chat);
}, []);
return null;
};步骤 5:给相应 UI 元素添加 Tooltip 提示(可选)如果有对应的 UI 按钮,可以添加快捷键提示: import { Tooltip } from '@lobehub/ui';
import { DeleteOutlined } from '@ant-design/icons';
import { Button } from 'antd';
import { useTranslation } from 'react-i18next';
import { HotkeyEnum } from '@/types/hotkey';
import { useUserStore } from '@/store/user';
import { settingsSelectors } from '@/store/user/selectors';
const ClearChatButton = () => {
const { t } = useTranslation(['hotkey', 'chat']);
const clearChatHotkey = useUserStore(settingsSelectors.getHotkeyById(HotkeyEnum.ClearChat));
// 获取清空聊天的方法
const clearMessages = useChatStore((s) => s.clearMessages);
return (
<Tooltip hotkey={clearChatHotkey} title={t('clearChat.title', { ns: 'hotkey' })}>
<Button icon={<DeleteOutlined />} onClick={clearMessages} />
</Tooltip>
);
};步骤 6:测试新快捷键
最佳实践
按照以上步骤,您可以轻松地向系统添加新的快捷键功能,提升用户体验。如有特殊需求,如桌面专属快捷键,可以通过 常见问题排查
通过这些步骤,您可以确保新添加的快捷键功能稳定、可靠且用户友好。 |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
背景
一方面解决目前快捷键过于隐晦,没有统一入口查看支持哪些快捷键,另一方面支持自定义配置解决个性化快捷键诉求。同时,Windows 和 Mac 用户习惯的快捷键表示和组合方式存在差异,需要提供平台适配的解决方案。
本特性旨在构建一个直观、功能完善的快捷键设置面板,让用户可以查看和自定义应用快捷键,同时确保设置的快捷键不会与系统或浏览器快捷键冲突,从而提供一致且用户友好的体验。
设计思路
快捷键系统的设计围绕以下几个核心原则展开:
平台适应性:使用
KeyMapEnum与combineKeys实现自动识别用户操作系统(Windows/Mac),并相应调整快捷键的显示样式(例如,Windows 显示 "Ctrl+S",Mac 显示 "⌘+S")作用域管理:
GLOBAL_HOTKEY_SCOPE)和聊天作用域(CHAT_HOTKEY_SCOPE)架构设计
系统架构图
数据流程
快捷键 const 定义
快捷键定义
src/const/hotkeys.ts快捷键类型定义
src/types/hotkey.ts快捷键 i18n
src/locales/default/hotkey.ts快捷键 Hook 示例
src/hooks/useHotkeys/chatScope.ts作用域实现机制
快捷键作用域(Scope)是整个快捷键系统的核心控制机制,它解决了"在正确的上下文中提供正确的快捷键"的问题,以下详细介绍其实现原理和流程:
作用域基本概念
作用域本质上是快捷键的分组标识符,用于控制哪些快捷键在哪些界面环境中可用。我们的系统定义了两个主要作用域:
此外,每个快捷键ID也自动成为一个独立作用域,用于精细控制单个快捷键的启用/禁用状态。
作用域注册与生命周期
应用初始化阶段:
此时只有全局作用域('global')中的快捷键是激活状态
进入聊天页面:
快捷键定义与作用域关联:
作用域控制流程详解
(main)/_layout/Desktop/index.tsx)提供全局快捷键作用域chat/_layout/Desktop/index.tsx)通过 RegisterHotkeys 组件注册聊天作用域自定义Hook简化作用域管理
我们的
useHotkeyByIdhook 封装了作用域管理细节:完整注册示例
在聊天页面注册快捷键
src/hooks/useHotkeys/chatScope.ts通过这种多层次的作用域管理,系统能够智能地在不同界面环境下提供适当的快捷键支持,并支持根据应用状态动态调整快捷键的可用性,同时保持代码的可维护性和扩展性。
布局中的作用域注册
全局作用域
全局快捷键注册
src/app/[variants]/(main)/_layout/Desktop/RegisterHotkeys.tsx全局快捷键注入 Layout
src/app/[variants]/(main)/_layout/Desktop/index.tsx会话作用域注册
会话快捷键注册
src/app/[variants]/(main)/chat/_layout/Desktop/RegisterHotkeys.tsx会话快捷键注入 Layout
src/app/[variants]/(main)/chat/_layout/Desktop/index.tsx基于UI状态的细粒度作用域控制示例
src/features/ChatInput/Desktop/InputArea/index.tsx快捷键系统不仅支持页面级别的作用域管理,还可以实现基于组件状态的更精细作用域控制。以输入区域组件为例,它演示了如何根据交互状态动态控制快捷键的可用性:
这种实现展示了快捷键作用域控制的几个关键特性:
AddUserMessage快捷键作用域这种细粒度的作用域控制机制使得快捷键系统能够适应复杂的UI状态,为用户提供上下文相关的键盘交互体验,同时保持整体系统的可维护性和一致性。
设置面板实现
数据驱动型设置面板,新增快捷键后不需要更新,会自动按 const 中的排序和分组进行渲染
组件拆解
1. 常量定义组件
功能:定义快捷键的基本常量和默认配置
文件:
src/const/hotkeys.ts依赖:
@lobehub/ui提供的 KeyMapEnum 和 combineKeys输出:
2. 类型定义组件
功能:提供快捷键相关的类型定义
文件:
src/types/hotkey.ts组成:
3. 快捷键Hook组件
功能:提供快捷键使用的自定义Hooks
文件:
src/hooks/useHotkeys/index.ts:导出所有Hooksrc/hooks/useHotkeys/globalScope.ts:全局作用域Hooksrc/hooks/useHotkeys/chatScope.ts:聊天作用域Hook核心Hook:
useSwitchAgentHotkey:快速切换角色useSaveTopicHotkey:保存会话主题useRegenerateMessageHotkey:重新生成消息useToggleLeftPanelHotkey:切换左侧面板useToggleRightPanelHotkey:切换右侧面板4. 快捷键注册组件
功能:在适当的上下文中注册和激活快捷键
文件:
src/app/[variants]/(main)/_layout/Desktop/RegisterHotkeys.tsx:全局快捷键注册src/app/[variants]/(main)/chat/_layout/Desktop/RegisterHotkeys.tsx:聊天作用域快捷键注册实现方式:
react-hotkeys-hook提供的 HotkeysProvider 和作用域管理5. 快捷键设置面板
功能:允许用户查看和自定义快捷键
文件:未指定,但可能在设置页面中
核心组件:
6. 持久化组件
功能:保存用户自定义快捷键配置
实现:使用 UserStore 中的 settings.hotkey 字段
数据结构:
访问方式:通过 selectors 提供便捷访问
总结
该设计实现了一个完整的快捷键系统,具有以下特点:
整体架构符合关注点分离原则,便于后续维护和扩展。
进展
Hotkey快捷键展示: https://ui.lobehub.com/components/hotkeyHotkeyInput快捷键录制: https://ui.lobehub.com/components/hotkey-inputTooltip中增加快捷键展示支持: https://ui.lobehub.com/components/components/tooltipBeta Was this translation helpful? Give feedback.
All reactions