usePermissions
Layer user permissions into your application with hooks
Usage
JavaScript
import { PermissionsProvider, usePermissions } from '@hookit/permissions';
 
const admin = {
  DoThis: true,
  DoThat: true,
  GetThis: true,
  GetThat: true,
};
 
const normal = {
  DoThis: true,
  DoThat: ({ firstArg, secondArg }) => firstArg === secondArg,
  GetThis: false,
  GetThat: ({ firstArg, secondArg }) => firstArg === secondArg,
};
 
const rules = {
  admin,
  normal,
};
 
// Set up PermissionsProvider to pass rules through context
export const App = () => {
  return (
    <PermissionsProvider rules={rules}>
      <Component role='admin' firstArg={1} secondArg={1} />
    </PermissionsProvider>
  );
};
 
// Use permissions hook to check if a user has permissions based on roles
const Component = ({ role, firstArg, secondArg }) => {
  const { canAccess } = usePermissions(role);
 
  const canDoThis = canAccess('DoThis', { firstArg, secondArg });
 
  return (
    <>
      <h3>Current User Role: {role}</h3>
      <p>canDoThis: {canDoThis ? '✅' : '🚫'}</p>
    </>
  );
};TypeScript
import { PermissionsProvider, TPermissions, TRules, usePermissions } from '@hookit/permissions';
 
type Permissions = 'DoThis' | 'DoThat' | 'GetThis' | 'GetThat';
type Roles = 'admin' | 'normal' | 'free';
 
// Use types  to help construct permissions
const admin: TPermissions<Permissions> = {
  DoThis: true,
  DoThat: true,
  GetThis: true,
  GetThat: true,
};
 
type ARGS = { firstArg: number; secondArg: number };
 
const normal: TPermissions<Permissions> = {
  DoThis: true,
  DoThat: ({ firstArg, secondArg }: ARGS) => firstArg === secondArg,
  GetThis: false,
  GetThat: ({ firstArg, secondArg }: ARGS) => firstArg === secondArg,
};
 
// Use types  to help construct rules
const rules: TRules<Permissions, Roles> = {
  admin,
  normal,
};
 
// Set up PermissionsProvider to pass rules through context
export const App: React.FC = () => {
  return (
    <PermissionsProvider rules={rules}>
      <Component role='admin' />
    </PermissionsProvider>
  );
};
 
// Use permissions hook to check if a user has permissions based on roles
const Component: React.FC<{
  role: Roles;
  firstArg: number;
  secondArg: number;
}> = ({ role, firstArg, secondArg }) => {
  const { canAccess } = usePermissions<Permissions, Roles>(role);
 
  const canDoThis = canAccess<ARGS>('DoThis', { firstArg, secondArg });
 
  return (
    <>
      <h3>Current User Role: {role}</h3>
      <p>canDoThis: {canDoThis ? '✅' : '🚫'}</p>
    </>
  );
};You can alternatively use enums instead of unions to help construct your types. Be aware that the pattern for typing components changes:
// type Permissions = 'DoThis' | 'DoThat' | 'GetThis' | 'GetThat';
// type Roles = 'admin' | 'normal' | 'free';
 
enum Permissions {
  DoThis = 'DoThis',
  DoThat = 'DoThat',
  GetThis = 'GetThis',
  GetThat = 'GetThat',
}
enum Roles {
  admin = 'admin',
  normal = 'normal',
  free = 'free',
}
 
//...
 
const { canAccess } = usePermissions<Permissions, Roles>(role); // role must also be a computed from `Roles`
 
const Component: React.FC<{
  role: Roles;
  firstArg: number;
  secondArg: number;
}> = ({ role, firstArg, secondArg }) => {
  const canDoThis = canAccess<ARGS>(Permissions.DoThis, {
    firstArg,
    secondArg,
  });
 
  //...
};Arguments
PermissionsProvider
| Name | Type | Required? | 
|---|---|---|
| rules | TRules<Permissions, Roles> | ✅ | 
usePermissions
| Name | Type | Required? | 
|---|---|---|
| role | Roles | string | ✅ | 
canAccess() from usePermissions
| Name | Type | Required? | 
|---|---|---|
| permission | Permissions | string | ✅ | 
| args | any | ❌ | 
Returns
PermissionsProvider
Just puts your rules into context for usePermissions to access.
usePermissions
| Name | Description | Return Type | 
|---|---|---|
| canAccess | function that returns permissions from context | boolean |