import { useState } from "react"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { useCreateRole, useRoles } from "@/hooks/use-management"; import { toast } from "sonner"; import { Loader2 } from "lucide-react"; interface Props { open: boolean; onOpenChange: (open: boolean) => void; connectionId: string; } export function CreateRoleDialog({ open, onOpenChange, connectionId }: Props) { const [name, setName] = useState(""); const [password, setPassword] = useState(""); const [login, setLogin] = useState(true); const [superuser, setSuperuser] = useState(false); const [createdb, setCreatedb] = useState(false); const [createrole, setCreaterole] = useState(false); const [inherit, setInherit] = useState(true); const [replication, setReplication] = useState(false); const [connectionLimit, setConnectionLimit] = useState(-1); const [validUntil, setValidUntil] = useState(""); const [inRoles, setInRoles] = useState([]); const { data: roles } = useRoles(open ? connectionId : null); const createMutation = useCreateRole(); const [prevOpen, setPrevOpen] = useState(false); if (open !== prevOpen) { setPrevOpen(open); if (open) { setName(""); setPassword(""); setLogin(true); setSuperuser(false); setCreatedb(false); setCreaterole(false); setInherit(true); setReplication(false); setConnectionLimit(-1); setValidUntil(""); setInRoles([]); } } const handleCreate = () => { if (!name.trim()) { toast.error("Role name is required"); return; } createMutation.mutate( { connectionId, params: { name: name.trim(), password: password || undefined, login, superuser, createdb, createrole, inherit, replication, connection_limit: connectionLimit, valid_until: validUntil || undefined, in_roles: inRoles, }, }, { onSuccess: () => { toast.success(`Role "${name}" created`); onOpenChange(false); }, onError: (err) => { toast.error("Failed to create role", { description: String(err) }); }, } ); }; const toggleInRole = (roleName: string) => { setInRoles((prev) => prev.includes(roleName) ? prev.filter((r) => r !== roleName) : [...prev, roleName] ); }; return ( Create Role
setName(e.target.value)} placeholder="my_role" />
setPassword(e.target.value)} placeholder="Optional" />
{([ ["LOGIN", login, setLogin], ["SUPERUSER", superuser, setSuperuser], ["CREATEDB", createdb, setCreatedb], ["CREATEROLE", createrole, setCreaterole], ["INHERIT", inherit, setInherit], ["REPLICATION", replication, setReplication], ] as const).map(([label, value, setter]) => ( ))}
setConnectionLimit(parseInt(e.target.value) || -1)} />
setValidUntil(e.target.value)} />
{roles && roles.length > 0 && (
{roles.map((r) => ( ))}
)}
); }