UNPKG

@sendbird/uikit-react

Version:

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

843 lines (830 loc) 50.3 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var _tslib = require('./chunks/bundle-Conb-pOy.js'); var React = require('react'); var uikitTools = require('@sendbird/uikit-tools'); var resolvedReplyType = require('./chunks/bundle-BPUhuptz.js'); var uikitConfigStorage = require('./chunks/bundle-C6rru8Hj.js'); var VoicePlayer_context = require('./chunks/bundle-BHp3N9Mz.js'); var VoiceRecorder_context = require('./VoiceRecorder/context.js'); var MediaQueryContext = require('./chunks/bundle-Fv6PNPGZ.js'); var LocalizationContext = require('./chunks/bundle-DPDyqKIJ.js'); var hooks_useModal = require('./hooks/useModal.js'); var utils = require('./chunks/bundle-CkQrhwR6.js'); var index = require('./chunks/bundle-19BZVS4G.js'); var colorMapper = require('./chunks/bundle-djxmZVvC.js'); var cssVars = require('css-vars-ponyfill'); var consts = require('./chunks/bundle-Cfh78Xnm.js'); var useMarkAsDeliveredScheduler = require('./chunks/bundle-Dhgx-4nj.js'); var stringSet = require('./chunks/bundle-BbrBawlX.js'); var ui_ContextMenu = require('./chunks/bundle-DGV1BX0m.js'); var useSendbird = require('./chunks/bundle-Bq15P9qk.js'); var SendbirdContext = require('./chunks/bundle-B19RHFpR.js'); var useDeepCompareEffect = require('./chunks/bundle-CxArG0ag.js'); var ui_Modal = require('./chunks/bundle-DZlJeh0V.js'); require('./chunks/bundle-DAdgL6r8.js'); require('./chunks/bundle-Cyl6_qLo.js'); require('react-dom'); require('./ui/IconButton.js'); require('./ui/Button.js'); require('./chunks/bundle-zgmRG2KL.js'); require('./ui/Icon.js'); require('./chunks/bundle-t8BQsgL5.js'); require('@sendbird/chat'); require('@sendbird/chat/groupChannel'); require('@sendbird/chat/openChannel'); require('./chunks/bundle-Dobj18FB.js'); require('./ui/SortByRow.js'); require('./chunks/bundle-fYxs1lss.js'); require('./utils/message/getOutgoingMessageState.js'); require('./chunks/bundle-CVJwHwWn.js'); function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; } var React__default = /*#__PURE__*/_interopDefaultCompat(React); var cssVars__default = /*#__PURE__*/_interopDefaultCompat(cssVars); function uikitConfigMapper(_a) { var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9; var legacyConfig = _a.legacyConfig, _10 = _a.uikitOptions, uikitOptions = _10 === void 0 ? {} : _10; var replyType = legacyConfig.replyType, isMentionEnabled = legacyConfig.isMentionEnabled, isReactionEnabled = legacyConfig.isReactionEnabled, disableUserProfile = legacyConfig.disableUserProfile, isVoiceMessageEnabled = legacyConfig.isVoiceMessageEnabled, isTypingIndicatorEnabledOnChannelList = legacyConfig.isTypingIndicatorEnabledOnChannelList, isMessageReceiptStatusEnabledOnChannelList = legacyConfig.isMessageReceiptStatusEnabledOnChannelList, showSearchIcon = legacyConfig.showSearchIcon; return { common: { enableUsingDefaultUserProfile: (_c = (_b = uikitOptions.common) === null || _b === void 0 ? void 0 : _b.enableUsingDefaultUserProfile) !== null && _c !== void 0 ? _c : (typeof disableUserProfile === 'boolean' ? !disableUserProfile : undefined), }, groupChannel: { enableOgtag: (_d = uikitOptions.groupChannel) === null || _d === void 0 ? void 0 : _d.enableOgtag, enableMention: (_f = (_e = uikitOptions.groupChannel) === null || _e === void 0 ? void 0 : _e.enableMention) !== null && _f !== void 0 ? _f : isMentionEnabled, enableReactions: (_h = (_g = uikitOptions.groupChannel) === null || _g === void 0 ? void 0 : _g.enableReactions) !== null && _h !== void 0 ? _h : isReactionEnabled, enableReactionsSupergroup: (_j = uikitOptions.groupChannel) === null || _j === void 0 ? void 0 : _j.enableReactionsSupergroup, enableTypingIndicator: (_k = uikitOptions.groupChannel) === null || _k === void 0 ? void 0 : _k.enableTypingIndicator, enableVoiceMessage: (_m = (_l = uikitOptions.groupChannel) === null || _l === void 0 ? void 0 : _l.enableVoiceMessage) !== null && _m !== void 0 ? _m : isVoiceMessageEnabled, replyType: (_p = (_o = uikitOptions.groupChannel) === null || _o === void 0 ? void 0 : _o.replyType) !== null && _p !== void 0 ? _p : (replyType != null ? resolvedReplyType.getCaseResolvedReplyType(replyType).lowerCase : undefined), threadReplySelectType: (_q = uikitOptions.groupChannel) === null || _q === void 0 ? void 0 : _q.threadReplySelectType, input: { enableDocument: (_s = (_r = uikitOptions.groupChannel) === null || _r === void 0 ? void 0 : _r.input) === null || _s === void 0 ? void 0 : _s.enableDocument, }, typingIndicatorTypes: (_t = uikitOptions.groupChannel) === null || _t === void 0 ? void 0 : _t.typingIndicatorTypes, enableFeedback: (_u = uikitOptions.groupChannel) === null || _u === void 0 ? void 0 : _u.enableFeedback, enableSuggestedReplies: (_v = uikitOptions.groupChannel) === null || _v === void 0 ? void 0 : _v.enableSuggestedReplies, showSuggestedRepliesFor: (_w = uikitOptions.groupChannel) === null || _w === void 0 ? void 0 : _w.showSuggestedRepliesFor, suggestedRepliesDirection: (_x = uikitOptions.groupChannel) === null || _x === void 0 ? void 0 : _x.suggestedRepliesDirection, enableMarkdownForUserMessage: (_y = uikitOptions.groupChannel) === null || _y === void 0 ? void 0 : _y.enableMarkdownForUserMessage, enableFormTypeMessage: (_z = uikitOptions.groupChannel) === null || _z === void 0 ? void 0 : _z.enableFormTypeMessage, enableMarkAsUnread: (_0 = uikitOptions.groupChannel) === null || _0 === void 0 ? void 0 : _0.enableMarkAsUnread, }, groupChannelList: { enableTypingIndicator: (_2 = (_1 = uikitOptions.groupChannelList) === null || _1 === void 0 ? void 0 : _1.enableTypingIndicator) !== null && _2 !== void 0 ? _2 : isTypingIndicatorEnabledOnChannelList, enableMessageReceiptStatus: (_4 = (_3 = uikitOptions.groupChannelList) === null || _3 === void 0 ? void 0 : _3.enableMessageReceiptStatus) !== null && _4 !== void 0 ? _4 : isMessageReceiptStatusEnabledOnChannelList, }, groupChannelSettings: { enableMessageSearch: (_6 = (_5 = uikitOptions.groupChannelSettings) === null || _5 === void 0 ? void 0 : _5.enableMessageSearch) !== null && _6 !== void 0 ? _6 : showSearchIcon, }, openChannel: { enableOgtag: (_7 = uikitOptions.openChannel) === null || _7 === void 0 ? void 0 : _7.enableOgtag, input: { enableDocument: (_9 = (_8 = uikitOptions.openChannel) === null || _8 === void 0 ? void 0 : _8.input) === null || _9 === void 0 ? void 0 : _9.enableDocument, }, }, }; } var VoiceMessageProvider = function (_a) { var children = _a.children; return (React__default.default.createElement(VoicePlayer_context.VoicePlayerProvider, null, React__default.default.createElement(VoiceRecorder_context.VoiceRecorderProvider, null, children))); }; // Logger, pretty much explains it // in SendbirdProvider // const [logger, setLogger] = useState(LoggerFactory(logLevel)); var LOG_LEVELS = { DEBUG: 'debug', WARNING: 'warning', ERROR: 'error', INFO: 'info', ALL: 'all', }; var colorLog = function (level) { switch (level) { case LOG_LEVELS.WARNING: return ('color: Orange'); case LOG_LEVELS.ERROR: return ('color: Red'); default: return ('color: Gray'); } }; var printLog = function (_a) { var level = _a.level, title = _a.title, _b = _a.description, description = _b === void 0 ? '' : _b, _c = _a.payload, payload = _c === void 0 ? [] : _c; // eslint-disable-next-line no-console console.log.apply(console, _tslib.__spreadArray(["%c SendbirdUIKit | ".concat(level, " | ").concat(new Date().toISOString(), " | ").concat(title, " ").concat(description && '|'), colorLog(level), description], payload, false)); }; var getDefaultLogger = function () { return ({ info: utils.noop, error: utils.noop, warning: utils.noop, }); }; var LoggerFactory = function (lvl, customInterface) { var logInterface = printLog; var lvlArray = Array.isArray(lvl) ? lvl : [lvl]; var applyLog = function (lgLvl) { return function (title, description) { var payload = []; for (var _i = 2; _i < arguments.length; _i++) { payload[_i - 2] = arguments[_i]; } return logInterface({ level: lgLvl, title: title, description: description, payload: payload, }); }; }; return lvlArray.reduce(function (accumulator, currentLvl) { if (currentLvl === LOG_LEVELS.DEBUG || currentLvl === LOG_LEVELS.ALL) { return (_tslib.__assign(_tslib.__assign({}, accumulator), { info: applyLog(LOG_LEVELS.INFO), error: applyLog(LOG_LEVELS.ERROR), warning: applyLog(LOG_LEVELS.WARNING) })); } if (currentLvl === LOG_LEVELS.INFO) { return (_tslib.__assign(_tslib.__assign({}, accumulator), { info: applyLog(LOG_LEVELS.INFO) })); } if (currentLvl === LOG_LEVELS.ERROR) { return (_tslib.__assign(_tslib.__assign({}, accumulator), { error: applyLog(LOG_LEVELS.ERROR) })); } if (currentLvl === LOG_LEVELS.WARNING) { return (_tslib.__assign(_tslib.__assign({}, accumulator), { warning: applyLog(LOG_LEVELS.WARNING) })); } return _tslib.__assign({}, accumulator); }, getDefaultLogger()); }; // TODO: Make this to hook, useLogger var DEFAULT_COLOR_SET = { '--sendbird-dark-primary-500': '#4d2aa6', '--sendbird-dark-primary-400': '#6440C4', '--sendbird-dark-primary-300': '#7B53EF', '--sendbird-dark-primary-200': '#9E8CF5', '--sendbird-dark-primary-100': '#E2DFFF', '--sendbird-dark-secondary-500': '#007A7A', '--sendbird-dark-secondary-400': '#189A8D', '--sendbird-dark-secondary-300': '#2EBA9F', '--sendbird-dark-secondary-200': '#6FD6BE', '--sendbird-dark-secondary-100': '#AEF2DC', '--sendbird-dark-information-100': '#b2d9ff', '--sendbird-dark-error-500': '#A30E2D', '--sendbird-dark-error-400': '#C11F41', '--sendbird-dark-error-300': '#E53157', '--sendbird-dark-error-200': '#FF6183', '--sendbird-dark-error-100': '#FFABBD', '--sendbird-dark-background-700': '#000000', '--sendbird-dark-background-600': '#161616', '--sendbird-dark-background-500': '#2C2C2C', '--sendbird-dark-background-400': '#393939', '--sendbird-dark-background-300': '#A8A8A8', '--sendbird-dark-background-200': '#D9D9D9', '--sendbird-dark-background-100': '#F0F0F0', '--sendbird-dark-background-50': '#FFFFFF', '--sendbird-dark-overlay': 'rgba(0, 0, 0, 0.32)', '--sendbird-dark-onlight-01': 'rgba(0, 0, 0, 0.88)', '--sendbird-dark-onlight-02': 'rgba(0, 0, 0, 0.50)', '--sendbird-dark-onlight-03': 'rgba(0, 0, 0, 0.38)', '--sendbird-dark-onlight-04': 'rgba(0, 0, 0, 0.12)', '--sendbird-dark-ondark-01': 'rgba(255, 255, 255, 0.88)', '--sendbird-dark-ondark-02': 'rgba(255, 255, 255, 0.50)', '--sendbird-dark-ondark-03': 'rgba(255, 255, 255, 0.38)', '--sendbird-dark-ondark-04': 'rgba(255, 255, 255, 0.12)', '--sendbird-dark-shadow-01': '0 1px 5px 0 rgba(33, 34, 66, 0.04), 0 0 3px 0 rgba(0, 0, 0, 0.08), 0 2px 1px 0 rgba(0, 0, 0, 0.12)', '--sendbird-dark-shadow-02': '0 3px 5px -3px rgba(33, 34, 66, 0.04), 0 3px 14px 2px rgba(0, 0, 0, 0.08), 0 8px 10px 1px rgba(0, 0, 0, 0.12)', '--sendbird-dark-shadow-03': '0 6px 10px -5px rgba(0, 0, 0, 0.04), 0 6px 30px 5px rgba(0, 0, 0, 0.08), 0 16px 24px 2px rgba(0, 0, 0, 0.12)', '--sendbird-dark-shadow-04': '0 9px 15px -7px rgba(0, 0, 0, 0.04), 0 9px 46px 8px rgba(0, 0, 0, 0.08), 0 24px 38px 3px rgba(0, 0, 0, 0.12)', '--sendbird-dark-shadow-message-input': '0 1px 5px 0 rgba(33, 34, 66, 0.12), 0 0 1px 0 rgba(33, 34, 66, 0.16), 0 2px 1px 0 rgba(33, 34, 66, 0.08), 0 1px 5px 0 rgba(0, 0, 0, 0.12)', '--sendbird-light-primary-500': '#4d2aa6', '--sendbird-light-primary-400': '#6440C4', '--sendbird-light-primary-300': '#7B53EF', '--sendbird-light-primary-200': '#9E8CF5', '--sendbird-light-primary-100': '#E2DFFF', '--sendbird-light-secondary-500': '#007A7A', '--sendbird-light-secondary-400': '#189A8D', '--sendbird-light-secondary-300': '#2EBA9F', '--sendbird-light-secondary-200': '#6FD6BE', '--sendbird-light-secondary-100': '#AEF2DC', '--sendbird-light-information-100': '#b2d9ff', '--sendbird-light-error-500': '#A30E2D', '--sendbird-light-error-400': '#C11F41', '--sendbird-light-error-300': '#E53157', '--sendbird-light-error-200': '#FF6183', '--sendbird-light-error-100': '#FFABBD', '--sendbird-light-background-700': '#000000', '--sendbird-light-background-600': '#161616', '--sendbird-light-background-500': '#2C2C2C', '--sendbird-light-background-400': '#393939', '--sendbird-light-background-300': '#A8A8A8', '--sendbird-light-background-200': '#D9D9D9', '--sendbird-light-background-100': '#F0F0F0', '--sendbird-light-background-50': ' #FFFFFF', '--sendbird-light-overlay': 'rgba(0, 0, 0, 0.32)', '--sendbird-light-onlight-01': 'rgba(0, 0, 0, 0.88)', '--sendbird-light-onlight-02': 'rgba(0, 0, 0, 0.50)', '--sendbird-light-onlight-03': 'rgba(0, 0, 0, 0.38)', '--sendbird-light-onlight-04': 'rgba(0, 0, 0, 0.12)', '--sendbird-light-ondark-01': 'rgba(255, 255, 255, 0.88)', '--sendbird-light-ondark-02': 'rgba(255, 255, 255, 0.50)', '--sendbird-light-ondark-03': 'rgba(255, 255, 255, 0.38)', '--sendbird-light-ondark-04': 'rgba(255, 255, 255, 0.12)', '--sendbird-light-shadow-01': '0 1px 5px 0 rgba(33, 34, 66, 0.04), 0 0 3px 0 rgba(0, 0, 0, 0.08), 0 2px 1px 0 rgba(0, 0, 0, 0.12)', '--sendbird-light-shadow-02': '0 3px 5px -3px rgba(33, 34, 66, 0.04), 0 3px 14px 2px rgba(0, 0, 0, 0.08), 0 8px 10px 1px rgba(0, 0, 0, 0.12)', '--sendbird-light-shadow-03': '0 6px 10px -5px rgba(0, 0, 0, 0.04), 0 6px 30px 5px rgba(0, 0, 0, 0.08), 0 16px 24px 2px rgba(0, 0, 0, 0.12)', '--sendbird-light-shadow-04': '0 9px 15px -7px rgba(0, 0, 0, 0.04), 0 9px 46px 8px rgba(0, 0, 0, 0.08), 0 24px 38px 3px rgba(0, 0, 0, 0.12)', '--sendbird-light-shadow-message-input': '0 1px 5px 0 rgba(33, 34, 66, 0.12), 0 0 1px 0 rgba(33, 34, 66, 0.16), 0 2px 1px 0 rgba(33, 34, 66, 0.08), 0 1px 5px 0 rgba(0, 0, 0, 0.12)', }; var isEmpty = function (obj) { if (obj === null || obj === undefined) { return true; } for (var prop in obj) { if (obj.hasOwnProperty(prop)) { return false; } } return JSON.stringify(obj) === JSON.stringify({}); }; var useTheme = function (overrides) { React.useLayoutEffect(function () { if (!isEmpty(overrides)) { var variables = _tslib.__assign(_tslib.__assign({}, DEFAULT_COLOR_SET), colorMapper.mapColorKeys(overrides)); cssVars__default.default({ variables: variables }); } }, [overrides]); }; var MESSAGE_TEMPLATES_FETCH_LIMIT = 20; /** * Takes JSON parsed template and then returns processed message template for storing it in global state. */ var getProcessedTemplate = function (parsedTemplate) { return { version: Number(parsedTemplate.ui_template.version), uiTemplate: JSON.stringify(parsedTemplate.ui_template.body.items), colorVariables: parsedTemplate.color_variables, }; }; var getProcessedTemplatesMap = function (parsedTemplates) { var processedTemplates = {}; parsedTemplates.forEach(function (template) { processedTemplates[template.key] = getProcessedTemplate(template); }); return processedTemplates; }; function useMessageTemplateUtils(_a) { var _this = this; var _b; var sdk = _a.sdk, logger = _a.logger, appInfoStore = _a.appInfoStore, actions = _a.actions; var messageTemplatesInfo = appInfoStore === null || appInfoStore === void 0 ? void 0 : appInfoStore.messageTemplatesInfo; var getCachedTemplate = React.useCallback(function (key) { var _a, _b; if (!messageTemplatesInfo) return null; var cachedTemplate = null; var cachedMessageTemplates = (_a = messageTemplatesInfo === null || messageTemplatesInfo === void 0 ? void 0 : messageTemplatesInfo.templatesMap) !== null && _a !== void 0 ? _a : null; if (cachedMessageTemplates) { cachedTemplate = (_b = cachedMessageTemplates[key]) !== null && _b !== void 0 ? _b : null; } return cachedTemplate; }, [appInfoStore === null || appInfoStore === void 0 ? void 0 : appInfoStore.messageTemplatesInfo]); /** * Fetches a single message template by given key and then * returns processed template for updating templates info in global state. * If no such templates exists (error) or any error occurs in response, return null. */ var fetchAllMessageTemplates = function (readySdk) { return _tslib.__awaiter(_this, void 0, void 0, function () { var hasMore, paginationToken, fetchedTemplates, res; return _tslib.__generator(this, function (_a) { switch (_a.label) { case 0: hasMore = true; paginationToken = null; fetchedTemplates = []; _a.label = 1; case 1: if (!hasMore) return [3 /*break*/, 3]; return [4 /*yield*/, readySdk.message.getMessageTemplatesByToken(paginationToken, { limit: MESSAGE_TEMPLATES_FETCH_LIMIT })]; case 2: res = _a.sent(); hasMore = res.hasMore; paginationToken = res.token; res.templates.forEach(function (messageTemplate) { fetchedTemplates.push(JSON.parse(messageTemplate.template)); }); return [3 /*break*/, 1]; case 3: return [2 /*return*/, fetchedTemplates]; } }); }); }; var initializeMessageTemplatesInfo = function (readySdk) { return _tslib.__awaiter(_this, void 0, void 0, function () { var sdkMessageTemplateToken, cachedMessageTemplatesToken, cachedMessageTemplates, parsedTemplates, newMessageTemplatesInfo, parsedTemplates, newMessageTemplatesInfo; var _a; return _tslib.__generator(this, function (_b) { switch (_b.label) { case 0: sdkMessageTemplateToken = (_a = readySdk.appInfo) === null || _a === void 0 ? void 0 : _a.messageTemplateInfo.token; /** * no sdkMessageTemplateToken => no templates => clear cached */ if (!sdkMessageTemplateToken) { localStorage.removeItem(consts.CACHED_MESSAGE_TEMPLATES_TOKEN_KEY); localStorage.removeItem(consts.CACHED_MESSAGE_TEMPLATES_KEY); return [2 /*return*/]; } cachedMessageTemplatesToken = localStorage.getItem(consts.CACHED_MESSAGE_TEMPLATES_TOKEN_KEY); cachedMessageTemplates = localStorage.getItem(consts.CACHED_MESSAGE_TEMPLATES_KEY); if (!(!cachedMessageTemplatesToken || cachedMessageTemplatesToken !== sdkMessageTemplateToken)) return [3 /*break*/, 2]; return [4 /*yield*/, fetchAllMessageTemplates(readySdk)]; case 1: parsedTemplates = _b.sent(); newMessageTemplatesInfo = { token: sdkMessageTemplateToken, templatesMap: getProcessedTemplatesMap(parsedTemplates), }; actions.initMessageTemplateInfo({ payload: newMessageTemplatesInfo }); localStorage.setItem(consts.CACHED_MESSAGE_TEMPLATES_TOKEN_KEY, sdkMessageTemplateToken); localStorage.setItem(consts.CACHED_MESSAGE_TEMPLATES_KEY, JSON.stringify(parsedTemplates)); return [3 /*break*/, 3]; case 2: if (cachedMessageTemplatesToken && cachedMessageTemplatesToken === sdkMessageTemplateToken && cachedMessageTemplates) { parsedTemplates = JSON.parse(cachedMessageTemplates); newMessageTemplatesInfo = { token: sdkMessageTemplateToken, templatesMap: getProcessedTemplatesMap(parsedTemplates), }; actions.initMessageTemplateInfo({ payload: newMessageTemplatesInfo }); } _b.label = 3; case 3: return [2 /*return*/]; } }); }); }; /** * If given message is a template message with template key and if the key does not exist in the cache, * update the cache by fetching the template. */ var updateMessageTemplatesInfo = React.useCallback(function (templateKeys, messageId, requestedAt) { return _tslib.__awaiter(_this, void 0, void 0, function () { var newParsedTemplates, hasMore, token, result, e_1, cachedMessageTemplates, parsedTemplates_1, existingKeys_1; var _a; return _tslib.__generator(this, function (_b) { switch (_b.label) { case 0: actions.upsertWaitingTemplateKeys({ keys: templateKeys, requestedAt: requestedAt }); newParsedTemplates = []; _b.label = 1; case 1: _b.trys.push([1, 5, , 6]); hasMore = true; token = null; _b.label = 2; case 2: if (!hasMore) return [3 /*break*/, 4]; return [4 /*yield*/, sdk.message.getMessageTemplatesByToken(token, { keys: templateKeys, })]; case 3: result = _b.sent(); result.templates.forEach(function (newTemplate) { newParsedTemplates.push(JSON.parse(newTemplate.template)); }); hasMore = result.hasMore; token = result.token; return [3 /*break*/, 2]; case 4: return [3 /*break*/, 6]; case 5: e_1 = _b.sent(); (_a = logger === null || logger === void 0 ? void 0 : logger.error) === null || _a === void 0 ? void 0 : _a.call(logger, 'Sendbird | fetchProcessedMessageTemplates failed', e_1, templateKeys); return [3 /*break*/, 6]; case 6: if (newParsedTemplates.length > 0) { cachedMessageTemplates = localStorage.getItem(consts.CACHED_MESSAGE_TEMPLATES_KEY); if (cachedMessageTemplates) { parsedTemplates_1 = JSON.parse(cachedMessageTemplates); existingKeys_1 = parsedTemplates_1.map(function (parsedTemplate) { return parsedTemplate.key; }); newParsedTemplates.forEach(function (newParsedTemplate) { if (!existingKeys_1.includes(newParsedTemplate.key)) { parsedTemplates_1.push(newParsedTemplate); } }); localStorage.setItem(consts.CACHED_MESSAGE_TEMPLATES_KEY, JSON.stringify(parsedTemplates_1)); } else { localStorage.setItem(consts.CACHED_MESSAGE_TEMPLATES_KEY, JSON.stringify([newParsedTemplates])); } // Update memory actions.upsertMessageTemplates({ payload: newParsedTemplates.map(function (newParsedTemplate) { return { key: newParsedTemplate.key, template: getProcessedTemplate(newParsedTemplate), }; }), }); } else { actions.markErrorWaitingTemplateKeys({ keys: templateKeys, messageId: messageId, }); } return [2 /*return*/]; } }); }); }, [ actions.upsertMessageTemplates, actions.upsertWaitingTemplateKeys, (_b = sdk === null || sdk === void 0 ? void 0 : sdk.message) === null || _b === void 0 ? void 0 : _b.getMessageTemplatesByToken, ]); return { getCachedTemplate: getCachedTemplate, updateMessageTemplatesInfo: updateMessageTemplatesInfo, initializeMessageTemplatesInfo: initializeMessageTemplatesInfo, }; } var useHTMLTextDirection = function (direction) { React.useEffect(function () { /** * It sets the 'dir' attribute of the closest parent <div> element of the element with VOICE_PLAYER_ROOT_ID cause: * - An empty <div> element is created in the VoiceMessageProvider, which is the highest-level <div> element within the SendbirdProvider. * - It tries to find the nearest parent <div> element within the SendbirdProvider and sets 'dir' attribute, * ensuring that the directionality is applied correctly. * */ var targetElement = document.getElementById(consts.VOICE_PLAYER_ROOT_ID); targetElement.parentElement.dir = direction; }, [direction]); }; function useMarkAsReadScheduler(_a, _b) { var isConnected = _a.isConnected; var logger = _b.logger; var markAsReadScheduler = React.useMemo(function () { return useMarkAsDeliveredScheduler.schedulerFactory({ logger: logger, cb: function (channel) { try { channel.markAsRead(); } catch (error) { logger.warning('Channel: Mark as delivered failed', { channel: channel, error: error }); } }, }); }, []); React.useEffect(function () { // for simplicity, we clear the queue when the connection is lost if (!isConnected) { markAsReadScheduler.clear(); } }, [isConnected]); useMarkAsDeliveredScheduler.useUnmount(function () { markAsReadScheduler.clear(); }); return markAsReadScheduler; } /** * SendbirdContext - Manager */ var SendbirdContextManager = function (_a) { var _b; var appId = _a.appId, userId = _a.userId, accessToken = _a.accessToken, customApiHost = _a.customApiHost, customWebSocketHost = _a.customWebSocketHost, configureSession = _a.configureSession, _c = _a.theme, theme = _c === void 0 ? 'light' : _c, logger = _a.logger, _d = _a.config, config = _d === void 0 ? {} : _d, _e = _a.nickname, nickname = _e === void 0 ? '' : _e, colorSet = _a.colorSet, _f = _a.profileUrl, profileUrl = _f === void 0 ? '' : _f, voiceRecord = _a.voiceRecord, userListQuery = _a.userListQuery, _g = _a.imageCompression, imageCompression = _g === void 0 ? {} : _g, _h = _a.allowProfileEdit, allowProfileEdit = _h === void 0 ? false : _h, _j = _a.disableMarkAsDelivered, disableMarkAsDelivered = _j === void 0 ? false : _j, renderUserProfile = _a.renderUserProfile, _onUserProfileMessage = _a.onUserProfileMessage, _onStartDirectMessage = _a.onStartDirectMessage, _k = _a.isUserIdUsedForNickname, isUserIdUsedForNickname = _k === void 0 ? true : _k, sdkInitParams = _a.sdkInitParams, customExtensionParams = _a.customExtensionParams, _l = _a.isMultipleFilesMessageEnabled, isMultipleFilesMessageEnabled = _l === void 0 ? false : _l, eventHandlers = _a.eventHandlers, _m = _a.htmlTextDirection, htmlTextDirection = _m === void 0 ? 'ltr' : _m, _o = _a.forceLeftToRightMessageLayout, forceLeftToRightMessageLayout = _o === void 0 ? false : _o; var onStartDirectMessage = _onStartDirectMessage !== null && _onStartDirectMessage !== void 0 ? _onStartDirectMessage : _onUserProfileMessage; var _p = config.userMention, userMention = _p === void 0 ? {} : _p, _q = config.isREMUnitEnabled, isREMUnitEnabled = _q === void 0 ? false : _q, customPubSub = config.pubSub; var isMobile = MediaQueryContext.useMediaQueryContext().isMobile; var pubSub = React.useState(customPubSub !== null && customPubSub !== void 0 ? customPubSub : index.pubSubFactory())[0]; var _r = SendbirdContext.useSendbirdStore(), state = _r.state, updateState = _r.updateState; var actions = useSendbird.useSendbird().actions; var _s = state.stores, sdkStore = _s.sdkStore, appInfoStore = _s.appInfoStore; var _t = uikitTools.useUIKitConfig(), configs = _t.configs, configsWithAppAttr = _t.configsWithAppAttr, initDashboardConfigs = _t.initDashboardConfigs; var sdkInitialized = sdkStore.initialized; var sdk = sdkStore === null || sdkStore === void 0 ? void 0 : sdkStore.sdk; var _u = (_b = sdk === null || sdk === void 0 ? void 0 : sdk.appInfo) !== null && _b !== void 0 ? _b : {}, uploadSizeLimit = _u.uploadSizeLimit, multipleFilesMessageFileCountLimit = _u.multipleFilesMessageFileCountLimit; useTheme(colorSet); var _v = useMessageTemplateUtils({ sdk: sdk, logger: logger, appInfoStore: appInfoStore, actions: actions, }), getCachedTemplate = _v.getCachedTemplate, updateMessageTemplatesInfo = _v.updateMessageTemplatesInfo, initializeMessageTemplatesInfo = _v.initializeMessageTemplatesInfo; // Reconnect when necessary React.useEffect(function () { actions.connect({ appId: appId, userId: userId, accessToken: accessToken, isUserIdUsedForNickname: isUserIdUsedForNickname, isMobile: isMobile, logger: logger, nickname: nickname, profileUrl: profileUrl, configureSession: configureSession, customApiHost: customApiHost, customWebSocketHost: customWebSocketHost, sdkInitParams: sdkInitParams, customExtensionParams: customExtensionParams, initDashboardConfigs: initDashboardConfigs, eventHandlers: eventHandlers, initializeMessageTemplatesInfo: initializeMessageTemplatesInfo, }); }, [appId, userId]); // Disconnect on unmount useMarkAsDeliveredScheduler.useUnmount(function () { actions.disconnect({ logger: logger }); }); // should move to reducer var _w = React.useState(theme), currentTheme = _w[0], setCurrentTheme = _w[1]; React.useEffect(function () { setCurrentTheme(theme); }, [theme]); React.useEffect(function () { var body = document.querySelector('body'); body === null || body === void 0 ? void 0 : body.classList.remove('sendbird-experimental__rem__units'); if (isREMUnitEnabled) { body === null || body === void 0 ? void 0 : body.classList.add('sendbird-experimental__rem__units'); } }, [isREMUnitEnabled]); // add-remove theme from body React.useEffect(function () { logger.info('Setup theme', "Theme: ".concat(currentTheme)); try { var body = document.querySelector('body'); body === null || body === void 0 ? void 0 : body.classList.remove('sendbird-theme--light'); body === null || body === void 0 ? void 0 : body.classList.remove('sendbird-theme--dark'); body === null || body === void 0 ? void 0 : body.classList.add("sendbird-theme--".concat(currentTheme || 'light')); logger.info('Finish setup theme'); // eslint-disable-next-line no-empty } catch (e) { logger.warning('Setup theme failed', "".concat(e)); } return function () { try { var body = document.querySelector('body'); body === null || body === void 0 ? void 0 : body.classList.remove('sendbird-theme--light'); body === null || body === void 0 ? void 0 : body.classList.remove('sendbird-theme--dark'); // eslint-disable-next-line no-empty } catch (_a) { } }; }, [currentTheme]); useHTMLTextDirection(htmlTextDirection); var isOnline = useMarkAsDeliveredScheduler.useOnlineStatus(sdkStore.sdk, logger); var markAsReadScheduler = useMarkAsReadScheduler({ isConnected: isOnline }, { logger: logger }); var markAsDeliveredScheduler = useMarkAsDeliveredScheduler.useMarkAsDeliveredScheduler({ isConnected: isOnline }, { logger: logger }); /** * Feature Configuration - TODO * This will be moved into the UIKitConfigProvider, aftering Dashboard applies */ var uikitMultipleFilesMessageLimit = React.useMemo(function () { return Math.min(consts.DEFAULT_MULTIPLE_FILES_MESSAGE_LIMIT, multipleFilesMessageFileCountLimit !== null && multipleFilesMessageFileCountLimit !== void 0 ? multipleFilesMessageFileCountLimit : Number.MAX_SAFE_INTEGER); }, [multipleFilesMessageFileCountLimit]); // Emoji Manager var emojiManager = React.useMemo(function () { if (sdkStore.initialized) { return new colorMapper.EmojiManager({ sdk: sdk, logger: logger, }); } return undefined; }, [sdkStore.initialized]); var uikitConfigs = React.useMemo(function () { return ({ common: { enableUsingDefaultUserProfile: configs.common.enableUsingDefaultUserProfile, }, groupChannel: { enableOgtag: sdkInitialized && configsWithAppAttr(sdk).groupChannel.channel.enableOgtag, enableTypingIndicator: configs.groupChannel.channel.enableTypingIndicator, enableReactions: sdkInitialized && configsWithAppAttr(sdk).groupChannel.channel.enableReactions, enableMention: configs.groupChannel.channel.enableMention, replyType: configs.groupChannel.channel.replyType, threadReplySelectType: configs.groupChannel.channel.threadReplySelectType, enableVoiceMessage: configs.groupChannel.channel.enableVoiceMessage, enableDocument: configs.groupChannel.channel.input.enableDocument, typingIndicatorTypes: configs.groupChannel.channel.typingIndicatorTypes, enableFeedback: configs.groupChannel.channel.enableFeedback, enableSuggestedReplies: configs.groupChannel.channel.enableSuggestedReplies, showSuggestedRepliesFor: configs.groupChannel.channel.showSuggestedRepliesFor, suggestedRepliesDirection: configs.groupChannel.channel.suggestedRepliesDirection, enableMarkdownForUserMessage: configs.groupChannel.channel.enableMarkdownForUserMessage, enableFormTypeMessage: configs.groupChannel.channel.enableFormTypeMessage, enableMarkAsUnread: configs.groupChannel.channel.enableMarkAsUnread, enableReactionsSupergroup: sdkInitialized && configsWithAppAttr(sdk).groupChannel.channel.enableReactionsSupergroup, }, groupChannelList: { enableTypingIndicator: configs.groupChannel.channelList.enableTypingIndicator, enableMessageReceiptStatus: configs.groupChannel.channelList.enableMessageReceiptStatus, }, groupChannelSettings: { enableMessageSearch: sdkInitialized && configsWithAppAttr(sdk).groupChannel.setting.enableMessageSearch, }, openChannel: { enableOgtag: sdkInitialized && configsWithAppAttr(sdk).openChannel.channel.enableOgtag, enableDocument: configs.openChannel.channel.input.enableDocument, }, }); }, [ sdkInitialized, configs.common, configs.groupChannel.channel, configs.groupChannel.channelList, configs.groupChannel.setting, configs.openChannel.channel, ]); var storeState = React.useMemo(function () { return ({ stores: { sdkStore: state.stores.sdkStore, userStore: state.stores.userStore, appInfoStore: state.stores.appInfoStore, }, }); }, [ state.stores.sdkStore, state.stores.userStore, state.stores.appInfoStore, ]); var uikitUploadSizeLimit = React.useMemo(function () { return (uploadSizeLimit !== null && uploadSizeLimit !== void 0 ? uploadSizeLimit : consts.DEFAULT_UPLOAD_SIZE_LIMIT); }, [uploadSizeLimit, consts.DEFAULT_UPLOAD_SIZE_LIMIT]); var configImageCompression = React.useMemo(function () { return (_tslib.__assign({ compressionRate: 0.7, outputFormat: 'preserve' }, imageCompression)); }, [imageCompression]); var configVoiceRecord = React.useMemo(function () { var _a, _b; return ({ maxRecordingTime: (_a = voiceRecord === null || voiceRecord === void 0 ? void 0 : voiceRecord.maxRecordingTime) !== null && _a !== void 0 ? _a : consts.VOICE_RECORDER_DEFAULT_MAX, minRecordingTime: (_b = voiceRecord === null || voiceRecord === void 0 ? void 0 : voiceRecord.minRecordingTime) !== null && _b !== void 0 ? _b : consts.VOICE_RECORDER_DEFAULT_MIN, }); }, [ voiceRecord === null || voiceRecord === void 0 ? void 0 : voiceRecord.maxRecordingTime, voiceRecord === null || voiceRecord === void 0 ? void 0 : voiceRecord.minRecordingTime, ]); var configUserMention = React.useMemo(function () { return ({ maxMentionCount: (userMention === null || userMention === void 0 ? void 0 : userMention.maxMentionCount) || 10, maxSuggestionCount: (userMention === null || userMention === void 0 ? void 0 : userMention.maxSuggestionCount) || 15, }); }, [ userMention === null || userMention === void 0 ? void 0 : userMention.maxMentionCount, userMention === null || userMention === void 0 ? void 0 : userMention.maxSuggestionCount, ]); var deprecatedConfigs = React.useMemo(function () { return ({ disableUserProfile: !configs.common.enableUsingDefaultUserProfile, isReactionEnabled: sdkInitialized && configsWithAppAttr(sdk).groupChannel.channel.enableReactions, isMentionEnabled: configs.groupChannel.channel.enableMention, isVoiceMessageEnabled: configs.groupChannel.channel.enableVoiceMessage, replyType: resolvedReplyType.getCaseResolvedReplyType(configs.groupChannel.channel.replyType).upperCase, isTypingIndicatorEnabledOnChannelList: configs.groupChannel.channelList.enableTypingIndicator, isMessageReceiptStatusEnabledOnChannelList: configs.groupChannel.channelList.enableMessageReceiptStatus, showSearchIcon: sdkInitialized && configsWithAppAttr(sdk).groupChannel.setting.enableMessageSearch, }); }, [ sdkInitialized, configsWithAppAttr, configs.common.enableUsingDefaultUserProfile, configs.groupChannel.channel.enableReactions, configs.groupChannel.channel.enableMention, configs.groupChannel.channel.enableVoiceMessage, configs.groupChannel.channel.replyType, configs.groupChannel.channelList.enableTypingIndicator, configs.groupChannel.channelList.enableMessageReceiptStatus, configs.groupChannel.setting.enableMessageSearch, ]); var configState = React.useMemo(function () { return ({ config: _tslib.__assign(_tslib.__assign({ disableMarkAsDelivered: disableMarkAsDelivered, renderUserProfile: renderUserProfile, onStartDirectMessage: onStartDirectMessage, onUserProfileMessage: onStartDirectMessage, // legacy of onStartDirectMessage allowProfileEdit: allowProfileEdit, isOnline: isOnline, userId: userId, appId: appId, accessToken: accessToken, theme: currentTheme, setCurrentTheme: setCurrentTheme, setCurrenttheme: setCurrentTheme, // deprecated: typo isMultipleFilesMessageEnabled: isMultipleFilesMessageEnabled, uikitMultipleFilesMessageLimit: uikitMultipleFilesMessageLimit, logger: logger, pubSub: pubSub, userListQuery: userListQuery, htmlTextDirection: htmlTextDirection, forceLeftToRightMessageLayout: forceLeftToRightMessageLayout, markAsReadScheduler: markAsReadScheduler, markAsDeliveredScheduler: markAsDeliveredScheduler, uikitUploadSizeLimit: uikitUploadSizeLimit, imageCompression: configImageCompression, voiceRecord: configVoiceRecord, userMention: configUserMention }, uikitConfigs), deprecatedConfigs), }); }, [ disableMarkAsDelivered, renderUserProfile, onStartDirectMessage, allowProfileEdit, isOnline, userId, appId, accessToken, currentTheme, setCurrentTheme, isMultipleFilesMessageEnabled, uikitMultipleFilesMessageLimit, logger, pubSub, userListQuery, htmlTextDirection, forceLeftToRightMessageLayout, markAsReadScheduler, markAsDeliveredScheduler, uikitUploadSizeLimit, configImageCompression, configVoiceRecord, configUserMention, uikitConfigs, deprecatedConfigs, ]); var utilsState = React.useMemo(function () { return ({ utils: { updateMessageTemplatesInfo: updateMessageTemplatesInfo, getCachedTemplate: getCachedTemplate, }, }); }, [ updateMessageTemplatesInfo, getCachedTemplate, ]); useDeepCompareEffect.useDeepCompareEffect(function () { updateState(_tslib.__assign(_tslib.__assign(_tslib.__assign(_tslib.__assign({}, storeState), utilsState), configState), { eventHandlers: eventHandlers, emojiManager: emojiManager })); }, [ storeState, configState, eventHandlers, emojiManager, utilsState, ]); return null; }; var InternalSendbirdProvider = function (props) { var _a, _b, _c, _d, _e, _f, _g, _h, _j; var children = props.children, stringSet$1 = props.stringSet, breakpoint = props.breakpoint, dateLocale = props.dateLocale; var defaultProps = utils.deleteNullish({ config: { renderUserProfile: props === null || props === void 0 ? void 0 : props.renderUserProfile, onStartDirectMessage: props === null || props === void 0 ? void 0 : props.onStartDirectMessage, allowProfileEdit: props === null || props === void 0 ? void 0 : props.allowProfileEdit, appId: props === null || props === void 0 ? void 0 : props.appId, userId: props === null || props === void 0 ? void 0 : props.userId, accessToken: props === null || props === void 0 ? void 0 : props.accessToken, theme: props === null || props === void 0 ? void 0 : props.theme, htmlTextDirection: props === null || props === void 0 ? void 0 : props.htmlTextDirection, forceLeftToRightMessageLayout: props === null || props === void 0 ? void 0 : props.forceLeftToRightMessageLayout, pubSub: (_a = props === null || props === void 0 ? void 0 : props.config) === null || _a === void 0 ? void 0 : _a.pubSub, logger: props === null || props === void 0 ? void 0 : props.logger, userListQuery: props === null || props === void 0 ? void 0 : props.userListQuery, voiceRecord: { maxRecordingTime: (_c = (_b = props === null || props === void 0 ? void 0 : props.voiceRecord) === null || _b === void 0 ? void 0 : _b.maxRecordingTime) !== null && _c !== void 0 ? _c : consts.VOICE_RECORDER_DEFAULT_MAX, minRecordingTime: (_e = (_d = props === null || props === void 0 ? void 0 : props.voiceRecord) === null || _d === void 0 ? void 0 : _d.minRecordingTime) !== null && _e !== void 0 ? _e : consts.VOICE_RECORDER_DEFAULT_MIN, }, userMention: { maxMentionCount: ((_g = (_f = props === null || props === void 0 ? void 0 : props.config) === null || _f === void 0 ? void 0 : _f.userMention) === null || _g === void 0 ? void 0 : _g.maxMentionCount) || 10, maxSuggestionCount: ((_j = (_h = props === null || props === void 0 ? void 0 : props.config) === null || _h === void 0 ? void 0 : _h.userMention) === null || _j === void 0 ? void 0 : _j.maxSuggestionCount) || 15, }, imageCompression: _tslib.__assign({ compressionRate: 0.7, outputFormat: 'preserve' }, props === null || props === void 0 ? void 0 : props.imageCompression), disableMarkAsDelivered: props === null || props === void 0 ? void 0 : props.disableMarkAsDelivered, isMultipleFilesMessageEnabled: props === null || props === void 0 ? void 0 : props.isMultipleFilesMessageEnabled, }, eventHandlers: props === null || props === void 0 ? void 0 : props.eventHandlers, }); var storeRef = React.useRef(SendbirdContext.createSendbirdContextStore(defaultProps)); var localeStringSet = React.useMemo(function () { return _tslib.__assign(_tslib.__assign({}, stringSet.getStringSet('en')), stringSet$1); }, [stringSet$1]); return (React__default.default.createElement(SendbirdContext.SendbirdContext.Provider, { value: storeRef.current }, React__default.default.createElement(MediaQueryContext.MediaQueryProvider, { logger: storeRef.current.getState().config.logger, breakpoint: breakpoint }, React__default.default.createElement(LocalizationContext.LocalizationProvider, { stringSet: localeStringSet, dateLocale: dateLocale }, React__default.default.createElement(VoiceMessageProvider, null, React__default.default.createElement(hooks_useModal.GlobalModalProvider, null, children)))), React__default.default.createElement(ui_ContextMenu.EmojiReactionListRoot, null), React__default.default.createElement(ui_Modal.ModalRoot, null), React__default.default.createElement(ui_ContextMenu.MenuRoot, null))); }; var SendbirdContextProvider = function (props) { var children = props.children, config = props.config; var logLevel = config === null || config === void 0 ? void 0 : config.logLevel; var _a = React.useState(LoggerFactory(logLevel)), logger = _a[0], setLogger = _a[1]; // to create a pubsub to communicate between parent and child React.useEffect(function () { setLogger(LoggerFactory(logLevel)); }, [logLevel]); return (React__default.default.createElement(InternalSendbirdProvider, _tslib.__assign({}, props, { logger: logger }), React__default.default.createElement(SendbirdContextManager, _tslib.__assign({}, props, { logger: logger })), children)); }; // For Exportation var SendbirdProvider = function (props) { var localConfigs = uikitConfigMapper({ legacyConfig: { replyType: props.replyType, isMentionEnabled: props.isMentionEnabled, isReactionEnabled: props.isReactionEnabled, disableUserProfile: props.disableUserProfile, isVoiceMessageEnabled: props.isVoiceMessageEnabled, isTypingIndicatorEnabledOnChannelList: props.isTypingIndicatorEnabledOnChannelList, isMessageReceiptStatusEnabledOnChannelList: props.isMessageReceiptStatusEnabledOnChannelList, showSearchIcon: props.showSearchIcon, }, uikitOptions: props.uikitOptions, }); return (React__default.default.createElement(uikitTools.UIKitConfigProvider, { storage: uikitConfigStorage.uikitConfigStorage, localConfigs: { common: localConfigs === null || localConfigs === void 0 ? void 0 : localConfigs.common, groupChannel: { channel: localConfigs === null || localConfigs === void 0 ? void 0 : localConfigs.groupChannel, channelList: localConfigs === null || localConfigs === void 0 ? void 0 : localConfigs.groupChannelList, setting: localConfigs === null || localConfigs === void 0 ? void 0 : localConfigs.groupChannelSettings, }, openChannel: { channel: localConfigs === null || localConfigs === void 0 ? void 0 : localConfigs.openChannel, }, } }, React__default.default.createElement(SendbirdContextProvider, _tslib.__assign({}, props)))); }; var withSendbirdContext = function (OriginalComponent, mapStoreToProps) { var ContextAwareComponent = function (props) { var _a = useSendbird.useSendbird(), state = _a.state, actions = _a.actions; var context = _tslib.__assign(_tslib.__assign({}, state), actions); if (!mapStoreToProps || typeof mapStoreToProps !== 'function') { // eslint-disable-next-line no-console console.warn('Second parameter to withSendbirdContext must be a pure function'); } var mergedProps = (mapStoreToProps && typeof mapStoreToProps === 'function') ? _tslib.__assign(_tslib.__assign({}, mapStoreToProps(context)), props) : _tslib.__assign(_tslib.__assign({}, context), props); return React__default.default.createElement(React__default.default.Fragment, null, React__default.default.createElement(OriginalComponent, _tslib.__assign({}, mergedProps))); }; var componentName = OriginalComponent.displayName || OriginalComponent.name || 'Component'; ContextAwareComponent.displayName = "SendbirdAware".concat(componentName); return ContextAwareComponent; }; /** * @de