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 = () => {