Skip to content

Commit 72a08b0

Browse files
committed
Implement ability to choose key combination to send messages
1 parent 949a1b7 commit 72a08b0

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";
@@ -57,11 +60,13 @@ export function SettingsView() {
5760
cursorGlow,
5861
desktopNotifications,
5962
autoConvertLongText,
63+
sendMessagesWith,
6064
setAutoRunTasks,
6165
setCreatePR,
6266
setCursorGlow,
6367
setDesktopNotifications,
6468
setAutoConvertLongText,
69+
setSendMessagesWith,
6570
} = useSettingsStore();
6671
const terminalLayoutMode = useTerminalLayoutStore(
6772
(state) => state.terminalLayoutMode,
@@ -174,6 +179,18 @@ export function SettingsView() {
174179
[autoConvertLongText, setAutoConvertLongText],
175180
);
176181

182+
const handleSendMessagesWithChange = useCallback(
183+
(value: SendMessagesWith) => {
184+
track(ANALYTICS_EVENTS.SETTING_CHANGED, {
185+
setting_name: "send_messages_with",
186+
new_value: value,
187+
old_value: sendMessagesWith,
188+
});
189+
setSendMessagesWith(value);
190+
},
191+
[sendMessagesWith, setSendMessagesWith],
192+
);
193+
177194
const handleWorktreeLocationChange = async (newLocation: string) => {
178195
setLocalWorktreeLocation(newLocation);
179196
try {
@@ -389,6 +406,31 @@ export function SettingsView() {
389406
size="1"
390407
/>
391408
</Flex>
409+
410+
<Flex align="center" justify="between">
411+
<Flex direction="column" gap="1">
412+
<Text size="1" weight="medium">
413+
Send messages with
414+
</Text>
415+
<Text size="1" color="gray">
416+
Choose which key combination sends messages. Use
417+
Shift+Enter for new lines.
418+
</Text>
419+
</Flex>
420+
<Select.Root
421+
value={sendMessagesWith}
422+
onValueChange={(value) =>
423+
handleSendMessagesWithChange(value as SendMessagesWith)
424+
}
425+
size="1"
426+
>
427+
<Select.Trigger />
428+
<Select.Content>
429+
<Select.Item value="enter">Enter</Select.Item>
430+
<Select.Item value="cmd+enter">⌘ Enter</Select.Item>
431+
</Select.Content>
432+
</Select.Root>
433+
</Flex>
392434
</Flex>
393435
</Card>
394436
</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;
@@ -17,6 +18,7 @@ interface SettingsStore {
1718
desktopNotifications: boolean;
1819
cursorGlow: boolean;
1920
autoConvertLongText: boolean;
21+
sendMessagesWith: SendMessagesWith;
2022

2123
setAutoRunTasks: (autoRun: boolean) => void;
2224
setDefaultRunMode: (mode: DefaultRunMode) => void;
@@ -28,6 +30,7 @@ interface SettingsStore {
2830
setDesktopNotifications: (enabled: boolean) => void;
2931
setCursorGlow: (enabled: boolean) => void;
3032
setAutoConvertLongText: (enabled: boolean) => void;
33+
setSendMessagesWith: (mode: SendMessagesWith) => void;
3134
}
3235

3336
export const useSettingsStore = create<SettingsStore>()(
@@ -43,6 +46,7 @@ export const useSettingsStore = create<SettingsStore>()(
4346
desktopNotifications: true,
4447
cursorGlow: false,
4548
autoConvertLongText: true,
49+
sendMessagesWith: "enter",
4650

4751
setAutoRunTasks: (autoRun) => set({ autoRunTasks: autoRun }),
4852
setDefaultRunMode: (mode) => set({ defaultRunMode: mode }),
@@ -57,6 +61,7 @@ export const useSettingsStore = create<SettingsStore>()(
5761
setCursorGlow: (enabled) => set({ cursorGlow: enabled }),
5862
setAutoConvertLongText: (enabled) =>
5963
set({ autoConvertLongText: enabled }),
64+
setSendMessagesWith: (mode) => set({ sendMessagesWith: mode }),
6065
}),
6166
{
6267
name: "settings-storage",

0 commit comments

Comments
 (0)