UNPKG

@sendbird/uikit-react-native

Version:

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

196 lines 7.62 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, { useRef } from 'react'; import { Text, useUIKitTheme } from '@sendbird/uikit-react-native-foundation'; import { getMessageType, isMyMessage, isVoiceMessage } from '@sendbird/uikit-utils'; import { VOICE_MESSAGE_META_ARRAY_DURATION_KEY } from '../../constants'; import SBUUtils from '../../libs/SBUUtils'; import { usePlatformService, useSendbirdChat } from './../../hooks/useContext'; import ThreadParentMessageFile from './ThreadParentMessage.file'; import ThreadParentMessageFileImage from './ThreadParentMessage.file.image'; import ThreadParentMessageFileVideo from './ThreadParentMessage.file.video'; import ThreadParentMessageFileVoice from './ThreadParentMessage.file.voice'; import ThreadParentMessageUser from './ThreadParentMessage.user'; import ThreadParentMessageUserOg from './ThreadParentMessage.user.og'; const ThreadParentMessageRenderer = props => { const playerUnsubscribes = useRef([]); const { sbOptions, currentUser, mentionManager } = useSendbirdChat(); const { palette } = useUIKitTheme(); const { mediaService, playerService } = usePlatformService(); const parentMessage = props.parentMessage; const resetPlayer = async () => { playerUnsubscribes.current.forEach(unsubscribe => { try { unsubscribe(); } catch {} }); playerUnsubscribes.current.length = 0; await playerService.reset(); }; const messageProps = { onPressURL: url => SBUUtils.openURL(url), onToggleVoiceMessage: async (state, setState) => { if (isVoiceMessage(parentMessage) && parentMessage.sendingStatus === 'succeeded') { if (playerService.uri === parentMessage.url) { if (playerService.state === 'playing') { await playerService.pause(); } else { await playerService.play(parentMessage.url); } } else { if (playerService.state !== 'idle') { await resetPlayer(); } const shouldSeekToTime = state.duration > state.currentTime && state.currentTime > 0; let seekFinished = !shouldSeekToTime; const forPlayback = playerService.addPlaybackListener(_ref => { let { stopped, currentTime, duration } = _ref; if (seekFinished) { setState(prevState => ({ ...prevState, currentTime: stopped ? 0 : currentTime, duration })); } }); const forState = playerService.addStateListener(state => { switch (state) { case 'preparing': setState(prevState => ({ ...prevState, status: 'preparing' })); break; case 'playing': setState(prevState => ({ ...prevState, status: 'playing' })); break; case 'idle': case 'paused': { setState(prevState => ({ ...prevState, status: 'paused' })); break; } case 'stopped': setState(prevState => ({ ...prevState, status: 'paused' })); break; } }); playerUnsubscribes.current.push(forPlayback, forState); await playerService.play(parentMessage.url); if (shouldSeekToTime) { await playerService.seek(state.currentTime); seekFinished = true; } } } }, ...props }; 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 _parentMessage$mentio; let { match, groups, parentProps, index, keyPrefix } = _ref2; const user = (_parentMessage$mentio = parentMessage.mentionedUsers) === null || _parentMessage$mentio === void 0 ? void 0 : _parentMessage$mentio.find(it => it.userId === groups[2]); if (user) { const mentionColor = !isMyMessage(parentMessage, 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; } }] }; switch (getMessageType(props.parentMessage)) { case 'user': { return /*#__PURE__*/React.createElement(ThreadParentMessageUser, _extends({}, userMessageProps, messageProps)); } case 'user.opengraph': { return /*#__PURE__*/React.createElement(ThreadParentMessageUserOg, _extends({}, userMessageProps, messageProps)); } case 'file': case 'file.audio': { return /*#__PURE__*/React.createElement(ThreadParentMessageFile, messageProps); } case 'file.video': { return /*#__PURE__*/React.createElement(ThreadParentMessageFileVideo, _extends({ fetchThumbnailFromVideoSource: uri => mediaService.getVideoThumbnail({ url: uri, timeMills: 1000 }) }, messageProps)); } case 'file.image': { return /*#__PURE__*/React.createElement(ThreadParentMessageFileImage, messageProps); } case 'file.voice': { return /*#__PURE__*/React.createElement(ThreadParentMessageFileVoice, _extends({ durationMetaArrayKey: VOICE_MESSAGE_META_ARRAY_DURATION_KEY, onUnmount: () => { if (isVoiceMessage(parentMessage) && playerService.uri === parentMessage.url) { resetPlayer(); } } }, messageProps)); } default: { return null; } } }; export default /*#__PURE__*/React.memo(ThreadParentMessageRenderer); //# sourceMappingURL=index.js.map