stream-chat-react
Version:
React components to create chat conversations or livestream style chat
39 lines (38 loc) • 1.59 kB
JavaScript
import { useCallback, useEffect, useState } from 'react';
export const useLastDeliveredData = (props) => {
const { channel, lastOwnMessage, messages, returnAllReadData } = props;
const calculateForAll = useCallback(() => messages.reduce((acc, msg) => {
acc[msg.id] = channel.messageReceiptsTracker.deliveredForMessage({
msgId: msg.id,
timestampMs: msg.created_at.getTime(),
});
return acc;
}, {}), [channel, messages]);
const calculateForLastOwn = useCallback(() => {
if (!lastOwnMessage)
return {};
return {
[lastOwnMessage.id]: channel.messageReceiptsTracker.deliveredForMessage({
msgId: lastOwnMessage.id,
timestampMs: lastOwnMessage.created_at.getTime(),
}),
};
}, [channel, lastOwnMessage]);
const [deliveredTo, setDeliveredTo] = useState(returnAllReadData ? calculateForAll : calculateForLastOwn);
useEffect(() => {
if (!returnAllReadData)
return;
setDeliveredTo(calculateForAll);
return channel.on('message.delivered', () => setDeliveredTo(calculateForAll))
.unsubscribe;
}, [channel, calculateForAll, returnAllReadData]);
useEffect(() => {
if (returnAllReadData)
return;
else
setDeliveredTo(calculateForLastOwn);
return channel.on('message.delivered', () => setDeliveredTo(calculateForLastOwn))
.unsubscribe;
}, [channel, calculateForLastOwn, returnAllReadData]);
return deliveredTo;
};