diff --git a/.changeset/yummy-rats-cross.md b/.changeset/yummy-rats-cross.md new file mode 100644 index 00000000000..8857fe10e1d --- /dev/null +++ b/.changeset/yummy-rats-cross.md @@ -0,0 +1,5 @@ +--- +'@clerk/ui': patch +--- + +Fix Safari sign-in redirect not completing when using OTP or impersonation. 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; }