diff --git a/package/src/components/ChannelPreview/ChannelMessagePreview.tsx b/package/src/components/ChannelPreview/ChannelMessagePreview.tsx new file mode 100644 index 0000000000..0527ab3112 --- /dev/null +++ b/package/src/components/ChannelPreview/ChannelMessagePreview.tsx @@ -0,0 +1,72 @@ +import React, { useMemo } from 'react'; +import { View, Text, StyleSheet } from 'react-native'; + +import { DraftMessage, LocalMessage, MessageResponse } from 'stream-chat'; + +import { useTheme } from '../../contexts/themeContext/ThemeContext'; +import { useMessagePreviewIcon, useMessagePreviewText } from '../../hooks'; +import { primitives } from '../../theme'; + +export type ChannelMessagePreviewProps = { + message: LocalMessage | MessageResponse | DraftMessage; +}; + +export const ChannelMessagePreview = ({ message }: ChannelMessagePreviewProps) => { + const isMessageDeleted = message?.type === 'deleted'; + const { + theme: { semantics }, + } = useTheme(); + const styles = useStyles({ isMessageDeleted }); + const MessagePreviewIcon = useMessagePreviewIcon({ message }); + const messagePreviewTitle = useMessagePreviewText({ message }); + + return ( + + {MessagePreviewIcon ? ( + + ) : null} + + {messagePreviewTitle} + + + ); +}; + +const useStyles = ({ isMessageDeleted = false }: { isMessageDeleted?: boolean }) => { + const { + theme: { + channelPreview: { messagePreview }, + semantics, + }, + } = useTheme(); + return useMemo(() => { + return StyleSheet.create({ + container: { + flexDirection: 'row', + alignItems: 'center', + gap: primitives.spacingXxs, + flexShrink: 1, + ...messagePreview.container, + }, + subtitle: { + color: isMessageDeleted ? semantics.textTertiary : semantics.textSecondary, + fontSize: primitives.typographyFontSizeSm, + fontWeight: primitives.typographyFontWeightRegular, + includeFontPadding: false, + lineHeight: primitives.typographyLineHeightNormal, + flexShrink: 1, + ...messagePreview.subtitle, + }, + }); + }, [ + isMessageDeleted, + semantics.textTertiary, + semantics.textSecondary, + messagePreview.container, + messagePreview.subtitle, + ]); +}; diff --git a/package/src/components/ChannelPreview/ChannelListMessageDeliveryStatus.tsx b/package/src/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.tsx similarity index 70% rename from package/src/components/ChannelPreview/ChannelListMessageDeliveryStatus.tsx rename to package/src/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.tsx index b7ebb4afdb..4048c40920 100644 --- a/package/src/components/ChannelPreview/ChannelListMessageDeliveryStatus.tsx +++ b/package/src/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.tsx @@ -1,28 +1,26 @@ import React, { useMemo } from 'react'; import { StyleSheet, Text, View } from 'react-native'; -import { LocalMessage } from 'stream-chat'; +import { LocalMessage, MessageResponse } from 'stream-chat'; import { ChannelPreviewProps } from './ChannelPreview'; -import { LastMessageType } from './hooks/useChannelPreviewData'; - -import { MessageDeliveryStatus, useMessageDeliveryStatus } from './hooks/useMessageDeliveryStatus'; 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 ChannelListMessageDeliveryStatusProps = Pick & { - lastMessage: LastMessageType; +export type ChannelMessagePreviewDeliveryStatusProps = Pick & { + message: MessageResponse | LocalMessage; }; -export const ChannelListMessageDeliveryStatus = ({ +export const ChannelMessagePreviewDeliveryStatus = ({ channel, - lastMessage, -}: ChannelListMessageDeliveryStatusProps) => { + message, +}: ChannelMessagePreviewDeliveryStatusProps) => { const { client } = useChatContext(); const { t } = useTranslationContext(); const channelConfigExists = typeof channel?.getConfig === 'function'; @@ -36,9 +34,15 @@ export const ChannelListMessageDeliveryStatus = ({ }, } = 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 lastMessage?.user?.id === client.user?.id; - }, [lastMessage, client.user?.id]); + return message?.user?.id === client.user?.id; + }, [message, client.user?.id]); const readEvents = useMemo(() => { if (!channelConfigExists) { @@ -53,19 +57,23 @@ export const ChannelListMessageDeliveryStatus = ({ const { status } = useMessageDeliveryStatus({ channel, - lastMessage: lastMessage as LocalMessage, + lastMessage: message as LocalMessage, isReadEventsEnabled: readEvents, }); - if (!isLastMessageByCurrentUser) { + if (!channel.data?.name && membersWithoutSelf.length === 1 && !isLastMessageByCurrentUser) { return null; } + if (!isLastMessageByCurrentUser) { + return {message?.user?.name || message?.user?.id}:; + } + return ( - {lastMessage.status === MessageStatusTypes.SENDING ? ( + {message.status === MessageStatusTypes.SENDING ? (