import { useState, useEffect, ChangeEvent, FormEvent } from "react"; import toast from "react-hot-toast"; import { useTranslation } from "react-i18next"; import BASE_URL, { KEY_LOCAL_MAGIC_TOKEN } from "../../app/config"; import Input from "../../common/component/styled/Input"; import Button from "../../common/component/styled/Button"; import { useLazyCheckEmailQuery, useRegisterMutation, useSendRegMagicLinkMutation } from "../../app/services/auth"; import EmailNextTip from "./EmailNextStepTip"; import SignInLink from "./SignInLink"; import Divider from "../../common/component/Divider"; import { useGetLoginConfigQuery } from "../../app/services/server"; import SocialLoginButtons from "../login/SocialLoginButtons"; import { setAuthData } from "../../app/slices/auth.data"; import { useDispatch } from "react-redux"; interface AuthForm { name?: string, email: string; password: string; confirmPassword: string; } export default function Register() { const { t } = useTranslation("auth"); const { t: ct } = useTranslation(); const [sendRegMagicLink, { isLoading: signingUp, data, isSuccess }] = useSendRegMagicLinkMutation(); const dispatch = useDispatch(); const [register, { isLoading: registering, data: regData, isSuccess: regSuccess }] = useRegisterMutation(); const [checkEmail, { isLoading: checkingEmail }] = useLazyCheckEmailQuery(); const { data: loginConfig, isSuccess: loginConfigSuccess } = useGetLoginConfigQuery(); // const navigateTo = useNavigate(); const [input, setInput] = useState({ email: "", password: "", confirmPassword: "" }); const query = new URLSearchParams(location.search); const magic_token = query.get("magic_token") ?? undefined; if (magic_token) { //本地存一下 magic token 后续oauth流程用到 localStorage.setItem(KEY_LOCAL_MAGIC_TOKEN, magic_token); } // send reg link useEffect(() => { if (isSuccess && data) { const { new_magic_token, mail_is_sent } = data; if (!mail_is_sent && new_magic_token) { // 直接进入set_name流程 location.href = `?magic_token=${new_magic_token}#/register/set_name`; } } }, [isSuccess, data]); // register useEffect(() => { if (regSuccess && regData) { // 更新本地认证信息 toast.success(ct("tip.reg")); dispatch(setAuthData(regData)); // tricky location.href = `/#/`; } }, [regSuccess, regData]); const handleReg = async (evt: FormEvent) => { evt.preventDefault(); const { name, email, password, confirmPassword } = input; if (password !== confirmPassword) { toast.error("Not Same Password!"); return; } const { data: canReg } = await checkEmail(email); if (canReg) { if (magic_token) { sendRegMagicLink({ magic_token, email, password }); } else { // 带用户名的注册 register({ name, email, password }); } } else { toast.error("Email already registered!"); } // sendMagicLink(email); }; const handleCompare = () => { const { password, confirmPassword } = input; if (password !== confirmPassword) { toast.error("Not Same Password!"); } }; const handleInput = (evt: ChangeEvent) => { const { type } = evt.target.dataset as { type: keyof AuthForm }; const { value } = evt.target; setInput((prev) => { prev[type] = value; return { ...prev }; }); }; if (!loginConfigSuccess) return null; const { who_can_sign_up: whoCanSignUp } = loginConfig; // magic token 没有并且没有开放注册 if (whoCanSignUp !== "EveryOne" && !magic_token) // todo: i18n return <>Sign up method is updated to Invitation Link Only; const { name, email, password, confirmPassword } = input; if (data?.mail_is_sent) return ; const isLoading = registering || signingUp || checkingEmail; return ( <>
logo

{t("reg.title")}

{t("reg.desc")}
{/* 不存在 magic token */} {!magic_token && }
); }