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

Commit f819853

Browse files
authored
Fix autocomplete not resetting properly on message send (#10741)
1 parent 0d1020c commit f819853

File tree

3 files changed

+49
-13
lines changed

3 files changed

+49
-13
lines changed

src/editor/model.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,10 @@ export default class EditorModel {
9999

100100
private insertPart(index: number, part: Part): void {
101101
this._parts.splice(index, 0, part);
102-
if (this.activePartIdx && this.activePartIdx >= index) {
102+
if (this.activePartIdx !== null && this.activePartIdx >= index) {
103103
++this.activePartIdx;
104104
}
105-
if (this.autoCompletePartIdx && this.autoCompletePartIdx >= index) {
105+
if (this.autoCompletePartIdx !== null && this.autoCompletePartIdx >= index) {
106106
++this.autoCompletePartIdx;
107107
}
108108
}
@@ -111,12 +111,12 @@ export default class EditorModel {
111111
this._parts.splice(index, 1);
112112
if (index === this.activePartIdx) {
113113
this.activePartIdx = null;
114-
} else if (this.activePartIdx && this.activePartIdx > index) {
114+
} else if (this.activePartIdx !== null && this.activePartIdx > index) {
115115
--this.activePartIdx;
116116
}
117117
if (index === this.autoCompletePartIdx) {
118118
this.autoCompletePartIdx = null;
119-
} else if (this.autoCompletePartIdx && this.autoCompletePartIdx > index) {
119+
} else if (this.autoCompletePartIdx !== null && this.autoCompletePartIdx > index) {
120120
--this.autoCompletePartIdx;
121121
}
122122
}

test/editor/mock.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { Caret } from "../../src/editor/caret";
2121
import { PillPart, Part, PartCreator } from "../../src/editor/parts";
2222
import DocumentPosition from "../../src/editor/position";
2323

24-
class MockAutoComplete {
24+
export class MockAutoComplete {
2525
public _updateCallback;
2626
public _partCreator;
2727
public _completions;
@@ -44,7 +44,7 @@ class MockAutoComplete {
4444
});
4545
if (matches.length === 1 && this._part && this._part.text.length > 1) {
4646
const match = matches[0];
47-
let pill;
47+
let pill: PillPart;
4848
if (match.resourceId[0] === "@") {
4949
pill = this._partCreator.userPill(match.text, match.resourceId);
5050
} else {

test/editor/model-test.ts

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ limitations under the License.
1515
*/
1616

1717
import EditorModel from "../../src/editor/model";
18-
import { createPartCreator, createRenderer } from "./mock";
18+
import { createPartCreator, createRenderer, MockAutoComplete } from "./mock";
1919
import DocumentOffset from "../../src/editor/offset";
2020
import { PillPart } from "../../src/editor/parts";
2121
import DocumentPosition from "../../src/editor/position";
@@ -186,8 +186,7 @@ describe("editor/model", function () {
186186
expect(model.parts[1].text).toBe("@a");
187187

188188
// this is a hacky mock function
189-
// @ts-ignore
190-
model.autoComplete.tryComplete(); // see MockAutoComplete
189+
(model.autoComplete as unknown as MockAutoComplete).tryComplete();
191190

192191
expect(renderer.count).toBe(2);
193192
expect((renderer.caret as DocumentPosition).index).toBe(1);
@@ -216,8 +215,7 @@ describe("editor/model", function () {
216215
expect(model.parts[1].text).toBe("#r");
217216

218217
// this is a hacky mock function
219-
// @ts-ignore
220-
model.autoComplete.tryComplete(); // see MockAutoComplete
218+
(model.autoComplete as unknown as MockAutoComplete).tryComplete();
221219

222220
expect(renderer.count).toBe(2);
223221
expect((renderer.caret as DocumentPosition).index).toBe(1);
@@ -236,8 +234,7 @@ describe("editor/model", function () {
236234

237235
model.update("hello #r", "insertText", new DocumentOffset(8, true));
238236
// this is a hacky mock function
239-
// @ts-ignore
240-
model.autoComplete.tryComplete(); // see MockAutoComplete
237+
(model.autoComplete as unknown as MockAutoComplete).tryComplete();
241238
model.update("hello #riot-dev!!", "insertText", new DocumentOffset(17, true));
242239

243240
expect(renderer.count).toBe(3);
@@ -314,6 +311,45 @@ describe("editor/model", function () {
314311
expect(model.parts[0].type).toBe("plain");
315312
expect(model.parts[0].text).toBe("foo@a");
316313
});
314+
315+
it("should allow auto-completing multiple times with resets between them", () => {
316+
const renderer = createRenderer();
317+
const pc = createPartCreator([{ resourceId: "#riot-dev" } as PillPart]);
318+
const model = new EditorModel([pc.plain("")], pc, renderer);
319+
320+
model.update("#r", "insertText", new DocumentOffset(8, true));
321+
322+
expect(renderer.count).toBe(1);
323+
expect((renderer.caret as DocumentPosition).index).toBe(0);
324+
expect((renderer.caret as DocumentPosition).offset).toBe(2);
325+
expect(model.parts.length).toBe(1);
326+
expect(model.parts[0].type).toBe("pill-candidate");
327+
expect(model.parts[0].text).toBe("#r");
328+
329+
// this is a hacky mock function
330+
(model.autoComplete as unknown as MockAutoComplete).tryComplete();
331+
332+
expect(renderer.count).toBe(2);
333+
expect((renderer.caret as DocumentPosition).index).toBe(0);
334+
expect((renderer.caret as DocumentPosition).offset).toBe(9);
335+
expect(model.parts.length).toBe(1);
336+
expect(model.parts[0].type).toBe("room-pill");
337+
expect(model.parts[0].text).toBe("#riot-dev");
338+
339+
model.reset([]);
340+
model.update("#r", "insertText", new DocumentOffset(8, true));
341+
342+
expect(model.parts.length).toBe(1);
343+
expect(model.parts[0].type).toBe("pill-candidate");
344+
expect(model.parts[0].text).toBe("#r");
345+
346+
// this is a hacky mock function
347+
(model.autoComplete as unknown as MockAutoComplete).tryComplete();
348+
349+
expect(model.parts.length).toBe(1);
350+
expect(model.parts[0].type).toBe("room-pill");
351+
expect(model.parts[0].text).toBe("#riot-dev");
352+
});
317353
});
318354
describe("emojis", function () {
319355
it("regional emojis should be separated to prevent them to be converted to flag", () => {

0 commit comments

Comments
 (0)