From fa0c505fb4047067a4bcd50fe86a80b96a0a1bb9 Mon Sep 17 00:00:00 2001 From: tienifr Date: Thu, 4 Apr 2024 18:47:04 +0700 Subject: [PATCH 1/3] fix login page appear for a while --- src/CONST.ts | 5 +++++ src/libs/NetworkConnection.ts | 11 +++++++++++ src/libs/actions/Network.ts | 7 ++++++- src/libs/actions/Report.ts | 5 ++++- src/types/onyx/Network.ts | 5 +++++ 5 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/CONST.ts b/src/CONST.ts index 49019170da66..443eb80d3a00 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -978,6 +978,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/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 f5315f2c8006..293bb5a31d81 100644 --- a/src/libs/actions/Report.ts +++ b/src/libs/actions/Report.ts @@ -49,6 +49,7 @@ import * as Environment from '@libs/Environment/Environment'; import * as ErrorUtils from '@libs/ErrorUtils'; import Log from '@libs/Log'; 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'; @@ -151,10 +152,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; }, }); @@ -2245,7 +2248,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; From 9fb92f176ec53aa2c6f5fcb53709e6851d5d35cb Mon Sep 17 00:00:00 2001 From: tienifr Date: Mon, 8 Apr 2024 15:05:32 +0700 Subject: [PATCH 2/3] fix useNetwork --- src/hooks/useNetwork.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hooks/useNetwork.ts b/src/hooks/useNetwork.ts index 9d5e1e75d7c8..79c70771d58d 100644 --- a/src/hooks/useNetwork.ts +++ b/src/hooks/useNetwork.ts @@ -12,7 +12,7 @@ export default function useNetwork({onReconnect = () => {}}: UseNetworkProps = { const callback = useRef(onReconnect); callback.current = onReconnect; - const {isOffline} = useContext(NetworkContext) ?? CONST.DEFAULT_NETWORK_DATA; + const {isOffline, networkStatus} = useContext(NetworkContext) ?? {...CONST.DEFAULT_NETWORK_DATA, networkStatus: CONST.NETWORK.NETWORK_STATUS.UNKNOWN}; const prevOfflineStatusRef = useRef(isOffline); useEffect(() => { // If we were offline before and now we are not offline then we just reconnected @@ -29,5 +29,5 @@ export default function useNetwork({onReconnect = () => {}}: UseNetworkProps = { prevOfflineStatusRef.current = isOffline; }, [isOffline]); - return {isOffline: isOffline ?? false}; + return {isOffline: networkStatus === CONST.NETWORK.NETWORK_STATUS.OFFLINE}; } From a8a55b3797f24148a155d9cd27710aa290059571 Mon Sep 17 00:00:00 2001 From: tienifr Date: Thu, 25 Apr 2024 16:39:52 +0700 Subject: [PATCH 3/3] fix use networkStatus instead of isOffline in useNetwork --- src/hooks/useNetwork.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/hooks/useNetwork.ts b/src/hooks/useNetwork.ts index 79c70771d58d..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, networkStatus} = useContext(NetworkContext) ?? {...CONST.DEFAULT_NETWORK_DATA, networkStatus: CONST.NETWORK.NETWORK_STATUS.UNKNOWN}; + 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: networkStatus === CONST.NETWORK.NETWORK_STATUS.OFFLINE}; + return {isOffline}; }