From a90f1a5041cf4a622f41f3b2680052e3a4d5ba11 Mon Sep 17 00:00:00 2001 From: crupest Date: Wed, 4 May 2022 11:35:47 +0800 Subject: ... --- FrontEnd/src/views/register/index.tsx | 111 ++++++++++++++++++++++++++++------ 1 file changed, 91 insertions(+), 20 deletions(-) (limited to 'FrontEnd/src/views/register/index.tsx') diff --git a/FrontEnd/src/views/register/index.tsx b/FrontEnd/src/views/register/index.tsx index a051cfaf..d8530fcf 100644 --- a/FrontEnd/src/views/register/index.tsx +++ b/FrontEnd/src/views/register/index.tsx @@ -1,7 +1,41 @@ import React from "react"; -import InputPanel, { InputPanelError } from "../common/input/InputPanel"; +import { useTranslation } from "react-i18next"; +import { useNavigate } from "react-router-dom"; + +import { HttpBadRequestError } from "@/http/common"; +import { getHttpTokenClient } from "@/http/token"; +import { userService, useUser } from "@/services/user"; + +import { LoadingButton } from "../common/button"; +import InputPanel, { + hasError, + InputPanelError, +} from "../common/input/InputPanel"; + +import "./index.css"; + +const validate = (values: string[], dirties: boolean[]): InputPanelError => { + const e: InputPanelError = {}; + if (dirties[0] && values[0].length === 0) { + e[0] = "register.error.usernameEmpty"; + } + if (dirties[1] && values[1].length === 0) { + e[1] = "register.error.passwordEmpty"; + } + if (dirties[2] && values[2] !== values[1]) { + e[2] = "register.error.confirmPasswordWrong"; + } + if (dirties[3] && values[3].length === 0) { + e[3] = "register.error.registerCodeEmpty"; + } + return e; +}; const RegisterPage: React.FC = () => { + const navigate = useNavigate(); + + const { t } = useTranslation(); + const [username, setUsername] = React.useState(""); const [password, setPassword] = React.useState(""); const [confirmPassword, setConfirmPassword] = React.useState(""); @@ -9,27 +43,21 @@ const RegisterPage: React.FC = () => { const [dirty, setDirty] = React.useState(new Array(4).fill(false)); - const [error, setError] = React.useState(); + const [process, setProcess] = React.useState(false); - const validate = (): InputPanelError => { - const e: InputPanelError = {}; - if (dirty[0] && username.length === 0) { - e[0] = "register.error.usernameEmpty"; - } - if (dirty[1] && password.length === 0) { - e[1] = "register.error.passwordEmpty"; - } - if (dirty[2] && confirmPassword !== password) { - e[2] = "register.error.confirmPasswordWrong"; - } - if (dirty[3] && registerCode.length === 0) { - e[3] = "register.error.registerCodeEmpty"; + const [inputError, setInputError] = React.useState(); + const [resultError, setResultError] = React.useState(null); + + const user = useUser(); + + React.useEffect(() => { + if (user != null) { + navigate("/"); } - return e; - }; + }); return ( -
+
{ newDirty[index] = true; setDirty(newDirty); - setError(validate()); + setInputError(validate(values, newDirty)); + }} + error={inputError} + disable={process} + /> + {resultError &&
{t(resultError)}
} + { + const newDirty = dirty.slice().fill(true); + setDirty(newDirty); + const e = validate( + [username, password, confirmPassword, registerCode], + newDirty + ); + if (hasError(e)) { + setInputError(e); + } else { + setProcess(true); + void getHttpTokenClient() + .register({ + username, + password, + registerCode, + }) + .then( + () => { + void userService + .login({ username, password }, true) + .then(() => { + navigate("/"); + }); + }, + (error) => { + if (error instanceof HttpBadRequestError) { + setResultError("register.error.registerCodeInvalid"); + } else { + setResultError("error.network"); + } + setProcess(false); + } + ); + } }} - error={error} />
); -- cgit v1.2.3