diff --git a/.changeset/fix_rn_offline_detection.md b/.changeset/fix_rn_offline_detection.md new file mode 100644 index 00000000000..2c496442666 --- /dev/null +++ b/.changeset/fix_rn_offline_detection.md @@ -0,0 +1,5 @@ +--- +"@clerk/shared": patch +--- + +Fix false offline detection in React Native by checking `navigator.product` and `typeof navigator.onLine` before treating the environment as disconnected 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..2e48c090a40 100644 --- a/packages/shared/src/browser.ts +++ b/packages/shared/src/browser.ts @@ -73,6 +73,12 @@ export function isBrowserOnline(): boolean { return false; } + // Some environments (e.g. React Native) define a Navigator object but do not + // implement navigator.onLine as a boolean. Default to online in those cases. + 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