import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' import { partition } from 'lodash' import { ChevronRight, Edit, ExternalLink, Table2, Trash } from 'lucide-react' import Link from 'next/link' import { parseAsString, useQueryState } from 'nuqs' import { Badge, TableCell, TableRow, Tooltip, TooltipContent, TooltipTrigger } from 'ui' import { INTEGRATIONS } from '../Landing/Integrations.constants' import { convertKVStringArrayToJson, formatWrapperTables } from './Wrappers.utils' import { ButtonTooltip } from '@/components/ui/ButtonTooltip' import type { FDW } from '@/data/fdw/fdws-query' import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' interface WrapperRowProps { wrapper: FDW isShared: boolean } export const WrapperRow = ({ wrapper, isShared }: WrapperRowProps) => { const { ref, id } = useParams() const { can: canManageWrappers } = useAsyncCheckPermissions( PermissionAction.TENANT_SQL_ADMIN_WRITE, 'wrappers' ) const [, setSelectedWrapperToEdit] = useQueryState('edit', parseAsString) const [, setSelectedWrapperToDelete] = useQueryState('delete', parseAsString) const integration = INTEGRATIONS.find((i) => i.id === id) if (!integration || integration.type !== 'wrapper') { return
A wrapper with this ID does not exist
} const serverOptions = convertKVStringArrayToJson(wrapper.server_options ?? []) const [encryptedMetadata, visibleMetadata] = partition( integration?.meta?.server.options.filter((option) => !option.hidden), 'secureEntry' ) const _tables = formatWrapperTables(wrapper, integration?.meta) const canEdit = canManageWrappers && !isShared let editTooltip = 'Edit wrapper' if (!canManageWrappers) editTooltip = 'You need additional permissions to edit wrappers' else if (isShared) editTooltip = 'Shared wrappers cannot be edited in the dashboard' return (
Connection: {wrapper.server_name}
This wrapper is shared. To edit this connection, use ALTER SERVER on{' '}
{wrapper.server_name} or{' '}
ALTER FOREIGN TABLE in the{' '}
SQL Editor
.
{encryptedMetadata.length > 0 && (
<>
{' '}
Edit this server's credentials in{' '}
Vault
. Changes to a secret used by other connections affect them too.
>
)}