From 35cff782e100ed595afaaa7651f6dcf277a2a128 Mon Sep 17 00:00:00 2001 From: Shreyas Singh Date: Sat, 11 Nov 2023 00:45:17 +0530 Subject: [PATCH] Add frontend files for cloudflare workers integration --- .../cloudflare-workers/authorize.tsx | 92 ++++++++++ .../cloudflare-workers/create.tsx | 158 ++++++++++++++++++ 2 files changed, 250 insertions(+) create mode 100644 frontend/src/pages/integrations/cloudflare-workers/authorize.tsx create mode 100644 frontend/src/pages/integrations/cloudflare-workers/create.tsx diff --git a/frontend/src/pages/integrations/cloudflare-workers/authorize.tsx b/frontend/src/pages/integrations/cloudflare-workers/authorize.tsx new file mode 100644 index 000000000..3b46751fc --- /dev/null +++ b/frontend/src/pages/integrations/cloudflare-workers/authorize.tsx @@ -0,0 +1,92 @@ +import { useState } from "react"; +import { useRouter } from "next/router"; + +import { + useSaveIntegrationAccessToken +} from "@app/hooks/api"; + +import { Button,Card, CardTitle, FormControl, Input } from "../../../components/v2"; + +export default function CloudflareWorkersIntegrationPage() { + const router = useRouter(); + const { mutateAsync } = useSaveIntegrationAccessToken(); + + const [accessKey, setAccessKey] = useState(""); + const [accessKeyErrorText, setAccessKeyErrorText] = useState(""); + const [accountId, setAccountId] = useState(""); + const [accountIdErrorText, setAccountIdErrorText] = useState(""); + const [isLoading, setIsLoading] = useState(false); + + const handleButtonClick = async () => { + try { + setAccessKeyErrorText(""); + setAccountIdErrorText(""); + if (accessKey.length === 0 || accountId.length === 0) { + if (accessKey.length === 0) setAccessKeyErrorText("API token cannot be blank!"); + if (accountId.length === 0) setAccountIdErrorText("Account ID cannot be blank!"); + return; + } + + setIsLoading(true); + + const integrationAuth = await mutateAsync({ + workspaceId: localStorage.getItem("projectData.id"), + integration: "cloudflare-workers", + accessId: accountId, + accessToken: accessKey + }); + + setAccessKey(""); + setAccountId(""); + setIsLoading(false); + + router.push(`/integrations/cloudflare-workers/create?integrationAuthId=${integrationAuth._id}`); + } catch (err) { + console.error(err); + } + } + + return ( +
+ + Cloudflare Workers Integration + + setAccessKey(e.target.value)} + /> + + + setAccountId(e.target.value)} + /> + + + +
+ ); +} + +CloudflareWorkersIntegrationPage.requireAuth = true; \ No newline at end of file diff --git a/frontend/src/pages/integrations/cloudflare-workers/create.tsx b/frontend/src/pages/integrations/cloudflare-workers/create.tsx new file mode 100644 index 000000000..f019e7ff6 --- /dev/null +++ b/frontend/src/pages/integrations/cloudflare-workers/create.tsx @@ -0,0 +1,158 @@ +import { useEffect,useState } from "react"; +import { useRouter } from "next/router"; +import queryString from "query-string"; + +import { + useCreateIntegration +, useGetWorkspaceById } from "@app/hooks/api"; + +import { Button, Card, CardTitle, FormControl, Select, SelectItem } from "../../../components/v2"; +import { useGetIntegrationAuthApps, useGetIntegrationAuthById } from "../../../hooks/api/integrationAuth"; + +const cloudflareEnvironments = [ + { name: "Production", slug: "production" } +]; + +export default function CloudflareWorkersIntegrationPage() { + const router = useRouter(); + const { mutateAsync } = useCreateIntegration(); + + const { integrationAuthId } = queryString.parse(router.asPath.split("?")[1]); + const { data: workspace } = useGetWorkspaceById(localStorage.getItem("projectData.id") ?? ""); + const { data: integrationAuth } = useGetIntegrationAuthById((integrationAuthId as string) ?? ""); + const { data: integrationAuthApps } = useGetIntegrationAuthApps({ + integrationAuthId: (integrationAuthId as string) ?? "" + }); + + const [selectedSourceEnvironment, setSelectedSourceEnvironment] = useState(""); + const [targetApp, setTargetApp] = useState(""); + const [targetAppId, setTargetAppId] = useState(""); + const [targetEnvironment, setTargetEnvironment] = useState(""); + + const [isLoading, setIsLoading] = useState(false); + + useEffect(() => { + if (workspace) { + setSelectedSourceEnvironment(workspace.environments[0].slug); + } + }, [workspace]); + + useEffect(() => { + if (integrationAuthApps) { + if (integrationAuthApps.length > 0) { + setTargetApp(integrationAuthApps[0].name); + setTargetAppId(String(integrationAuthApps[0].appId)); + setTargetEnvironment(cloudflareEnvironments[0].slug); + } else { + setTargetApp("none"); + setTargetEnvironment(cloudflareEnvironments[0].slug); + } + } + }, [integrationAuthApps]); + + const handleButtonClick = async () => { + try { + if (!integrationAuth?._id) return; + + setIsLoading(true); + + await mutateAsync({ + integrationAuthId: integrationAuth?._id, + isActive: true, + app: targetApp, + appId: targetAppId, + sourceEnvironment: selectedSourceEnvironment, + targetEnvironment, + secretPath: "/", + }); + + setIsLoading(false); + + router.push(`/integrations/${localStorage.getItem("projectData.id")}`); + } catch(err) { + console.error(err); + } + } + + return integrationAuth && + workspace && + selectedSourceEnvironment && + integrationAuthApps && + targetEnvironment && + targetApp ? ( +
+ + Cloudflare Workers Integration + + + + + + + + + + + +
+ ) : ( +
+ ); +} + +CloudflareWorkersIntegrationPage.requireAuth = true; \ No newline at end of file