From f61e18f877257169f3089deb2c895c6ed9cef90a Mon Sep 17 00:00:00 2001 From: Eliot Gevers Date: Sun, 15 Mar 2026 15:59:07 +0100 Subject: [PATCH 1/3] 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 From ee4c13fb25d21c8d348a2eadd3c4c629b46cbf75 Mon Sep 17 00:00:00 2001 From: ChrisCanin Date: Tue, 17 Mar 2026 10:04:33 -0700 Subject: [PATCH 2/3] chore: add changeset for RN offline detection fix --- .changeset/fix_rn_offline_detection.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/fix_rn_offline_detection.md 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 From 50ab3b9a826c142b6f97307fc85fcbbe7b04b386 Mon Sep 17 00:00:00 2001 From: ChrisCanin Date: Wed, 18 Mar 2026 08:16:10 -0700 Subject: [PATCH 3/3] simplify isBrowserOnline: drop redundant ReactNative product check --- packages/shared/src/browser.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/shared/src/browser.ts b/packages/shared/src/browser.ts index 8c3f037c001..2e48c090a40 100644 --- a/packages/shared/src/browser.ts +++ b/packages/shared/src/browser.ts @@ -73,12 +73,8 @@ 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; - } - + // 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; }