import * as Tooltip from '@radix-ui/react-tooltip' import { useState } from 'react' import { toast } from 'sonner' import { Button, Collapsible, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, Form, Toggle, } from 'ui' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' import { useDatabaseRoleUpdateMutation } from 'data/database-roles/database-role-update-mutation' import { PgRole } from 'data/database-roles/database-roles-query' import { ROLE_PERMISSIONS } from './Roles.constants' import { ChevronUp, MoreVertical, Trash, HelpCircle } from 'lucide-react' interface RoleRowProps { role: PgRole disabled?: boolean onSelectDelete: (role: PgRole) => void } const RoleRow = ({ role, disabled = false, onSelectDelete }: RoleRowProps) => { const { project } = useProjectContext() const [isExpanded, setIsExpanded] = useState(false) const { mutate: updateDatabaseRole, isLoading: isUpdating } = useDatabaseRoleUpdateMutation() const { isSuperuser, canLogin, canCreateRole, canCreateDb, isReplicationRole, canBypassRls } = role const onSaveChanges = async (values: Partial, { resetForm }: any) => { if (!project) return console.error('Project is required') const changed = Object.fromEntries( Object.entries(values).filter(([k, v]) => v !== (role as any)[k]) ) updateDatabaseRole( { projectRef: project.ref, connectionString: project.connectionString, id: role.id, payload: changed, }, { onSuccess: () => { toast.success(`Successfully updated role "${role.name}"`) resetForm({ values: { ...values }, initialValues: { ...values } }) }, } ) } return (
{({ values, initialValues, handleReset }: any) => { const hasChanges = JSON.stringify(values) !== JSON.stringify(initialValues) return ( { event.stopPropagation() onSelectDelete(role) }} >

Delete

)}
{(Object.keys(ROLE_PERMISSIONS) as (keyof typeof ROLE_PERMISSIONS)[]).map( (permission) => (
This privilege cannot be updated via the dashboard
) : ( <> ) } /> ) )}
{!disabled && (
)}
) }}
) } export default RoleRow