import { useState } from "react"; import { Plus, Loader2 } from "lucide-react"; import { useTranslation } from "react-i18next"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { api, humanizeError } from "@/lib/api"; interface Props { onCreated: (id: string) => void; } export function CreateUserDialog({ onCreated }: Props) { const { t } = useTranslation("admin"); const [open, setOpen] = useState(false); const [username, setUsername] = useState(""); const [email, setEmail] = useState(""); const [role, setRole] = useState<"user" | "admin">("user"); const [password, setPassword] = useState(""); const [mustChange, setMustChange] = useState(true); const [submitting, setSubmitting] = useState(false); const [err, setErr] = useState(null); function reset() { setUsername(""); setEmail(""); setRole("user"); setPassword(""); setMustChange(true); setErr(null); } async function handleSubmit(e: React.FormEvent) { e.preventDefault(); if (submitting) return; setErr(null); if (!username.trim()) { setErr(t("users_create_validation_username")); return; } if (password.length < 8) { setErr(t("users_create_validation_password")); return; } setSubmitting(true); try { const u = await api.createUser({ username: username.trim(), email: email.trim() || undefined, role, password, must_change_password: mustChange, }); setOpen(false); reset(); onCreated(u.id); } catch (e) { setErr(humanizeError(e)); } finally { setSubmitting(false); } } return ( { setOpen(v); if (!v) reset(); }}> {t("users_create_title")} {t("users_create_desc")}
{/* Username */}
setUsername(e.target.value)} placeholder={t("users_create_username_placeholder")} className="h-9 text-sm" autoFocus />
{/* Email */}
setEmail(e.target.value)} placeholder="user@example.com" className="h-9 text-sm" />
{/* Role */}
{/* Password */}
setPassword(e.target.value)} placeholder="min. 8 characters" className="h-9 text-sm" />
{/* Must change password toggle */} {err && (

{err}

)}
); }