import React, { useMemo } from 'react';
import { StyleSheet, Text, View } from 'react-native';
import { Channel, LocalMessage } from 'stream-chat';
import { useChatContext } from '../../contexts/chatContext/ChatContext';
import { useTheme } from '../../contexts/themeContext/ThemeContext';
import { useTranslationContext } from '../../contexts/translationContext/TranslationContext';
import { MessageDeliveryStatus, useMessageDeliveryStatus } from '../../hooks';
import { Check, CheckAll, Time } from '../../icons';
import { primitives } from '../../theme';
import { MessageStatusTypes } from '../../utils/utils';
export type ThreadMessagePreviewDeliveryStatusProps = {
channel: Channel;
message: LocalMessage;
};
export const ThreadMessagePreviewDeliveryStatus = ({
channel,
message,
}: ThreadMessagePreviewDeliveryStatusProps) => {
const { client } = useChatContext();
const { t } = useTranslationContext();
const channelConfigExists = typeof channel?.getConfig === 'function';
const styles = useStyles();
const {
theme: {
channelPreview: {
messageDeliveryStatus: { checkAllIcon, checkIcon, timeIcon },
},
semantics,
},
} = useTheme();
const membersWithoutSelf = useMemo(() => {
return Object.values(channel.state?.members || {}).filter(
(member) => member.user?.id !== client.user?.id,
);
}, [channel.state?.members, client.user?.id]);
const isLastMessageByCurrentUser = useMemo(() => {
return message?.user?.id === client.user?.id;
}, [message, client.user?.id]);
const readEvents = useMemo(() => {
if (!channelConfigExists) {
return true;
}
const read_events = !channel.disconnected && !!channel?.id && channel.getConfig()?.read_events;
if (typeof read_events !== 'boolean') {
return true;
}
return read_events;
}, [channelConfigExists, channel]);
const { status } = useMessageDeliveryStatus({
channel,
lastMessage: message as LocalMessage,
isReadEventsEnabled: readEvents,
});
if (!channel.data?.name && membersWithoutSelf.length === 1 && !isLastMessageByCurrentUser) {
return null;
}
if (!isLastMessageByCurrentUser) {
return {message?.user?.name || message?.user?.id}:;
}
return (
{message.status === MessageStatusTypes.SENDING ? (
) : message.status === MessageStatusTypes.RECEIVED &&
status === MessageDeliveryStatus.READ ? (
) : status === MessageDeliveryStatus.DELIVERED ? (
) : status === MessageDeliveryStatus.SENT ? (
) : null}
{t('You')}:
);
};
const useStyles = () => {
const {
theme: {
semantics,
threadListItem: {
messagePreviewDeliveryStatus: { container, text, username },
},
},
} = useTheme();
return useMemo(() => {
return StyleSheet.create({
container: {
flexDirection: 'row',
alignItems: 'center',
gap: primitives.spacingXxs,
...container,
},
text: {
color: semantics.textSecondary,
fontSize: primitives.typographyFontSizeMd,
fontWeight: primitives.typographyFontWeightSemiBold,
lineHeight: primitives.typographyLineHeightNormal,
...text,
},
username: {
color: semantics.textSecondary,
fontSize: primitives.typographyFontSizeMd,
fontWeight: primitives.typographyFontWeightSemiBold,
lineHeight: primitives.typographyLineHeightNormal,
...username,
},
});
}, [semantics, text, container, username]);
};