stream-chat-react-native-core 5.29.1-beta.4 → 5.30.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/components/Channel/Channel.js +4 -2
- package/lib/commonjs/components/Channel/Channel.js.map +1 -1
- package/lib/commonjs/components/Channel/hooks/useCreateMessagesContext.js +2 -2
- package/lib/commonjs/components/Channel/hooks/useCreateMessagesContext.js.map +1 -1
- package/lib/commonjs/components/ChannelPreview/hooks/useLatestMessagePreview.js +1 -1
- package/lib/commonjs/components/ChannelPreview/hooks/useLatestMessagePreview.js.map +1 -1
- package/lib/commonjs/components/ImageGallery/components/ImageGalleryHeader.js +6 -14
- package/lib/commonjs/components/ImageGallery/components/ImageGalleryHeader.js.map +1 -1
- package/lib/commonjs/components/Message/Message.js +11 -0
- package/lib/commonjs/components/Message/Message.js.map +1 -1
- package/lib/commonjs/components/Message/MessageSimple/MessageContent.js +12 -27
- package/lib/commonjs/components/Message/MessageSimple/MessageContent.js.map +1 -1
- package/lib/commonjs/components/Message/MessageSimple/MessageDeleted.js +10 -12
- package/lib/commonjs/components/Message/MessageSimple/MessageDeleted.js.map +1 -1
- package/lib/commonjs/components/Message/MessageSimple/MessageEditedTimestamp.js +55 -0
- package/lib/commonjs/components/Message/MessageSimple/MessageEditedTimestamp.js.map +1 -0
- package/lib/commonjs/components/Message/MessageSimple/MessageFooter.js +94 -58
- package/lib/commonjs/components/Message/MessageSimple/MessageFooter.js.map +1 -1
- package/lib/commonjs/components/Message/MessageSimple/MessageSimple.js +6 -0
- package/lib/commonjs/components/Message/MessageSimple/MessageSimple.js.map +1 -1
- package/lib/commonjs/components/Message/MessageSimple/MessageTimestamp.js +48 -0
- package/lib/commonjs/components/Message/MessageSimple/MessageTimestamp.js.map +1 -0
- package/lib/commonjs/components/Message/hooks/useCreateMessageContext.js +5 -1
- package/lib/commonjs/components/Message/hooks/useCreateMessageContext.js.map +1 -1
- package/lib/commonjs/components/MessageList/InlineDateSeparator.js +6 -2
- package/lib/commonjs/components/MessageList/InlineDateSeparator.js.map +1 -1
- package/lib/commonjs/components/MessageList/MessageList.js +9 -6
- package/lib/commonjs/components/MessageList/MessageList.js.map +1 -1
- package/lib/commonjs/components/MessageList/MessageSystem.js +30 -27
- package/lib/commonjs/components/MessageList/MessageSystem.js.map +1 -1
- package/lib/commonjs/components/MessageList/utils/getGroupStyles.js +3 -2
- package/lib/commonjs/components/MessageList/utils/getGroupStyles.js.map +1 -1
- package/lib/commonjs/components/index.js +11 -0
- package/lib/commonjs/components/index.js.map +1 -1
- package/lib/commonjs/contexts/messageContext/MessageContext.js.map +1 -1
- package/lib/commonjs/contexts/messagesContext/MessagesContext.js.map +1 -1
- package/lib/commonjs/contexts/themeContext/utils/theme.js +3 -0
- package/lib/commonjs/contexts/themeContext/utils/theme.js.map +1 -1
- package/lib/commonjs/i18n/en.json +2 -1
- package/lib/commonjs/i18n/es.json +39 -38
- package/lib/commonjs/i18n/fr.json +39 -38
- package/lib/commonjs/i18n/he.json +39 -38
- package/lib/commonjs/i18n/hi.json +39 -38
- package/lib/commonjs/i18n/it.json +39 -38
- package/lib/commonjs/i18n/ja.json +39 -38
- package/lib/commonjs/i18n/ko.json +39 -38
- package/lib/commonjs/i18n/nl.json +39 -38
- package/lib/commonjs/i18n/pt-BR.json +39 -38
- package/lib/commonjs/i18n/ru.json +39 -38
- package/lib/commonjs/i18n/tr.json +39 -38
- package/lib/commonjs/utils/getDateString.js +31 -0
- package/lib/commonjs/utils/getDateString.js.map +1 -0
- package/lib/commonjs/utils/utils.js +5 -1
- package/lib/commonjs/utils/utils.js.map +1 -1
- package/lib/commonjs/version.json +1 -1
- package/lib/module/components/Channel/Channel.js +4 -2
- package/lib/module/components/Channel/Channel.js.map +1 -1
- package/lib/module/components/Channel/hooks/useCreateMessagesContext.js +2 -2
- package/lib/module/components/Channel/hooks/useCreateMessagesContext.js.map +1 -1
- package/lib/module/components/ChannelPreview/hooks/useLatestMessagePreview.js +1 -1
- package/lib/module/components/ChannelPreview/hooks/useLatestMessagePreview.js.map +1 -1
- package/lib/module/components/ImageGallery/components/ImageGalleryHeader.js +6 -14
- package/lib/module/components/ImageGallery/components/ImageGalleryHeader.js.map +1 -1
- package/lib/module/components/Message/Message.js +11 -0
- package/lib/module/components/Message/Message.js.map +1 -1
- package/lib/module/components/Message/MessageSimple/MessageContent.js +12 -27
- package/lib/module/components/Message/MessageSimple/MessageContent.js.map +1 -1
- package/lib/module/components/Message/MessageSimple/MessageDeleted.js +10 -12
- package/lib/module/components/Message/MessageSimple/MessageDeleted.js.map +1 -1
- package/lib/module/components/Message/MessageSimple/MessageEditedTimestamp.js +55 -0
- package/lib/module/components/Message/MessageSimple/MessageEditedTimestamp.js.map +1 -0
- package/lib/module/components/Message/MessageSimple/MessageFooter.js +94 -58
- package/lib/module/components/Message/MessageSimple/MessageFooter.js.map +1 -1
- package/lib/module/components/Message/MessageSimple/MessageSimple.js +6 -0
- package/lib/module/components/Message/MessageSimple/MessageSimple.js.map +1 -1
- package/lib/module/components/Message/MessageSimple/MessageTimestamp.js +48 -0
- package/lib/module/components/Message/MessageSimple/MessageTimestamp.js.map +1 -0
- package/lib/module/components/Message/hooks/useCreateMessageContext.js +5 -1
- package/lib/module/components/Message/hooks/useCreateMessageContext.js.map +1 -1
- package/lib/module/components/MessageList/InlineDateSeparator.js +6 -2
- package/lib/module/components/MessageList/InlineDateSeparator.js.map +1 -1
- package/lib/module/components/MessageList/MessageList.js +9 -6
- package/lib/module/components/MessageList/MessageList.js.map +1 -1
- package/lib/module/components/MessageList/MessageSystem.js +30 -27
- package/lib/module/components/MessageList/MessageSystem.js.map +1 -1
- package/lib/module/components/MessageList/utils/getGroupStyles.js +3 -2
- package/lib/module/components/MessageList/utils/getGroupStyles.js.map +1 -1
- package/lib/module/components/index.js +11 -0
- package/lib/module/components/index.js.map +1 -1
- package/lib/module/contexts/messageContext/MessageContext.js.map +1 -1
- package/lib/module/contexts/messagesContext/MessagesContext.js.map +1 -1
- package/lib/module/contexts/themeContext/utils/theme.js +3 -0
- package/lib/module/contexts/themeContext/utils/theme.js.map +1 -1
- package/lib/module/i18n/en.json +2 -1
- package/lib/module/i18n/es.json +39 -38
- package/lib/module/i18n/fr.json +39 -38
- package/lib/module/i18n/he.json +39 -38
- package/lib/module/i18n/hi.json +39 -38
- package/lib/module/i18n/it.json +39 -38
- package/lib/module/i18n/ja.json +39 -38
- package/lib/module/i18n/ko.json +39 -38
- package/lib/module/i18n/nl.json +39 -38
- package/lib/module/i18n/pt-BR.json +39 -38
- package/lib/module/i18n/ru.json +39 -38
- package/lib/module/i18n/tr.json +39 -38
- package/lib/module/utils/getDateString.js +31 -0
- package/lib/module/utils/getDateString.js.map +1 -0
- package/lib/module/utils/utils.js +5 -1
- package/lib/module/utils/utils.js.map +1 -1
- package/lib/module/version.json +1 -1
- package/lib/typescript/components/Channel/Channel.d.ts +1 -1
- package/lib/typescript/components/Channel/Channel.d.ts.map +1 -1
- package/lib/typescript/components/Channel/hooks/useCreateMessagesContext.d.ts +1 -1
- package/lib/typescript/components/ImageGallery/components/ImageGalleryHeader.d.ts.map +1 -1
- package/lib/typescript/components/Message/Message.d.ts.map +1 -1
- package/lib/typescript/components/Message/MessageSimple/MessageContent.d.ts +1 -1
- package/lib/typescript/components/Message/MessageSimple/MessageContent.d.ts.map +1 -1
- package/lib/typescript/components/Message/MessageSimple/MessageDeleted.d.ts +8 -8
- package/lib/typescript/components/Message/MessageSimple/MessageDeleted.d.ts.map +1 -1
- package/lib/typescript/components/Message/MessageSimple/MessageEditedTimestamp.d.ts +7 -0
- package/lib/typescript/components/Message/MessageSimple/MessageEditedTimestamp.d.ts.map +1 -0
- package/lib/typescript/components/Message/MessageSimple/MessageFooter.d.ts +1 -1
- package/lib/typescript/components/Message/MessageSimple/MessageFooter.d.ts.map +1 -1
- package/lib/typescript/components/Message/MessageSimple/MessageSimple.d.ts +1 -1
- package/lib/typescript/components/Message/MessageSimple/MessageSimple.d.ts.map +1 -1
- package/lib/typescript/components/Message/MessageSimple/MessageTimestamp.d.ts +22 -0
- package/lib/typescript/components/Message/MessageSimple/MessageTimestamp.d.ts.map +1 -0
- package/lib/typescript/components/Message/hooks/useCreateMessageContext.d.ts +1 -1
- package/lib/typescript/components/Message/hooks/useCreateMessageContext.d.ts.map +1 -1
- package/lib/typescript/components/MessageList/DateHeader.d.ts +1 -1
- package/lib/typescript/components/MessageList/DateHeader.d.ts.map +1 -1
- package/lib/typescript/components/MessageList/InlineDateSeparator.d.ts.map +1 -1
- package/lib/typescript/components/MessageList/MessageList.d.ts.map +1 -1
- package/lib/typescript/components/MessageList/MessageSystem.d.ts +0 -8
- package/lib/typescript/components/MessageList/MessageSystem.d.ts.map +1 -1
- package/lib/typescript/components/MessageList/utils/getGroupStyles.d.ts.map +1 -1
- package/lib/typescript/components/index.d.ts +1 -0
- package/lib/typescript/components/index.d.ts.map +1 -1
- package/lib/typescript/contexts/channelContext/ChannelContext.d.ts +1 -1
- package/lib/typescript/contexts/channelContext/ChannelContext.d.ts.map +1 -1
- package/lib/typescript/contexts/messageContext/MessageContext.d.ts +5 -1
- package/lib/typescript/contexts/messageContext/MessageContext.d.ts.map +1 -1
- package/lib/typescript/contexts/messagesContext/MessagesContext.d.ts +6 -5
- package/lib/typescript/contexts/messagesContext/MessagesContext.d.ts.map +1 -1
- package/lib/typescript/contexts/themeContext/utils/theme.d.ts +3 -0
- package/lib/typescript/contexts/themeContext/utils/theme.d.ts.map +1 -1
- package/lib/typescript/i18n/en.json +2 -1
- package/lib/typescript/i18n/es.json +39 -38
- package/lib/typescript/i18n/fr.json +39 -38
- package/lib/typescript/i18n/he.json +39 -38
- package/lib/typescript/i18n/hi.json +39 -38
- package/lib/typescript/i18n/it.json +39 -38
- package/lib/typescript/i18n/ja.json +39 -38
- package/lib/typescript/i18n/ko.json +39 -38
- package/lib/typescript/i18n/nl.json +39 -38
- package/lib/typescript/i18n/pt-BR.json +39 -38
- package/lib/typescript/i18n/ru.json +39 -38
- package/lib/typescript/i18n/tr.json +39 -38
- package/lib/typescript/utils/Streami18n.d.ts +6 -0
- package/lib/typescript/utils/Streami18n.d.ts.map +1 -1
- package/lib/typescript/utils/getDateString.d.ts +30 -0
- package/lib/typescript/utils/getDateString.d.ts.map +1 -0
- package/lib/typescript/utils/utils.d.ts +6 -0
- package/lib/typescript/utils/utils.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/components/Channel/Channel.tsx +4 -3
- package/src/components/Channel/hooks/useCreateMessagesContext.ts +2 -2
- package/src/components/ChannelPreview/hooks/useLatestMessagePreview.ts +1 -1
- package/src/components/ImageGallery/components/ImageGalleryHeader.tsx +3 -31
- package/src/components/Message/Message.tsx +7 -0
- package/src/components/Message/MessageSimple/MessageContent.tsx +13 -33
- package/src/components/Message/MessageSimple/MessageDeleted.tsx +13 -31
- package/src/components/Message/MessageSimple/MessageEditedTimestamp.tsx +56 -0
- package/src/components/Message/MessageSimple/MessageFooter.tsx +104 -63
- package/src/components/Message/MessageSimple/MessageSimple.tsx +14 -2
- package/src/components/Message/MessageSimple/MessageTimestamp.tsx +64 -0
- package/src/components/Message/hooks/useCreateMessageContext.ts +5 -0
- package/src/components/MessageList/DateHeader.tsx +1 -1
- package/src/components/MessageList/InlineDateSeparator.tsx +8 -8
- package/src/components/MessageList/MessageList.tsx +9 -9
- package/src/components/MessageList/MessageSystem.tsx +35 -43
- package/src/components/MessageList/utils/getGroupStyles.ts +7 -4
- package/src/components/Thread/__tests__/__snapshots__/Thread.test.js.snap +20 -12
- package/src/components/index.ts +1 -0
- package/src/contexts/channelContext/ChannelContext.tsx +1 -1
- package/src/contexts/messageContext/MessageContext.tsx +4 -0
- package/src/contexts/messagesContext/MessagesContext.tsx +6 -5
- package/src/contexts/themeContext/utils/theme.ts +6 -0
- package/src/i18n/en.json +2 -1
- package/src/i18n/es.json +39 -38
- package/src/i18n/fr.json +39 -38
- package/src/i18n/he.json +39 -38
- package/src/i18n/hi.json +39 -38
- package/src/i18n/it.json +39 -38
- package/src/i18n/ja.json +39 -38
- package/src/i18n/ko.json +39 -38
- package/src/i18n/nl.json +39 -38
- package/src/i18n/pt-BR.json +39 -38
- package/src/i18n/ru.json +39 -38
- package/src/i18n/tr.json +39 -38
- package/src/utils/getDateString.ts +67 -0
- package/src/utils/utils.ts +11 -0
- package/src/version.json +1 -1
|
@@ -5,6 +5,8 @@ import type { Attachment } from 'stream-chat';
|
|
|
5
5
|
|
|
6
6
|
import type { MessageStatusProps } from './MessageStatus';
|
|
7
7
|
|
|
8
|
+
import { MessageTimestamp } from './MessageTimestamp';
|
|
9
|
+
|
|
8
10
|
import type { ChannelContextValue } from '../../../contexts/channelContext/ChannelContext';
|
|
9
11
|
import {
|
|
10
12
|
Alignment,
|
|
@@ -21,11 +23,11 @@ import { useTranslationContext } from '../../../contexts/translationContext/Tran
|
|
|
21
23
|
import { Eye } from '../../../icons';
|
|
22
24
|
|
|
23
25
|
import type { DefaultStreamChatGenerics } from '../../../types/types';
|
|
24
|
-
import { MessageStatusTypes } from '../../../utils/utils';
|
|
26
|
+
import { isEditedMessage, MessageStatusTypes } from '../../../utils/utils';
|
|
25
27
|
import type { MessageType } from '../../MessageList/hooks/useMessageList';
|
|
26
28
|
|
|
27
29
|
type MessageFooterComponentProps = {
|
|
28
|
-
|
|
30
|
+
date?: string | Date;
|
|
29
31
|
isDeleted?: boolean;
|
|
30
32
|
};
|
|
31
33
|
|
|
@@ -34,6 +36,7 @@ type MessageFooterPropsWithContext<
|
|
|
34
36
|
> = Pick<
|
|
35
37
|
MessageContextValue<StreamChatGenerics>,
|
|
36
38
|
| 'alignment'
|
|
39
|
+
| 'isEditedMessageOpen'
|
|
37
40
|
| 'members'
|
|
38
41
|
| 'message'
|
|
39
42
|
| 'otherAttachments'
|
|
@@ -42,10 +45,41 @@ type MessageFooterPropsWithContext<
|
|
|
42
45
|
> &
|
|
43
46
|
Pick<
|
|
44
47
|
MessagesContextValue<StreamChatGenerics>,
|
|
45
|
-
'deletedMessagesVisibilityType' | 'MessageStatus'
|
|
48
|
+
'deletedMessagesVisibilityType' | 'MessageEditedTimestamp' | 'MessageStatus'
|
|
46
49
|
> &
|
|
47
50
|
MessageFooterComponentProps;
|
|
48
51
|
|
|
52
|
+
const OnlyVisibleToYouComponent = ({ alignment }: { alignment: Alignment }) => {
|
|
53
|
+
const {
|
|
54
|
+
theme: {
|
|
55
|
+
colors: { grey_dark },
|
|
56
|
+
messageSimple: {
|
|
57
|
+
content: { deletedMetaText, eyeIcon, metaText },
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
} = useTheme();
|
|
61
|
+
const { t } = useTranslationContext();
|
|
62
|
+
|
|
63
|
+
return (
|
|
64
|
+
<>
|
|
65
|
+
<Eye pathFill={grey_dark} {...eyeIcon} />
|
|
66
|
+
<Text
|
|
67
|
+
style={[
|
|
68
|
+
{
|
|
69
|
+
color: grey_dark,
|
|
70
|
+
textAlign: alignment,
|
|
71
|
+
},
|
|
72
|
+
metaText,
|
|
73
|
+
deletedMetaText,
|
|
74
|
+
]}
|
|
75
|
+
testID='only-visible-to-you'
|
|
76
|
+
>
|
|
77
|
+
{t<string>('Only visible to you')}
|
|
78
|
+
</Text>
|
|
79
|
+
</>
|
|
80
|
+
);
|
|
81
|
+
};
|
|
82
|
+
|
|
49
83
|
const MessageFooterWithContext = <
|
|
50
84
|
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
|
|
51
85
|
>(
|
|
@@ -53,12 +87,14 @@ const MessageFooterWithContext = <
|
|
|
53
87
|
) => {
|
|
54
88
|
const {
|
|
55
89
|
alignment,
|
|
90
|
+
date,
|
|
56
91
|
deletedMessagesVisibilityType,
|
|
57
|
-
formattedDate,
|
|
58
92
|
isDeleted,
|
|
93
|
+
isEditedMessageOpen,
|
|
59
94
|
lastGroupMessage,
|
|
60
95
|
members,
|
|
61
96
|
message,
|
|
97
|
+
MessageEditedTimestamp,
|
|
62
98
|
MessageStatus,
|
|
63
99
|
otherAttachments,
|
|
64
100
|
showMessageStatus,
|
|
@@ -66,9 +102,9 @@ const MessageFooterWithContext = <
|
|
|
66
102
|
|
|
67
103
|
const {
|
|
68
104
|
theme: {
|
|
69
|
-
colors: { grey
|
|
105
|
+
colors: { grey },
|
|
70
106
|
messageSimple: {
|
|
71
|
-
content: {
|
|
107
|
+
content: { editedLabel, messageUser, metaContainer, metaText },
|
|
72
108
|
},
|
|
73
109
|
},
|
|
74
110
|
} = useTheme();
|
|
@@ -78,69 +114,51 @@ const MessageFooterWithContext = <
|
|
|
78
114
|
return (
|
|
79
115
|
<View style={[styles.container, metaContainer]} testID='message-deleted'>
|
|
80
116
|
{deletedMessagesVisibilityType === 'sender' && (
|
|
117
|
+
<OnlyVisibleToYouComponent alignment={alignment} />
|
|
118
|
+
)}
|
|
119
|
+
<MessageTimestamp format='LT' timestamp={date} />
|
|
120
|
+
</View>
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (lastGroupMessage === false && message.status === MessageStatusTypes.RECEIVED) {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return (
|
|
129
|
+
<>
|
|
130
|
+
<View style={[styles.container, metaContainer]} testID='message-status-time'>
|
|
131
|
+
{otherAttachments.length && otherAttachments[0].actions ? (
|
|
132
|
+
<OnlyVisibleToYouComponent alignment={alignment} />
|
|
133
|
+
) : null}
|
|
134
|
+
{Object.keys(members).length > 2 && alignment === 'left' && message.user?.name ? (
|
|
135
|
+
<Text style={[styles.text, { color: grey }, messageUser]}>{message.user.name}</Text>
|
|
136
|
+
) : null}
|
|
137
|
+
{showMessageStatus && <MessageStatus />}
|
|
138
|
+
<MessageTimestamp format='LT' timestamp={date} />
|
|
139
|
+
|
|
140
|
+
{isEditedMessage(message) && !isEditedMessageOpen && (
|
|
81
141
|
<>
|
|
82
|
-
<Eye pathFill={grey_dark} {...eyeIcon} />
|
|
83
142
|
<Text
|
|
84
143
|
style={[
|
|
144
|
+
styles.dotText,
|
|
85
145
|
{
|
|
86
|
-
color:
|
|
146
|
+
color: grey,
|
|
87
147
|
textAlign: alignment,
|
|
88
148
|
},
|
|
89
149
|
metaText,
|
|
90
|
-
deletedMetaText,
|
|
91
150
|
]}
|
|
92
|
-
testID='only-visible-to-you'
|
|
93
151
|
>
|
|
94
|
-
|
|
152
|
+
⦁
|
|
153
|
+
</Text>
|
|
154
|
+
<Text style={[styles.text, { color: grey, textAlign: alignment }, editedLabel]}>
|
|
155
|
+
{t<string>('Edited')}
|
|
95
156
|
</Text>
|
|
96
157
|
</>
|
|
97
158
|
)}
|
|
98
|
-
<Text
|
|
99
|
-
style={[
|
|
100
|
-
{
|
|
101
|
-
color: grey,
|
|
102
|
-
textAlign: alignment,
|
|
103
|
-
},
|
|
104
|
-
metaText,
|
|
105
|
-
]}
|
|
106
|
-
>
|
|
107
|
-
{formattedDate.toString()}
|
|
108
|
-
</Text>
|
|
109
159
|
</View>
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
if (lastGroupMessage === false && message.status === MessageStatusTypes.RECEIVED) {
|
|
114
|
-
return null;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
return (
|
|
118
|
-
<View style={[styles.container, metaContainer]} testID='message-status-time'>
|
|
119
|
-
{otherAttachments.length && otherAttachments[0].actions ? (
|
|
120
|
-
<>
|
|
121
|
-
<Eye pathFill={grey_dark} {...eyeIcon} />
|
|
122
|
-
<Text
|
|
123
|
-
style={[
|
|
124
|
-
{
|
|
125
|
-
color: grey_dark,
|
|
126
|
-
textAlign: alignment,
|
|
127
|
-
},
|
|
128
|
-
metaText,
|
|
129
|
-
deletedMetaText,
|
|
130
|
-
]}
|
|
131
|
-
>
|
|
132
|
-
{t<string>('Only visible to you')}
|
|
133
|
-
</Text>
|
|
134
|
-
</>
|
|
135
|
-
) : null}
|
|
136
|
-
{Object.keys(members).length > 2 && alignment === 'left' && message.user?.name ? (
|
|
137
|
-
<Text style={[{ color: grey }, messageUser]}>{message.user.name}</Text>
|
|
138
|
-
) : null}
|
|
139
|
-
{showMessageStatus && <MessageStatus />}
|
|
140
|
-
<Text style={[{ color: grey, textAlign: alignment }, metaText]}>
|
|
141
|
-
{formattedDate.toString()}
|
|
142
|
-
</Text>
|
|
143
|
-
</View>
|
|
160
|
+
{isEditedMessageOpen && <MessageEditedTimestamp format='LT' timestamp={date} />}
|
|
161
|
+
</>
|
|
144
162
|
);
|
|
145
163
|
};
|
|
146
164
|
|
|
@@ -150,7 +168,8 @@ const areEqual = <StreamChatGenerics extends DefaultStreamChatGenerics = Default
|
|
|
150
168
|
) => {
|
|
151
169
|
const {
|
|
152
170
|
alignment: prevAlignment,
|
|
153
|
-
|
|
171
|
+
date: prevDate,
|
|
172
|
+
isEditedMessageOpen: prevIsEditedMessageOpen,
|
|
154
173
|
lastGroupMessage: prevLastGroupMessage,
|
|
155
174
|
members: prevMembers,
|
|
156
175
|
message: prevMessage,
|
|
@@ -159,7 +178,8 @@ const areEqual = <StreamChatGenerics extends DefaultStreamChatGenerics = Default
|
|
|
159
178
|
} = prevProps;
|
|
160
179
|
const {
|
|
161
180
|
alignment: nextAlignment,
|
|
162
|
-
|
|
181
|
+
date: nextDate,
|
|
182
|
+
isEditedMessageOpen: nextIsEditedMessageOpen,
|
|
163
183
|
lastGroupMessage: nextLastGroupMessage,
|
|
164
184
|
members: nextMembers,
|
|
165
185
|
message: nextMessage,
|
|
@@ -170,6 +190,9 @@ const areEqual = <StreamChatGenerics extends DefaultStreamChatGenerics = Default
|
|
|
170
190
|
const alignmentEqual = prevAlignment === nextAlignment;
|
|
171
191
|
if (!alignmentEqual) return false;
|
|
172
192
|
|
|
193
|
+
const isEditedMessageOpenEqual = prevIsEditedMessageOpen === nextIsEditedMessageOpen;
|
|
194
|
+
if (!isEditedMessageOpenEqual) return false;
|
|
195
|
+
|
|
173
196
|
const membersEqual = Object.keys(prevMembers).length === Object.keys(nextMembers).length;
|
|
174
197
|
if (!membersEqual) return false;
|
|
175
198
|
|
|
@@ -200,8 +223,8 @@ const areEqual = <StreamChatGenerics extends DefaultStreamChatGenerics = Default
|
|
|
200
223
|
const showMessageStatusEqual = prevShowMessageStatus === nextShowMessageStatus;
|
|
201
224
|
if (!showMessageStatusEqual) return false;
|
|
202
225
|
|
|
203
|
-
const
|
|
204
|
-
if (!
|
|
226
|
+
const dateEqual = prevDate === nextDate;
|
|
227
|
+
if (!dateEqual) return false;
|
|
205
228
|
|
|
206
229
|
return true;
|
|
207
230
|
};
|
|
@@ -228,19 +251,29 @@ export const MessageFooter = <
|
|
|
228
251
|
>(
|
|
229
252
|
props: MessageFooterProps<StreamChatGenerics>,
|
|
230
253
|
) => {
|
|
231
|
-
const {
|
|
232
|
-
|
|
254
|
+
const {
|
|
255
|
+
alignment,
|
|
256
|
+
isEditedMessageOpen,
|
|
257
|
+
lastGroupMessage,
|
|
258
|
+
members,
|
|
259
|
+
message,
|
|
260
|
+
otherAttachments,
|
|
261
|
+
showMessageStatus,
|
|
262
|
+
} = useMessageContext<StreamChatGenerics>();
|
|
233
263
|
|
|
234
|
-
const { deletedMessagesVisibilityType, MessageStatus } =
|
|
264
|
+
const { deletedMessagesVisibilityType, MessageEditedTimestamp, MessageStatus } =
|
|
265
|
+
useMessagesContext<StreamChatGenerics>();
|
|
235
266
|
|
|
236
267
|
return (
|
|
237
268
|
<MemoizedMessageFooter
|
|
238
269
|
{...{
|
|
239
270
|
alignment,
|
|
240
271
|
deletedMessagesVisibilityType,
|
|
272
|
+
isEditedMessageOpen,
|
|
241
273
|
lastGroupMessage,
|
|
242
274
|
members,
|
|
243
275
|
message,
|
|
276
|
+
MessageEditedTimestamp,
|
|
244
277
|
MessageStatus,
|
|
245
278
|
otherAttachments,
|
|
246
279
|
showMessageStatus,
|
|
@@ -252,7 +285,15 @@ export const MessageFooter = <
|
|
|
252
285
|
|
|
253
286
|
const styles = StyleSheet.create({
|
|
254
287
|
container: {
|
|
288
|
+
alignItems: 'center',
|
|
255
289
|
flexDirection: 'row',
|
|
290
|
+
justifyContent: 'center',
|
|
256
291
|
marginTop: 4,
|
|
257
292
|
},
|
|
293
|
+
dotText: {
|
|
294
|
+
paddingHorizontal: 4,
|
|
295
|
+
},
|
|
296
|
+
text: {
|
|
297
|
+
fontSize: 12,
|
|
298
|
+
},
|
|
258
299
|
});
|
|
@@ -31,7 +31,13 @@ export type MessageSimplePropsWithContext<
|
|
|
31
31
|
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
|
|
32
32
|
> = Pick<
|
|
33
33
|
MessageContextValue<StreamChatGenerics>,
|
|
34
|
-
|
|
34
|
+
| 'alignment'
|
|
35
|
+
| 'channel'
|
|
36
|
+
| 'disabled'
|
|
37
|
+
| 'isEditedMessageOpen'
|
|
38
|
+
| 'groupStyles'
|
|
39
|
+
| 'hasReactions'
|
|
40
|
+
| 'message'
|
|
35
41
|
> &
|
|
36
42
|
Pick<
|
|
37
43
|
MessagesContextValue<StreamChatGenerics>,
|
|
@@ -122,6 +128,7 @@ const areEqual = <StreamChatGenerics extends DefaultStreamChatGenerics = Default
|
|
|
122
128
|
disabled: prevDisabled,
|
|
123
129
|
groupStyles: prevGroupStyles,
|
|
124
130
|
hasReactions: prevHasReactions,
|
|
131
|
+
isEditedMessageOpen: prevIsEditedMessageOpen,
|
|
125
132
|
message: prevMessage,
|
|
126
133
|
myMessageTheme: prevMyMessageTheme,
|
|
127
134
|
} = prevProps;
|
|
@@ -130,6 +137,7 @@ const areEqual = <StreamChatGenerics extends DefaultStreamChatGenerics = Default
|
|
|
130
137
|
disabled: nextDisabled,
|
|
131
138
|
groupStyles: nextGroupStyles,
|
|
132
139
|
hasReactions: nextHasReactions,
|
|
140
|
+
isEditedMessageOpen: nextIsEditedMessageOpen,
|
|
133
141
|
message: nextMessage,
|
|
134
142
|
myMessageTheme: nextMyMessageTheme,
|
|
135
143
|
} = nextProps;
|
|
@@ -146,6 +154,9 @@ const areEqual = <StreamChatGenerics extends DefaultStreamChatGenerics = Default
|
|
|
146
154
|
const groupStylesEqual = JSON.stringify(prevGroupStyles) === JSON.stringify(nextGroupStyles);
|
|
147
155
|
if (!groupStylesEqual) return false;
|
|
148
156
|
|
|
157
|
+
const isEditedMessageOpenEqual = prevIsEditedMessageOpen === nextIsEditedMessageOpen;
|
|
158
|
+
if (!isEditedMessageOpenEqual) return false;
|
|
159
|
+
|
|
149
160
|
const isPrevMessageTypeDeleted = prevMessage.type === 'deleted';
|
|
150
161
|
const isNextMessageTypeDeleted = nextMessage.type === 'deleted';
|
|
151
162
|
|
|
@@ -219,7 +230,7 @@ export const MessageSimple = <
|
|
|
219
230
|
>(
|
|
220
231
|
props: MessageSimpleProps<StreamChatGenerics>,
|
|
221
232
|
) => {
|
|
222
|
-
const { alignment, channel, disabled, groupStyles, hasReactions, message } =
|
|
233
|
+
const { alignment, channel, disabled, groupStyles, hasReactions, isEditedMessageOpen, message } =
|
|
223
234
|
useMessageContext<StreamChatGenerics>();
|
|
224
235
|
const {
|
|
225
236
|
enableMessageGroupingByUser,
|
|
@@ -238,6 +249,7 @@ export const MessageSimple = <
|
|
|
238
249
|
enableMessageGroupingByUser,
|
|
239
250
|
groupStyles,
|
|
240
251
|
hasReactions,
|
|
252
|
+
isEditedMessageOpen,
|
|
241
253
|
message,
|
|
242
254
|
MessageAvatar,
|
|
243
255
|
MessageContent,
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { StyleSheet, Text } from 'react-native';
|
|
3
|
+
|
|
4
|
+
import { useTheme } from '../../../contexts/themeContext/ThemeContext';
|
|
5
|
+
import {
|
|
6
|
+
TDateTimeParserInput,
|
|
7
|
+
TranslationContextValue,
|
|
8
|
+
useTranslationContext,
|
|
9
|
+
} from '../../../contexts/translationContext/TranslationContext';
|
|
10
|
+
import { getDateString } from '../../../utils/getDateString';
|
|
11
|
+
|
|
12
|
+
export type MessageTimestampProps = Partial<Pick<TranslationContextValue, 'tDateTimeParser'>> & {
|
|
13
|
+
/**
|
|
14
|
+
* Whether to show the time in Calendar time format. Calendar time displays time relative to a today's date.
|
|
15
|
+
*/
|
|
16
|
+
calendar?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* The format in which the date should be displayed.
|
|
19
|
+
*/
|
|
20
|
+
format?: string;
|
|
21
|
+
/**
|
|
22
|
+
* A function to format the date.
|
|
23
|
+
*/
|
|
24
|
+
formatDate?: (date: TDateTimeParserInput) => string;
|
|
25
|
+
/**
|
|
26
|
+
* The timestamp of the message.
|
|
27
|
+
*/
|
|
28
|
+
timestamp?: string | Date;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export const MessageTimestamp = (props: MessageTimestampProps) => {
|
|
32
|
+
const { calendar, format, formatDate, tDateTimeParser: propsTDateTimeParser, timestamp } = props;
|
|
33
|
+
const {
|
|
34
|
+
theme: {
|
|
35
|
+
colors: { grey },
|
|
36
|
+
messageSimple: {
|
|
37
|
+
content: { timestampText },
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
} = useTheme();
|
|
41
|
+
const { tDateTimeParser: contextTDateTimeParser } = useTranslationContext();
|
|
42
|
+
|
|
43
|
+
if (!timestamp) return null;
|
|
44
|
+
|
|
45
|
+
const formattedDate = getDateString({
|
|
46
|
+
calendar,
|
|
47
|
+
date: timestamp,
|
|
48
|
+
format,
|
|
49
|
+
formatDate,
|
|
50
|
+
tDateTimeParser: propsTDateTimeParser || contextTDateTimeParser,
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
if (!formattedDate) return null;
|
|
54
|
+
|
|
55
|
+
return (
|
|
56
|
+
<Text style={[styles.text, { color: grey }, timestampText]}>{formattedDate.toString()}</Text>
|
|
57
|
+
);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const styles = StyleSheet.create({
|
|
61
|
+
text: {
|
|
62
|
+
fontSize: 12,
|
|
63
|
+
},
|
|
64
|
+
});
|
|
@@ -24,6 +24,7 @@ export const useCreateMessageContext = <
|
|
|
24
24
|
handleToggleReaction,
|
|
25
25
|
hasReactions,
|
|
26
26
|
images,
|
|
27
|
+
isEditedMessageOpen,
|
|
27
28
|
isMyMessage,
|
|
28
29
|
lastGroupMessage,
|
|
29
30
|
lastReceivedId,
|
|
@@ -39,6 +40,7 @@ export const useCreateMessageContext = <
|
|
|
39
40
|
otherAttachments,
|
|
40
41
|
preventPress,
|
|
41
42
|
reactions,
|
|
43
|
+
setIsEditedMessageOpen,
|
|
42
44
|
showAvatar,
|
|
43
45
|
showMessageOverlay,
|
|
44
46
|
showMessageStatus,
|
|
@@ -78,6 +80,7 @@ export const useCreateMessageContext = <
|
|
|
78
80
|
handleToggleReaction,
|
|
79
81
|
hasReactions,
|
|
80
82
|
images,
|
|
83
|
+
isEditedMessageOpen,
|
|
81
84
|
isMyMessage,
|
|
82
85
|
lastGroupMessage,
|
|
83
86
|
lastReceivedId,
|
|
@@ -93,6 +96,7 @@ export const useCreateMessageContext = <
|
|
|
93
96
|
otherAttachments,
|
|
94
97
|
preventPress,
|
|
95
98
|
reactions,
|
|
99
|
+
setIsEditedMessageOpen,
|
|
96
100
|
showAvatar,
|
|
97
101
|
showMessageOverlay,
|
|
98
102
|
showMessageStatus,
|
|
@@ -107,6 +111,7 @@ export const useCreateMessageContext = <
|
|
|
107
111
|
goToMessage,
|
|
108
112
|
groupStylesLength,
|
|
109
113
|
hasReactions,
|
|
114
|
+
isEditedMessageOpen,
|
|
110
115
|
lastGroupMessage,
|
|
111
116
|
lastReceivedId,
|
|
112
117
|
membersValue,
|
|
@@ -2,10 +2,8 @@ import React from 'react';
|
|
|
2
2
|
import { StyleSheet, Text, View } from 'react-native';
|
|
3
3
|
|
|
4
4
|
import { useTheme } from '../../contexts/themeContext/ThemeContext';
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
useTranslationContext,
|
|
8
|
-
} from '../../contexts/translationContext/TranslationContext';
|
|
5
|
+
import { useTranslationContext } from '../../contexts/translationContext/TranslationContext';
|
|
6
|
+
import { getDateString } from '../../utils/getDateString';
|
|
9
7
|
|
|
10
8
|
const styles = StyleSheet.create({
|
|
11
9
|
container: {
|
|
@@ -42,10 +40,12 @@ export const InlineDateSeparator = ({ date }: InlineDateSeparatorProps) => {
|
|
|
42
40
|
}
|
|
43
41
|
|
|
44
42
|
const dateFormat = date.getFullYear() === new Date().getFullYear() ? 'MMM D' : 'MMM D, YYYY';
|
|
45
|
-
|
|
46
|
-
const dateString =
|
|
47
|
-
|
|
48
|
-
:
|
|
43
|
+
|
|
44
|
+
const dateString = getDateString({
|
|
45
|
+
date,
|
|
46
|
+
format: dateFormat,
|
|
47
|
+
tDateTimeParser,
|
|
48
|
+
});
|
|
49
49
|
|
|
50
50
|
return (
|
|
51
51
|
<View
|
|
@@ -52,12 +52,12 @@ import {
|
|
|
52
52
|
import { mergeThemes, ThemeProvider, useTheme } from '../../contexts/themeContext/ThemeContext';
|
|
53
53
|
import { ThreadContextValue, useThreadContext } from '../../contexts/threadContext/ThreadContext';
|
|
54
54
|
import {
|
|
55
|
-
isDayOrMoment,
|
|
56
55
|
TranslationContextValue,
|
|
57
56
|
useTranslationContext,
|
|
58
57
|
} from '../../contexts/translationContext/TranslationContext';
|
|
59
58
|
|
|
60
59
|
import type { DefaultStreamChatGenerics } from '../../types/types';
|
|
60
|
+
import { getDateString } from '../../utils/getDateString';
|
|
61
61
|
|
|
62
62
|
const WAIT_FOR_SCROLL_TO_OFFSET_TIMEOUT = 150;
|
|
63
63
|
const MAX_RETRIES_AFTER_SCROLL_FAILURE = 10;
|
|
@@ -1023,17 +1023,17 @@ const MessageListWithContext = <
|
|
|
1023
1023
|
threadList,
|
|
1024
1024
|
]);
|
|
1025
1025
|
|
|
1026
|
-
const
|
|
1026
|
+
const stickyHeaderDateFormat =
|
|
1027
1027
|
stickyHeaderDate?.getFullYear() === new Date().getFullYear() ? 'MMM D' : 'MMM D, YYYY';
|
|
1028
|
-
const tStickyHeaderDate =
|
|
1029
|
-
stickyHeaderDate && !hideStickyDateHeader ? tDateTimeParser(stickyHeaderDate) : null;
|
|
1030
1028
|
|
|
1031
1029
|
const stickyHeaderDateString = useMemo(() => {
|
|
1032
|
-
if (
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1030
|
+
if (!stickyHeaderDate) return null;
|
|
1031
|
+
return getDateString({
|
|
1032
|
+
date: stickyHeaderDate,
|
|
1033
|
+
format: stickyHeaderDateFormat,
|
|
1034
|
+
tDateTimeParser,
|
|
1035
|
+
});
|
|
1036
|
+
}, [stickyHeaderDate, stickyHeaderDateFormat]);
|
|
1037
1037
|
|
|
1038
1038
|
const dismissImagePicker = () => {
|
|
1039
1039
|
if (!hasMoved && selectedPicker) {
|
|
@@ -4,48 +4,16 @@ import { StyleProp, StyleSheet, Text, View, ViewStyle } from 'react-native';
|
|
|
4
4
|
import type { MessageType } from './hooks/useMessageList';
|
|
5
5
|
|
|
6
6
|
import { useTheme } from '../../contexts/themeContext/ThemeContext';
|
|
7
|
-
import {
|
|
8
|
-
isDayOrMoment,
|
|
9
|
-
TDateTimeParserInput,
|
|
10
|
-
useTranslationContext,
|
|
11
|
-
} from '../../contexts/translationContext/TranslationContext';
|
|
7
|
+
import { useTranslationContext } from '../../contexts/translationContext/TranslationContext';
|
|
12
8
|
|
|
13
9
|
import type { DefaultStreamChatGenerics } from '../../types/types';
|
|
14
|
-
|
|
15
|
-
const styles = StyleSheet.create({
|
|
16
|
-
container: {
|
|
17
|
-
alignItems: 'center',
|
|
18
|
-
flexDirection: 'row',
|
|
19
|
-
justifyContent: 'center',
|
|
20
|
-
marginBottom: 10,
|
|
21
|
-
},
|
|
22
|
-
line: {
|
|
23
|
-
flex: 1,
|
|
24
|
-
height: 0.5,
|
|
25
|
-
},
|
|
26
|
-
text: {
|
|
27
|
-
fontSize: 10,
|
|
28
|
-
fontWeight: 'bold',
|
|
29
|
-
textAlign: 'center',
|
|
30
|
-
},
|
|
31
|
-
textContainer: {
|
|
32
|
-
flex: 3,
|
|
33
|
-
marginTop: 10,
|
|
34
|
-
},
|
|
35
|
-
});
|
|
10
|
+
import { getDateString } from '../../utils/getDateString';
|
|
36
11
|
|
|
37
12
|
export type MessageSystemProps<
|
|
38
13
|
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
|
|
39
14
|
> = {
|
|
40
15
|
/** Current [message object](https://getstream.io/chat/docs/#message_format) */
|
|
41
16
|
message: MessageType<StreamChatGenerics>;
|
|
42
|
-
/**
|
|
43
|
-
* Formatter function for date object.
|
|
44
|
-
*
|
|
45
|
-
* @param date TDateTimeParserInput object of message
|
|
46
|
-
* @returns string
|
|
47
|
-
*/
|
|
48
|
-
formatDate?: (date: TDateTimeParserInput) => string;
|
|
49
17
|
style?: StyleProp<ViewStyle>;
|
|
50
18
|
};
|
|
51
19
|
|
|
@@ -59,7 +27,7 @@ export const MessageSystem = <
|
|
|
59
27
|
>(
|
|
60
28
|
props: MessageSystemProps<StreamChatGenerics>,
|
|
61
29
|
) => {
|
|
62
|
-
const {
|
|
30
|
+
const { message, style } = props;
|
|
63
31
|
|
|
64
32
|
const {
|
|
65
33
|
theme: {
|
|
@@ -72,13 +40,11 @@ export const MessageSystem = <
|
|
|
72
40
|
const { tDateTimeParser } = useTranslationContext();
|
|
73
41
|
|
|
74
42
|
const createdAt = message.created_at;
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
? parsedDate.calendar().toUpperCase()
|
|
81
|
-
: parsedDate;
|
|
43
|
+
const formattedDate = getDateString({
|
|
44
|
+
calendar: true,
|
|
45
|
+
date: createdAt,
|
|
46
|
+
tDateTimeParser,
|
|
47
|
+
});
|
|
82
48
|
|
|
83
49
|
return (
|
|
84
50
|
<View style={[styles.container, style, container]} testID='message-system'>
|
|
@@ -87,7 +53,11 @@ export const MessageSystem = <
|
|
|
87
53
|
<Text style={[styles.text, { color: grey }, text]}>
|
|
88
54
|
{message.text?.toUpperCase() || ''}
|
|
89
55
|
</Text>
|
|
90
|
-
|
|
56
|
+
{formattedDate && (
|
|
57
|
+
<Text style={[styles.text, { color: grey }, dateText]}>
|
|
58
|
+
{formattedDate.toString().toUpperCase()}
|
|
59
|
+
</Text>
|
|
60
|
+
)}
|
|
91
61
|
</View>
|
|
92
62
|
<View style={[styles.line, { backgroundColor: grey_whisper }, line]} />
|
|
93
63
|
</View>
|
|
@@ -95,3 +65,25 @@ export const MessageSystem = <
|
|
|
95
65
|
};
|
|
96
66
|
|
|
97
67
|
MessageSystem.displayName = 'MessageSystem{messageList{messageSystem}}';
|
|
68
|
+
|
|
69
|
+
const styles = StyleSheet.create({
|
|
70
|
+
container: {
|
|
71
|
+
alignItems: 'center',
|
|
72
|
+
flexDirection: 'row',
|
|
73
|
+
justifyContent: 'center',
|
|
74
|
+
marginBottom: 10,
|
|
75
|
+
},
|
|
76
|
+
line: {
|
|
77
|
+
flex: 1,
|
|
78
|
+
height: 0.5,
|
|
79
|
+
},
|
|
80
|
+
text: {
|
|
81
|
+
fontSize: 10,
|
|
82
|
+
fontWeight: 'bold',
|
|
83
|
+
textAlign: 'center',
|
|
84
|
+
},
|
|
85
|
+
textContainer: {
|
|
86
|
+
flex: 3,
|
|
87
|
+
marginTop: 10,
|
|
88
|
+
},
|
|
89
|
+
});
|
|
@@ -3,6 +3,7 @@ import type { DateSeparators } from './getDateSeparators';
|
|
|
3
3
|
import type { PaginatedMessageListContextValue } from '../../../contexts/paginatedMessageListContext/PaginatedMessageListContext';
|
|
4
4
|
import type { ThreadContextValue } from '../../../contexts/threadContext/ThreadContext';
|
|
5
5
|
import type { DefaultStreamChatGenerics } from '../../../types/types';
|
|
6
|
+
import { isEditedMessage } from '../../../utils/utils';
|
|
6
7
|
import type { GroupType } from '../hooks/useMessageList';
|
|
7
8
|
|
|
8
9
|
export type GetGroupStylesParams<
|
|
@@ -59,22 +60,24 @@ export const getGroupStyles = <
|
|
|
59
60
|
const isTopMessage =
|
|
60
61
|
!previousMessage ||
|
|
61
62
|
previousMessage.type === 'system' ||
|
|
62
|
-
userId !== previousMessage?.user?.id ||
|
|
63
63
|
previousMessage.type === 'error' ||
|
|
64
|
+
userId !== previousMessage?.user?.id ||
|
|
64
65
|
!!isPrevMessageTypeDeleted ||
|
|
65
66
|
(!hideDateSeparators && dateSeparators[message.id]) ||
|
|
66
|
-
messageGroupStyles[previousMessage.id]?.includes('bottom')
|
|
67
|
+
messageGroupStyles[previousMessage.id]?.includes('bottom') ||
|
|
68
|
+
isEditedMessage(previousMessage);
|
|
67
69
|
|
|
68
70
|
const isBottomMessage =
|
|
69
71
|
!nextMessage ||
|
|
70
72
|
nextMessage.type === 'system' ||
|
|
71
|
-
userId !== nextMessage?.user?.id ||
|
|
72
73
|
nextMessage.type === 'error' ||
|
|
74
|
+
userId !== nextMessage?.user?.id ||
|
|
73
75
|
!!isNextMessageTypeDeleted ||
|
|
74
76
|
(!hideDateSeparators && dateSeparators[nextMessage.id]) ||
|
|
75
77
|
(maxTimeBetweenGroupedMessages !== undefined &&
|
|
76
78
|
nextMessage.created_at.getTime() - message.created_at.getTime() >
|
|
77
|
-
maxTimeBetweenGroupedMessages)
|
|
79
|
+
maxTimeBetweenGroupedMessages) ||
|
|
80
|
+
isEditedMessage(message);
|
|
78
81
|
|
|
79
82
|
/**
|
|
80
83
|
* Add group styles key for top message
|