diff --git a/apps/app/components/icons/arrow-right.tsx b/apps/app/components/icons/arrow-right.tsx new file mode 100644 index 000000000..a157e5820 --- /dev/null +++ b/apps/app/components/icons/arrow-right.tsx @@ -0,0 +1,24 @@ +import React from "react"; + +import type { Props } from "./types"; + +export const ArrowRightIcon: React.FC = ({ + width = "24", + height = "24", + color = "#858E96", + className, +}) => ( + + + +); diff --git a/apps/app/components/icons/check.tsx b/apps/app/components/icons/check.tsx new file mode 100644 index 000000000..6ab04cd43 --- /dev/null +++ b/apps/app/components/icons/check.tsx @@ -0,0 +1,24 @@ +import React from "react"; + +import type { Props } from "./types"; + +export const CheckIcon: React.FC = ({ + width = "24", + height = "24", + color = "#858E96", + className, +}) => ( + + + +); diff --git a/apps/app/components/icons/cloud-upload.tsx b/apps/app/components/icons/cloud-upload.tsx new file mode 100644 index 000000000..585ed4a4a --- /dev/null +++ b/apps/app/components/icons/cloud-upload.tsx @@ -0,0 +1,24 @@ +import React from "react"; + +import type { Props } from "./types"; + +export const CloudUploadIcon: React.FC = ({ + width = "24", + height = "24", + color = "#858E96", + className, +}) => ( + + + +); diff --git a/apps/app/components/icons/cog.tsx b/apps/app/components/icons/cog.tsx new file mode 100644 index 000000000..b0167fdd0 --- /dev/null +++ b/apps/app/components/icons/cog.tsx @@ -0,0 +1,24 @@ +import React from "react"; + +import type { Props } from "./types"; + +export const CogIcon: React.FC = ({ + width = "24", + height = "24", + color = "#858E96", + className, +}) => ( + + + +); diff --git a/apps/app/components/icons/github-icon.tsx b/apps/app/components/icons/github-icon.tsx index 0e259eee3..1dc7b5eea 100644 --- a/apps/app/components/icons/github-icon.tsx +++ b/apps/app/components/icons/github-icon.tsx @@ -2,27 +2,27 @@ import React from "react"; import type { Props } from "./types"; -export const GithubIcon: React.FC = ({ width = "24", height = "24", className }) => ( - - - - - - - - - - - ); +export const GithubIcon: React.FC = ({ width = "24", height = "24", className, color }) => ( + + + + + + + + + + +); diff --git a/apps/app/components/icons/import-layers.tsx b/apps/app/components/icons/import-layers.tsx new file mode 100644 index 000000000..701c51355 --- /dev/null +++ b/apps/app/components/icons/import-layers.tsx @@ -0,0 +1,26 @@ +import React from "react"; + +import type { Props } from "./types"; + +export const ImportLayersIcon: React.FC = ({ + width = "24", + height = "24", + color = "#858E96", + className, +}) => ( + + + +); diff --git a/apps/app/components/icons/index.ts b/apps/app/components/icons/index.ts index 61be2d691..beb6bef61 100644 --- a/apps/app/components/icons/index.ts +++ b/apps/app/components/icons/index.ts @@ -45,3 +45,9 @@ export * from "./people-group-icon"; export * from "./cmd-icon"; export * from "./view-list-icon"; export * from "./exclamation-icon"; +export * from "./arrow-right"; +export * from "./cog"; +export * from "./cloud-upload"; +export * from "./users"; +export * from "./import-layers"; +export * from "./check"; diff --git a/apps/app/components/icons/users.tsx b/apps/app/components/icons/users.tsx new file mode 100644 index 000000000..9e590d8fc --- /dev/null +++ b/apps/app/components/icons/users.tsx @@ -0,0 +1,24 @@ +import React from "react"; + +import type { Props } from "./types"; + +export const UsersIcon: React.FC = ({ + width = "24", + height = "24", + color = "#858E96", + className, +}) => ( + + + +); diff --git a/apps/app/components/integration/github/auth.tsx b/apps/app/components/integration/github/auth.tsx new file mode 100644 index 000000000..d65195948 --- /dev/null +++ b/apps/app/components/integration/github/auth.tsx @@ -0,0 +1,60 @@ +import { FC, useRef, useState } from "react"; + +type Props = { + workspaceSlug: string | undefined; + workspaceIntegration: any; +}; + +export const GithubAuth: FC = ({ workspaceSlug, workspaceIntegration }) => { + const popup = useRef(); + const [authLoader, setAuthLoader] = useState(false); + + const checkPopup = () => { + const check = setInterval(() => { + if (!popup || popup.current.closed || popup.current.closed === undefined) { + clearInterval(check); + setAuthLoader(false); + } + }, 2000); + }; + + 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(); + setAuthLoader(true); + }; + + return ( +
+ {workspaceIntegration && workspaceIntegration?.id ? ( + + ) : ( + + )} +
+ ); +}; diff --git a/apps/app/components/integration/github/configure.tsx b/apps/app/components/integration/github/configure.tsx new file mode 100644 index 000000000..d2a13cfd9 --- /dev/null +++ b/apps/app/components/integration/github/configure.tsx @@ -0,0 +1,74 @@ +import { FC } from "react"; +// components +import { IIntegrationData, GithubAuth } from "components/integration"; +// types +import { IAppIntegrations } from "types"; + +type Props = { + state: IIntegrationData; + provider: string | undefined; + handleState: (key: string, valve: any) => void; + workspaceSlug: string | undefined; + allIntegrations: IAppIntegrations[] | undefined; + allIntegrationsError: Error | undefined; + allWorkspaceIntegrations: any | undefined; + allWorkspaceIntegrationsError: Error | undefined; +}; + +export const GithubConfigure: FC = ({ + state, + handleState, + workspaceSlug, + provider, + allIntegrations, + allIntegrationsError, + allWorkspaceIntegrations, + allWorkspaceIntegrationsError, +}) => { + // current integration from all the integrations available + const integration = + allIntegrations && + allIntegrations.length > 0 && + allIntegrations.find((_integration) => _integration.provider === provider); + + // current integration from workspace integrations + const workspaceIntegration = + integration && + allWorkspaceIntegrations && + allWorkspaceIntegrations.length > 0 && + allWorkspaceIntegrations.find( + (_integration: any) => _integration.integration_detail.id === integration.id + ); + + console.log("integration", integration); + console.log("workspaceIntegration", workspaceIntegration); + + return ( +
+
+
+
Configure
+
Set up your Github import
+
+
+ +
+
+ +
+ +
+
+ ); +}; diff --git a/apps/app/components/integration/github/confirm.tsx b/apps/app/components/integration/github/confirm.tsx new file mode 100644 index 000000000..ceca1ef6c --- /dev/null +++ b/apps/app/components/integration/github/confirm.tsx @@ -0,0 +1,27 @@ +import { FC } from "react"; +// types +import { IIntegrationData } from "components/integration"; + +type Props = { state: IIntegrationData; handleState: (key: string, valve: any) => void }; + +export const GithubConfirm: FC = ({ state, handleState }) => ( + <> +
Confirm
+
+ + +
+ +); diff --git a/apps/app/components/integration/github/import-data.tsx b/apps/app/components/integration/github/import-data.tsx new file mode 100644 index 000000000..c98797cec --- /dev/null +++ b/apps/app/components/integration/github/import-data.tsx @@ -0,0 +1,27 @@ +import { FC } from "react"; +// types +import { IIntegrationData } from "components/integration"; + +type Props = { state: IIntegrationData; handleState: (key: string, valve: any) => void }; + +export const GithubImportData: FC = ({ state, handleState }) => ( +
+
Import Data
+
+ + +
+
+); diff --git a/apps/app/components/integration/github/issues-select.tsx b/apps/app/components/integration/github/issues-select.tsx new file mode 100644 index 000000000..82decd8fc --- /dev/null +++ b/apps/app/components/integration/github/issues-select.tsx @@ -0,0 +1,27 @@ +import { FC } from "react"; +// types +import { IIntegrationData } from "components/integration"; + +type Props = { state: IIntegrationData; handleState: (key: string, valve: any) => void }; + +export const GithubIssuesSelect: FC = ({ state, handleState }) => ( +
+
Issues Select
+
+ + +
+
+); diff --git a/apps/app/components/integration/github/root.tsx b/apps/app/components/integration/github/root.tsx new file mode 100644 index 000000000..cc30ba0df --- /dev/null +++ b/apps/app/components/integration/github/root.tsx @@ -0,0 +1,168 @@ +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 = ({ + 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({ + state: "import-configure", + }); + const handleIntegrationData = (key: string = "state", value: string) => { + setIntegrationData((previousData) => ({ ...previousData, [key]: value })); + }; + + return ( +
+ +
+
+ +
+
Back
+
+ + +
+
+
+ GithubLogo +
+
+ {integrationWorkflowData.map((_integration, _idx) => ( + <> +
+ <_integration.icon + width={`18px`} + height={`18px`} + color={_idx <= activeIntegrationState() ? "#ffffff" : "#d1d5db"} + /> +
+ {_idx < integrationWorkflowData.length - 1 && ( +
+ {" "} +
+ )} + + ))} +
+
+ +
+
+ {integrationData?.state === "import-configure" && ( + + )} + {integrationData?.state === "import-import-data" && ( + + )} + {integrationData?.state === "migrate-issues" && ( + + )} + {integrationData?.state === "migrate-users" && ( + + )} + {integrationData?.state === "migrate-confirm" && ( + + )} +
+
+
+
+ ); +}; diff --git a/apps/app/components/integration/github/users-select.tsx b/apps/app/components/integration/github/users-select.tsx new file mode 100644 index 000000000..d67325d1a --- /dev/null +++ b/apps/app/components/integration/github/users-select.tsx @@ -0,0 +1,27 @@ +import { FC } from "react"; +// types +import { IIntegrationData } from "components/integration"; + +type Props = { state: IIntegrationData; handleState: (key: string, valve: any) => void }; + +export const GithubUsersSelect: FC = ({ state, handleState }) => ( +
+
Users Select
+
+ + +
+
+); diff --git a/apps/app/components/integration/guide.tsx b/apps/app/components/integration/guide.tsx new file mode 100644 index 000000000..366f681f1 --- /dev/null +++ b/apps/app/components/integration/guide.tsx @@ -0,0 +1,162 @@ +import { FC } from "react"; +// next imports +import Link from "next/link"; +import Image from "next/image"; +// icons +import { ArrowRightIcon } from "components/icons"; +import GithubLogo from "public/logos/github-square.png"; +import { ChevronDownIcon } from "@heroicons/react/24/outline"; +// components +import { Loader } from "components/ui"; +import { GithubIntegrationRoot } 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; +}; + +const IntegrationGuide: FC = ({ + workspaceSlug, + provider, + allIntegrations, + allIntegrationsError, + allWorkspaceIntegrations, + allWorkspaceIntegrationsError, + allIntegrationImporters, + allIntegrationImportersError, +}) => ( +
+ {!provider && ( + <> +
Import
+ +
+
+
Relocation Guide
+
+ You can now transfer all the issues that you’ve created in other tracking services. + This tool will guide you to relocate the issue to Plane. +
+
+
+
Read More
+
+ +
+
+
+ +
+ {allIntegrations && !allIntegrationsError ? ( + <> + {allIntegrations && allIntegrations.length > 0 ? ( + <> + {allIntegrations.map((_integration, _idx) => ( +
+
+
+ {_integration?.provider === "github" && ( + GithubLogo + )} +
+
+
+
{_integration?.title}
+
+ 0 +
+
+
+ Activate GitHub integrations on individual projects to sync with + specific repositories. +
+
+
+ + + +
+
+ +
+
+ +
+ {allIntegrationImporters && !allIntegrationImportersError ? ( + <> + {allIntegrationImporters && allIntegrationImporters.length > 0 ? ( + <> + ) : ( +
+ Previous Imports not available. +
+ )} + + ) : ( +
+ + {["", ""].map((_integration, _idx) => ( + + ))} + +
+ )} +
+
+ ))} + + ) : ( +
+ Integrations not available. +
+ )} + + ) : ( +
+ + {["", ""].map((_integration, _idx) => ( + + ))} + +
+ )} +
+ + )} + + {provider && ( + <> + {provider === "github" && ( + + )} + + )} +
+); + +export default IntegrationGuide; diff --git a/apps/app/components/integration/index.ts b/apps/app/components/integration/index.ts new file mode 100644 index 000000000..8bdacd967 --- /dev/null +++ b/apps/app/components/integration/index.ts @@ -0,0 +1,14 @@ +// layout +export * from "./guide"; + +// github integration +// authenticate +export * from "./github/auth"; +// layout +export * from "./github/root"; +// components +export * from "./github/configure"; +export * from "./github/import-data"; +export * from "./github/issues-select"; +export * from "./github/users-select"; +export * from "./github/confirm"; diff --git a/apps/app/constants/fetch-keys.ts b/apps/app/constants/fetch-keys.ts index ce1241a33..44b2c9e2c 100644 --- a/apps/app/constants/fetch-keys.ts +++ b/apps/app/constants/fetch-keys.ts @@ -102,8 +102,10 @@ export const VIEW_DETAILS = (viewId: string) => `VIEW_DETAILS_${viewId}`; export const ISSUE_DETAILS = (issueId: string) => `ISSUE_DETAILS_${issueId}`; export const SUB_ISSUES = (issueId: string) => `SUB_ISSUES_${issueId}`; +// integrations + // Pages export const PAGE_LIST = (pageId: string) => `PAGE_LIST_${pageId}`; export const PAGE_DETAILS = (pageId: string) => `PAGE_DETAILS_${pageId}`; export const PAGE_BLOCK_LIST = (pageId: string) => `PAGE_BLOCK_LIST_${pageId}`; -export const PAGE_BLOCK_DETAILS = (pageId: string) => `PAGE_BLOCK_DETAILS_${pageId}`; \ No newline at end of file +export const PAGE_BLOCK_DETAILS = (pageId: string) => `PAGE_BLOCK_DETAILS_${pageId}`; diff --git a/apps/app/layouts/settings-navbar.tsx b/apps/app/layouts/settings-navbar.tsx index 8ad1cc5c4..48aaf0f14 100644 --- a/apps/app/layouts/settings-navbar.tsx +++ b/apps/app/layouts/settings-navbar.tsx @@ -25,6 +25,10 @@ const SettingsNavbar: React.FC = () => { label: "Integrations", href: `/${workspaceSlug}/settings/integrations`, }, + { + label: "Import/Export", + href: `/${workspaceSlug}/settings/import-export`, + }, ]; const projectLinks: Array<{ diff --git a/apps/app/pages/[workspaceSlug]/settings/import-export.tsx b/apps/app/pages/[workspaceSlug]/settings/import-export.tsx new file mode 100644 index 000000000..32ddc3298 --- /dev/null +++ b/apps/app/pages/[workspaceSlug]/settings/import-export.tsx @@ -0,0 +1,113 @@ +// next imports +import type { GetServerSideProps, NextPage } from "next"; +import { useRouter } from "next/router"; +// swr +import useSWR from "swr"; +// lib +import { requiredWorkspaceAdmin } from "lib/auth"; +// hooks +import useToast from "hooks/use-toast"; +// layouts +import AppLayout from "layouts/app-layout"; +import IntegrationGuide from "components/integration/guide"; +// ui +import { BreadcrumbItem, Breadcrumbs } from "components/breadcrumbs"; +// types +import { UserAuth, IAppIntegrations } from "types"; +// api services +import WorkspaceIntegrationService from "services/integration"; + +const ImportExport: NextPage = (props) => { + const { setToastAlert } = useToast(); + + const router = useRouter(); + const { workspaceSlug, provider } = router.query as { + workspaceSlug: string; + provider: string; + }; + + // fetching all the integrations available + const { data: allIntegrations, error: allIntegrationsError } = useSWR< + IAppIntegrations[] | undefined, + Error + >( + workspaceSlug ? `ALL_INTEGRATIONS_${workspaceSlug.toUpperCase()}` : null, + workspaceSlug ? () => WorkspaceIntegrationService.listAllIntegrations() : null + ); + + // fetching all the integrations available + const { data: allWorkspaceIntegrations, error: allWorkspaceIntegrationsError } = useSWR< + any | undefined, + Error + >( + workspaceSlug ? `WORKSPACE_INTEGRATIONS_${workspaceSlug.toUpperCase()}` : null, + workspaceSlug + ? () => WorkspaceIntegrationService.listWorkspaceIntegrations(workspaceSlug) + : null + ); + + // fetching list of importers that already initialized + const { data: allIntegrationImporters, error: allIntegrationImportersError } = useSWR< + any | undefined, + Error + >( + workspaceSlug ? `INTEGRATION_IMPORTERS_${workspaceSlug.toUpperCase()}` : null, + workspaceSlug + ? () => WorkspaceIntegrationService.fetchImportExportIntegrationStatus(workspaceSlug) + : null + ); + + return ( + <> + + + + + } + settingsLayout + > +
+ +
+
+ + ); +}; + +export const getServerSideProps: GetServerSideProps = async (ctx) => { + const workspaceSlug = ctx.params?.workspaceSlug as string; + + const memberDetail = await requiredWorkspaceAdmin(workspaceSlug, ctx.req.headers.cookie); + + if (memberDetail === null) { + return { + redirect: { + destination: "/", + permanent: false, + }, + }; + } + + return { + props: { + isOwner: memberDetail?.role === 20, + isMember: memberDetail?.role === 15, + isViewer: memberDetail?.role === 10, + isGuest: memberDetail?.role === 5, + }, + }; +}; + +export default ImportExport; diff --git a/apps/app/services/integration/github.service.ts b/apps/app/services/integration/github.service.ts new file mode 100644 index 000000000..02425968f --- /dev/null +++ b/apps/app/services/integration/github.service.ts @@ -0,0 +1,45 @@ +import APIService from "services/api.service"; + +const { NEXT_PUBLIC_API_BASE_URL } = process.env; + +const integrationServiceType: string = "github"; + +class GithubIntegrationService extends APIService { + constructor() { + super(NEXT_PUBLIC_API_BASE_URL || "http://localhost:8000"); + } + + // fetching all the repositories under the github + async listAllRepositories(workspaceSlug: string, integrationSlug: string): Promise { + return this.get( + `/api/workspaces/${workspaceSlug}/workspace-integrations/${integrationSlug}/github-repositories` + ) + .then((response) => response?.data) + .catch((error) => { + throw error?.response?.data; + }); + } + + // fetching repository stats under the repository eg: users, labels and issues + async fetchRepositoryStats(workspaceSlug: string): Promise { + return this.get(`/api/workspaces/${workspaceSlug}/importers/${integrationServiceType}/`) + .then((response) => response?.data) + .catch((error) => { + throw error?.response?.data; + }); + } + + // migrating repository data in workspace project + async migrateRepositoryStatToProject( + workspaceSlug: string, + integrationSlug: string + ): Promise { + return this.post(`/api/workspaces/${workspaceSlug}/importers/${integrationServiceType}/`) + .then((response) => response?.data) + .catch((error) => { + throw error?.response?.data; + }); + } +} + +export default new GithubIntegrationService(); diff --git a/apps/app/services/integration/index.ts b/apps/app/services/integration/index.ts new file mode 100644 index 000000000..af85241ae --- /dev/null +++ b/apps/app/services/integration/index.ts @@ -0,0 +1,49 @@ +import APIService from "services/api.service"; +// types +import { IAppIntegrations, IWorkspaceIntegrations, IProject } from "types"; + +const { NEXT_PUBLIC_API_BASE_URL } = process.env; + +class WorkspaceIntegrationService extends APIService { + constructor() { + super(NEXT_PUBLIC_API_BASE_URL || "http://localhost:8000"); + } + + // integration available and integration validation starts + async listAllIntegrations(): Promise { + return this.get(`/api/integrations/`) + .then((response) => response?.data) + .catch((error) => { + throw error?.response?.data; + }); + } + + async listWorkspaceIntegrations(workspaceSlug: string): Promise { + return this.get(`/api/workspaces/${workspaceSlug}/workspace-integrations/`) + .then((response) => response?.data) + .catch((error) => { + throw error?.response?.data; + }); + } + // integration available and integration validation ends + + // listing all the projects under the workspace + async listWorkspaceProjects(workspaceSlug: string): Promise { + return this.get(`/api/workspaces/${workspaceSlug}/projects/`) + .then((response) => response?.data) + .catch((error) => { + throw error?.response?.data; + }); + } + + // fetching the status of all the importers that initiated eg: GitHub... + async fetchImportExportIntegrationStatus(workspaceSlug: string): Promise { + return this.get(`/api/workspaces/${workspaceSlug}/importers/`) + .then((response) => response?.data) + .catch((error) => { + throw error?.response?.data; + }); + } +} + +export default new WorkspaceIntegrationService(); diff --git a/apps/app/types/index.d.ts b/apps/app/types/index.d.ts index 684fc3a3d..f4e3262a6 100644 --- a/apps/app/types/index.d.ts +++ b/apps/app/types/index.d.ts @@ -7,6 +7,7 @@ export * from "./invitation"; export * from "./issues"; export * from "./modules"; export * from "./views"; +export * from "./integration"; export * from "./pages"; export type NestedKeyOf = { diff --git a/apps/app/types/integration.d.ts b/apps/app/types/integration.d.ts new file mode 100644 index 000000000..77ea9d35d --- /dev/null +++ b/apps/app/types/integration.d.ts @@ -0,0 +1,35 @@ +// All the app integrations that are available +export interface IAppIntegrations { + author: string; + author: ""; + avatar_url: string | null; + created_at: string; + created_by: string | null; + description: any; + id: string; + metadata: any; + network: number; + provider: string; + redirect_url: string; + title: string; + updated_at: string; + updated_by: string | null; + verified: boolean; + webhook_secret: string; + webhook_url: string; +} + +export interface IWorkspaceIntegrations { + actor: string; + api_token: string; + config: any; + created_at: string; + created_by: string; + id: string; + integration: string; + integration_detail: IIntegrations; + metadata: any; + updated_at: string; + updated_by: string; + workspace: string; +} diff --git a/apps/app/types/workspace.d.ts b/apps/app/types/workspace.d.ts index a479c6362..2871f31df 100644 --- a/apps/app/types/workspace.d.ts +++ b/apps/app/types/workspace.d.ts @@ -44,38 +44,3 @@ export interface ILastActiveWorkspaceDetails { workspace_details: IWorkspace; project_details?: IProjectMember[]; } - -export interface IAppIntegrations { - author: string; - author: ""; - avatar_url: string | null; - created_at: string; - created_by: string | null; - description: any; - id: string; - metadata: any; - network: number; - provider: string; - redirect_url: string; - title: string; - updated_at: string; - updated_by: string | null; - verified: boolean; - webhook_secret: string; - webhook_url: string; -} - -export interface IWorkspaceIntegrations { - actor: string; - api_token: string; - config: any; - created_at: string; - created_by: string; - id: string; - integration: string; - integration_detail: IIntegrations; - metadata: any; - updated_at: string; - updated_by: string; - workspace: string; -}