import isEqual from 'lodash.isequal'; import { RBACContextState, RBACProviderProps } from './RBAC.types'; interface CheckIfValidArgs { required: R[]; existing: Record; added: Record; blocked: Record; oneOf?: boolean; } export function checkIfRBACValid({ required, existing, blocked, added, oneOf, }: CheckIfValidArgs) { if (!required) { return true; } if (oneOf) { return required.some( (r) => !blocked[`${r}`] && (!!existing[`${r}` as R] || !!added[`${r}`]) ); } return required.every( (r) => !blocked[`${r}`] && (!!existing[`${r}` as R] || !!added[`${r}`]) ); } export function normalizeArr(arr: T[]): Record { if (!arr?.length) return {} as Record; const norm = {} as Record; for (const item of arr) { norm[`${item}` as T] = item; } return { ...norm }; } export function omit(obj: object, key: string) { delete obj[`${key}`]; } export function shouldUpdateRBAC( nextProps: RBACProviderProps, nextState: RBACContextState, currentProps: RBACProviderProps, currentState: RBACContextState ) { if ( !isEqual(nextProps.permissions, currentProps.permissions) || !isEqual(nextProps.permissions, currentState.existingPermissions) ) { return true; } if ( !isEqual(nextProps.roles, currentProps.roles) || !isEqual(nextProps.roles, currentState.existingRoles) ) { return true; } if (!isEqual(nextState.blockedRoles, currentState.blockedRoles)) { return true; } if (!isEqual(nextState.blockedPermissions, currentState.blockedPermissions)) { return true; } if (!isEqual(nextState.addedPermissions, currentState.addedPermissions)) { return true; } if (!isEqual(nextState.addedRoles, currentState.addedRoles)) { return true; } return false; }