Front-Complete/src/app/main/sign-in/SignInPage.tsx

226 lines
6.0 KiB
TypeScript

import { Controller, useForm } from 'react-hook-form';
import Button from '@mui/material/Button';
import Checkbox from '@mui/material/Checkbox';
import FormControl from '@mui/material/FormControl';
import FormControlLabel from '@mui/material/FormControlLabel';
import TextField from '@mui/material/TextField';
import Typography from '@mui/material/Typography';
import { Link } from 'react-router-dom';
import _ from '@lodash';
import Paper from '@mui/material/Paper';
import FuseSvgIcon from '@fuse/core/FuseSvgIcon';
import AvatarGroup from '@mui/material/AvatarGroup';
import Avatar from '@mui/material/Avatar';
import Box from '@mui/material/Box';
import { z } from 'zod';
import { zodResolver } from '@hookform/resolvers/zod';
import Tabs from '@mui/material/Tabs';
import Tab from '@mui/material/Tab';
import { useState } from 'react';
import JwtLoginTab from './tabs/JwtSignInTab';
import FirebaseSignInTab from './tabs/FirebaseSignInTab';
/**
* Form Validation Schema
*/
const schema = z.object({
email: z.string().email('You must enter a valid email').nonempty('You must enter an email'),
password: z
.string()
.min(8, 'Password is too short - must be at least 8 chars.')
.nonempty('Please enter your password.')
});
const tabs = [
{
id: 'jwt',
title: 'JWT',
logo: 'assets/images/logo/jwt.svg',
logoClass: 'h-40 p-4 bg-black rounded-12'
},
{
id: 'firebase',
title: 'Firebase',
logo: 'assets/images/logo/firebase.svg',
logoClass: 'h-40'
}
];
type FormType = {
email: string;
password: string;
remember?: boolean;
};
const defaultValues = {
email: '',
password: '',
remember: true
};
/**
* The full screen reversed sign in page.
*/
function SignInPage() {
const [selectedTabId, setSelectedTabId] = useState(tabs[0].id);
function handleSelectTab(id: string) {
setSelectedTabId(id);
}
const { control, formState, handleSubmit, reset } = useForm<FormType>({
mode: 'onChange',
defaultValues,
resolver: zodResolver(schema)
});
const { isValid, dirtyFields, errors } = formState;
function onSubmit() {
reset(defaultValues);
}
return (
<div className="flex min-w-0 flex-auto flex-col items-center sm:justify-center md:p-32">
<Paper className="flex min-h-full w-full overflow-hidden rounded-0 sm:min-h-auto sm:w-auto sm:rounded-2xl sm:shadow md:w-full md:max-w-6xl">
<div className="w-full px-16 py-32 ltr:border-r-1 rtl:border-l-1 sm:w-auto sm:p-48 md:p-64">
<div className="mx-auto w-full max-w-320 sm:mx-0 sm:w-320">
<img
className="w-48"
src="assets/images/logo/logo1.svg"
alt="logo"
/>
<Typography className="mt-32 text-4xl font-extrabold leading-tight tracking-tight">
Iniciar Sesión
</Typography>
<div className="mt-2 flex items-baseline font-medium">
<Typography>Aún no tienes cuenta?</Typography>
<Link
className="ml-4"
to="/sign-up"
>
Regístrate
</Link>
</div>
<Tabs
value={_.findIndex(tabs, { id: selectedTabId })}
variant="fullWidth"
className="w-full mt-24 mb-32"
indicatorColor="secondary"
>
{tabs.map((item) => (
<Tab
onClick={() => handleSelectTab(item.id)}
key={item.id}
icon={
<img
className={item.logoClass}
src={item.logo}
alt={item.title}
/>
}
className="min-w-0"
label={item.title}
/>
))}
</Tabs>
{selectedTabId === 'jwt' && <JwtLoginTab />}
{selectedTabId === 'firebase' && <FirebaseSignInTab />}
<div className="mt-32 flex items-center">
<div className="mt-px flex-auto border-t" />
<Typography
className="mx-8"
color="text.secondary"
>
Or continue with
</Typography>
<div className="mt-px flex-auto border-t" />
</div>
<div className="mt-32 flex items-center space-x-16">
<Button
variant="outlined"
className="flex-auto"
>
<FuseSvgIcon
size={20}
color="action"
>
feather:facebook
</FuseSvgIcon>
</Button>
<Button
variant="outlined"
className="flex-auto"
>
<FuseSvgIcon
size={20}
color="action"
>
feather:twitter
</FuseSvgIcon>
</Button>
<Button
variant="outlined"
className="flex-auto"
>
<FuseSvgIcon
size={20}
color="action"
>
feather:github
</FuseSvgIcon>
</Button>
</div>
</div>
</div>
<Box
className="relative hidden h-full flex-auto items-center justify-center overflow-hidden p-64 md:flex lg:px-112"
sx={{ backgroundColor: 'primary.main' }}
>
<div className="relative z-10 w-full max-w-2xl">
<img
className="w-48"
src="assets/images/empresa/logoAlphaBC.svg"
alt="logo"
width="500"
/>
<div className="text-7xl font-bold leading-none text-gray-100">
<div>Welcome to</div>
<div>our community</div>
</div>
<div className="mt-24 text-lg leading-6 tracking-tight text-gray-400">
Fuse helps developers to build organized and well coded dashboards full of beautiful and
rich modules. Join us and start building your application today.
</div>
<div className="mt-32 flex items-center">
<AvatarGroup
sx={{
'& .MuiAvatar-root': {
borderColor: 'primary.main'
}
}}
>
<Avatar src="assets/images/avatars/female-18.jpg" />
<Avatar src="assets/images/avatars/female-11.jpg" />
<Avatar src="assets/images/avatars/male-09.jpg" />
<Avatar src="assets/images/avatars/male-16.jpg" />
</AvatarGroup>
<div className="ml-16 font-medium tracking-tight text-gray-400">
More than 17k people joined us, it's your turn
</div>
</div>
</div>
</Box>
</Paper>
</div>
);
}
export default SignInPage;