recharts
Version:
React charts
35 lines (34 loc) • 1.53 kB
JavaScript
import { useSyncExternalStoreWithSelector } from 'use-sync-external-store/shim/with-selector';
import { useContext } from 'react';
import { RechartsReduxContext } from './RechartsReduxContext';
var noopDispatch = a => a;
export var useAppDispatch = () => {
var context = useContext(RechartsReduxContext);
if (context) {
return context.store.dispatch;
}
return noopDispatch;
};
var noop = () => {};
var addNestedSubNoop = () => noop;
var refEquality = (a, b) => a === b;
/**
* This is a recharts variant of `useSelector` from 'react-redux' package.
*
* The difference is that react-redux version will throw an Error when used outside of Redux context.
*
* This, recharts version, will return undefined instead.
*
* This is because we want to allow using our components outside the Chart wrapper,
* and have people provide all props explicitly.
*
* If however they use the component inside a chart wrapper then those props become optional,
* and we read them from Redux state instead.
*
* @param selector for pulling things out of Redux store; will not be called if the store is not accessible
* @return whatever the selector returned; or undefined when outside of Redux store
*/
export function useAppSelector(selector) {
var context = useContext(RechartsReduxContext);
return useSyncExternalStoreWithSelector(context ? context.subscription.addNestedSub : addNestedSubNoop, context ? context.store.getState : noop, context ? context.store.getState : noop, context ? selector : noop, refEquality);
}