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
JavaScript
"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