refactor: 登录输入验证

pull/13/head
moonrailgun 4 years ago
parent 3967aa4422
commit 6a0852123a

@ -23,7 +23,8 @@
"react-router": "^5.2.0", "react-router": "^5.2.0",
"react-router-dom": "^5.2.0", "react-router-dom": "^5.2.0",
"socket.io-client": "^4.1.2", "socket.io-client": "^4.1.2",
"tailwindcss": "^2.2.4" "tailwindcss": "^2.2.4",
"yup": "^0.32.9"
}, },
"devDependencies": { "devDependencies": {
"@types/mini-css-extract-plugin": "^1.4.3", "@types/mini-css-extract-plugin": "^1.4.3",

@ -3,6 +3,7 @@ import { Divider } from 'antd';
import { useAsyncFn } from 'pawchat-shared'; import { useAsyncFn } from 'pawchat-shared';
import React, { useState } from 'react'; import React, { useState } from 'react';
import { Spinner } from '../../components/Spinner'; import { Spinner } from '../../components/Spinner';
import { string } from 'yup';
/** /**
* *
@ -25,17 +26,28 @@ OAuthLoginView.displayName = 'OAuthLoginView';
* *
*/ */
export const LoginView: React.FC = React.memo(() => { export const LoginView: React.FC = React.memo(() => {
const [username, setUsername] = useState(''); const [email, setEmail] = useState('');
const [password, setPassword] = useState(''); const [password, setPassword] = useState('');
const [{ value, loading }, handleLogin] = useAsyncFn(async () => { const [{ loading, error }, handleLogin] = useAsyncFn(async () => {
console.log({ email, password });
await string()
.email('邮箱格式不正确')
.required('邮箱不能为空')
.validate(email);
await string()
.min(6, '密码不能低于6位')
.required('密码不能为空')
.validate(password);
await new Promise((resolve) => { await new Promise((resolve) => {
setTimeout(() => { setTimeout(() => {
resolve(''); resolve('');
}, 2000); }, 2000);
}); });
console.log({ username, password }); }, [email, password]);
}, [username, password]);
return ( return (
<div className="w-96 text-white"> <div className="w-96 text-white">
@ -49,11 +61,11 @@ export const LoginView: React.FC = React.memo(() => {
className="appearance-none rounded-md relative block w-full px-4 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 rounded-t-md focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 focus:z-10 text-base sm:text-sm" className="appearance-none rounded-md relative block w-full px-4 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 rounded-t-md focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 focus:z-10 text-base sm:text-sm"
placeholder="name@example.com" placeholder="name@example.com"
type="text" type="text"
value={username} value={email}
onChange={(e) => setUsername(e.target.value)} onChange={(e) => setEmail(e.target.value)}
/> />
</div> </div>
<div className="mb-8"> <div className="mb-4">
<div className="mb-2"></div> <div className="mb-2"></div>
<input <input
id="password" id="password"
@ -65,8 +77,11 @@ export const LoginView: React.FC = React.memo(() => {
/> />
</div> </div>
{error && <p className="text-red-500 text-sm mb-4">{error.message}</p>}
<button <button
className="group relative w-full py-2 px-4 border border-transparent text-sm font-medium rounded-md text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500" className="group relative w-full py-2 px-4 border border-transparent text-sm font-medium rounded-md text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 disabled:opacity-50"
disabled={loading}
onClick={handleLogin} onClick={handleLogin}
> >
{loading && <Spinner />} {loading && <Spinner />}

@ -24,6 +24,7 @@ module.exports = {
}, },
variants: { variants: {
extend: { extend: {
opacity: ['disabled'],
borderRadius: ['hover'], borderRadius: ['hover'],
}, },
}, },

Loading…
Cancel
Save