import type { PostgresPolicy } from '@supabase/postgres-meta' import { PermissionAction } from '@supabase/shared-types/out/constants' import { noop } from 'lodash' 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 { Edit, MoreVertical, Trash } from 'lucide-react' import { Badge, Button, cn, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, Tooltip_Shadcn_, TooltipContent_Shadcn_, TooltipTrigger_Shadcn_, } from 'ui' import { useIsDatabaseFunctionsAssistantEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' import { useAppStateSnapshot } from 'state/app-state' interface PolicyRowProps { policy: PostgresPolicy onSelectEditPolicy: (policy: PostgresPolicy) => void onSelectDeletePolicy: (policy: PostgresPolicy) => void } const PolicyRow = ({ policy, onSelectEditPolicy = noop, onSelectDeletePolicy = noop, }: PolicyRowProps) => { const { setAiAssistantPanel } = useAppStateSnapshot() const enableAssistantV2 = useIsDatabaseFunctionsAssistantEnabled() const canUpdatePolicies = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'policies') const { project } = useProjectContext() const { data: authConfig } = useAuthConfigQuery({ projectRef: project?.ref }) // 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}

{policy.name}

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