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

Commit 0836886

Browse files
authored
Avoid calling prepareToEncrypt onKeyDown (#10828)
* Avoid calling prepareToEncrypt onKeyDown * Iterate
1 parent b3fd937 commit 0836886

File tree

3 files changed

+38
-12
lines changed

3 files changed

+38
-12
lines changed

src/components/views/rooms/BasicMessageComposer.tsx

+2-4
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ interface IProps {
107107
initialCaret?: DocumentOffset;
108108
disabled?: boolean;
109109

110-
onChange?(): void;
110+
onChange?(selection: Caret, inputType?: string, diff?: IDiff): void;
111111
onPaste?(event: ClipboardEvent<HTMLDivElement>, model: EditorModel): boolean;
112112
}
113113

@@ -278,9 +278,7 @@ export default class BasicMessageEditor extends React.Component<IProps, IState>
278278
isTyping,
279279
);
280280

281-
if (this.props.onChange) {
282-
this.props.onChange();
283-
}
281+
this.props.onChange?.(selection, inputType, diff);
284282
};
285283

286284
private showPlaceholder(): void {

src/components/views/rooms/SendMessageComposer.tsx

+9-7
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ import { KeyBindingAction } from "../../../accessibility/KeyboardShortcuts";
5959
import { PosthogAnalytics } from "../../../PosthogAnalytics";
6060
import { addReplyToMessageContent } from "../../../utils/Reply";
6161
import { doMaybeLocalRoomAction } from "../../../utils/local-room";
62+
import { Caret } from "../../../editor/caret";
63+
import { IDiff } from "../../../editor/diff";
6264

6365
/**
6466
* Build the mentions information based on the editor model (and any related events):
@@ -353,11 +355,6 @@ export class SendMessageComposer extends React.Component<ISendMessageComposerPro
353355
context: this.context.timelineRenderingType,
354356
});
355357
break;
356-
default:
357-
if (this.prepareToEncrypt) {
358-
// This needs to be last!
359-
this.prepareToEncrypt();
360-
}
361358
}
362359
};
363360

@@ -689,8 +686,13 @@ export class SendMessageComposer extends React.Component<ISendMessageComposerPro
689686
return false;
690687
};
691688

692-
private onChange = (): void => {
693-
if (this.props.onChange) this.props.onChange(this.model);
689+
private onChange = (selection: Caret, inputType?: string, diff?: IDiff): void => {
690+
// We call this in here rather than onKeyDown as that would trip it on global shortcuts e.g. Ctrl-k also
691+
if (!!diff) {
692+
this.prepareToEncrypt?.();
693+
}
694+
695+
this.props.onChange?.(this.model);
694696
};
695697

696698
private focusComposer = (): void => {

test/components/views/rooms/SendMessageComposer-test.tsx

+27-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import React from "react";
1818
import { fireEvent, render, waitFor } from "@testing-library/react";
1919
import { IContent, MatrixClient, MsgType } from "matrix-js-sdk/src/matrix";
2020
import { mocked } from "jest-mock";
21+
import userEvent from "@testing-library/user-event";
2122

2223
import SendMessageComposer, {
2324
attachMentions,
@@ -28,7 +29,7 @@ import MatrixClientContext from "../../../../src/contexts/MatrixClientContext";
2829
import RoomContext, { TimelineRenderingType } from "../../../../src/contexts/RoomContext";
2930
import EditorModel from "../../../../src/editor/model";
3031
import { createPartCreator } from "../../../editor/mock";
31-
import { createTestClient, mkEvent, mkStubRoom } from "../../../test-utils";
32+
import { createTestClient, mkEvent, mkStubRoom, stubClient } from "../../../test-utils";
3233
import { MatrixClientPeg } from "../../../../src/MatrixClientPeg";
3334
import defaultDispatcher from "../../../../src/dispatcher/dispatcher";
3435
import DocumentOffset from "../../../../src/editor/offset";
@@ -574,4 +575,29 @@ describe("<SendMessageComposer/>", () => {
574575
expect(isQuickReaction(model4)).toBeFalsy();
575576
});
576577
});
578+
579+
it("should call prepareToEncrypt when the user is typing", async () => {
580+
const cli = stubClient();
581+
cli.isCryptoEnabled = jest.fn().mockReturnValue(true);
582+
cli.isRoomEncrypted = jest.fn().mockReturnValue(true);
583+
cli.prepareToEncrypt = jest.fn();
584+
const room = mkStubRoom("!roomId:server", "Room", cli);
585+
586+
expect(cli.prepareToEncrypt).not.toHaveBeenCalled();
587+
588+
const { container } = render(
589+
<MatrixClientContext.Provider value={cli}>
590+
<SendMessageComposer room={room} toggleStickerPickerOpen={jest.fn()} />
591+
</MatrixClientContext.Provider>,
592+
);
593+
594+
const composer = container.querySelector<HTMLDivElement>(".mx_BasicMessageComposer_input")!;
595+
596+
// Does not trigger on keydown as that'll cause false negatives for global shortcuts
597+
await userEvent.type(composer, "[ControlLeft>][KeyK][/ControlLeft]");
598+
expect(cli.prepareToEncrypt).not.toHaveBeenCalled();
599+
600+
await userEvent.type(composer, "Hello");
601+
expect(cli.prepareToEncrypt).toHaveBeenCalled();
602+
});
577603
});

0 commit comments

Comments
 (0)