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);