UNPKG

ra-core

Version:

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

87 lines 3.71 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useGetPathForRecordCallback = void 0; const react_1 = require("react"); const useResourceContext_1 = require("../core/useResourceContext.cjs"); const useResourceDefinitions_1 = require("../core/useResourceDefinitions.cjs"); const useCanAccessCallback_1 = require("../auth/useCanAccessCallback.cjs"); const useCreatePath_1 = require("./useCreatePath.cjs"); const useGetPathForRecordCallback = (options = {}) => { const resource = (0, useResourceContext_1.useResourceContext)(options); const resourceDefinitions = (0, useResourceDefinitions_1.useResourceDefinitions)(); const createPath = (0, useCreatePath_1.useCreatePath)(); const canAccess = (0, useCanAccessCallback_1.useCanAccessCallback)(); return (0, react_1.useCallback)(async (params) => { const { link, record } = params || {}; const finalResource = params.resource ?? resource; if (!finalResource) { throw new Error('Cannot generate a link for a record without a resource. You must use useGetPathForRecordCallback within a ResourceContextProvider, or pass a resource parameter.'); } const resourceDefinition = resourceDefinitions[finalResource] ?? {}; if (record == null || link === false) { return false; } // When the link prop is not provided, we infer a default value and check whether users // can access it if (link == null) { // check if the user can access the show and edit pages in parallel const [canAccessShow, canAccessEdit] = await Promise.all([ resourceDefinition.hasShow ? canAccess({ action: 'show', resource: finalResource, record, }) : Promise.resolve(false), resourceDefinition.hasEdit ? canAccess({ action: 'edit', resource: finalResource, record, }) : Promise.resolve(false), ]); if (canAccessShow) { return createPath({ resource: finalResource, id: record.id, type: 'show', }); } if (canAccessEdit) { return createPath({ resource: finalResource, id: record.id, type: 'edit', }); } return false; } const linkFunc = typeof link === 'function' ? link : () => link; const linkResult = linkFunc(record, finalResource); if (linkResult === false) { return false; } const linkResultIsPromise = isPromise(linkResult); if (linkResultIsPromise) { const resolvedLink = await linkResult; if (resolvedLink === false) { // already set to false by default return; } return createPath({ resource: finalResource, id: record.id, type: resolvedLink, }); } return createPath({ resource: finalResource, id: record.id, type: linkResult, }); }, [canAccess, createPath, resourceDefinitions, resource]); }; exports.useGetPathForRecordCallback = useGetPathForRecordCallback; const isPromise = (value) => value && typeof value.then === 'function'; //# sourceMappingURL=useGetPathForRecordCallback.js.map