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.
 
 
 
 
 

101 lines
3.0 KiB

/*
* https://github.com/morethanwords/tweb
* Copyright (C) 2019-2021 Eduard Kuzmenko
* https://github.com/morethanwords/tweb/blob/master/LICENSE
*/
// * Jolly Cobra's useHeavyAnimationCheck.ts, patched
import { AnyToVoidFunction } from '../types';
import ListenerSetter from '../helpers/listenerSetter';
import deferredPromise, { CancellablePromise } from '../helpers/cancellablePromise';
import rootScope from '../lib/rootScope';
import DEBUG from '../config/debug';
import pause from '../helpers/schedulers/pause';
const ANIMATION_START_EVENT = 'event-heavy-animation-start';
const ANIMATION_END_EVENT = 'event-heavy-animation-end';
let isAnimating = false;
let heavyAnimationPromise: CancellablePromise<void> = deferredPromise<void>();
let promisesInQueue = 0;
heavyAnimationPromise.resolve();
const log = console.log.bind(console.log, '[HEAVY-ANIMATION]:');
export function dispatchHeavyAnimationEvent(promise: Promise<any>, timeout?: number) {
if(!isAnimating) {
heavyAnimationPromise = deferredPromise<void>();
rootScope.dispatchEvent(ANIMATION_START_EVENT);
isAnimating = true;
DEBUG && log('start');
}
++promisesInQueue;
DEBUG && log('attach promise, length:', promisesInQueue, timeout);
const promises = [
timeout !== undefined ? pause(timeout) : undefined,
promise.finally(() => {})
].filter(Boolean);
const perf = performance.now();
const _heavyAnimationPromise = heavyAnimationPromise;
Promise.race(promises).then(() => {
if(heavyAnimationPromise !== _heavyAnimationPromise || heavyAnimationPromise.isFulfilled) { // interrupted
return;
}
--promisesInQueue;
DEBUG && log('promise end, length:', promisesInQueue, performance.now() - perf);
if(promisesInQueue <= 0) {
onHeavyAnimationEnd();
}
});
return heavyAnimationPromise;
}
function onHeavyAnimationEnd() {
if(heavyAnimationPromise.isFulfilled) {
return;
}
isAnimating = false;
promisesInQueue = 0;
rootScope.dispatchEvent(ANIMATION_END_EVENT);
heavyAnimationPromise.resolve();
DEBUG && log('end');
}
export function interruptHeavyAnimation() {
onHeavyAnimationEnd();
}
export function getHeavyAnimationPromise() {
return heavyAnimationPromise;
}
export default function(
handleAnimationStart: AnyToVoidFunction,
handleAnimationEnd: AnyToVoidFunction,
listenerSetter?: ListenerSetter
) {
//useEffect(() => {
if(isAnimating) {
handleAnimationStart();
}
const add = listenerSetter ? listenerSetter.add(rootScope) : rootScope.addEventListener.bind(rootScope);
const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, rootScope) : rootScope.removeEventListener.bind(rootScope);
add(ANIMATION_START_EVENT, handleAnimationStart);
add(ANIMATION_END_EVENT, handleAnimationEnd);
return () => {
remove(ANIMATION_END_EVENT, handleAnimationEnd);
remove(ANIMATION_START_EVENT, handleAnimationStart);
};
//}, [handleAnimationEnd, handleAnimationStart]);
}