UNPKG

@sendbird/uikit-react

Version:

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

764 lines (754 loc) 76.1 kB
import { _ as __assign, a as __awaiter, b as __generator, c as __spreadArray } from './bundle-yl5d1NoZ.js'; import React__default, { useCallback, useContext, useMemo, useEffect, useRef } from 'react'; import { s as scrollIntoLast, c as compareIds, u as useSendMultipleFilesMessage, g as getParentMessageFrom, a as getNicknamesMapFromMembers } from './bundle-CIQCAe1h.js'; import { U as UserProfileProvider } from './bundle-B0s_McF0.js'; import { s as shimExports, u as useStore, c as createStore } from './bundle-BUYU9H94.js'; import { ChannelType } from '@sendbird/chat'; import { p as pubSubTopics, b as PublishingModuleType, a as shouldPubSubPublishToThread, P as PUBSUB_TOPICS } from './bundle-BOykFtQ3.js'; import { GroupChannelHandler } from '@sendbird/chat/groupChannel'; import { u as uuidv4 } from './bundle-DGh2T5IL.js'; import { c as compareIds$1 } from './bundle-CM73CDTO.js'; import { ThreadListStateTypes, ParentMessageStateTypes, ChannelStateTypes } from '../Thread/context/types.js'; import { u as useSendbird } from './bundle-i_3w58Zd.js'; import { u as useDeepCompareEffect } from './bundle-BmoSvBYM.js'; import { SendingStatus, MessageMetaArray, MessageType } from '@sendbird/chat/message'; import './bundle-Del33VzI.js'; import { e as SCROLL_BOTTOM_DELAY_FOR_SEND, a as VOICE_MESSAGE_FILE_NAME, b as VOICE_MESSAGE_MIME_TYPE, i as META_ARRAY_VOICE_DURATION_KEY, j as META_ARRAY_MESSAGE_TYPE_KEY, k as META_ARRAY_MESSAGE_TYPE_VALUE__VOICE } from './bundle-CqLLOVG5.js'; var PREV_THREADS_FETCH_SIZE = 30; var NEXT_THREADS_FETCH_SIZE = 30; function useToggleReactionCallback(_a, _b) { var currentChannel = _a.currentChannel; var logger = _b.logger; return useCallback(function (message, key, isReacted) { var _a, _b; if (isReacted) { (_a = currentChannel === null || currentChannel === void 0 ? void 0 : currentChannel.deleteReaction) === null || _a === void 0 ? void 0 : _a.call(currentChannel, message, key).then(function (res) { logger.info('Thread | useToggleReactionsCallback: Delete reaction succeeded.', res); }).catch(function (err) { logger.warning('Thread | useToggleReactionsCallback: Delete reaction failed.', err); }); return; } (_b = currentChannel === null || currentChannel === void 0 ? void 0 : currentChannel.addReaction) === null || _b === void 0 ? void 0 : _b.call(currentChannel, message, key).then(function (res) { logger.info('Thread | useToggleReactionsCallback: Add reaction succeeded.', res); }).catch(function (err) { logger.warning('Thread | useToggleReactionsCallback: Add reaction failed.', err); }); }, [currentChannel]); } function useSendUserMessageCallback(_a, _b) { var isMentionEnabled = _a.isMentionEnabled, currentChannel = _a.currentChannel, onBeforeSendUserMessage = _a.onBeforeSendUserMessage, sendMessageStart = _a.sendMessageStart, sendMessageFailure = _a.sendMessageFailure; var logger = _b.logger, pubSub = _b.pubSub; var sendMessage = useCallback(function (props) { var _a; var message = props.message, quoteMessage = props.quoteMessage, mentionTemplate = props.mentionTemplate, mentionedUsers = props.mentionedUsers; var createDefaultParams = function () { var params = {}; params.message = message; var mentionedUsersLength = (mentionedUsers === null || mentionedUsers === void 0 ? void 0 : mentionedUsers.length) || 0; if (isMentionEnabled && mentionedUsersLength) { params.mentionedUsers = mentionedUsers; } if (isMentionEnabled && mentionTemplate && mentionedUsersLength) { params.mentionedMessageTemplate = mentionTemplate; } if (quoteMessage) { params.isReplyToChannel = true; params.parentMessageId = quoteMessage.messageId; } return params; }; var params = (_a = onBeforeSendUserMessage === null || onBeforeSendUserMessage === void 0 ? void 0 : onBeforeSendUserMessage(message, quoteMessage)) !== null && _a !== void 0 ? _a : createDefaultParams(); logger.info('Thread | useSendUserMessageCallback: Sending user message start.', params); if (currentChannel === null || currentChannel === void 0 ? void 0 : currentChannel.sendUserMessage) { currentChannel === null || currentChannel === void 0 ? void 0 : currentChannel.sendUserMessage(params).onPending(function (pendingMessage) { sendMessageStart(pendingMessage); }).onFailed(function (error, message) { logger.info('Thread | useSendUserMessageCallback: Sending user message failed.', { message: message, error: error }); sendMessageFailure(message); }).onSucceeded(function (message) { logger.info('Thread | useSendUserMessageCallback: Sending user message succeeded.', message); // because Thread doesn't subscribe SEND_USER_MESSAGE pubSub.publish(pubSubTopics.SEND_USER_MESSAGE, { channel: currentChannel, message: message, publishingModules: [PublishingModuleType.THREAD], }); }); } }, [ isMentionEnabled, currentChannel, onBeforeSendUserMessage, sendMessageStart, sendMessageFailure, ]); return sendMessage; } function useSendFileMessageCallback(_a, _b) { var currentChannel = _a.currentChannel, onBeforeSendFileMessage = _a.onBeforeSendFileMessage, sendMessageStart = _a.sendMessageStart, sendMessageFailure = _a.sendMessageFailure; var logger = _b.logger, pubSub = _b.pubSub; return useCallback(function (file, quoteMessage) { return new Promise(function (resolve, reject) { var _a; var createParamsDefault = function () { var params = {}; params.file = file; if (quoteMessage) { params.isReplyToChannel = true; params.parentMessageId = quoteMessage.messageId; } return params; }; var params = (_a = onBeforeSendFileMessage === null || onBeforeSendFileMessage === void 0 ? void 0 : onBeforeSendFileMessage(file, quoteMessage)) !== null && _a !== void 0 ? _a : createParamsDefault(); logger.info('Thread | useSendFileMessageCallback: Sending file message start.', params); if (currentChannel == null) { logger.warning('Thread | useSendFileMessageCallback: currentChannel is null. Skipping file message send.'); resolve(null); } else { currentChannel.sendFileMessage(params) .onPending(function (pendingMessage) { // @ts-ignore sendMessageStart(__assign(__assign({}, pendingMessage), { url: URL.createObjectURL(file), // pending thumbnail message seems to be failed sendingStatus: SendingStatus.PENDING, isUserMessage: pendingMessage.isUserMessage, isFileMessage: pendingMessage.isFileMessage, isAdminMessage: pendingMessage.isAdminMessage, isMultipleFilesMessage: pendingMessage.isMultipleFilesMessage })); setTimeout(function () { return scrollIntoLast(); }, SCROLL_BOTTOM_DELAY_FOR_SEND); }) .onFailed(function (error, message) { message.localUrl = URL.createObjectURL(file); message.file = file; logger.info('Thread | useSendFileMessageCallback: Sending file message failed.', { message: message, error: error }); sendMessageFailure(message); reject(error); }) .onSucceeded(function (message) { logger.info('Thread | useSendFileMessageCallback: Sending file message succeeded.', message); pubSub.publish(pubSubTopics.SEND_FILE_MESSAGE, { channel: currentChannel, message: message, publishingModules: [PublishingModuleType.THREAD], }); resolve(message); }); } }); }, [ currentChannel, onBeforeSendFileMessage, sendMessageStart, sendMessageFailure, ]); } var useSendVoiceMessageCallback = function (_a, _b) { var currentChannel = _a.currentChannel, onBeforeSendVoiceMessage = _a.onBeforeSendVoiceMessage, sendMessageStart = _a.sendMessageStart, sendMessageFailure = _a.sendMessageFailure; var logger = _b.logger, pubSub = _b.pubSub; var sendMessage = useCallback(function (file, duration, quoteMessage) { var messageParams = (onBeforeSendVoiceMessage && typeof onBeforeSendVoiceMessage === 'function') ? onBeforeSendVoiceMessage(file, quoteMessage) : { file: file, fileName: VOICE_MESSAGE_FILE_NAME, mimeType: VOICE_MESSAGE_MIME_TYPE, metaArrays: [ new MessageMetaArray({ key: META_ARRAY_VOICE_DURATION_KEY, value: ["".concat(duration)], }), new MessageMetaArray({ key: META_ARRAY_MESSAGE_TYPE_KEY, value: [META_ARRAY_MESSAGE_TYPE_VALUE__VOICE], }), ], }; if (quoteMessage) { messageParams.isReplyToChannel = true; messageParams.parentMessageId = quoteMessage.messageId; } logger.info('Thread | useSendVoiceMessageCallback: Start sending voice message', messageParams); currentChannel === null || currentChannel === void 0 ? void 0 : currentChannel.sendFileMessage(messageParams).onPending(function (pendingMessage) { // @ts-ignore sendMessageStart(__assign(__assign({}, pendingMessage), { url: URL.createObjectURL(file), // pending thumbnail message seems to be failed sendingStatus: SendingStatus.PENDING, isUserMessage: pendingMessage.isUserMessage, isFileMessage: pendingMessage.isFileMessage, isAdminMessage: pendingMessage.isAdminMessage, isMultipleFilesMessage: pendingMessage.isMultipleFilesMessage })); setTimeout(function () { return scrollIntoLast(); }, SCROLL_BOTTOM_DELAY_FOR_SEND); }).onFailed(function (error, message) { message.localUrl = URL.createObjectURL(file); message.file = file; logger.info('Thread | useSendVoiceMessageCallback: Sending voice message failed.', { message: message, error: error }); sendMessageFailure(message); }).onSucceeded(function (message) { logger.info('Thread | useSendVoiceMessageCallback: Sending voice message succeeded.', message); pubSub.publish(pubSubTopics.SEND_FILE_MESSAGE, { channel: currentChannel, message: message, publishingModules: [PublishingModuleType.THREAD], }); }); }, [ currentChannel, onBeforeSendVoiceMessage, sendMessageStart, sendMessageFailure, ]); return sendMessage; }; function useResendMessageCallback(_a, _b) { var currentChannel = _a.currentChannel, resendMessageStart = _a.resendMessageStart, sendMessageSuccess = _a.sendMessageSuccess, sendMessageFailure = _a.sendMessageFailure; var logger = _b.logger, pubSub = _b.pubSub; return useCallback(function (failedMessage) { var _a, _b, _c, _d, _e; if (!(failedMessage === null || failedMessage === void 0 ? void 0 : failedMessage.isResendable)) { logger.warning('Thread | useResendMessageCallback: Message is not resendable.', failedMessage); return; } logger.info('Thread | useResendMessageCallback: Resending failedMessage start.', failedMessage); if (((_a = failedMessage === null || failedMessage === void 0 ? void 0 : failedMessage.isUserMessage) === null || _a === void 0 ? void 0 : _a.call(failedMessage)) || (failedMessage === null || failedMessage === void 0 ? void 0 : failedMessage.messageType) === MessageType.USER) { try { currentChannel === null || currentChannel === void 0 ? void 0 : currentChannel.resendMessage(failedMessage).onPending(function (message) { logger.info('Thread | useResendMessageCallback: Resending user message started.', message); resendMessageStart(message); }).onSucceeded(function (message) { logger.info('Thread | useResendMessageCallback: Resending user message succeeded.', message); sendMessageSuccess(message); pubSub.publish(pubSubTopics.SEND_USER_MESSAGE, { channel: currentChannel, message: message, publishingModules: [PublishingModuleType.THREAD], }); }).onFailed(function (error) { logger.warning('Thread | useResendMessageCallback: Resending user message failed.', error); failedMessage.sendingStatus = SendingStatus.FAILED; sendMessageFailure(failedMessage); }); } catch (err) { logger.warning('Thread | useResendMessageCallback: Resending user message failed.', err); failedMessage.sendingStatus = SendingStatus.FAILED; sendMessageFailure(failedMessage); } } else if ((_b = failedMessage === null || failedMessage === void 0 ? void 0 : failedMessage.isFileMessage) === null || _b === void 0 ? void 0 : _b.call(failedMessage)) { try { (_c = currentChannel === null || currentChannel === void 0 ? void 0 : currentChannel.resendMessage) === null || _c === void 0 ? void 0 : _c.call(currentChannel, failedMessage).onPending(function (message) { logger.info('Thread | useResendMessageCallback: Resending file message started.', message); resendMessageStart(message); }).onSucceeded(function (message) { logger.info('Thread | useResendMessageCallback: Resending file message succeeded.', message); sendMessageSuccess(message); pubSub.publish(pubSubTopics.SEND_FILE_MESSAGE, { channel: currentChannel, message: failedMessage, publishingModules: [PublishingModuleType.THREAD], }); }).onFailed(function (error) { logger.warning('Thread | useResendMessageCallback: Resending file message failed.', error); failedMessage.sendingStatus = SendingStatus.FAILED; sendMessageFailure(failedMessage); }); } catch (err) { logger.warning('Thread | useResendMessageCallback: Resending file message failed.', err); failedMessage.sendingStatus = SendingStatus.FAILED; sendMessageFailure(failedMessage); } } else if ((_d = failedMessage === null || failedMessage === void 0 ? void 0 : failedMessage.isMultipleFilesMessage) === null || _d === void 0 ? void 0 : _d.call(failedMessage)) { try { (_e = currentChannel === null || currentChannel === void 0 ? void 0 : currentChannel.resendMessage) === null || _e === void 0 ? void 0 : _e.call(currentChannel, failedMessage).onPending(function (message) { logger.info('Thread | useResendMessageCallback: Resending multiple files message started.', message); resendMessageStart(message); }).onFileUploaded(function (requestId, index, uploadableFileInfo, error) { logger.info('Thread | useResendMessageCallback: onFileUploaded during resending multiple files message.', { requestId: requestId, index: index, error: error, uploadableFileInfo: uploadableFileInfo, }); pubSub.publish(pubSubTopics.ON_FILE_INFO_UPLOADED, { response: { channelUrl: currentChannel.url, requestId: requestId, index: index, uploadableFileInfo: uploadableFileInfo, error: error, }, publishingModules: [PublishingModuleType.THREAD], }); }).onSucceeded(function (message) { logger.info('Thread | useResendMessageCallback: Resending MFM succeeded.', message); sendMessageSuccess(message); pubSub.publish(pubSubTopics.SEND_FILE_MESSAGE, { channel: currentChannel, message: message, publishingModules: [PublishingModuleType.THREAD], }); }).onFailed(function (error, message) { logger.warning('Thread | useResendMessageCallback: Resending MFM failed.', error); sendMessageFailure(message); }); } catch (err) { logger.warning('Thread | useResendMessageCallback: Resending MFM failed.', err); sendMessageFailure(failedMessage); } } else { logger.warning('Thread | useResendMessageCallback: Message is not resendable.', failedMessage); failedMessage.sendingStatus = SendingStatus.FAILED; sendMessageFailure(failedMessage); } }, [ currentChannel, resendMessageStart, sendMessageSuccess, sendMessageFailure, ]); } function useUpdateMessageCallback(_a, _b) { var currentChannel = _a.currentChannel, isMentionEnabled = _a.isMentionEnabled, onMessageUpdated = _a.onMessageUpdated; var logger = _b.logger, pubSub = _b.pubSub; // TODO: add type return useCallback(function (props) { var _a; var messageId = props.messageId, message = props.message, mentionedUsers = props.mentionedUsers, mentionTemplate = props.mentionTemplate; var createParamsDefault = function () { var params = {}; params.message = message; if (isMentionEnabled && mentionedUsers && (mentionedUsers === null || mentionedUsers === void 0 ? void 0 : mentionedUsers.length) > 0) { params.mentionedUsers = mentionedUsers; } if (isMentionEnabled && mentionTemplate) { params.mentionedMessageTemplate = mentionTemplate; } else { params.mentionedMessageTemplate = message; } return params; }; var params = createParamsDefault(); logger.info('Thread | useUpdateMessageCallback: Message update start.', params); if (currentChannel == null) { logger.warning('Thread | useUpdateMessageCallback: currentChannel is null.'); return; } (_a = currentChannel.updateUserMessage) === null || _a === void 0 ? void 0 : _a.call(currentChannel, messageId, params).then(function (message) { logger.info('Thread | useUpdateMessageCallback: Message update succeeded.', message); onMessageUpdated(currentChannel, message); pubSub.publish(pubSubTopics.UPDATE_USER_MESSAGE, { fromSelector: true, channel: currentChannel, message: message, publishingModules: [PublishingModuleType.THREAD], }); }); }, [ currentChannel, isMentionEnabled, onMessageUpdated, ]); } function useDeleteMessageCallback(_a, _b) { var currentChannel = _a.currentChannel, onMessageDeletedByReqId = _a.onMessageDeletedByReqId, onMessageDeleted = _a.onMessageDeleted; var logger = _b.logger; return useCallback(function (message) { logger.info('Thread | useDeleteMessageCallback: Deleting message.', message); var sendingStatus = message.sendingStatus; return new Promise(function (resolve, reject) { var _a; logger.info('Thread | useDeleteMessageCallback: Deleting message requestState:', sendingStatus); // Message is only on local if (sendingStatus === 'failed' || sendingStatus === 'pending') { logger.info('Thread | useDeleteMessageCallback: Deleted message from local:', message); onMessageDeletedByReqId(message.reqId); resolve(); } if (currentChannel == null) { logger.info('Thread | useDeleteMessageCallback: No current channel'); resolve(); } logger.info('Thread | useDeleteMessageCallback: Deleting message from remote:', sendingStatus); (_a = currentChannel.deleteMessage) === null || _a === void 0 ? void 0 : _a.call(currentChannel, message).then(function () { logger.info('Thread | useDeleteMessageCallback: Deleting message success!', message); onMessageDeleted(currentChannel, message.messageId); resolve(); }).catch(function (err) { logger.warning('Thread | useDeleteMessageCallback: Deleting message failed!', err); reject(err); }); }); }, [ currentChannel, onMessageDeletedByReqId, onMessageDeleted, ]); } function getThreadMessageListParams(params) { return __assign({ prevResultSize: PREV_THREADS_FETCH_SIZE, nextResultSize: NEXT_THREADS_FETCH_SIZE, includeMetaArray: true }, params); } var useThreadFetchers = function (_a) { var isReactionEnabled = _a.isReactionEnabled, anchorMessage = _a.anchorMessage, staleParentMessage = _a.parentMessage, logger = _a.logger, oldestMessageTimeStamp = _a.oldestMessageTimeStamp, latestMessageTimeStamp = _a.latestMessageTimeStamp, threadListState = _a.threadListState, initializeThreadListStart = _a.initializeThreadListStart, initializeThreadListSuccess = _a.initializeThreadListSuccess, initializeThreadListFailure = _a.initializeThreadListFailure, getPrevMessagesStart = _a.getPrevMessagesStart, getPrevMessagesSuccess = _a.getPrevMessagesSuccess, getPrevMessagesFailure = _a.getPrevMessagesFailure, getNextMessagesStart = _a.getNextMessagesStart, getNextMessagesSuccess = _a.getNextMessagesSuccess, getNextMessagesFailure = _a.getNextMessagesFailure; var stores = useSendbird().state.stores; var timestamp = (anchorMessage === null || anchorMessage === void 0 ? void 0 : anchorMessage.createdAt) || 0; var initialize = useCallback(function (callback) { return __awaiter(void 0, void 0, void 0, function () { var params, _a, threadedMessages_1, parentMessage, error_1; return __generator(this, function (_b) { switch (_b.label) { case 0: if (!stores.sdkStore.initialized || !staleParentMessage) return [2 /*return*/]; initializeThreadListStart(); _b.label = 1; case 1: _b.trys.push([1, 3, , 4]); params = getThreadMessageListParams({ includeReactions: isReactionEnabled }); logger.info('Thread | useGetThreadList: Initialize thread list start.', { timestamp: timestamp, params: params }); return [4 /*yield*/, staleParentMessage.getThreadedMessagesByTimestamp(timestamp, params)]; case 2: _a = _b.sent(), threadedMessages_1 = _a.threadedMessages, parentMessage = _a.parentMessage; logger.info('Thread | useGetThreadList: Initialize thread list succeeded.', { staleParentMessage: staleParentMessage, threadedMessages: threadedMessages_1 }); initializeThreadListSuccess(parentMessage, anchorMessage, threadedMessages_1); setTimeout(function () { return callback === null || callback === void 0 ? void 0 : callback(threadedMessages_1); }); return [3 /*break*/, 4]; case 3: error_1 = _b.sent(); logger.info('Thread | useGetThreadList: Initialize thread list failed.', error_1); initializeThreadListFailure(); return [3 /*break*/, 4]; case 4: return [2 /*return*/]; } }); }); }, [ stores.sdkStore.initialized, staleParentMessage, anchorMessage, isReactionEnabled, initializeThreadListStart, initializeThreadListSuccess, initializeThreadListFailure, ]); var loadPrevious = useCallback(function (callback) { return __awaiter(void 0, void 0, void 0, function () { var params, _a, threadedMessages_2, parentMessage, error_2; return __generator(this, function (_b) { switch (_b.label) { case 0: if (threadListState !== ThreadListStateTypes.INITIALIZED || oldestMessageTimeStamp === 0 || !staleParentMessage) return [2 /*return*/]; getPrevMessagesStart(); _b.label = 1; case 1: _b.trys.push([1, 3, , 4]); params = getThreadMessageListParams({ nextResultSize: 0, includeReactions: isReactionEnabled }); return [4 /*yield*/, staleParentMessage.getThreadedMessagesByTimestamp(oldestMessageTimeStamp, params)]; case 2: _a = _b.sent(), threadedMessages_2 = _a.threadedMessages, parentMessage = _a.parentMessage; logger.info('Thread | useGetPrevThreadsCallback: Fetch prev threads succeeded.', { parentMessage: parentMessage, threadedMessages: threadedMessages_2 }); getPrevMessagesSuccess(threadedMessages_2); setTimeout(function () { return callback === null || callback === void 0 ? void 0 : callback(threadedMessages_2); }); return [3 /*break*/, 4]; case 3: error_2 = _b.sent(); logger.info('Thread | useGetPrevThreadsCallback: Fetch prev threads failed.', error_2); getPrevMessagesFailure(); return [3 /*break*/, 4]; case 4: return [2 /*return*/]; } }); }); }, [ threadListState, oldestMessageTimeStamp, isReactionEnabled, staleParentMessage, getPrevMessagesStart, getPrevMessagesSuccess, getPrevMessagesFailure, ]); var loadNext = useCallback(function (callback) { return __awaiter(void 0, void 0, void 0, function () { var params, _a, threadedMessages_3, parentMessage, error_3; return __generator(this, function (_b) { switch (_b.label) { case 0: if (threadListState !== ThreadListStateTypes.INITIALIZED || latestMessageTimeStamp === 0 || !staleParentMessage) return [2 /*return*/]; getNextMessagesStart(); _b.label = 1; case 1: _b.trys.push([1, 3, , 4]); params = getThreadMessageListParams({ prevResultSize: 0, includeReactions: isReactionEnabled }); return [4 /*yield*/, staleParentMessage.getThreadedMessagesByTimestamp(latestMessageTimeStamp, params)]; case 2: _a = _b.sent(), threadedMessages_3 = _a.threadedMessages, parentMessage = _a.parentMessage; logger.info('Thread | useGetNextThreadsCallback: Fetch next threads succeeded.', { parentMessage: parentMessage, threadedMessages: threadedMessages_3 }); getNextMessagesSuccess(threadedMessages_3); setTimeout(function () { return callback === null || callback === void 0 ? void 0 : callback(threadedMessages_3); }); return [3 /*break*/, 4]; case 3: error_3 = _b.sent(); logger.info('Thread | useGetNextThreadsCallback: Fetch next threads failed.', error_3); getNextMessagesFailure(); return [3 /*break*/, 4]; case 4: return [2 /*return*/]; } }); }); }, [ threadListState, latestMessageTimeStamp, isReactionEnabled, staleParentMessage, getNextMessagesStart, getNextMessagesSuccess, getNextMessagesFailure, ]); return { initializeThreadFetcher: initialize, fetchPrevThreads: loadPrevious, fetchNextThreads: loadNext, }; }; function hasReqId(message) { return 'reqId' in message; } var useThread = function () { var _a, _b; var store = useContext(ThreadContext); if (!store) throw new Error('useThread must be used within a ThreadProvider'); // SendbirdStateContext config var config = useSendbird().state.config; var logger = config.logger, pubSub = config.pubSub; var isMentionEnabled = config.groupChannel.enableMention; var isReactionEnabled = config.groupChannel.enableReactions; var state = shimExports.useSyncExternalStore(store.subscribe, store.getState); var message = state.message, parentMessage = state.parentMessage, currentChannel = state.currentChannel, threadListState = state.threadListState, allThreadMessages = state.allThreadMessages, onBeforeSendUserMessage = state.onBeforeSendUserMessage, onBeforeSendFileMessage = state.onBeforeSendFileMessage, onBeforeSendVoiceMessage = state.onBeforeSendVoiceMessage, onBeforeSendMultipleFilesMessage = state.onBeforeSendMultipleFilesMessage; var sendMessageStatusActions = { sendMessageStart: useCallback(function (message) { return store.setState(function (state) { return __assign(__assign({}, state), { localThreadMessages: __spreadArray(__spreadArray([], state.localThreadMessages, true), [ message, ], false) }); }); }, [store]), sendMessageSuccess: useCallback(function (message) { return store.setState(function (state) { return __assign(__assign({}, state), { allThreadMessages: __spreadArray(__spreadArray([], state.allThreadMessages.filter(function (m) { return (!compareIds(m === null || m === void 0 ? void 0 : m.reqId, message === null || message === void 0 ? void 0 : message.reqId)); }), true), [ message, ], false), localThreadMessages: state.localThreadMessages.filter(function (m) { return (!compareIds(m === null || m === void 0 ? void 0 : m.reqId, message === null || message === void 0 ? void 0 : message.reqId)); }) }); }); }, [store]), sendMessageFailure: useCallback(function (message) { return store.setState(function (state) { return __assign(__assign({}, state), { localThreadMessages: state.localThreadMessages.map(function (m) { return (compareIds(m === null || m === void 0 ? void 0 : m.reqId, message === null || message === void 0 ? void 0 : message.reqId) ? message : m); }) }); }); }, [store]), resendMessageStart: useCallback(function (message) { return store.setState(function (state) { return __assign(__assign({}, state), { localThreadMessages: state.localThreadMessages.map(function (m) { return (compareIds(m === null || m === void 0 ? void 0 : m.reqId, message === null || message === void 0 ? void 0 : message.reqId) ? message : m); }) }); }); }, [store]), }; var toggleReaction = useToggleReactionCallback({ currentChannel: currentChannel }, { logger: logger }); var sendMessageActions = { sendMessage: useSendUserMessageCallback({ isMentionEnabled: isMentionEnabled, currentChannel: currentChannel, onBeforeSendUserMessage: onBeforeSendUserMessage, sendMessageStart: sendMessageStatusActions.sendMessageStart, sendMessageFailure: sendMessageStatusActions.sendMessageFailure, }, { logger: logger, pubSub: pubSub, }), sendFileMessage: useSendFileMessageCallback({ currentChannel: currentChannel, onBeforeSendFileMessage: onBeforeSendFileMessage, sendMessageStart: sendMessageStatusActions.sendMessageStart, sendMessageFailure: sendMessageStatusActions.sendMessageFailure, }, { logger: logger, pubSub: pubSub, }), sendVoiceMessage: useSendVoiceMessageCallback({ currentChannel: currentChannel, onBeforeSendVoiceMessage: onBeforeSendVoiceMessage, sendMessageStart: sendMessageStatusActions.sendMessageStart, sendMessageFailure: sendMessageStatusActions.sendMessageFailure, }, { logger: logger, pubSub: pubSub, }), sendMultipleFilesMessage: useSendMultipleFilesMessage({ currentChannel: currentChannel, onBeforeSendMultipleFilesMessage: onBeforeSendMultipleFilesMessage, publishingModules: [PublishingModuleType.THREAD], }, { logger: logger, pubSub: pubSub, })[0], resendMessage: useResendMessageCallback({ resendMessageStart: sendMessageStatusActions.resendMessageStart, sendMessageSuccess: sendMessageStatusActions.sendMessageSuccess, sendMessageFailure: sendMessageStatusActions.sendMessageFailure, currentChannel: currentChannel, }, { logger: logger, pubSub: pubSub }), }; var messageModifiedActions = { onMessageUpdated: useCallback(function (channel, message) { store.setState(function (state) { var _a, _b, _c; if (((_a = state.currentChannel) === null || _a === void 0 ? void 0 : _a.url) !== (channel === null || channel === void 0 ? void 0 : channel.url)) { return state; } return __assign(__assign({}, state), { parentMessage: ((_b = state.parentMessage) === null || _b === void 0 ? void 0 : _b.messageId) === (message === null || message === void 0 ? void 0 : message.messageId) ? message : state.parentMessage, allThreadMessages: (_c = state.allThreadMessages) === null || _c === void 0 ? void 0 : _c.map(function (msg) { return (((msg === null || msg === void 0 ? void 0 : msg.messageId) === (message === null || message === void 0 ? void 0 : message.messageId)) ? message : msg); }) }); }); }, [store]), onMessageDeleted: useCallback(function (channel, messageId) { store.setState(function (state) { var _a, _b, _c, _d; if (((_a = state.currentChannel) === null || _a === void 0 ? void 0 : _a.url) !== (channel === null || channel === void 0 ? void 0 : channel.url)) { return state; } if (((_b = state === null || state === void 0 ? void 0 : state.parentMessage) === null || _b === void 0 ? void 0 : _b.messageId) === messageId) { return __assign(__assign({}, state), { parentMessage: null, parentMessageState: ParentMessageStateTypes.NIL, allThreadMessages: [] }); } return __assign(__assign({}, state), { allThreadMessages: (_c = state.allThreadMessages) === null || _c === void 0 ? void 0 : _c.filter(function (msg) { return ((msg === null || msg === void 0 ? void 0 : msg.messageId) !== messageId); }), localThreadMessages: (_d = state.localThreadMessages) === null || _d === void 0 ? void 0 : _d.filter(function (msg) { return ((msg === null || msg === void 0 ? void 0 : msg.messageId) !== messageId); }) }); }); }, [store]), onMessageDeletedByReqId: useCallback(function (reqId) { store.setState(function (state) { return __assign(__assign({}, state), { localThreadMessages: state.localThreadMessages.filter(function (m) { return (!compareIds(m.reqId, reqId)); }) }); }); }, [store]), }; var modifyMessageActions = { updateMessage: useUpdateMessageCallback({ currentChannel: currentChannel, isMentionEnabled: isMentionEnabled, onMessageUpdated: messageModifiedActions.onMessageUpdated, }, { logger: logger, pubSub: pubSub }), deleteMessage: useDeleteMessageCallback({ currentChannel: currentChannel, onMessageDeleted: messageModifiedActions.onMessageDeleted, onMessageDeletedByReqId: messageModifiedActions.onMessageDeletedByReqId, }, { logger: logger }), }; var threadFetcherStatusActions = { initializeThreadListStart: useCallback(function () { return store.setState(function (state) { return __assign(__assign({}, state), { threadListState: ThreadListStateTypes.LOADING, allThreadMessages: [] }); }); }, [store]), initializeThreadListSuccess: useCallback(function (parentMessage, anchorMessage, threadedMessages) { return store.setState(function (state) { var anchorMessageCreatedAt = (!(anchorMessage === null || anchorMessage === void 0 ? void 0 : anchorMessage.messageId)) ? parentMessage === null || parentMessage === void 0 ? void 0 : parentMessage.createdAt : anchorMessage === null || anchorMessage === void 0 ? void 0 : anchorMessage.createdAt; var anchorIndex = threadedMessages.findIndex(function (message) { return (message === null || message === void 0 ? void 0 : message.createdAt) > anchorMessageCreatedAt; }); var prevThreadMessages = anchorIndex > -1 ? threadedMessages.slice(0, anchorIndex) : threadedMessages; var anchorThreadMessage = (anchorMessage === null || anchorMessage === void 0 ? void 0 : anchorMessage.messageId) ? [anchorMessage] : []; var nextThreadMessages = anchorIndex > -1 ? threadedMessages.slice(anchorIndex) : []; return __assign(__assign({}, state), { threadListState: ThreadListStateTypes.INITIALIZED, hasMorePrev: anchorIndex === -1 || anchorIndex === PREV_THREADS_FETCH_SIZE, hasMoreNext: threadedMessages.length - anchorIndex === NEXT_THREADS_FETCH_SIZE, allThreadMessages: [prevThreadMessages, anchorThreadMessage, nextThreadMessages].flat() }); }); }, [store]), initializeThreadListFailure: useCallback(function () { return store.setState(function (state) { return __assign(__assign({}, state), { threadListState: ThreadListStateTypes.LOADING, allThreadMessages: [] }); }); }, [store]), getPrevMessagesStart: useCallback(function () { return store.setState(function (state) { return __assign({}, state); }); }, [store]), getPrevMessagesSuccess: useCallback(function (threadedMessages) { return store.setState(function (state) { return __assign(__assign({}, state), { hasMorePrev: threadedMessages.length === PREV_THREADS_FETCH_SIZE, allThreadMessages: __spreadArray(__spreadArray([], threadedMessages, true), state.allThreadMessages, true) }); }); }, [store]), getPrevMessagesFailure: useCallback(function () { return store.setState(function (state) { return __assign(__assign({}, state), { hasMorePrev: false }); }); }, [store]), getNextMessagesStart: useCallback(function () { return store.setState(function (state) { return __assign({}, state); }); }, [store]), getNextMessagesSuccess: useCallback(function (threadedMessages) { return store.setState(function (state) { return __assign(__assign({}, state), { hasMoreNext: threadedMessages.length === NEXT_THREADS_FETCH_SIZE, allThreadMessages: __spreadArray(__spreadArray([], state.allThreadMessages, true), threadedMessages, true) }); }); }, [store]), getNextMessagesFailure: useCallback(function () { return store.setState(function (state) { return __assign(__assign({}, state), { hasMoreNext: false }); }); }, [store]), }; var _c = useThreadFetchers({ parentMessage: parentMessage, // anchorMessage should be null when parentMessage doesn't exist anchorMessage: (message === null || message === void 0 ? void 0 : message.messageId) !== (parentMessage === null || parentMessage === void 0 ? void 0 : parentMessage.messageId) ? message || undefined : undefined, logger: logger, isReactionEnabled: isReactionEnabled, threadListState: threadListState, oldestMessageTimeStamp: ((_a = allThreadMessages[0]) === null || _a === void 0 ? void 0 : _a.createdAt) || 0, latestMessageTimeStamp: ((_b = allThreadMessages[allThreadMessages.length - 1]) === null || _b === void 0 ? void 0 : _b.createdAt) || 0, initializeThreadListStart: threadFetcherStatusActions.initializeThreadListStart, initializeThreadListSuccess: threadFetcherStatusActions.initializeThreadListSuccess, initializeThreadListFailure: threadFetcherStatusActions.initializeThreadListFailure, getPrevMessagesStart: threadFetcherStatusActions.getPrevMessagesStart, getPrevMessagesSuccess: threadFetcherStatusActions.getPrevMessagesSuccess, getPrevMessagesFailure: threadFetcherStatusActions.getPrevMessagesFailure, getNextMessagesStart: threadFetcherStatusActions.getNextMessagesStart, getNextMessagesSuccess: threadFetcherStatusActions.getNextMessagesSuccess, getNextMessagesFailure: threadFetcherStatusActions.getNextMessagesFailure, }), initializeThreadFetcher = _c.initializeThreadFetcher, fetchPrevThreads = _c.fetchPrevThreads, fetchNextThreads = _c.fetchNextThreads; var simpleActions = { setCurrentUserId: useCallback(function (currentUserId) { return store.setState(function (state) { return (__assign(__assign({}, state), { currentUserId: currentUserId })); }); }, [store]), getChannelStart: useCallback(function () { return store.setState(function (state) { return (__assign(__assign({}, state), { channelState: ChannelStateTypes.LOADING, currentChannel: null })); }); }, [store]), getChannelSuccess: useCallback(function (groupChannel) { return store.setState(function (state) { var _a, _b; return (__assign(__assign({}, state), { channelState: ChannelStateTypes.INITIALIZED, currentChannel: groupChannel, // only support in normal group channel isMuted: ((_b = (_a = groupChannel === null || groupChannel === void 0 ? void 0 : groupChannel.members) === null || _a === void 0 ? void 0 : _a.find(function (member) { return (member === null || member === void 0 ? void 0 : member.userId) === state.currentUserId; })) === null || _b === void 0 ? void 0 : _b.isMuted) || false, isChannelFrozen: (groupChannel === null || groupChannel === void 0 ? void 0 : groupChannel.isFrozen) || false })); }); }, [store]), getChannelFailure: useCallback(function () { return store.setState(function (state) { return (__assign(__assign({}, state), { channelState: ChannelStateTypes.INVALID, currentChannel: null })); }); }, [store]), getParentMessageStart: useCallback(function () { return store.setState(function (state) { return (__assign(__assign({}, state), { parentMessageState: ParentMessageStateTypes.LOADING, parentMessage: null })); }); }, [store]), getParentMessageSuccess: useCallback(function (parentMessage) { return store.setState(function (state) { return (__assign(__assign({}, state), { parentMessageState: ParentMessageStateTypes.INITIALIZED, parentMessage: parentMessage })); }); }, [store]), getParentMessageFailure: useCallback(function () { return store.setState(function (state) { return (__assign(__assign({}, state), { parentMessageState: ParentMessageStateTypes.INVALID, parentMessage: null })); }); }, [store]), setEmojiContainer: useCallback(function (emojiContainer) { return store.setState(function (state) { return (__assign(__assign({}, state), { emojiContainer: emojiContainer })); }); }, [store]), onMessageReceived: useCallback(function (channel, message) { return store.setState(function (state) { var _a, _b, _c, _d; if (((_a = state.currentChannel) === null || _a === void 0 ? void 0 : _a.url) !== (channel === null || channel === void 0 ? void 0 : channel.url) || state.hasMoreNext || ((_b = message === null || message === void 0 ? void 0 : message.parentMessage) === null || _b === void 0 ? void 0 : _b.messageId) !== ((_c = state === null || state === void 0 ? void 0 : state.parentMessage) === null || _c === void 0 ? void 0 : _c.messageId)) { return state; } var isAlreadyReceived = state.allThreadMessages.findIndex(function (m) { return (m.messageId === message.messageId); }) > -1; return __assign(__assign({}, state), { parentMessage: ((_d = state.parentMessage) === null || _d === void 0 ? void 0 : _d.messageId) === (message === null || message === void 0 ? void 0 : message.messageId) ? message : state.parentMessage, allThreadMessages: isAlreadyReceived ? state.allThreadMessages.map(function (m) { return (m.messageId === message.messageId ? message : m); }) : __spreadArray(__spreadArray([], state.allThreadMessages.filter(function (m) { return (m === null || m === void 0 ? void 0 : m.reqId) !== (message === null || message === void 0 ? void 0 : message.reqId); }), true), [ message, ], false) }); }); }, [store]), onReactionUpdated: useCallback(function (reactionEvent) { return store.setState(function (state) { var _a, _b, _c; if (((_a = state === null || state === void 0 ? void 0 : state.parentMessage) === null || _a === void 0 ? void 0 : _a.messageId) === (reactionEvent === null || reactionEvent === void 0 ? void 0 : reactionEvent.messageId)) { (_c = (_b = state.parentMessage) === null || _b === void 0 ? void 0 : _b.applyReactionEvent) === null || _c === void 0 ? void 0 : _c.call(_b, reactionEvent); } return __assign(__assign({}, state), { allThreadMessages: state.allThreadMessages.map(function (m) { var _a; if ((reactionEvent === null || reactionEvent === void 0 ? void 0 : reactionEvent.messageId) === (m === null || m === void 0 ? void 0 : m.messageId)) { (_a = m === null || m === void 0 ? void 0 : m.applyReactionEvent) === null || _a === void 0 ? void 0 : _a.call(m, reactionEvent); return m; } return m; }) }); }); }, [store]), onUserMuted: useCallback(function (channel, user) { return store.setState(function (state) { var _a; if (((_a = state.currentChannel) === null || _a === void 0 ? void 0 : _a.url) !== (channel === null || channel === void 0 ? void 0 : channel.url) || state.currentUserId !== (user === null || user === void 0 ? void 0 : user.userId)) { return state; } return __assign(__assign({}, state), { isMuted: true }); }); }, [store]), onUserUnmuted: useCallback(function (channel, user) { return store.setState(function (state) { var _a; if (((_a = state.currentChannel) === null || _a === void 0 ? void 0 : _a.url) !== (channel === null || channel === void 0 ? void 0 : channel.url) || state.currentUserId !== (user === null || user === void 0 ? void 0 : user.userId)) { return state; } return __assign(__assign({}, state), { isMuted: false }); }); }, [store]), onUserBanned: useCallback(function () { return store.setState(function (state) { return __assign(__assign({}, state), { channelState: ChannelStateTypes.NIL, threadListState: ThreadListStateTypes.NIL, parentMessageState: ParentMessageStateTypes.NIL, currentChannel: null, parentMessage: null, allThreadMessages: [], hasMorePrev: false, hasMoreNext: false }); }); }, [store]), onUserUnbanned: useCallback(function () { return store.setState(function (state) { return __assign({}, state); }); }, [store]), onUserLeft: useCallback(function () { return store.setState(function (state) { return __assign(__assign({}, state), { channelState: ChannelStateTypes.NIL, threadListState: ThreadListStateTypes.NIL, parentMessageState: ParentMessageStateTypes.NIL, currentChannel: null, parentMessage: null, allThreadMessages: [], hasMorePrev: false, hasMoreNext: false }); }); }, [store]), onChannelFrozen: useCallback(function () { return store.setState(function (state) { return __assign(__assign({}, state), { isChannelFrozen: true }); }); }, [store]), onCha