Files
concord/concord-client/src/hooks/usePermissions.ts

109 lines
3.0 KiB
TypeScript
Raw Normal View History

import { useAuthStore } from "@/stores/authStore";
import { Role } from "@/types/database";
import { useMemo } from "react";
import { useParams } from "react-router";
type PermissionsRole = "admin" | "member" | "mod";
const getUserRoleForInstance = (
roles: Role[],
instanceId: string,
): PermissionsRole => {
if (!instanceId) return "member";
const roleEntry = roles.find((r) => r.instanceId === instanceId);
return roleEntry?.role || "member";
};
const getRoleInfo = (role: PermissionsRole) => {
const lowerRole = role.toLowerCase();
switch (lowerRole) {
case "admin":
return { color: "#ff6b6b", priority: 3, name: "Admin" };
case "mod":
return { color: "#4ecdc4", priority: 2, name: "Moderator" };
case "member":
return { color: null, priority: 1, name: "Member" };
default:
return {
color: null,
priority: 0,
name: role.charAt(0).toUpperCase() + role.slice(1),
};
}
};
interface InstancePermissions {
currentUserRole: PermissionsRole;
currentUserRolePriority: number;
canManageMembers: boolean; // Can kick/ban/promote/demote members
canViewAdminPanel: boolean;
}
export const useInstancePermissions = (): InstancePermissions => {
const { instanceId } = useParams<{ instanceId: string }>();
const { user: currentUser } = useAuthStore();
const permissions = useMemo(() => {
let currentUserRole: PermissionsRole = "member";
let currentUserRolePriority = 1;
let canManageMembers = false;
let canViewAdminPanel = false;
if (!currentUser || !instanceId) {
// If no user or instance, user has no permissions within an instance
return {
currentUserRole,
currentUserRolePriority,
canManageMembers,
canViewAdminPanel,
};
}
// If they are a global admin
if (currentUser.admin) {
currentUserRole = "admin";
currentUserRolePriority = 3;
canManageMembers = true;
canViewAdminPanel = true;
return {
currentUserRole: "admin",
currentUserRolePriority: 3,
canManageMembers: true,
canManageRoles: true,
canViewAdminPanel: true,
};
}
// Instance-Specific Role Check
const instanceRole = getUserRoleForInstance(currentUser.roles, instanceId);
const roleInfo = getRoleInfo(instanceRole as PermissionsRole);
currentUserRole = instanceRole;
currentUserRolePriority = roleInfo.priority;
// Define permissions based on role priority
if (roleInfo.priority >= 3) {
// Admin
canManageMembers = true;
canViewAdminPanel = true;
} else if (roleInfo.priority === 2) {
// Moderator
canManageMembers = true;
canViewAdminPanel = false;
} else {
// Member (priority 1 or 0)
canManageMembers = false;
canViewAdminPanel = false;
}
return {
currentUserRole,
currentUserRolePriority,
canManageMembers,
canViewAdminPanel,
};
}, [currentUser, instanceId]);
return permissions as InstancePermissions;
};