import React, { useState, Dispatch, useCallback } from 'react'; import { FormControl, Flex, Input, Button, FormErrorMessage, Box } from '@chakra-ui/react'; import { useForm } from 'react-hook-form'; import { useRouter } from 'next/router'; import { PageTypeEnum } from '@/constants/user'; import { postLogin } from '@/api/user'; import type { ResLogin } from '@/api/response/user'; import { useToast } from '@/hooks/useToast'; import { feConfigs } from '@/store/static'; import { useGlobalStore } from '@/store/global'; import MyIcon from '@/components/Icon'; interface Props { setPageType: Dispatch<`${PageTypeEnum}`>; loginSuccess: (e: ResLogin) => void; } interface LoginFormType { username: string; password: string; } const LoginForm = ({ setPageType, loginSuccess }: Props) => { const router = useRouter(); const { lastRoute = '/app/list' } = router.query as { lastRoute: string }; const { toast } = useToast(); const { setLoginStore } = useGlobalStore(); const { register, handleSubmit, formState: { errors } } = useForm(); const [requesting, setRequesting] = useState(false); const onclickLogin = useCallback( async ({ username, password }: LoginFormType) => { setRequesting(true); try { loginSuccess( await postLogin({ username, password }) ); toast({ title: '登录成功', status: 'success' }); } catch (error: any) { toast({ title: error.message || '登录异常', status: 'error' }); } setRequesting(false); }, [loginSuccess, toast] ); const onclickGit = useCallback(() => { setLoginStore({ provider: 'git', lastRoute }); router.replace( `https://github.com/login/oauth/authorize?client_id=${ feConfigs?.gitLoginKey }&redirect_uri=${`${location.origin}/login/provider`}&scope=user:email%20read:user`, '_self' ); }, [lastRoute, setLoginStore]); return ( <> 登录 {feConfigs?.systemTitle}
{!!errors.username && errors.username.message} {!!errors.password && errors.password.message} {feConfigs?.show_register && ( setPageType('forgetPassword')} fontSize="sm" > 忘记密码? setPageType('register')} fontSize="sm" > 注册账号 )} {feConfigs?.show_register && ( <> )}
); }; export default LoginForm;