import { PermissionAction } from '@supabase/shared-types/out/constants' import { Loader2 } from 'lucide-react' import { useState } from 'react' import { toast } from 'sonner' import { useParams } from 'common' import { ScaffoldSection, ScaffoldSectionDescription, ScaffoldSectionTitle, } from 'components/layouts/Scaffold' 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, useThirdPartyAuthIntegrationsQuery, } from 'data/third-party-auth/integrations-query' import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions' import { cn } from 'ui' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' 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' export const ThirdPartyAuthForm = () => { const { ref: projectRef } = useParams() const { data: integrationsData, isLoading, isError, isSuccess, error, } = useThirdPartyAuthIntegrationsQuery({ projectRef }) const integrations = integrationsData || [] const [selectedIntegration, setSelectedIntegration] = useState() const [selectedIntegrationForDeletion, setSelectedIntegrationForDeletion] = useState() const { mutateAsync: deleteIntegration } = useDeleteThirdPartyAuthIntegrationMutation() const { can: canUpdateConfig } = useAsyncCheckProjectPermissions( PermissionAction.UPDATE, 'custom_config_gotrue' ) if (isError) { return ( ) } return (
Third Party Auth Use third-party authentication (TPA) systems based on JWTs to access your project.
Billing is based on the number of monthly active users (MAUs) requesting your API throughout the billing period. Refer to our{' '} billing docs {' '} for more information.
{integrations.length !== 0 && ( )}
{isLoading && (
)} {isSuccess ? ( integrations.length === 0 ? (

No providers configured yet

) : (
{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?

) }