/* * https://github.com/morethanwords/tweb * Copyright (C) 2019-2021 Eduard Kuzmenko * https://github.com/morethanwords/tweb/blob/master/LICENSE */ import rootScope from "../lib/rootScope"; import { i18n } from "../lib/langPack"; import replaceContent from "../helpers/dom/replaceContent"; import { NULL_PEER_ID } from "../lib/mtproto/mtproto_config"; import limitSymbols from "../helpers/string/limitSymbols"; import setInnerHTML from "../helpers/dom/setInnerHTML"; import { AppManagers } from "../lib/appManagers/managers"; import wrapEmojiText from "../lib/richTextProcessor/wrapEmojiText"; import getPeerTitle from "./wrappers/getPeerTitle"; import generateTitleIcons from "./generateTitleIcons"; export type PeerTitleOptions = { peerId?: PeerId, fromName?: string, plainText?: boolean, onlyFirstName?: boolean, dialog?: boolean, limitSymbols?: number, managers?: AppManagers, withIcons?: boolean }; const weakMap: WeakMap = new WeakMap(); rootScope.addEventListener('peer_title_edit', (peerId) => { const elements = Array.from(document.querySelectorAll(`.peer-title[data-peer-id="${peerId}"]`)) as HTMLElement[]; elements.forEach((element) => { const peerTitle = weakMap.get(element); //console.log('in the summer silence i was doing nothing', peerTitle, peerId); if(peerTitle) { peerTitle.update(); } }); }); export default class PeerTitle { public element: HTMLElement; public peerId: PeerId; private fromName: string; private plainText = false; private onlyFirstName = false; private dialog = false; private limitSymbols: number; private managers: AppManagers; private hasInner: boolean; private withIcons: boolean; constructor(options?: PeerTitleOptions) { this.element = document.createElement('span'); this.element.classList.add('peer-title'); this.element.setAttribute('dir', 'auto'); if(options) { this.update(options); } weakMap.set(this.element, this); } public setOptions(options?: PeerTitleOptions) { if(!options) { return; } for(const i in options) { // @ts-ignore const value = options[i]; if(typeof(value) !== 'object') { // @ts-ignore this.element.dataset[i] = value ? '' + (typeof(value) === 'boolean' ? +value : value) : '0'; } // @ts-ignore this[i] = value; } } public async update(options?: PeerTitleOptions) { this.setOptions(options); let fromName = this.fromName; if(fromName !== undefined) { if(this.limitSymbols !== undefined) { fromName = limitSymbols(fromName, this.limitSymbols, this.limitSymbols); } setInnerHTML(this.element, wrapEmojiText(fromName)); return; } this.peerId ??= NULL_PEER_ID; let hasInner: boolean; if(this.peerId !== rootScope.myId || !this.dialog) { const managers = this.managers ?? rootScope.managers; const [title, icons] = await Promise.all([ getPeerTitle(this.peerId, this.plainText, this.onlyFirstName, this.limitSymbols, managers), this.withIcons && generateTitleIcons(this.peerId) ]); if(icons?.length) { const inner = document.createElement('span'); inner.classList.add('peer-title-inner'); hasInner = true; setInnerHTML(inner, title); const fragment = document.createDocumentFragment(); fragment.append(inner, ...icons); setInnerHTML(this.element, fragment); } else { setInnerHTML(this.element, title); } } else { replaceContent(this.element, i18n(this.onlyFirstName ? 'Saved' : 'SavedMessages')); } if(this.hasInner !== hasInner) { this.hasInner = hasInner; this.element.classList.toggle('with-icons', hasInner); } } }