import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' import { isNull, partition } from 'lodash' import Link from 'next/link' import { useEffect, useState } from 'react' import { Button, IconAlertCircle, IconExternalLink, IconSearch, Input } from 'ui' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' import InformationBox from 'components/ui/InformationBox' import NoSearchResults from 'components/ui/NoSearchResults' import ShimmeringLoader from 'components/ui/ShimmeringLoader' import { useDatabaseExtensionsQuery } from 'data/database-extensions/database-extensions-query' import { useCheckPermissions, usePermissionsLoaded } from 'hooks' import ExtensionCard from './ExtensionCard' import ExtensionCardSkeleton from './ExtensionCardSkeleton' import { HIDDEN_EXTENSIONS } from './Extensions.constants' const Extensions = () => { const { filter } = useParams() const { project } = useProjectContext() const [filterString, setFilterString] = useState('') const { data, isLoading } = useDatabaseExtensionsQuery({ projectRef: project?.ref, connectionString: project?.connectionString, }) const formattedExtensions = (data ?? []).map((ext) => { if (ext.name === 'vector') return { ...ext, altName: 'pgvector' } else return ext }) const extensions = filterString.length === 0 ? formattedExtensions : formattedExtensions.filter((ext) => (ext?.altName ?? ext.name).toLowerCase().includes(filterString.toLowerCase()) ) const extensionsWithoutHidden = extensions.filter((ext) => !HIDDEN_EXTENSIONS.includes(ext.name)) const [enabledExtensions, disabledExtensions] = partition( extensionsWithoutHidden, (ext) => !isNull(ext.installed_version) ) const canUpdateExtensions = useCheckPermissions( PermissionAction.TENANT_SQL_ADMIN_WRITE, 'extensions' ) const isPermissionsLoaded = usePermissionsLoaded() useEffect(() => { if (filter !== undefined) setFilterString(filter as string) }, [filter]) return ( <>
setFilterString(e.target.value)} className="w-64" icon={} /> {isPermissionsLoaded && !canUpdateExtensions ? (
} title="You need additional permissions to update database extensions" />
) : ( )}
{isLoading ? (
{Array.from({ length: 6 }).map((_, index) => ( ))}
) : ( <> {extensions.length === 0 && ( setFilterString('')} /> )}
{enabledExtensions.length > 0 && (

Enabled extensions

{enabledExtensions.map((extension) => ( ))}
)} {disabledExtensions.length > 0 && (

Available extensions

{disabledExtensions.map((extension) => ( ))}
)}
)} ) } export default Extensions