postiz/apps/frontend/src/components/auth/login.tsx

97 lines
2.6 KiB
TypeScript

'use client';
import { useForm, SubmitHandler, FormProvider } from 'react-hook-form';
import { useFetch } from '@gitroom/helpers/utils/custom.fetch';
import Link from 'next/link';
import { Button } from '@gitroom/react/form/button';
import { Input } from '@gitroom/react/form/input';
import { useMemo, useState } from 'react';
import { classValidatorResolver } from '@hookform/resolvers/class-validator';
import { LoginUserDto } from '@gitroom/nestjs-libraries/dtos/auth/login.user.dto';
type Inputs = {
email: string;
password: string;
providerToken: '';
provider: 'LOCAL';
};
export function Login() {
const [loading, setLoading] = useState(false);
const resolver = useMemo(() => {
return classValidatorResolver(LoginUserDto);
}, []);
const form = useForm<Inputs>({
resolver,
defaultValues: {
providerToken: '',
provider: 'LOCAL',
},
});
const fetchData = useFetch();
const onSubmit: SubmitHandler<Inputs> = async (data) => {
setLoading(true);
const login = await fetchData('/auth/login', {
method: 'POST',
body: JSON.stringify({ ...data, provider: 'LOCAL' }),
});
if (login.status === 400) {
form.setError('email', {
message: 'Invalid email or password',
});
setLoading(false);
}
};
return (
<FormProvider {...form}>
<form onSubmit={form.handleSubmit(onSubmit)}>
<div>
<h1 className="text-3xl font-bold text-left mb-4 cursor-pointer">
Create An Account
</h1>
</div>
<div className="space-y-4 text-white">
<Input
label="Email"
{...form.register('email')}
type="email"
placeholder="Email Addres"
/>
<Input
label="Password"
{...form.register('password')}
autoComplete="off"
type="password"
placeholder="Password"
/>
</div>
<div className="text-center mt-6">
<div className="w-full flex">
<Button type="submit" className="flex-1" loading={loading}>
Sign in
</Button>
</div>
<p className="mt-4 text-sm">
Don{"'"}t Have An Account?{' '}
<Link href="/auth" className="underline cursor-pointer">
{' '}
Sign Up
</Link>
</p>
<p className="mt-4 text-sm text-red-600">
<Link href="/auth/forgot" className="underline cursor-pointer">
Forgot password
</Link>
</p>
</div>
</form>
</FormProvider>
);
}