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
JavaScript
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