diff --git a/packages/react/src/views/ChatBody/ChatBody.js b/packages/react/src/views/ChatBody/ChatBody.js index 721c2d2dc1..5ba5ca82b1 100644 --- a/packages/react/src/views/ChatBody/ChatBody.js +++ b/packages/react/src/views/ChatBody/ChatBody.js @@ -48,6 +48,7 @@ const ChatBody = ({ const [, setIsUserScrolledUp] = useState(false); const [otherUserMessage, setOtherUserMessage] = useState(false); const [isOverflowing, setIsOverflowing] = useState(false); + const firstUnreadMessageIdRef = useRef(''); const { RCInstance, ECOptions } = useContext(RCContext); const showAnnouncement = ECOptions?.showAnnouncement; const messages = useMessageStore((state) => state.messages); @@ -117,7 +118,13 @@ const ChatBody = ({ const isScrolledUp = messageListRef?.current?.scrollTop !== 0; if (isScrolledUp && !('pinned' in message) && !('starred' in message)) { setOtherUserMessage(true); + + if (firstUnreadMessageIdRef.current === '') { + firstUnreadMessageIdRef.current = message._id; + } } + } else { + firstUnreadMessageIdRef.current = ''; } upsertMessage(message, ECOptions?.enableThreads); }, @@ -180,6 +187,7 @@ const ChatBody = ({ setPopupVisible(false); setIsUserScrolledUp(false); setOtherUserMessage(false); + firstUnreadMessageIdRef.current = ''; } }, [ messageListRef, @@ -292,7 +300,10 @@ const ChatBody = ({ threadMessages={threadMessages} /> ) : ( - + )} diff --git a/packages/react/src/views/Message/Message.js b/packages/react/src/views/Message/Message.js index 2a56b20b76..385222d9e5 100644 --- a/packages/react/src/views/Message/Message.js +++ b/packages/react/src/views/Message/Message.js @@ -28,6 +28,7 @@ import useFetchChatData from '../../hooks/useFetchChatData'; const Message = ({ message, + firstUnreadMessageId, type = 'default', sequential = false, lastSequential = false, @@ -338,6 +339,9 @@ const Message = ({ {format(new Date(message.ts), 'MMMM d, yyyy')} )} + {message._id === firstUnreadMessageId ? ( + + ) : null} ); }; diff --git a/packages/react/src/views/Message/Message.styles.js b/packages/react/src/views/Message/Message.styles.js index 9f9358fd92..c18040bf46 100644 --- a/packages/react/src/views/Message/Message.styles.js +++ b/packages/react/src/views/Message/Message.styles.js @@ -66,7 +66,7 @@ export const MessageBodyStyles = { `, }; -export const getMessageDividerStyles = (theme) => { +export const getMessageDividerStyles = (theme, mode) => { const styles = { divider: css` letter-spacing: 0rem; @@ -107,6 +107,42 @@ export const getMessageDividerStyles = (theme) => { height: 1px; background-color: ${theme.colors.secondary}; `, + + unreadDivider: css` + letter-spacing: 0rem; + font-size: 0.75rem; + font-weight: 700; + line-height: 1rem; + position: relative; + display: flex; + z-index: 1000; + align-items: center; + padding-left: 1.25rem; + padding-right: 1.25rem; + @media (max-width: 780px) { + z-index: 1; + } + `, + + unreadDividerContent: css` + color: ${mode === 'light' + ? theme.colors.destructive + : theme.colors.warningForeground}; + font-size: 0.875rem; + font-weight: 750; + margin-left: 10px; + `, + + unreadBar: css` + display: flex; + justify-content: flex-end; + align-items: center; + flex-grow: 1; + height: 0.7px; + background-color: ${mode === 'light' + ? theme.colors.destructive + : theme.colors.warningForeground}; + `, }; return styles; diff --git a/packages/react/src/views/Message/MessageDivider.js b/packages/react/src/views/Message/MessageDivider.js index 617b7615cf..88efe7acc0 100644 --- a/packages/react/src/views/Message/MessageDivider.js +++ b/packages/react/src/views/Message/MessageDivider.js @@ -21,26 +21,50 @@ export const MessageDivider = ({ style ); const { theme } = useTheme(); - const styles = getMessageDividerStyles(theme); + const { mode } = useTheme(); + const styles = getMessageDividerStyles(theme, mode); + + const isUnread = unreadLabel !== undefined; + return ( - - {children && ( - <> - + <> + {isUnread ? ( + + - {children} - {' '} - + {unreadLabel} + + + ) : ( + + {children && ( + <> + + + {children} + + + )} + )} - + ); }; diff --git a/packages/react/src/views/MessageList/MessageList.js b/packages/react/src/views/MessageList/MessageList.js index 14521affd0..2b4823c069 100644 --- a/packages/react/src/views/MessageList/MessageList.js +++ b/packages/react/src/views/MessageList/MessageList.js @@ -9,7 +9,7 @@ import isMessageSequential from '../../lib/isMessageSequential'; import { Message } from '../Message'; import isMessageLastSequential from '../../lib/isMessageLastSequential'; -const MessageList = ({ messages }) => { +const MessageList = ({ messages, firstUnreadMessageId }) => { const showReportMessage = useMessageStore((state) => state.showReportMessage); const messageToReport = useMessageStore((state) => state.messageToReport); const isMessageLoaded = useMessageStore((state) => state.isMessageLoaded); @@ -48,6 +48,7 @@ const MessageList = ({ messages }) => { return (