omnidiag / frontend /src /components /LoginModal.jsx
yahyoha's picture
feat(login): add onSuccess callback to LoginModal
68117b6
Raw
History Blame Contribute Delete
2.85 kB
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>
)
}