/* * https://github.com/morethanwords/tweb * Copyright (C) 2019-2021 Eduard Kuzmenko * https://github.com/morethanwords/tweb/blob/master/LICENSE */ import {UserProfilePhoto, ChatPhoto, InputFileLocation} from '../../layer'; import {DownloadOptions} from '../mtproto/apiFileManager'; import {AppManager} from './manager'; export type PeerPhotoSize = 'photo_small' | 'photo_big'; export class AppAvatarsManager extends AppManager { private savedAvatarURLs: { [peerId: PeerId]: { [size in PeerPhotoSize]?: string | Promise } } = {}; protected after() { this.rootScope.addEventListener('avatar_update', (peerId) => { this.removeFromAvatarsCache(peerId); }); } public isAvatarCached(peerId: PeerId, size?: PeerPhotoSize) { const saved = this.savedAvatarURLs[peerId]; if(size === undefined) { return !!saved; } return !!(saved && saved[size] && !(saved[size] instanceof Promise)); } public removeFromAvatarsCache(peerId: PeerId) { if(this.savedAvatarURLs[peerId]) { delete this.savedAvatarURLs[peerId]; } } public loadAvatar(peerId: PeerId, photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, size: PeerPhotoSize) { let saved = this.savedAvatarURLs[peerId]; if(!saved || !saved[size]) { if(!saved) { saved = this.savedAvatarURLs[peerId] = {}; } // console.warn('will invoke downloadSmallFile:', peerId); const peerPhotoFileLocation: InputFileLocation.inputPeerPhotoFileLocation = { _: 'inputPeerPhotoFileLocation', pFlags: {}, peer: this.appPeersManager.getInputPeerById(peerId), photo_id: photo.photo_id }; const downloadOptions: DownloadOptions = {dcId: photo.dc_id, location: peerPhotoFileLocation}; if(size === 'photo_big') { peerPhotoFileLocation.pFlags.big = true; downloadOptions.limitPart = 512 * 1024; } /* let str: string; const time = Date.now(); if(peerId === 0) { str = `download avatar ${peerId}`; } */ const promise = this.apiFileManager.download(downloadOptions); return saved[size] = promise.then((blob) => { return saved[size] = URL.createObjectURL(blob); /* if(str) { console.log(str, Date.now() / 1000, Date.now() - time); } */ }); } else { return saved[size]; } } }