bdc4851210
Render avatar thumb if have queue
57 lines
2.1 KiB
TypeScript
57 lines
2.1 KiB
TypeScript
/*
|
||
* https://github.com/morethanwords/tweb
|
||
* Copyright (C) 2019-2021 Eduard Kuzmenko
|
||
* https://github.com/morethanwords/tweb/blob/master/LICENSE
|
||
*/
|
||
|
||
export const loadedURLs: {[url: string]: boolean} = {};
|
||
const set = (elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, url: string) => {
|
||
if(elem instanceof HTMLImageElement || elem instanceof HTMLVideoElement) elem.src = url;
|
||
else if(elem instanceof SVGImageElement) elem.setAttributeNS(null, 'href', url);
|
||
else elem.style.backgroundImage = 'url(' + url + ')';
|
||
};
|
||
|
||
// проблема функции в том, что она не подходит для ссылок, пригодна только для blob'ов, потому что обычным ссылкам нужен 'load' каждый раз.
|
||
export default async function renderImageFromUrl(elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, url: string, callback?: (err?: Event) => void, useCache = true) {
|
||
if(!url) {
|
||
console.error('renderImageFromUrl: no url?', elem, url);
|
||
callback && callback();
|
||
return;
|
||
}
|
||
|
||
if(((loadedURLs[url]/* && false */) && useCache) || elem instanceof HTMLVideoElement) {
|
||
if(elem) {
|
||
set(elem, url);
|
||
}
|
||
|
||
callback && callback();
|
||
} else {
|
||
const isImage = elem instanceof HTMLImageElement;
|
||
const loader = isImage ? elem as HTMLImageElement : new Image();
|
||
//const loader = new Image();
|
||
loader.src = url;
|
||
//let perf = performance.now();
|
||
loader.addEventListener('load', () => {
|
||
if(!isImage && elem) {
|
||
set(elem, url);
|
||
}
|
||
|
||
loadedURLs[url] = true;
|
||
//console.log('onload:', url, performance.now() - perf);
|
||
if(callback) {
|
||
// TODO: переделать прогрузки аватаров до начала анимации, иначе с этим ожиданием они неприятно появляются
|
||
/* getHeavyAnimationPromise().then(() => {
|
||
callback();
|
||
}); */
|
||
callback();
|
||
}
|
||
|
||
//callback && callback();
|
||
});
|
||
|
||
if(callback) {
|
||
loader.addEventListener('error', callback);
|
||
}
|
||
}
|
||
}
|