import { PermissionAction } from '@supabase/shared-types/out/constants' import { HTMLProps, ReactNode, useCallback, useState } from 'react' import { useParams } from 'common' import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { FDW, useFDWsQuery } from 'data/fdw/fdws-query' import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { useConfirmOnClose, type ConfirmOnCloseModalProps } from 'hooks/ui/useConfirmOnClose' import { Sheet, SheetContent } from 'ui' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { CreateWrapperSheet } from './CreateWrapperSheet' import DeleteWrapperModal from './DeleteWrapperModal' import { WRAPPERS } from './Wrappers.constants' import { wrapperMetaComparator } from './Wrappers.utils' import { WrapperTable } from './WrapperTable' export const WrappersTab = () => { const { id } = useParams() const { data: project } = useSelectedProjectQuery() const [selectedWrapperForDelete, setSelectedWrapperForDelete] = useState(null) const [createWrapperShown, setCreateWrapperShown] = useState(false) const { can: canCreateWrapper } = useAsyncCheckPermissions( PermissionAction.TENANT_SQL_ADMIN_WRITE, 'wrappers' ) const { data } = useFDWsQuery({ projectRef: project?.ref, connectionString: project?.connectionString, }) const wrappers = data ?? [] const wrapperMeta = WRAPPERS.find((w) => w.name === id) // this contains a collection of all wrapper instances for the wrapper type const createdWrappers = wrapperMeta ? wrappers.filter((w) => wrapperMetaComparator(wrapperMeta, w)) : [] const [isDirty, setIsDirty] = useState(false) const { confirmOnClose, modalProps: closeConfirmationModalProps } = useConfirmOnClose({ checkIsDirty: useCallback(() => isDirty, [isDirty]), onClose: useCallback(() => { setCreateWrapperShown(false) setIsDirty(false) }, []), }) const Container = useCallback( ({ ...props }: { children: ReactNode } & HTMLProps) => (
{props.children} {wrapperMeta && ( setCreateWrapperShown(false)} onCloseWithConfirmation={confirmOnClose} /> )}
), [createWrapperShown, wrapperMeta, confirmOnClose] ) if (!wrapperMeta) { return
Missing integration.
} if (createdWrappers.length === 0) { return (

No {wrapperMeta.label} wrappers have been installed

setCreateWrapperShown(true)} disabled={!canCreateWrapper} tooltip={{ content: { text: !canCreateWrapper ? 'You need additional permissions to create a foreign data wrapper' : undefined, }, }} > Add new wrapper
) } return ( {selectedWrapperForDelete && ( setSelectedWrapperForDelete(null)} /> )} ) } const CloseConfirmationModal = ({ visible, onClose, onCancel }: ConfirmOnCloseModalProps) => (

There are unsaved changes. Are you sure you want to close the panel? Your changes will be lost.

)