UNPKG

@helenejs/react

Version:

Real-time Web Apps for Node.js

56 lines 2.24 kB
"use strict"; 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