refactor: import/export code (#735)
This commit is contained in:
parent
c0b732f1f1
commit
35f9876981
10 changed files with 163 additions and 192 deletions
|
|
@ -1,45 +1,44 @@
|
|||
import { FC, useState } from "react";
|
||||
import { useState } from "react";
|
||||
|
||||
import Link from "next/link";
|
||||
import Image from "next/image";
|
||||
import { useRouter } from "next/router";
|
||||
|
||||
import { mutate } from "swr";
|
||||
import useSWR, { mutate } from "swr";
|
||||
|
||||
// icons
|
||||
import { ArrowRightIcon } from "components/icons";
|
||||
// services
|
||||
import IntegrationService from "services/integration";
|
||||
// components
|
||||
import { DeleteImportModal, GithubIntegrationRoot, SingleImport } from "components/integration";
|
||||
// icons
|
||||
import { ArrowPathIcon } from "@heroicons/react/24/outline";
|
||||
import {
|
||||
DeleteImportModal,
|
||||
GithubImporterRoot,
|
||||
JiraImporterRoot,
|
||||
SingleImport,
|
||||
} from "components/integration";
|
||||
// ui
|
||||
import { Loader, PrimaryButton } from "components/ui";
|
||||
// images
|
||||
import GithubLogo from "public/logos/github-square.png";
|
||||
// icons
|
||||
import { ArrowPathIcon } from "@heroicons/react/24/outline";
|
||||
import { ArrowRightIcon } from "components/icons";
|
||||
// types
|
||||
import { IAppIntegrations, IImporterService, IWorkspaceIntegrations } from "types";
|
||||
import { IImporterService } from "types";
|
||||
// fetch-keys
|
||||
import { IMPORTER_SERVICES_LIST } from "constants/fetch-keys";
|
||||
// constants
|
||||
import { IMPORTERS_EXPORTERS_LIST } from "constants/workspace";
|
||||
|
||||
type Props = {
|
||||
provider: string | undefined;
|
||||
appIntegrations: IAppIntegrations[] | undefined;
|
||||
workspaceIntegrations: IWorkspaceIntegrations[] | undefined;
|
||||
importerServices: IImporterService[] | undefined;
|
||||
};
|
||||
|
||||
const IntegrationGuide: FC<Props> = ({
|
||||
provider,
|
||||
appIntegrations,
|
||||
workspaceIntegrations,
|
||||
importerServices,
|
||||
}) => {
|
||||
const IntegrationGuide = () => {
|
||||
const [refreshing, setRefreshing] = useState(false);
|
||||
const [deleteImportModal, setDeleteImportModal] = useState(false);
|
||||
const [importToDelete, setImportToDelete] = useState<IImporterService | null>(null);
|
||||
|
||||
const router = useRouter();
|
||||
const { workspaceSlug } = router.query;
|
||||
const { workspaceSlug, provider } = router.query;
|
||||
|
||||
const { data: importerServices } = useSWR(
|
||||
workspaceSlug ? IMPORTER_SERVICES_LIST(workspaceSlug as string) : null,
|
||||
workspaceSlug ? () => IntegrationService.getImporterServicesList(workspaceSlug as string) : null
|
||||
);
|
||||
|
||||
const handleDeleteImport = (importService: IImporterService) => {
|
||||
setImportToDelete(importService);
|
||||
|
|
@ -53,10 +52,10 @@ const IntegrationGuide: FC<Props> = ({
|
|||
handleClose={() => setDeleteImportModal(false)}
|
||||
data={importToDelete}
|
||||
/>
|
||||
<div className="space-y-5">
|
||||
<div className="space-y-2">
|
||||
{!provider && (
|
||||
<>
|
||||
<div className="flex items-center gap-2">
|
||||
<div className="flex items-center gap-2 mb-5">
|
||||
<div className="h-full w-full space-y-1">
|
||||
<div className="text-lg font-medium">Relocation Guide</div>
|
||||
<div className="text-sm">
|
||||
|
|
@ -64,109 +63,92 @@ const IntegrationGuide: FC<Props> = ({
|
|||
services. This tool will guide you to relocate the issue to Plane.
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex flex-shrink-0 cursor-pointer items-center gap-2 text-sm font-medium text-[#3F76FF] hover:text-opacity-80">
|
||||
<div>Read More</div>
|
||||
<div>
|
||||
<a href="https://docs.plane.so" target="_blank" rel="noopener noreferrer">
|
||||
<div className="flex flex-shrink-0 cursor-pointer items-center gap-2 whitespace-nowrap text-sm font-medium text-[#3F76FF] hover:text-opacity-80">
|
||||
Read More
|
||||
<ArrowRightIcon width={"18px"} color={"#3F76FF"} />
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
<div>
|
||||
{appIntegrations ? (
|
||||
appIntegrations.length > 0 ? (
|
||||
appIntegrations.map((integration, index) => (
|
||||
<div key={index} className="rounded-[10px] border bg-white p-4">
|
||||
<div className="flex items-center gap-4 whitespace-nowrap">
|
||||
<div className="h-[40px] w-[40px] flex-shrink-0">
|
||||
{integration?.provider === "github" && (
|
||||
<Image src={GithubLogo} alt="GithubLogo" />
|
||||
)}
|
||||
</div>
|
||||
<div className="w-full space-y-1">
|
||||
<div className="flex items-center gap-2 font-medium">
|
||||
<h3>{integration?.title}</h3>
|
||||
</div>
|
||||
<div className="text-sm text-gray-500">
|
||||
Activate GitHub integrations on individual projects to sync with
|
||||
specific repositories.
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex-shrink-0">
|
||||
<Link href={`/${workspaceSlug}/settings/import-export?provider=github`}>
|
||||
<PrimaryButton>Import Now</PrimaryButton>
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3 className="mt-6 mb-2 font-medium text-lg flex gap-2">
|
||||
Previous Imports
|
||||
<button
|
||||
type="button"
|
||||
className="flex-shrink-0 flex items-center gap-1 outline-none text-xs py-1 px-1.5 bg-gray-100 rounded"
|
||||
onClick={() => {
|
||||
setRefreshing(true);
|
||||
mutate(IMPORTER_SERVICES_LIST(workspaceSlug as string)).then(() =>
|
||||
setRefreshing(false)
|
||||
);
|
||||
}}
|
||||
>
|
||||
<ArrowPathIcon
|
||||
className={`h-3 w-3 ${refreshing ? "animate-spin" : ""}`}
|
||||
/>{" "}
|
||||
{refreshing ? "Refreshing..." : "Refresh status"}
|
||||
</button>
|
||||
</h3>
|
||||
{importerServices ? (
|
||||
importerServices.length > 0 ? (
|
||||
<div className="space-y-2">
|
||||
<div className="divide-y">
|
||||
{importerServices.map((service) => (
|
||||
<SingleImport
|
||||
key={service.id}
|
||||
service={service}
|
||||
refreshing={refreshing}
|
||||
handleDelete={() => handleDeleteImport(service)}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
) : (
|
||||
<div className="py-2 text-sm text-gray-800">
|
||||
No previous imports available.
|
||||
</div>
|
||||
)
|
||||
) : (
|
||||
<Loader className="grid grid-cols-1 gap-3 mt-6">
|
||||
<Loader.Item height="40px" width="100%" />
|
||||
<Loader.Item height="40px" width="100%" />
|
||||
<Loader.Item height="40px" width="100%" />
|
||||
<Loader.Item height="40px" width="100%" />
|
||||
</Loader>
|
||||
)}
|
||||
<div className="space-y-2">
|
||||
{IMPORTERS_EXPORTERS_LIST.map((service) => (
|
||||
<div key={service.provider} className="rounded-[10px] border bg-white p-4">
|
||||
<div className="flex items-center gap-4 whitespace-nowrap">
|
||||
<div className="relative h-10 w-10 flex-shrink-0">
|
||||
<Image
|
||||
src={service.logo}
|
||||
layout="fill"
|
||||
objectFit="cover"
|
||||
alt={`${service.title} Logo`}
|
||||
/>
|
||||
</div>
|
||||
<div className="w-full">
|
||||
<h3>{service.title}</h3>
|
||||
<p className="text-sm text-gray-500">{service.description}</p>
|
||||
</div>
|
||||
<div className="flex-shrink-0">
|
||||
<Link
|
||||
href={`/${workspaceSlug}/settings/import-export?provider=${service.provider}`}
|
||||
>
|
||||
<a>
|
||||
<PrimaryButton>
|
||||
<span className="capitalize">{service.type}</span> now
|
||||
</PrimaryButton>
|
||||
</a>
|
||||
</Link>
|
||||
</div>
|
||||
))
|
||||
) : (
|
||||
<div className="py-5 text-center text-sm text-gray-800">
|
||||
Integrations not available.
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
<div className="rounded-[10px] border bg-white p-4">
|
||||
<h3 className="mb-2 font-medium text-lg flex gap-2">
|
||||
Previous Imports
|
||||
<button
|
||||
type="button"
|
||||
className="flex-shrink-0 flex items-center gap-1 outline-none text-xs py-1 px-1.5 bg-gray-100 rounded"
|
||||
onClick={() => {
|
||||
setRefreshing(true);
|
||||
mutate(IMPORTER_SERVICES_LIST(workspaceSlug as string)).then(() =>
|
||||
setRefreshing(false)
|
||||
);
|
||||
}}
|
||||
>
|
||||
<ArrowPathIcon className={`h-3 w-3 ${refreshing ? "animate-spin" : ""}`} />{" "}
|
||||
{refreshing ? "Refreshing..." : "Refresh status"}
|
||||
</button>
|
||||
</h3>
|
||||
{importerServices ? (
|
||||
importerServices.length > 0 ? (
|
||||
<div className="space-y-2">
|
||||
<div className="divide-y">
|
||||
{importerServices.map((service) => (
|
||||
<SingleImport
|
||||
key={service.id}
|
||||
service={service}
|
||||
refreshing={refreshing}
|
||||
handleDelete={() => handleDeleteImport(service)}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
) : (
|
||||
<div className="py-2 text-sm text-gray-800">No previous imports available.</div>
|
||||
)
|
||||
) : (
|
||||
<Loader className="grid grid-cols-1 gap-3">
|
||||
<Loader.Item height="34px" width="100%" />
|
||||
<Loader.Item height="34px" width="100%" />
|
||||
<Loader className="grid grid-cols-1 gap-3 mt-6">
|
||||
<Loader.Item height="40px" width="100%" />
|
||||
<Loader.Item height="40px" width="100%" />
|
||||
<Loader.Item height="40px" width="100%" />
|
||||
<Loader.Item height="40px" width="100%" />
|
||||
</Loader>
|
||||
)}
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
|
||||
{provider && provider === "github" && (
|
||||
<GithubIntegrationRoot
|
||||
provider={provider}
|
||||
appIntegrations={appIntegrations}
|
||||
workspaceIntegrations={workspaceIntegrations}
|
||||
/>
|
||||
)}
|
||||
{provider && provider === "github" && <GithubImporterRoot />}
|
||||
{provider && provider === "jira" && <JiraImporterRoot />}
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue