UNPKG

@sendbird/uikit-react

Version:

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

318 lines (312 loc) 22.1 kB
'use strict'; var _tslib = require('../../chunks/bundle-DdEJUQ3V.js'); var React = require('react'); var index$1 = require('../../chunks/bundle-CyQuENXQ.js'); var RemoveMessageModal = require('../../chunks/bundle-CjgU3l0w.js'); var Thread_components_ParentMessageInfoItem = require('./ParentMessageInfoItem.js'); var index = require('../../chunks/bundle-BUPw_lsA.js'); var getIsReactionEnabled = require('../../chunks/bundle-DFpSNLcN.js'); var LocalizationContext = require('../../chunks/bundle-REYf6P50.js'); var UserProfileContext = require('../../chunks/bundle-H44hyvFN.js'); var SuggestedMentionList = require('../../chunks/bundle-D0cv-92J.js'); var ui_Avatar = require('../../chunks/bundle-B4Oz6Uwy.js'); var ui_Label = require('../../chunks/bundle-D66YmzI6.js'); var ui_FileViewer = require('../../ui/FileViewer.js'); var ui_MessageItemReactionMenu = require('../../ui/MessageItemReactionMenu.js'); var ui_ContextMenu = require('../../chunks/bundle-BWLRRAFI.js'); var ui_UserProfile = require('../../ui/UserProfile.js'); var ui_MessageInput = require('../../ui/MessageInput.js'); var _const = require('../../chunks/bundle-Dc6k4jof.js'); var types = require('../../chunks/bundle-C73YyNPC.js'); var MediaQueryContext = require('../../chunks/bundle-BmtTyZzB.js'); var useLongPress = require('../../chunks/bundle-y6-ks46c.js'); var ui_MobileMenu = require('../../ui/MobileMenu.js'); var Message_hooks_useDirtyGetMentions = require('../../Message/hooks/useDirtyGetMentions.js'); var resolvedReplyType = require('../../chunks/bundle-kYn7Bizj.js'); var utils = require('../../chunks/bundle-kfqOElgK.js'); var MessageMenu = require('../../chunks/bundle-v95Xmjt9.js'); var useElementObserver = require('../../chunks/bundle-DYiDFr98.js'); var ThreadProvider = require('../../chunks/bundle-BL6JVo1H.js'); var useSendbird = require('../../chunks/bundle-D6mmpicY.js'); require('../../chunks/bundle-BAy4Z2n_.js'); require('../../chunks/bundle-C7WnFc5I.js'); require('../../chunks/bundle-OV9QvRP8.js'); require('react-dom'); require('../../ui/IconButton.js'); require('../../ui/Button.js'); require('../../ui/Icon.js'); require('../../chunks/bundle-BeuUz2c0.js'); require('../../chunks/bundle-Bj7CL3aP.js'); require('../../chunks/bundle-CEY5QNl7.js'); require('../../ui/ImageRenderer.js'); require('../../ui/TextButton.js'); require('../../chunks/bundle-qNUnRJ-F.js'); require('../../ui/EmojiReactions.js'); require('../../ui/ReactionBadge.js'); require('../../ui/ReactionButton.js'); require('../../ui/BottomSheet.js'); require('../../hooks/useModal.js'); require('../../chunks/bundle-BE-eUbjS.js'); require('../../chunks/bundle-HERYYUXZ.js'); require('../../chunks/bundle-DWBI0JnU.js'); require('@sendbird/chat'); require('@sendbird/chat/groupChannel'); require('@sendbird/chat/openChannel'); require('../../ui/UserListItem.js'); require('../../ui/MutedAvatarOverlay.js'); require('../../ui/Checkbox.js'); require('../../chunks/bundle-CHvo3SHq.js'); require('../../sendbirdSelectors.js'); require('../../chunks/bundle-CyJimqL9.js'); require('../../ui/SortByRow.js'); require('../../utils/message/getOutgoingMessageState.js'); require('../../chunks/bundle-DFNM8KjC.js'); require('../../ui/Tooltip.js'); require('../../ui/TooltipWrapper.js'); require('../../Message/context.js'); require('../../ui/VoiceMessageItemBody.js'); require('../../ui/ProgressBar.js'); require('../../VoicePlayer/useVoicePlayer.js'); require('../../chunks/bundle-CWVSskOQ.js'); require('../../VoiceRecorder/context.js'); require('../../ui/PlaybackTime.js'); require('../../ui/Loader.js'); require('../../chunks/bundle-D1jvTvhG.js'); require('../../chunks/bundle-WPa3lxwD.js'); require('../../ui/MentionLabel.js'); require('../../ui/LinkLabel.js'); require('../../chunks/bundle-BOXZxrtw.js'); require('@sendbird/chat/message'); require('../../chunks/bundle-rpradL3a.js'); require('../../chunks/bundle-JR9-1BeM.js'); require('../../chunks/bundle-C8vJRfhx.js'); require('@sendbird/uikit-tools'); require('../../chunks/bundle-CTz3qwYY.js'); require('dompurify'); require('../../chunks/bundle-fVfMBori.js'); require('../../chunks/bundle-n_eAVYbo.js'); require('../../chunks/bundle-L5zC6xWM.js'); require('../../chunks/bundle-BH5CILPf.js'); require('../../chunks/bundle-C9bb3iWF.js'); require('../../chunks/bundle-HkyQ0DjT.js'); require('../context/types.js'); require('../../chunks/bundle-DwuvGkzI.js'); function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; } var React__default = /*#__PURE__*/_interopDefaultCompat(React); function ParentMessageInfo(_a) { var _this = this; var _b, _c, _d, _e, _f, _g; var className = _a.className, _h = _a.renderEmojiMenu, renderEmojiMenu = _h === void 0 ? function (props) { return React__default.default.createElement(ui_MessageItemReactionMenu.MessageEmojiMenu, _tslib.__assign({}, props)); } : _h, _j = _a.renderMessageMenu, renderMessageMenu = _j === void 0 ? function (props) { return React__default.default.createElement(MessageMenu.MessageMenu, _tslib.__assign({}, props)); } : _j; var _k = useSendbird.useSendbird().state, stores = _k.stores, config = _k.config; var isOnline = config.isOnline, userMention = config.userMention, logger = config.logger, groupChannel = config.groupChannel; var userId = (_c = (_b = stores.userStore.user) === null || _b === void 0 ? void 0 : _b.userId) !== null && _c !== void 0 ? _c : ''; var _l = LocalizationContext.useLocalization(), dateLocale = _l.dateLocale, stringSet = _l.stringSet; var _m = ThreadProvider.useThread(), _o = _m.state, currentChannel = _o.currentChannel, parentMessage = _o.parentMessage, allThreadMessages = _o.allThreadMessages, emojiContainer = _o.emojiContainer, onMoveToParentMessage = _o.onMoveToParentMessage, onHeaderActionClick = _o.onHeaderActionClick, isMuted = _o.isMuted, isChannelFrozen = _o.isChannelFrozen, onBeforeDownloadFileMessage = _o.onBeforeDownloadFileMessage, filterEmojiCategoryIds = _o.filterEmojiCategoryIds, _p = _m.actions, toggleReaction = _p.toggleReaction, updateMessage = _p.updateMessage, deleteMessage = _p.deleteMessage; var isMobile = MediaQueryContext.useMediaQueryContext().isMobile; var isMenuMounted = useElementObserver.useElementObserver("#".concat(ui_ContextMenu.getObservingId(parentMessage.messageId), ".").concat(ui_ContextMenu.MENU_OBSERVING_CLASS_NAME), [ document.getElementById(ui_ContextMenu.MENU_ROOT_ID), document.getElementById(ui_ContextMenu.EMOJI_MENU_ROOT_ID), ]); var _q = React.useState(false), showRemove = _q[0], setShowRemove = _q[1]; var _r = React.useState(false), showFileViewer = _r[0], setShowFileViewer = _r[1]; var isReactionEnabled = getIsReactionEnabled.getIsReactionEnabled({ channel: currentChannel, config: config, }); var isMentionEnabled = groupChannel.enableMention; var replyType = resolvedReplyType.getCaseResolvedReplyType(groupChannel.replyType).upperCase; var isByMe = userId === parentMessage.sender.userId; // Mobile var mobileMenuRef = React.useRef(null); var _s = React.useState(false), showMobileMenu = _s[0], setShowMobileMenu = _s[1]; var longPress = useLongPress.useLongPress({ onLongPress: function () { if (isMobile) { setShowMobileMenu(true); } }, }, { shouldPreventDefault: false, }); // Edit message var _t = React.useState(false), showEditInput = _t[0], setShowEditInput = _t[1]; var disabled = !isOnline || isMuted || isChannelFrozen && !((currentChannel === null || currentChannel === void 0 ? void 0 : currentChannel.myRole) === types.Role.OPERATOR); // Mention var editMessageInputRef = React.useRef(null); var _u = React.useState(''), mentionNickname = _u[0], setMentionNickname = _u[1]; var _v = React.useState([]), mentionedUsers = _v[0], setMentionedUsers = _v[1]; var _w = React.useState([]), mentionedUserIds = _w[0], setMentionedUserIds = _w[1]; var _x = React.useState(null), messageInputEvent = _x[0], setMessageInputEvent = _x[1]; var _y = React.useState(null), selectedUser = _y[0], setSelectedUser = _y[1]; var _z = React.useState([]), mentionSuggestedUsers = _z[0], setMentionSuggestedUsers = _z[1]; var displaySuggestedMentionList = isOnline && isMentionEnabled && mentionNickname.length > 0 && !isMuted && !(isChannelFrozen && !(currentChannel.myRole === types.Role.OPERATOR)); var mentionNodes = Message_hooks_useDirtyGetMentions.useDirtyGetMentions({ ref: editMessageInputRef }, { logger: logger }); var ableMention = (mentionNodes === null || mentionNodes === void 0 ? void 0 : mentionNodes.length) < (userMention === null || userMention === void 0 ? void 0 : userMention.maxMentionCount); React.useEffect(function () { setMentionedUsers(mentionedUsers.filter(function (_a) { var userId = _a.userId; var i = mentionedUserIds.indexOf(userId); if (i < 0) { return false; } else { mentionedUserIds.splice(i, 1); return true; } })); }, [mentionedUserIds]); var handleOnDownloadClick = function (e) { return _tslib.__awaiter(_this, void 0, void 0, function () { var allowDownload, err_1; var _a, _b; return _tslib.__generator(this, function (_c) { switch (_c.label) { case 0: if (!onBeforeDownloadFileMessage) return [2 /*return*/]; _c.label = 1; case 1: _c.trys.push([1, 3, , 4]); return [4 /*yield*/, onBeforeDownloadFileMessage({ message: parentMessage })]; case 2: allowDownload = _c.sent(); if (!allowDownload) { e.preventDefault(); (_a = logger === null || logger === void 0 ? void 0 : logger.info) === null || _a === void 0 ? void 0 : _a.call(logger, 'ParentMessageInfo: Not allowed to download.'); } return [3 /*break*/, 4]; case 3: err_1 = _c.sent(); (_b = logger === null || logger === void 0 ? void 0 : logger.error) === null || _b === void 0 ? void 0 : _b.call(logger, 'ParentMessageInfo: Error occurred while determining download continuation:', err_1); return [3 /*break*/, 4]; case 4: return [2 /*return*/]; } }); }); }; // User Profile var avatarRef = React.useRef(null); var _0 = UserProfileContext.useUserProfileContext(), disableUserProfile = _0.disableUserProfile, renderUserProfile = _0.renderUserProfile; if (showEditInput && ((_d = parentMessage === null || parentMessage === void 0 ? void 0 : parentMessage.isUserMessage) === null || _d === void 0 ? void 0 : _d.call(parentMessage))) { return (React__default.default.createElement(React__default.default.Fragment, null, displaySuggestedMentionList && (React__default.default.createElement(SuggestedMentionList.SuggestedMentionList, { className: "parent-message-info--suggested-mention-list", targetNickname: mentionNickname, inputEvent: messageInputEvent !== null && messageInputEvent !== void 0 ? messageInputEvent : undefined, // renderUserMentionItem={renderUserMentionItem} onUserItemClick: function (user) { if (user) { setMentionedUsers(_tslib.__spreadArray(_tslib.__spreadArray([], mentionedUsers, true), [user], false)); } setMentionNickname(''); setSelectedUser(user); setMessageInputEvent(null); }, onFocusItemChange: function () { setMessageInputEvent(null); }, onFetchUsers: function (users) { setMentionSuggestedUsers(users); }, ableAddMention: ableMention, maxMentionCount: userMention === null || userMention === void 0 ? void 0 : userMention.maxMentionCount, maxSuggestionCount: userMention === null || userMention === void 0 ? void 0 : userMention.maxSuggestionCount })), React__default.default.createElement(ui_MessageInput, { channel: currentChannel, isEdit: true, disabled: disabled, ref: editMessageInputRef, mentionSelectedUser: selectedUser, isMentionEnabled: isMentionEnabled, message: parentMessage, onStartTyping: function () { var _a; (_a = currentChannel === null || currentChannel === void 0 ? void 0 : currentChannel.startTyping) === null || _a === void 0 ? void 0 : _a.call(currentChannel); }, onUpdateMessage: function (_a) { var _b; var messageId = _a.messageId, message = _a.message, mentionTemplate = _a.mentionTemplate; updateMessage({ messageId: messageId, message: message, mentionedUsers: mentionedUsers, mentionTemplate: mentionTemplate, }); setShowEditInput(false); (_b = currentChannel === null || currentChannel === void 0 ? void 0 : currentChannel.endTyping) === null || _b === void 0 ? void 0 : _b.call(currentChannel); }, onCancelEdit: function () { var _a; setMentionNickname(''); setMentionedUsers([]); setMentionedUserIds([]); setMentionSuggestedUsers([]); setShowEditInput(false); (_a = currentChannel === null || currentChannel === void 0 ? void 0 : currentChannel.endTyping) === null || _a === void 0 ? void 0 : _a.call(currentChannel); }, onUserMentioned: function (user) { if ((selectedUser === null || selectedUser === void 0 ? void 0 : selectedUser.userId) === (user === null || user === void 0 ? void 0 : user.userId)) { setSelectedUser(null); setMentionNickname(''); } }, onMentionStringChange: function (mentionText) { setMentionNickname(mentionText); }, onMentionedUserIdsUpdated: function (userIds) { setMentionedUserIds(userIds); }, onKeyDown: function (e) { if (displaySuggestedMentionList && (mentionSuggestedUsers === null || mentionSuggestedUsers === void 0 ? void 0 : mentionSuggestedUsers.length) > 0 && ((e.key === _const.MessageInputKeys.Enter && ableMention) || e.key === _const.MessageInputKeys.ArrowUp || e.key === _const.MessageInputKeys.ArrowDown)) { setMessageInputEvent(e); return true; } return false; } }))); } return (React__default.default.createElement("div", _tslib.__assign({ className: "sendbird-parent-message-info ".concat(className) }, (isMobile) ? _tslib.__assign({}, longPress) : {}, { ref: mobileMenuRef }), React__default.default.createElement(ui_ContextMenu.ContextMenu, { menuTrigger: function (toggleDropdown) { var _a, _b, _c; return (React__default.default.createElement(ui_Avatar.Avatar, { className: "sendbird-parent-message-info__sender", ref: avatarRef, src: ((_b = (_a = currentChannel === null || currentChannel === void 0 ? void 0 : currentChannel.members) === null || _a === void 0 ? void 0 : _a.find(function (m) { var _a; return (m === null || m === void 0 ? void 0 : m.userId) === ((_a = parentMessage === null || parentMessage === void 0 ? void 0 : parentMessage.sender) === null || _a === void 0 ? void 0 : _a.userId); })) === null || _b === void 0 ? void 0 : _b.profileUrl) || ((_c = parentMessage === null || parentMessage === void 0 ? void 0 : parentMessage.sender) === null || _c === void 0 ? void 0 : _c.profileUrl), alt: "thread message sender", width: "40px", height: "40px", onClick: function () { if (!disableUserProfile) { toggleDropdown(); } } })); }, menuItems: function (closeDropdown) { return (renderUserProfile ? renderUserProfile({ user: parentMessage === null || parentMessage === void 0 ? void 0 : parentMessage.sender, close: closeDropdown, currentUserId: userId, avatarRef: avatarRef, }) : (React__default.default.createElement(ui_ContextMenu.MenuItems, { parentRef: avatarRef, parentContainRef: avatarRef, closeDropdown: closeDropdown, style: { paddingTop: '0px', paddingBottom: '0px' } }, React__default.default.createElement(ui_UserProfile, { user: parentMessage === null || parentMessage === void 0 ? void 0 : parentMessage.sender, currentUserId: userId, onSuccess: closeDropdown })))); } }), React__default.default.createElement("div", { className: "sendbird-parent-message-info__content" }, React__default.default.createElement("div", { className: "sendbird-parent-message-info__content__info" }, React__default.default.createElement(ui_Label.Label, { className: isReactionEnabled ? 'sendbird-parent-message-info__content__info__sender-name--use-reaction' : 'sendbird-parent-message-info__content__info__sender-name', type: ui_Label.LabelTypography.CAPTION_2, color: ui_Label.LabelColors.ONBACKGROUND_2 }, ((_f = (_e = currentChannel === null || currentChannel === void 0 ? void 0 : currentChannel.members) === null || _e === void 0 ? void 0 : _e.find(function (member) { var _a; return (member === null || member === void 0 ? void 0 : member.userId) === ((_a = parentMessage === null || parentMessage === void 0 ? void 0 : parentMessage.sender) === null || _a === void 0 ? void 0 : _a.userId); })) === null || _f === void 0 ? void 0 : _f.nickname) || (index.getSenderName === null || index.getSenderName === void 0 ? void 0 : index.getSenderName(parentMessage))), React__default.default.createElement(ui_Label.Label, { className: "sendbird-parent-message-info__content__info__sent-at", type: ui_Label.LabelTypography.CAPTION_3, color: ui_Label.LabelColors.ONBACKGROUND_2 }, index$1.format((parentMessage === null || parentMessage === void 0 ? void 0 : parentMessage.createdAt) || 0, stringSet.DATE_FORMAT__MESSAGE_CREATED_AT, { locale: dateLocale }))), React__default.default.createElement(Thread_components_ParentMessageInfoItem, { message: parentMessage, showFileViewer: setShowFileViewer, onBeforeDownloadFileMessage: onBeforeDownloadFileMessage })), !isMobile && (React__default.default.createElement("div", { className: 'sendbird-parent-message-info__menu-container' }, renderMessageMenu({ className: utils.classnames('sendbird-parent-message-info__context-menu', isReactionEnabled && 'use-reaction', isMenuMounted && 'sendbird-mouse-hover'), channel: currentChannel, message: parentMessage, isByMe: userId === ((_g = parentMessage === null || parentMessage === void 0 ? void 0 : parentMessage.sender) === null || _g === void 0 ? void 0 : _g.userId), disableDeleteMessage: allThreadMessages.length > 0, replyType: replyType, showEdit: setShowEditInput, showRemove: setShowRemove, onMoveToParentMessage: function () { onMoveToParentMessage === null || onMoveToParentMessage === void 0 ? void 0 : onMoveToParentMessage({ message: parentMessage, channel: currentChannel }); }, deleteMessage: deleteMessage, }), isReactionEnabled && (renderEmojiMenu({ className: utils.classnames('sendbird-parent-message-info__reaction-menu', isMenuMounted && 'sendbird-mouse-hover'), message: parentMessage, userId: userId, emojiContainer: emojiContainer, toggleReaction: toggleReaction, filterEmojiCategoryIds: filterEmojiCategoryIds, })))), showRemove && (React__default.default.createElement(RemoveMessageModal.RemoveMessage, { onCancel: function () { return setShowRemove(false); }, onSubmit: function () { onHeaderActionClick === null || onHeaderActionClick === void 0 ? void 0 : onHeaderActionClick(); }, message: parentMessage })), showFileViewer && (React__default.default.createElement(ui_FileViewer.default, { message: parentMessage, onClose: function () { return setShowFileViewer(false); }, onDelete: function () { deleteMessage(parentMessage) .then(function () { setShowFileViewer(false); }); }, onDownloadClick: handleOnDownloadClick })), showMobileMenu && (React__default.default.createElement(ui_MobileMenu.MobileMenu, { parentRef: mobileMenuRef, channel: currentChannel, message: parentMessage, userId: userId, replyType: replyType, hideMenu: function () { setShowMobileMenu(false); }, deleteMessage: deleteMessage, deleteMenuState: (allThreadMessages === null || allThreadMessages === void 0 ? void 0 : allThreadMessages.length) === 0 ? 'ACTIVE' : 'HIDE', isReactionEnabled: isReactionEnabled, isByMe: isByMe, emojiContainer: emojiContainer, showEdit: setShowEditInput, showRemove: setShowRemove, toggleReaction: toggleReaction, isOpenedFromThread: true, onDownloadClick: handleOnDownloadClick })))); } module.exports = ParentMessageInfo; //# sourceMappingURL=ParentMessageInfo.js.map