mirror of https://github.com/msgbyte/tailchat
feat: 增加邮箱认证功能
parent
ba7399fc7f
commit
2e774d104f
@ -0,0 +1,120 @@
|
|||||||
|
import { setUserJWT } from '@/utils/jwt-helper';
|
||||||
|
import { setGlobalUserLoginInfo } from '@/utils/user-helper';
|
||||||
|
import React, { useMemo, useState } from 'react';
|
||||||
|
import {
|
||||||
|
model,
|
||||||
|
showErrorToasts,
|
||||||
|
showSuccessToasts,
|
||||||
|
t,
|
||||||
|
useAppDispatch,
|
||||||
|
useAsyncRequest,
|
||||||
|
userActions,
|
||||||
|
useUserInfo,
|
||||||
|
} from 'tailchat-shared';
|
||||||
|
import {
|
||||||
|
createMetaFormSchema,
|
||||||
|
MetaFormFieldMeta,
|
||||||
|
metaFormFieldSchema,
|
||||||
|
WebMetaForm,
|
||||||
|
FastifyFormFieldProps,
|
||||||
|
useFastifyFormContext,
|
||||||
|
} from 'tailchat-design';
|
||||||
|
import { ModalWrapper } from '../Modal';
|
||||||
|
import { Button, Input } from 'antd';
|
||||||
|
import _compact from 'lodash/compact';
|
||||||
|
import { getGlobalConfig } from 'tailchat-shared/model/config';
|
||||||
|
import { Problem } from '../Problem';
|
||||||
|
|
||||||
|
interface Values {
|
||||||
|
emailOTP: string;
|
||||||
|
[key: string]: unknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
const fields: MetaFormFieldMeta[] = [
|
||||||
|
{
|
||||||
|
type: 'text',
|
||||||
|
name: 'emailOTP',
|
||||||
|
placeholder: t('6位校验码'),
|
||||||
|
label: t('邮箱校验码'),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const schema = createMetaFormSchema({
|
||||||
|
emailOTP: metaFormFieldSchema
|
||||||
|
.string()
|
||||||
|
.length(6, t('校验码为6位'))
|
||||||
|
.required(t('校验码不能为空')),
|
||||||
|
});
|
||||||
|
|
||||||
|
export const EmailVerify: React.FC<{
|
||||||
|
onSuccess?: () => void;
|
||||||
|
}> = React.memo((props) => {
|
||||||
|
const dispatch = useAppDispatch();
|
||||||
|
const [sended, setSended] = useState(false);
|
||||||
|
const userInfo = useUserInfo();
|
||||||
|
|
||||||
|
const [{ loading }, handleSendEmail] = useAsyncRequest(async () => {
|
||||||
|
if (!userInfo) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
await model.user.verifyEmail(userInfo.email);
|
||||||
|
setSended(true);
|
||||||
|
}, [userInfo?.email]);
|
||||||
|
|
||||||
|
const [, handleVerifyEmail] = useAsyncRequest(
|
||||||
|
async (values: Values) => {
|
||||||
|
const data = await model.user.verifyEmailWithOTP(values.emailOTP);
|
||||||
|
|
||||||
|
setGlobalUserLoginInfo(data);
|
||||||
|
dispatch(userActions.setUserInfo(data));
|
||||||
|
|
||||||
|
showSuccessToasts(t('邮箱验证通过'));
|
||||||
|
|
||||||
|
if (typeof props.onSuccess === 'function') {
|
||||||
|
props.onSuccess();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[userInfo?.email, props.onSuccess]
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!userInfo) {
|
||||||
|
return <Problem />;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ModalWrapper title={t('认证邮箱')}>
|
||||||
|
{!sended ? (
|
||||||
|
<>
|
||||||
|
<Button
|
||||||
|
className="mb-2"
|
||||||
|
type="primary"
|
||||||
|
block={true}
|
||||||
|
size="large"
|
||||||
|
loading={loading}
|
||||||
|
onClick={handleSendEmail}
|
||||||
|
>
|
||||||
|
{t('向 {{email}} 发送认证邮件', {
|
||||||
|
email: userInfo.email,
|
||||||
|
})}
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
type="text"
|
||||||
|
block={true}
|
||||||
|
size="large"
|
||||||
|
onClick={() => setSended(true)}
|
||||||
|
>
|
||||||
|
{t('已发送认证邮件')}
|
||||||
|
</Button>
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<WebMetaForm
|
||||||
|
schema={schema}
|
||||||
|
fields={fields}
|
||||||
|
onSubmit={handleVerifyEmail}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
</ModalWrapper>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
EmailVerify.displayName = 'EmailVerify';
|
Loading…
Reference in New Issue