1- import type {
2- ActionFunction ,
3- LoaderFunction ,
4- MetaFunction ,
5- } from "@remix-run/node" ;
1+ import type { ActionArgs , LoaderArgs , MetaFunction } from "@remix-run/node" ;
62import { json , redirect } from "@remix-run/node" ;
73import { Form , Link , useActionData , useSearchParams } from "@remix-run/react" ;
84import * as React from "react" ;
@@ -11,52 +7,45 @@ import { createUserSession, getUserId } from "~/session.server";
117import { verifyLogin } from "~/models/user.server" ;
128import { safeRedirect , validateEmail } from "~/utils" ;
139
14- export const loader : LoaderFunction = async ( { request } ) => {
10+ export const loader = async ( { request } : LoaderArgs ) => {
1511 const userId = await getUserId ( request ) ;
1612 if ( userId ) return redirect ( "/" ) ;
1713 return json ( { } ) ;
1814} ;
1915
20- interface ActionData {
21- errors ?: {
22- email ?: string ;
23- password ?: string ;
24- } ;
25- }
26-
27- export const action : ActionFunction = async ( { request } ) => {
16+ export const action = async ( { request } : ActionArgs ) => {
2817 const formData = await request . formData ( ) ;
2918 const email = formData . get ( "email" ) ;
3019 const password = formData . get ( "password" ) ;
3120 const redirectTo = safeRedirect ( formData . get ( "redirectTo" ) , "/notes" ) ;
3221 const remember = formData . get ( "remember" ) ;
3322
3423 if ( ! validateEmail ( email ) ) {
35- return json < ActionData > (
36- { errors : { email : "Email is invalid" } } ,
24+ return json (
25+ { errors : { email : "Email is invalid" , password : null } } ,
3726 { status : 400 }
3827 ) ;
3928 }
4029
4130 if ( typeof password !== "string" ) {
42- return json < ActionData > (
43- { errors : { password : "Password is required" } } ,
31+ return json (
32+ { errors : { email : null , password : "Password is required" } } ,
4433 { status : 400 }
4534 ) ;
4635 }
4736
4837 if ( password . length < 8 ) {
49- return json < ActionData > (
50- { errors : { password : "Password is too short" } } ,
38+ return json (
39+ { errors : { email : null , password : "Password is too short" } } ,
5140 { status : 400 }
5241 ) ;
5342 }
5443
5544 const user = await verifyLogin ( email , password ) ;
5645
5746 if ( ! user ) {
58- return json < ActionData > (
59- { errors : { email : "Invalid email or password" } } ,
47+ return json (
48+ { errors : { email : "Invalid email or password" , password : null } } ,
6049 { status : 400 }
6150 ) ;
6251 }
@@ -69,16 +58,14 @@ export const action: ActionFunction = async ({ request }) => {
6958 } ) ;
7059} ;
7160
72- export const meta : MetaFunction = ( ) => {
73- return {
74- title : "Login" ,
75- } ;
76- } ;
61+ export const meta : MetaFunction = ( ) => ( {
62+ title : "Login" ,
63+ } ) ;
7764
7865export default function LoginPage ( ) {
7966 const [ searchParams ] = useSearchParams ( ) ;
8067 const redirectTo = searchParams . get ( "redirectTo" ) || "/notes" ;
81- const actionData = useActionData ( ) as ActionData ;
68+ const actionData = useActionData < typeof action > ( ) ;
8269 const emailRef = React . useRef < HTMLInputElement > ( null ) ;
8370 const passwordRef = React . useRef < HTMLInputElement > ( null ) ;
8471
0 commit comments