matrix-react-sdk
Version:
SDK for matrix.org using React
78 lines (69 loc) • 9.16 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useEventEmitter = useEventEmitter;
exports.useEventEmitterState = useEventEmitterState;
exports.useTypedEventEmitter = useTypedEventEmitter;
exports.useTypedEventEmitterState = useTypedEventEmitterState;
var _react = require("react");
/*
Copyright 2024 New Vector Ltd.
Copyright 2019 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
function useTypedEventEmitter(emitter, eventName, handler) {
useEventEmitter(emitter, eventName, handler);
}
/**
* Hook to wrap an EventEmitter on and off in hook lifecycle
*/
function useEventEmitter(emitter, eventName, handler) {
// Create a ref that stores handler
const savedHandler = (0, _react.useRef)(handler);
// Update ref.current value if handler changes.
(0, _react.useEffect)(() => {
savedHandler.current = handler;
}, [handler]);
(0, _react.useEffect)(() => {
// allow disabling this hook by passing a falsy emitter
if (!emitter) return;
// Create event listener that calls handler function stored in ref
const eventListener = (...args) => savedHandler.current(...args);
// Add event listener
emitter.on(eventName, eventListener);
// Remove event listener on cleanup
return () => {
emitter.off(eventName, eventListener);
};
}, [eventName, emitter] // Re-run if eventName or emitter changes
);
}
/**
* {@link useEventEmitterState}
*/
function useTypedEventEmitterState(emitter, eventName, fn) {
return useEventEmitterState(emitter, eventName, fn);
}
/**
* Creates a state, that can be updated by events.
*
* @param emitter The emitter sending the event
* @param eventName Event name to listen for
* @param fn The callback function, that should return the state value.
* It should have the signature of the event callback, except that all parameters are optional.
* If the params are not set, a default value for the state should be returned.
* @returns State
*/
function useEventEmitterState(emitter, eventName, fn) {
const [value, setValue] = (0, _react.useState)(fn);
const handler = (0, _react.useCallback)((...args) => {
setValue(fn(...args));
}, [fn]);
// re-run when the emitter changes
(0, _react.useEffect)(handler, [emitter]); // eslint-disable-line react-hooks/exhaustive-deps
useEventEmitter(emitter, eventName, handler);
return value;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwidXNlVHlwZWRFdmVudEVtaXR0ZXIiLCJlbWl0dGVyIiwiZXZlbnROYW1lIiwiaGFuZGxlciIsInVzZUV2ZW50RW1pdHRlciIsInNhdmVkSGFuZGxlciIsInVzZVJlZiIsInVzZUVmZmVjdCIsImN1cnJlbnQiLCJldmVudExpc3RlbmVyIiwiYXJncyIsIm9uIiwib2ZmIiwidXNlVHlwZWRFdmVudEVtaXR0ZXJTdGF0ZSIsImZuIiwidXNlRXZlbnRFbWl0dGVyU3RhdGUiLCJ2YWx1ZSIsInNldFZhbHVlIiwidXNlU3RhdGUiLCJ1c2VDYWxsYmFjayJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VFdmVudEVtaXR0ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMTkgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IHsgdXNlUmVmLCB1c2VFZmZlY3QsIHVzZVN0YXRlLCB1c2VDYWxsYmFjayB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgTGlzdGVuZXJNYXAsIFR5cGVkRXZlbnRFbWl0dGVyIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuXG5pbXBvcnQgdHlwZSB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJldmVudHNcIjtcblxudHlwZSBIYW5kbGVyID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlVHlwZWRFdmVudEVtaXR0ZXI8RXZlbnRzIGV4dGVuZHMgc3RyaW5nLCBBcmd1bWVudHMgZXh0ZW5kcyBMaXN0ZW5lck1hcDxFdmVudHM+PihcbiAgICBlbWl0dGVyOiBUeXBlZEV2ZW50RW1pdHRlcjxFdmVudHMsIEFyZ3VtZW50cz4gfCB1bmRlZmluZWQsXG4gICAgZXZlbnROYW1lOiBFdmVudHMsXG4gICAgaGFuZGxlcjogSGFuZGxlcixcbik6IHZvaWQge1xuICAgIHVzZUV2ZW50RW1pdHRlcihlbWl0dGVyLCBldmVudE5hbWUsIGhhbmRsZXIpO1xufVxuXG4vKipcbiAqIEhvb2sgdG8gd3JhcCBhbiBFdmVudEVtaXR0ZXIgb24gYW5kIG9mZiBpbiBob29rIGxpZmVjeWNsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRXZlbnRFbWl0dGVyKGVtaXR0ZXI6IEV2ZW50RW1pdHRlciB8IHVuZGVmaW5lZCwgZXZlbnROYW1lOiBzdHJpbmcgfCBzeW1ib2wsIGhhbmRsZXI6IEhhbmRsZXIpOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSByZWYgdGhhdCBzdG9yZXMgaGFuZGxlclxuICAgIGNvbnN0IHNhdmVkSGFuZGxlciA9IHVzZVJlZihoYW5kbGVyKTtcblxuICAgIC8vIFVwZGF0ZSByZWYuY3VycmVudCB2YWx1ZSBpZiBoYW5kbGVyIGNoYW5nZXMuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgc2F2ZWRIYW5kbGVyLmN1cnJlbnQgPSBoYW5kbGVyO1xuICAgIH0sIFtoYW5kbGVyXSk7XG5cbiAgICB1c2VFZmZlY3QoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIC8vIGFsbG93IGRpc2FibGluZyB0aGlzIGhvb2sgYnkgcGFzc2luZyBhIGZhbHN5IGVtaXR0ZXJcbiAgICAgICAgICAgIGlmICghZW1pdHRlcikgcmV0dXJuO1xuXG4gICAgICAgICAgICAvLyBDcmVhdGUgZXZlbnQgbGlzdGVuZXIgdGhhdCBjYWxscyBoYW5kbGVyIGZ1bmN0aW9uIHN0b3JlZCBpbiByZWZcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXIgPSAoLi4uYXJnczogYW55W10pOiB2b2lkID0+IHNhdmVkSGFuZGxlci5jdXJyZW50KC4uLmFyZ3MpO1xuXG4gICAgICAgICAgICAvLyBBZGQgZXZlbnQgbGlzdGVuZXJcbiAgICAgICAgICAgIGVtaXR0ZXIub24oZXZlbnROYW1lLCBldmVudExpc3RlbmVyKTtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIGV2ZW50IGxpc3RlbmVyIG9uIGNsZWFudXBcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZW1pdHRlci5vZmYoZXZlbnROYW1lLCBldmVudExpc3RlbmVyKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIFtldmVudE5hbWUsIGVtaXR0ZXJdLCAvLyBSZS1ydW4gaWYgZXZlbnROYW1lIG9yIGVtaXR0ZXIgY2hhbmdlc1xuICAgICk7XG59XG5cbnR5cGUgTWFwcGVyPFQ+ID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG4vKipcbiAqIHtAbGluayB1c2VFdmVudEVtaXR0ZXJTdGF0ZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVR5cGVkRXZlbnRFbWl0dGVyU3RhdGU8VCwgRXZlbnRzIGV4dGVuZHMgc3RyaW5nLCBBcmd1bWVudHMgZXh0ZW5kcyBMaXN0ZW5lck1hcDxFdmVudHM+PihcbiAgICBlbWl0dGVyOiBUeXBlZEV2ZW50RW1pdHRlcjxFdmVudHMsIEFyZ3VtZW50cz4gfCB1bmRlZmluZWQsXG4gICAgZXZlbnROYW1lOiBFdmVudHMsXG4gICAgZm46IE1hcHBlcjxUPixcbik6IFQge1xuICAgIHJldHVybiB1c2VFdmVudEVtaXR0ZXJTdGF0ZTxUPihlbWl0dGVyLCBldmVudE5hbWUsIGZuKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RhdGUsIHRoYXQgY2FuIGJlIHVwZGF0ZWQgYnkgZXZlbnRzLlxuICpcbiAqIEBwYXJhbSBlbWl0dGVyIFRoZSBlbWl0dGVyIHNlbmRpbmcgdGhlIGV2ZW50XG4gKiBAcGFyYW0gZXZlbnROYW1lIEV2ZW50IG5hbWUgdG8gbGlzdGVuIGZvclxuICogQHBhcmFtIGZuIFRoZSBjYWxsYmFjayBmdW5jdGlvbiwgdGhhdCBzaG91bGQgcmV0dXJuIHRoZSBzdGF0ZSB2YWx1ZS5cbiAqICAgICAgICAgICBJdCBzaG91bGQgaGF2ZSB0aGUgc2lnbmF0dXJlIG9mIHRoZSBldmVudCBjYWxsYmFjaywgZXhjZXB0IHRoYXQgYWxsIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsLlxuICogICAgICAgICAgIElmIHRoZSBwYXJhbXMgYXJlIG5vdCBzZXQsIGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHN0YXRlIHNob3VsZCBiZSByZXR1cm5lZC5cbiAqIEByZXR1cm5zIFN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VFdmVudEVtaXR0ZXJTdGF0ZTxUPihcbiAgICBlbWl0dGVyOiBFdmVudEVtaXR0ZXIgfCB1bmRlZmluZWQsXG4gICAgZXZlbnROYW1lOiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgZm46IE1hcHBlcjxUPixcbik6IFQge1xuICAgIGNvbnN0IFt2YWx1ZSwgc2V0VmFsdWVdID0gdXNlU3RhdGU8VD4oZm4pO1xuICAgIGNvbnN0IGhhbmRsZXIgPSB1c2VDYWxsYmFjayhcbiAgICAgICAgKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgICAgICBzZXRWYWx1ZShmbiguLi5hcmdzKSk7XG4gICAgICAgIH0sXG4gICAgICAgIFtmbl0sXG4gICAgKTtcbiAgICAvLyByZS1ydW4gd2hlbiB0aGUgZW1pdHRlciBjaGFuZ2VzXG4gICAgdXNlRWZmZWN0KGhhbmRsZXIsIFtlbWl0dGVyXSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gICAgdXNlRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFRQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFTTyxTQUFTQyxvQkFBb0JBLENBQ2hDQyxPQUF5RCxFQUN6REMsU0FBaUIsRUFDakJDLE9BQWdCLEVBQ1o7RUFDSkMsZUFBZSxDQUFDSCxPQUFPLEVBQUVDLFNBQVMsRUFBRUMsT0FBTyxDQUFDO0FBQ2hEOztBQUVBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLGVBQWVBLENBQUNILE9BQWlDLEVBQUVDLFNBQTBCLEVBQUVDLE9BQWdCLEVBQVE7RUFDbkg7RUFDQSxNQUFNRSxZQUFZLEdBQUcsSUFBQUMsYUFBTSxFQUFDSCxPQUFPLENBQUM7O0VBRXBDO0VBQ0EsSUFBQUksZ0JBQVMsRUFBQyxNQUFNO0lBQ1pGLFlBQVksQ0FBQ0csT0FBTyxHQUFHTCxPQUFPO0VBQ2xDLENBQUMsRUFBRSxDQUFDQSxPQUFPLENBQUMsQ0FBQztFQUViLElBQUFJLGdCQUFTLEVBQ0wsTUFBTTtJQUNGO0lBQ0EsSUFBSSxDQUFDTixPQUFPLEVBQUU7O0lBRWQ7SUFDQSxNQUFNUSxhQUFhLEdBQUdBLENBQUMsR0FBR0MsSUFBVyxLQUFXTCxZQUFZLENBQUNHLE9BQU8sQ0FBQyxHQUFHRSxJQUFJLENBQUM7O0lBRTdFO0lBQ0FULE9BQU8sQ0FBQ1UsRUFBRSxDQUFDVCxTQUFTLEVBQUVPLGFBQWEsQ0FBQzs7SUFFcEM7SUFDQSxPQUFPLE1BQU07TUFDVFIsT0FBTyxDQUFDVyxHQUFHLENBQUNWLFNBQVMsRUFBRU8sYUFBYSxDQUFDO0lBQ3pDLENBQUM7RUFDTCxDQUFDLEVBQ0QsQ0FBQ1AsU0FBUyxFQUFFRCxPQUFPLENBQUMsQ0FBRTtFQUMxQixDQUFDO0FBQ0w7QUFJQTtBQUNBO0FBQ0E7QUFDTyxTQUFTWSx5QkFBeUJBLENBQ3JDWixPQUF5RCxFQUN6REMsU0FBaUIsRUFDakJZLEVBQWEsRUFDWjtFQUNELE9BQU9DLG9CQUFvQixDQUFJZCxPQUFPLEVBQUVDLFNBQVMsRUFBRVksRUFBRSxDQUFDO0FBQzFEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0Msb0JBQW9CQSxDQUNoQ2QsT0FBaUMsRUFDakNDLFNBQTBCLEVBQzFCWSxFQUFhLEVBQ1o7RUFDRCxNQUFNLENBQUNFLEtBQUssRUFBRUMsUUFBUSxDQUFDLEdBQUcsSUFBQUMsZUFBUSxFQUFJSixFQUFFLENBQUM7RUFDekMsTUFBTVgsT0FBTyxHQUFHLElBQUFnQixrQkFBVyxFQUN2QixDQUFDLEdBQUdULElBQVcsS0FBSztJQUNoQk8sUUFBUSxDQUFDSCxFQUFFLENBQUMsR0FBR0osSUFBSSxDQUFDLENBQUM7RUFDekIsQ0FBQyxFQUNELENBQUNJLEVBQUUsQ0FDUCxDQUFDO0VBQ0Q7RUFDQSxJQUFBUCxnQkFBUyxFQUFDSixPQUFPLEVBQUUsQ0FBQ0YsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQy9CRyxlQUFlLENBQUNILE9BQU8sRUFBRUMsU0FBUyxFQUFFQyxPQUFPLENBQUM7RUFDNUMsT0FBT2EsS0FBSztBQUNoQiIsImlnbm9yZUxpc3QiOltdfQ==