balibabu
feat: Switch the login page to the registration component by changing the routing parameters #3221 (#3307)
56dceef
| import { Button } from '@/components/ui/button'; | |
| import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; | |
| import { Separator } from '@/components/ui/separator'; | |
| import { useTranslate } from '@/hooks/common-hooks'; | |
| import { DiscordLogoIcon, GitHubLogoIcon } from '@radix-ui/react-icons'; | |
| import { useSearchParams } from 'umi'; | |
| import { SignInForm, SignUpForm, VerifyEmailForm } from './form'; | |
| import { Step, useSwitchStep } from './hooks'; | |
| function LoginFooter() { | |
| return ( | |
| <section className="pt-4"> | |
| <Separator /> | |
| <p className="text-center pt-4">or continue with</p> | |
| <div className="flex gap-4 justify-center pt-[20px]"> | |
| <GitHubLogoIcon className="w-8 h-8"></GitHubLogoIcon> | |
| <DiscordLogoIcon className="w-8 h-8"></DiscordLogoIcon> | |
| </div> | |
| </section> | |
| ); | |
| } | |
| export function SignUpCard() { | |
| const { t } = useTranslate('login'); | |
| const { switchStep } = useSwitchStep(Step.SignIn); | |
| return ( | |
| <Card className="w-[400px]"> | |
| <CardHeader> | |
| <CardTitle>{t('signUp')}</CardTitle> | |
| </CardHeader> | |
| <CardContent> | |
| <SignUpForm></SignUpForm> | |
| <div className="text-center"> | |
| <Button variant={'link'} className="pt-6" onClick={switchStep}> | |
| Already have an account? Log In | |
| </Button> | |
| </div> | |
| <LoginFooter></LoginFooter> | |
| </CardContent> | |
| </Card> | |
| ); | |
| } | |
| export function SignInCard() { | |
| const { t } = useTranslate('login'); | |
| const { switchStep } = useSwitchStep(Step.SignUp); | |
| return ( | |
| <Card className="w-[400px]"> | |
| <CardHeader> | |
| <CardTitle>{t('login')}</CardTitle> | |
| </CardHeader> | |
| <CardContent> | |
| <SignInForm></SignInForm> | |
| <Button | |
| className="w-full mt-2" | |
| onClick={switchStep} | |
| variant={'secondary'} | |
| > | |
| {t('signUp')} | |
| </Button> | |
| </CardContent> | |
| </Card> | |
| ); | |
| } | |
| export function VerifyEmailCard() { | |
| // const { t } = useTranslate('login'); | |
| return ( | |
| <Card className="w-[400px]"> | |
| <CardHeader> | |
| <CardTitle>Verify email</CardTitle> | |
| </CardHeader> | |
| <CardContent> | |
| <section className="flex gap-y-6 flex-col"> | |
| <div className="flex items-center space-x-4"> | |
| <div className="flex-1 space-y-1"> | |
| <p className="text-sm font-medium leading-none"> | |
| We’ve sent a 6-digit code to | |
| </p> | |
| <p className="text-sm text-blue-500">yifanwu92@gmail.com.</p> | |
| </div> | |
| <Button>Resend</Button> | |
| </div> | |
| <VerifyEmailForm></VerifyEmailForm> | |
| </section> | |
| </CardContent> | |
| </Card> | |
| ); | |
| } | |
| const Login = () => { | |
| const [searchParams] = useSearchParams(); | |
| const step = Number((searchParams.get('step') ?? Step.SignIn) as Step); | |
| return ( | |
| <div className="w-full h-full flex items-center pl-[15%]"> | |
| <div className="inline-block"> | |
| {step === Step.SignIn && <SignInCard></SignInCard>} | |
| {step === Step.SignUp && <SignUpCard></SignUpCard>} | |
| {step === Step.VerifyEmail && <VerifyEmailCard></VerifyEmailCard>} | |
| </div> | |
| </div> | |
| ); | |
| }; | |
| export default Login; | |