@deephaven/golden-layout
Version:
A multi-screen javascript Layout manager
60 lines (58 loc) • 2.37 kB
JavaScript
import { useEffect, useRef } from 'react';
/**
* Listen for an event
* @param eventEmitter The event emitter to listen to
* @param event The event to listen for
* @param handler The handler to call when the event is emitted
* @returns A function to stop listening for the event
*/
export function listenForEvent(eventEmitter, event, handler) {
eventEmitter.on(event, handler);
return () => {
eventEmitter.off(event, handler);
};
}
export function makeListenFunction(event) {
return (eventEmitter, handler) => listenForEvent(eventEmitter, event, handler);
}
export function makeEmitFunction(event) {
return function (eventEmitter) {
for (var _len = arguments.length, parameters = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
parameters[_key - 1] = arguments[_key];
}
eventEmitter.emit(event, ...parameters);
};
}
export function makeUseListenerFunction(event) {
return (eventEmitter, handler) => {
var eventEmitterRef = useRef(null);
var handlerRef = useRef(() => false);
if (eventEmitterRef.current != eventEmitter || handlerRef.current != handler) {
var _eventEmitterRef$curr;
(_eventEmitterRef$curr = eventEmitterRef.current) === null || _eventEmitterRef$curr === void 0 || _eventEmitterRef$curr.off(event, handlerRef.current);
eventEmitter === null || eventEmitter === void 0 || eventEmitter.on(event, handler);
}
eventEmitterRef.current = eventEmitter;
handlerRef.current = handler;
// Cleanup on unmount
// Mounting the listener in useEffect causes a race condition with embed-widget
// where the event is emitted during render before the useEffect runs after render.
useEffect(() => () => {
var _eventEmitterRef$curr2;
return (_eventEmitterRef$curr2 = eventEmitterRef.current) === null || _eventEmitterRef$curr2 === void 0 ? void 0 : _eventEmitterRef$curr2.off(event, handlerRef.current);
}, []);
};
}
/**
* Create listener, emitter, and hook functions for an event
* @param event Name of the event to create functions for
* @returns Listener, Emitter, and Hook functions for the event
*/
export function makeEventFunctions(event) {
return {
listen: makeListenFunction(event),
emit: makeEmitFunction(event),
useListener: makeUseListenerFunction(event)
};
}
//# sourceMappingURL=EventUtils.js.map