import { useParams } from 'common' import { useCallback } from 'react' import toast from 'react-hot-toast' import { IntegrationConnectionItem } from 'components/interfaces/Integrations/IntegrationConnection' import { EmptyIntegrationConnection } from 'components/interfaces/Integrations/IntegrationPanels' import { Markdown } from 'components/interfaces/Markdown' import { ScaffoldContainer, ScaffoldSection, ScaffoldSectionContent, ScaffoldSectionDetail, } from 'components/layouts/Scaffold' import { useBranchesDisableMutation } from 'data/branches/branches-disable-mutation' import { useBranchesQuery } from 'data/branches/branches-query' import { useGitHubConnectionDeleteMutation } from 'data/integrations/github-connection-delete-mutation' import { useGitHubConnectionsQuery } from 'data/integrations/github-connections-query' import type { IntegrationName, IntegrationProjectConnection, } from 'data/integrations/integrations.types' import { useFlag, useSelectedOrganization, useSelectedProject } from 'hooks' import { useSidePanelsStateSnapshot } from 'state/side-panels' import { IntegrationImageHandler } from '../IntegrationsSettings' import GitHubIntegrationConnectionForm from './GitHubIntegrationConnectionForm' const GitHubTitle = `GitHub Connections` const GitHubDetailsSection = ` Connect any of your GitHub repositories to a project. ` const GitHubContentSectionTop = ` ### How will GitHub connections work? You will be able to connect a GitHub repository to a Supabase project. The GitHub app will watch for changes in your repository such as file changes, branch changes as well as pull request activity. ` const GitHubSection = () => { const { ref: projectRef } = useParams() const project = useSelectedProject() const org = useSelectedOrganization() const sidePanelsStateSnapshot = useSidePanelsStateSnapshot() const { data: allConnections } = useGitHubConnectionsQuery({ organizationId: org?.id }) const { data: branches } = useBranchesQuery({ projectRef }) const { mutate: deleteGitHubConnection } = useGitHubConnectionDeleteMutation({ onSuccess: () => { toast.success('Successfully deleted Github connection') }, }) const { mutate: disableBranching } = useBranchesDisableMutation() const hasAccessToBranching = useFlag('branchManagement') const previewBranches = (branches ?? []).filter((branch) => !branch.is_default) const isBranch = project?.parent_project_ref !== undefined const isBranchingEnabled = project?.is_branch_enabled === true || project?.parent_project_ref !== undefined const connections = allConnections?.filter((connection) => isBranch ? connection.project.ref === project.parent_project_ref : connection.project.ref === projectRef ) ?? [] const onAddGitHubConnection = useCallback(() => { sidePanelsStateSnapshot.setGithubConnectionsOpen(true) }, [sidePanelsStateSnapshot]) const onDeleteGitHubConnection = useCallback( async (connection: IntegrationProjectConnection) => { if (isBranchingEnabled) { if (!projectRef) throw new Error('Project ref not found') disableBranching({ projectRef, branchIds: previewBranches?.map((branch) => branch.id) }) } if (!org?.id) throw new Error('Organization not found') deleteGitHubConnection({ connectionId: connection.id, organizationId: org.id }) }, [ deleteGitHubConnection, disableBranching, isBranchingEnabled, org?.id, previewBranches, projectRef, ] ) return ( {connections.length > 0 ? (
    {connections.map((connection) => (
    ))}
) : hasAccessToBranching ? ( Add new project connection ) : (

Access to{' '} branching {' '} is required to add GitHub connections.

)}
) } export default GitHubSection