70 lines
1.5 KiB
TypeScript
70 lines
1.5 KiB
TypeScript
import { useEffect } from '../lib/teact/teact';
|
|
|
|
import { createCallbackManager } from '../util/callbacks';
|
|
|
|
import useLastCallback from './useLastCallback';
|
|
|
|
const startCallbacks = createCallbackManager();
|
|
const endCallbacks = createCallbackManager();
|
|
|
|
let timeout: number | undefined;
|
|
let isActive = false;
|
|
|
|
const usePriorityPlaybackCheck = (
|
|
onStart?: AnyToVoidFunction,
|
|
onEnd?: AnyToVoidFunction,
|
|
isDisabled = false,
|
|
) => {
|
|
const lastOnStart = useLastCallback(onStart);
|
|
const lastOnEnd = useLastCallback(onEnd);
|
|
|
|
useEffect(() => {
|
|
if (isDisabled) {
|
|
return undefined;
|
|
}
|
|
|
|
if (isActive) {
|
|
lastOnStart();
|
|
}
|
|
|
|
startCallbacks.addCallback(lastOnStart);
|
|
endCallbacks.addCallback(lastOnEnd);
|
|
|
|
return () => {
|
|
endCallbacks.removeCallback(lastOnEnd);
|
|
startCallbacks.removeCallback(lastOnStart);
|
|
};
|
|
}, [isDisabled, lastOnStart, lastOnEnd]);
|
|
};
|
|
|
|
export function isPriorityPlaybackActive() {
|
|
return isActive;
|
|
}
|
|
|
|
export function dispatchPriorityPlaybackEvent() {
|
|
if (!isActive) {
|
|
isActive = true;
|
|
startCallbacks.runCallbacks();
|
|
}
|
|
|
|
if (timeout) {
|
|
clearTimeout(timeout);
|
|
timeout = undefined;
|
|
}
|
|
|
|
// Race condition may happen if another `dispatchPriorityPlaybackEvent` is called before `onEnd`
|
|
function onEnd() {
|
|
if (timeout) {
|
|
clearTimeout(timeout);
|
|
timeout = undefined;
|
|
}
|
|
|
|
isActive = false;
|
|
endCallbacks.runCallbacks();
|
|
}
|
|
|
|
return onEnd;
|
|
}
|
|
|
|
export default usePriorityPlaybackCheck;
|