Files
supabase__supabase/apps/studio/pages/sign-up.tsx
Danny White ee3f78ff37 fix(studio): hide social sign-in after email sign-up (#49571)
## What kind of change does this PR introduce?

Bug fix. Resolves
[FE-4264](https://linear.app/supabase/issue/FE-4264/hide-social-sign-in-options-after-email-sign-up).

## What is the current behavior?

After a successful email and password sign-up, GitHub and ChatGPT
sign-in options remain visible even though they do not confirm or link
the new account.

The success state is presented in a bespoke `Alert` with verbose
copywriting.

## What is the new behavior?

The social sign-in options and divider are hidden after email sign-up
succeeds. The email confirmation message and link back to sign in remain
available.

The success state is presented in a standard `success` `Admonition` with
clearer copywriting.

| Before | After |
| --- | --- |
| <img width="2576" height="1700" alt="CleanShot 2026-08-26 at 13 47
41@2x"
src="https://github.com/user-attachments/assets/a29547b9-7949-4ff3-a1d4-db8bfb3beee6"
/> | <img width="2576" height="1704" alt="CleanShot 2026-08-26 at 13 47
00@2x"
src="https://github.com/user-attachments/assets/4f778571-74fe-4c20-b76e-a87e0391e4a9"
/> |

## To test

1. Open `/sign-up` and complete an email and password sign-up.
2. Confirm the success message is shown without the GitHub, ChatGPT, or
`or` options.
3. Open `/sign-in` and confirm GitHub and ChatGPT remain available
there.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- **New Features**
- Added shared provider options across sign-in and sign-up flows,
including custom providers, external identity providers, and optional
SSO.
  - Added an SSO sign-in button that preserves the current page context.
- After successful email signup, alternative signup options are hidden
and confirmation messaging appears.
- **Bug Fixes**
- Improved signup form spacing, submission state, and animated password
guidance.
- **Tests**
- Added coverage for signup behavior across standard and
focused-provider configurations.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Joshen Lim <joshenlimek@gmail.com>
2026-08-26 07:01:47 +00:00

81 lines
2.9 KiB
TypeScript

import Link from 'next/link'
import { useState } from 'react'
import { Button, cn } from 'ui'
import { SignInOptions } from '@/components/interfaces/SignIn/SignInOptions'
import { SignInWithExternalProvider } from '@/components/interfaces/SignIn/SignInWithExternalProvider'
import { SignUpForm } from '@/components/interfaces/SignIn/SignUpForm'
import { SignInLayout } from '@/components/layouts/SignInLayout/SignInLayout'
import { UnknownInterface } from '@/components/ui/UnknownInterface'
import { useEnabledIdentityProviders } from '@/hooks/misc/useEnabledIdentityProviders'
import { useInboundBranding } from '@/hooks/misc/useInboundBranding'
import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled'
import type { NextPageWithLayout } from '@/types'
const SignUpPage: NextPageWithLayout = () => {
const [showOtherOptions, setShowOtherOptions] = useState(false)
const [isSubmitted, setIsSubmitted] = useState(false)
const { dashboardAuthSignUp: signUpEnabled } = useIsFeatureEnabled(['dashboard_auth:sign_up'])
const { focusProvider } = useInboundBranding('sign-up')
const signUpProviders = useEnabledIdentityProviders().filter((provider) => provider.showOnSignUp)
if (!signUpEnabled) {
return <UnknownInterface fullHeight={false} urlBack="/sign-in" />
}
return (
<>
{focusProvider ? (
<div className="flex flex-col gap-5">
{!isSubmitted && <SignInWithExternalProvider provider={focusProvider} />}
{showOtherOptions ? (
<>
{!isSubmitted && (
<SignInOptions
providers={signUpProviders.filter((provider) => provider.id !== focusProvider.id)}
dividerBgClass="bg-surface-100"
/>
)}
<SignUpForm onSuccess={() => setIsSubmitted(true)} />
</>
) : (
<Button
block
variant="text"
size="large"
className="-mt-2 text-foreground-light"
onClick={() => setShowOtherOptions(true)}
>
Show other options
</Button>
)}
</div>
) : (
<div className="flex flex-col gap-5">
{!isSubmitted && <SignInOptions providers={signUpProviders} />}
<SignUpForm onSuccess={() => setIsSubmitted(true)} />
</div>
)}
<div className={cn('self-center text-center text-sm mb-8', isSubmitted ? 'mt-2' : 'mt-8')}>
<span className="text-foreground-light">Have an account?</span>{' '}
<Link
href="/sign-in"
className="underline text-foreground hover:text-foreground-light transition"
>
Sign in
</Link>
</div>
</>
)
}
SignUpPage.getLayout = (page) => (
<SignInLayout heading="Get started" subheading="Create a new account" inboundFlow="sign-up">
{page}
</SignInLayout>
)
export default SignUpPage