Skip to content

Commit 202939a

Browse files
authored
Merge pull request #233 from FutabaRio/fix-register
fix: 修改了用户注册相关 #231
2 parents 570b35f + 20ba10b commit 202939a

File tree

4 files changed

+131
-11
lines changed

4 files changed

+131
-11
lines changed

src/apis/auth.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,19 +70,35 @@ export interface RegisterResponse {}
7070

7171
export const requestRegister = (
7272
email: string,
73+
registrationToken: string,
7374
username: string,
7475
password: string,
7576
) => {
7677
return jsonRequest<Response<RegisterResponse>>('/user/register', {
7778
method: 'POST',
7879
json: {
7980
email,
81+
registration_token: registrationToken,
8082
user_name: username,
8183
password,
8284
},
8385
})
8486
}
8587

88+
export interface EmailToenResponse {}
89+
90+
export const reqeustRegistrationToken = (email: string) => {
91+
return jsonRequest<Response<EmailToenResponse>>(
92+
'/user/sendRegistrationToken',
93+
{
94+
method: 'POST',
95+
json: {
96+
email,
97+
},
98+
},
99+
)
100+
}
101+
86102
export interface UpdateInfoResponse {}
87103

88104
export const requestUpdateInfo = ({

src/components/account/AuthFormShared.tsx

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
import { FormField, FormFieldProps } from 'components/FormField'
1010
import { REGEX_EMAIL } from 'utils/regexes'
1111

12-
export type RuleKeys = 'email' | 'password' | 'username'
12+
export type RuleKeys = 'email' | 'password' | 'username' | 'registertoken'
1313

1414
export const rule: Record<RuleKeys, UseControllerProps['rules']> = {
1515
email: {
@@ -26,6 +26,11 @@ export const rule: Record<RuleKeys, UseControllerProps['rules']> = {
2626
minLength: { value: 4, message: '用户名长度不能小于 4 位' },
2727
maxLength: { value: 24, message: '用户名长度不能大于 24 位' },
2828
},
29+
registertoken: {
30+
required: '邮箱验证码为必填项',
31+
minLength: { value: 6, message: '邮箱验证码长度为 6 位' },
32+
maxLength: { value: 6, message: '邮箱验证码长度为 6 位' },
33+
},
2934
}
3035

3136
// --- **Opinioned** AuthForm Field Components ---
@@ -73,7 +78,41 @@ export const AuthFormEmailField = <T extends FieldValues>({
7378
),
7479
}}
7580
FormGroupProps={{
76-
helperText: register && '邮箱将需要链接确认',
81+
helperText: register && '将通过发送邮件输入验证码确认',
82+
}}
83+
/>
84+
)
85+
}
86+
export const AuthRegistrationTokenField = <T extends FieldValues>({
87+
label = '邮箱验证码',
88+
control,
89+
error,
90+
field,
91+
register,
92+
autoComplete = '',
93+
inputGroupProps,
94+
}: AuthFormFieldProps<T>) => {
95+
return (
96+
<FormField
97+
label={label}
98+
field={field}
99+
control={control}
100+
error={error}
101+
ControllerProps={{
102+
rules: rule.registertoken,
103+
render: (renderProps) => (
104+
<InputGroup
105+
id={field}
106+
placeholder="123456"
107+
autoComplete={autoComplete}
108+
{...renderProps.field}
109+
value={renderProps.field.value || ''}
110+
{...inputGroupProps?.(renderProps)}
111+
/>
112+
),
113+
}}
114+
FormGroupProps={{
115+
helperText: register && '请输入邮件中的验证码',
77116
}}
78117
/>
79118
)

src/components/account/EditDialog.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export const EditDialog: FC<EditDialogProps> = ({ isOpen, onClose }) => {
5151
<span className="ml-1">账户信息</span>
5252
</div>
5353
}
54-
panel={<InfoPanel />}
54+
panel={<InfoPanel onClose={onClose} />}
5555
/>
5656
<Tab
5757
id="password"
@@ -61,7 +61,7 @@ export const EditDialog: FC<EditDialogProps> = ({ isOpen, onClose }) => {
6161
<span className="ml-1">密码</span>
6262
</div>
6363
}
64-
panel={<PasswordPanel />}
64+
panel={<PasswordPanel onClose={onClose} />}
6565
/>
6666
</Tabs>
6767
</GlobalErrorBoundary>
@@ -70,7 +70,7 @@ export const EditDialog: FC<EditDialogProps> = ({ isOpen, onClose }) => {
7070
)
7171
}
7272

73-
const InfoPanel = () => {
73+
const InfoPanel = ({ onClose }) => {
7474
interface FormValues {
7575
username: string
7676
}
@@ -109,6 +109,7 @@ const InfoPanel = () => {
109109
intent: 'success',
110110
message: `更新成功`,
111111
})
112+
onClose(false)
112113
} catch (e) {
113114
console.warn(e)
114115
setError('global' as any, { message: formatError(e) })
@@ -149,7 +150,7 @@ const InfoPanel = () => {
149150
)
150151
}
151152

152-
const PasswordPanel = () => {
153+
const PasswordPanel = ({ onClose }) => {
153154
interface FormValues {
154155
original: string
155156
newPassword: string
@@ -182,6 +183,7 @@ const PasswordPanel = () => {
182183
intent: 'success',
183184
message: `更新成功`,
184185
})
186+
onClose(false)
185187
} catch (e) {
186188
console.warn(e)
187189
setError('global' as any, { message: formatError(e) })

src/components/account/RegisterPanel.tsx

Lines changed: 68 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,26 @@
11
import { Button } from '@blueprintjs/core'
22

3-
import { requestRegister } from 'apis/auth'
4-
import { FC } from 'react'
3+
import { reqeustRegistrationToken, requestRegister } from 'apis/auth'
4+
import { FC, useEffect, useState } from 'react'
55
import { useForm } from 'react-hook-form'
66

77
import { AppToaster } from 'components/Toaster'
88
import { NetworkError } from 'utils/fetcher'
9+
import { REGEX_EMAIL } from 'utils/regexes'
910
import { wrapErrorMessage } from 'utils/wrapErrorMessage'
1011

1112
import {
1213
AuthFormEmailField,
1314
AuthFormPasswordField,
1415
AuthFormUsernameField,
16+
AuthRegistrationTokenField,
1517
} from './AuthFormShared'
1618

1719
export interface RegisterFormValues {
1820
email: string
1921
password: string
2022
username: string
23+
registrationToken: string
2124
}
2225

2326
export const RegisterPanel: FC<{
@@ -27,20 +30,60 @@ export const RegisterPanel: FC<{
2730
control,
2831
handleSubmit,
2932
formState: { errors, isValid, isDirty, isSubmitting },
33+
getValues,
3034
} = useForm<RegisterFormValues>()
31-
35+
const [isSendEmailButtonDisabled, setSendEmailButtonDisabled] =
36+
useState(false)
37+
const [countdown, setCountdown] = useState(60)
3238
const onSubmit = async (val: RegisterFormValues) => {
3339
await wrapErrorMessage(
3440
(e: NetworkError) => `注册失败:${e.message}`,
35-
requestRegister(val.email, val.username, val.password),
41+
requestRegister(
42+
val.email,
43+
val.registrationToken,
44+
val.username,
45+
val.password,
46+
),
3647
)
3748
AppToaster.show({
3849
intent: 'success',
39-
message: `已向注册邮箱发送验证邮件,请使用邮件内的验证链接进行验证`,
50+
message: `注册成功`,
4051
})
4152
onComplete()
4253
}
54+
const handleCountdownTick = () => {
55+
setCountdown((prevCountdown) => prevCountdown - 1)
56+
}
57+
useEffect(() => {
58+
let countdownInterval
59+
if (countdown <= 0) {
60+
setCountdown(60)
61+
setSendEmailButtonDisabled(false)
62+
} else if (isSendEmailButtonDisabled) {
63+
countdownInterval = setInterval(handleCountdownTick, 1000)
64+
}
65+
return () => clearInterval(countdownInterval)
66+
}, [isSendEmailButtonDisabled, countdown])
4367

68+
const onEmailSubmit = async () => {
69+
const val = getValues()
70+
if (!REGEX_EMAIL.test(val.email)) {
71+
AppToaster.show({
72+
intent: 'danger',
73+
message: `邮箱输入为空或格式错误,请重新输入`,
74+
})
75+
return
76+
}
77+
await wrapErrorMessage(
78+
(e: NetworkError) => `发送失败:${e.message}`,
79+
reqeustRegistrationToken(val.email),
80+
)
81+
AppToaster.show({
82+
intent: 'success',
83+
message: `邮件发送成功`,
84+
})
85+
setSendEmailButtonDisabled(true)
86+
}
4487
return (
4588
<form onSubmit={handleSubmit(onSubmit)}>
4689
<AuthFormEmailField
@@ -49,6 +92,26 @@ export const RegisterPanel: FC<{
4992
error={errors.email}
5093
field="email"
5194
/>
95+
<div className="mt-6 flex justify-end">
96+
<Button
97+
disabled={
98+
(!isValid && !isDirty) || isSubmitting || isSendEmailButtonDisabled
99+
}
100+
intent="primary"
101+
type="button"
102+
icon="envelope"
103+
className="self-stretch"
104+
onClick={onEmailSubmit}
105+
>
106+
{isSendEmailButtonDisabled ? `${countdown} 秒再试` : '发送验证码'}
107+
</Button>
108+
</div>
109+
<AuthRegistrationTokenField
110+
register
111+
control={control}
112+
error={errors.registrationToken}
113+
field="registrationToken"
114+
/>
52115

53116
<AuthFormUsernameField
54117
control={control}

0 commit comments

Comments
 (0)