mirror of
https://github.com/HKUDS/nanobot.git
synced 2026-06-20 01:34:17 +00:00
feat(webui): add new chat keyboard shortcut
Add Cmd/Ctrl+Shift+O shortcut to start a new chat, matching the convention used by ChatGPT, Claude.ai, and Gemini. Addresses #4178 Signed-off-by: axelray-dev <110029405+axelray-dev@users.noreply.github.com>
This commit is contained in:
parent
d0eba7cd9d
commit
4275678b43
@ -1007,6 +1007,13 @@ function Shell({
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const handleKeyDown = (event: globalThis.KeyboardEvent) => {
|
const handleKeyDown = (event: globalThis.KeyboardEvent) => {
|
||||||
if (event.defaultPrevented) return;
|
if (event.defaultPrevented) return;
|
||||||
|
const commandShiftO =
|
||||||
|
(event.metaKey || event.ctrlKey) && event.shiftKey && !event.altKey;
|
||||||
|
if (commandShiftO && event.key.toLowerCase() === "o") {
|
||||||
|
event.preventDefault();
|
||||||
|
onNewChat();
|
||||||
|
return;
|
||||||
|
}
|
||||||
const plainCommandK =
|
const plainCommandK =
|
||||||
(event.metaKey || event.ctrlKey) && !event.altKey && !event.shiftKey;
|
(event.metaKey || event.ctrlKey) && !event.altKey && !event.shiftKey;
|
||||||
if (!plainCommandK) return;
|
if (!plainCommandK) return;
|
||||||
@ -1017,7 +1024,7 @@ function Shell({
|
|||||||
|
|
||||||
window.addEventListener("keydown", handleKeyDown);
|
window.addEventListener("keydown", handleKeyDown);
|
||||||
return () => window.removeEventListener("keydown", handleKeyDown);
|
return () => window.removeEventListener("keydown", handleKeyDown);
|
||||||
}, [onOpenSessionSearch]);
|
}, [onNewChat, onOpenSessionSearch]);
|
||||||
|
|
||||||
const onSelectSearchResult = useCallback(
|
const onSelectSearchResult = useCallback(
|
||||||
(key: string) => {
|
(key: string) => {
|
||||||
|
|||||||
@ -1354,6 +1354,26 @@ describe("App layout", () => {
|
|||||||
expect(createChatSpy).not.toHaveBeenCalled();
|
expect(createChatSpy).not.toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("starts a new chat from the keyboard shortcut", async () => {
|
||||||
|
mockSessions = [
|
||||||
|
{
|
||||||
|
key: "websocket:chat-a",
|
||||||
|
channel: "websocket",
|
||||||
|
chatId: "chat-a",
|
||||||
|
createdAt: "2026-04-16T10:00:00Z",
|
||||||
|
updatedAt: "2026-04-16T10:00:00Z",
|
||||||
|
preview: "Existing chat",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
render(<App />);
|
||||||
|
|
||||||
|
await waitFor(() => expect(connectSpy).toHaveBeenCalled());
|
||||||
|
fireEvent.keyDown(window, { key: "O", shiftKey: true, metaKey: true });
|
||||||
|
|
||||||
|
expect(window.location.hash).toBe("#/new");
|
||||||
|
});
|
||||||
|
|
||||||
it("keeps large sidebars light while search still covers every chat", async () => {
|
it("keeps large sidebars light while search still covers every chat", async () => {
|
||||||
mockSessions = Array.from({ length: 170 }, (_, index) => {
|
mockSessions = Array.from({ length: 170 }, (_, index) => {
|
||||||
const chatId = `chat-${index}`;
|
const chatId = `chat-${index}`;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user