UNPKG

@lucasschirm/amb-client-react

Version:

Allow to watch records using AMB Websockets from a react application.

58 lines (57 loc) 2.42 kB
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 }; }