Fix emoji completion; don't show when typing times

* Do not pop picker in timestamps
* Fix timestamp triggering emoji picker

Co-authored-by: Sidney Keese <sidney@carbonfive.com>
This commit is contained in:
Chris Svenningsen 2020-10-26 17:13:49 -07:00 committed by Evan Hahn
parent 5099a415f9
commit 6a026c6439
2 changed files with 63 additions and 2 deletions

View file

@ -1,6 +1,7 @@
import Quill from 'quill'; import Quill from 'quill';
import Delta from 'quill-delta'; import Delta from 'quill-delta';
import React from 'react'; import React from 'react';
import _ from 'lodash';
import { Popper } from 'react-popper'; import { Popper } from 'react-popper';
import classNames from 'classnames'; import classNames from 'classnames';
@ -91,7 +92,7 @@ export class EmojiCompletion {
this.quill.keyboard.addBinding({ key: 39 }, clearResults); // 39 = Right this.quill.keyboard.addBinding({ key: 39 }, clearResults); // 39 = Right
this.quill.keyboard.addBinding({ key: 40 }, changeIndex(1)); // 40 = Down this.quill.keyboard.addBinding({ key: 40 }, changeIndex(1)); // 40 = Down
this.quill.on('text-change', this.onTextChange.bind(this)); this.quill.on('text-change', _.debounce(this.onTextChange.bind(this), 100));
} }
destroy(): void { destroy(): void {
@ -127,7 +128,9 @@ export class EmojiCompletion {
const [leftLeafText, rightLeafText] = this.getCurrentLeafTextPartitions(); const [leftLeafText, rightLeafText] = this.getCurrentLeafTextPartitions();
const leftTokenTextMatch = /:([-+0-9a-z_]*)(:?)$/.exec(leftLeafText); const leftTokenTextMatch = /(?<=^|\s):([-+0-9a-z_]*)(:?)$/.exec(
leftLeafText
);
const rightTokenTextMatch = /^([-+0-9a-z_]*):/.exec(rightLeafText); const rightTokenTextMatch = /^([-+0-9a-z_]*):/.exec(rightLeafText);
if (!leftTokenTextMatch) { if (!leftTokenTextMatch) {

View file

@ -116,6 +116,27 @@ describe('emojiCompletion', () => {
}); });
}); });
describe('given a colon in a string (but not an emoji)', () => {
beforeEach(function beforeEach() {
mockQuill.getSelection.returns({
index: 5,
length: 0,
});
const blot = {
text: '10:30',
};
mockQuill.getLeaf.returns([blot, 5]);
emojiCompletion.onTextChange();
});
it('resets the completion', () => {
assert.equal(emojiCompletion.results.length, 0);
assert.equal(emojiCompletion.index, 0);
});
});
describe('given an emoji is starting but does not have 2 characters', () => { describe('given an emoji is starting but does not have 2 characters', () => {
beforeEach(function beforeEach() { beforeEach(function beforeEach() {
mockQuill.getSelection.returns({ mockQuill.getSelection.returns({
@ -213,6 +234,43 @@ describe('emojiCompletion', () => {
}); });
}); });
describe('and given it matches a short name inside a larger string', () => {
const text = 'have a :smile: nice day';
beforeEach(function beforeEach() {
const blot = {
text,
};
mockQuill.getSelection.returns({
index: 13,
length: 0,
});
mockQuill.getLeaf.returns([blot, 13]);
emojiCompletion.onTextChange();
});
it('inserts the emoji at the current cursor position', () => {
const [emoji, index, range] = insertEmojiStub.args[0];
assert.equal(emoji.short_name, 'smile');
assert.equal(index, 7);
assert.equal(range, 7);
});
it('resets the completion', () => {
assert.equal(emojiCompletion.results.length, 0);
assert.equal(emojiCompletion.index, 0);
});
it('sets the quill selection to the right cursor position', () => {
const [index, range] = mockQuill.setSelection.args[0];
assert.equal(index, 8);
assert.equal(range, 0);
});
});
describe('and given it does not match a short name', () => { describe('and given it does not match a short name', () => {
const text = ':smyle:'; const text = ':smyle:';