UNPKG

ra-core

Version:

Core components of react-admin, a frontend Framework for building admin applications on top of REST services, using ES6, React

130 lines 4.53 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const react_1 = require("react"); const react_query_1 = require("@tanstack/react-query"); const useAuthProvider_1 = __importDefault(require("./useAuthProvider.cjs")); const useLogoutIfAccessDenied_1 = __importDefault(require("./useLogoutIfAccessDenied.cjs")); const util_1 = require("../util/index.cjs"); const emptyParams = {}; /** * Hook for getting user permissions * * Calls the authProvider.getPermissions() method using react-query. * If the authProvider returns a rejected promise, returns empty permissions. * * The return value updates according to the request state: * * - start: { isPending: true } * - success: { permissions: [any], isPending: false } * - error: { error: [error from provider], isPending: false } * * Useful to enable features based on user permissions * * @param {Object} params Any params you want to pass to the authProvider * * @returns The current auth check state. Destructure as { permissions, error, isPending, refetch }. * * @example * import { usePermissions } from 'react-admin'; * * const PostDetail = () => { * const { isPending, permissions } = usePermissions(); * if (!isPending && permissions == 'editor') { * return <PostEdit /> * } else { * return <PostShow /> * } * }; */ const usePermissions = (params = emptyParams, queryParams = { staleTime: 5 * 60 * 1000, }) => { const authProvider = (0, useAuthProvider_1.default)(); const logoutIfAccessDenied = (0, useLogoutIfAccessDenied_1.default)(); const { onSuccess, onError, onSettled, ...queryOptions } = queryParams ?? {}; const queryResult = (0, react_query_1.useQuery)({ queryKey: ['auth', 'getPermissions', params], queryFn: async ({ signal }) => { if (!authProvider || !authProvider.getPermissions) { return []; } const permissions = await authProvider.getPermissions({ ...params, signal, }); return permissions ?? null; }, ...queryOptions, }); const onSuccessEvent = (0, util_1.useEvent)(onSuccess ?? noop); const onSettledEvent = (0, util_1.useEvent)(onSettled ?? noop); const onErrorEvent = (0, util_1.useEvent)(onError ?? ((error) => { if (process.env.NODE_ENV === 'development') { console.error(error); } logoutIfAccessDenied(error); })); (0, react_1.useEffect)(() => { if (queryResult.data === undefined || queryResult.isFetching) return; onSuccessEvent(queryResult.data); }, [onSuccessEvent, queryResult.data, queryResult.isFetching]); (0, react_1.useEffect)(() => { if (queryResult.error == null || queryResult.isFetching) return; onErrorEvent(queryResult.error); }, [onErrorEvent, queryResult.error, queryResult.isFetching]); (0, react_1.useEffect)(() => { if (queryResult.status === 'pending' || queryResult.isFetching) return; onSettledEvent(queryResult.data, queryResult.error); }, [ onSettledEvent, queryResult.data, queryResult.error, queryResult.status, queryResult.isFetching, ]); const result = (0, react_1.useMemo)(() => ({ ...queryResult, permissions: queryResult.data, }), [queryResult]); return !authProvider || !authProvider.getPermissions ? fakeQueryResult : result; }; exports.default = usePermissions; const noop = () => { }; const fakeQueryResult = { permissions: undefined, data: undefined, dataUpdatedAt: 0, error: null, errorUpdatedAt: 0, errorUpdateCount: 0, failureCount: 0, failureReason: null, fetchStatus: 'idle', isError: false, isInitialLoading: false, isLoading: false, isLoadingError: false, isFetched: true, isFetchedAfterMount: true, isFetching: false, isPaused: false, isPlaceholderData: false, isPending: false, isRefetchError: false, isRefetching: false, isStale: false, isSuccess: true, status: 'success', refetch: () => Promise.resolve(fakeQueryResult), }; module.exports = exports.default; //# sourceMappingURL=usePermissions.js.map