diff --git a/web/src/pages/ApiServices/Update/index.tsx b/web/src/pages/ApiServices/Update/index.tsx new file mode 100644 index 0000000..1920159 --- /dev/null +++ b/web/src/pages/ApiServices/Update/index.tsx @@ -0,0 +1,199 @@ +import Breadcrumbs from "@/components/ui/breadcrumbs"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import ApiServiceUpdatedModal from "@/feature/ApiServiceUpdatedModal"; +import { useAdmin } from "@/store/admin"; +import { useCallback, useEffect, type FC } from "react"; +import { useForm } from "react-hook-form"; +import { Link, useParams } from "react-router"; + +interface FormData { + name: string; + description: string; + redirectUris: string; + scopes: string; + grantTypes: string; +} + +const ApiServiceEditPage: FC = () => { + const { + register, + handleSubmit, + formState: { errors }, + setValue, + } = useForm({ + defaultValues: { + scopes: "openid", + }, + }); + + const { serviceId } = useParams(); + const apiService = useAdmin((state) => state.viewApiService); + + const loadService = useAdmin((state) => state.fetchApiService); + + const updateApiService = useAdmin((state) => state.updateApiService); + const updating = useAdmin((state) => state.updatingApiService); + const updated = useAdmin((state) => state.updatedApiService); + + const onSubmit = useCallback( + (data: FormData) => { + console.log("Form submitted:", data); + updateApiService({ + 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"], + }); + }, + [updateApiService], + ); + + useEffect(() => { + if (typeof serviceId === "string") loadService(serviceId); + }, [loadService, serviceId]); + + useEffect(() => { + if (apiService != null) { + setValue("name", apiService.name); + setValue("description", apiService.description); + setValue("redirectUris", apiService.redirect_uris.join("\n")); + setValue("scopes", apiService.scopes.join(" ")); + setValue("grantTypes", apiService.grant_types.join(" ")); + } + }, [apiService, setValue]); + + return ( +
+ {updated && } + + +
+ {/* Service Information */} +
+
+

+ Service Information +

+
+
+
+

Name

+ + {errors.name && ( + + {errors.name.message} + + )} +
+ +
+

+ Description +

+ + {errors.description && ( + + {errors.description.message} + + )} +
+
+
+ + {/* OpenID Connect */} +
+
+

OpenID Connect

+
+
+
+

+ Redirect URIs +

+ + {errors.redirectUris && ( + + {errors.redirectUris.message} + + )} +
+ +
+

Scopes

+ + {errors.scopes && ( + + {errors.scopes.message} + + )} +
+ +
+

+ Grant Types +

+ +
+
+
+ + {/* Final Section */} +
+
+

+ Approve & Submit +

+
+
+
+ + + + +
+
+
+
+
+ ); +}; + +export default ApiServiceEditPage;