react-native-unit-components
Version:
Unit React Native components
53 lines (49 loc) • 2.1 kB
JavaScript
/* eslint-disable @typescript-eslint/no-explicit-any */
import { useEffect, useRef, useState } from 'react';
import { AppState } from 'react-native';
const getIsAppActive = currentAppState => {
return currentAppState !== 'background' && currentAppState !== 'inactive';
};
const BACKGROUND_THRESHOLD = 30000; // 30 seconds in milliseconds
/*
* This hook is used to check if the app is in the background for a long period of time.
* If yes - returns true and trigger closing the bottomsheet.
* If no - returns false and keep the bottomsheet open.
*
* Returns false unless background time is more than 30 seconds.
*/
export const useIsBackFromLongBackground = () => {
const appState = useRef(AppState.currentState);
const [isLongBackgroundTime, setIsLongBackgroundTime] = useState(false);
const backgroundTimestamp = useRef(null);
const activeTimestamp = useRef(null);
useEffect(() => {
const subscription = AppState.addEventListener('change', nextAppState => {
const nextAppStateActive = getIsAppActive(nextAppState);
const currentAppStateActive = getIsAppActive(appState.current);
if (!nextAppStateActive && currentAppStateActive) {
// Set background timestamp when first entering background
backgroundTimestamp.current = Date.now();
activeTimestamp.current = null;
} else if (nextAppStateActive && !currentAppStateActive) {
// Set active timestamp when coming back from background
activeTimestamp.current = Date.now();
// Check if time difference is more than threshold
if (activeTimestamp.current - (backgroundTimestamp.current ?? 0) > BACKGROUND_THRESHOLD) {
setIsLongBackgroundTime(true);
} else {
setIsLongBackgroundTime(false);
}
// Reset timestamps for next cycle
backgroundTimestamp.current = null;
activeTimestamp.current = null;
}
appState.current = nextAppState;
});
return () => {
subscription.remove();
};
}, []);
return isLongBackgroundTime;
};
//# sourceMappingURL=useAppStateListener.js.map