UNPKG

@matspa/react-tunnels

Version:
67 lines (56 loc) 1.85 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useTunnelState; function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } function useTunnelState() { var tunnels = {}; var listeners = {}; var tunnelsDict = {}; var getListeners = function getListeners(id) { return listeners[id] || []; }; var subscribe = function subscribe(id, fn) { listeners[id] = [].concat(_toConsumableArray(getListeners(id)), [fn]); }; var unsubscribe = function unsubscribe(id, fn) { listeners[id] = getListeners(id).filter(function (listener) { return listener !== fn; }); }; var setTunnelProps = function setTunnelProps(id, itemId, props) { tunnels[id] = tunnels[id] || []; tunnelsDict[id] = tunnelsDict[id] || {}; if (props !== null) { if (!tunnelsDict[id][itemId]) { tunnels[id].push(itemId); } tunnelsDict[id][itemId] = props; } else { delete tunnelsDict[id][itemId]; var idx = tunnels[id].indexOf(itemId); tunnels[id] = [].concat(_toConsumableArray(tunnels[id].slice(0, idx)), _toConsumableArray(tunnels[id].slice(idx + 1))); } if (listeners[id]) { listeners[id].forEach(function (fn) { return fn(props); }); } }; var getTunnelProps = function getTunnelProps(id) { if (tunnels[id]) { return tunnels[id].length < 2 ? tunnelsDict[id][tunnels[id][0]] : tunnels[id].map(function (i) { return tunnelsDict[id][i]; }); } return null; }; return { getListeners: getListeners, subscribe: subscribe, unsubscribe: unsubscribe, setTunnelProps: setTunnelProps, getTunnelProps: getTunnelProps }; }