Skip to content

Commit 9fa8fff

Browse files
committed
Implement ability to choose key combination to send messages
1 parent 73e60a3 commit 9fa8fff

3 files changed

Lines changed: 66 additions & 9 deletions

File tree

apps/array/src/renderer/features/message-editor/tiptap/useTiptapEditor.ts

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -103,14 +103,24 @@ export function useTiptapEditor(options: UseTiptapEditorOptions) {
103103
editorProps: {
104104
attributes: { class: EDITOR_CLASS },
105105
handleKeyDown: (view, event) => {
106-
if (event.key === "Enter" && !event.shiftKey) {
107-
if (!view.editable) return false;
108-
const suggestionPopup = document.querySelector("[data-tippy-root]");
109-
if (suggestionPopup) return false;
110-
event.preventDefault();
111-
historyActions.reset();
112-
submitRef.current();
113-
return true;
106+
if (event.key === "Enter") {
107+
const sendMessagesWith =
108+
useSettingsStore.getState().sendMessagesWith;
109+
const isCmdEnterMode = sendMessagesWith === "cmd+enter";
110+
const isSubmitKey = isCmdEnterMode
111+
? event.metaKey || event.ctrlKey
112+
: !event.shiftKey;
113+
114+
if (isSubmitKey) {
115+
if (!view.editable) return false;
116+
const suggestionPopup =
117+
document.querySelector("[data-tippy-root]");
118+
if (suggestionPopup) return false;
119+
event.preventDefault();
120+
historyActions.reset();
121+
submitRef.current();
122+
return true;
123+
}
114124
}
115125

116126
if (

apps/array/src/renderer/features/settings/components/SettingsView.tsx

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import { useAuthStore } from "@features/auth/stores/authStore";
22
import { FolderPicker } from "@features/folder-picker/components/FolderPicker";
3-
import { useSettingsStore } from "@features/settings/stores/settingsStore";
3+
import {
4+
type SendMessagesWith,
5+
useSettingsStore,
6+
} from "@features/settings/stores/settingsStore";
47
import { useMeQuery } from "@hooks/useMeQuery";
58
import { useProjectQuery } from "@hooks/useProjectQuery";
69
import { useSetHeaderContent } from "@hooks/useSetHeaderContent";
@@ -60,12 +63,14 @@ export function SettingsView() {
6063
defaultThinkingEnabled,
6164
desktopNotifications,
6265
autoConvertLongText,
66+
sendMessagesWith,
6367
setAutoRunTasks,
6468
setCreatePR,
6569
setCursorGlow,
6670
setDefaultThinkingEnabled,
6771
setDesktopNotifications,
6872
setAutoConvertLongText,
73+
setSendMessagesWith,
6974
} = useSettingsStore();
7075
const terminalLayoutMode = useTerminalLayoutStore(
7176
(state) => state.terminalLayoutMode,
@@ -190,6 +195,18 @@ export function SettingsView() {
190195
[autoConvertLongText, setAutoConvertLongText],
191196
);
192197

198+
const handleSendMessagesWithChange = useCallback(
199+
(value: SendMessagesWith) => {
200+
track(ANALYTICS_EVENTS.SETTING_CHANGED, {
201+
setting_name: "send_messages_with",
202+
new_value: value,
203+
old_value: sendMessagesWith,
204+
});
205+
setSendMessagesWith(value);
206+
},
207+
[sendMessagesWith, setSendMessagesWith],
208+
);
209+
193210
const handleWorktreeLocationChange = async (newLocation: string) => {
194211
setLocalWorktreeLocation(newLocation);
195212
try {
@@ -426,6 +443,31 @@ export function SettingsView() {
426443
size="1"
427444
/>
428445
</Flex>
446+
447+
<Flex align="center" justify="between">
448+
<Flex direction="column" gap="1">
449+
<Text size="1" weight="medium">
450+
Send messages with
451+
</Text>
452+
<Text size="1" color="gray">
453+
Choose which key combination sends messages. Use
454+
Shift+Enter for new lines.
455+
</Text>
456+
</Flex>
457+
<Select.Root
458+
value={sendMessagesWith}
459+
onValueChange={(value) =>
460+
handleSendMessagesWithChange(value as SendMessagesWith)
461+
}
462+
size="1"
463+
>
464+
<Select.Trigger />
465+
<Select.Content>
466+
<Select.Item value="enter">Enter</Select.Item>
467+
<Select.Item value="cmd+enter">⌘ Enter</Select.Item>
468+
</Select.Content>
469+
</Select.Root>
470+
</Flex>
429471
</Flex>
430472
</Card>
431473
</Flex>

apps/array/src/renderer/features/settings/stores/settingsStore.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { persist } from "zustand/middleware";
55

66
export type DefaultRunMode = "local" | "cloud" | "last_used";
77
export type LocalWorkspaceMode = "worktree" | "root";
8+
export type SendMessagesWith = "enter" | "cmd+enter";
89

910
interface SettingsStore {
1011
autoRunTasks: boolean;
@@ -18,6 +19,7 @@ interface SettingsStore {
1819
desktopNotifications: boolean;
1920
cursorGlow: boolean;
2021
autoConvertLongText: boolean;
22+
sendMessagesWith: SendMessagesWith;
2123

2224
setAutoRunTasks: (autoRun: boolean) => void;
2325
setDefaultRunMode: (mode: DefaultRunMode) => void;
@@ -30,6 +32,7 @@ interface SettingsStore {
3032
setDesktopNotifications: (enabled: boolean) => void;
3133
setCursorGlow: (enabled: boolean) => void;
3234
setAutoConvertLongText: (enabled: boolean) => void;
35+
setSendMessagesWith: (mode: SendMessagesWith) => void;
3336
}
3437

3538
export const useSettingsStore = create<SettingsStore>()(
@@ -46,6 +49,7 @@ export const useSettingsStore = create<SettingsStore>()(
4649
desktopNotifications: true,
4750
cursorGlow: false,
4851
autoConvertLongText: true,
52+
sendMessagesWith: "enter",
4953

5054
setAutoRunTasks: (autoRun) => set({ autoRunTasks: autoRun }),
5155
setDefaultRunMode: (mode) => set({ defaultRunMode: mode }),
@@ -62,6 +66,7 @@ export const useSettingsStore = create<SettingsStore>()(
6266
setCursorGlow: (enabled) => set({ cursorGlow: enabled }),
6367
setAutoConvertLongText: (enabled) =>
6468
set({ autoConvertLongText: enabled }),
69+
setSendMessagesWith: (mode) => set({ sendMessagesWith: mode }),
6570
}),
6671
{
6772
name: "settings-storage",

0 commit comments

Comments
 (0)