import { PermissionAction } from '@supabase/shared-types/out/constants' import { partition } from 'lodash' import { ChevronRight, Edit, ExternalLink, Table2, Trash } from 'lucide-react' import Link from 'next/link' import { MutableRefObject, useState } from 'react' import { useParams } from 'common' import { ButtonTooltip } from 'components/ui/ButtonTooltip' import type { FDW } from 'data/fdw/fdws-query' import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { Badge, Sheet, SheetContent, TableCell, TableRow, Tooltip, TooltipContent, TooltipTrigger, } from 'ui' import { INTEGRATIONS } from '../Landing/Integrations.constants' import DeleteWrapperModal from './DeleteWrapperModal' import { EditWrapperSheet } from './EditWrapperSheet' import { convertKVStringArrayToJson, formatWrapperTables } from './Wrappers.utils' interface WrapperRowProps { wrapper: FDW selectedWrapperToEdit?: FDW selectedWrapperToDelete?: FDW setSelectedWrapperToEdit: (value: string | null) => void setSelectedWrapperToDelete: (value: string | null) => void deletingWrapperIdRef: MutableRefObject } export const WrapperRow = ({ wrapper, selectedWrapperToEdit, selectedWrapperToDelete, setSelectedWrapperToEdit, setSelectedWrapperToDelete, deletingWrapperIdRef, }: WrapperRowProps) => { const { ref, id } = useParams() const { can: canManageWrappers } = useAsyncCheckPermissions( PermissionAction.TENANT_SQL_ADMIN_WRITE, 'wrappers' ) const editWrapperShown = selectedWrapperToEdit?.id === wrapper.id const [isClosingEditWrapper, setIsClosingEditWrapper] = useState(false) 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) return ( <> {wrapper.name} {visibleMetadata.map((metadata) => (
{metadata.label}: {serverOptions[metadata.name]}
))}
{_tables?.map((table) => { const target = table.table ?? table.object ?? table.src_key return (
{integration.icon({ className: 'p-0' })}
{target} {target}
{table.schema}.{table.table_name} {table.schema}.{table.table_name}
) })}
{encryptedMetadata.map((metadata) => (
{metadata.label}
))}
} className="px-1.5" onClick={() => setSelectedWrapperToEdit(wrapper.id.toString())} tooltip={{ content: { side: 'bottom', text: !canManageWrappers ? 'You need additional permissions to edit wrappers' : 'Edit wrapper', }, }} /> } className="px-1.5" onClick={() => setSelectedWrapperToDelete(wrapper.id.toString())} tooltip={{ content: { side: 'bottom', text: !canManageWrappers ? 'You need additional permissions to delete wrappers' : 'Delete wrapper', }, }} />
{ if (!open) { setIsClosingEditWrapper(true) } }} > {selectedWrapperToEdit && ( { setSelectedWrapperToEdit(null) setIsClosingEditWrapper(false) }} isClosing={isClosingEditWrapper} setIsClosing={setIsClosingEditWrapper} /> )} {selectedWrapperToDelete && ( setSelectedWrapperToDelete(null)} deletingWrapperIdRef={deletingWrapperIdRef} /> )} ) }