TelegramPWA/src/hooks/useBackgroundMode.ts
2023-04-26 21:18:50 +04: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;
}