import React, { useState } from "react"; import Link from "next/link"; import Image from "next/image"; import { useRouter } from "next/router"; import useSWR, { mutate } from "swr"; // react-hook-form import { useForm } from "react-hook-form"; // services import { IntegrationService, GithubIntegrationService } from "services/integrations"; // hooks import useToast from "hooks/use-toast"; // components import { GithubImportConfigure, GithubImportData, GithubRepoDetails, GithubImportUsers, GithubImportConfirm, } from "components/integration"; // icons import { UserGroupIcon } from "@plane/ui"; import { ArrowLeft, Check, List, Settings, UploadCloud } from "lucide-react"; // images import GithubLogo from "public/services/github.png"; // types import { IGithubRepoCollaborator, IGithubServiceImportFormData } from "@plane/types"; // fetch-keys import { APP_INTEGRATIONS, IMPORTER_SERVICES_LIST, WORKSPACE_INTEGRATIONS } from "constants/fetch-keys"; export type TIntegrationSteps = "import-configure" | "import-data" | "repo-details" | "import-users" | "import-confirm"; export interface IIntegrationData { state: TIntegrationSteps; } export interface IUserDetails { username: string; import: any; email: string; } export type TFormValues = { github: any; project: string | null; sync: boolean; collaborators: IGithubRepoCollaborator[]; users: IUserDetails[]; }; const defaultFormValues = { github: null, project: null, sync: false, }; const integrationWorkflowData = [ { title: "Configure", key: "import-configure", icon: Settings, }, { title: "Import Data", key: "import-data", icon: UploadCloud, }, { title: "Issues", key: "repo-details", icon: List }, { title: "Users", key: "import-users", icon: UserGroupIcon, }, { title: "Confirm", key: "import-confirm", icon: Check, }, ]; // services const integrationService = new IntegrationService(); const githubIntegrationService = new GithubIntegrationService(); export const GithubImporterRoot: React.FC = () => { const [currentStep, setCurrentStep] = useState({ state: "import-configure", }); const [users, setUsers] = useState([]); const router = useRouter(); const { workspaceSlug, provider } = router.query; const { setToastAlert } = useToast(); const { handleSubmit, control, setValue, watch } = useForm({ defaultValues: defaultFormValues, }); const { data: appIntegrations } = useSWR(APP_INTEGRATIONS, () => integrationService.getAppIntegrationsList()); const { data: workspaceIntegrations } = useSWR( workspaceSlug ? WORKSPACE_INTEGRATIONS(workspaceSlug as string) : null, workspaceSlug ? () => integrationService.getWorkspaceIntegrationsList(workspaceSlug as string) : null ); const activeIntegrationState = () => { const currentElementIndex = integrationWorkflowData.findIndex((i) => i?.key === currentStep?.state); return currentElementIndex; }; const handleStepChange = (value: TIntegrationSteps) => { setCurrentStep((prevData) => ({ ...prevData, state: value })); }; // current integration from all the integrations available const integration = appIntegrations && appIntegrations.length > 0 && appIntegrations.find((i) => i.provider === provider); // current integration from workspace integrations const workspaceIntegration = integration && workspaceIntegrations?.find((i: any) => i.integration_detail.id === integration.id); const createGithubImporterService = async (formData: TFormValues) => { if (!formData.github || !formData.project) return; const payload: IGithubServiceImportFormData = { metadata: { owner: formData.github.owner.login, name: formData.github.name, repository_id: formData.github.id, url: formData.github.html_url, }, data: { users: users, }, config: { sync: formData.sync, }, project_id: formData.project, }; await githubIntegrationService .createGithubServiceImport(workspaceSlug as string, payload) .then(() => { router.push(`/${workspaceSlug}/settings/imports`); mutate(IMPORTER_SERVICES_LIST(workspaceSlug as string)); }) .catch(() => setToastAlert({ type: "error", title: "Error!", message: "Import was unsuccessful. Please try again.", }) ); }; return (
Cancel import & go back
GithubLogo
{integrationWorkflowData.map((integration, index) => (
{index < integrationWorkflowData.length - 1 && (
{" "}
)}
))}
{currentStep?.state === "import-configure" && ( )} {currentStep?.state === "import-data" && ( )} {currentStep?.state === "repo-details" && ( )} {currentStep?.state === "import-users" && ( )} {currentStep?.state === "import-confirm" && ( )}
); };