import React, { useRef, useState } from "react"; import Image from "next/image"; import { useRouter } from "next/router"; import useSWR, { mutate } from "swr"; // services import IntegrationService from "services/integration"; // hooks import useToast from "hooks/use-toast"; // ui import { DangerButton, Loader, SecondaryButton } from "components/ui"; // icons import GithubLogo from "public/logos/github-square.png"; // types import { IWorkspaceIntegrations } from "types"; // fetch-keys import { WORKSPACE_INTEGRATIONS } from "constants/fetch-keys"; const OAuthPopUp = ({ integration }: any) => { const [deletingIntegration, setDeletingIntegration] = useState(false); const popup = useRef(); const router = useRouter(); const { workspaceSlug } = router.query; const { setToastAlert } = useToast(); const checkPopup = () => { const check = setInterval(() => { if (!popup || popup.current.closed || popup.current.closed === undefined) { clearInterval(check); } }, 1000); }; const openPopup = () => { const width = 600, height = 600; const left = window.innerWidth / 2 - width / 2; const top = window.innerHeight / 2 - height / 2; const url = `https://github.com/apps/${ process.env.NEXT_PUBLIC_GITHUB_APP_NAME }/installations/new?state=${workspaceSlug as string}`; return window.open(url, "", `width=${width}, height=${height}, top=${top}, left=${left}`); }; const startAuth = () => { popup.current = openPopup(); checkPopup(); }; const { data: workspaceIntegrations } = useSWR( workspaceSlug ? WORKSPACE_INTEGRATIONS(workspaceSlug as string) : null, () => workspaceSlug ? IntegrationService.getWorkspaceIntegrationsList(workspaceSlug as string) : null ); const handleRemoveIntegration = async () => { if (!workspaceSlug || !integration || !workspaceIntegrations) return; const workspaceIntegrationId = workspaceIntegrations?.find( (i) => i.integration === integration.id )?.id; setDeletingIntegration(true); await IntegrationService.deleteWorkspaceIntegration( workspaceSlug as string, workspaceIntegrationId ?? "" ) .then(() => { mutate( WORKSPACE_INTEGRATIONS(workspaceSlug as string), (prevData) => prevData?.filter((i) => i.id !== workspaceIntegrationId), false ); setDeletingIntegration(false); setToastAlert({ type: "success", title: "Deleted successfully!", message: `${integration.title} integration deleted successfully.`, }); }) .catch(() => { setDeletingIntegration(false); setToastAlert({ type: "error", title: "Error!", message: `${integration.title} integration could not be deleted. Please try again.`, }); }); }; const isInstalled = workspaceIntegrations?.find( (i: any) => i.integration_detail.id === integration.id ); return (
GithubLogo

{integration.title} {workspaceIntegrations ? ( isInstalled ? ( Installed ) : ( Not Installed ) ) : null}

{workspaceIntegrations ? isInstalled ? "Activate GitHub integrations on individual projects to sync with specific repositories." : "Connect with GitHub with your Plane workspace to sync project issues." : "Loading..."}

{workspaceIntegrations ? ( isInstalled ? ( {deletingIntegration ? "Removing..." : "Remove installation"} ) : ( Add installation ) ) : ( )}
); }; export default OAuthPopUp;