'use client'; import { useEffect, useState } from 'react'; import { useTranslations } from 'next-intl'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Switch } from '@/components/ui/switch'; import { useAdminUsers } from '@/contexts/admin-users-context'; import { useAuth } from '@/components/providers/auth-provider'; import type { AdminUser } from '@/lib/services/admin'; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from '@/components/ui/alert-dialog'; import { Loader2 } from 'lucide-react'; interface EditUserForm { nickname: string; email: string; is_admin: boolean; password?: string; } export function EditUserModal({ isOpen, onClose, user, }: { isOpen: boolean; onClose: () => void; user: AdminUser | null; }) { const t = useTranslations('admin.users'); const { updateUser, deleteUser, getUserDetail } = useAdminUsers(); const { user: currentUser } = useAuth(); const isSelf = currentUser && user && currentUser.id.toString() === user.id.toString(); const [form, setForm] = useState({ nickname: '', email: '', is_admin: false, password: '', }); const [saving, setSaving] = useState(false); const [errors, setErrors] = useState>({}); const [showDeleteConfirm, setShowDeleteConfirm] = useState(false); useEffect(() => { let active = true; if (isOpen && user) { setForm({ nickname: user.nickname || '', email: user.email || '', is_admin: user.is_admin || false, password: '', }); setErrors({}); getUserDetail(user.id) .then((detail) => { if (active && detail) { setForm({ nickname: detail.nickname || '', email: detail.email || '', is_admin: detail.is_admin || false, password: '', }); } }) .catch(() => { // ignore fetching error }); } else { setSaving(false); } return () => { active = false; }; }, [isOpen, user, getUserDetail]); const validate = () => { const newErrors: Record = {}; if (!form.email.trim()) { newErrors.email = t('validation.emailRequired'); } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(form.email.trim())) { newErrors.email = t('validation.emailInvalid'); } if (form.password && form.password.length < 8) { newErrors.password = t('validation.passwordTooShort'); } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleSave = async (e: React.FormEvent) => { e.preventDefault(); if (!user || !validate()) return; setSaving(true); try { await updateUser(user.id, { nickname: form.nickname.trim() || undefined, email: form.email.trim(), is_admin: form.is_admin, password: form.password?.trim() || undefined, }); onClose(); } catch { // Errors are handled by context toast notifications } finally { setSaving(false); } }; const handleDelete = async () => { if (!user) return; setSaving(true); try { await deleteUser(user); onClose(); } catch { // Errors are handled by context toast notifications } finally { setSaving(false); setShowDeleteConfirm(false); } }; if (!user) return null; return ( <> !open && onClose()}> {t('editTitle')} {t('editDesc')}
setForm((prev) => ({ ...prev, nickname: e.target.value })) } placeholder={t('nicknamePlaceholder')} />
setForm((prev) => ({ ...prev, email: e.target.value })) } placeholder={t('emailPlaceholder')} /> {errors.email && (

{errors.email}

)}
setForm((prev) => ({ ...prev, password: e.target.value })) } placeholder={t('resetPasswordPlaceholder')} /> {errors.password && (

{errors.password}

)}
{t('adminPermission')}
{isSelf ? t('cannotRevokeSelfAdmin') : t('adminPermissionDesc')}
{ setForm((prev) => ({ ...prev, is_admin: checked })); setSaving(true); try { await updateUser(user.id, { nickname: form.nickname.trim() || undefined, email: form.email.trim(), is_admin: checked, }); } catch { setForm((prev) => ({ ...prev, is_admin: !checked })); } finally { setSaving(false); } }} />
{!user.is_admin && ( )}
{t('deleteConfirmTitle')} {t('deleteConfirmDesc', { name: user.nickname || user.username, })} {t('cancel')} { e.preventDefault(); handleDelete(); }} disabled={saving} > {saving && } {t('confirmDelete')} ); }