import { useCallback } from 'react' import { useParams } from 'common' 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 { 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 { useSelectedOrganization, useSelectedProject, useStore } from 'hooks' import { OPT_IN_TAGS } from 'lib/constants' import { useSidePanelsStateSnapshot } from 'state/side-panels' import { cn } from 'ui' import { IntegrationImageHandler } from '../IntegrationsSettings' import GitHubIntegrationConnectionForm from './GitHubIntegrationConnectionForm' import { useBranchesQuery } from 'data/branches/branches-query' 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 { ui } = useStore() 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: () => { ui.setNotification({ category: 'success', message: 'Successfully deleted Github connection', }) }, }) const { mutate: disableBranching } = useBranchesDisableMutation() const previewBranches = (branches ?? []).filter((branch) => !branch.is_default) const hasAccessToBranching = org?.opt_in_tags?.includes(OPT_IN_TAGS.PREVIEW_BRANCHES) ?? false 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