-
Notifications
You must be signed in to change notification settings - Fork 143
Expand file tree
/
Copy pathindex.tsx
More file actions
104 lines (99 loc) · 3.52 KB
/
index.tsx
File metadata and controls
104 lines (99 loc) · 3.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import './index.scss';
import React from 'react';
import format from 'date-fns/format';
import { GroupChannel } from '@sendbird/chat/groupChannel';
import Icon, { IconTypes, IconColors } from '../Icon';
import Label, { LabelColors, LabelTypography } from '../Label';
import Loader from '../Loader';
import { CoreMessageType, isSentStatus } from '../../utils';
import {
getOutgoingMessageState,
OutgoingMessageStates,
} from '../../utils/exports/getOutgoingMessageState';
import { getLastMessageCreatedAt } from '../../modules/ChannelList/components/ChannelPreview/utils';
import { useLocalization } from '../../lib/LocalizationContext';
import { Nullable } from '../../types';
import { classnames } from '../../utils/utils';
export const MessageStatusTypes = OutgoingMessageStates;
interface MessageStatusProps {
className?: string;
message?: CoreMessageType | null;
channel: Nullable<GroupChannel>;
isDateSeparatorConsidered?: boolean;
}
const iconType = {
[OutgoingMessageStates.SENT]: IconTypes.DONE,
[OutgoingMessageStates.DELIVERED]: IconTypes.DONE_ALL,
[OutgoingMessageStates.READ]: IconTypes.DONE_ALL,
[OutgoingMessageStates.FAILED]: IconTypes.ERROR,
[OutgoingMessageStates.PENDING]: undefined,
[OutgoingMessageStates.NONE]: undefined,
};
const iconColor = {
[OutgoingMessageStates.SENT]: IconColors.SENT,
[OutgoingMessageStates.DELIVERED]: IconColors.SENT,
[OutgoingMessageStates.READ]: IconColors.READ,
[OutgoingMessageStates.FAILED]: IconColors.ERROR,
[OutgoingMessageStates.PENDING]: undefined,
[OutgoingMessageStates.NONE]: undefined,
};
export default function MessageStatus({
className,
message,
channel,
isDateSeparatorConsidered = true,
}: MessageStatusProps): React.ReactElement {
const { stringSet, dateLocale } = useLocalization();
const status = getOutgoingMessageState(channel, message);
const hideMessageStatusIcon = channel?.isGroupChannel?.() && (
(channel.isSuper || channel.isBroadcast)
&& !(status === OutgoingMessageStates.PENDING || status === OutgoingMessageStates.FAILED)
);
return (
<div
className={[
...(Array.isArray(className) ? className : [className]),
'sendbird-message-status',
].join(' ')}
>
{(status === OutgoingMessageStates.PENDING) ? (
<Loader
className="sendbird-message-status__icon"
testID="sendbird-message-status-icon"
width="16px"
height="16px"
>
<Icon
type={IconTypes.SPINNER}
fillColor={IconColors.PRIMARY}
width="16px"
height="16px"
/>
</Loader>
) : (
<Icon
className={classnames('sendbird-message-status__icon', hideMessageStatusIcon && 'hide-icon', status !== OutgoingMessageStates.FAILED && 'sendbird-message-status--sent')}
testID="sendbird-message-status-icon"
type={iconType[status] || IconTypes.ERROR}
fillColor={iconColor[status]}
width="16px"
height="16px"
/>
)}
{isSentStatus(status) && (
<Label
className="sendbird-message-status__text"
testID="sendbird-message-status-text"
type={LabelTypography.CAPTION_3}
color={LabelColors.ONBACKGROUND_2}
>
{
isDateSeparatorConsidered
? format(message?.createdAt || 0, stringSet.DATE_FORMAT__MESSAGE_CREATED_AT, { locale: dateLocale })
: getLastMessageCreatedAt({ channel, locale: dateLocale, stringSet })
}
</Label>
)}
</div>
);
}