mirror of
https://github.com/supabase/supabase.git
synced 2026-10-09 11:25:06 +03:00
- Fetch additional project data needed to determine marketplace integration installation status - Consolidate logic to ensure consistency between left-hand nav and overview tab - Add special-case handling of new integrations to give us more granular control of their behavior
133 lines
4.0 KiB
TypeScript
133 lines
4.0 KiB
TypeScript
import { useMemo } from 'react'
|
|
|
|
import {
|
|
hasMatchingWrapper,
|
|
hasRequiredExtensions,
|
|
isOAuthInstalled,
|
|
isStripeSyncEngineInstalled,
|
|
useProjectOAuthIntegrationData,
|
|
} from './Landing.utils'
|
|
import { useAvailableIntegrations } from './useAvailableIntegrations'
|
|
import { useDatabaseExtensionsQuery } from '@/data/database-extensions/database-extensions-query'
|
|
import { useSchemasQuery } from '@/data/database/schemas-query'
|
|
import { useFDWsQuery } from '@/data/fdw/fdws-query'
|
|
import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject'
|
|
import { EMPTY_ARR } from '@/lib/void'
|
|
|
|
export const useInstalledIntegrations = () => {
|
|
const { data: project } = useSelectedProjectQuery()
|
|
|
|
const {
|
|
data: allIntegrations = EMPTY_ARR,
|
|
error: availableIntegrationsError,
|
|
isPending: isAvailableIntegrationsLoading,
|
|
isSuccess: isSuccessAvailableIntegrations,
|
|
isError: isErrorAvailableIntegrations,
|
|
} = useAvailableIntegrations()
|
|
|
|
const hasOAuthIntegration = useMemo(() => {
|
|
return allIntegrations.some((integration) => integration.type === 'oauth')
|
|
}, [allIntegrations])
|
|
|
|
const {
|
|
data: oauthData,
|
|
error: oauthDataError,
|
|
isError: isErrorOAuthData,
|
|
isLoading: isOAuthDataLoading,
|
|
isSuccess: isSuccessOAuthData,
|
|
} = useProjectOAuthIntegrationData(project?.ref, { enabled: hasOAuthIntegration })
|
|
|
|
const {
|
|
data: wrappers = EMPTY_ARR,
|
|
error: fdwError,
|
|
isError: isErrorFDWs,
|
|
isPending: isFDWLoading,
|
|
isSuccess: isSuccessFDWs,
|
|
} = useFDWsQuery({
|
|
projectRef: project?.ref,
|
|
connectionString: project?.connectionString,
|
|
})
|
|
const {
|
|
data: extensions = EMPTY_ARR,
|
|
error: extensionsError,
|
|
isError: isErrorExtensions,
|
|
isPending: isExtensionsLoading,
|
|
isSuccess: isSuccessExtensions,
|
|
} = useDatabaseExtensionsQuery({
|
|
projectRef: project?.ref,
|
|
connectionString: project?.connectionString,
|
|
})
|
|
|
|
const {
|
|
data: schemas = EMPTY_ARR,
|
|
error: schemasError,
|
|
isError: isErrorSchemas,
|
|
isPending: isSchemasLoading,
|
|
isSuccess: isSuccessSchemas,
|
|
} = useSchemasQuery({
|
|
projectRef: project?.ref,
|
|
connectionString: project?.connectionString,
|
|
})
|
|
|
|
const isHooksEnabled = schemas?.some((schema) => schema.name === 'supabase_functions')
|
|
|
|
const installedIntegrations = useMemo(() => {
|
|
return allIntegrations
|
|
.filter((integration) => {
|
|
if (integration.id === 'webhooks') return isHooksEnabled
|
|
if (integration.id === 'data_api') return true
|
|
if (integration.id === 'stripe_sync_engine') {
|
|
return isStripeSyncEngineInstalled(schemas)
|
|
}
|
|
if (integration.type === 'wrapper') {
|
|
return hasMatchingWrapper({ meta: integration.meta, wrappers })
|
|
}
|
|
if (integration.type === 'postgres_extension') {
|
|
return hasRequiredExtensions({ integration, extensions })
|
|
}
|
|
if (integration.type === 'oauth') {
|
|
return isOAuthInstalled({
|
|
integration,
|
|
projectData: oauthData,
|
|
})
|
|
}
|
|
return false
|
|
})
|
|
.sort((a, b) => a.name.localeCompare(b.name))
|
|
}, [allIntegrations, wrappers, extensions, schemas, isHooksEnabled, oauthData])
|
|
|
|
const error =
|
|
fdwError ||
|
|
extensionsError ||
|
|
schemasError ||
|
|
availableIntegrationsError ||
|
|
(hasOAuthIntegration ? oauthDataError : null)
|
|
const isLoading =
|
|
isSchemasLoading ||
|
|
isFDWLoading ||
|
|
isExtensionsLoading ||
|
|
isAvailableIntegrationsLoading ||
|
|
(hasOAuthIntegration && isOAuthDataLoading)
|
|
const isError =
|
|
isErrorFDWs ||
|
|
isErrorExtensions ||
|
|
isErrorSchemas ||
|
|
isErrorAvailableIntegrations ||
|
|
(hasOAuthIntegration && isErrorOAuthData)
|
|
const isSuccess =
|
|
isSuccessFDWs &&
|
|
isSuccessExtensions &&
|
|
isSuccessSchemas &&
|
|
isSuccessAvailableIntegrations &&
|
|
(!hasOAuthIntegration || isSuccessOAuthData)
|
|
|
|
return {
|
|
// show all integrations at once instead of showing partial results
|
|
installedIntegrations: isLoading ? EMPTY_ARR : installedIntegrations,
|
|
error,
|
|
isError,
|
|
isLoading,
|
|
isSuccess,
|
|
}
|
|
}
|