UNPKG

@gathertown/uikit-react-native

Version:

Sendbird UIKit for React Native: A feature-rich and customizable chat UI kit with messaging, channel management, and user authentication.

207 lines 8.55 kB
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } import React from 'react'; import { Box, GroupChannelMessage, Text, useUIKitTheme } from '@gathertown/uikit-react-native-foundation'; import { calcMessageGrouping, getMessageType, isMyMessage, shouldRenderParentMessage, shouldRenderReaction, useIIFE } from '@gathertown/uikit-utils'; 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 = _ref => { let { channel, message, onPress, onLongPress, onPressParentMessage, onShowUserProfile, enableMessageGrouping, focused, prevMessage, nextMessage } = _ref; 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 /*#__PURE__*/React.createElement(ReactionAddons.Message, { channel: channel, message: message }); } return null; }); const variant = isMyMessage(message, currentUser === null || currentUser === void 0 ? void 0 : currentUser.userId) ? 'outgoing' : 'incoming'; const messageProps = { channel, variant, onPress, onLongPress, onPressURL: url => SBUUtils.openURL(url), onPressAvatar: () => { if ('sender' in message) onShowUserProfile === null || onShowUserProfile === void 0 ? void 0 : onShowUserProfile(message.sender); }, onPressMentionedUser: mentionedUser => { if (mentionedUser) onShowUserProfile === null || onShowUserProfile === void 0 ? void 0 : onShowUserProfile(mentionedUser); }, groupedWithPrev: groupWithPrev, groupedWithNext: groupWithNext, children: reactionChildren, sendingStatus: isMyMessage(message, currentUser === null || currentUser === void 0 ? void 0 : currentUser.userId) ? /*#__PURE__*/React.createElement(GroupChannelMessageOutgoingStatus, { channel: channel, message: message }) : null, parentMessage: shouldRenderParentMessage(message) ? /*#__PURE__*/React.createElement(GroupChannelMessageParentMessage, { variant: variant, childMessage: message, message: message.parentMessage, onPress: onPressParentMessage }) : 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 => { if (mentionManager.shouldUseMentionedMessageTemplate(message, sbOptions.uikit.groupChannel.channel.enableMention)) { return message.mentionedMessageTemplate; } else { return message.message; } }, regexTextPatterns: [{ regex: mentionManager.templateRegex, replacer(_ref2) { var _message$mentionedUse; let { match, groups, parentProps, index, keyPrefix } = _ref2; const user = (_message$mentionedUse = message.mentionedUsers) === null || _message$mentionedUse === void 0 ? void 0 : _message$mentionedUse.find(it => it.userId === groups[2]); if (user) { const mentionColor = !isMyMessage(message, currentUser === null || currentUser === void 0 ? void 0 : currentUser.userId) && user.userId === (currentUser === null || currentUser === void 0 ? void 0 : currentUser.userId) ? palette.onBackgroundLight01 : parentProps === null || parentProps === void 0 ? void 0 : parentProps.color; return /*#__PURE__*/React.createElement(Text, _extends({}, parentProps, { key: `${keyPrefix}-${index}`, color: mentionColor, onPress: () => { var _messageProps$onPress; return (_messageProps$onPress = messageProps.onPressMentionedUser) === null || _messageProps$onPress === void 0 ? void 0 : _messageProps$onPress.call(messageProps, user); }, onLongPress: messageProps.onLongPress, style: [parentProps === null || parentProps === void 0 ? void 0 : parentProps.style, { fontWeight: '700' }, user.userId === (currentUser === null || currentUser === void 0 ? void 0 : currentUser.userId) && { backgroundColor: palette.highlight }] }), `${mentionManager.asMentionedMessageText(user)}`); } return match; } }] }; const renderMessage = () => { switch (getMessageType(message)) { case 'admin': { return /*#__PURE__*/React.createElement(GroupChannelMessage.Admin, _extends({ message: message }, messageProps)); } case 'user': case 'user.opengraph': { if (message.ogMetaData && sbOptions.uikitWithAppInfo.groupChannel.channel.enableOgtag) { return /*#__PURE__*/React.createElement(GroupChannelMessage.OpenGraphUser, _extends({ message: message }, userMessageProps, messageProps)); } else { return /*#__PURE__*/React.createElement(GroupChannelMessage.User, _extends({ message: message }, userMessageProps, messageProps)); } } case 'file': case 'file.audio': { return /*#__PURE__*/React.createElement(GroupChannelMessage.File, _extends({ message: message }, messageProps)); } case 'file.image': { return /*#__PURE__*/React.createElement(GroupChannelMessage.ImageFile, _extends({ message: message }, messageProps)); } case 'file.video': { return /*#__PURE__*/React.createElement(GroupChannelMessage.VideoFile, _extends({ message: message, fetchThumbnailFromVideoSource: uri => mediaService.getVideoThumbnail({ url: uri, timeMills: 1000 }) }, messageProps)); } case 'unknown': default: { return /*#__PURE__*/React.createElement(GroupChannelMessage.Unknown, _extends({ message: message }, messageProps)); } } }; const messageGap = useIIFE(() => { if (message.isAdminMessage()) { if (nextMessage !== null && nextMessage !== void 0 && nextMessage.isAdminMessage()) { return 8; } else { return 16; } } else if (nextMessage && shouldRenderParentMessage(nextMessage)) { return 16; } else if (groupWithNext) { return 2; } else { return 16; } }); return /*#__PURE__*/React.createElement(Box, { paddingHorizontal: 16, marginBottom: messageGap }, /*#__PURE__*/React.createElement(GroupChannelMessageDateSeparator, { message: message, prevMessage: prevMessage }), /*#__PURE__*/React.createElement(GroupChannelMessageFocusAnimation, { focused: focused }, renderMessage())); }; export default /*#__PURE__*/React.memo(GroupChannelMessageRenderer); //# sourceMappingURL=index.js.map