Skip to content

Commit f4034ea

Browse files
authored
fix(clerk-js): Use the correct returnBack url when GoogleOneTap remains open across navigations (#3410)
1 parent d1c3c30 commit f4034ea

File tree

3 files changed

+74
-80
lines changed

3 files changed

+74
-80
lines changed

.changeset/large-cars-flash.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@clerk/clerk-js': patch
3+
---
4+
5+
Bug fix: Use the correct returnBack url when GoogleOneTap remains open across navigations.
6+
Previously it will only use the url that existed in the browser url bar at the time the component was initially rendered.

packages/clerk-js/src/ui/components/GoogleOneTap/one-tap-start.tsx

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,35 +16,14 @@ function _OneTapStart(): JSX.Element | null {
1616
const { navigate } = useRouter();
1717

1818
const ctx = useGoogleOneTapContext();
19-
const {
20-
signInUrl,
21-
signUpUrl,
22-
continueSignUpUrl,
23-
secondFactorUrl,
24-
firstFactorUrl,
25-
signUpForceRedirectUrl,
26-
signInForceRedirectUrl,
27-
} = ctx;
2819

2920
async function oneTapCallback(response: GISCredentialResponse) {
3021
isPromptedRef.current = false;
3122
try {
3223
const res = await clerk.authenticateWithGoogleOneTap({
3324
token: response.credential,
3425
});
35-
await clerk.handleGoogleOneTapCallback(
36-
res,
37-
{
38-
signInUrl,
39-
signUpUrl,
40-
continueSignUpUrl,
41-
secondFactorUrl,
42-
firstFactorUrl,
43-
signUpForceRedirectUrl,
44-
signInForceRedirectUrl,
45-
},
46-
navigate,
47-
);
26+
await clerk.handleGoogleOneTapCallback(res, ctx.generateCallbackUrls(window.location.href), navigate);
4827
} catch (e) {
4928
console.error(e);
5029
}

packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx

Lines changed: 67 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { useClerk } from '@clerk/shared/react';
22
import { snakeToCamel } from '@clerk/shared/underscore';
3-
import type { OrganizationResource, UserResource } from '@clerk/types';
4-
import React, { useMemo } from 'react';
3+
import type { HandleOAuthCallbackParams, OrganizationResource, UserResource } from '@clerk/types';
4+
import React, { useCallback, useMemo } from 'react';
55

66
import { SIGN_IN_INITIAL_VALUE_KEYS, SIGN_UP_INITIAL_VALUE_KEYS } from '../../core/constants';
77
import { buildURL, createDynamicParamParser } from '../../utils';
@@ -506,67 +506,76 @@ export const useGoogleOneTapContext = () => {
506506
throw new Error('Clerk: useGoogleOneTapContext called outside GoogleOneTap.');
507507
}
508508

509-
const redirectUrls = new RedirectUrls(
510-
options,
511-
{
512-
...ctx,
513-
signInFallbackRedirectUrl: window.location.href,
514-
signUpFallbackRedirectUrl: window.location.href,
509+
const generateCallbackUrls = useCallback(
510+
(returnBackUrl: string): HandleOAuthCallbackParams => {
511+
const redirectUrls = new RedirectUrls(
512+
options,
513+
{
514+
...ctx,
515+
signInFallbackRedirectUrl: returnBackUrl,
516+
signUpFallbackRedirectUrl: returnBackUrl,
517+
},
518+
queryParams,
519+
);
520+
521+
let signUpUrl = options.signUpUrl || displayConfig.signUpUrl;
522+
let signInUrl = options.signInUrl || displayConfig.signInUrl;
523+
524+
const preservedParams = redirectUrls.getPreservedSearchParams();
525+
signInUrl = buildURL({ base: signInUrl, hashSearchParams: [queryParams, preservedParams] }, { stringify: true });
526+
signUpUrl = buildURL({ base: signUpUrl, hashSearchParams: [queryParams, preservedParams] }, { stringify: true });
527+
528+
const signInForceRedirectUrl = redirectUrls.getAfterSignInUrl();
529+
const signUpForceRedirectUrl = redirectUrls.getAfterSignUpUrl();
530+
531+
const signUpContinueUrl = buildURL(
532+
{
533+
base: signUpUrl,
534+
hashPath: '/continue',
535+
hashSearch: new URLSearchParams({
536+
sign_up_force_redirect_url: signUpForceRedirectUrl,
537+
}).toString(),
538+
},
539+
{ stringify: true },
540+
);
541+
542+
const firstFactorUrl = buildURL(
543+
{
544+
base: signInUrl,
545+
hashPath: '/factor-one',
546+
hashSearch: new URLSearchParams({
547+
sign_in_force_redirect_url: signInForceRedirectUrl,
548+
}).toString(),
549+
},
550+
{ stringify: true },
551+
);
552+
const secondFactorUrl = buildURL(
553+
{
554+
base: signInUrl,
555+
hashPath: '/factor-two',
556+
hashSearch: new URLSearchParams({
557+
sign_in_force_redirect_url: signInForceRedirectUrl,
558+
}).toString(),
559+
},
560+
{ stringify: true },
561+
);
562+
563+
return {
564+
signInUrl,
565+
signUpUrl,
566+
firstFactorUrl,
567+
secondFactorUrl,
568+
continueSignUpUrl: signUpContinueUrl,
569+
signInForceRedirectUrl,
570+
signUpForceRedirectUrl,
571+
};
515572
},
516-
queryParams,
517-
);
518-
519-
let signUpUrl = options.signUpUrl || displayConfig.signUpUrl;
520-
let signInUrl = options.signInUrl || displayConfig.signInUrl;
521-
522-
const preservedParams = redirectUrls.getPreservedSearchParams();
523-
signInUrl = buildURL({ base: signInUrl, hashSearchParams: [queryParams, preservedParams] }, { stringify: true });
524-
signUpUrl = buildURL({ base: signUpUrl, hashSearchParams: [queryParams, preservedParams] }, { stringify: true });
525-
526-
const signInForceRedirectUrl = redirectUrls.getAfterSignInUrl();
527-
const signUpForceRedirectUrl = redirectUrls.getAfterSignUpUrl();
528-
529-
const signUpContinueUrl = buildURL(
530-
{
531-
base: signUpUrl,
532-
hashPath: '/continue',
533-
hashSearch: new URLSearchParams({
534-
sign_up_force_redirect_url: signUpForceRedirectUrl,
535-
}).toString(),
536-
},
537-
{ stringify: true },
538-
);
539-
540-
const firstFactorUrl = buildURL(
541-
{
542-
base: signInUrl,
543-
hashPath: '/factor-one',
544-
hashSearch: new URLSearchParams({
545-
sign_in_force_redirect_url: signInForceRedirectUrl,
546-
}).toString(),
547-
},
548-
{ stringify: true },
549-
);
550-
const secondFactorUrl = buildURL(
551-
{
552-
base: signInUrl,
553-
hashPath: '/factor-two',
554-
hashSearch: new URLSearchParams({
555-
sign_in_force_redirect_url: signInForceRedirectUrl,
556-
}).toString(),
557-
},
558-
{ stringify: true },
573+
[ctx, displayConfig.signInUrl, displayConfig.signUpUrl, options, queryParams],
559574
);
560575

561576
return {
562577
...ctx,
563578
componentName,
564-
signInUrl,
565-
signUpUrl,
566-
firstFactorUrl,
567-
secondFactorUrl,
568-
continueSignUpUrl: signUpContinueUrl,
569-
signInForceRedirectUrl,
570-
signUpForceRedirectUrl,
579+
generateCallbackUrls,
571580
};
572581
};

0 commit comments

Comments
 (0)