TelegramPWA/src/hooks/usePriorityPlaybackCheck.ts
2023-06-12 11:47:13 +02:00

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;