mirror of
https://github.com/supabase/supabase.git
synced 2026-10-10 03:45:06 +03:00
80 lines
2.8 KiB
TypeScript
80 lines
2.8 KiB
TypeScript
import { Badge, Card, CardContent, cn, Separator } from 'ui'
|
|
|
|
import { useIntegrationDetail } from '@/components/interfaces/Integrations/Landing/useIntegrationDetail'
|
|
import { useDatabaseExtensionsQuery } from '@/data/database-extensions/database-extensions-query'
|
|
import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject'
|
|
|
|
export const RequiredExtensionsSection = ({
|
|
hide = false,
|
|
hideSeparator = false,
|
|
className,
|
|
}: {
|
|
hide?: boolean
|
|
hideSeparator?: boolean
|
|
className?: string
|
|
}) => {
|
|
const { integration } = useIntegrationDetail()
|
|
const { data: project } = useSelectedProjectQuery()
|
|
const { data: extensions } = useDatabaseExtensionsQuery({
|
|
projectRef: project?.ref,
|
|
connectionString: project?.connectionString,
|
|
})
|
|
|
|
const requiredExtensions = integration?.requiredExtensions ?? []
|
|
|
|
if (hide || requiredExtensions.length === 0) return null
|
|
|
|
const installableExtensions = (extensions ?? []).filter((ext) =>
|
|
requiredExtensions.includes(ext.name)
|
|
)
|
|
const hasMissingExtensions = installableExtensions.length !== requiredExtensions.length
|
|
|
|
return (
|
|
<>
|
|
{!hideSeparator && <Separator />}
|
|
<div className={cn('flex flex-col gap-y-4', className)}>
|
|
<h4>Required extensions</h4>
|
|
<Card>
|
|
<CardContent className="p-0">
|
|
<ul className="text-foreground-light text-sm">
|
|
{requiredExtensions.map((requiredExtension, idx) => {
|
|
const extension = (extensions ?? []).find((ext) => ext.name === requiredExtension)
|
|
const isInstalled = !!extension?.installed_version
|
|
const isLastRow = idx === requiredExtensions.length - 1
|
|
|
|
return (
|
|
<li
|
|
key={requiredExtension}
|
|
className={cn(
|
|
'flex items-center justify-between gap-3 py-2 px-3',
|
|
!isLastRow ? 'border-b' : ''
|
|
)}
|
|
>
|
|
<code className="text-xs">{requiredExtension}</code>
|
|
|
|
<div className="shrink-0">
|
|
{extension ? (
|
|
isInstalled ? (
|
|
<Badge variant="secondary">Installed</Badge>
|
|
) : (
|
|
<Badge variant="warning">Required</Badge>
|
|
)
|
|
) : (
|
|
<span className="text-foreground-muted">Unavailable</span>
|
|
)}
|
|
</div>
|
|
</li>
|
|
)
|
|
})}
|
|
</ul>
|
|
|
|
{hasMissingExtensions && integration?.missingExtensionsAlert && (
|
|
<div className="py-3 px-4 border-t">{integration.missingExtensionsAlert}</div>
|
|
)}
|
|
</CardContent>
|
|
</Card>
|
|
</div>
|
|
</>
|
|
)
|
|
}
|