balibabu commited on
Commit
56dceef
·
1 Parent(s): 907411d

feat: Switch the login page to the registration component by changing the routing parameters #3221 (#3307)

Browse files

### What problem does this PR solve?
feat: Switch the login page to the registration component by changing
the routing parameters #3221

### Type of change


- [x] New Feature (non-breaking change which adds functionality)

web/src/pages/login-next/form.tsx CHANGED
@@ -31,6 +31,7 @@ export function SignUpForm() {
31
  }),
32
  nickname: z.string({ required_error: t('nicknamePlaceholder') }),
33
  password: z.string({ required_error: t('passwordPlaceholder') }),
 
34
  });
35
 
36
  const form = useForm<z.infer<typeof FormSchema>>({
@@ -98,6 +99,26 @@ export function SignUpForm() {
98
  </FormItem>
99
  )}
100
  />
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
  <Button type="submit" className="w-full">
102
  {t('signUp')}
103
  </Button>
 
31
  }),
32
  nickname: z.string({ required_error: t('nicknamePlaceholder') }),
33
  password: z.string({ required_error: t('passwordPlaceholder') }),
34
+ agree: z.boolean({ required_error: t('passwordPlaceholder') }),
35
  });
36
 
37
  const form = useForm<z.infer<typeof FormSchema>>({
 
99
  </FormItem>
100
  )}
101
  />
102
+ <FormField
103
+ control={form.control}
104
+ name="agree"
105
+ render={({ field }) => (
106
+ <FormItem className="flex flex-row items-start space-x-3 space-y-0 rounded-md">
107
+ <FormControl>
108
+ <Checkbox
109
+ checked={field.value}
110
+ onCheckedChange={field.onChange}
111
+ />
112
+ </FormControl>
113
+ <div className="space-y-1 leading-none">
114
+ <FormLabel>
115
+ I understand and agree to the Terms of Service and Privacy
116
+ Policy.
117
+ </FormLabel>
118
+ </div>
119
+ </FormItem>
120
+ )}
121
+ />
122
  <Button type="submit" className="w-full">
123
  {t('signUp')}
124
  </Button>
web/src/pages/login-next/hooks.ts ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useCallback } from 'react';
2
+ import { useSearchParams } from 'umi';
3
+
4
+ export enum Step {
5
+ SignIn,
6
+ SignUp,
7
+ ForgotPassword,
8
+ ResetPassword,
9
+ VerifyEmail,
10
+ }
11
+
12
+ export const useSwitchStep = (step: Step) => {
13
+ const [_, setSearchParams] = useSearchParams();
14
+ const switchStep = useCallback(() => {
15
+ setSearchParams(new URLSearchParams({ step: step.toString() }));
16
+ }, [setSearchParams, step]);
17
+
18
+ return { switchStep };
19
+ };
web/src/pages/login-next/index.tsx CHANGED
@@ -3,13 +3,15 @@ import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
3
  import { Separator } from '@/components/ui/separator';
4
  import { useTranslate } from '@/hooks/common-hooks';
5
  import { DiscordLogoIcon, GitHubLogoIcon } from '@radix-ui/react-icons';
 
6
  import { SignInForm, SignUpForm, VerifyEmailForm } from './form';
 
7
 
8
  function LoginFooter() {
9
  return (
10
- <section className="pt-[30px]">
11
  <Separator />
12
- <p className="text-center pt-[20px]">or continue with</p>
13
  <div className="flex gap-4 justify-center pt-[20px]">
14
  <GitHubLogoIcon className="w-8 h-8"></GitHubLogoIcon>
15
  <DiscordLogoIcon className="w-8 h-8"></DiscordLogoIcon>
@@ -21,6 +23,8 @@ function LoginFooter() {
21
  export function SignUpCard() {
22
  const { t } = useTranslate('login');
23
 
 
 
24
  return (
25
  <Card className="w-[400px]">
26
  <CardHeader>
@@ -28,6 +32,11 @@ export function SignUpCard() {
28
  </CardHeader>
29
  <CardContent>
30
  <SignUpForm></SignUpForm>
 
 
 
 
 
31
  <LoginFooter></LoginFooter>
32
  </CardContent>
33
  </Card>
@@ -36,6 +45,7 @@ export function SignUpCard() {
36
 
37
  export function SignInCard() {
38
  const { t } = useTranslate('login');
 
39
 
40
  return (
41
  <Card className="w-[400px]">
@@ -44,6 +54,13 @@ export function SignInCard() {
44
  </CardHeader>
45
  <CardContent>
46
  <SignInForm></SignInForm>
 
 
 
 
 
 
 
47
  </CardContent>
48
  </Card>
49
  );
@@ -76,12 +93,17 @@ export function VerifyEmailCard() {
76
  }
77
 
78
  const Login = () => {
 
 
 
79
  return (
80
- <>
81
- <SignUpCard></SignUpCard>
82
- <SignInCard></SignInCard>
83
- <VerifyEmailCard></VerifyEmailCard>
84
- </>
 
 
85
  );
86
  };
87
 
 
3
  import { Separator } from '@/components/ui/separator';
4
  import { useTranslate } from '@/hooks/common-hooks';
5
  import { DiscordLogoIcon, GitHubLogoIcon } from '@radix-ui/react-icons';
6
+ import { useSearchParams } from 'umi';
7
  import { SignInForm, SignUpForm, VerifyEmailForm } from './form';
8
+ import { Step, useSwitchStep } from './hooks';
9
 
10
  function LoginFooter() {
11
  return (
12
+ <section className="pt-4">
13
  <Separator />
14
+ <p className="text-center pt-4">or continue with</p>
15
  <div className="flex gap-4 justify-center pt-[20px]">
16
  <GitHubLogoIcon className="w-8 h-8"></GitHubLogoIcon>
17
  <DiscordLogoIcon className="w-8 h-8"></DiscordLogoIcon>
 
23
  export function SignUpCard() {
24
  const { t } = useTranslate('login');
25
 
26
+ const { switchStep } = useSwitchStep(Step.SignIn);
27
+
28
  return (
29
  <Card className="w-[400px]">
30
  <CardHeader>
 
32
  </CardHeader>
33
  <CardContent>
34
  <SignUpForm></SignUpForm>
35
+ <div className="text-center">
36
+ <Button variant={'link'} className="pt-6" onClick={switchStep}>
37
+ Already have an account? Log In
38
+ </Button>
39
+ </div>
40
  <LoginFooter></LoginFooter>
41
  </CardContent>
42
  </Card>
 
45
 
46
  export function SignInCard() {
47
  const { t } = useTranslate('login');
48
+ const { switchStep } = useSwitchStep(Step.SignUp);
49
 
50
  return (
51
  <Card className="w-[400px]">
 
54
  </CardHeader>
55
  <CardContent>
56
  <SignInForm></SignInForm>
57
+ <Button
58
+ className="w-full mt-2"
59
+ onClick={switchStep}
60
+ variant={'secondary'}
61
+ >
62
+ {t('signUp')}
63
+ </Button>
64
  </CardContent>
65
  </Card>
66
  );
 
93
  }
94
 
95
  const Login = () => {
96
+ const [searchParams] = useSearchParams();
97
+ const step = Number((searchParams.get('step') ?? Step.SignIn) as Step);
98
+
99
  return (
100
+ <div className="w-full h-full flex items-center pl-[15%]">
101
+ <div className="inline-block">
102
+ {step === Step.SignIn && <SignInCard></SignInCard>}
103
+ {step === Step.SignUp && <SignUpCard></SignUpCard>}
104
+ {step === Step.VerifyEmail && <VerifyEmailCard></VerifyEmailCard>}
105
+ </div>
106
+ </div>
107
  );
108
  };
109