diff --git a/frontend/src/views/IntegrationsPage/components/IntegrationsSection/ConfiguredIntegrationItem.tsx b/frontend/src/views/IntegrationsPage/components/IntegrationsSection/ConfiguredIntegrationItem.tsx
new file mode 100644
index 000000000..a621fac3d
--- /dev/null
+++ b/frontend/src/views/IntegrationsPage/components/IntegrationsSection/ConfiguredIntegrationItem.tsx
@@ -0,0 +1,229 @@
+import {
+ faArrowRight,
+ faCalendarCheck,
+ 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 { Button, FormLabel, IconButton, Tag, Tooltip } from "@app/components/v2";
+import { ProjectPermissionActions, ProjectPermissionSub } from "@app/context";
+import { IntegrationMappingBehavior } from "@app/hooks/api/integrations/types";
+import { TIntegration } from "@app/hooks/api/types";
+
+type IProps = {
+ integration: TIntegration;
+ environments: Array<{ name: string; slug: string; id: string }>;
+ onRemoveIntegration: VoidFunction;
+ onManualSyncIntegration: VoidFunction;
+};
+
+export const ConfiguredIntegrationItem = ({
+ integration,
+ environments,
+ onRemoveIntegration,
+ onManualSyncIntegration
+}: IProps) => {
+ return (
+
+
+
+
+
+ {environments.find((e) => e.id === integration.envId)?.name || "-"}
+
+
+
+
+
+ {integration.secretPath}
+
+
+
+
+
+
+
+ {/* eslint-disable-next-line no-nested-ternary */}
+ {integration.metadata?.githubVisibility === "selected"
+ ? "Syncing to selected repositories in the organization. "
+ : integration.metadata?.githubVisibility === "private"
+ ? "Syncing to all private repositories in the organization"
+ : "Syncing to all public and private repositories in the organization"}
+
+ ) : undefined
+ }
+ label="Integration"
+ />
+
+ {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}
+ >
+ )}
+
+ }
+ >
+
+
{integration.isSynced ? "Synced" : "Not synced"}
+ {!integration.isSynced &&
}
+
+
+
+ )}
+
+
+ onManualSyncIntegration()}
+ className="max-w-[2.5rem] border-none bg-mineshaft-500"
+ >
+
+
+
+
+
+ {(isAllowed: boolean) => (
+
+
+ onRemoveIntegration()}
+ ariaLabel="delete"
+ isDisabled={!isAllowed}
+ colorSchema="danger"
+ variant="star"
+ >
+
+
+
+
+ )}
+
+
+
+ );
+};
diff --git a/frontend/src/views/IntegrationsPage/components/IntegrationsSection/IntegrationsSection.tsx b/frontend/src/views/IntegrationsPage/components/IntegrationsSection/IntegrationsSection.tsx
index 0be10f129..46037dfb4 100644
--- a/frontend/src/views/IntegrationsPage/components/IntegrationsSection/IntegrationsSection.tsx
+++ b/frontend/src/views/IntegrationsPage/components/IntegrationsSection/IntegrationsSection.tsx
@@ -1,27 +1,10 @@
-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 {
- Button,
- Checkbox,
- DeleteActionModal,
- EmptyState,
- FormLabel,
- IconButton,
- Skeleton,
- Tag,
- Tooltip
-} from "@app/components/v2";
-import { ProjectPermissionActions, ProjectPermissionSub } from "@app/context";
+import { Checkbox, DeleteActionModal, EmptyState, Skeleton } from "@app/components/v2";
import { usePopUp, useToggle } 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";
+import { ConfiguredIntegrationItem } from "./ConfiguredIntegrationItem";
+
type Props = {
environments: Array<{ name: string; slug: string; id: string }>;
integrations?: TIntegration[];
@@ -72,207 +55,22 @@ export const IntegrationsSection = ({
{!isLoading && (
{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 && (
-
-
-
-
- {format(new Date(integration.lastUsed), "yyyy-MM-dd, hh:mm aaa")}
-
- {!integration.isSynced && (
- <>
-
-
- {integration.syncMessage}
-
- >
- )}
-
- }
- >
-
-
{integration.isSynced ? "Synced" : "Not synced"}
- {!integration.isSynced &&
}
-
-
-
- )}
-
-
-
- syncIntegration({
- workspaceId,
- id: integration.id,
- lastUsed: integration.lastUsed as string
- })
- }
- className="max-w-[2.5rem] border-none bg-mineshaft-500"
- >
-
-
-
-
-
- {(isAllowed: boolean) => (
-
-
- {
- setShouldDeleteSecrets.off();
- handlePopUpOpen("deleteConfirmation", integration);
- }}
- ariaLabel="delete"
- isDisabled={!isAllowed}
- colorSchema="danger"
- variant="star"
- >
-
-
-
-
- )}
-
-
-
+ {
+ syncIntegration({
+ workspaceId,
+ id: integration.id,
+ lastUsed: integration.lastUsed as string
+ });
+ }}
+ onRemoveIntegration={() => {
+ setShouldDeleteSecrets.off();
+ handlePopUpOpen("deleteConfirmation", integration);
+ }}
+ integration={integration}
+ environments={environments}
+ />
))}
)}