- MessageInput: autofocus on reply - usePermission: new hook to start working out permissions and actions - fix all build blocking errors
109 lines
3.0 KiB
TypeScript
109 lines
3.0 KiB
TypeScript
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;
|
|
};
|