You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.8 KiB
59 lines
1.8 KiB
import { AuthenticationError, PromiseReturnType } from "blitz" |
|
import Link from "next/link" |
|
import { LabeledTextField } from "app/core/components/LabeledTextField" |
|
import { Form, FORM_ERROR } from "app/core/components/Form" |
|
import login from "app/auth/mutations/login" |
|
import { Login } from "app/auth/validations" |
|
import { useMutation } from "@blitzjs/rpc" |
|
import { Routes } from "@blitzjs/next" |
|
|
|
type LoginFormProps = { |
|
onSuccess?: (user: PromiseReturnType<typeof login>) => void |
|
} |
|
|
|
export const LoginForm = (props: LoginFormProps) => { |
|
const [loginMutation] = useMutation(login) |
|
return ( |
|
<div> |
|
<h1>Login</h1> |
|
|
|
<Form |
|
submitText="Login" |
|
schema={Login} |
|
initialValues={{ email: "", password: "" }} |
|
onSubmit={async (values) => { |
|
try { |
|
const user = await loginMutation(values) |
|
props.onSuccess?.(user) |
|
} catch (error: any) { |
|
if (error instanceof AuthenticationError) { |
|
return { [FORM_ERROR]: "Sorry, those credentials are invalid" } |
|
} else { |
|
return { |
|
[FORM_ERROR]: |
|
"Sorry, we had an unexpected error. Please try again. - " + error.toString(), |
|
} |
|
} |
|
} |
|
}} |
|
> |
|
<LabeledTextField name="email" label="Email" placeholder="Email" /> |
|
<LabeledTextField name="password" label="Password" placeholder="Password" type="password" /> |
|
<div> |
|
<Link href={Routes.ForgotPasswordPage()}> |
|
<a>Forgot your password?</a> |
|
</Link> |
|
</div> |
|
</Form> |
|
|
|
<div style={{ marginTop: "1rem" }}> |
|
Or{" "} |
|
<Link href={Routes.SignupPage()}> |
|
<a>Sign Up</a> |
|
</Link> |
|
</div> |
|
</div> |
|
) |
|
} |
|
|
|
export default LoginForm
|
|
|