| import { useState } from 'react' |
| import { X, LogIn, Eye, EyeOff } from 'lucide-react' |
| import { useAuth } from '../context/AuthContext' |
|
|
| export default function LoginModal({ onClose, onSuccess }) { |
| const { login, loginError, loginLoading } = useAuth() |
| const [email, setEmail] = useState('') |
| const [password, setPassword] = useState('') |
| const [showPw, setShowPw] = useState(false) |
|
|
| async function handleSubmit(e) { |
| e.preventDefault() |
| const ok = await login(email, password) |
| if (ok) { |
| onClose() |
| onSuccess?.() |
| } |
| } |
|
|
| return ( |
| <div className="fixed inset-0 bg-black/40 z-50 flex items-center justify-center p-4"> |
| <div className="bg-white rounded-xl shadow-xl w-full max-w-sm p-6"> |
| <div className="flex items-center justify-between mb-5"> |
| <h2 className="text-base font-semibold text-gray-900 flex items-center gap-2"> |
| <LogIn className="w-5 h-5 text-primary-600" /> Sign In |
| </h2> |
| <button onClick={onClose} className="p-1 rounded hover:bg-gray-100 text-gray-400"> |
| <X className="w-5 h-5" /> |
| </button> |
| </div> |
| |
| <form onSubmit={handleSubmit} className="space-y-4"> |
| <div> |
| <label className="block text-xs font-medium text-gray-700 mb-1">Email</label> |
| <input |
| type="email" |
| autoComplete="email" |
| className="input-field text-sm" |
| value={email} |
| onChange={e => setEmail(e.target.value)} |
| required |
| /> |
| </div> |
| <div> |
| <label className="block text-xs font-medium text-gray-700 mb-1">Password</label> |
| <div className="relative"> |
| <input |
| type={showPw ? 'text' : 'password'} |
| autoComplete="current-password" |
| className="input-field text-sm pr-10" |
| value={password} |
| onChange={e => setPassword(e.target.value)} |
| required |
| /> |
| <button |
| type="button" |
| onClick={() => setShowPw(s => !s)} |
| className="absolute right-2.5 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600" |
| > |
| {showPw ? <EyeOff className="w-4 h-4" /> : <Eye className="w-4 h-4" />} |
| </button> |
| </div> |
| </div> |
| |
| {loginError && ( |
| <p className="text-xs text-red-600 bg-red-50 border border-red-200 rounded-lg px-3 py-2"> |
| {loginError} |
| </p> |
| )} |
| |
| <button |
| type="submit" |
| disabled={loginLoading} |
| className="btn-primary w-full text-sm" |
| > |
| {loginLoading ? 'Signing in…' : 'Sign In'} |
| </button> |
| </form> |
| </div> |
| </div> |
| ) |
| } |
|
|