import Link from "next/link"; import { faCalendarCheck } from "@fortawesome/free-regular-svg-icons"; import { faArrowRight, faRefresh, faWarning, faXmark } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { format } from "date-fns"; import { integrationSlugNameMapping } from "public/data/frequentConstants"; import { ProjectPermissionCan } from "@app/components/permissions"; import { Alert, AlertDescription, Button, DeleteActionModal, EmptyState, FormLabel, IconButton, Skeleton, Tag, Tooltip } from "@app/components/v2"; import { ProjectPermissionActions, ProjectPermissionSub } from "@app/context"; import { usePopUp } from "@app/hooks"; import { useSyncIntegration } from "@app/hooks/api/integrations/queries"; import { IntegrationMappingBehavior } from "@app/hooks/api/integrations/types"; import { TIntegration } from "@app/hooks/api/types"; type Props = { environments: Array<{ name: string; slug: string; id: string }>; integrations?: TIntegration[]; isLoading?: boolean; onIntegrationDelete: (integration: TIntegration, cb: () => void) => void; isBotActive: boolean | undefined; workspaceId: string; }; export const IntegrationsSection = ({ integrations = [], environments = [], isLoading, onIntegrationDelete, isBotActive, workspaceId }: Props) => { const { popUp, handlePopUpOpen, handlePopUpClose, handlePopUpToggle } = usePopUp([ "deleteConfirmation" ] as const); const { mutate: syncIntegration } = useSyncIntegration(); return (

Current Integrations

Manage integrations with third-party services.

{isLoading && (
)} {!isBotActive && Boolean(integrations.length) && (
All the active integrations will be disabled. Disable End-to-End Encryption in{" "} project settings to re-enable it.
)} {!isLoading && !integrations.length && isBotActive && (
)} {!isLoading && isBotActive && (
{integrations?.map((integration) => (
{environments.find((e) => e.id === integration.envId)?.name || "-"}
{integration.secretPath}
{integrationSlugNameMapping[integration.integration]}
{integration.integration === "qovery" && (
{integration?.owner || "-"}
{integration?.targetService || "-"}
{integration?.targetEnvironment || "-"}
)} {!( integration.integration === "aws-secret-manager" && integration.metadata?.mappingBehavior === IntegrationMappingBehavior.ONE_TO_ONE ) && (
{(integration.integration === "hashicorp-vault" && `${integration.app} - path: ${integration.path}`) || (integration.scope === "github-org" && `${integration.owner}`) || (["aws-parameter-store", "rundeck"].includes(integration.integration) && `${integration.path}`) || (integration.scope?.startsWith("github-") && `${integration.owner}/${integration.app}`) || integration.app}
)} {(integration.integration === "vercel" || integration.integration === "netlify" || integration.integration === "railway" || integration.integration === "gitlab" || integration.integration === "teamcity" || integration.integration === "bitbucket" || (integration.integration === "github" && integration.scope === "github-env")) && (
{integration.targetEnvironment || integration.targetEnvironmentId}
)} {integration.integration === "checkly" && integration.targetService && (
{integration.targetService}
)} {integration.integration === "terraform-cloud" && integration.targetService && (
{integration.targetService}
)} {(integration.integration === "checkly" || integration.integration === "github") && (
{integration?.metadata?.secretSuffix || "-"}
)}
{integration.isSynced != null && integration.lastUsed != null && (
Last sync
{format(new Date(integration.lastUsed), "yyyy-MM-dd, hh:mm aaa")}
{!integration.isSynced && ( <>
Fail reason
{integration.syncMessage}
)}
} >
Sync Status
{!integration.isSynced && }
)}
{(isAllowed: boolean) => (
handlePopUpOpen("deleteConfirmation", integration)} ariaLabel="delete" isDisabled={!isAllowed} colorSchema="danger" variant="star" >
)}
))}
)} handlePopUpToggle("deleteConfirmation", isOpen)} deleteKey={ (popUp?.deleteConfirmation?.data as TIntegration)?.app || (popUp?.deleteConfirmation?.data as TIntegration)?.owner || (popUp?.deleteConfirmation?.data as TIntegration)?.path || "" } onDeleteApproved={async () => onIntegrationDelete(popUp?.deleteConfirmation.data as TIntegration, () => handlePopUpClose("deleteConfirmation") ) } /> ); };