aboutsummaryrefslogtreecommitdiff
path: root/FrontEnd/src/views
diff options
context:
space:
mode:
Diffstat (limited to 'FrontEnd/src/views')
-rw-r--r--FrontEnd/src/views/common/input/InputPanel.tsx14
-rw-r--r--FrontEnd/src/views/register/index.tsx94
2 files changed, 66 insertions, 42 deletions
diff --git a/FrontEnd/src/views/common/input/InputPanel.tsx b/FrontEnd/src/views/common/input/InputPanel.tsx
index 1270cc53..3ac0cb04 100644
--- a/FrontEnd/src/views/common/input/InputPanel.tsx
+++ b/FrontEnd/src/views/common/input/InputPanel.tsx
@@ -72,7 +72,17 @@ type MapInputListToValueTypeList<Tuple extends readonly Input[]> = {
[Index in keyof Tuple]: MapInputToValueType<Tuple[Index]>;
} & { length: Tuple["length"] };
-export type OperationInputError = (I18nText | null | undefined)[];
+export type InputPanelError = {
+ [index: number]: I18nText | null | undefined;
+};
+
+export function hasError(e: InputPanelError | null | undefined): boolean {
+ if (e == null) return false;
+ for (const key in e) {
+ if (e[key] != null) return true;
+ }
+ return false;
+}
export interface InputPanelProps<InputList extends readonly Input[]> {
scheme: InputList;
@@ -81,7 +91,7 @@ export interface InputPanelProps<InputList extends readonly Input[]> {
values: MapInputListToValueTypeList<InputList>,
index: number
) => void;
- error?: OperationInputError;
+ error?: InputPanelError;
disable?: boolean;
}
diff --git a/FrontEnd/src/views/register/index.tsx b/FrontEnd/src/views/register/index.tsx
index da59ef94..a08dca09 100644
--- a/FrontEnd/src/views/register/index.tsx
+++ b/FrontEnd/src/views/register/index.tsx
@@ -1,4 +1,5 @@
import React from "react";
+import InputPanel, { InputPanelError } from "../common/input/InputPanel";
const RegisterPage: React.FC = () => {
const [username, setUsername] = React.useState<string>("");
@@ -6,48 +7,61 @@ const RegisterPage: React.FC = () => {
const [confirmPassword, setConfirmPassword] = React.useState<string>("");
const [registerCode, setRegisterCode] = React.useState<string>("");
+ const [dirty, setDirty] = React.useState<boolean[]>(new Array(4).fill(false));
+
+ const [error, setError] = React.useState<InputPanelError>();
+
+ 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";
+ }
+ return e;
+ };
+
return (
<div>
- <div>
- <label>Username</label>
- <input
- type="text"
- value={username}
- onChange={(e) => {
- setUsername(e.target.value);
- }}
- />
- </div>
- <div>
- <label>Password</label>
- <input
- type="password"
- value={password}
- onChange={(e) => {
- setPassword(e.target.value);
- }}
- />
- </div>
- <div>
- <label>Confirm Password</label>
- <input
- type="password"
- value={confirmPassword}
- onChange={(e) => {
- setConfirmPassword(e.target.value);
- }}
- />
- </div>
- <div>
- <label>Register Code</label>
- <input
- type="text"
- value={registerCode}
- onChange={(e) => {
- setRegisterCode(e.target.value);
- }}
- />
- </div>
+ <InputPanel
+ scheme={[
+ {
+ type: "text",
+ label: "register.username",
+ },
+ {
+ type: "text",
+ label: "register.password",
+ password: true,
+ },
+ {
+ type: "text",
+ label: "register.confirmPassword",
+ password: true,
+ },
+ { type: "text", label: "register.registerCode" },
+ ]}
+ values={[username, password, confirmPassword, registerCode]}
+ onChange={(values, index) => {
+ setUsername(values[0]);
+ setPassword(values[1]);
+ setConfirmPassword(values[2]);
+ setRegisterCode(values[3]);
+ const newDirty = dirty.slice();
+ newDirty[index] = true;
+ setDirty(newDirty);
+
+ setError(validate());
+ }}
+ error={error}
+ />
</div>
);
};