| |
| '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> |
| ); |
| } |
|
|