From 0babeff01aedb56fcd23904405d5303f1488c446 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20H=C3=B6glund?= Date: Wed, 18 Feb 2026 13:14:51 +0100 Subject: [PATCH 1/3] Use windowNavigate instead of window.location.href for decorateUrl navigations --- packages/ui/src/contexts/components/SessionTasks.ts | 3 ++- packages/ui/src/contexts/components/SignIn.ts | 3 ++- packages/ui/src/contexts/components/SignUp.ts | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/ui/src/contexts/components/SessionTasks.ts b/packages/ui/src/contexts/components/SessionTasks.ts index 64a6dcfa021..0797956f096 100644 --- a/packages/ui/src/contexts/components/SessionTasks.ts +++ b/packages/ui/src/contexts/components/SessionTasks.ts @@ -1,4 +1,5 @@ import { buildTaskUrl, getTaskEndpoint } from '@clerk/shared/internal/clerk-js/sessionTasks'; +import { windowNavigate } from '@clerk/shared/internal/clerk-js/windowNavigate'; import { useClerk } from '@clerk/shared/react'; import type { DecorateUrl, SessionResource } from '@clerk/shared/types'; import { createContext, useContext } from 'react'; @@ -43,7 +44,7 @@ export const useSessionTasksContext = (): SessionTasksContextType => { // If decorateUrl modified the URL (Safari ITP fix), do a full page navigation // The touch endpoint URL will be an absolute URL starting with http:// or https:// if (decoratedUrl !== redirectUrlComplete && /^https?:\/\//.test(decoratedUrl)) { - window.location.href = decoratedUrl; + windowNavigate(decoratedUrl); return; } diff --git a/packages/ui/src/contexts/components/SignIn.ts b/packages/ui/src/contexts/components/SignIn.ts index 03cb576332e..4e742a5609c 100644 --- a/packages/ui/src/contexts/components/SignIn.ts +++ b/packages/ui/src/contexts/components/SignIn.ts @@ -2,6 +2,7 @@ import { SIGN_IN_INITIAL_VALUE_KEYS } from '@clerk/shared/internal/clerk-js/cons import { RedirectUrls } from '@clerk/shared/internal/clerk-js/redirectUrls'; import { getTaskEndpoint } from '@clerk/shared/internal/clerk-js/sessionTasks'; import { buildURL } from '@clerk/shared/internal/clerk-js/url'; +import { windowNavigate } from '@clerk/shared/internal/clerk-js/windowNavigate'; import { useClerk } from '@clerk/shared/react'; import type { DecorateUrl, SessionResource } from '@clerk/shared/types'; import { isAbsoluteUrl } from '@clerk/shared/url'; @@ -140,7 +141,7 @@ export const useSignInContext = (): SignInContextType => { // If decorateUrl modified the URL (Safari ITP fix), do a full page navigation // The touch endpoint URL will be an absolute URL starting with http:// or https:// if (decoratedUrl !== redirectUrl && /^https?:\/\//.test(decoratedUrl)) { - window.location.href = decoratedUrl; + windowNavigate(decoratedUrl); return; } diff --git a/packages/ui/src/contexts/components/SignUp.ts b/packages/ui/src/contexts/components/SignUp.ts index 7e4315e4a9c..2a4405b0fc1 100644 --- a/packages/ui/src/contexts/components/SignUp.ts +++ b/packages/ui/src/contexts/components/SignUp.ts @@ -2,6 +2,7 @@ import { SIGN_UP_INITIAL_VALUE_KEYS } from '@clerk/shared/internal/clerk-js/cons import { RedirectUrls } from '@clerk/shared/internal/clerk-js/redirectUrls'; import { getTaskEndpoint } from '@clerk/shared/internal/clerk-js/sessionTasks'; import { buildURL } from '@clerk/shared/internal/clerk-js/url'; +import { windowNavigate } from '@clerk/shared/internal/clerk-js/windowNavigate'; import { useClerk } from '@clerk/shared/react'; import type { DecorateUrl, SessionResource } from '@clerk/shared/types'; import { isAbsoluteUrl } from '@clerk/shared/url'; @@ -135,7 +136,7 @@ export const useSignUpContext = (): SignUpContextType => { // If decorateUrl modified the URL (Safari ITP fix), do a full page navigation // The touch endpoint URL will be an absolute URL starting with http:// or https:// if (decoratedUrl !== redirectUrl && /^https?:\/\//.test(decoratedUrl)) { - window.location.href = decoratedUrl; + windowNavigate(decoratedUrl); return; } From 072f7dd888ef904891e4472bb0459d1d34174784 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20H=C3=B6glund?= Date: Wed, 18 Feb 2026 13:16:14 +0100 Subject: [PATCH 2/3] Add empty changeset --- .changeset/yummy-rats-cross.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changeset/yummy-rats-cross.md diff --git a/.changeset/yummy-rats-cross.md b/.changeset/yummy-rats-cross.md new file mode 100644 index 00000000000..151e6aafd51 --- /dev/null +++ b/.changeset/yummy-rats-cross.md @@ -0,0 +1,3 @@ +--- +'@clerk/ui': patch +--- From 4db5ff6246f89c12bde50a3f7d81fafd939245ec Mon Sep 17 00:00:00 2001 From: Nikos Douvlis Date: Wed, 18 Feb 2026 14:51:46 +0200 Subject: [PATCH 3/3] chore: add changeset description --- .changeset/yummy-rats-cross.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.changeset/yummy-rats-cross.md b/.changeset/yummy-rats-cross.md index 151e6aafd51..8857fe10e1d 100644 --- a/.changeset/yummy-rats-cross.md +++ b/.changeset/yummy-rats-cross.md @@ -1,3 +1,5 @@ --- '@clerk/ui': patch --- + +Fix Safari sign-in redirect not completing when using OTP or impersonation.