'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 type { CreateUserRequest } from '@/lib/services/admin'; const emptyForm: CreateUserRequest = { username: '', password: '', nickname: '', email: '', is_active: true, is_admin: false, }; export function CreateUserModal({ isOpen, onClose, }: { isOpen: boolean; onClose: () => void; }) { const t = useTranslations('admin.users'); const { createUser } = useAdminUsers(); const [form, setForm] = useState(emptyForm); const [saving, setSaving] = useState(false); const [errors, setErrors] = useState>({}); useEffect(() => { if (isOpen) { setForm(emptyForm); setErrors({}); } else { setSaving(false); } }, [isOpen]); const validate = () => { const newErrors: Record = {}; if (!form.username.trim()) { newErrors.username = t('validation.usernameRequired'); } else if (form.username.trim().length < 3) { newErrors.username = t('validation.usernameTooShort'); } 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) { newErrors.password = t('validation.passwordRequired'); } else if (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 (!validate()) return; setSaving(true); try { await createUser({ ...form, username: form.username.trim(), nickname: form.nickname?.trim() || undefined, email: form.email.trim(), }); onClose(); } catch { // Errors are already handled by context toast notifications } finally { setSaving(false); } }; return ( !open && onClose()}> {t('createTitle')} {t('createDesc')}
setForm((prev) => ({ ...prev, username: e.target.value })) } placeholder={t('usernamePlaceholder')} /> {errors.username && (

{errors.username}

)}
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('passwordPlaceholder')} /> {errors.password && (

{errors.password}

)}
{t('enableAccountLabel')}
{t('enableAccountDesc')}
setForm((prev) => ({ ...prev, is_active: checked })) } />
{t('adminPermission')}
{t('adminPermissionDesc')}
setForm((prev) => ({ ...prev, is_admin: checked })) } />
); }