TelegramPWA/src/hooks/window/useBackgroundMode.ts
2024-01-12 13:06:35 +01:00

55 lines
1.2 KiB
TypeScript

import { useEffect } from '../../lib/teact/teact';
import { createCallbackManager } from '../../util/callbacks';
import useLastCallback from '../useLastCallback';
const blurCallbacks = createCallbackManager();
const focusCallbacks = createCallbackManager();
let isFocused = document.hasFocus();
window.addEventListener('blur', () => {
if (!isFocused) {
return;
}
isFocused = false;
blurCallbacks.runCallbacks();
});
window.addEventListener('focus', () => {
isFocused = true;
focusCallbacks.runCallbacks();
});
export default function useBackgroundMode(
onBlur?: AnyToVoidFunction,
onFocus?: AnyToVoidFunction,
isDisabled = false,
) {
const lastOnBlur = useLastCallback(onBlur);
const lastOnFocus = useLastCallback(onFocus);
useEffect(() => {
if (isDisabled) {
return undefined;
}
if (!isFocused) {
lastOnBlur();
}
blurCallbacks.addCallback(lastOnBlur);
focusCallbacks.addCallback(lastOnFocus);
return () => {
focusCallbacks.removeCallback(lastOnFocus);
blurCallbacks.removeCallback(lastOnBlur);
};
}, [isDisabled, lastOnBlur, lastOnFocus]);
}
export function isBackgroundModeActive() {
return !isFocused;
}