import { PermissionAction } from '@supabase/shared-types/out/constants' import { Book, Github, Loader2, Settings } from 'lucide-react' import Link from 'next/link' import { useState } from 'react' import { toast } from 'sonner' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' import { useDatabaseExtensionDisableMutation } from 'data/database-extensions/database-extension-disable-mutation' import { DatabaseExtension } from 'data/database-extensions/database-extensions-query' import { useCheckPermissions } from 'hooks/misc/useCheckPermissions' import { useIsOrioleDb } from 'hooks/misc/useSelectedProject' import { extensions } from 'shared-data' import { Button, cn, Switch, Tooltip, TooltipContent, TooltipTrigger } from 'ui' import { Admonition } from 'ui-patterns' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import EnableExtensionModal from './EnableExtensionModal' import { EXTENSION_DISABLE_WARNINGS } from './Extensions.constants' interface ExtensionCardProps { extension: DatabaseExtension } const ExtensionCard = ({ extension }: ExtensionCardProps) => { const { project } = useProjectContext() const isOn = extension.installed_version !== null const isOrioleDb = useIsOrioleDb() const [isDisableModalOpen, setIsDisableModalOpen] = useState(false) const [showConfirmEnableModal, setShowConfirmEnableModal] = useState(false) const canUpdateExtensions = useCheckPermissions( PermissionAction.TENANT_SQL_ADMIN_WRITE, 'extensions' ) const orioleDbCheck = isOrioleDb && extension.name === 'orioledb' const disabled = !canUpdateExtensions || orioleDbCheck const X_PADDING = 'px-5' const extensionMeta = extensions.find((item) => item.name === extension.name) const docsUrl = extensionMeta?.link.startsWith('/guides') ? `https://supabase.com/docs${extensionMeta?.link}` : extensionMeta?.link ?? undefined const { mutate: disableExtension, isLoading: isDisabling } = useDatabaseExtensionDisableMutation({ onSuccess: () => { toast.success(`${extension.name} is off.`) setIsDisableModalOpen(false) }, }) const onConfirmDisable = () => { if (project === undefined) return console.error('Project is required') disableExtension({ projectRef: project.ref, connectionString: project.connectionString, id: extension.name, }) } return ( <>
{extension?.installed_version ?? extension.default_version}
Installed in {extension.schema} schema
{extension.comment}
{extension.name} is used by{' '} {extensionMeta.product_url ? ( {extensionMeta.product} ) : ( extensionMeta.product )}
{!isOn && (Install extension to use {extensionMeta.product}
)}Are you sure you want to turn OFF the "{extension.name}" extension?
{EXTENSION_DISABLE_WARNINGS[extension.name] && (