From c48d05885ad110546e7f1cfc06991191b0b9bb4b Mon Sep 17 00:00:00 2001 From: gaoziman <2942894660@qq.com> Date: Sat, 27 Dec 2025 23:56:26 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E9=9B=86=E6=88=90):=20=E9=9B=86=E6=88=90?= =?UTF-8?q?=E5=BF=AB=E6=8D=B7=E9=94=AE=E7=B3=BB=E7=BB=9F=E5=88=B0=E5=BA=94?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在根布局添加 HotkeysProvider - 重构 Sidebar 使用 useHotkeys 注册快捷键 - 移除原有的手动键盘事件监听 - 添加 N 键新建对话快捷键 - 添加 Cmd/Ctrl+K 和 Cmd/Ctrl+/ 搜索快捷键 --- src/app/layout.tsx | 11 ++++--- src/components/layout/Sidebar.tsx | 53 +++++++++++++++++++++++-------- 2 files changed, 46 insertions(+), 18 deletions(-) diff --git a/src/app/layout.tsx b/src/app/layout.tsx index a6a739c..bb8b463 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -3,6 +3,7 @@ import "./globals.css"; import { SettingsProvider } from "@/components/providers/SettingsProvider"; import { AuthProvider } from "@/providers/AuthProvider"; import { PromptOptimizerProvider } from "@/providers/PromptOptimizerProvider"; +import { HotkeysProvider } from "@/providers/HotkeysProvider"; import { Toaster } from "@/components/ui/Toast"; export const metadata: Metadata = { @@ -23,10 +24,12 @@ export default function RootLayout({ - - {children} - - + + + {children} + + + diff --git a/src/components/layout/Sidebar.tsx b/src/components/layout/Sidebar.tsx index d76d171..fb80cb6 100644 --- a/src/components/layout/Sidebar.tsx +++ b/src/components/layout/Sidebar.tsx @@ -11,6 +11,7 @@ import { useConversations } from '@/hooks/useConversations'; import { useAuth } from '@/providers/AuthProvider'; import type { Conversation } from '@/drizzle/schema'; import { useState, useRef, useEffect, useCallback } from 'react'; +import { useHotkeys } from '@/hooks/useHotkeys'; interface SidebarProps { isOpen?: boolean; @@ -54,21 +55,45 @@ export function Sidebar({ isOpen = true }: SidebarProps) { }; }, [menuOpen]); - // 全局键盘快捷键:⌘K / Ctrl+K 打开搜索 - useEffect(() => { - const handleKeyDown = (e: KeyboardEvent) => { - // ⌘K (Mac) 或 Ctrl+K (Windows/Linux) - if ((e.metaKey || e.ctrlKey) && e.key === 'k') { - e.preventDefault(); - setShowSearchModal(true); - } - }; + // 快捷键:N - 新建对话(单键,非输入框时生效) + useHotkeys( + 'new-chat', + { + key: 'n', + description: '新建对话', + category: '导航', + action: useCallback(() => setShowNewChatModal(true), []), + }, + [setShowNewChatModal] + ); - document.addEventListener('keydown', handleKeyDown); - return () => { - document.removeEventListener('keydown', handleKeyDown); - }; - }, []); + // 快捷键:Cmd/Ctrl + K - 打开搜索 + useHotkeys( + 'open-search-k', + { + key: 'k', + modifiers: ['ctrl', 'meta'], + description: '打开搜索', + category: '导航', + action: useCallback(() => setShowSearchModal(true), []), + allowInInput: true, + }, + [setShowSearchModal] + ); + + // 快捷键:Cmd/Ctrl + / - 打开搜索(备用) + useHotkeys( + 'open-search-slash', + { + key: '/', + modifiers: ['ctrl', 'meta'], + description: '打开搜索', + category: '导航', + action: useCallback(() => setShowSearchModal(true), []), + allowInInput: true, + }, + [setShowSearchModal] + ); // 创建新对话 - 显示选择助手弹框 const handleNewChat = () => {