stream-chat-react-native-core
Version:
The official React Native and Expo components for Stream Chat, a service for building chat applications
48 lines (37 loc) • 1.48 kB
text/typescript
import { useEffect, useRef, useState } from 'react';
import { Event, LocalMessage, UserResponse } from 'stream-chat';
import { useChannelContext } from '../../../contexts/channelContext/ChannelContext';
import { useChatContext } from '../../../contexts/chatContext/ChatContext';
import { useStableCallback } from '../../../hooks';
export const useMessageReadData = ({ message }: { message?: LocalMessage }) => {
const { channel } = useChannelContext();
const { client } = useChatContext();
const messageIdRef = useRef<string>(message?.id);
const calculate = useStableCallback(() => {
if (!message?.created_at) {
return [];
}
const messageRef = {
msgId: message.id,
timestampMs: new Date(message.created_at).getTime(),
};
return channel.messageReceiptsTracker.readersForMessage(messageRef);
});
const [readBy, setReadBy] = useState<UserResponse[]>(() => calculate());
if (!!messageIdRef.current && !!message?.id && messageIdRef.current !== message.id) {
setReadBy(calculate());
messageIdRef.current = message.id;
}
useEffect(() => {
const { unsubscribe } = channel.on('message.read', (event: Event) => {
/**
* An optimization to only re-calculate if the event is received by a different user.
*/
if (event.user?.id !== client.user?.id) {
setReadBy(calculate());
}
});
return unsubscribe;
}, [channel, calculate, client.user?.id]);
return readBy;
};