import "../../css/pages/users/login.css"; import React, { useEffect, useLayoutEffect, useState } from "react"; import { Alert, Box, Button, TextField, Typography } from "@mui/material"; import hash from "hash.js"; import { Link, Navigate } from "react-router-dom"; import { useNavigate } from "react-router-dom"; import queryString from "query-string"; import { useMenu } from "../../components/MenuProvider"; import { useNotification, useIsSmallScreen, useUser, } from "../../components/ContextProvider"; import { severity } from "../../types/severity"; import MetahkgLogo from "../../components/logo"; import { Login as LoginIcon } from "@mui/icons-material"; import { api } from "../../lib/api"; import { decodeToken, setTitle } from "../../lib/common"; import { parseError } from "../../lib/parseError"; export default function Login() { const [menu, setMenu] = useMenu(); const [, setNotification] = useNotification(); const isSmallScreen = useIsSmallScreen(); const [name, setName] = useState(""); const [pwd, setPwd] = useState(""); const [disabled, setDisabled] = useState(false); const [user, setUser] = useUser(); const [alert, setAlert] = useState<{ severity: severity; text: string }>({ severity: "info", text: "", }); const navigate = useNavigate(); useEffect(() => { if (query?.continue) { setAlert({ severity: "info", text: "Login to continue." }); setNotification({ open: true, text: "Login in to continue." }); } // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useLayoutEffect(() => { setTitle("Login | Metahkg"); menu && setMenu(false); }, [menu, setMenu, user]); if (user) return ; const query = queryString.parse(window.location.search); function onSubmit(e: React.FormEvent) { e.preventDefault(); setAlert({ severity: "info", text: "Logging in..." }); setDisabled(true); api.usersLogin({ name, pwd: hash.sha256().update(pwd).digest("hex") }) .then((data) => { localStorage.setItem("token", data.token); const user = decodeToken(data.token); setUser(user); navigate(decodeURIComponent(String(query.returnto || "/")), { replace: true, }); setNotification({ open: true, text: `Logged in as ${user?.name}.` }); }) .catch((err) => { setAlert({ severity: "error", text: parseError(err), }); setNotification({ open: true, text: parseError(err), }); setDisabled(false); }); } return (

Login

{alert.text && ( {alert.text} )} {[ { label: "Username / Email", type: "text", set: setName }, { label: "Password", type: "password", set: setPwd }, ].map((item, index) => ( { item.set(e.target.value); }} required fullWidth /> ))} ({ color: `${theme.palette.secondary.main} !important`, })} > Verify / Resend verification email
); }