@@ -3,11 +3,9 @@ import {Link, useNavigate} from "react-router";
33import { useMutation } from "@tanstack/react-query" ;
44import React , { useState } from "react" ;
55import type { User } from "../types/User" ;
6- import Header from "../components/Header" ;
7- import { useConfig } from '../ConfigContext' ;
6+ import { useConfig } from '../ConfigContext' ;
87
9- async function loginRequest ( credentials : { emailAddress : string ; password : string } ) {
10- const { backendUrl } = useConfig ( ) ;
8+ async function loginRequest ( credentials : { emailAddress : string ; password : string } , backendUrl : string ) {
119 try {
1210 const response = await fetch ( `${ backendUrl } /login` , {
1311 method : "POST" ,
@@ -41,13 +39,14 @@ async function loginRequest(credentials: { emailAddress: string; password: strin
4139 }
4240}
4341
44- export default function Login ( { user , setUser} : { user : User | null , setUser : ( user : User | null ) => void } ) {
42+ export default function Login ( { setUser} : { user : User | null , setUser : ( user : User | null ) => void } ) {
4543 const [ emailAddress , setEmailAddress ] = useState ( "" ) ;
4644 const [ password , setPassword ] = useState ( "" ) ;
45+ const { backendUrl} = useConfig ( ) ;
4746 const navigate = useNavigate ( ) ;
4847
4948 const { mutate, isPending, error} = useMutation ( {
50- mutationFn : loginRequest ,
49+ mutationFn : ( creds : { emailAddress : string ; password : string } ) => loginRequest ( creds , backendUrl ) ,
5150 onSuccess : ( userData ) => {
5251 localStorage . setItem ( "user" , JSON . stringify ( userData ) ) ;
5352 setUser ( userData ) ;
@@ -61,71 +60,68 @@ export default function Login({user, setUser}: { user: User | null, setUser: (us
6160 } ;
6261
6362 return (
64- < div className = "min-h-screen bg-gray-50" >
65- < Header user = { user } setUser = { setUser } />
66- < div className = "flex justify-center items-center mt-16" >
67- < div className = "bg-white shadow-lg rounded-xl p-8 w-full max-w-md" >
68- < h2 className = "text-2xl font-bold text-center text-blue-600 mb-6" >
69- Log In
70- </ h2 >
71- < form className = "space-y-5" onSubmit = { handleSubmit } >
72- < div >
73- < label
74- className = "block text-gray-700 font-medium mb-2"
75- htmlFor = "email"
76- >
77- Email
78- </ label >
79- < input
80- id = "email"
81- type = "email"
82- className = "w-full px-4 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
83- placeholder = "Enter your email"
84- required
85- value = { emailAddress }
86- onChange = { ( e ) => setEmailAddress ( e . target . value ) }
87- />
88- </ div >
89- < div >
90- < label
91- className = "block text-gray-700 font-medium mb-2"
92- htmlFor = "password"
93- >
94- Password
95- </ label >
96- < input
97- id = "password"
98- type = "password"
99- className = "w-full px-4 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
100- placeholder = "Enter your password"
101- required
102- value = { password }
103- onChange = { ( e ) => setPassword ( e . target . value ) }
104- />
105- </ div >
106- { error && (
107- < div className = "text-red-600 text-center" >
108- { ( error as Error ) . message }
109- </ div >
110- ) }
111- < button
112- type = "submit"
113- disabled = { isPending }
114- className = "w-full bg-blue-600 text-white py-2 rounded-lg font-semibold
115- hover:bg-blue-700 transition disabled:opacity-50 disabled:cursor-not-allowed"
63+ < div className = "flex justify-center items-center mt-16" >
64+ < div className = "bg-white shadow-lg rounded-xl p-8 w-full max-w-md" >
65+ < h2 className = "text-2xl font-bold text-center text-blue-600 mb-6" >
66+ Log In
67+ </ h2 >
68+ < form className = "space-y-5" onSubmit = { handleSubmit } >
69+ < div >
70+ < label
71+ className = "block text-gray-700 font-medium mb-2"
72+ htmlFor = "email"
11673 >
117- { isPending ? "Logging in..." : "Log In" }
118- </ button >
119- </ form >
120- < div className = "text-center mt-6" >
121- < span className = "text-gray-600" > Don't have an account?</ span >
122- < Link
123- to = "/register"
124- className = "text-blue-600 font-medium ml-2 hover:underline"
74+ Email
75+ </ label >
76+ < input
77+ id = "email"
78+ type = "email"
79+ className = "w-full px-4 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
80+ placeholder = "Enter your email"
81+ required
82+ value = { emailAddress }
83+ onChange = { ( e ) => setEmailAddress ( e . target . value ) }
84+ />
85+ </ div >
86+ < div >
87+ < label
88+ className = "block text-gray-700 font-medium mb-2"
89+ htmlFor = "password"
12590 >
126- Register
127- </ Link >
91+ Password
92+ </ label >
93+ < input
94+ id = "password"
95+ type = "password"
96+ className = "w-full px-4 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
97+ placeholder = "Enter your password"
98+ required
99+ value = { password }
100+ onChange = { ( e ) => setPassword ( e . target . value ) }
101+ />
128102 </ div >
103+ { error && (
104+ < div className = "text-red-600 text-center" >
105+ { ( error as Error ) . message }
106+ </ div >
107+ ) }
108+ < button
109+ type = "submit"
110+ disabled = { isPending }
111+ className = "w-full bg-blue-600 text-white py-2 rounded-lg font-semibold
112+ hover:bg-blue-700 transition disabled:opacity-50 disabled:cursor-not-allowed"
113+ >
114+ { isPending ? "Logging in..." : "Log In" }
115+ </ button >
116+ </ form >
117+ < div className = "text-center mt-6" >
118+ < span className = "text-gray-600" > Don't have an account?</ span >
119+ < Link
120+ to = "/register"
121+ className = "text-blue-600 font-medium ml-2 hover:underline"
122+ >
123+ Register
124+ </ Link >
129125 </ div >
130126 </ div >
131127 </ div >
0 commit comments