ente/src/components/Login.tsx

114 lines
3.9 KiB
TypeScript
Raw Normal View History

2021-06-04 20:43:13 +00:00
import Card from 'react-bootstrap/Card';
import Form from 'react-bootstrap/Form';
import FormControl from 'react-bootstrap/FormControl';
import constants from 'utils/strings/constants';
import { Formik, FormikHelpers } from 'formik';
2021-06-11 10:52:56 +00:00
import React, { useEffect, useRef, useState } from 'react';
2021-06-04 20:43:13 +00:00
import { useRouter } from 'next/router';
import * as Yup from 'yup';
import { getOtt } from 'services/userService';
import { setData, LS_KEYS, getData } from 'utils/storage/localStorage';
import SubmitButton from 'components/SubmitButton';
import Button from 'react-bootstrap/Button';
2021-06-04 21:49:24 +00:00
import LogoImg from './LogoImg';
2021-06-04 20:43:13 +00:00
interface formValues {
email: string;
}
interface LoginProps {
2021-08-13 02:38:38 +00:00
signUp: () => void;
2021-06-04 20:43:13 +00:00
}
export default function Login(props: LoginProps) {
const router = useRouter();
const [waiting, setWaiting] = useState(false);
const [loading, setLoading] = useState(true);
useEffect(() => {
2021-06-11 10:52:56 +00:00
const main = async () => {
2021-06-04 20:43:13 +00:00
router.prefetch('/verify');
const user = getData(LS_KEYS.USER);
if (user?.email) {
await router.push('/verify');
}
setLoading(false);
};
main();
}, []);
const loginUser = async (
{ email }: formValues,
2021-08-13 02:38:38 +00:00
{ setFieldError }: FormikHelpers<formValues>
2021-06-04 20:43:13 +00:00
) => {
try {
setWaiting(true);
await getOtt(email);
setData(LS_KEYS.USER, { email });
router.push('/verify');
} catch (e) {
setFieldError('email', `${constants.UNKNOWN_ERROR} ${e.message}`);
}
setWaiting(false);
};
2021-06-11 10:52:56 +00:00
const inputElement = useRef(null);
useEffect(() => {
setTimeout(() => {
inputElement.current?.focus();
}, 250);
}, []);
2021-06-04 20:43:13 +00:00
return (
<>
<Card.Title style={{ marginBottom: '32px' }}>
2021-06-04 21:49:24 +00:00
<LogoImg src="/icon.svg" />
2021-06-04 20:43:13 +00:00
{constants.LOGIN}
</Card.Title>
<Formik<formValues>
initialValues={{ email: '' }}
validationSchema={Yup.object().shape({
email: Yup.string()
.email(constants.EMAIL_ERROR)
.required(constants.REQUIRED),
})}
validateOnChange={false}
validateOnBlur={false}
2021-08-13 02:38:38 +00:00
onSubmit={loginUser}>
{({ values, errors, touched, handleChange, handleSubmit }) => (
2021-06-04 20:43:13 +00:00
<Form noValidate onSubmit={handleSubmit}>
<Form.Group controlId="formBasicEmail">
<Form.Control
2021-06-11 10:52:56 +00:00
ref={inputElement}
2021-06-04 20:43:13 +00:00
type="email"
placeholder={constants.ENTER_EMAIL}
value={values.email}
onChange={handleChange('email')}
isInvalid={Boolean(
2021-08-13 02:38:38 +00:00
touched.email && errors.email
2021-06-04 20:43:13 +00:00
)}
autoFocus
disabled={loading}
/>
<FormControl.Feedback type="invalid">
{errors.email}
</FormControl.Feedback>
</Form.Group>
<SubmitButton
buttonText={constants.LOGIN}
loading={waiting}
/>
<br />
2021-08-13 02:38:38 +00:00
<Button
block
variant="link"
className="text-center"
onClick={props.signUp}>
2021-06-04 20:43:13 +00:00
{constants.NO_ACCOUNT}
</Button>
</Form>
)}
</Formik>
</>
);
}