import { Option, Select } from "@mui/joy"; import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { useAppSelector } from "../store"; import * as api from "../helpers/api"; import { validate, ValidatorConfig } from "../helpers/validator"; import useLoading from "../hooks/useLoading"; import { globalService, userService } from "../services"; import Icon from "../components/Icon"; import toastHelper from "../components/Toast"; import AppearanceSelect from "../components/AppearanceSelect"; import "../less/auth.less"; const validateConfig: ValidatorConfig = { minLength: 4, maxLength: 320, noSpace: true, noChinese: true, }; const Auth = () => { const { t, i18n } = useTranslation(); const navigate = useNavigate(); const systemStatus = useAppSelector((state) => state.global.systemStatus); const actionBtnLoadingState = useLoading(false); const mode = systemStatus.profile.mode; const [username, setUsername] = useState(mode === "dev" ? "demohero" : ""); const [password, setPassword] = useState(mode === "dev" ? "secret" : ""); useEffect(() => { userService.doSignOut().catch(); }, []); const handleUsernameInputChanged = (e: React.ChangeEvent) => { const text = e.target.value as string; setUsername(text); }; const handlePasswordInputChanged = (e: React.ChangeEvent) => { const text = e.target.value as string; setPassword(text); }; const handleSigninBtnsClick = async () => { if (actionBtnLoadingState.isLoading) { return; } const usernameValidResult = validate(username, validateConfig); if (!usernameValidResult.result) { toastHelper.error(t("common.username") + ": " + t(usernameValidResult.reason as string)); return; } const passwordValidResult = validate(password, validateConfig); if (!passwordValidResult.result) { toastHelper.error(t("common.password") + ": " + t(passwordValidResult.reason as string)); return; } try { actionBtnLoadingState.setLoading(); await api.signin(username, password); const user = await userService.doSignIn(); if (user) { navigate("/"); } else { toastHelper.error(t("message.login-failed")); } } catch (error: any) { console.error(error); toastHelper.error(error.response.data.error); } actionBtnLoadingState.setFinish(); }; const handleSignUpBtnsClick = async (role: UserRole) => { if (actionBtnLoadingState.isLoading) { return; } const usernameValidResult = validate(username, validateConfig); if (!usernameValidResult.result) { toastHelper.error(t("common.username") + ": " + t(usernameValidResult.reason as string)); return; } const passwordValidResult = validate(password, validateConfig); if (!passwordValidResult.result) { toastHelper.error(t("common.password") + ": " + t(passwordValidResult.reason as string)); return; } try { actionBtnLoadingState.setLoading(); await api.signup(username, password, role); const user = await userService.doSignIn(); if (user) { navigate("/"); } else { toastHelper.error(t("common.singup-failed")); } } catch (error: any) { console.error(error); toastHelper.error(error.response.data.error); } actionBtnLoadingState.setFinish(); }; const handleLocaleItemClick = (locale: Locale) => { globalService.setLocale(locale); }; return (

memos

{t("slogan")}

{t("common.username")}
{t("common.password")}
{systemStatus?.host ? ( <> {actionBtnLoadingState.isLoading && } {systemStatus?.allowSignUp && ( <> / )} ) : ( <> )}
{!systemStatus?.host &&

{t("auth.host-tip")}

}
); }; export default Auth;