import "../../css/pages/users/register.css"; import React, { useLayoutEffect, useState } from "react"; import hash from "hash.js"; import { Alert, Box, Button, FormControl, IconButton, InputLabel, MenuItem, Select, SelectChangeEvent, TextField, TextFieldProps, Typography, } from "@mui/material"; import ReCAPTCHA from "react-google-recaptcha"; import { Navigate, useNavigate } from "react-router-dom"; import { useMenu } from "../../components/MenuProvider"; import { useNotification, useReCaptchaSiteKey, useUser, useWidth, } from "../../components/ContextProvider"; import { setTitle } from "../../lib/common"; import { severity } from "../../types/severity"; import MetahkgLogo from "../../components/logo"; import { Close, HowToReg } from "@mui/icons-material"; import { Link } from "react-router-dom"; import queryString from "query-string"; import { api } from "../../lib/api"; import { parseError } from "../../lib/parseError"; import { UserSex } from "@metahkg/api"; declare const grecaptcha: { reset: () => void }; /** * Sex selector * @param props.disabled disable the selector * @param props.sex the selected sex * @param props.setSex: function to update sex */ function SexSelect(props: { sex: "M" | "F" | undefined; setSex: React.Dispatch>; disabled: boolean; }) { const { sex, setSex, disabled } = props; const onChange = function (e: SelectChangeEvent) { setSex(e.target.value ? "M" : "F"); }; return ( Gender ); } export default function Register() { const [width] = useWidth(); const [, setNotification] = useNotification(); const [name, setName] = useState(""); const [email, setEmail] = useState(""); const [pwd, setPwd] = useState(""); const [sex, setSex] = useState<"M" | "F" | undefined>(undefined); const [disabled, setDisabled] = useState(false); const [rtoken, setRtoken] = useState(""); const [alert, setAlert] = useState<{ severity: severity; text: string }>({ severity: "info", text: "", }); const [menu, setMenu] = useMenu(); const [user] = useUser(); const reCaptchaSiteKey = useReCaptchaSiteKey(); const query = queryString.parse(window.location.search); const navigate = useNavigate(); const small = width / 2 - 100 <= 450; useLayoutEffect(() => { setTitle("Register | Metahkg"); menu && setMenu(false); }, [menu, setMenu, user]); if (user) ; function onSubmit(e: React.FormEvent) { e.preventDefault(); setAlert({ severity: "info", text: "Registering..." }); setDisabled(true); sex && api .usersRegister({ email, name, pwd: hash.sha256().update(pwd).digest("hex"), sex: sex as UserSex, rtoken, }) .then(() => { setAlert({ severity: "success", text: "A link has been sent to your email address. Please click the link to verify.", }); setNotification({ open: true, text: "Please click the link sent to your email address.", }); }) .catch((err) => { setAlert({ severity: "error", text: parseError(err) }); setNotification({ open: true, text: parseError(err) }); setRtoken(""); setDisabled(false); grecaptcha.reset(); }); } const inputs: TextFieldProps[] = [ { label: "Username", onChange: (e) => { setName(e.target.value); }, type: "text", inputProps: { pattern: "S{1, 15}" }, }, { label: "Email", onChange: (e) => setEmail(e.target.value), type: "email", inputProps: { pattern: "[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@([0-9a-zA-Z][-\\w]*[0-9a-zA-Z]\\.)+[a-zA-Z]{2,9}", }, }, { label: "Password", onChange: (e) => setPwd(e.target.value), type: "password", inputProps: { pattern: ".{8,}" }, }, ]; return ( {query.returnto && ( { navigate(String(query.returnto)); }} > )}

Register

{alert.text && ( {alert.text} )} {inputs.map((props, index) => ( ))} ({ color: `${theme.palette.secondary.main} !important`, })} > Verify / Resend verification email { setRtoken(token || ""); }} />
); }