stream-chat-react-native-core
Version:
The official React Native and Expo components for Stream Chat, a service for building chat applications
81 lines • 4.06 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 _client$user3;
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 => {
var _message$user;
return client.user && message && ((_message$user = message.user) == null ? void 0 : _message$user.id) === client.user.id;
}, [client]);
(0, _react.useEffect)(() => {
var _client$user, _client$user2;
if (!lastMessage) {
setStatus(undefined);
}
if (!isReadEventsEnabled) {
setStatus(MessageDeliveryStatus.NOT_SENT_BY_CURRENT_USER);
return;
}
if (!(lastMessage != null && 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 = client.user) == null ? void 0 : _client$user.id) ? MessageDeliveryStatus.READ : deliveredForMessage.length > 1 || deliveredForMessage.length === 1 && deliveredForMessage[0].id !== ((_client$user2 = client.user) == null ? void 0 : _client$user2.id) ? MessageDeliveryStatus.DELIVERED : MessageDeliveryStatus.SENT);
}, [channel, (_client$user3 = client.user) == null ? void 0 : _client$user3.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 => {
var _event$user, _client$user4;
if (((_event$user = event.user) == null ? void 0 : _event$user.id) !== ((_client$user4 = client.user) == null ? void 0 : _client$user4.id) && lastMessage && lastMessage.id === event.last_delivered_message_id) setStatus(MessageDeliveryStatus.DELIVERED);
};
var handleMarkRead = event => {
var _event$user2, _client$user5;
if (((_event$user2 = event.user) == null ? void 0 : _event$user2.id) !== ((_client$user5 = client.user) == null ? void 0 : _client$user5.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