import { ComponentType } from "react"; import { Abilities, AbilityTuple, Generics, SubjectType } from "@casl/ability"; import { faLock } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { twMerge } from "tailwind-merge"; import { TOrgPermission, useOrgPermission } from "@app/context"; type Props = (T extends AbilityTuple ? { action: T[0]; subject: Extract; } : { action: string; subject: string; }) & { className?: string; containerClassName?: string }; export const withPermission = ( Component: ComponentType, { action, subject, className, containerClassName }: Props["abilities"]> ) => { const HOC = (hocProps: T) => { const { permission } = useOrgPermission(); // akhilmhdh: Set as any due to casl/react ts type bug // REASON: casl due to its type checking can't seem to union even if union intersection is applied if (permission.cannot(action as any, subject)) { return (
Access Restricted
Your role has limited permissions, please
contact your admin to gain access
); } return ; }; HOC.displayName = "WithPermission"; return HOC; };