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({ 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 ( <> 注册 {feConfigs?.systemTitle} 账号 { if (e.keyCode === 13 && !e.shiftKey && !requesting) { handleSubmit(onclickRegister)(); } }} > 0 ? { color: 'myGray.500' } : { color: 'primary.700', cursor: 'pointer', onClick: onclickSendCode })} > {sendCodeText} (getValues('password') === val ? true : '两次密码不一致') })} > setPageType(LoginPageTypeEnum.passwordLogin)} > 已有账号,去登录 ); }; export default RegisterForm;