/* eslint-disable @typescript-eslint/no-unused-vars */ import { useEffect, useState } from "react"; import { useRouter } from "next/router"; import { faArrowRight, faCheck, faXmark } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; // TODO: This needs to be moved from public folder import { contextNetlifyMapping, integrationSlugNameMapping, reverseContextNetlifyMapping } from "public/data/frequentConstants"; import Button from "@app/components/basic/buttons/Button"; import ListBox from "@app/components/basic/Listbox"; import deleteIntegration from "../../pages/api/integrations/DeleteIntegration"; import getIntegrationApps from "../../pages/api/integrations/GetIntegrationApps"; import updateIntegration from "../../pages/api/integrations/updateIntegration"; interface Integration { _id: string; isActive: boolean; app: string | null; appId: string | null; path: string | null; region: string | null; createdAt: string; updatedAt: string; environment: string; integration: string; targetEnvironment: string; workspace: string; integrationAuth: string; secretPath: string; } interface IntegrationApp { name: string; appId?: string; owner?: string; } type Props = { integration: Integration; integrations: Integration[]; setIntegrations: any; bot: any; setBot: any; environments: Array<{ name: string; slug: string }>; handleDeleteIntegration: (args: { integration: Integration }) => void; }; // TODO: refactor const IntegrationTile = ({ integration, integrations, bot, setBot, setIntegrations, environments = [], handleDeleteIntegration }: Props) => { const [integrationEnvironment, setIntegrationEnvironment] = useState( environments.find(({ slug }) => slug === integration?.environment) || { name: "", slug: "" } ); const router = useRouter(); const [apps, setApps] = useState([]); // integration app objects const [integrationApp, setIntegrationApp] = useState(""); // integration app name const [integrationTargetEnvironment, setIntegrationTargetEnvironment] = useState(""); useEffect(() => { const loadIntegration = async () => { const tempApps: [IntegrationApp] = await getIntegrationApps({ integrationAuthId: integration?.integrationAuth }); setApps(tempApps); if (integration?.app) { setIntegrationApp(integration.app); } else if (integration?.path && integration?.region) { setIntegrationApp(`${integration.path} (${integration.region})`); } else if (tempApps.length > 0) { setIntegrationApp(tempApps[0].name); } else { setIntegrationApp(""); } switch (integration.integration) { case "vercel": setIntegrationTargetEnvironment( integration?.targetEnvironment ? integration.targetEnvironment.charAt(0).toUpperCase() + integration.targetEnvironment.substring(1) : "Development" ); break; case "netlify": setIntegrationTargetEnvironment( integration?.targetEnvironment ? contextNetlifyMapping[integration.targetEnvironment] : "Local development" ); break; default: break; } }; loadIntegration(); }, []); const handleStartIntegration = async () => { const reformatTargetEnvironment = (targetEnvironment: string) => { switch (integration.integration) { case "vercel": return targetEnvironment.toLowerCase(); case "netlify": return reverseContextNetlifyMapping[targetEnvironment]; default: return null; } }; try { const siteApp = apps.find((app) => app.name === integrationApp); // obj or undefined const appId = siteApp?.appId ?? null; const owner = siteApp?.owner ?? null; // return updated integration const updatedIntegration = await updateIntegration({ integrationId: integration._id, environment: integrationEnvironment.slug, isActive: true, app: integrationApp, appId, targetEnvironment: reformatTargetEnvironment(integrationTargetEnvironment), owner }); setIntegrations( integrations.map((i) => (i._id === updatedIntegration._id ? updatedIntegration : i)) ); } catch (err) { console.error(err); } }; // eslint-disable-next-line @typescript-eslint/no-shadow const renderIntegrationSpecificParams = (integration: Integration) => { try { switch (integration.integration) { case "vercel": return (
ENVIRONMENT
); case "netlify": return (
CONTEXT
); case "railway": return (
ENVIRONMENT
); case "gitlab": return (
ENVIRONMENT
); default: return
; } } catch (err) { console.error(err); } return
; }; if (!integrationApp && integration.integration !== "checkly") return
; const isSelected = integration.integration === "hashicorp-vault" ? `${integration.app} - path: ${integration.path}` : integrationApp; return (

ENVIRONMENT

name) : null} isSelected={integrationEnvironment.name} onChange={(envName) => setIntegrationEnvironment( environments.find(({ name }) => envName === name) || { name: "unknown", slug: "unknown" } ) } isFull />

SECRET PATH

{/* {integration.integration.charAt(0).toUpperCase() + integration.integration.slice(1)} */} {integration.secretPath}

INTEGRATION

{/* {integration.integration.charAt(0).toUpperCase() + integration.integration.slice(1)} */} {integrationSlugNameMapping[integration.integration]}
APP
{integrationApp ? (
app.name) : null} isSelected={isSelected} onChange={(app) => { setIntegrationApp(app); }} />
) : (
-
)}
{renderIntegrationSpecificParams(integration)}
{integration.isActive ? (
In Sync
) : (
); }; export default IntegrationTile;