From 63437d6dc766b6b57b7e7c33c31298c91ee28add Mon Sep 17 00:00:00 2001 From: LandaMm Date: Sat, 31 May 2025 17:31:22 +0200 Subject: [PATCH] feat: credentials modal --- .../ApiServiceCredentialsModal/index.tsx | 65 +++++++++++++++++++ web/src/pages/ApiServices/Create/index.tsx | 30 +++++++-- 2 files changed, 90 insertions(+), 5 deletions(-) create mode 100644 web/src/feature/ApiServiceCredentialsModal/index.tsx diff --git a/web/src/feature/ApiServiceCredentialsModal/index.tsx b/web/src/feature/ApiServiceCredentialsModal/index.tsx new file mode 100644 index 0000000..07e937b --- /dev/null +++ b/web/src/feature/ApiServiceCredentialsModal/index.tsx @@ -0,0 +1,65 @@ +import { createPortal } from "react-dom"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { X } from "lucide-react"; +import { useAdmin } from "@/store/admin"; +import type { ApiServiceCredentials } from "@/types"; + +const download = (credentials: ApiServiceCredentials) => { + const jsonStr = JSON.stringify(credentials, null, 2); + const blob = new Blob([jsonStr], { type: "application/json" }); + const url = URL.createObjectURL(blob); + + const a = document.createElement("a"); + a.href = url; + a.download = `credentials.json`; + a.click(); + + URL.revokeObjectURL(url); +}; + +const ApiServiceCredentialsModal = () => { + const credentials = useAdmin((state) => state.createdCredentials); + const resetCredentials = useAdmin((state) => state.resetCredentials); + + const portalRoot = document.getElementById("portal-root"); + if (!portalRoot || !credentials) return null; + + return createPortal( +
+
+
+

New Credentials

+ +
+
+
+

+ Client ID +

+ +
+
+

+ Client Secret +

+ +
+
+ + +
+
+
+
, + portalRoot, + ); +}; + +export default ApiServiceCredentialsModal; diff --git a/web/src/pages/ApiServices/Create/index.tsx b/web/src/pages/ApiServices/Create/index.tsx index 9ac8f7e..e580b8f 100644 --- a/web/src/pages/ApiServices/Create/index.tsx +++ b/web/src/pages/ApiServices/Create/index.tsx @@ -1,7 +1,9 @@ import Breadcrumbs from "@/components/ui/breadcrumbs"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; -import type { FC } from "react"; +import ApiServiceCredentialsModal from "@/feature/ApiServiceCredentialsModal"; +import { useAdmin } from "@/store/admin"; +import { useCallback, type FC } from "react"; import { useForm } from "react-hook-form"; import { Link } from "react-router"; @@ -26,13 +28,31 @@ const ApiServiceCreatePage: FC = () => { }, }); - const onSubmit = (data: FormData) => { - console.log("Form submitted:", data); - // handle create logic here (e.g. API call) - }; + const createApiService = useAdmin((state) => state.createApiService); + + const credentials = useAdmin((state) => state.createdCredentials); + + const onSubmit = useCallback( + (data: FormData) => { + console.log("Form submitted:", data); + createApiService({ + name: data.name, + description: data.description ?? "", + redirect_uris: data.redirectUris.trim().split("\n"), + scopes: data.scopes.trim().split(" "), + grant_types: data.grantTypes + ? data.grantTypes.trim().split(" ") + : ["authorization_code"], + is_active: data.enabled, + }); + }, + [createApiService], + ); return (
+ {credentials !== null && } +