diff --git a/.changeset/cyan-pots-attack.md b/.changeset/cyan-pots-attack.md new file mode 100644 index 00000000000..0df19c3d7c0 --- /dev/null +++ b/.changeset/cyan-pots-attack.md @@ -0,0 +1,7 @@ +--- +'@clerk/astro': patch +'@clerk/clerk-react': patch +'@clerk/types': patch +--- + +Ensure proper typing for `SignUpButton` and only allow `unsafeMetadata={...}` when `mode="modal"` diff --git a/packages/astro/src/react/SignUpButton.tsx b/packages/astro/src/react/SignUpButton.tsx index 9b54416ae5c..d8cb7d17b8f 100644 --- a/packages/astro/src/react/SignUpButton.tsx +++ b/packages/astro/src/react/SignUpButton.tsx @@ -7,15 +7,8 @@ export type { SignUpButtonProps }; export const SignUpButton = withClerk( ({ clerk, children, ...props }: WithClerkProp>) => { - const { - fallbackRedirectUrl, - forceRedirectUrl, - signInFallbackRedirectUrl, - signInForceRedirectUrl, - mode, - unsafeMetadata, - ...rest - } = props; + const { fallbackRedirectUrl, forceRedirectUrl, signInFallbackRedirectUrl, signInForceRedirectUrl, mode, ...rest } = + props; children = normalizeWithDefaultValue(children, 'Sign up'); const child = assertSingleChild(children)('SignUpButton'); @@ -26,7 +19,6 @@ export const SignUpButton = withClerk( forceRedirectUrl, signInFallbackRedirectUrl, signInForceRedirectUrl, - unsafeMetadata, }; if (!clerk) { @@ -34,7 +26,11 @@ export const SignUpButton = withClerk( } if (mode === 'modal') { - return clerk.openSignUp({ ...opts, appearance: props.appearance }); + return clerk.openSignUp({ + ...opts, + appearance: props.appearance, + unsafeMetadata: props.unsafeMetadata, + }); } return clerk.redirectToSignUp({ diff --git a/packages/react/src/components/SignUpButton.tsx b/packages/react/src/components/SignUpButton.tsx index ccf5ce4f3c9..c2ab4d710ca 100644 --- a/packages/react/src/components/SignUpButton.tsx +++ b/packages/react/src/components/SignUpButton.tsx @@ -13,7 +13,6 @@ export const SignUpButton = withClerk( signInFallbackRedirectUrl, signInForceRedirectUrl, mode, - unsafeMetadata, initialValues, oauthFlow, ...rest @@ -28,13 +27,16 @@ export const SignUpButton = withClerk( forceRedirectUrl, signInFallbackRedirectUrl, signInForceRedirectUrl, - unsafeMetadata, initialValues, oauthFlow, }; if (mode === 'modal') { - return clerk.openSignUp({ ...opts, appearance: props.appearance }); + return clerk.openSignUp({ + ...opts, + appearance: props.appearance, + unsafeMetadata: props.unsafeMetadata, + }); } return clerk.redirectToSignUp({ diff --git a/packages/types/src/clerk.ts b/packages/types/src/clerk.ts index 49d8cf6e57a..0a69e8af996 100644 --- a/packages/types/src/clerk.ts +++ b/packages/types/src/clerk.ts @@ -1900,18 +1900,22 @@ export interface HandleEmailLinkVerificationParams { onVerifiedOnOtherDevice?: () => void; } -type ButtonPropsModal = { +type SignInButtonPropsModal = { mode: 'modal'; - appearance?: T['appearance']; + appearance?: SignInProps['appearance']; +}; + +type SignUpButtonPropsModal = { + mode: 'modal'; + appearance?: SignUpProps['appearance']; + unsafeMetadata?: SignUpUnsafeMetadata; }; type ButtonPropsRedirect = { mode?: 'redirect'; }; -type ButtonProps = ButtonPropsModal | ButtonPropsRedirect; - -export type SignInButtonProps = ButtonProps & +export type SignInButtonProps = (SignInButtonPropsModal | ButtonPropsRedirect) & Pick< SignInProps, | 'fallbackRedirectUrl' @@ -1923,9 +1927,7 @@ export type SignInButtonProps = ButtonProps & | 'oauthFlow' >; -export type SignUpButtonProps = { - unsafeMetadata?: SignUpUnsafeMetadata; -} & ButtonProps & +export type SignUpButtonProps = (SignUpButtonPropsModal | ButtonPropsRedirect) & Pick< SignUpProps, | 'fallbackRedirectUrl'