Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit b47588f

Browse files
authored
Fix {enter} press in RTE (#9927)
Fix enter combination in RTE
1 parent eb43f34 commit b47588f

File tree

2 files changed

+51
-5
lines changed

2 files changed

+51
-5
lines changed

src/components/views/rooms/wysiwyg_composer/hooks/useInputEventProcessor.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ import { useCallback } from "react";
1919

2020
import { useSettingValue } from "../../../../../hooks/useSettings";
2121

22+
function isEnterPressed(event: KeyboardEvent): boolean {
23+
// Ugly but here we need to send the message only if Enter is pressed
24+
// And we need to stop the event propagation on enter to avoid the composer to grow
25+
return event.key === "Enter" && !event.shiftKey && !event.ctrlKey && !event.metaKey && !event.altKey;
26+
}
27+
2228
export function useInputEventProcessor(onSend: () => void): (event: WysiwygEvent) => WysiwygEvent | null {
2329
const isCtrlEnter = useSettingValue<boolean>("MessageComposerInput.ctrlEnterToSend");
2430
return useCallback(
@@ -28,12 +34,12 @@ export function useInputEventProcessor(onSend: () => void): (event: WysiwygEvent
2834
}
2935

3036
const isKeyboardEvent = event instanceof KeyboardEvent;
31-
const isEnterPress =
32-
!isCtrlEnter && (isKeyboardEvent ? event.key === "Enter" : event.inputType === "insertParagraph");
33-
// sendMessage is sent when ctrl+enter is pressed
34-
const isSendMessage = !isKeyboardEvent && event.inputType === "sendMessage";
37+
const isEnterPress = !isCtrlEnter && isKeyboardEvent && isEnterPressed(event);
38+
const isInsertParagraph = !isCtrlEnter && !isKeyboardEvent && event.inputType === "insertParagraph";
39+
// sendMessage is sent when cmd+enter is pressed
40+
const isSendMessage = isCtrlEnter && !isKeyboardEvent && event.inputType === "sendMessage";
3541

36-
if (isEnterPress || isSendMessage) {
42+
if (isEnterPress || isInsertParagraph || isSendMessage) {
3743
event.stopPropagation?.();
3844
event.preventDefault?.();
3945
onSend();

test/components/views/rooms/wysiwyg_composer/components/WysiwygComposer-test.tsx

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
import "@testing-library/jest-dom";
1818
import React from "react";
1919
import { fireEvent, render, screen, waitFor } from "@testing-library/react";
20+
import userEvent from "@testing-library/user-event";
2021

2122
import { WysiwygComposer } from "../../../../../../src/components/views/rooms/wysiwyg_composer/components/WysiwygComposer";
2223
import SettingsStore from "../../../../../../src/settings/SettingsStore";
@@ -87,6 +88,45 @@ describe("WysiwygComposer", () => {
8788
// Then it sends a message
8889
await waitFor(() => expect(onSend).toBeCalledTimes(1));
8990
});
91+
92+
it("Should not call onSend when Shift+Enter is pressed ", async () => {
93+
//When
94+
await userEvent.type(screen.getByRole("textbox"), "{shift>}{enter}");
95+
96+
// Then it sends a message
97+
await waitFor(() => expect(onSend).toBeCalledTimes(0));
98+
});
99+
100+
it("Should not call onSend when ctrl+Enter is pressed ", async () => {
101+
//When
102+
// Using userEvent.type or .keyboard wasn't working as expected in the case of ctrl+enter
103+
fireEvent(
104+
screen.getByRole("textbox"),
105+
new KeyboardEvent("keydown", {
106+
ctrlKey: true,
107+
code: "Enter",
108+
}),
109+
);
110+
111+
// Then it sends a message
112+
await waitFor(() => expect(onSend).toBeCalledTimes(0));
113+
});
114+
115+
it("Should not call onSend when alt+Enter is pressed ", async () => {
116+
//When
117+
await userEvent.type(screen.getByRole("textbox"), "{alt>}{enter}");
118+
119+
// Then it sends a message
120+
await waitFor(() => expect(onSend).toBeCalledTimes(0));
121+
});
122+
123+
it("Should not call onSend when meta+Enter is pressed ", async () => {
124+
//When
125+
await userEvent.type(screen.getByRole("textbox"), "{meta>}{enter}");
126+
127+
// Then it sends a message
128+
await waitFor(() => expect(onSend).toBeCalledTimes(0));
129+
});
90130
});
91131

92132
describe("When settings require Ctrl+Enter to send", () => {

0 commit comments

Comments
 (0)