@lucasschirm/amb-client-react
Version:
Allow to watch records using AMB Websockets from a react application.
58 lines (57 loc) • 2.42 kB
JavaScript
import amb from 'amb-client-js';
import { useState } from 'react';
var ambClient = null;
function getAmbClient() {
if (!ambClient) {
ambClient = amb.getClient();
}
return ambClient;
}
export default function useAMB() {
var _a = useState(new Map()), channelsListeners = _a[0], setChannelsListeners = _a[1];
var subscribe = function (channel, callback) {
var ambClient = getAmbClient();
if (!channelsListeners.has(channel)) {
channelsListeners.set(channel, {
subscription: null,
listeners: []
});
}
var channelListener = channelsListeners.get(channel);
if (!channelListener) {
throw new Error("Channel ".concat(channel, " not found in channelsListeners map."));
}
var listeners = channelListener.listeners;
var idx = listeners.push(callback);
// only subscribe if this is the first listener for the channel
if (idx === 1) {
channelListener.subscription = ambClient.getChannel(channel, {
subscriptionCallback: function (message) {
var channelListener = channelsListeners.get(channel);
var listeners = channelListener === null || channelListener === void 0 ? void 0 : channelListener.listeners;
if (listeners) {
// Call all listeners for this channel
for (var _i = 0, listeners_1 = listeners; _i < listeners_1.length; _i++) {
var listener = listeners_1[_i];
listener(message);
}
}
}
});
}
setChannelsListeners(new Map(channelsListeners));
return function () {
var _a;
var channelListener = channelsListeners.get(channel);
var listeners = channelListener === null || channelListener === void 0 ? void 0 : channelListener.listeners;
if (listeners) {
listeners.splice(idx - 1, 1);
setChannelsListeners(new Map(channelsListeners));
}
if (listeners && listeners.length === 0) {
(_a = channelListener.subscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
}
};
};
return { subscribe: subscribe };
}