Files
payload/examples/auth/nextjs/pages/login/index.tsx
2023-02-15 18:49:08 -05:00

78 lines
1.9 KiB
TypeScript

import React, { useCallback, useEffect, useState } from 'react'
import { useForm } from 'react-hook-form'
import Link from 'next/link'
import { useRouter } from 'next/router'
import { useAuth } from '../../components/Auth'
import { Gutter } from '../../components/Gutter'
import { Input } from '../../components/Input'
import classes from './index.module.css'
type FormData = {
email: string
password: string
}
const Login: React.FC = () => {
const [error, setError] = useState('')
const router = useRouter()
const { login } = useAuth()
const {
register,
handleSubmit,
formState: { errors },
} = useForm<FormData>()
const onSubmit = useCallback(
async (data: FormData) => {
try {
await login(data)
router.push('/account')
} catch (_) {
setError('There was an error with the credentials provided. Please try again.')
}
},
[login, router],
)
useEffect(() => {
if (router.query.unauthorized) {
setError(`To visit the ${router.query.unauthorized} page, you need to be logged in.`)
}
}, [router])
return (
<Gutter>
<h1>Log in</h1>
<p>
To log in, use the email <b>dev@payloadcms.com</b> with the password <b>test</b>.
</p>
{error && <div className={classes.error}>{error}</div>}
<form onSubmit={handleSubmit(onSubmit)} className={classes.form}>
<Input
name="email"
label="Email Address"
required
register={register}
error={errors.email}
/>
<Input
name="password"
type="password"
label="Password"
required
register={register}
error={errors.password}
/>
<input type="submit" />
</form>
<Link href="/create-account">Create an account</Link>
<br />
<Link href="/recover-password">Recover your password</Link>
</Gutter>
)
}
export default Login