Add password confirmation to user creation/edit in Users page

Shows confirm password field when a password is entered. Validates
match before saving.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
fahed
2026-02-23 15:33:14 +03:00
parent b1f7d574ed
commit 4d91e8e8a8

View File

@@ -34,6 +34,8 @@ export default function Users() {
const [form, setForm] = useState(EMPTY_FORM) const [form, setForm] = useState(EMPTY_FORM)
const [showDeleteConfirm, setShowDeleteConfirm] = useState(false) const [showDeleteConfirm, setShowDeleteConfirm] = useState(false)
const [userToDelete, setUserToDelete] = useState(null) const [userToDelete, setUserToDelete] = useState(null)
const [confirmPassword, setConfirmPassword] = useState('')
const [passwordError, setPasswordError] = useState('')
useEffect(() => { loadUsers() }, []) useEffect(() => { loadUsers() }, [])
@@ -49,6 +51,11 @@ export default function Users() {
} }
const handleSave = async () => { const handleSave = async () => {
setPasswordError('')
if (form.password && form.password !== confirmPassword) {
setPasswordError('Passwords do not match')
return
}
try { try {
const data = { const data = {
name: form.name, name: form.name,
@@ -87,12 +94,16 @@ export default function Users() {
role: user.role || 'contributor', role: user.role || 'contributor',
avatar: user.avatar || '', avatar: user.avatar || '',
}) })
setConfirmPassword('')
setPasswordError('')
setShowModal(true) setShowModal(true)
} }
const openNew = () => { const openNew = () => {
setEditingUser(null) setEditingUser(null)
setForm(EMPTY_FORM) setForm(EMPTY_FORM)
setConfirmPassword('')
setPasswordError('')
setShowModal(true) setShowModal(true)
} }
@@ -253,13 +264,29 @@ export default function Users() {
<input <input
type="password" type="password"
value={form.password} value={form.password}
onChange={e => setForm(f => ({ ...f, password: e.target.value }))} onChange={e => { setForm(f => ({ ...f, password: e.target.value })); setPasswordError('') }}
className="w-full px-3 py-2 text-sm border border-border rounded-lg focus:outline-none focus:ring-2 focus:ring-brand-primary/20 focus:border-brand-primary" className="w-full px-3 py-2 text-sm border border-border rounded-lg focus:outline-none focus:ring-2 focus:ring-brand-primary/20 focus:border-brand-primary"
placeholder="••••••••" placeholder="••••••••"
required={!editingUser} required={!editingUser}
/> />
</div> </div>
{form.password && (
<div>
<label className="block text-sm font-medium text-text-primary mb-1">Confirm Password</label>
<input
type="password"
value={confirmPassword}
onChange={e => { setConfirmPassword(e.target.value); setPasswordError('') }}
className="w-full px-3 py-2 text-sm border border-border rounded-lg focus:outline-none focus:ring-2 focus:ring-brand-primary/20 focus:border-brand-primary"
placeholder="••••••••"
/>
{passwordError && (
<p className="text-xs text-red-500 mt-1">{passwordError}</p>
)}
</div>
)}
<div> <div>
<label className="block text-sm font-medium text-text-primary mb-1">Role *</label> <label className="block text-sm font-medium text-text-primary mb-1">Role *</label>
<div className="grid grid-cols-3 gap-2"> <div className="grid grid-cols-3 gap-2">