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 || "-"}
{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 && (
{format(new Date(integration.lastUsed), "yyyy-MM-dd, hh:mm aaa")}
{!integration.isSynced && (
<>
{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")
)
}
/>
);
};