plane/apps/app/components/integration/github/root.tsx
guru_sainath 2f2caaaf6e
Feat: Github importer to sync issues, users, and labels with workspace projects. (#509)
* Dev: Github integration with issues and layout integration

* dev: Github Integration route and UI configuration
2023-03-23 23:27:11 +05:30

169 lines
5.5 KiB
TypeScript

import { FC, useState } from "react";
// next imports
import Link from "next/link";
import Image from "next/image";
// icons
import GithubLogo from "public/logos/github-square.png";
import { CogIcon, CloudUploadIcon, UsersIcon, ImportLayersIcon, CheckIcon } from "components/icons";
import { ArrowLeftIcon } from "@heroicons/react/24/outline";
// components
import {
GithubConfigure,
GithubImportData,
GithubIssuesSelect,
GithubUsersSelect,
GithubConfirm,
} from "components/integration";
// types
import { IAppIntegrations } from "types";
type Props = {
workspaceSlug: string | undefined;
provider: string | undefined;
allIntegrations: IAppIntegrations[] | undefined;
allIntegrationsError: Error | undefined;
allWorkspaceIntegrations: any | undefined;
allWorkspaceIntegrationsError: Error | undefined;
allIntegrationImporters: any | undefined;
allIntegrationImportersError: Error | undefined;
};
export interface IIntegrationData {
state: string;
}
export const GithubIntegrationRoot: FC<Props> = ({
workspaceSlug,
provider,
allIntegrations,
allIntegrationsError,
allWorkspaceIntegrations,
allWorkspaceIntegrationsError,
allIntegrationImporters,
allIntegrationImportersError,
}) => {
const integrationWorkflowData = [
{
title: "Configure",
key: "import-configure",
icon: CogIcon,
},
{
title: "Import Data",
key: "import-import-data",
icon: CloudUploadIcon,
},
{ title: "Issues", key: "migrate-issues", icon: UsersIcon },
{
title: "Users",
key: "migrate-users",
icon: ImportLayersIcon,
},
{
title: "Confirm",
key: "migrate-confirm",
icon: CheckIcon,
},
];
const activeIntegrationState = () => {
const currentElementIndex = integrationWorkflowData.findIndex(
(_item) => _item?.key === integrationData?.state
);
return currentElementIndex;
};
const [integrationData, setIntegrationData] = useState<IIntegrationData>({
state: "import-configure",
});
const handleIntegrationData = (key: string = "state", value: string) => {
setIntegrationData((previousData) => ({ ...previousData, [key]: value }));
};
return (
<div className="space-y-4">
<Link href={`/${workspaceSlug}/settings/import-export`}>
<div className="inline-flex cursor-pointer items-center gap-2 text-sm font-medium text-gray-600 hover:text-gray-900">
<div>
<ArrowLeftIcon className="h-3 w-3" />
</div>
<div>Back</div>
</div>
</Link>
<div className="space-y-4 rounded border border-gray-200 bg-white p-4">
<div className="flex items-center gap-2">
<div className="h-10 w-10 flex-shrink-0">
<Image src={GithubLogo} alt="GithubLogo" />
</div>
<div className="flex h-full w-full items-center justify-center">
{integrationWorkflowData.map((_integration, _idx) => (
<>
<div
key={_integration?.key}
className={`flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-full border
${
_idx <= activeIntegrationState()
? `border-[#3F76FF] bg-[#3F76FF] text-white ${
_idx === activeIntegrationState()
? `border-opacity-100 bg-opacity-100`
: `border-opacity-80 bg-opacity-80`
}`
: `border-gray-300`
}
`}
>
<_integration.icon
width={`18px`}
height={`18px`}
color={_idx <= activeIntegrationState() ? "#ffffff" : "#d1d5db"}
/>
</div>
{_idx < integrationWorkflowData.length - 1 && (
<div
key={_idx}
className={`border-b px-7 ${
_idx <= activeIntegrationState() - 1 ? `border-[#3F76FF]` : `border-gray-300`
}`}
>
{" "}
</div>
)}
</>
))}
</div>
</div>
<div className="relative w-full space-y-4 overflow-hidden">
<div className="w-full">
{integrationData?.state === "import-configure" && (
<GithubConfigure
state={integrationData}
handleState={handleIntegrationData}
workspaceSlug={workspaceSlug}
provider={provider}
allIntegrations={allIntegrations}
allIntegrationsError={allIntegrationsError}
allWorkspaceIntegrations={allWorkspaceIntegrations}
allWorkspaceIntegrationsError={allWorkspaceIntegrationsError}
/>
)}
{integrationData?.state === "import-import-data" && (
<GithubImportData state={integrationData} handleState={handleIntegrationData} />
)}
{integrationData?.state === "migrate-issues" && (
<GithubIssuesSelect state={integrationData} handleState={handleIntegrationData} />
)}
{integrationData?.state === "migrate-users" && (
<GithubUsersSelect state={integrationData} handleState={handleIntegrationData} />
)}
{integrationData?.state === "migrate-confirm" && (
<GithubConfirm state={integrationData} handleState={handleIntegrationData} />
)}
</div>
</div>
</div>
</div>
);
};