diff --git a/frontend/src/base/components/settings/contents/Profile.jsx b/frontend/src/base/components/settings/contents/Profile.jsx
index ad47587..fd0a79c 100644
--- a/frontend/src/base/components/settings/contents/Profile.jsx
+++ b/frontend/src/base/components/settings/contents/Profile.jsx
@@ -7,7 +7,6 @@ import { useNavigate } from "react-router-dom";
import { useAxiosPrivate } from "../../../../service/axios-service";
import { orgStore } from "../../../../store/org-store";
-import { useSessionStore } from "../../../../store/session-store";
import { useNotificationService } from "../../../../service/notification-service";
import "./Profile.css";
@@ -19,7 +18,6 @@ const Profile = () => {
const axios = useAxiosPrivate();
const navigate = useNavigate();
const { selectedOrgId } = orgStore();
- const { sessionDetails } = useSessionStore();
const { notify } = useNotificationService();
const csrfToken = Cookies.get("csrftoken");
@@ -54,13 +52,13 @@ const Profile = () => {
const { data } = await axios.get(
`/api/v1/visitran/${selectedOrgId || "default_org"}/profile`
);
- form.setFieldsValue({ ...data, role: sessionDetails.user_role });
+ form.setFieldsValue(data);
const { first_name, last_name, token } = data;
initialRef.current = { first_name, last_name, token };
} catch (error) {
notify({ error });
}
- }, [selectedOrgId, form, sessionDetails.user_role]);
+ }, [selectedOrgId, form]);
const saveProfile = useCallback(
async (values) => {
@@ -189,22 +187,6 @@ const Profile = () => {
- {/* ---------------------- role ---------------------- */}
-
-
-
-
{/* -------------------- API token ------------------- */}
{
const { sessionDetails } = useSessionStore();
const isOrgAdmin = sessionDetails?.is_org_admin;
- const userRole = sessionDetails?.user_role;
// Build settings children dynamically
const settingsChildren = useMemo(
@@ -171,8 +170,7 @@ const MenuTree = () => {
label: "Settings",
children: settingsChildren,
},
- userRole === "visitran_super_admin" &&
- uacChildren.length > 0 && {
+ uacChildren.length > 0 && {
key: "user_access_control",
icon: ,
label: "User Access Control",
@@ -185,7 +183,7 @@ const MenuTree = () => {
children: notificationsChildren,
},
].filter(Boolean),
- [settingsChildren, uacChildren, notificationsChildren, userRole]
+ [settingsChildren, uacChildren, notificationsChildren]
);
const handleClick = useCallback(
@@ -201,11 +199,9 @@ const MenuTree = () => {
...(notificationsChildren.some((c) => !c.disabled)
? ["notifications"]
: []),
- ...(userRole === "visitran_super_admin" && uacChildren.length > 0
- ? ["user_access_control"]
- : []),
+ ...(uacChildren.length > 0 ? ["user_access_control"] : []),
],
- [notificationsChildren, uacChildren, userRole]
+ [notificationsChildren, uacChildren]
);
return (
diff --git a/frontend/src/base/route-component.jsx b/frontend/src/base/route-component.jsx
index c7e2a1c..a0a1efc 100644
--- a/frontend/src/base/route-component.jsx
+++ b/frontend/src/base/route-component.jsx
@@ -201,22 +201,18 @@ function RouteComponent() {
{UserManagement && (
} />
)}
- {sessionDetails?.user_role === "visitran_super_admin" && (
- <>
- {Roles && } />}
- {Resources && (
- } />
- )}
- {Permissions && (
- } />
- )}
- {SubscriptionAdminPage && (
- }
- />
- )}
- >
+ {Roles && } />}
+ {Resources && (
+ } />
+ )}
+ {Permissions && (
+ } />
+ )}
+ {SubscriptionAdminPage && (
+ }
+ />
)}
{Subscriptions && (
} />
diff --git a/frontend/src/common/helpers.js b/frontend/src/common/helpers.js
index 83a1afe..cf97a53 100644
--- a/frontend/src/common/helpers.js
+++ b/frontend/src/common/helpers.js
@@ -113,10 +113,7 @@ const checkPermission = (resource, action) => {
const sessionDetails = useSessionStore.getState().sessionDetails;
// Handle case when session is expired/undefined/empty (e.g., after logout)
if (!sessionDetails || Object.keys(sessionDetails).length === 0) return false;
- const role = sessionDetails.user_role;
- // Validate user_role exists
- if (!role) return false;
- if (role === "visitran_super_admin") return true;
+ // Always use server-returned permissions — never trust client-side role
return permissions[resource]?.[action] ?? false;
};