import React, { useContext, useEffect, useState } from 'react'; import { Box, Icon, ImageWithPlaceholder, PressBox, Text, VideoThumbnail, createStyleSheet, useUIKitTheme, } from '@sendbird/uikit-react-native-foundation'; import { SendbirdFileMessage, SendbirdGroupChannel, SendbirdMessage, SendbirdUserMessage, getFileIconFromMessageType, getMessageType, getThumbnailUriFromFileMessage, truncate, useIIFE, } from '@sendbird/uikit-utils'; import { GroupChannelContexts } from '../../domain/groupChannel/module/moduleContext'; import { useLocalization, usePlatformService, useSendbirdChat } from '../../hooks/useContext'; type Props = { variant: 'outgoing' | 'incoming'; channel: SendbirdGroupChannel; message: SendbirdUserMessage | SendbirdFileMessage; childMessage: SendbirdUserMessage | SendbirdFileMessage; onPress?: (parentMessage: SendbirdMessage, childMessage: SendbirdUserMessage | SendbirdFileMessage) => void; }; const GroupChannelMessageParentMessage = ({ variant, channel, message, childMessage, onPress }: Props) => { const { currentUser } = useSendbirdChat(); const groupChannelPubSub = useContext(GroupChannelContexts.PubSub); const { select, colors, palette } = useUIKitTheme(); const { STRINGS } = useLocalization(); const { mediaService } = usePlatformService(); const [parentMessage, setParentMessage] = useState(() => message); const type = getMessageType(parentMessage); useEffect(() => { return groupChannelPubSub.subscribe(({ type, data }) => { if (type === 'MESSAGES_UPDATED') { const updatedParent = data.messages.find((it): it is SendbirdUserMessage | SendbirdFileMessage => { return it.messageId === parentMessage.messageId; }); if (updatedParent) setParentMessage(updatedParent); } }); }, []); const renderMessageWithText = (message: string) => { return ( {message} ); }; const renderFileMessageAsVideoThumbnail = (url: string) => { return ( mediaService.getVideoThumbnail({ url: uri, timeMills: 1000 })} /> ); }; const renderFileMessageAsPreview = (url: string) => { return ; }; const renderFileMessageAsDownloadable = (name: string) => { return ( {truncate(name, { mode: 'mid', maxLen: 20 })} ); }; const parentMessageComponent = useIIFE(() => { if (channel.messageOffsetTimestamp > parentMessage.createdAt) { return renderMessageWithText(STRINGS.LABELS.MESSAGE_UNAVAILABLE); } switch (type) { case 'user': case 'user.opengraph': { return renderMessageWithText((parentMessage as SendbirdUserMessage).message); } case 'file': case 'file.audio': { return renderFileMessageAsDownloadable((parentMessage as SendbirdFileMessage).name); } case 'file.video': { return renderFileMessageAsVideoThumbnail(getThumbnailUriFromFileMessage(parentMessage as SendbirdFileMessage)); } case 'file.image': { return renderFileMessageAsPreview(getThumbnailUriFromFileMessage(parentMessage as SendbirdFileMessage)); } case 'file.voice': { return renderMessageWithText(STRINGS.LABELS.VOICE_MESSAGE); } default: { return null; } } }); return ( onPress?.(parentMessage, childMessage)} style={styles.senderLabel}> {STRINGS.LABELS.REPLY_FROM_SENDER_TO_RECEIVER(childMessage, parentMessage, currentUser?.userId)} onPress?.(parentMessage, childMessage)}>{parentMessageComponent} ); }; const styles = createStyleSheet({ messageContainer: { opacity: 0.5, marginTop: 4, marginBottom: -6, }, bubbleContainer: { maxWidth: 220, overflow: 'hidden', flexDirection: 'row', alignItems: 'center', borderRadius: 16, paddingHorizontal: 12, paddingBottom: 12, paddingTop: 6, }, image: { width: 156, height: 104, borderRadius: 16, overflow: 'hidden', }, fileIcon: { width: 16, height: 16, borderRadius: 10, marginEnd: 4, marginTop: 2, }, senderLabel: { flexDirection: 'row', }, }); export default GroupChannelMessageParentMessage;