import { PermissionAction } from '@supabase/shared-types/out/constants' import { isNull, partition } from 'lodash' import { AlertCircle, Search } from 'lucide-react' import { useEffect, useState } from 'react' import { useParams } from 'common' import { DocsButton } from 'components/ui/DocsButton' 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/misc/useCheckPermissions' import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Input } from 'ui' import ExtensionCard from './ExtensionCard' import ExtensionCardSkeleton from './ExtensionCardSkeleton' import { HIDDEN_EXTENSIONS, SEARCH_TERMS } from './Extensions.constants' const Extensions = () => { const { filter } = useParams() const { data: project } = useSelectedProjectQuery() const [filterString, setFilterString] = useState('') const { data, isLoading } = useDatabaseExtensionsQuery({ projectRef: project?.ref, connectionString: project?.connectionString, }) const extensions = filterString.length === 0 ? data ?? [] : (data ?? []).filter((ext) => { const nameMatchesSearch = ext.name.toLowerCase().includes(filterString.toLowerCase()) const searchTermsMatchesSearch = (SEARCH_TERMS[ext.name] || []).some((x) => x.includes(filterString.toLowerCase()) ) return nameMatchesSearch || searchTermsMatchesSearch }) 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-52" 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