import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' import { HTMLProps, ReactNode, useCallback, useState } from 'react' import { Sheet, SheetContent } from 'ui' import { CreateWrapperSheet } from './CreateWrapperSheet' import { WRAPPERS } from './Wrappers.constants' import { wrapperMetaComparator } from './Wrappers.utils' import { WrapperTable } from './WrapperTable' import { DiscardChangesConfirmationDialog } from '@/components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' import { ButtonTooltip } from '@/components/ui/ButtonTooltip' import { useFDWsQuery } from '@/data/fdw/fdws-query' import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' import { useConfirmOnClose } from '@/hooks/ui/useConfirmOnClose' export const WrappersTab = () => { const { id } = useParams() const { data: project } = useSelectedProjectQuery() 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, handleOpenChange, modalProps } = 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, handleOpenChange, 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 ( ) }