import type { PostgresPolicy } from '@supabase/postgres-meta' import { PermissionAction } from '@supabase/shared-types/out/constants' import { noop } from 'lodash' import { Edit, MoreVertical, Trash } from 'lucide-react' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' import { DropdownMenuItemTooltip } from 'components/ui/DropdownMenuItemTooltip' import Panel from 'components/ui/Panel' import { useAuthConfigQuery } from 'data/auth/auth-config-query' import { useCheckPermissions } from 'hooks/misc/useCheckPermissions' import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' import { Badge, Button, cn, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, Tooltip, TooltipContent, TooltipTrigger, } from 'ui' import { generatePolicyUpdateSQL } from './PolicyTableRow.utils' interface PolicyRowProps { policy: PostgresPolicy onSelectEditPolicy: (policy: PostgresPolicy) => void onSelectDeletePolicy: (policy: PostgresPolicy) => void isLocked: boolean } const PolicyRow = ({ policy, isLocked: isLockedDefault, onSelectEditPolicy = noop, onSelectDeletePolicy = noop, }: PolicyRowProps) => { const aiSnap = useAiAssistantStateSnapshot() const canUpdatePolicies = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'policies') const { project } = useProjectContext() const { data: authConfig } = useAuthConfigQuery({ projectRef: project?.ref }) // override islocked for Realtime messages table const isLocked = policy.schema === 'realtime' && policy.table === 'messages' ? false : isLockedDefault // TODO(km): Simple check for roles that allow authenticated access. // In the future, we'll use splinter to return proper warnings for policies that allow anonymous user access. const appliesToAnonymousUsers = authConfig?.EXTERNAL_ANONYMOUS_USERS_ENABLED && (policy.roles.includes('authenticated') || policy.roles.includes('public')) return (

{policy.command}

Applied to:{' '} {policy.roles.slice(0, 3).map((role, i) => ( {role} {policy.roles.length > 1 ? '' : ' '} ))} {policy.roles.length > 1 ? 'roles' : 'role'}
{policy.roles.length > 3 && ( + {policy.roles.length - 3} more roles {policy.roles.slice(3).join(', ')} )}
{appliesToAnonymousUsers ? ( Applies to anonymous users ) : null}
{!isLocked && (
) } export default PolicyRow