Skip to content

Commit 9f2bb15

Browse files
authored
fix: inline date separator not being rendered for deleted message appropriately (#2716)
1 parent 5ff6ad4 commit 9f2bb15

File tree

2 files changed

+99
-76
lines changed

2 files changed

+99
-76
lines changed

package/src/components/MessageList/utils/getDateSeparators.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,13 @@ export const getDateSeparators = <
3636
const isDeletedMessageVisibleToSender =
3737
deletedMessagesVisibilityType === 'sender' || deletedMessagesVisibilityType === 'always';
3838

39+
const isDeletedMessageVisibleToReceiver =
40+
deletedMessagesVisibilityType === 'receiver' || deletedMessagesVisibilityType === 'always';
41+
3942
return (
40-
!isMessageTypeDeleted || (userId === message.user?.id && isDeletedMessageVisibleToSender)
43+
!isMessageTypeDeleted ||
44+
(userId === message.user?.id && isDeletedMessageVisibleToSender) ||
45+
(userId !== message.user?.id && isDeletedMessageVisibleToReceiver)
4146
);
4247
});
4348

package/src/components/MessageList/utils/getGroupStyles.ts

Lines changed: 93 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import type { PaginatedMessageListContextValue } from '../../../contexts/paginat
44
import type { ThreadContextValue } from '../../../contexts/threadContext/ThreadContext';
55
import type { DefaultStreamChatGenerics } from '../../../types/types';
66
import { isEditedMessage } from '../../../utils/utils';
7-
import type { GroupType } from '../hooks/useMessageList';
7+
import type { GroupType, MessageType } from '../hooks/useMessageList';
88

99
export 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+
22104
export 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

Comments
 (0)