/* eslint-disable no-underscore-dangle */ /* eslint-disable @typescript-eslint/naming-convention */ import type { PropsWithChildren } from "react"; import type { ModuleType } from "@/@types/types/module.types"; import { useAuth } from "@/features/auth/hooks/use-auth"; import { useModuleCtx } from "@/features/modules/context/module-context"; import type { IPermission } from "@/models/permission.model"; interface PermGuardProps extends PropsWithChildren { permission: IPermission; renderDenyComponent?: React.ReactNode; } export const usePermGuard = ({ permission }: PermGuardProps) => { const modulename = useModuleCtx(); const { user } = useAuth(); function checkPermission(): boolean { const isModuleContained = permission.module.includes( modulename as keyof typeof ModuleType, ); const isOperationContained = user?.permissions?.find( (x) => x.operation === permission.operation, ); if (isModuleContained) { if (isOperationContained) { return isOperationContained.type !== "Deny"; } return false; } return false; } return { isCheck: checkPermission(), }; }; const PermGuard = ({ permission, children, renderDenyComponent, }: PermGuardProps) => { const modulename = useModuleCtx(); const { user } = useAuth(); function checkPermission(): boolean { const isModuleContained = permission.module.includes( modulename as keyof typeof ModuleType, ); const isOperationContained = user?.permissions?.find( (x) => x.operation === permission.operation, ); if (isModuleContained) { if (isOperationContained) { return isOperationContained.type === "Deny"; } return true; } return true; } if (checkPermission()) { return renderDenyComponent ?? false; } return children; }; export default PermGuard;