import { useEffect, useState } from "react"; import * as api from "../helpers/api"; import { validate, ValidatorConfig } from "../helpers/validator"; import useI18n from "../hooks/useI18n"; import useLoading from "../hooks/useLoading"; import { globalService, locationService, userService } from "../services"; import Icon from "../components/Icon"; import Only from "../components/common/OnlyWhen"; import toastHelper from "../components/Toast"; import "../less/auth.less"; interface Props {} const validateConfig: ValidatorConfig = { minLength: 4, maxLength: 24, noSpace: true, noChinese: true, }; const Auth: React.FC = () => { const { t, locale } = useI18n(); const pageLoadingState = useLoading(true); const [siteHost, setSiteHost] = useState(); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const actionBtnLoadingState = useLoading(false); useEffect(() => { api.getSystemStatus().then(({ data }) => { const { data: status } = data; setSiteHost(status.host); if (status.profile.mode === "dev") { setEmail("demo@usememos.com"); setPassword("secret"); } pageLoadingState.setFinish(); }); }, []); const handleEmailInputChanged = (e: React.ChangeEvent) => { const text = e.target.value as string; setEmail(text); }; const handlePasswordInputChanged = (e: React.ChangeEvent) => { const text = e.target.value as string; setPassword(text); }; const handleSigninBtnsClick = async () => { if (actionBtnLoadingState.isLoading) { return; } const emailValidResult = validate(email, validateConfig); if (!emailValidResult.result) { toastHelper.error("Email: " + emailValidResult.reason); return; } const passwordValidResult = validate(password, validateConfig); if (!passwordValidResult.result) { toastHelper.error("Password: " + passwordValidResult.reason); return; } try { actionBtnLoadingState.setLoading(); await api.signin(email, password); const user = await userService.doSignIn(); if (user) { locationService.replaceHistory("/"); } else { toastHelper.error("Login failed"); } } catch (error: any) { console.error(error); toastHelper.error(error.response.data.message); } actionBtnLoadingState.setFinish(); }; const handleSignUpAsHostBtnsClick = async () => { if (actionBtnLoadingState.isLoading) { return; } const emailValidResult = validate(email, validateConfig); if (!emailValidResult.result) { toastHelper.error("Email: " + emailValidResult.reason); return; } const passwordValidResult = validate(password, validateConfig); if (!passwordValidResult.result) { toastHelper.error("Password: " + passwordValidResult.reason); return; } try { actionBtnLoadingState.setLoading(); await api.signup(email, password, "HOST"); const user = await userService.doSignIn(); if (user) { locationService.replaceHistory("/"); } else { toastHelper.error("Signup failed"); } } catch (error: any) { console.error(error); toastHelper.error(error.response.data.message); } actionBtnLoadingState.setFinish(); }; const handleLocaleItemClick = (locale: Locale) => { globalService.setLocale(locale); }; return (

{t("slogan")}

{t("common.email")}
{t("common.password")}

{siteHost || pageLoadingState.isLoading ? t("auth.not-host-tip") : t("auth.host-tip")}

handleLocaleItemClick("en")}> English / handleLocaleItemClick("zh")}> 中文
); }; export default Auth;