@helenejs/react
Version:
Real-time Web Apps for Node.js
56 lines • 2.24 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.useSubscribe = useSubscribe;
const react_1 = require("react");
const use_client_1 = require("./use-client");
const isString_1 = __importDefault(require("lodash/isString"));
const useCreation_1 = __importDefault(require("ahooks/lib/useCreation"));
const utils_1 = require("@helenejs/utils");
function useSubscribe({ event, channel = utils_1.NO_CHANNEL, active = true }, callback = null, deps = []) {
if (!(0, isString_1.default)(event)) {
throw new Error('event name is required');
}
if (!(0, isString_1.default)(channel) && active) {
throw new Error('channel name is required');
}
const client = (0, use_client_1.useClient)();
const [ready, setReady] = (0, react_1.useState)(false);
const _channel = (0, useCreation_1.default)(() => client.channel(channel), [client, channel]);
(0, react_1.useEffect)(() => {
if (!callback)
return;
if (!active)
return;
const events = _channel._events[event];
const isAlreadyRegistered = events === callback ||
(Array.isArray(events) && events.includes(callback));
if (!isAlreadyRegistered) {
_channel.on(event, callback);
}
return () => {
_channel.off(event, callback);
};
}, [event, channel, callback, active].concat(deps));
(0, react_1.useEffect)(() => {
if (!active)
return;
_channel
.subscribe(event)
.then(result => setReady(result[event]))
.catch(console.error);
return () => {
// Prevent unsubscribing too early due to simple re-rendering
setTimeout(() => {
// Only unsubscribe if there are no other listeners
if (!_channel._events[event]?.length) {
_channel.unsubscribe(event).catch(console.error);
}
}, 1000);
};
}, [event, channel, active]);
return ready;
}
//# sourceMappingURL=use-subscribe.js.map