diff --git a/ui/actions/roles/roles.ts b/ui/actions/roles/roles.ts
index 2c1c26abd0..5b8887e708 100644
--- a/ui/actions/roles/roles.ts
+++ b/ui/actions/roles/roles.ts
@@ -48,6 +48,33 @@ export const getRoles = async ({
}
};
+export const getRoleInfoById = async (roleId: string) => {
+ const session = await auth();
+ const keyServer = process.env.API_BASE_URL;
+ const url = new URL(`${keyServer}/roles/${roleId}`);
+
+ try {
+ const response = await fetch(url.toString(), {
+ method: "GET",
+ headers: {
+ Accept: "application/vnd.api+json",
+ Authorization: `Bearer ${session?.accessToken}`,
+ },
+ });
+
+ if (!response.ok) {
+ throw new Error(`Failed to fetch role info: ${response.statusText}`);
+ }
+
+ const data = await response.json();
+ return parseStringify(data);
+ } catch (error) {
+ return {
+ error: getErrorMessage(error),
+ };
+ }
+};
+
export const addRole = async (formData: FormData) => {
const session = await auth();
const keyServer = process.env.API_BASE_URL;
diff --git a/ui/app/(prowler)/roles/(add-role)/edit/page.tsx b/ui/app/(prowler)/roles/(add-role)/edit/page.tsx
index 34dbd7857c..84341039a6 100644
--- a/ui/app/(prowler)/roles/(add-role)/edit/page.tsx
+++ b/ui/app/(prowler)/roles/(add-role)/edit/page.tsx
@@ -1,17 +1,43 @@
import { redirect } from "next/navigation";
-import React from "react";
+import { Suspense } from "react";
+import { getRoleInfoById } from "@/actions/roles/roles";
+import { SkeletonRoleForm } from "@/components/roles/workflow";
import { EditRoleForm } from "@/components/roles/workflow/forms/edit-role-form";
import { SearchParamsProps } from "@/types";
-export default function EditRolePage({
+export default async function EditRolePage({
searchParams,
}: {
searchParams: SearchParamsProps;
}) {
- if (!searchParams.roleId || Array.isArray(searchParams.roleId)) {
+ const searchParamsKey = JSON.stringify(searchParams || {});
+
+ return (
+ }>
+
+
+ );
+}
+
+const SSRDataRole = async ({
+ searchParams,
+}: {
+ searchParams: SearchParamsProps;
+}) => {
+ const roleId = searchParams.roleId;
+
+ if (!roleId || Array.isArray(roleId)) {
redirect("/roles");
}
- return ;
-}
+ const roleData = await getRoleInfoById(roleId as string);
+
+ if (!roleData || roleData.error) {
+ return
Role not found
;
+ }
+
+ const { attributes } = roleData.data;
+
+ return ;
+};
diff --git a/ui/components/roles/workflow/forms/edit-role-form.tsx b/ui/components/roles/workflow/forms/edit-role-form.tsx
index 5e5c0203fe..a13799cc0c 100644
--- a/ui/components/roles/workflow/forms/edit-role-form.tsx
+++ b/ui/components/roles/workflow/forms/edit-role-form.tsx
@@ -3,7 +3,7 @@
import { zodResolver } from "@hookform/resolvers/zod";
import { Checkbox } from "@nextui-org/react";
import { SaveIcon } from "lucide-react";
-import { useRouter, useSearchParams } from "next/navigation";
+import { useRouter } from "next/navigation";
import { useEffect } from "react";
import { useForm } from "react-hook-form";
import { z } from "zod";
@@ -16,17 +16,19 @@ import { ApiError, editRoleFormSchema } from "@/types";
export type FormValues = z.infer;
-export const EditRoleForm = ({ roleId }: { roleId: string }) => {
+export const EditRoleForm = ({
+ roleId,
+ roleData,
+}: {
+ roleId: string;
+ roleData: FormValues;
+}) => {
const { toast } = useToast();
const router = useRouter();
- const searchParams = useSearchParams();
- const searchRoleId = searchParams.get("roleId") || roleId;
const form = useForm({
resolver: zodResolver(editRoleFormSchema),
- defaultValues: {
- roleId: roleId,
- },
+ defaultValues: roleData,
});
const { watch, setValue } = form;
@@ -66,7 +68,7 @@ export const EditRoleForm = ({ roleId }: { roleId: string }) => {
};
const onSubmitClient = async (values: FormValues) => {
- if (!searchRoleId) {
+ if (!roleId) {
toast({
variant: "destructive",
title: "Error",
@@ -89,7 +91,7 @@ export const EditRoleForm = ({ roleId }: { roleId: string }) => {
);
try {
- const data = await updateRole(formData, searchRoleId);
+ const data = await updateRole(formData, roleId);
if (data?.errors && data.errors.length > 0) {
data.errors.forEach((error: ApiError) => {
diff --git a/ui/types/formSchemas.ts b/ui/types/formSchemas.ts
index 5fb153d723..92f4cc0f99 100644
--- a/ui/types/formSchemas.ts
+++ b/ui/types/formSchemas.ts
@@ -12,7 +12,6 @@ export const addRoleFormSchema = z.object({
});
export const editRoleFormSchema = z.object({
- roleId: z.string().uuid(),
name: z.string().min(1, "Name is required"),
manage_users: z.boolean().default(false),
manage_account: z.boolean().default(false),