import React from 'react'; import type { GroupChannelMessageProps, RegexTextPattern } from '@gathertown/uikit-react-native-foundation'; import { Box, GroupChannelMessage, Text, useUIKitTheme } from '@gathertown/uikit-react-native-foundation'; import { SendbirdAdminMessage, SendbirdFileMessage, SendbirdMessage, SendbirdUserMessage, calcMessageGrouping, getMessageType, isMyMessage, shouldRenderParentMessage, shouldRenderReaction, useIIFE, } from '@gathertown/uikit-utils'; import type { GroupChannelProps } from '../../domain/groupChannel/types'; import { useLocalization, usePlatformService, useSendbirdChat } from '../../hooks/useContext'; import SBUUtils from '../../libs/SBUUtils'; import { ReactionAddons } from '../ReactionAddons'; import GroupChannelMessageDateSeparator from './GroupChannelMessageDateSeparator'; import GroupChannelMessageFocusAnimation from './GroupChannelMessageFocusAnimation'; import GroupChannelMessageOutgoingStatus from './GroupChannelMessageOutgoingStatus'; import GroupChannelMessageParentMessage from './GroupChannelMessageParentMessage'; const GroupChannelMessageRenderer: GroupChannelProps['Fragment']['renderMessage'] = ({ channel, message, onPress, onLongPress, onPressParentMessage, onShowUserProfile, enableMessageGrouping, focused, prevMessage, nextMessage, }) => { const { palette } = useUIKitTheme(); const { sbOptions, currentUser, mentionManager } = useSendbirdChat(); const { STRINGS } = useLocalization(); const { mediaService } = usePlatformService(); const { groupWithPrev, groupWithNext } = calcMessageGrouping( Boolean(enableMessageGrouping), message, prevMessage, nextMessage, ); const reactionChildren = useIIFE(() => { if ( shouldRenderReaction(channel, sbOptions.uikitWithAppInfo.groupChannel.channel.enableReactions) && message.reactions && message.reactions.length > 0 ) { return ; } return null; }); const variant = isMyMessage(message, currentUser?.userId) ? 'outgoing' : 'incoming'; const messageProps: Omit, 'message'> = { channel, variant, onPress, onLongPress, onPressURL: (url) => SBUUtils.openURL(url), onPressAvatar: () => { if ('sender' in message) onShowUserProfile?.(message.sender); }, onPressMentionedUser: (mentionedUser) => { if (mentionedUser) onShowUserProfile?.(mentionedUser); }, groupedWithPrev: groupWithPrev, groupedWithNext: groupWithNext, children: reactionChildren, sendingStatus: isMyMessage(message, currentUser?.userId) ? ( ) : null, parentMessage: shouldRenderParentMessage(message) ? ( ) : null, strings: { edited: STRINGS.GROUP_CHANNEL.MESSAGE_BUBBLE_EDITED_POSTFIX, senderName: ('sender' in message && message.sender.nickname) || STRINGS.LABELS.USER_NO_NAME, sentDate: STRINGS.GROUP_CHANNEL.MESSAGE_BUBBLE_TIME(message), fileName: message.isFileMessage() ? STRINGS.GROUP_CHANNEL.MESSAGE_BUBBLE_FILE_TITLE(message) : '', unknownTitle: STRINGS.GROUP_CHANNEL.MESSAGE_BUBBLE_UNKNOWN_TITLE(message), unknownDescription: STRINGS.GROUP_CHANNEL.MESSAGE_BUBBLE_UNKNOWN_DESC(message), }, }; const userMessageProps: { renderRegexTextChildren: (message: SendbirdUserMessage) => string; regexTextPatterns: RegexTextPattern[]; } = { renderRegexTextChildren: (message) => { if ( mentionManager.shouldUseMentionedMessageTemplate(message, sbOptions.uikit.groupChannel.channel.enableMention) ) { return message.mentionedMessageTemplate; } else { return message.message; } }, regexTextPatterns: [ { regex: mentionManager.templateRegex, replacer({ match, groups, parentProps, index, keyPrefix }) { const user = message.mentionedUsers?.find((it) => it.userId === groups[2]); if (user) { const mentionColor = !isMyMessage(message, currentUser?.userId) && user.userId === currentUser?.userId ? palette.onBackgroundLight01 : parentProps?.color; return ( messageProps.onPressMentionedUser?.(user)} onLongPress={messageProps.onLongPress} style={[ parentProps?.style, { fontWeight: '700' }, user.userId === currentUser?.userId && { backgroundColor: palette.highlight }, ]} > {`${mentionManager.asMentionedMessageText(user)}`} ); } return match; }, }, ], }; const renderMessage = () => { switch (getMessageType(message)) { case 'admin': { return ; } case 'user': case 'user.opengraph': { if (message.ogMetaData && sbOptions.uikitWithAppInfo.groupChannel.channel.enableOgtag) { return ( ); } else { return ( ); } } case 'file': case 'file.audio': { return ; } case 'file.image': { return ; } case 'file.video': { return ( mediaService.getVideoThumbnail({ url: uri, timeMills: 1000 })} {...messageProps} /> ); } case 'unknown': default: { return ; } } }; const messageGap = useIIFE(() => { if (message.isAdminMessage()) { if (nextMessage?.isAdminMessage()) { return 8; } else { return 16; } } else if (nextMessage && shouldRenderParentMessage(nextMessage)) { return 16; } else if (groupWithNext) { return 2; } else { return 16; } }); return ( {renderMessage()} ); }; export default React.memo(GroupChannelMessageRenderer);