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.
107 lines
3.1 KiB
107 lines
3.1 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 DEBUG from '../config/debug'; |
|
import pause from '../helpers/schedulers/pause'; |
|
import EventListenerBase from '../helpers/eventListenerBase'; |
|
|
|
const eventListener = new EventListenerBase<{ |
|
start: () => void, |
|
end: () => void |
|
}>(); |
|
const ANIMATION_START_EVENT = 'start'; |
|
const ANIMATION_END_EVENT = '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>(); |
|
eventListener.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; |
|
} |
|
|
|
(window as any).dispatchHeavyAnimationEvent = dispatchHeavyAnimationEvent; |
|
|
|
function onHeavyAnimationEnd() { |
|
if(heavyAnimationPromise.isFulfilled) { |
|
return; |
|
} |
|
|
|
isAnimating = false; |
|
promisesInQueue = 0; |
|
eventListener.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(eventListener) : eventListener.addEventListener.bind(eventListener); |
|
const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, eventListener) : eventListener.removeEventListener.bind(eventListener); |
|
add(ANIMATION_START_EVENT, handleAnimationStart); |
|
add(ANIMATION_END_EVENT, handleAnimationEnd); |
|
|
|
return () => { |
|
remove(ANIMATION_END_EVENT, handleAnimationEnd); |
|
remove(ANIMATION_START_EVENT, handleAnimationStart); |
|
}; |
|
// }, [handleAnimationEnd, handleAnimationStart]); |
|
}
|
|
|