stream-chat-react-native-core
Version:
The official React Native and Expo components for Stream Chat, a service for building chat applications
74 lines • 3.46 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useMessageDeliveryStatus = exports.MessageDeliveryStatus = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = require("react");
var _ChatContext = require("../../contexts/chatContext/ChatContext");
var MessageDeliveryStatus = exports.MessageDeliveryStatus = function (MessageDeliveryStatus) {
MessageDeliveryStatus["NOT_SENT_BY_CURRENT_USER"] = "not_sent_by_current_user";
MessageDeliveryStatus["DELIVERED"] = "delivered";
MessageDeliveryStatus["READ"] = "read";
MessageDeliveryStatus["SENT"] = "sent";
return MessageDeliveryStatus;
}({});
var useMessageDeliveryStatus = ({
channel,
lastMessage,
isReadEventsEnabled = true
}) => {
var _useChatContext = (0, _ChatContext.useChatContext)(),
client = _useChatContext.client;
var _useState = (0, _react.useState)(undefined),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
status = _useState2[0],
setStatus = _useState2[1];
var isOwnMessage = (0, _react.useCallback)(message => client.user && message && message.user?.id === client.user.id, [client]);
(0, _react.useEffect)(() => {
if (!lastMessage) {
setStatus(undefined);
}
if (!isReadEventsEnabled) {
setStatus(MessageDeliveryStatus.NOT_SENT_BY_CURRENT_USER);
return;
}
if (!lastMessage?.created_at || !isOwnMessage(lastMessage)) {
return;
}
var msgRef = {
msgId: lastMessage.id,
timestampMs: new Date(lastMessage.created_at).getTime()
};
var readerOfMessage = channel.messageReceiptsTracker.readersForMessage(msgRef);
var deliveredForMessage = channel.messageReceiptsTracker.deliveredForMessage(msgRef);
setStatus(readerOfMessage.length > 1 || readerOfMessage.length === 1 && readerOfMessage[0].id !== client.user?.id ? MessageDeliveryStatus.READ : deliveredForMessage.length > 1 || deliveredForMessage.length === 1 && deliveredForMessage[0].id !== client.user?.id ? MessageDeliveryStatus.DELIVERED : MessageDeliveryStatus.SENT);
}, [channel, client.user?.id, isOwnMessage, isReadEventsEnabled, lastMessage]);
(0, _react.useEffect)(() => {
var handleMessageNew = event => {
if (event.message && !isOwnMessage(event.message)) {
return setStatus(undefined);
}
return setStatus(MessageDeliveryStatus.SENT);
};
var _channel$on = channel.on('message.new', handleMessageNew),
unsubscribe = _channel$on.unsubscribe;
return unsubscribe;
}, [channel, isOwnMessage]);
(0, _react.useEffect)(() => {
if (!isOwnMessage(lastMessage)) return;
var handleMessageDelivered = event => {
if (event.user?.id !== client.user?.id && lastMessage && lastMessage.id === event.last_delivered_message_id) setStatus(MessageDeliveryStatus.DELIVERED);
};
var handleMarkRead = event => {
if (event.user?.id !== client.user?.id) setStatus(MessageDeliveryStatus.READ);
};
var listeners = [channel.on('message.delivered', handleMessageDelivered), channel.on('message.read', handleMarkRead)];
return () => listeners.forEach(l => l.unsubscribe());
}, [channel, client, isOwnMessage, lastMessage]);
return {
status
};
};
exports.useMessageDeliveryStatus = useMessageDeliveryStatus;
//# sourceMappingURL=useMessageDeliveryStatus.js.map