@visx/xychart
Version:
Composable cartesian coordinate chart built with visx primitives
48 lines (46 loc) • 1.98 kB
JavaScript
;
exports.__esModule = true;
exports.default = useEventEmitter;
var _react = require("react");
var _event = require("@visx/event");
var _EventEmitterContext = _interopRequireDefault(require("../context/EventEmitterContext"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Hook for optionally subscribing to a specified EventType,
* and returns emitter for emitting events.
*/
function useEventEmitter( /** Type of event to subscribe to. */
eventType, /** Handler invoked on emission of EventType event. */
handler, /** Optional valid sources for EventType subscription. */
allowedSources) {
var emitter = (0, _react.useContext)(_EventEmitterContext.default);
var allowedSourcesRef = (0, _react.useRef)();
allowedSourcesRef.current = allowedSources; // use ref so allowedSources[] can change without creating new handlers
// wrap emitter.emit so we can enforce stricter type signature
var emit = (0, _react.useCallback)(function (type, event, source) {
if (emitter) {
emitter.emit(type, {
event: event,
svgPoint: (0, _event.localPoint)(event),
source: source
});
}
}, [emitter]);
(0, _react.useEffect)(function () {
if (emitter && eventType && handler) {
// register handler, with source filtering as needed
var handlerWithSourceFilter = function handlerWithSourceFilter(params) {
var _allowedSourcesRef$cu;
if (!allowedSourcesRef.current || params != null && params.source && (_allowedSourcesRef$cu = allowedSourcesRef.current) != null && _allowedSourcesRef$cu.includes(params.source)) {
handler(params);
}
};
emitter.on(eventType, handlerWithSourceFilter);
return function () {
return emitter == null ? void 0 : emitter.off(eventType, handlerWithSourceFilter);
};
}
return undefined;
}, [emitter, eventType, handler]);
return emitter ? emit : null;
}