import { useParams } from 'common' import { parseAsString, useQueryState } from 'nuqs' import { useEffect, useMemo, useRef, useState } from 'react' import { toast } from 'sonner' import { Card, cn, Sheet, SheetContent, Table, TableBody, TableCell, TableFooter, TableHead, TableHeader, TableRow, } from 'ui' import { INTEGRATIONS } from '../Landing/Integrations.constants' import { DeleteWrapperModal } from './DeleteWrapperModal' import { EditWrapperSheet } from './EditWrapperSheet' import { WrapperRow } from './WrapperRow' import { wrapperMetaComparator } from './Wrappers.utils' import { useFDWsQuery } from '@/data/fdw/fdws-query' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface WrapperTableProps { isLatest?: boolean } export const WrapperTable = ({ isLatest = false }: WrapperTableProps) => { const { id, ref } = useParams() const { data: project } = useSelectedProjectQuery() const integration = INTEGRATIONS.find((i) => i.id === id) const [isClosingEditWrapper, setIsClosingEditWrapper] = useState(false) const { data, isError, isSuccess } = useFDWsQuery({ projectRef: ref, connectionString: project?.connectionString, }) const wrappers = useMemo( () => integration && integration.type === 'wrapper' && data ? data.filter((wrapper) => wrapperMetaComparator(integration.meta, wrapper)) : [], [data, integration] ) const [selectedWrapperIdToEdit, setSelectedWrapperToEdit] = useQueryState('edit', parseAsString) const isSharedWrapper = (wrapper: (typeof wrappers)[number]) => data?.some((other) => other.id !== wrapper.id && other.name === wrapper.name) ?? false const selectedWrapper = wrappers.find((w) => w.id.toString() === selectedWrapperIdToEdit) const isSelectedWrapperShared = selectedWrapper !== undefined && isSharedWrapper(selectedWrapper) const selectedWrapperToEdit = isSelectedWrapperShared ? undefined : selectedWrapper const openedWrapperId = useRef(null) useEffect(() => { if (!selectedWrapperIdToEdit) { openedWrapperId.current = null } else if (selectedWrapperToEdit) { openedWrapperId.current = selectedWrapperIdToEdit } else if (isSuccess || isError) { if (openedWrapperId.current !== selectedWrapperIdToEdit) { toast( isSelectedWrapperShared ? 'Shared wrappers cannot be edited in the dashboard. Use the SQL Editor to edit this connection.' : 'Wrapper not found' ) } setSelectedWrapperToEdit(null) } }, [ isError, isSelectedWrapperShared, isSuccess, selectedWrapperIdToEdit, selectedWrapperToEdit, setSelectedWrapperToEdit, ]) if (!integration || integration.type !== 'wrapper') { return (

The referenced ID doesn't correspond to a wrapper integration

) } return ( <> Name Tables Encrypted key Actions {(isLatest ? wrappers.slice(0, 3) : wrappers).map((x) => ( ))} tr>td]:hover:bg-inherit', // Conditionally remove the border-top if there are no wrappers wrappers.length === 0 ? 'border-t-0' : '' )} > {wrappers.length} {integration?.name} {wrappers.length === 0 || wrappers.length > 1 ? 's' : ''} created
{ if (!open) setIsClosingEditWrapper(true) }} > {selectedWrapperToEdit && ( { setSelectedWrapperToEdit(null) setIsClosingEditWrapper(false) }} isClosing={isClosingEditWrapper} setIsClosing={setIsClosingEditWrapper} /> )} ) }