@@ -6,7 +6,6 @@ import React, {
66 ForwardRefRenderFunction ,
77 useImperativeHandle ,
88 forwardRef ,
9- memo ,
109} from "react" ;
1110import { useSelector } from "react-redux" ;
1211import { scroller , animateScroll } from "react-scroll" ;
@@ -34,22 +33,31 @@ import {
3433import { Loader } from "@/shared/ui-kit" ;
3534import { InternalLinkData } from "@/shared/utils" ;
3635import { formatDate } from "@/shared/utils" ;
37- import { Separator } from "./components" ;
38- import { checkIsLastSeenInPreviousDay } from "./utils" ;
3936import styles from "./ChatContent.module.scss" ;
4037
4138export interface ChatContentRef {
4239 scrollToContainerBottom : ( ) => void ;
4340}
4441
42+ export type MessageInfoWithDate = {
43+ day : string ;
44+ date : Date ;
45+ currentMessages : DiscussionMessageWithParsedText [ ] ;
46+ isLastSeenInPreviousDay : boolean ;
47+ isMyMessageFirst : boolean ;
48+ newSeparatorEl : JSX . Element ;
49+ } ;
50+
51+ export type MessageInfoWithDateList = MessageInfoWithDate [ ] ;
52+
4553interface ChatContentInterface {
4654 type : ChatType ;
4755 commonMember : CommonMember | null ;
4856 governanceCircles ?: Circles ;
4957 chatWrapperId : string ;
5058 messages : Record < number , DiscussionMessageWithParsedText [ ] > ;
5159 discussionMessages : DiscussionMessageWithParsedText [ ] | null ;
52- dateList : string [ ] ;
60+ dateList : MessageInfoWithDateList ;
5361 lastSeenItem ?: CommonFeedObjectUserUnique [ "lastSeen" ] ;
5462 hasPermissionToHide : boolean ;
5563 users : User [ ] ;
@@ -101,7 +109,6 @@ const ChatContent: ForwardRefRenderFunction<
101109 onFeedItemClick,
102110 onInternalLinkClick,
103111 isEmpty,
104- messages,
105112 isChatChannel,
106113 isMessageEditAllowed,
107114 fetchReplied,
@@ -115,8 +122,6 @@ const ChatContent: ForwardRefRenderFunction<
115122 const isTabletView = useIsTabletView ( ) ;
116123 const queryParams = useQueryParams ( ) ;
117124 const messageIdParam = queryParams [ QueryParamKey . Message ] ;
118- const shouldDisplayMessagesOnlyWithUncheckedItems =
119- queryParams [ QueryParamKey . Unchecked ] === "true" ;
120125
121126 const [ highlightedMessageId , setHighlightedMessageId ] = useState (
122127 ( ) => ( typeof messageIdParam === "string" && messageIdParam ) || null ,
@@ -238,107 +243,102 @@ const ChatContent: ForwardRefRenderFunction<
238243
239244 return (
240245 < >
241- { dateListReverse . map ( ( day , dayIndex ) => {
242- const date = new Date ( Number ( day ) ) ;
243- const currentMessages = shouldDisplayMessagesOnlyWithUncheckedItems
244- ? messages [ Number ( day ) ] . filter ( ( message ) => message . hasUncheckedItems )
245- : messages [ Number ( day ) ] ;
246- const previousDayMessages =
247- messages [ Number ( dateListReverse [ dayIndex + 1 ] ) ] || [ ] ;
248- const isLastSeenInPreviousDay = checkIsLastSeenInPreviousDay (
249- previousDayMessages ,
250- lastSeenItem ?. id ,
251- ) ;
252- const isMyMessageFirst =
253- checkIsUserDiscussionMessage ( currentMessages [ 0 ] ) &&
254- currentMessages [ 0 ] . ownerId === userId ;
255- const newSeparatorEl = (
256- < li >
257- < Separator > New</ Separator >
258- </ li >
259- ) ;
246+ { dateListReverse . map (
247+ (
248+ {
249+ day,
250+ currentMessages,
251+ date,
252+ isLastSeenInPreviousDay,
253+ isMyMessageFirst,
254+ newSeparatorEl,
255+ } ,
256+ dayIndex ,
257+ ) => {
258+ return (
259+ < Transition
260+ key = { day }
261+ show = { currentMessages . length > 0 }
262+ transition = { isTabletView ? ModalTransition . FadeIn : null }
263+ className = { styles . messageListTransitionContainer }
264+ style = { { zIndex : dateListReverse . length - dayIndex } }
265+ >
266+ { currentMessages . length > 0 && (
267+ < ul id = { chatId } className = { styles . messageList } >
268+ { isLastSeenInPreviousDay &&
269+ ! isMyMessageFirst &&
270+ newSeparatorEl }
271+ < li className = { styles . dateTitle } >
272+ { isToday ( date ) ? "Today" : formatDate ( date ) }
273+ </ li >
274+ { currentMessages . map ( ( message , messageIndex ) => {
275+ const nextMessage = currentMessages [ messageIndex + 1 ] ;
276+ const isMyMessageNext =
277+ checkIsUserDiscussionMessage ( nextMessage ) &&
278+ nextMessage . ownerId === userId ;
279+ const messageEl = isChatChannel ? (
280+ < DMChatMessage
281+ key = { message . id }
282+ user = { user }
283+ discussionMessage = { message }
284+ chatType = { type }
285+ scrollToRepliedMessage = { scrollToRepliedMessageDMChat }
286+ highlighted = { message . id === highlightedMessageId }
287+ hasPermissionToHide = { hasPermissionToHide }
288+ users = { users }
289+ feedItemId = { feedItemId }
290+ commonMember = { commonMember }
291+ governanceCircles = { governanceCircles }
292+ onMessageDelete = { onMessageDelete }
293+ directParent = { directParent }
294+ onUserClick = { onUserClick }
295+ onFeedItemClick = { onFeedItemClick }
296+ onInternalLinkClick = { onInternalLinkClick }
297+ chatChannelId = { chatChannelId }
298+ />
299+ ) : (
300+ < ChatMessage
301+ key = { message . id }
302+ user = { user }
303+ discussionMessage = { message }
304+ chatType = { type }
305+ scrollToRepliedMessage = { scrollToRepliedMessage }
306+ highlighted = { message . id === highlightedMessageId }
307+ hasPermissionToHide = { hasPermissionToHide }
308+ users = { users }
309+ feedItemId = { feedItemId }
310+ commonMember = { commonMember }
311+ governanceCircles = { governanceCircles }
312+ onMessageDelete = { onMessageDelete }
313+ directParent = { directParent }
314+ onUserClick = { onUserClick }
315+ onFeedItemClick = { onFeedItemClick }
316+ onInternalLinkClick = { onInternalLinkClick }
317+ isMessageEditAllowed = { isMessageEditAllowed }
318+ />
319+ ) ;
260320
261- return (
262- < Transition
263- key = { day }
264- show = { currentMessages . length > 0 }
265- transition = { isTabletView ? ModalTransition . FadeIn : null }
266- className = { styles . messageListTransitionContainer }
267- style = { { zIndex : dateListReverse . length - dayIndex } }
268- >
269- { currentMessages . length > 0 && (
270- < ul id = { chatId } className = { styles . messageList } >
271- { isLastSeenInPreviousDay && ! isMyMessageFirst && newSeparatorEl }
272- < li className = { styles . dateTitle } >
273- { isToday ( date ) ? "Today" : formatDate ( date ) }
274- </ li >
275- { currentMessages . map ( ( message , messageIndex ) => {
276- const nextMessage = currentMessages [ messageIndex + 1 ] ;
277- const isMyMessageNext =
278- checkIsUserDiscussionMessage ( nextMessage ) &&
279- nextMessage . ownerId === userId ;
280- const messageEl = isChatChannel ? (
281- < DMChatMessage
282- key = { message . id }
283- user = { user }
284- discussionMessage = { message }
285- chatType = { type }
286- scrollToRepliedMessage = { scrollToRepliedMessageDMChat }
287- highlighted = { message . id === highlightedMessageId }
288- hasPermissionToHide = { hasPermissionToHide }
289- users = { users }
290- feedItemId = { feedItemId }
291- commonMember = { commonMember }
292- governanceCircles = { governanceCircles }
293- onMessageDelete = { onMessageDelete }
294- directParent = { directParent }
295- onUserClick = { onUserClick }
296- onFeedItemClick = { onFeedItemClick }
297- onInternalLinkClick = { onInternalLinkClick }
298- chatChannelId = { chatChannelId }
299- />
300- ) : (
301- < ChatMessage
302- key = { message . id }
303- user = { user }
304- discussionMessage = { message }
305- chatType = { type }
306- scrollToRepliedMessage = { scrollToRepliedMessage }
307- highlighted = { message . id === highlightedMessageId }
308- hasPermissionToHide = { hasPermissionToHide }
309- users = { users }
310- feedItemId = { feedItemId }
311- commonMember = { commonMember }
312- governanceCircles = { governanceCircles }
313- onMessageDelete = { onMessageDelete }
314- directParent = { directParent }
315- onUserClick = { onUserClick }
316- onFeedItemClick = { onFeedItemClick }
317- onInternalLinkClick = { onInternalLinkClick }
318- isMessageEditAllowed = { isMessageEditAllowed }
319- />
320- ) ;
321+ if (
322+ message . id !== lastSeenItem ?. id ||
323+ messageIndex === currentMessages . length - 1 ||
324+ isMyMessageNext
325+ ) {
326+ return messageEl ;
327+ }
321328
322- if (
323- message . id !== lastSeenItem ?. id ||
324- messageIndex === currentMessages . length - 1 ||
325- isMyMessageNext
326- ) {
327- return messageEl ;
328- }
329-
330- return (
331- < React . Fragment key = { message . id } >
332- { messageEl }
333- { newSeparatorEl }
334- </ React . Fragment >
335- ) ;
336- } ) }
337- </ ul >
338- ) }
339- </ Transition >
340- ) ;
341- } ) }
329+ return (
330+ < React . Fragment key = { message . id } >
331+ { messageEl }
332+ { newSeparatorEl }
333+ </ React . Fragment >
334+ ) ;
335+ } ) }
336+ </ ul >
337+ ) }
338+ </ Transition >
339+ ) ;
340+ } ,
341+ ) }
342342 { isLoading && (
343343 < div className = { styles . loaderContainer } >
344344 < Loader />
@@ -356,4 +356,4 @@ const ChatContent: ForwardRefRenderFunction<
356356 ) ;
357357} ;
358358
359- export default memo ( forwardRef ( ChatContent ) ) ;
359+ export default forwardRef ( ChatContent ) ;
0 commit comments