UNPKG

stream-chat-react-native-core

Version:

The official React Native and Expo components for Stream Chat, a service for building chat applications

138 lines 6.46 kB
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.useChannelPreviewData = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _react = require("react"); var _throttle = _interopRequireDefault(require("lodash/throttle")); var _useIsChannelMuted2 = require("./useIsChannelMuted"); var _useIsChannelPinned = require("./useIsChannelPinned"); var _contexts = require("../../../contexts"); var _hooks = require("../../../hooks"); var setLastMessageThrottleTimeout = 500; var setLastMessageThrottleOptions = { leading: true, trailing: true }; var refreshUnreadCountThrottleTimeout = 400; var refreshUnreadCountThrottleOptions = setLastMessageThrottleOptions; var useChannelPreviewData = (channel, client, forceUpdateOverride) => { var _useState = (0, _react.useState)(0), _useState2 = (0, _slicedToArray2.default)(_useState, 2), forceUpdate = _useState2[0], setForceUpdate = _useState2[1]; var _useState3 = (0, _react.useState)(() => channel.state.latestMessages[channel.state.latestMessages.length - 1]), _useState4 = (0, _slicedToArray2.default)(_useState3, 2), lastMessage = _useState4[0], setLastMessageInner = _useState4[1]; var throttledSetLastMessage = (0, _react.useMemo)(() => (0, _throttle.default)(newLastMessage => setLastMessageInner(newLastMessage), setLastMessageThrottleTimeout, setLastMessageThrottleOptions), []); var setLastMessage = (0, _hooks.useStableCallback)(newLastMessage => throttledSetLastMessage(newLastMessage)); var _useState5 = (0, _react.useState)(channel.countUnread()), _useState6 = (0, _slicedToArray2.default)(_useState5, 2), unread = _useState6[0], setUnread = _useState6[1]; var _useIsChannelMuted = (0, _useIsChannelMuted2.useIsChannelMuted)(channel), muted = _useIsChannelMuted.muted; var pinned = (0, _useIsChannelPinned.useIsChannelPinned)(channel); var _useChannelsContext = (0, _contexts.useChannelsContext)(), contextForceUpdate = _useChannelsContext.forceUpdate; var channelListForceUpdate = forceUpdateOverride != null ? forceUpdateOverride : contextForceUpdate; var channelLastMessage = channel.state.latestMessages[channel.state.latestMessages.length - 1]; var channelLastMessageString = `${channelLastMessage == null ? void 0 : channelLastMessage.id}${channelLastMessage == null ? void 0 : channelLastMessage.updated_at}`; var refreshUnreadCount = (0, _react.useMemo)(() => (0, _throttle.default)(() => { if (muted) { setUnread(0); } else { setUnread(channel.countUnread()); } }, refreshUnreadCountThrottleTimeout, refreshUnreadCountThrottleOptions), [channel, muted]); (0, _react.useEffect)(() => { var unsubscribe = channel.messageComposer.registerDraftEventSubscriptions(); return () => unsubscribe(); }, [channel.messageComposer]); (0, _react.useEffect)(() => { var _client$on = client.on('notification.mark_read', () => { refreshUnreadCount(); }), unsubscribe = _client$on.unsubscribe; return unsubscribe; }, [client, refreshUnreadCount]); (0, _react.useEffect)(() => { setLastMessage(prevLastMessage => channelLastMessage && (channelLastMessage.id !== (prevLastMessage == null ? void 0 : prevLastMessage.id) || channelLastMessage.updated_at !== (prevLastMessage == null ? void 0 : prevLastMessage.updated_at)) ? channelLastMessage : prevLastMessage); refreshUnreadCount(); }, [channelLastMessage, channelLastMessageString, channelListForceUpdate, setLastMessage, refreshUnreadCount]); (0, _react.useEffect)(() => { var handleReadEvent = event => { var _event$user, _event$user2; if (!event.cid) { return; } if (channel.cid !== event.cid) { return; } if ((event == null || (_event$user = event.user) == null ? void 0 : _event$user.id) === client.userID) { setUnread(0); } else if (event != null && (_event$user2 = event.user) != null && _event$user2.id) { setForceUpdate(prev => prev + 1); } }; var readSubscription = client.on('message.read', handleReadEvent); var localReadSubscription = client.on('message.read_locally', handleReadEvent); return () => { readSubscription.unsubscribe(); localReadSubscription.unsubscribe(); }; }, [client, channel]); (0, _react.useEffect)(() => { var handleUnreadEvent = event => { var _event$user3, _client$user; if (!event.cid) { return; } if (channel.cid !== event.cid) { return; } if (((_event$user3 = event.user) == null ? void 0 : _event$user3.id) !== ((_client$user = client.user) == null ? void 0 : _client$user.id)) { return; } setUnread(channel.countUnread()); }; var _client$on2 = client.on('notification.mark_unread', handleUnreadEvent), unsubscribe = _client$on2.unsubscribe; return unsubscribe; }, [client, channel]); (0, _react.useEffect)(() => { refreshUnreadCount(); var handleEvent = () => { setLastMessage(channel.state.latestMessages[channel.state.latestMessages.length - 1]); refreshUnreadCount(); }; var handleNewMessageEvent = event => { var message = event.message; if (message && (!message.parent_id || message.show_in_channel)) { setLastMessage(message); refreshUnreadCount(); } }; var handleUpdatedOrDeletedMessage = event => { setLastMessage(prevLastMessage => { var _event$message; if ((prevLastMessage == null ? void 0 : prevLastMessage.id) === ((_event$message = event.message) == null ? void 0 : _event$message.id)) { return event.message; } return prevLastMessage; }); }; var listeners = [channel.on('message.new', handleNewMessageEvent), channel.on('message.updated', handleUpdatedOrDeletedMessage), channel.on('message.deleted', handleUpdatedOrDeletedMessage), channel.on('message.undeleted', handleEvent), channel.on('channel.truncated', handleEvent)]; return () => listeners.forEach(l => l.unsubscribe()); }, [channel, refreshUnreadCount, forceUpdate, channelListForceUpdate, setLastMessage]); return { lastMessage, muted, pinned, unread }; }; exports.useChannelPreviewData = useChannelPreviewData; //# sourceMappingURL=useChannelPreviewData.js.map