1
0
mirror of https://github.com/matrix-org/matrix-react-sdk.git synced 2025-07-30 02:21:17 +03:00

Fix emoting with emoji or pills (#8105)

* Fix emoting with emoji or pills

* Fix some slash command errors not being shown

* Re-enable mistakenly skipped SendMessageComposer tests

* Test emoting with non-text parts
This commit is contained in:
Robin
2022-03-21 15:09:43 -04:00
committed by GitHub
parent 7a22682a80
commit 666cab954a
3 changed files with 19 additions and 5 deletions

View File

@ -153,13 +153,11 @@ export class Command {
public run(roomId: string, threadId: string, args: string): RunResult { public run(roomId: string, threadId: string, args: string): RunResult {
// if it has no runFn then its an ignored/nop command (autocomplete only) e.g `/me` // if it has no runFn then its an ignored/nop command (autocomplete only) e.g `/me`
if (!this.runFn) { if (!this.runFn) {
reject( return reject(
newTranslatableError( newTranslatableError(
"Command error: Unable to handle slash command.", "Command error: Unable to handle slash command.",
), ),
); );
return;
} }
const renderingType = threadId const renderingType = threadId

View File

@ -181,7 +181,9 @@ export function textSerialize(model: EditorModel): string {
} }
export function containsEmote(model: EditorModel): boolean { export function containsEmote(model: EditorModel): boolean {
return startsWith(model, "/me ", false) && model.parts[0]?.text?.length > 4; const hasCommand = startsWith(model, "/me ", false);
const hasArgument = model.parts[0]?.text?.length > 4 || model.parts.length > 1;
return hasCommand && hasArgument;
} }
export function startsWith(model: EditorModel, prefix: string, caseSensitive = true): boolean { export function startsWith(model: EditorModel, prefix: string, caseSensitive = true): boolean {

View File

@ -131,6 +131,20 @@ describe('<SendMessageComposer/>', () => {
}); });
}); });
it("allows emoting with non-text parts", () => {
const model = new EditorModel([], createPartCreator(), createRenderer());
const documentOffset = new DocumentOffset(16, true);
model.update("/me ✨sparkles✨", "insertText", documentOffset);
expect(model.parts.length).toEqual(4); // Emoji count as non-text
const content = createMessageContent(model, null, undefined, permalinkCreator);
expect(content).toEqual({
body: "✨sparkles✨",
msgtype: "m.emote",
});
});
it("allows sending double-slash escaped slash commands correctly", () => { it("allows sending double-slash escaped slash commands correctly", () => {
const model = new EditorModel([], createPartCreator(), createRenderer()); const model = new EditorModel([], createPartCreator(), createRenderer());
const documentOffset = new DocumentOffset(32, true); const documentOffset = new DocumentOffset(32, true);
@ -194,7 +208,7 @@ describe('<SendMessageComposer/>', () => {
}); });
}; };
fit("renders text and placeholder correctly", () => { it("renders text and placeholder correctly", () => {
const wrapper = getComponent({ placeholder: "placeholder string" }); const wrapper = getComponent({ placeholder: "placeholder string" });
expect(wrapper.find('[aria-label="placeholder string"]')).toHaveLength(1); expect(wrapper.find('[aria-label="placeholder string"]')).toHaveLength(1);