110 lines
3.3 KiB
TypeScript
110 lines
3.3 KiB
TypeScript
import type { Permission } from "@kan/shared";
|
|
import { useContext } from "react";
|
|
|
|
import { WorkspaceContext } from "~/providers/workspace";
|
|
import { api } from "~/utils/api";
|
|
|
|
interface UsePermissionsResult {
|
|
permissions: Permission[];
|
|
role: string | null;
|
|
isLoading: boolean;
|
|
hasPermission: (permission: Permission) => boolean;
|
|
canViewCard: boolean;
|
|
canCreateCard: boolean;
|
|
canEditCard: boolean;
|
|
canDeleteCard: boolean;
|
|
canCreateList: boolean;
|
|
canEditList: boolean;
|
|
canDeleteList: boolean;
|
|
canCreateBoard: boolean;
|
|
canEditBoard: boolean;
|
|
canDeleteBoard: boolean;
|
|
canViewComment: boolean;
|
|
canCreateComment: boolean;
|
|
canEditComment: boolean;
|
|
canDeleteComment: boolean;
|
|
canInviteMember: boolean;
|
|
canEditMember: boolean;
|
|
canRemoveMember: boolean;
|
|
canViewWorkspace: boolean;
|
|
canEditWorkspace: boolean;
|
|
}
|
|
|
|
export function usePermissions(): UsePermissionsResult {
|
|
// Check if WorkspaceProvider is available (for public board views, it may not be)
|
|
const workspaceContext = useContext(WorkspaceContext);
|
|
|
|
// If WorkspaceProvider is not available, return safe defaults
|
|
if (!workspaceContext) {
|
|
const emptyPermissions: UsePermissionsResult = {
|
|
permissions: [],
|
|
role: null,
|
|
isLoading: false,
|
|
hasPermission: () => false,
|
|
canViewCard: false,
|
|
canCreateCard: false,
|
|
canEditCard: false,
|
|
canDeleteCard: false,
|
|
canCreateList: false,
|
|
canEditList: false,
|
|
canDeleteList: false,
|
|
canCreateBoard: false,
|
|
canEditBoard: false,
|
|
canDeleteBoard: false,
|
|
canViewComment: false,
|
|
canCreateComment: false,
|
|
canEditComment: false,
|
|
canDeleteComment: false,
|
|
canInviteMember: false,
|
|
canEditMember: false,
|
|
canRemoveMember: false,
|
|
canViewWorkspace: false,
|
|
canEditWorkspace: false,
|
|
};
|
|
return emptyPermissions;
|
|
}
|
|
|
|
const { workspace } = workspaceContext;
|
|
|
|
const { data, isLoading } = api.permission.getMyPermissions.useQuery(
|
|
{ workspacePublicId: workspace.publicId },
|
|
{
|
|
enabled: !!workspace.publicId,
|
|
},
|
|
);
|
|
|
|
const permissions = (data?.permissions ?? []) as Permission[];
|
|
const role = data?.role ?? null;
|
|
|
|
const hasPermission = (permission: Permission): boolean => {
|
|
return permissions.includes(permission);
|
|
};
|
|
|
|
return {
|
|
permissions,
|
|
role,
|
|
isLoading,
|
|
hasPermission,
|
|
canViewCard: hasPermission("card:view"),
|
|
canCreateCard: hasPermission("card:create"),
|
|
canEditCard: hasPermission("card:edit"),
|
|
canDeleteCard: hasPermission("card:delete"),
|
|
canCreateList: hasPermission("list:create"),
|
|
canEditList: hasPermission("list:edit"),
|
|
canDeleteList: hasPermission("list:delete"),
|
|
canCreateBoard: hasPermission("board:create"),
|
|
canEditBoard: hasPermission("board:edit"),
|
|
canDeleteBoard: hasPermission("board:delete"),
|
|
canViewComment: hasPermission("comment:view"),
|
|
canCreateComment: hasPermission("comment:create"),
|
|
canEditComment: hasPermission("comment:edit"),
|
|
canDeleteComment: hasPermission("comment:delete"),
|
|
canInviteMember: hasPermission("member:invite"),
|
|
canEditMember: hasPermission("member:edit"),
|
|
canRemoveMember: hasPermission("member:remove"),
|
|
canViewWorkspace: hasPermission("workspace:view"),
|
|
canEditWorkspace: hasPermission("workspace:edit"),
|
|
};
|
|
}
|
|
|