Presupuestador_web/client/src/app/auth/LoginPage.tsx

150 lines
4.9 KiB
TypeScript
Raw Normal View History

2024-06-06 11:05:54 +00:00
import { Container, FormTextField } from "@/components";
2024-07-10 09:53:13 +00:00
import { FormSubmitButton } from "@/components/Forms/FormSubmitButton";
2024-06-06 11:05:54 +00:00
import { UeckoLogo } from "@/components/UeckoLogo/UeckoLogo";
import { useLogin } from "@/lib/hooks";
import {
Alert,
AlertDescription,
AlertTitle,
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
Form,
} from "@/ui";
import { joiResolver } from "@hookform/resolvers/joi";
2024-06-06 21:07:40 +00:00
import { ILogin_DTO } from "@shared/contexts";
2024-06-17 16:54:30 +00:00
import { t } from "i18next";
2024-06-06 11:05:54 +00:00
import Joi from "joi";
import { AlertCircleIcon } from "lucide-react";
import { SubmitHandler, useForm } from "react-hook-form";
2024-06-17 16:54:30 +00:00
import { Trans } from "react-i18next";
2024-06-06 11:05:54 +00:00
import { Link } from "react-router-dom";
2024-06-09 20:22:22 +00:00
import SpanishJoiMessages from "../../spanish-joi-messages.json";
2024-06-06 11:05:54 +00:00
2024-06-06 21:07:40 +00:00
type LoginDataForm = ILogin_DTO;
2024-06-06 11:05:54 +00:00
export const LoginPage = () => {
const { mutate: login } = useLogin({
onSuccess: (data) => {
const { success, error } = data;
if (!success && error) {
form.setError("root", error);
}
},
});
const form = useForm<LoginDataForm>({
mode: "onBlur",
defaultValues: {
email: "",
password: "",
},
resolver: joiResolver(
Joi.object({
email: Joi.string()
.email({ tlds: { allow: false } })
.required(),
password: Joi.string().min(4).alphanum().required(),
}),
{
messages: SpanishJoiMessages,
}
),
});
const onSubmit: SubmitHandler<LoginDataForm> = async (data) => {
2024-07-10 09:53:13 +00:00
login({ email: data.email, password: data.password }, {});
2024-06-06 11:05:54 +00:00
};
return (
<Container
variant={"full"}
className='p-0 lg:grid lg:min-h-[600px] lg:grid-cols-2 xl:min-h-[800px] h-screen'
>
<div className='flex items-center justify-center py-12'>
2024-08-12 10:13:16 +00:00
<div className='mx-auto grid w-[650px] gap-6'>
<Card className='px-12 py-6'>
2024-06-06 11:05:54 +00:00
<CardHeader>
<UeckoLogo className='inline-block m-auto mb-6 align-middle max-w-32' />
2024-06-09 20:04:46 +00:00
<CardTitle>
<Trans i18nKey='login_page.title' />
</CardTitle>
<CardDescription>
<Trans i18nKey='login_page.description' />
</CardDescription>
2024-06-06 11:05:54 +00:00
</CardHeader>
<CardContent>
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)}>
<div className='grid items-start gap-6'>
<div className='grid gap-6'>
<FormTextField
2024-07-03 18:05:26 +00:00
required
name='email'
2024-06-09 20:04:46 +00:00
label={t("login_page.email_label")}
2024-06-06 11:05:54 +00:00
type='email'
2024-06-09 20:04:46 +00:00
placeholder={t("login_page.email_placeholder")}
2024-06-06 11:05:54 +00:00
/>
</div>
<div className='grid gap-6'>
<FormTextField
2024-07-03 18:05:26 +00:00
required
name='password'
2024-06-09 20:04:46 +00:00
label={t("login_page.password_label")}
2024-06-06 11:05:54 +00:00
type='password'
/>
<div className='mb-4 -mt-2 text-sm'>
2024-06-09 20:04:46 +00:00
<Trans i18nKey='login_page.forgotten_password' />
2024-06-06 11:05:54 +00:00
<br />
<Link to='https://uecko.com/distribuidores' className='underline'>
2024-06-09 20:04:46 +00:00
<Trans i18nKey='login_page.contact_us' />
2024-06-06 11:05:54 +00:00
</Link>
</div>
</div>
{form.formState.errors.root?.message && (
<Alert variant='destructive'>
<AlertCircleIcon className='w-4 h-4' />
2024-06-09 20:04:46 +00:00
<AlertTitle>
2024-06-17 16:54:30 +00:00
<Trans i18nKey='common.error' />
2024-06-09 20:04:46 +00:00
</AlertTitle>
2024-06-06 11:05:54 +00:00
<AlertDescription>{form.formState.errors.root?.message}</AlertDescription>
</Alert>
)}
2024-07-10 09:53:13 +00:00
<FormSubmitButton className='w-full' label={t("login_page.login")} />
2024-06-06 11:05:54 +00:00
<div className='mt-4 text-sm text-center'>
2024-06-09 20:04:46 +00:00
<Trans i18nKey='login_page.become_dealer' />
2024-06-06 11:05:54 +00:00
<br />
<Link to='https://uecko.com/distribuidores' className='underline'>
2024-06-09 20:04:46 +00:00
<Trans i18nKey='login_page.contact_us' />
2024-06-06 11:05:54 +00:00
</Link>
</div>
</div>
</form>
</Form>
</CardContent>
</Card>
2024-08-12 10:13:16 +00:00
<img
className='block w-11/12 mx-auto aspect-auto'
src='https://uecko.com/assets/img/uecko-footer_logos.jpg'
/>
2024-06-06 11:05:54 +00:00
</div>
</div>
<div className='hidden bg-muted lg:block'>
<img
src='https://uecko.com/assets/img/021/nara2.jpg'
alt='Image'
width='1920'
height='1080'
className='h-full w-full object-cover dark:brightness-[0.2] dark:grayscale'
/>
</div>
</Container>
);
};