1
- import type {
2
- ActionFunction ,
3
- LoaderFunction ,
4
- MetaFunction ,
5
- } from "@remix-run/node" ;
1
+ import type { ActionArgs , LoaderArgs , MetaFunction } from "@remix-run/node" ;
6
2
import { json , redirect } from "@remix-run/node" ;
7
3
import { Form , Link , useActionData , useSearchParams } from "@remix-run/react" ;
8
4
import * as React from "react" ;
@@ -11,52 +7,45 @@ import { createUserSession, getUserId } from "~/session.server";
11
7
import { verifyLogin } from "~/models/user.server" ;
12
8
import { safeRedirect , validateEmail } from "~/utils" ;
13
9
14
- export const loader : LoaderFunction = async ( { request } ) => {
10
+ export const loader = async ( { request } : LoaderArgs ) => {
15
11
const userId = await getUserId ( request ) ;
16
12
if ( userId ) return redirect ( "/" ) ;
17
13
return json ( { } ) ;
18
14
} ;
19
15
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 ) => {
28
17
const formData = await request . formData ( ) ;
29
18
const email = formData . get ( "email" ) ;
30
19
const password = formData . get ( "password" ) ;
31
20
const redirectTo = safeRedirect ( formData . get ( "redirectTo" ) , "/notes" ) ;
32
21
const remember = formData . get ( "remember" ) ;
33
22
34
23
if ( ! validateEmail ( email ) ) {
35
- return json < ActionData > (
36
- { errors : { email : "Email is invalid" } } ,
24
+ return json (
25
+ { errors : { email : "Email is invalid" , password : null } } ,
37
26
{ status : 400 }
38
27
) ;
39
28
}
40
29
41
30
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" } } ,
44
33
{ status : 400 }
45
34
) ;
46
35
}
47
36
48
37
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" } } ,
51
40
{ status : 400 }
52
41
) ;
53
42
}
54
43
55
44
const user = await verifyLogin ( email , password ) ;
56
45
57
46
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 } } ,
60
49
{ status : 400 }
61
50
) ;
62
51
}
@@ -69,16 +58,14 @@ export const action: ActionFunction = async ({ request }) => {
69
58
} ) ;
70
59
} ;
71
60
72
- export const meta : MetaFunction = ( ) => {
73
- return {
74
- title : "Login" ,
75
- } ;
76
- } ;
61
+ export const meta : MetaFunction = ( ) => ( {
62
+ title : "Login" ,
63
+ } ) ;
77
64
78
65
export default function LoginPage ( ) {
79
66
const [ searchParams ] = useSearchParams ( ) ;
80
67
const redirectTo = searchParams . get ( "redirectTo" ) || "/notes" ;
81
- const actionData = useActionData ( ) as ActionData ;
68
+ const actionData = useActionData < typeof action > ( ) ;
82
69
const emailRef = React . useRef < HTMLInputElement > ( null ) ;
83
70
const passwordRef = React . useRef < HTMLInputElement > ( null ) ;
84
71
0 commit comments