97 lines
2.6 KiB
TypeScript
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>
|
|
);
|
|
}
|