React Redux Permission controls rendering of permission components & routes using redux.
npm install --save react-redux-permission
- Restrict views and components
- Provide a fallback component for users without permission
- Designed for react-redux
- SSR Support
- Hooks support
import { createStore, compose } from 'redux';
import { combineReducers } from "redux";
import { permissionsReducer as permissions } from "react-redux-permission";
export const configureStore = (initialState = {}) => {
return createStore(
combineReducers({
permissions,
}), initialState,);
}
import React, { useEffect } from "react";
import ReactDOM from "react-dom";
import { configureStore } from "./redux/store";
import { Provider } from "react-redux";
import { PermissionProvider, Show, useAccess } from "react-redux-permission";
const store = configureStore();
const App = () => {
const { hasPermission, definePermission, isLoaded } = useAccess();
useEffect(() => {
definePermission(["feature:read", "feature:write"]);
}, []);
const canRead = hasPermission("feature:read");
if (!isLoaded) return <div>LOADING...</div>;
return (
<div>
<div>feature:read Access ({`${canRead}`})</div>
<div>feature:write Access ({`${canWrite}`})</div>
<Show when="feature:read">
<div>i'm visible because the user has the feature:read permission.</div>
</Show>
<Show
when="feature:write"
fallback={
<div>I'm a fallback that's rendering because the user doesn't have access to feature:delete</div>
}
>
<div>i'm visible because the user has the feature:delete permission.</div>
</Show>
</div>
);
};
ReactDOM.render(
<Provider store={store}>
<PermissionProvider store={store} reducerKey="permissions">
<App />
</PermissionProvider>
</Provider>,
document.getElementById("root")
);
By Wrapping up your application with <PermissionProvider />
, all your hierarchy components will have ability to work with react-redux-permission.
import { PermissionProvider } from "react-redux-permission";
<PermissionProvider store={store} reducerKey="permission">
<App />
</PermissionProvider>
Has 2 available props
params | value | default value | description |
---|---|---|---|
store | object | REQUIRED | Redux store object. |
reducerKey | string | permissionsReducer | State key of your reducer. |
A Component can be use when want to render something conditionally, you can pass permission(s) into when
prop.
import { Show } from "react-redux-permission";
<Show
when="feature:delete"
fallback={
<div>user doesn't have permission to feature:delete</div>
}
>
<div>user have feature:delete permission.</div>
</Show>
Has 2 available props
params | value | default value | description |
---|---|---|---|
when | string / array | REQUIRED | The permission(s) we want to check against. |
fallback | ReactNode | - | What to render when the user doesn't have access. |
A hook gives you access to PermissionContext
context.
isLoaded will be false if definePermission
has never been called. Once definePermission
is called we assume isLoaded is true. This flag can be used to prevent loading the app until permissions have been fetched and loaded.
definePermission(["feature:read", "feature:write"]);
you can use action too, to define permissions through redux as below.
import { definePermission as define } from "react-redux-permission";
import { useDispatch } from 'react-redux';
export const ExampleComponent = () => {
const dispatch = useDispatch();
useEffect(() => {
dispatch(define(["feature:read", "feature:write"]))
},[])
return <div>example component</div>
}
const canRead = hasPermission("feature:read");
const canWrite = hasPermission("feature:write");
const canDelete = hasPermission("feature:delete");
MIT © patelmayankce