React SDK
We offer a React SDK for interacting with the Permissions API. The React SDK brings Hooks and other React specific concepts for the Space Blocks Permissions service.
Getting started
The React SDK is designed for use in React applications. It can be used to check permissions for your actions.
Installation
Add the Permissions React SDK NPM package to our project.
- NPM
- Yarn
npm install @spaceblocks/permissions-react
yarn add @spaceblocks/permissions-react
Initialization
Before using the React SDK, you need to implement the Frontend Access Token Flow at your server, to expose an endpoint that can be used to request an Impersonated Access Token for your frontend services.
Instantiate the SDK with the API URL and API Key from the Developer Portal and pass an accessTokenProvider
function, which calls your backend and returns an Impersonated Space Blocks Access Token. Besides that, you need to pass a currentSubjectIdProvider
function, which returns the current subject id (normally the current user id).
Best practice is to wrap your application with the PermissionsProvider
component. This ensures that all hooks and components have access to the PermissionsClient.
import { PermissionsProvider } from '@spaceblocks/permissions-react';
function App {
const accessTokenProvider = () => {
// this function calls Your backend to get the access token
return '<YOUR_IMPERSONATED_ACCESS_TOKEN>';
};
const currentSubjectIdProvider = () => {
// this function returns the current subject id (normally the current user id)
return '<CURRENT_USER_ID>';
};
return (
<PermissionsProvider
currentSubjectIdProvider={currentSubjectIdProvider}
url="<YOUR_PERMISSIONS_URL>"
apiKey="<YOUR_API_KEY>"
accessTokenProvider={accessTokenProvider}
>
<App />
</PermissionsProvider>
);
};
Hooks
The React SDK provides a set of hooks to interact with the Permissions API. The hooks are designed to be used in React function components. The hooks are based on the JavaScript Client SDK and provide a more React specific interface.
usePermissionsClient
The usePermissionsClient
hook returns the PermissionsClient instance. This can be used to call the Permissions API directly.
import { usePermissionsClient } from '@spaceblocks/permissions-react';
const permissionsClient = usePermissionsClient();
useMembers
For current tenant
The useMembers
hook returns the members of the current tenant, which is the tenant from the impersonated access token. It also returns a loading
state, which indicates if the members are currently being loaded.
import { useMembers } from '@spaceblocks/permissions-react';
const { members, isLoading } = useMembers();
// use the members somewhere
const rolesOfAlice = members.subjects['alice'];
For a resource
The useMembers
hook returns a list of members for a given resource, when a resourceTypeId
and resourceId
are passed. It also returns a loading
state, which indicates if the members are currently being loaded.
import { useMembers } from '@spaceblocks/permissions-react';
const { members, isLoading } = useMembers('<RESOURCE_TYPE_ID>', '<RESOURCE_ID>');
// use the members somewhere
const rolesOfAlice = members.subjects['alice'];
useUpsertMembers
For current tenant
The useUpsertMembers
hook returns a function to upsert members for the current tenant. It also returns a loading
state, which indicates that the members are currently being upserted.
import { useUpsertMembers } from '@spaceblocks/permissions-react';
const { upsertMembersAsync, isLoading } = useUpsertMembers();
// call the function somewhere
upsertMembersAsync(
{
'subject-a': ['role-a', 'role-b'],
'subject-b': ['role-c']
},
{
'group-a': ['role-a', 'role-b']
}
);
For a resource
The useUpsertMembers
hook returns a function to upsert members for a given resource, when a resourceTypeId
and resourceId
are passed. It also returns a loading
state, which indicates that the members are currently being upserted.
import { useUpsertMembers } from '@spaceblocks/permissions-react';
const { upsertMembersAsync, isLoading } = useUpsertMembers('<RESOURCE_TYPE_ID>', '<RESOURCE_ID>');
// call the function somewhere
upsertMembersAsync(
{
'subject-a': ['role-a', 'role-b'],
'subject-b': ['role-c']
},
{
'group-a': ['role-a', 'role-b']
}
);
useDeleteMembers
For current tenant
The useDeleteMembers
hook returns a function to delete members for the current tenant. It also returns a loading
state, which indicates that the members are currently being deleted.
import { useDeleteMembers } from '@spaceblocks/permissions-react';
const { deleteMembersAsync, isLoading } = useDeleteMembers();
// call the function somewhere
deleteMembersAsync(['subject-a', 'subject-b'], ['group-a']);
For a resource
The useDeleteMembers
hook returns a function to delete members for a given resource, when a resourceTypeId
and resourceId
are passed. It also returns a loading
state, which indicates that the members are currently being deleted.
import { useDeleteMembers } from '@spaceblocks/permissions-react';
const { deleteMembersAsync, isLoading } = useDeleteMembers('<RESOURCE_TYPE_ID>', '<RESOURCE_ID>');
// call the function somewhere
deleteMembersAsync(['subject-a', 'subject-b'], ['group-a']);
useRoles
The useRoles
hook returns all available roles no matter if they are Build-in or User-defined roles. It also returns a loading
state, which indicates if the roles are currently being loaded.
import { useRoles } from '@spaceblocks/permissions-react';
const { roles, isLoading } = useRoles();
useCreateRole
The useCreateRole
hook returns a function to create a User-defined role. It also returns a loading
state, which indicates that the role is currently being created.
import { useCreateRole } from '@spaceblocks/permissions-react';
const { createRoleAsync, isLoading } = useCreateRole();
// call the function somewhere
createRoleAsync({
name: 'my-role',
permissions: {
tenant: ['permission-a', 'permission-b'],
'resource-type-a': ['permission-a', 'permission-b']
}
});
useUpdateRole
The useUpdateRole
hook returns a function to update the User-defined role with the given roleId
. It also returns a loading
state, which indicates that the role is currently being updated.
import { useUpdateRole } from '@spaceblocks/permissions-react';
const { updateRoleAsync, isLoading } = useUpdateRole('ROLE_ID');
// call the function somewhere
updateRoleAsync({
name: 'my-role',
permissions: {
tenant: ['permission-x', 'permission-b'],
'resource-type-a': ['permission-x', 'permission-b']
}
});
useDeleteRole
The useDeleteRole
hook returns a function to delete a User-defined role. It also returns a loading
state, which indicates that the role is currently being deleted.
import { useDeleteRole } from '@spaceblocks/permissions-react';
const { deleteRoleAsync, isLoading } = useDeleteRole();
// call the function somewhere
deleteRoleAsync('ROLE_ID');