Files
FastGPT/projects/app/src/pages/login/components/RegisterForm.tsx
Archer a3b0ef066b 4.8.5 test fix (#1862)
* app list ui

* feat: photo view

* perf: app dataset filter

* perf: app dataset filter

* fix: chat recently apps

* perf: workflow header phone

* default templates

* default templates

* fix: input guide phone

* fix: i18n

* team chat history

* remove code

* perf: mongo connection

* log level
2024-06-27 10:09:55 +08:00

210 lines
5.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import React, { useState, Dispatch, useCallback } from 'react';
import { FormControl, Box, Input, Button } from '@chakra-ui/react';
import { useForm } from 'react-hook-form';
import { LoginPageTypeEnum } from '@/web/support/user/login/constants';
import { postRegister } from '@/web/support/user/api';
import { useSendCode } from '@/web/support/user/hooks/useSendCode';
import type { ResLogin } from '@/global/support/api/userRes';
import { useToast } from '@fastgpt/web/hooks/useToast';
import { postCreateApp } from '@/web/core/app/api';
import { defaultAppTemplates } from '@/web/core/app/templates';
import { useSystemStore } from '@/web/common/system/useSystemStore';
import { useTranslation } from 'next-i18next';
interface Props {
loginSuccess: (e: ResLogin) => void;
setPageType: Dispatch<`${LoginPageTypeEnum}`>;
}
interface RegisterType {
username: string;
password: string;
password2: string;
code: string;
}
const RegisterForm = ({ setPageType, loginSuccess }: Props) => {
const { toast } = useToast();
const { t } = useTranslation();
const { feConfigs } = useSystemStore();
const {
register,
handleSubmit,
getValues,
trigger,
formState: { errors }
} = useForm<RegisterType>({
mode: 'onBlur'
});
const { sendCodeText, sendCode, codeCountDown } = useSendCode();
const onclickSendCode = useCallback(async () => {
const check = await trigger('username');
if (!check) return;
sendCode({
username: getValues('username'),
type: 'register'
});
}, [getValues, sendCode, trigger]);
const [requesting, setRequesting] = useState(false);
const onclickRegister = useCallback(
async ({ username, password, code }: RegisterType) => {
setRequesting(true);
try {
loginSuccess(
await postRegister({
username,
code,
password,
inviterId: localStorage.getItem('inviterId') || undefined
})
);
toast({
title: `注册成功`,
status: 'success'
});
// auto register template app
setTimeout(() => {
defaultAppTemplates.forEach((template) => {
postCreateApp({
avatar: template.avatar,
name: t(template.name),
modules: template.modules,
edges: template.edges,
type: template.type
});
});
}, 100);
} catch (error: any) {
toast({
title: error.message || '注册异常',
status: 'error'
});
}
setRequesting(false);
},
[loginSuccess, t, toast]
);
return (
<>
<Box fontWeight={'bold'} fontSize={'2xl'} textAlign={'center'}>
{feConfigs?.systemTitle}
</Box>
<Box
mt={'42px'}
onKeyDown={(e) => {
if (e.keyCode === 13 && !e.shiftKey && !requesting) {
handleSubmit(onclickRegister)();
}
}}
>
<FormControl isInvalid={!!errors.username}>
<Input
bg={'myGray.50'}
placeholder="邮箱/手机号"
{...register('username', {
required: '邮箱/手机号不能为空',
pattern: {
value:
/(^1[3456789]\d{9}$)|(^[A-Za-z0-9]+([_\.][A-Za-z0-9]+)*@([A-Za-z0-9\-]+\.)+[A-Za-z]{2,6}$)/,
message: '邮箱/手机号格式错误'
}
})}
></Input>
</FormControl>
<FormControl
mt={6}
isInvalid={!!errors.code}
display={'flex'}
alignItems={'center'}
position={'relative'}
>
<Input
bg={'myGray.50'}
flex={1}
maxLength={8}
placeholder="验证码"
{...register('code', {
required: '验证码不能为空'
})}
></Input>
<Box
position={'absolute'}
right={3}
zIndex={1}
fontSize={'sm'}
{...(codeCountDown > 0
? {
color: 'myGray.500'
}
: {
color: 'primary.700',
cursor: 'pointer',
onClick: onclickSendCode
})}
>
{sendCodeText}
</Box>
</FormControl>
<FormControl mt={6} isInvalid={!!errors.password}>
<Input
bg={'myGray.50'}
type={'password'}
placeholder="密码(4~20位)"
{...register('password', {
required: '密码不能为空',
minLength: {
value: 4,
message: '密码最少 4 位最多 20 位'
},
maxLength: {
value: 20,
message: '密码最少 4 位最多 20 位'
}
})}
></Input>
</FormControl>
<FormControl mt={6} isInvalid={!!errors.password2}>
<Input
bg={'myGray.50'}
type={'password'}
placeholder="确认密码"
{...register('password2', {
validate: (val) => (getValues('password') === val ? true : '两次密码不一致')
})}
></Input>
</FormControl>
<Button
type="submit"
mt={6}
w={'100%'}
size={['md', 'md']}
colorScheme="blue"
isLoading={requesting}
onClick={handleSubmit(onclickRegister)}
>
</Button>
<Box
float={'right'}
fontSize="sm"
mt={2}
mb={'50px'}
color={'primary.700'}
cursor={'pointer'}
_hover={{ textDecoration: 'underline' }}
onClick={() => setPageType(LoginPageTypeEnum.passwordLogin)}
>
</Box>
</Box>
</>
);
};
export default RegisterForm;