From f61e18f877257169f3089deb2c895c6ed9cef90a Mon Sep 17 00:00:00 2001 From: Eliot Gevers Date: Sun, 15 Mar 2026 15:59:07 +0100 Subject: [PATCH] fix(shared): treat React Native as online without navigator.onLine --- packages/shared/src/__tests__/browser.spec.ts | 13 +++++++++++++ packages/shared/src/browser.ts | 10 ++++++++++ 2 files changed, 23 insertions(+) diff --git a/packages/shared/src/__tests__/browser.spec.ts b/packages/shared/src/__tests__/browser.spec.ts index 4cb73c6989a..cc2626d6b7a 100644 --- a/packages/shared/src/__tests__/browser.spec.ts +++ b/packages/shared/src/__tests__/browser.spec.ts @@ -194,4 +194,17 @@ describe('isValidBrowserOnline', () => { expect(isValidBrowserOnline()).toBe(true); }); + + it('returns TRUE in React Native when navigator.onLine is not implemented', () => { + userAgentGetter.mockReturnValue(undefined); + webdriverGetter.mockReturnValue(undefined); + onLineGetter.mockReturnValue(undefined); + connectionGetter.mockReturnValue(undefined); + Object.defineProperty(window.navigator, 'product', { + configurable: true, + get: () => 'ReactNative', + }); + + expect(isValidBrowserOnline()).toBe(true); + }); }); diff --git a/packages/shared/src/browser.ts b/packages/shared/src/browser.ts index ea61931f6d3..8c3f037c001 100644 --- a/packages/shared/src/browser.ts +++ b/packages/shared/src/browser.ts @@ -73,6 +73,16 @@ export function isBrowserOnline(): boolean { return false; } + // React Native / Expo defines a Navigator object but does not implement + // the browser-only navigator.onLine API. + if (navigator.product === 'ReactNative') { + return true; + } + + if (typeof navigator.onLine !== 'boolean') { + return true; + } + // navigator.onLine is the standard API and is reliable for detecting // complete disconnection (airplane mode, WiFi off, etc.). // The experimental navigator.connection API (rtt/downlink) was previously