From 0dcd46a52f808f22afd61e78ee1543101216f2fc Mon Sep 17 00:00:00 2001 From: Matt Linkous Date: Mon, 8 Jun 2026 19:45:08 -0500 Subject: [PATCH] WIP --- .../InstallOAuthIntegrationButton.tsx | 56 ++++++---------- .../Landing/Integrations.constants.tsx | 1 + .../Integrations/Landing/Landing.utils.ts | 26 ++------ .../Landing/useAvailableIntegrations.tsx | 2 + .../Landing/useInstalledIntegrations.tsx | 64 ++++++------------- .../Marketplace/MarketplaceCard.tsx | 6 +- .../Marketplace/MarketplaceDetail.tsx | 1 + .../Marketplace/MarketplaceDetailRail.tsx | 7 +- .../Marketplace/MarketplaceDetailTopBar.tsx | 4 +- .../Marketplace/MarketplaceFeaturedHero.tsx | 2 +- .../Marketplace/MarketplaceIndex.tsx | 2 +- .../Marketplace/MarketplaceListRow.tsx | 6 +- .../data/oauth/authorized-apps-query.ts | 1 + packages/common/marketplace-client.ts | 1 + 14 files changed, 71 insertions(+), 108 deletions(-) diff --git a/apps/studio/components/interfaces/Integrations/Integration/IntegrationOverviewTabV2/InstallIntegrationSheet/InstallOAuthIntegrationButton.tsx b/apps/studio/components/interfaces/Integrations/Integration/IntegrationOverviewTabV2/InstallIntegrationSheet/InstallOAuthIntegrationButton.tsx index fa2cc534313..9055efbe734 100644 --- a/apps/studio/components/interfaces/Integrations/Integration/IntegrationOverviewTabV2/InstallIntegrationSheet/InstallOAuthIntegrationButton.tsx +++ b/apps/studio/components/interfaces/Integrations/Integration/IntegrationOverviewTabV2/InstallIntegrationSheet/InstallOAuthIntegrationButton.tsx @@ -4,9 +4,9 @@ import { toast } from 'sonner' import { Button } from 'ui' import type { IntegrationDefinition } from '@/components/interfaces/Integrations/Landing/Integrations.constants' -import { useAPIKeysQuery } from '@/data/api-keys/api-keys-query' import { useInstallOAuthIntegrationMutation } from '@/data/marketplace/install-oauth-integration-mutation' -import { useSecretsQuery } from '@/data/secrets/secrets-query' +import { useAuthorizedAppsQuery } from '@/data/oauth/authorized-apps-query' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' interface InstallOAuthIntegrationButtonProps { integration: IntegrationDefinition @@ -14,22 +14,15 @@ interface InstallOAuthIntegrationButtonProps { export function InstallOAuthIntegrationButton({ integration }: InstallOAuthIntegrationButtonProps) { const { ref: projectRef } = useParams() + const { data: organization } = useSelectedOrganizationQuery() - const requiresApiKeysCheck = - integration.installIdentificationMethod === 'secret_key_prefix' && !!integration.secretKeyPrefix + const clientId = integration.oauthClientId - const requiresEdgeFunctionSecretsCheck = - integration.installIdentificationMethod === 'edge_function_secret_name' && - !!integration.edgeFunctionSecretName + console.log({ integration }) - const { data: apiKeys, isLoading: isApiKeysLoading } = useAPIKeysQuery( - { projectRef, reveal: false }, - { enabled: requiresApiKeysCheck } - ) - - const { data: edgeFunctionSecrets, isPending: isEdgeFunctionSecretsLoading } = useSecretsQuery( - { projectRef }, - { enabled: requiresEdgeFunctionSecretsCheck } + const { data: authorizedApps, isLoading: isAuthorizedAppsLoading } = useAuthorizedAppsQuery( + { slug: organization?.slug }, + { enabled: !!clientId && !!organization?.slug } ) const { mutate: installOAuthIntegration, isPending: isInstalling } = @@ -47,27 +40,16 @@ export function InstallOAuthIntegrationButton({ integration }: InstallOAuthInteg }, }) - const isLoading = - (requiresApiKeysCheck && isApiKeysLoading) || - (requiresEdgeFunctionSecretsCheck && isEdgeFunctionSecretsLoading) + const isLoading = !!clientId && isAuthorizedAppsLoading - const isIntegrationInstalled = useMemo(() => { - if (!integration) return false - - if (integration.installIdentificationMethod === 'secret_key_prefix') { - const prefix = integration.secretKeyPrefix - if (!prefix || isApiKeysLoading || !apiKeys) return false - return apiKeys.some((k) => k.type === 'secret' && k.name.startsWith(prefix)) - } - - if (integration.installIdentificationMethod === 'edge_function_secret_name') { - const secretName = integration.edgeFunctionSecretName - if (!secretName || isEdgeFunctionSecretsLoading || !edgeFunctionSecrets) return false - return edgeFunctionSecrets.some((secret) => secret.name === secretName) - } - - return false - }, [apiKeys, edgeFunctionSecrets, integration, isApiKeysLoading, isEdgeFunctionSecretsLoading]) + const isIntegrationConnected = useMemo(() => { + console.log({ + authorizedApps, + clientId, + }) + if (!clientId || !authorizedApps) return false + return authorizedApps.some((app) => app.client_id === clientId) + }, [authorizedApps, clientId]) const handleInstallClick = async () => { if (!integration || !projectRef) return @@ -78,9 +60,9 @@ export function InstallOAuthIntegrationButton({ integration }: InstallOAuthInteg return ( <> - {isIntegrationInstalled ? ( + {isIntegrationConnected ? ( ) : (