226 lines
6.0 KiB
TypeScript
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; |