ra-core
Version:
Core components of react-admin, a frontend Framework for building admin applications on top of REST services, using ES6, React
49 lines • 1.66 kB
JavaScript
import * as React from 'react';
import { createContext, useCallback, useState, useMemo } from 'react';
import isEqual from 'lodash/isEqual.js';
export const ResourceDefinitionContext = createContext({
definitions: {},
register: () => { },
unregister: () => { },
});
/**
* Context to store the current resource Definition.
*
* Use the useResourceDefinition() hook to read the context.
*
* @example
*
* import { useResourceDefinition, useTranslate } from 'ra-core';
*
* const PostMenuItem = () => {
* const { name, icon } = useResourceDefinition({ resource: 'posts' });
*
* return (
* <MenuItem>
* <ListItemIcon>{icon}</ListItemIcon>
* {name}
* </MenuItem>
* );
* };
*/
export const ResourceDefinitionContextProvider = ({ definitions: defaultDefinitions = {}, children, }) => {
const [definitions, setState] = useState(defaultDefinitions);
const register = useCallback((config) => {
setState(prev => isEqual(prev[config.name], config)
? prev
: {
...prev,
[config.name]: config,
});
}, []);
const unregister = useCallback((config) => {
setState(prev => {
const { [config.name]: _, ...rest } = prev;
return rest;
});
}, []);
const contextValue = useMemo(() => ({ definitions, register, unregister }), [definitions] // eslint-disable-line react-hooks/exhaustive-deps
);
return (React.createElement(ResourceDefinitionContext.Provider, { value: contextValue }, children));
};
//# sourceMappingURL=ResourceDefinitionContext.js.map