@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
JavaScript
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