/* * https://github.com/morethanwords/tweb * Copyright (C) 2019-2021 Eduard Kuzmenko * https://github.com/morethanwords/tweb/blob/master/LICENSE */ import mediaSizes from "../../helpers/mediaSizes"; import { MyDocument } from "../../lib/appManagers/appDocsManager"; import { CHAT_ANIMATION_GROUP } from "../../lib/appManagers/appImManager"; import appStickersManager from "../../lib/appManagers/appStickersManager"; import rootScope from "../../lib/rootScope"; import { EmoticonsDropdown } from "../emoticonsDropdown"; import { SuperStickerRenderer } from "../emoticonsDropdown/tabs/stickers"; import LazyLoadQueue from "../lazyLoadQueue"; import Scrollable from "../scrollable"; import AutocompleteHelper from "./autocompleteHelper"; import AutocompleteHelperController from "./autocompleteHelperController"; export default class StickersHelper extends AutocompleteHelper { private scrollable: Scrollable; private superStickerRenderer: SuperStickerRenderer; private lazyLoadQueue: LazyLoadQueue; private onChangeScreen: () => void; constructor(appendTo: HTMLElement, controller: AutocompleteHelperController) { super({ appendTo, controller, listType: 'xy', onSelect: (target) => { return !EmoticonsDropdown.onMediaClick({target}, true); }, waitForKey: ['ArrowUp', 'ArrowDown'] }); this.container.classList.add('stickers-helper'); this.addEventListener('visible', () => { setTimeout(() => { // it is not rendered yet this.scrollable.container.scrollTop = 0; }, 0); rootScope.dispatchEvent('choosing_sticker', true); }); this.addEventListener('hidden', () => { if(this.onChangeScreen) { mediaSizes.removeEventListener('changeScreen', this.onChangeScreen); this.onChangeScreen = undefined; } rootScope.dispatchEvent('choosing_sticker', false); }); } public checkEmoticon(emoticon: string) { const middleware = this.controller.getMiddleware(); if(this.lazyLoadQueue) { this.lazyLoadQueue.clear(); } appStickersManager.preloadAnimatedEmojiSticker(emoticon); appStickersManager.getStickersByEmoticon(emoticon) .then((stickers) => { if(!middleware()) { return; } if(this.init) { this.init(); this.init = null; } const container = this.list.cloneNode() as HTMLElement; let ready: Promise; this.lazyLoadQueue.clear(); if(stickers.length) { ready = new Promise((resolve) => { const promises: Promise[] = []; stickers.forEach(sticker => { container.append(this.superStickerRenderer.renderSticker(sticker as MyDocument, undefined, promises)); }); (Promise.all(promises) as Promise).finally(resolve); }); } else { ready = Promise.resolve(); } ready.then(() => { this.list.replaceWith(container); this.list = container; if(!this.onChangeScreen) { this.onChangeScreen = () => { const width = (this.list.childElementCount * mediaSizes.active.esgSticker.width) + (this.list.childElementCount - 1 * 1); this.list.style.width = width + 'px'; }; mediaSizes.addEventListener('changeScreen', this.onChangeScreen); } this.onChangeScreen(); this.toggle(!stickers.length); this.scrollable.scrollTop = 0; }); }); } protected init() { this.list = document.createElement('div'); this.list.classList.add('stickers-helper-stickers', 'super-stickers'); this.container.append(this.list); this.scrollable = new Scrollable(this.container); this.lazyLoadQueue = new LazyLoadQueue(); this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, CHAT_ANIMATION_GROUP); } }