@@ -4,7 +4,7 @@ import type { PaginatedMessageListContextValue } from '../../../contexts/paginat
44import type { ThreadContextValue } from '../../../contexts/threadContext/ThreadContext' ;
55import type { DefaultStreamChatGenerics } from '../../../types/types' ;
66import { isEditedMessage } from '../../../utils/utils' ;
7- import type { GroupType } from '../hooks/useMessageList' ;
7+ import type { GroupType , MessageType } from '../hooks/useMessageList' ;
88
99export type GetGroupStylesParams <
1010 StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics ,
@@ -19,6 +19,88 @@ export type GetGroupStylesParams<
1919 userId ?: string ;
2020} ;
2121
22+ export type GroupStyle = '' | 'middle' | 'top' | 'bottom' | 'single' ;
23+
24+ const getGroupStyle = <
25+ StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics ,
26+ > (
27+ dateSeparators : DateSeparators ,
28+ message : MessageType < StreamChatGenerics > ,
29+ previousMessage : MessageType < StreamChatGenerics > ,
30+ nextMessage : MessageType < StreamChatGenerics > ,
31+ hideDateSeparators ?: boolean ,
32+ maxTimeBetweenGroupedMessages ?: number ,
33+ ) : GroupStyle [ ] => {
34+ const groupStyles : GroupStyle [ ] = [ ] ;
35+
36+ const isPrevMessageTypeDeleted = previousMessage ?. type === 'deleted' ;
37+ const isNextMessageTypeDeleted = nextMessage ?. type === 'deleted' ;
38+
39+ const userId = message ?. user ?. id || null ;
40+
41+ const isTopMessage =
42+ ! previousMessage ||
43+ previousMessage . type === 'system' ||
44+ previousMessage . type === 'error' ||
45+ userId !== previousMessage ?. user ?. id ||
46+ ! ! isPrevMessageTypeDeleted ||
47+ ( ! hideDateSeparators && dateSeparators [ message . id ] ) ||
48+ isEditedMessage ( previousMessage ) ;
49+
50+ const isBottomMessage =
51+ ! nextMessage ||
52+ nextMessage . type === 'system' ||
53+ nextMessage . type === 'error' ||
54+ userId !== nextMessage ?. user ?. id ||
55+ ! ! isNextMessageTypeDeleted ||
56+ ( ! hideDateSeparators && dateSeparators [ nextMessage . id ] ) ||
57+ ( maxTimeBetweenGroupedMessages !== undefined &&
58+ ( nextMessage . created_at as Date ) . getTime ( ) - ( message . created_at as Date ) . getTime ( ) >
59+ maxTimeBetweenGroupedMessages ) ||
60+ isEditedMessage ( message ) ;
61+
62+ /**
63+ * Add group styles key for top message
64+ */
65+ if ( isTopMessage ) {
66+ groupStyles . push ( 'top' ) ;
67+ }
68+
69+ /**
70+ * Add group styles key for bottom message
71+ */
72+
73+ const isMessageTypeDeleted = message . type === 'deleted' ;
74+ if ( isBottomMessage ) {
75+ /**
76+ * If the bottom message is also the top, or deleted, or an error,
77+ * add the key for single message instead of bottom
78+ */
79+ if ( isTopMessage || isMessageTypeDeleted || message . type === 'error' ) {
80+ groupStyles . splice ( 0 , groupStyles . length ) ;
81+ groupStyles . push ( 'single' ) ;
82+ } else {
83+ groupStyles . push ( 'bottom' ) ;
84+ }
85+ }
86+
87+ /**
88+ * Add the key for all non top or bottom messages, if the message is
89+ * deleted or an error add the key for single otherwise middle
90+ */
91+ if ( ! isTopMessage && ! isBottomMessage ) {
92+ if ( isMessageTypeDeleted || message . type === 'error' ) {
93+ groupStyles . splice ( 0 , groupStyles . length ) ;
94+ groupStyles . push ( 'single' ) ;
95+ } else {
96+ groupStyles . splice ( 0 , groupStyles . length ) ;
97+ groupStyles . push ( 'middle' ) ;
98+ }
99+ }
100+
101+ return groupStyles ;
102+ } ;
103+
22104export const getGroupStyles = <
23105 StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics ,
24106> (
@@ -43,83 +125,19 @@ export const getGroupStyles = <
43125 } ) ;
44126
45127 for ( let i = 0 ; i < messagesFilteredForNonUser . length ; i ++ ) {
46- const previousMessage = messagesFilteredForNonUser [ i - 1 ] as
47- | ( typeof messagesFilteredForNonUser ) [ 0 ]
48- | undefined ;
128+ const previousMessage = messagesFilteredForNonUser [ i - 1 ] ;
49129 const message = messagesFilteredForNonUser [ i ] ;
50- const nextMessage = messagesFilteredForNonUser [ i + 1 ] as
51- | ( typeof messagesFilteredForNonUser ) [ 0 ]
52- | undefined ;
53- const groupStyles : GroupType [ ] = [ ] ;
54-
55- const isPrevMessageTypeDeleted = previousMessage ?. type === 'deleted' ;
56- const isNextMessageTypeDeleted = nextMessage ?. type === 'deleted' ;
57-
58- const userId = message ?. user ?. id || null ;
59-
60- const isTopMessage =
61- ! previousMessage ||
62- previousMessage . type === 'system' ||
63- previousMessage . type === 'error' ||
64- userId !== previousMessage ?. user ?. id ||
65- ! ! isPrevMessageTypeDeleted ||
66- ( ! hideDateSeparators && dateSeparators [ message . id ] ) ||
67- messageGroupStyles [ previousMessage . id ] ?. includes ( 'bottom' ) ||
68- isEditedMessage ( previousMessage ) ;
69-
70- const isBottomMessage =
71- ! nextMessage ||
72- nextMessage . type === 'system' ||
73- nextMessage . type === 'error' ||
74- userId !== nextMessage ?. user ?. id ||
75- ! ! isNextMessageTypeDeleted ||
76- ( ! hideDateSeparators && dateSeparators [ nextMessage . id ] ) ||
77- ( maxTimeBetweenGroupedMessages !== undefined &&
78- nextMessage . created_at . getTime ( ) - message . created_at . getTime ( ) >
79- maxTimeBetweenGroupedMessages ) ||
80- isEditedMessage ( message ) ;
81-
82- /**
83- * Add group styles key for top message
84- */
85- if ( isTopMessage ) {
86- groupStyles . push ( 'top' ) ;
87- }
88-
89- /**
90- * Add group styles key for bottom message
91- */
92-
93- const isMessageTypeDeleted = message . type === 'deleted' ;
94- if ( isBottomMessage ) {
95- /**
96- * If the bottom message is also the top, or deleted, or an error,
97- * add the key for single message instead of bottom
98- */
99- if ( isTopMessage || isMessageTypeDeleted || message . type === 'error' ) {
100- groupStyles . splice ( 0 , groupStyles . length ) ;
101- groupStyles . push ( 'single' ) ;
102- } else {
103- groupStyles . push ( 'bottom' ) ;
104- }
105- }
106-
107- /**
108- * Add the key for all non top or bottom messages, if the message is
109- * deleted or an error add the key for single otherwise middle
110- */
111- if ( ! isTopMessage && ! isBottomMessage ) {
112- if ( isMessageTypeDeleted || message . type === 'error' ) {
113- groupStyles . splice ( 0 , groupStyles . length ) ;
114- groupStyles . push ( 'single' ) ;
115- } else {
116- groupStyles . splice ( 0 , groupStyles . length ) ;
117- groupStyles . push ( 'middle' ) ;
118- }
119- }
130+ const nextMessage = messagesFilteredForNonUser [ i + 1 ] ;
120131
121132 if ( message . id ) {
122- messageGroupStyles [ message . id ] = groupStyles ;
133+ messageGroupStyles [ message . id ] = getGroupStyle (
134+ dateSeparators ,
135+ message ,
136+ previousMessage ,
137+ nextMessage ,
138+ hideDateSeparators ,
139+ maxTimeBetweenGroupedMessages ,
140+ ) ;
123141 }
124142 }
125143
0 commit comments