import { ComponentType } from "react"; import { Abilities, AbilityTuple, Generics, SubjectType } from "@casl/ability"; import { twMerge } from "tailwind-merge"; import { AccessRestrictedBanner } from "@app/components/v2"; import { TOrgPermission, useOrgPermission } from "@app/context"; type Props = (T extends AbilityTuple ? { action: T[0]; subject: Extract; } : { action: string; subject: string; }) & { containerClassName?: string }; export const withPermission = ( Component: ComponentType, { action, subject, 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 as any)) { return (
); } return ; }; HOC.displayName = "WithPermission"; return HOC; };