import { PermissionAction } from '@supabase/shared-types/out/constants' import { useQuery } from '@tanstack/react-query' import { useParams } from 'common' import { Loader2 } from 'lucide-react' import { useState } from 'react' import { toast } from 'sonner' import { cn } from 'ui' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { EmptyStatePresentational } from 'ui-patterns/EmptyStatePresentational' import { PageSection, PageSectionAside, PageSectionContent, PageSectionDescription, PageSectionMeta, PageSectionSummary, PageSectionTitle, } from 'ui-patterns/PageSection' import { AddIntegrationDropdown } from './AddIntegrationDropdown' import { CreateAuth0IntegrationDialog } from './CreateAuth0Dialog' import { CreateAwsCognitoAuthIntegrationDialog } from './CreateAwsCognitoAuthDialog' import { CreateClerkAuthIntegrationDialog } from './CreateClerkAuthDialog' import { CreateFirebaseAuthIntegrationDialog } from './CreateFirebaseAuthDialog' import { CreateWorkOSIntegrationDialog } from './CreateWorkOSDialog' import { IntegrationCard } from './IntegrationCard' import { getIntegrationType, getIntegrationTypeLabel, INTEGRATION_TYPES, } from './ThirdPartyAuthForm.utils' import AlertError from '@/components/ui/AlertError' import { DocsButton } from '@/components/ui/DocsButton' import { InlineLink } from '@/components/ui/InlineLink' import { useDeleteThirdPartyAuthIntegrationMutation } from '@/data/third-party-auth/integration-delete-mutation' import { ThirdPartyAuthIntegration, thirdPartyAuthIntegrationsQueryOptions, } from '@/data/third-party-auth/integrations-query' import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' import { DOCS_URL } from '@/lib/constants' import { SHORTCUT_IDS } from '@/state/shortcuts/registry' import { useShortcut } from '@/state/shortcuts/useShortcut' export const ThirdPartyAuthForm = () => { const { ref: projectRef } = useParams() const { data: integrationsData, isPending: isLoading, isError, isSuccess, error, } = useQuery(thirdPartyAuthIntegrationsQueryOptions({ projectRef })) const integrations = integrationsData || [] const [selectedIntegration, setSelectedIntegration] = useState() const [selectedIntegrationForDeletion, setSelectedIntegrationForDeletion] = useState() const [addIntegrationOpen, setAddIntegrationOpen] = useState(false) useShortcut(SHORTCUT_IDS.LIST_PAGE_NEW_ITEM, () => setAddIntegrationOpen(true), { label: 'Add provider', }) const { mutateAsync: deleteIntegration } = useDeleteThirdPartyAuthIntegrationMutation() const { can: canUpdateConfig } = useAsyncCheckPermissions( PermissionAction.UPDATE, 'custom_config_gotrue' ) if (isError) { return ( ) } return ( Third-Party Auth Billing is based on the number of monthly active users (MAUs) requesting your API throughout the billing period.{' '} Learn more {isLoading && (
)} {isSuccess ? ( integrations.length === 0 ? ( ) : (
{integrations.map((integration) => { return ( { setSelectedIntegrationForDeletion(integration) }} /> ) })}
) ) : null} {}} onClose={() => setSelectedIntegration(undefined)} /> {}} onClose={() => setSelectedIntegration(undefined)} /> {}} onClose={() => setSelectedIntegration(undefined)} /> {}} onClose={() => setSelectedIntegration(undefined)} /> {}} onClose={() => setSelectedIntegration(undefined)} /> setSelectedIntegrationForDeletion(undefined)} onConfirm={async () => { if (!selectedIntegrationForDeletion) { return } const type = getIntegrationType(selectedIntegrationForDeletion) try { await deleteIntegration({ projectRef: projectRef!, tpaId: selectedIntegrationForDeletion.id, }) toast.success(`Successfully deleted ${getIntegrationTypeLabel(type)}.`) setSelectedIntegrationForDeletion(undefined) setSelectedIntegration(undefined) } catch (error) { toast.error(`Failed to delete ${getIntegrationTypeLabel(type)}.`) console.error(error) } }} >

Are you sure you want to delete the{' '} {getIntegrationTypeLabel(getIntegrationType(selectedIntegrationForDeletion))}{' '} integration?

) }