| | |
| | 'use client'; |
| |
|
| | import { useRouter } from 'next/navigation'; |
| | import { useState } from 'react'; |
| |
|
| | export function LoginForm() { |
| | const [username, setUsername] = useState(''); |
| | const [password, setPassword] = useState(''); |
| | const [error, setError] = useState(''); |
| | const [isLoading, setIsLoading] = useState(false); |
| |
|
| | const router = useRouter() |
| |
|
| | const handleSubmit = async (e: React.FormEvent) => { |
| | e.preventDefault(); |
| | setError(''); |
| | setIsLoading(true); |
| |
|
| | console.log('π΅ [Form] Submitting login...'); |
| |
|
| | try { |
| | const response = await fetch('/api/auth/login', { |
| | method: 'POST', |
| | headers: { |
| | 'Content-Type': 'application/json', |
| | }, |
| | body: JSON.stringify({ username, password }), |
| | }); |
| |
|
| | console.log('π΅ [Form] Response status:', response.status); |
| |
|
| | const data = await response.json(); |
| |
|
| | if (!response.ok) { |
| | console.log('π΅ [Form] Login failed:', data.message); |
| | setError(data.message || 'Login failed'); |
| | setIsLoading(false); |
| | return; |
| | } |
| |
|
| | console.log('π΅ [Form] Login successful!'); |
| | console.log('π΅ [Form] User data:', data); |
| |
|
| | |
| | console.log('π΅ [Form] Redirecting to /recruitment...'); |
| | |
| | router.push("/recruitment") |
| | |
| | } catch (err) { |
| | console.error('π΅ [Form] Error:', err); |
| | setError('Something went wrong. Please try again.'); |
| | setIsLoading(false); |
| | } |
| | }; |
| |
|
| | return ( |
| | <form onSubmit={handleSubmit} className="space-y-6"> |
| | {error && ( |
| | <div className="bg-red-50 border border-red-200 text-red-700 px-4 py-3 rounded-md text-sm"> |
| | {error} |
| | </div> |
| | )} |
| | |
| | <div> |
| | <label htmlFor="username" className="block text-sm font-medium text-gray-700"> |
| | Username |
| | </label> |
| | <input |
| | id="username" |
| | type="text" |
| | value={username} |
| | onChange={(e) => setUsername(e.target.value)} |
| | required |
| | disabled={isLoading} |
| | className="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500" |
| | /> |
| | </div> |
| | |
| | <div> |
| | <label htmlFor="password" className="block text-sm font-medium text-gray-700"> |
| | Password |
| | </label> |
| | <input |
| | id="password" |
| | type="password" |
| | value={password} |
| | onChange={(e) => setPassword(e.target.value)} |
| | required |
| | disabled={isLoading} |
| | className="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500" |
| | /> |
| | </div> |
| | |
| | <button |
| | type="submit" |
| | disabled={isLoading} |
| | className="w-full flex justify-center py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed" |
| | > |
| | {isLoading ? 'Signing in...' : 'Sign in'} |
| | </button> |
| | </form> |
| | ); |
| | } |
| |
|