|
|
|
/*
|
|
|
|
* https://github.com/morethanwords/tweb
|
|
|
|
* Copyright (C) 2019-2021 Eduard Kuzmenko
|
|
|
|
* https://github.com/morethanwords/tweb/blob/master/LICENSE
|
|
|
|
*/
|
|
|
|
|
|
|
|
import type ChatInput from './input';
|
|
|
|
import {appendEmoji, getEmojiFromElement} from '../emoticonsDropdown/tabs/emoji';
|
|
|
|
import {ScrollableX} from '../scrollable';
|
|
|
|
import AutocompleteHelper from './autocompleteHelper';
|
|
|
|
import AutocompleteHelperController from './autocompleteHelperController';
|
|
|
|
import {AppManagers} from '../../lib/appManagers/managers';
|
|
|
|
|
|
|
|
export default class EmojiHelper extends AutocompleteHelper {
|
|
|
|
private scrollable: ScrollableX;
|
|
|
|
|
|
|
|
constructor(
|
|
|
|
appendTo: HTMLElement,
|
|
|
|
controller: AutocompleteHelperController,
|
|
|
|
chatInput: ChatInput,
|
|
|
|
private managers: AppManagers
|
|
|
|
) {
|
|
|
|
super({
|
|
|
|
appendTo,
|
|
|
|
controller,
|
|
|
|
listType: 'x',
|
|
|
|
onSelect: (target) => {
|
|
|
|
chatInput.onEmojiSelected(getEmojiFromElement(target as any), true);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
this.container.classList.add('emoji-helper');
|
|
|
|
}
|
|
|
|
|
|
|
|
protected init() {
|
|
|
|
this.list = document.createElement('div');
|
|
|
|
this.list.classList.add('emoji-helper-emojis', 'super-emojis');
|
|
|
|
|
|
|
|
this.container.append(this.list);
|
|
|
|
|
|
|
|
this.scrollable = new ScrollableX(this.container);
|
|
|
|
|
|
|
|
this.addEventListener('visible', () => {
|
|
|
|
setTimeout(() => { // it is not rendered yet
|
|
|
|
this.scrollable.container.scrollLeft = 0;
|
|
|
|
}, 0);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
public render(emojis: string[], waitForKey: boolean) {
|
|
|
|
if(this.init) {
|
|
|
|
if(!emojis.length) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.init();
|
|
|
|
this.init = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
emojis = emojis.slice(0, 80);
|
|
|
|
|
|
|
|
if(emojis.length) {
|
|
|
|
this.list.innerHTML = '';
|
|
|
|
emojis.forEach((emoji) => {
|
|
|
|
appendEmoji(emoji, this.list, false, true);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
this.waitForKey = waitForKey ? ['ArrowUp', 'ArrowDown'] : undefined;
|
|
|
|
this.toggle(!emojis.length);
|
|
|
|
|
|
|
|
/* window.requestAnimationFrame(() => {
|
|
|
|
this.container.style.width = (3 * 2) + (emojis.length * 44) + 'px';
|
|
|
|
}); */
|
|
|
|
}
|
|
|
|
|
|
|
|
public checkQuery(query: string, firstChar: string) {
|
|
|
|
const middleware = this.controller.getMiddleware();
|
|
|
|
this.managers.appEmojiManager.getBothEmojiKeywords().then(async() => {
|
|
|
|
if(!middleware()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const q = query.replace(/^:/, '');
|
|
|
|
const emojis = await this.managers.appEmojiManager.searchEmojis(q);
|
|
|
|
if(!middleware()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.render(emojis, firstChar !== ':');
|
|
|
|
// console.log(emojis);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|