stream-chat-react
Version:
React components to create chat conversations or livestream style chat
37 lines (36 loc) • 1.83 kB
JavaScript
import { useMemo, useRef } from 'react';
export function usePrependedMessagesCount(messages, hasDateSeparator) {
var _a;
var firstRealMessageIndex = hasDateSeparator ? 1 : 0;
var currentFirstMessageId = (_a = messages === null || messages === void 0 ? void 0 : messages[firstRealMessageIndex]) === null || _a === void 0 ? void 0 : _a.id;
var firstMessageId = useRef(currentFirstMessageId);
var earliestMessageId = useRef(currentFirstMessageId);
var previousNumItemsPrepended = useRef(0);
var numItemsPrepended = useMemo(function () {
if (!messages || !messages.length) {
return 0;
}
// if no new messages were prepended, return early (same amount as before)
if (currentFirstMessageId === earliestMessageId.current) {
return previousNumItemsPrepended.current;
}
if (!firstMessageId.current) {
firstMessageId.current = currentFirstMessageId;
}
earliestMessageId.current = currentFirstMessageId;
// if new messages were prepended, find out how many
// start with this number because there cannot be fewer prepended items than before
for (var i = previousNumItemsPrepended.current; i < messages.length; i += 1) {
if (messages[i].id === firstMessageId.current) {
previousNumItemsPrepended.current = i;
return i;
}
}
// if no match has found, we have jumped
firstMessageId.current = currentFirstMessageId;
return 0;
// TODO: there's a bug here, the messages prop is the same array instance (something mutates it)
// that's why the second dependency is necessary
}, [messages, messages === null || messages === void 0 ? void 0 : messages.length]);
return numItemsPrepended;
}