diff --git a/src/CONST.ts b/src/CONST.ts index b204fcb888fa..8f2848ebdeef 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -1025,6 +1025,11 @@ const CONST = { PROCESS_REQUEST_DELAY_MS: 1000, MAX_PENDING_TIME_MS: 10 * 1000, MAX_REQUEST_RETRIES: 10, + NETWORK_STATUS: { + ONLINE: 'online', + OFFLINE: 'offline', + UNKNOWN: 'unknown', + }, }, WEEK_STARTS_ON: 1, // Monday DEFAULT_TIME_ZONE: {automatic: true, selected: 'America/Los_Angeles'}, diff --git a/src/hooks/useNetwork.ts b/src/hooks/useNetwork.ts index 9d5e1e75d7c8..778fed200b7b 100644 --- a/src/hooks/useNetwork.ts +++ b/src/hooks/useNetwork.ts @@ -12,7 +12,8 @@ export default function useNetwork({onReconnect = () => {}}: UseNetworkProps = { const callback = useRef(onReconnect); callback.current = onReconnect; - const {isOffline} = useContext(NetworkContext) ?? CONST.DEFAULT_NETWORK_DATA; + const {networkStatus} = useContext(NetworkContext) ?? {...CONST.DEFAULT_NETWORK_DATA, networkStatus: CONST.NETWORK.NETWORK_STATUS.UNKNOWN}; + const isOffline = networkStatus === CONST.NETWORK.NETWORK_STATUS.OFFLINE; const prevOfflineStatusRef = useRef(isOffline); useEffect(() => { // If we were offline before and now we are not offline then we just reconnected @@ -29,5 +30,5 @@ export default function useNetwork({onReconnect = () => {}}: UseNetworkProps = { prevOfflineStatusRef.current = isOffline; }, [isOffline]); - return {isOffline: isOffline ?? false}; + return {isOffline}; } diff --git a/src/libs/NetworkConnection.ts b/src/libs/NetworkConnection.ts index 1cf37623ef2e..2077a168b4b9 100644 --- a/src/libs/NetworkConnection.ts +++ b/src/libs/NetworkConnection.ts @@ -1,6 +1,8 @@ import NetInfo from '@react-native-community/netinfo'; +import {isBoolean} from 'lodash'; import throttle from 'lodash/throttle'; import Onyx from 'react-native-onyx'; +import type {ValueOf} from 'type-fest'; import CONFIG from '@src/CONFIG'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -10,6 +12,7 @@ import Log from './Log'; let isOffline = false; let hasPendingNetworkCheck = false; +type NetworkStatus = ValueOf; // Holds all of the callbacks that need to be triggered when the network reconnects let callbackID = 0; @@ -107,6 +110,13 @@ function subscribeToNetInfo(): void { return; } setOfflineStatus((state.isInternetReachable ?? false) === false); + let networkStatus; + if (!isBoolean(state.isInternetReachable)) { + networkStatus = CONST.NETWORK.NETWORK_STATUS.UNKNOWN; + } else { + networkStatus = state.isInternetReachable ? CONST.NETWORK.NETWORK_STATUS.ONLINE : CONST.NETWORK.NETWORK_STATUS.OFFLINE; + } + NetworkActions.setNetWorkStatus(networkStatus); }); } @@ -158,3 +168,4 @@ export default { recheckNetworkConnection, subscribeToNetInfo, }; +export type {NetworkStatus}; diff --git a/src/libs/actions/Network.ts b/src/libs/actions/Network.ts index e71094eded05..afd18f801e8c 100644 --- a/src/libs/actions/Network.ts +++ b/src/libs/actions/Network.ts @@ -1,10 +1,15 @@ import Onyx from 'react-native-onyx'; +import type {NetworkStatus} from '@libs/NetworkConnection'; import ONYXKEYS from '@src/ONYXKEYS'; function setIsOffline(isOffline: boolean) { Onyx.merge(ONYXKEYS.NETWORK, {isOffline}); } +function setNetWorkStatus(status: NetworkStatus) { + Onyx.merge(ONYXKEYS.NETWORK, {networkStatus: status}); +} + function setTimeSkew(skew: number) { Onyx.merge(ONYXKEYS.NETWORK, {timeSkew: skew}); } @@ -20,4 +25,4 @@ function setShouldFailAllRequests(shouldFailAllRequests: boolean) { Onyx.merge(ONYXKEYS.NETWORK, {shouldFailAllRequests}); } -export {setIsOffline, setShouldForceOffline, setShouldFailAllRequests, setTimeSkew}; +export {setIsOffline, setShouldForceOffline, setShouldFailAllRequests, setTimeSkew, setNetWorkStatus}; diff --git a/src/libs/actions/Report.ts b/src/libs/actions/Report.ts index 98300b563e29..03381e727665 100644 --- a/src/libs/actions/Report.ts +++ b/src/libs/actions/Report.ts @@ -59,6 +59,7 @@ import * as ErrorUtils from '@libs/ErrorUtils'; import Log from '@libs/Log'; import * as LoginUtils from '@libs/LoginUtils'; import Navigation from '@libs/Navigation/Navigation'; +import type {NetworkStatus} from '@libs/NetworkConnection'; import LocalNotification from '@libs/Notification/LocalNotification'; import * as PersonalDetailsUtils from '@libs/PersonalDetailsUtils'; import * as PhoneNumber from '@libs/PhoneNumber'; @@ -208,10 +209,12 @@ Onyx.connect({ }); let isNetworkOffline = false; +let networkStatus: NetworkStatus; Onyx.connect({ key: ONYXKEYS.NETWORK, callback: (value) => { isNetworkOffline = value?.isOffline ?? false; + networkStatus = value?.networkStatus ?? CONST.NETWORK.NETWORK_STATUS.UNKNOWN; }, }); @@ -2396,7 +2399,7 @@ function openReportFromDeepLink(url: string) { openReport(reportID, '', [], {}, '0', true); // Show the sign-in page if the app is offline - if (isNetworkOffline) { + if (networkStatus === CONST.NETWORK.NETWORK_STATUS.OFFLINE) { Onyx.set(ONYXKEYS.IS_CHECKING_PUBLIC_ROOM, false); } } else { diff --git a/src/types/onyx/Network.ts b/src/types/onyx/Network.ts index 173ca486b53c..cdfa7e02c8f6 100644 --- a/src/types/onyx/Network.ts +++ b/src/types/onyx/Network.ts @@ -1,3 +1,5 @@ +import type {NetworkStatus} from '@libs/NetworkConnection'; + type Network = { /** Is the network currently offline or not */ isOffline: boolean; @@ -10,6 +12,9 @@ type Network = { /** Skew between the client and server clocks */ timeSkew?: number; + + /** The network's status */ + networkStatus?: NetworkStatus; }; export default Network;