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.

266 lines (265 loc) 12 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; exports.threadMessageComparator = threadMessageComparator; var _react = _interopRequireWildcard(require("react")); var _uikitReactNativeFoundation = require("@sendbird/uikit-react-native-foundation"); var _uikitTools = require("@sendbird/uikit-tools"); var _uikitUtils = require("@sendbird/uikit-utils"); var _GroupChannelMessageRenderer = _interopRequireDefault(require("../components/GroupChannelMessageRenderer")); var _StatusComposition = _interopRequireDefault(require("../components/StatusComposition")); var _createGroupChannelThreadModule = _interopRequireDefault(require("../domain/groupChannelThread/module/createGroupChannelThreadModule")); var _useContext = require("../hooks/useContext"); var _pubsub = _interopRequireDefault(require("../utils/pubsub")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } const createGroupChannelThreadFragment = initModule => { const GroupChannelThreadModule = (0, _createGroupChannelThreadModule.default)(initModule); return ({ renderMessage, enableMessageGrouping = true, onPressHeaderLeft = _uikitUtils.NOOP, onPressHeaderSubtitle = _uikitUtils.NOOP, onPressMediaMessage = _uikitUtils.NOOP, onParentMessageDeleted = _uikitUtils.NOOP, onChannelDeleted = _uikitUtils.NOOP, onBeforeSendUserMessage = _uikitUtils.PASS, onBeforeSendFileMessage = _uikitUtils.PASS, onBeforeUpdateUserMessage = _uikitUtils.PASS, onBeforeUpdateFileMessage = _uikitUtils.PASS, channel, parentMessage, startingPoint, keyboardAvoidOffset, sortComparator = threadMessageComparator, flatListProps }) => { const { playerService, recorderService } = (0, _useContext.usePlatformService)(); const { sdk, currentUser, sbOptions, voiceMessageStatusManager, groupChannelFragmentOptions } = (0, _useContext.useSendbirdChat)(); const [groupChannelThreadPubSub] = (0, _react.useState)(() => (0, _pubsub.default)()); const [scrolledAwayFromBottom, setScrolledAwayFromBottom] = (0, _react.useState)(false); const scrolledAwayFromBottomRef = (0, _uikitUtils.useRefTracker)(scrolledAwayFromBottom); const toast = (0, _uikitReactNativeFoundation.useToast)(); const { STRINGS } = (0, _useContext.useLocalization)(); const [_parentMessage, setParentMessage] = (0, _react.useState)(parentMessage); const { loading, messages, newMessages, resetNewMessages, loadNext, loadPrevious, hasNext, sendFileMessage, sendUserMessage, updateFileMessage, updateUserMessage, resendMessage, deleteMessage, resetWithStartingPoint } = (0, _uikitTools.useGroupChannelThreadMessages)(sdk, channel, _parentMessage, { shouldCountNewMessages: () => scrolledAwayFromBottomRef.current, onMessagesReceived(messages) { groupChannelThreadPubSub.publish({ type: 'MESSAGES_RECEIVED', data: { messages } }); }, onMessagesUpdated(messages) { groupChannelThreadPubSub.publish({ type: 'MESSAGES_UPDATED', data: { messages } }); }, onParentMessageUpdated(parentMessage) { setParentMessage(parentMessage); }, onParentMessageDeleted: () => { toast.show(STRINGS.TOAST.THREAD_PARENT_MESSAGE_DELETED_ERROR, 'error'); onParentMessageDeleted === null || onParentMessageDeleted === void 0 || onParentMessageDeleted(); }, onChannelDeleted, onCurrentUserBanned: onChannelDeleted, sortComparator, markAsRead: _uikitUtils.confirmAndMarkAsRead, isReactionEnabled: sbOptions.uikit.groupChannel.channel.enableReactions, startingPoint }); const onBlurFragment = async () => { await playerService.reset().catch(() => {}); await recorderService.reset().catch(() => {}); }; const _onPressHeaderLeft = (0, _uikitUtils.useFreshCallback)(async () => { await onBlurFragment(); voiceMessageStatusManager.publishAll(); onPressHeaderLeft(); }); const _onPressHeaderSubtitle = (0, _uikitUtils.useFreshCallback)(async () => { await onBlurFragment(); voiceMessageStatusManager.publishAll(); groupChannelFragmentOptions.pubsub.publish({ type: 'OVERRIDE_SEARCH_ITEM_STARTING_POINT', data: { startingPoint: parentMessage.createdAt } }); onPressHeaderSubtitle(); }); const _onPressMediaMessage = (0, _uikitUtils.useFreshCallback)(async (message, deleteMessage, uri) => { await onBlurFragment(); onPressMediaMessage(message, deleteMessage, uri); }); (0, _react.useEffect)(() => { return () => { onBlurFragment(); }; }, []); const renderItem = (0, _uikitUtils.useFreshCallback)(props => { const content = renderMessage ? renderMessage(props) : /*#__PURE__*/_react.default.createElement(_GroupChannelMessageRenderer.default, _extends({ hideParentMessage: true }, props)); return /*#__PURE__*/_react.default.createElement(_uikitReactNativeFoundation.Box, null, content); }); const memoizedFlatListProps = (0, _react.useMemo)(() => ({ ListHeaderComponent: /*#__PURE__*/_react.default.createElement(GroupChannelThreadModule.ParentMessageInfo, { channel: channel, currentUserId: currentUser === null || currentUser === void 0 ? void 0 : currentUser.userId, onDeleteMessage: deleteMessage, onPressMediaMessage: _onPressMediaMessage }), contentContainerStyle: { flexGrow: 1 }, ...flatListProps }), [flatListProps]); const onResetMessageList = (0, _react.useCallback)(async () => { return await resetWithStartingPoint(Number.MAX_SAFE_INTEGER); }, []); const onResetMessageListWithStartingPoint = (0, _react.useCallback)(async startingPoint => { return await resetWithStartingPoint(startingPoint); }, []); const onPending = message => { groupChannelThreadPubSub.publish({ type: 'MESSAGE_SENT_PENDING', data: { message } }); }; const onSent = message => { groupChannelThreadPubSub.publish({ type: 'MESSAGE_SENT_SUCCESS', data: { message } }); }; const updateIfParentMessage = message => { if (message.messageId === parentMessage.parentMessageId) { setParentMessage(message); } }; const onPressSendUserMessage = (0, _uikitUtils.useFreshCallback)(async params => { const processedParams = await onBeforeSendUserMessage(params); const message = await sendUserMessage(processedParams, onPending); onSent(message); }); const onPressSendFileMessage = (0, _uikitUtils.useFreshCallback)(async params => { var _processedParams$file; const processedParams = await onBeforeSendFileMessage(params); const fileSize = ((_processedParams$file = processedParams.file) === null || _processedParams$file === void 0 ? void 0 : _processedParams$file.size) ?? processedParams.fileSize; const uploadSizeLimit = sbOptions.appInfo.uploadSizeLimit; if (fileSize && uploadSizeLimit && fileSize > uploadSizeLimit) { const sizeLimitString = `${(0, _uikitUtils.getReadableFileSize)(uploadSizeLimit)}`; toast.show(STRINGS.TOAST.FILE_UPLOAD_SIZE_LIMIT_EXCEEDED_ERROR(sizeLimitString), 'error'); return; } else { const message = await sendFileMessage(processedParams, onPending); onSent(message); } }); const onPressUpdateUserMessage = (0, _uikitUtils.useFreshCallback)(async (message, params) => { const processedParams = await onBeforeUpdateUserMessage(params); const updatedMessage = await updateUserMessage(message.messageId, processedParams); updateIfParentMessage(updatedMessage); }); const onPressUpdateFileMessage = (0, _uikitUtils.useFreshCallback)(async (message, params) => { const processedParams = await onBeforeUpdateFileMessage(params); const updatedMessage = await updateFileMessage(message.messageId, processedParams); updateIfParentMessage(updatedMessage); }); const onScrolledAwayFromBottom = (0, _uikitUtils.useFreshCallback)(value => { if (!value) resetNewMessages(); setScrolledAwayFromBottom(value); }); return /*#__PURE__*/_react.default.createElement(GroupChannelThreadModule.Provider, { channel: channel, parentMessage: _parentMessage, groupChannelThreadPubSub: groupChannelThreadPubSub, keyboardAvoidOffset: keyboardAvoidOffset, threadedMessages: messages }, /*#__PURE__*/_react.default.createElement(GroupChannelThreadModule.Header, { onPressLeft: _onPressHeaderLeft, onPressSubtitle: _onPressHeaderSubtitle }), /*#__PURE__*/_react.default.createElement(_StatusComposition.default, { loading: loading, LoadingComponent: /*#__PURE__*/_react.default.createElement(GroupChannelThreadModule.StatusLoading, null) }, /*#__PURE__*/_react.default.createElement(GroupChannelThreadModule.MessageList, { channel: channel, onResetMessageList: onResetMessageList, onResetMessageListWithStartingPoint: onResetMessageListWithStartingPoint, enableMessageGrouping: enableMessageGrouping, currentUserId: currentUser === null || currentUser === void 0 ? void 0 : currentUser.userId, renderMessage: renderItem, messages: messages, newMessages: newMessages, onTopReached: loadPrevious, onBottomReached: loadNext, hasNext: hasNext, scrolledAwayFromBottom: scrolledAwayFromBottom, onScrolledAwayFromBottom: onScrolledAwayFromBottom, onResendFailedMessage: resendMessage, onDeleteMessage: deleteMessage, onPressMediaMessage: _onPressMediaMessage, flatListProps: memoizedFlatListProps, startingPoint: startingPoint }), /*#__PURE__*/_react.default.createElement(GroupChannelThreadModule.Input, { SuggestedMentionList: GroupChannelThreadModule.SuggestedMentionList, shouldRenderInput: shouldRenderInput(channel), onPressSendUserMessage: onPressSendUserMessage, onPressSendFileMessage: onPressSendFileMessage, onPressUpdateUserMessage: onPressUpdateUserMessage, onPressUpdateFileMessage: onPressUpdateFileMessage }))); }; }; function shouldRenderInput(channel) { if (channel.isBroadcast) { return channel.myRole === 'operator'; } return true; } function threadMessageComparator(a, b) { return (0, _uikitUtils.messageComparator)(a, b) * -1; } var _default = exports.default = createGroupChannelThreadFragment; //# sourceMappingURL=createGroupChannelThreadFragment.js.map