web-backset.cn/apps/web/src/view/Login/index.tsx
2023-03-22 10:09:21 +08:00

115 lines
3.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { useEffect, useRef, useState } from "react";
import { sms, userLogin } from "../../api";
import "./index.less";
import { useNavigate } from "react-router-dom";
import { useUserStore } from "../../store/user.store";
import toast from "react-hot-toast";
const defaultForm = {
user_login: "",
user_pass: "",
};
const DURATION = 60; // 验证码倒计时
export default function Login() {
const [loginForm, setLoginForm] = useState(defaultForm);
let [countdown, setCountdown] = useState(DURATION);
const timer = useRef<any>();
const navigate = useNavigate();
const setUser = useUserStore((s: any) => s.setUser);
const onClickSmsBtn = () => {
if (!/^1[3456789]\d{9}$/.test(loginForm.user_login))
return toast.error("手机号格式有误");
sms(loginForm.user_login).then((res: any) => {
if (res?.code === 10000)
setTimeout(() => {
toast.success("验证码已发送");
timer.current = setInterval(() => setCountdown(countdown--), 1000);
}, 50);
});
};
const onClickLogin = () => {
userLogin(loginForm).then((res: any) => {
const { code, data, msg } = res;
if (code === 10000) {
console.log(msg);
navigate(-1);
setUser(data);
}
if (code === 20000) console.error(msg);
});
};
useEffect(() => {
if (countdown === 0) {
clearInterval(timer.current);
setCountdown(DURATION);
}
}, [countdown]);
return (
<div className="container login">
<img src="/favicon.svg" />
<h4>Backset.cn!</h4>
<div style={{ width: 320 }}>
<div className="form">
<input
style={{ marginTop: "1rem" }}
type="text"
className="input"
placeholder="手机"
onChange={(e) =>
setLoginForm((p) => ({
...p,
user_login: e.target.value,
}))
}
/>
{/* <input
style={{ marginTop: "1rem" }}
className="input"
type="password"
onChange={(e) =>
setLoginForm((p) => ({
...p,
user_pass: e.target.value,
}))
}
onKeyDown={(e) => {
if (e.key === "Enter") onClickLogin();
}}
placeholder="密码"
/> */}
<div className="sms-group" style={{ marginTop: "1rem" }}>
<input
className="input"
type="text"
onKeyDown={(e) => {
if (e.key === "Enter") onClickLogin();
}}
onChange={(e) =>
setLoginForm((p) => ({
...p,
user_pass: e.target.value,
}))
}
placeholder="验证码"
/>
<span
className="bs btn ml12 sms-btn br3 outline"
onClick={onClickSmsBtn}
>
{countdown === DURATION ? "获取" : countdown + "s"}
</span>
</div>
</div>
<button className="submit-btn bs btn" onClick={onClickLogin}>
</button>
</div>
</div>
);
}