Telegram Web K with changes to work inside I2P
https://web.telegram.i2p/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
3.9 KiB
123 lines
3.9 KiB
/* |
|
* 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<void>; |
|
|
|
this.lazyLoadQueue.clear(); |
|
if(stickers.length) { |
|
ready = new Promise<void>((resolve) => { |
|
const promises: Promise<any>[] = []; |
|
stickers.forEach(sticker => { |
|
container.append(this.superStickerRenderer.renderSticker(sticker as MyDocument, undefined, promises)); |
|
}); |
|
|
|
(Promise.all(promises) as Promise<any>).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); |
|
} |
|
}
|
|
|