diff --git a/packages/ra-core/src/core/useResourceDefinition.ts b/packages/ra-core/src/core/useResourceDefinition.ts index 416d84cf5eb..c204ae1c869 100644 --- a/packages/ra-core/src/core/useResourceDefinition.ts +++ b/packages/ra-core/src/core/useResourceDefinition.ts @@ -1,14 +1,39 @@ import { useSelector } from 'react-redux'; +import merge from 'lodash/merge'; import { getResources } from '../reducer'; import { ResourceDefinition } from '../types'; import { useResourceContext } from './useResourceContext'; +import { useMemo } from 'react'; /** * Hook which returns the definition of the requested resource */ -export const useResourceDefinition = (props): ResourceDefinition => { +export const useResourceDefinition = ( + props: UseResourceDefinitionOptions +): ResourceDefinition => { const resource = useResourceContext(props); const resources = useSelector(getResources); + const { hasCreate, hasEdit, hasList, hasShow } = props; - return resources.find(r => r?.name === resource) || props; + const definition = useMemo(() => { + const definitionFromRedux = resources.find(r => r?.name === resource); + return merge({}, definitionFromRedux, { + hasCreate, + hasEdit, + hasList, + hasShow, + }); + }, [resource, resources, hasCreate, hasEdit, hasList, hasShow]); + + return definition; }; + +export interface UseResourceDefinitionOptions { + readonly resource?: string; + readonly options?: any; + readonly hasList?: boolean; + readonly hasEdit?: boolean; + readonly hasShow?: boolean; + readonly hasCreate?: boolean; + readonly icon?: any; +}