usePermissions
You might want to check user permissions inside a custom page. Thatβs the purpose of the usePermissions() hook, which calls the authProvider.getPermissions() method on mount, and returns the result when available.
Usage
// in src/MyPage.js
import * as React from "react";
import Card from '@mui/material/Card';
import CardContent from '@mui/material/CardContent';
import { usePermissions } from 'react-admin';
const MyPage = () => {
    const { isLoading, permissions } = usePermissions();
    return isLoading
        ? (<div>Waiting for permissions...</div>)
        : (
            <Card>
                <CardContent>Lorem ipsum sic dolor amet...</CardContent>
                {permissions === 'admin' &&
                    <CardContent>Sensitive data</CardContent>
                }
            </Card>
        );
}
export default MyPage;
// in src/customRoutes.js
import * as React from "react";
import { Route } from 'react-router-dom';
import MyPage from './MyPage';
export default [
    <Route exact path="/baz" component={MyPage} />,
];
Loading State
The usePermissions hook is optimistic: it doesnβt block rendering during the authProvider call. In the above example, the MyPage component renders even before getting the response from the authProvider. To avoid a blink in the interface while the authProvider is answering, use the isLoading return value of usePermissions():
const MyPage = () => {
    const { isLoading, permissions } = usePermissions();
    if (isLoading) return null;
    return (
        <Card>
            <CardContent>Lorem ipsum sic dolor amet...</CardContent>
            {permissions === 'admin' &&
                <CardContent>Sensitive data</CardContent>
            }
        </Card>
    );
}
Refreshing permissions
Permissions are loaded when the app loads and then cached. If your application requires permissions to be refreshed, for example after a change modifying user permissions, you can use refetch function to trigger reload.
const GrantAdminPermissionsButton = () => {
    const record = useRecordContext();
    const [ update ] = useUpdate();
    const { refetch } = usePermissions();
    const handleClick = () => {
        update(
            "users",
            { id: record.id, data: { admin: true }, previousData: record },
            { onSuccess: refetch },
        );
    }
    return (
        <Button onClick={handleClick}>
            Make user an admin
        </Button>
    )
}
RBAC
When using the ra-rbac module, the 
usePermissions hook returns an array of permissions.
import { usePermissions } from "@react-admin/ra-rbac";
const authProvider = {
    // ...
    getPermissions: () => Promise.resolve([
        { action: "read", resource: "*" },
        { action: ["read", "write"], resource: "users", record: { "id": "123" } },
    ])
};
const { isLoading, permissions } = usePermissions();
// {
//      isLoading: false,
//      permissions: [
//          { action: "read", resource: "*" },
//          { action: ["read", "write"], resource: "users", record: { "id": "123" } },
//      ],
// };
usePermissions is used internally by most ra-rbac components, but you will probably not need to use it directly as react-admin provides high-level RBAC components.
