char-fork/llama.cpp

git clone https://git.t4t.associates/char-fork/llama.cpp

Aleksander Grygierfix: Change chat tabs nav shortcuts (#27609)d05f89562

char/aliceai-t5-moe
2.8 KiB101 linesraw
1import { page } from '$app/state';
2import { NEW_CHAT_TAB_ID } from '$lib/constants';
3import { KeyboardKey } from '$lib/enums';
4import { conversationsStore, settingsStore, tabsStore } from '$lib/stores';
5
6interface KeyboardShortcutsCallbacks {
7	activateSearchMode?: () => void;
8	editActiveConversation?: () => void;
9	onSearchActivated?: () => void;
10	deleteActiveConversation?: () => void;
11	navigateToPrevConversation?: () => void;
12	navigateToNextConversation?: () => void;
13	navigateToPrevTab?: () => void;
14	navigateToNextTab?: () => void;
15	toggleSidebar?: () => void;
16}
17
18export function useKeyboardShortcuts(callbacks: KeyboardShortcutsCallbacks) {
19	function handleKeydown(event: KeyboardEvent) {
20		const isCmdOrCtrl = event.metaKey || event.ctrlKey;
21
22		if (isCmdOrCtrl && event.key === KeyboardKey.K_LOWER) {
23			event.preventDefault();
24			callbacks.activateSearchMode?.();
25			callbacks.onSearchActivated?.();
26		}
27
28		if (isCmdOrCtrl && event.key === KeyboardKey.B_LOWER) {
29			event.preventDefault();
30			callbacks.toggleSidebar?.();
31		}
32
33		if (
34			isCmdOrCtrl &&
35			event.shiftKey &&
36			(event.key === KeyboardKey.O_LOWER || event.key === KeyboardKey.O_UPPER)
37		) {
38			event.preventDefault();
39
40			void conversationsStore.openNewChat();
41		}
42
43		if (event.shiftKey && isCmdOrCtrl && event.key === KeyboardKey.E_UPPER) {
44			event.preventDefault();
45			callbacks.editActiveConversation?.();
46		}
47
48		if (
49			event.shiftKey &&
50			isCmdOrCtrl &&
51			(event.key === KeyboardKey.X_LOWER || event.key === KeyboardKey.X_UPPER)
52		) {
53			// several components register this shortcut; only let the first handler
54			// act so the synchronous navigation does not cascade-close every tab
55			if (event.defaultPrevented) return;
56
57			// close-tab only makes sense with conversation tabs enabled
58			if (!settingsStore.config.conversationTabs) return;
59
60			event.preventDefault();
61
62			const activeId =
63				page.params.id ?? (page.route.id === '/(chat)' ? NEW_CHAT_TAB_ID : undefined);
64
65			if (activeId) {
66				void tabsStore.close(activeId, activeId);
67			}
68		}
69
70		if (
71			isCmdOrCtrl &&
72			event.shiftKey &&
73			(event.key === KeyboardKey.D_LOWER || event.key === KeyboardKey.D_UPPER)
74		) {
75			event.preventDefault();
76			callbacks.deleteActiveConversation?.();
77		}
78
79		if (isCmdOrCtrl && event.shiftKey && event.key === KeyboardKey.ARROW_UP) {
80			event.preventDefault();
81			callbacks.navigateToPrevConversation?.();
82		}
83
84		if (isCmdOrCtrl && event.shiftKey && event.key === KeyboardKey.ARROW_DOWN) {
85			event.preventDefault();
86			callbacks.navigateToNextConversation?.();
87		}
88
89		if (isCmdOrCtrl && event.altKey && event.shiftKey && event.code === KeyboardKey.BRACKET_LEFT) {
90			event.preventDefault();
91			callbacks.navigateToPrevTab?.();
92		}
93
94		if (isCmdOrCtrl && event.altKey && event.shiftKey && event.code === KeyboardKey.BRACKET_RIGHT) {
95			event.preventDefault();
96			callbacks.navigateToNextTab?.();
97		}
98	}
99
100	return { handleKeydown };
101}