|
1 | 1 | import { useClerk } from '@clerk/shared/react'; |
2 | 2 | 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'; |
5 | 5 |
|
6 | 6 | import { SIGN_IN_INITIAL_VALUE_KEYS, SIGN_UP_INITIAL_VALUE_KEYS } from '../../core/constants'; |
7 | 7 | import { buildURL, createDynamicParamParser } from '../../utils'; |
@@ -506,67 +506,76 @@ export const useGoogleOneTapContext = () => { |
506 | 506 | throw new Error('Clerk: useGoogleOneTapContext called outside GoogleOneTap.'); |
507 | 507 | } |
508 | 508 |
|
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 | + }; |
515 | 572 | }, |
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], |
559 | 574 | ); |
560 | 575 |
|
561 | 576 | return { |
562 | 577 | ...ctx, |
563 | 578 | componentName, |
564 | | - signInUrl, |
565 | | - signUpUrl, |
566 | | - firstFactorUrl, |
567 | | - secondFactorUrl, |
568 | | - continueSignUpUrl: signUpContinueUrl, |
569 | | - signInForceRedirectUrl, |
570 | | - signUpForceRedirectUrl, |
| 579 | + generateCallbackUrls, |
571 | 580 | }; |
572 | 581 | }; |
0 commit comments