@matspa/react-tunnels
Version:
A fork of original react-tunnels updated to new context API
67 lines (56 loc) • 1.85 kB
JavaScript
;
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
};
}