47 lines
1.1 KiB
Plaintext
47 lines
1.1 KiB
Plaintext
'use client';
|
|
|
|
import * as React from 'react';
|
|
export function createMessageBus() {
|
|
var listeners = new Map();
|
|
function subscribe(topic, callback) {
|
|
var topicListeners = listeners.get(topic);
|
|
if (!topicListeners) {
|
|
topicListeners = new Set([callback]);
|
|
listeners.set(topic, topicListeners);
|
|
} else {
|
|
topicListeners.add(callback);
|
|
}
|
|
return function () {
|
|
topicListeners.delete(callback);
|
|
if (topicListeners.size === 0) {
|
|
listeners.delete(topic);
|
|
}
|
|
};
|
|
}
|
|
function publish(topic) {
|
|
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
args[_key - 1] = arguments[_key];
|
|
}
|
|
var topicListeners = listeners.get(topic);
|
|
if (topicListeners) {
|
|
topicListeners.forEach(function (callback) {
|
|
return callback.apply(void 0, args);
|
|
});
|
|
}
|
|
}
|
|
return {
|
|
subscribe: subscribe,
|
|
publish: publish
|
|
};
|
|
}
|
|
|
|
/**
|
|
* @ignore - internal hook.
|
|
*/
|
|
export function useMessageBus() {
|
|
var bus = React.useRef();
|
|
if (!bus.current) {
|
|
bus.current = createMessageBus();
|
|
}
|
|
return bus.current;
|
|
} |