Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/react/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@
"json5": "^2.2.3",
"normalize.css": "^8.0.1",
"prop-types": "^15.8.1",
"react-virtuoso": "^4.18.1",
"swiper": "^11.1.0",
"zustand": "^4.3.8"
}
Expand Down
19 changes: 15 additions & 4 deletions packages/react/src/store/messageStore.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,16 @@ const useMessageStore = create((set, get) => ({
const uniqueMessages = Array.from(
new Map(allMessages.map((msg) => [msg._id, msg])).values()
);

uniqueMessages.sort((a, b) => new Date(a.ts) - new Date(b.ts));

const cappedMessages =
uniqueMessages.length > 500
? uniqueMessages.slice(-500)
: uniqueMessages;

return {
messages: uniqueMessages,
messages: cappedMessages,
isMessageLoaded: true,
};
}),
Expand All @@ -42,9 +50,12 @@ const useMessageStore = create((set, get) => ({
}));
}
} else {
set((state) => ({
messages: upsertMessage(state.messages, message),
}));
set((state) => {
const updated = upsertMessage(state.messages, message);
return {
messages: updated.length > 500 ? updated.slice(-500) : updated,
};
});
}
},
removeMessage: (messageId) => {
Expand Down
153 changes: 59 additions & 94 deletions packages/react/src/views/ChatBody/ChatBody.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,8 @@ const ChatBody = ({
const { classNames, styleOverrides } = useComponentOverrides('ChatBody');
const { theme, mode } = useTheme();
const styles = getChatbodyStyles(theme, mode);
const [scrollPosition, setScrollPosition] = useState(0);
const [popupVisible, setPopupVisible] = useState(false);
const [, setIsUserScrolledUp] = useState(false);
const [isUserScrolledUp, setIsUserScrolledUp] = useState(false);
const [otherUserMessage, setOtherUserMessage] = useState(false);
const [isOverflowing, setIsOverflowing] = useState(false);
const [firstUnreadMessageId, setFirstUnreadMessageId] = useState(null);
Expand Down Expand Up @@ -206,89 +205,67 @@ const ChatBody = ({
setPopupVisible(false);
};

const handleScroll = useCallback(async () => {
if (messageListRef && messageListRef.current) {
setScrollPosition(messageListRef.current.scrollTop);
setIsUserScrolledUp(
messageListRef.current.scrollTop + messageListRef.current.clientHeight <
messageListRef.current.scrollHeight
);

if (
messageListRef.current.scrollTop === 0 &&
!loadingOlderMessages &&
hasMoreMessages
) {
setLoadingOlderMessages(true);

try {
const olderMessages = await RCInstance.getOlderMessages(
anonymousMode,
ECOptions?.enableThreads
? {
query: {
tmid: {
$exists: false,
},
const loadMoreMessages = useCallback(async () => {
if (!loadingOlderMessages && hasMoreMessages) {
setLoadingOlderMessages(true);
try {
const olderMessages = await RCInstance.getOlderMessages(
anonymousMode,
ECOptions?.enableThreads
? {
query: {
tmid: {
$exists: false,
},
offset,
}
: undefined,
anonymousMode ? false : isChannelPrivate
);
const messageList = messageListRef.current;
if (olderMessages?.messages?.length) {
const previousScrollHeight = messageList.scrollHeight;

setMessages(olderMessages.messages, true);
setMessagesOffset(offset + olderMessages.messages.length);

requestAnimationFrame(() => {
const newScrollHeight = messageList.scrollHeight;
messageList.scrollTop = newScrollHeight - previousScrollHeight;
});
} else {
setHasMoreMessages(false);
}
} catch (error) {
console.error('Error fetching older messages:', error);
},
offset,
}
: undefined,
anonymousMode ? false : isChannelPrivate
);
if (olderMessages?.messages?.length) {
setMessages(olderMessages.messages, true);
setMessagesOffset(offset + olderMessages.messages.length);
} else {
setHasMoreMessages(false);
} finally {
setLoadingOlderMessages(false);
}
} catch (error) {
console.error('Error fetching older messages:', error);
setHasMoreMessages(false);
} finally {
setLoadingOlderMessages(false);
}
}

const isAtBottom = messageListRef?.current?.scrollTop === 0;
if (isAtBottom) {
setPopupVisible(false);
setIsUserScrolledUp(false);
setOtherUserMessage(false);
// Clear unread divider when scrolled to bottom
if (firstUnreadMessageId) {
setFirstUnreadMessageId(null);
}
// Also clear pending unread ref
pendingFirstUnreadRef.current = null;
}
}, [
messageListRef,
offset,
setMessagesOffset,
setMessages,
anonymousMode,
loadingOlderMessages,
hasMoreMessages,
RCInstance,
isChannelPrivate,
anonymousMode,
ECOptions?.enableThreads,
loadingOlderMessages,
setScrollPosition,
setIsUserScrolledUp,
setPopupVisible,
setOtherUserMessage,
firstUnreadMessageId,
offset,
isChannelPrivate,
setMessages,
setMessagesOffset,
]);

const handleAtBottom = useCallback(
(atBottom) => {
setIsUserScrolledUp(!atBottom);
if (atBottom) {
setPopupVisible(false);
setOtherUserMessage(false);
if (firstUnreadMessageId) setFirstUnreadMessageId(null);
pendingFirstUnreadRef.current = null;
}
},
[
setPopupVisible,
setOtherUserMessage,
firstUnreadMessageId,
setFirstUnreadMessageId,
]
);

const showNewMessagesPopup = () => {
setPopupVisible(true);
};
Expand All @@ -307,33 +284,15 @@ const ChatBody = ({
}
};

useEffect(() => {
if (messageListRef.current) {
messageListRef.current.scrollTop = messageListRef.current.scrollHeight;
}
}, [messages]);

useEffect(() => {
checkOverflow();
}, [channelInfo.announcement, showAnnouncement]);
useEffect(() => {
const currentRef = messageListRef.current;
currentRef.addEventListener('scroll', handleScroll);

return () => {
currentRef.removeEventListener('scroll', handleScroll);
};
}, [handleScroll, messageListRef]);

useEffect(() => {
const isScrolledUp =
scrollPosition + messageListRef.current.clientHeight <
messageListRef.current.scrollHeight;

if (isScrolledUp && otherUserMessage) {
if (isUserScrolledUp && otherUserMessage) {
showNewMessagesPopup();
}
}, [scrollPosition, otherUserMessage, messageListRef]);
}, [isUserScrolledUp, otherUserMessage]);

return (
<>
Expand Down Expand Up @@ -398,6 +357,7 @@ const ChatBody = ({
css={styles.chatbodyContainer}
style={{
...styleOverrides,
overflow: 'hidden',
}}
className={`ec-chat-body ${classNames}`}
>
Expand All @@ -422,6 +382,11 @@ const ChatBody = ({
isUserAuthenticated={isUserAuthenticated}
hasMoreMessages={hasMoreMessages}
firstUnreadMessageId={firstUnreadMessageId}
loadMoreMessages={loadMoreMessages}
scrollerRef={(ref) => {
if (messageListRef) messageListRef.current = ref;
}}
onAtBottomStateChange={handleAtBottom}
/>
)}

Expand Down
Loading