/* * https://github.com/morethanwords/tweb * Copyright (C) 2019-2021 Eduard Kuzmenko * https://github.com/morethanwords/tweb/blob/master/LICENSE */ import getPreviewURLFromBytes from "../helpers/bytes/getPreviewURLFromBytes"; import { renderImageFromUrlPromise } from "../helpers/dom/renderImageFromUrl"; import replaceContent from "../helpers/dom/replaceContent"; import setInnerHTML from "../helpers/dom/setInnerHTML"; import { recordPromise } from "../helpers/recordPromise"; import sequentialDom from "../helpers/sequentialDom"; import { UserProfilePhoto, ChatPhoto } from "../layer"; import type { PeerPhotoSize } from "../lib/appManagers/appAvatarsManager"; import getPeerColorById from "../lib/appManagers/utils/peers/getPeerColorById"; import { NULL_PEER_ID, REPLIES_PEER_ID } from "../lib/mtproto/mtproto_config"; import getAbbreviation from "../lib/richTextProcessor/getAbbreviation"; import rootScope from "../lib/rootScope"; import getPeerInitials from "./wrappers/getPeerInitials"; export async function putAvatar( div: HTMLElement, peerId: PeerId, photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, size: PeerPhotoSize, img = new Image(), onlyThumb = false ) { const r = await rootScope.managers.acknowledged.appAvatarsManager.loadAvatar(peerId, photo, size); const loadPromise = r.result; const cached = r.cached; img.classList.add('avatar-photo'); let renderThumbPromise: Promise; let callback: () => void; let thumbImage: HTMLImageElement; if(cached) { // смотри в misc.ts: renderImageFromUrl callback = () => { replaceContent(div, img); div.dataset.color = ''; }; } else { const animate = rootScope.settings.animationsEnabled; if(animate) { img.classList.add('fade-in'); } let isFullLoaded = false; if(size === 'photo_big') { // let's load small photo first const res = await putAvatar(div, peerId, photo, 'photo_small'); renderThumbPromise = res.loadPromise; thumbImage = res.thumbImage; } else if(photo.stripped_thumb) { thumbImage = new Image(); div.classList.add('avatar-relative'); thumbImage.classList.add('avatar-photo', 'avatar-photo-thumbnail'); const url = getPreviewURLFromBytes(photo.stripped_thumb); renderThumbPromise = renderImageFromUrlPromise(thumbImage, url).then(() => { if(isFullLoaded) { return; } replaceContent(div, thumbImage); }); } callback = () => { isFullLoaded = true; if(thumbImage) { div.append(img); } else { replaceContent(div, img); } setTimeout(() => { if(div.childElementCount) { sequentialDom.mutateElement(img, () => { div.dataset.color = ''; if(animate) { img.classList.remove('fade-in'); } if(thumbImage) { thumbImage.remove(); } }); } }, animate ? 200 : 0); }; } const renderPromise = loadPromise .then((url) => renderImageFromUrlPromise(img, url/* , !cached */)) .then(callback); await (renderThumbPromise || renderPromise); return { cached, loadPromise: renderThumbPromise || renderPromise, thumbImage }; } function set( div: HTMLElement, innerHTML: Parameters[1], color: string, icon: string ) { setInnerHTML(div, innerHTML); div.dataset.color = color; div.classList.remove('tgico-saved', 'tgico-deletedaccount', 'tgico-reply_filled'); icon && div.classList.add(icon); } // peerId === peerId || title export default async function putPhoto( div: HTMLElement, peerId: PeerId, isDialog = false, title = '', onlyThumb = false, isBig?: boolean ) { const myId = rootScope.myId; if(peerId === myId && isDialog) { set(div, '', '', 'tgico-saved'); return; } const managers = rootScope.managers; if(peerId !== NULL_PEER_ID && peerId.isUser()) { const user = await managers.appUsersManager.getUser(peerId); if(user && user.pFlags && user.pFlags.deleted) { set(div, '', getPeerColorById(peerId), 'tgico-deletedaccount'); return; } } const size: PeerPhotoSize = isBig ? 'photo_big' : 'photo_small'; const photo = await managers.appPeersManager.getPeerPhoto(peerId); const avatarAvailable = !!photo; const avatarRendered = !!div.firstElementChild && !(div.firstElementChild as HTMLElement).classList.contains('emoji'); if(!avatarAvailable || !avatarRendered || !(await managers.appAvatarsManager.isAvatarCached(peerId, size))) { let color = ''; if(peerId && (peerId !== myId || !isDialog)) { color = getPeerColorById(peerId); } if(peerId === REPLIES_PEER_ID) { set(div, '', color, 'tgico-reply_filled'); return; } const abbr = await (title ? getAbbreviation(title) : getPeerInitials(peerId, managers)); set(div, abbr, color, ''); //return Promise.resolve(true); } if(avatarAvailable/* && false */) { const promise = putAvatar(div, peerId, photo, size, undefined, onlyThumb); // recordPromise(promise, 'putAvatar-' + peerId); return promise; } }