stream-chat-react 9.0.0 → 9.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.full-bundle.js +744 -198
- package/dist/browser.full-bundle.js.map +1 -1
- package/dist/browser.full-bundle.min.js +4 -4
- package/dist/browser.full-bundle.min.js.map +1 -1
- package/dist/components/Channel/Channel.d.ts.map +1 -1
- package/dist/components/Channel/Channel.js +10 -4
- package/dist/components/Channel/channelState.js +1 -1
- package/dist/components/ChannelList/ChannelList.d.ts +2 -0
- package/dist/components/ChannelList/ChannelList.d.ts.map +1 -1
- package/dist/components/ChannelList/ChannelList.js +6 -4
- package/dist/components/ChannelList/ChannelListMessenger.d.ts +2 -2
- package/dist/components/ChannelList/ChannelListMessenger.d.ts.map +1 -1
- package/dist/components/ChannelList/ChannelListMessenger.js +1 -1
- package/dist/components/ChannelList/hooks/usePaginatedChannels.d.ts +0 -5
- package/dist/components/ChannelList/hooks/usePaginatedChannels.d.ts.map +1 -1
- package/dist/components/ChannelList/hooks/usePaginatedChannels.js +10 -15
- package/dist/components/Chat/Chat.d.ts.map +1 -1
- package/dist/components/Chat/Chat.js +3 -0
- package/dist/components/Chat/hooks/useChannelsQueryState.d.ts +12 -0
- package/dist/components/Chat/hooks/useChannelsQueryState.d.ts.map +1 -0
- package/dist/components/Chat/hooks/useChannelsQueryState.js +11 -0
- package/dist/components/Chat/hooks/useCreateChatContext.d.ts.map +1 -1
- package/dist/components/Chat/hooks/useCreateChatContext.js +13 -2
- package/dist/components/ChatDown/ChatDown.d.ts.map +1 -1
- package/dist/components/ChatDown/ChatDown.js +0 -2
- package/dist/components/InfiniteScrollPaginator/InfiniteScroll.d.ts.map +1 -1
- package/dist/components/InfiniteScrollPaginator/InfiniteScroll.js +1 -7
- package/dist/components/MessageInput/EditMessageForm.d.ts.map +1 -1
- package/dist/components/MessageInput/EditMessageForm.js +3 -7
- package/dist/components/MessageInput/UploadsPreview.d.ts.map +1 -1
- package/dist/components/MessageInput/UploadsPreview.js +3 -1
- package/dist/components/MessageInput/hooks/useAttachments.d.ts.map +1 -1
- package/dist/components/MessageInput/hooks/useAttachments.js +4 -4
- package/dist/components/MessageInput/hooks/useMessageInputState.d.ts +2 -2
- package/dist/components/MessageInput/hooks/useMessageInputState.d.ts.map +1 -1
- package/dist/components/MessageInput/hooks/useMessageInputState.js +24 -19
- package/dist/components/MessageInput/hooks/useSubmitHandler.d.ts.map +1 -1
- package/dist/components/MessageInput/hooks/useSubmitHandler.js +47 -19
- package/dist/components/MessageList/MessageList.d.ts.map +1 -1
- package/dist/components/MessageList/MessageList.js +13 -13
- package/dist/components/MessageList/hooks/useMessageListScrollManager.d.ts.map +1 -1
- package/dist/components/MessageList/hooks/useMessageListScrollManager.js +0 -3
- package/dist/components/MessageList/hooks/useScrollLocationLogic.d.ts +3 -1
- package/dist/components/MessageList/hooks/useScrollLocationLogic.d.ts.map +1 -1
- package/dist/components/MessageList/hooks/useScrollLocationLogic.js +42 -28
- package/dist/components/Modal/Modal.d.ts +1 -1
- package/dist/components/Modal/Modal.d.ts.map +1 -1
- package/dist/components/Modal/Modal.js +12 -15
- package/dist/context/ChannelActionContext.d.ts +2 -1
- package/dist/context/ChannelActionContext.d.ts.map +1 -1
- package/dist/context/ChatContext.d.ts +2 -0
- package/dist/context/ChatContext.d.ts.map +1 -1
- package/dist/css/index.css +1 -1
- package/dist/index.cjs.js +190 -149
- package/dist/index.cjs.js.map +1 -1
- package/dist/scss/Message.scss +1 -1
- package/dist/scss/MessageActions.scss +19 -0
- package/dist/scss/MessageList.scss +16 -7
- package/dist/scss/Modal.scss +1 -2
- package/dist/scss/Thread.scss +0 -1
- package/dist/scss/_variables.scss +2 -0
- package/dist/stories/edit-message.stories.d.ts +3 -0
- package/dist/stories/edit-message.stories.d.ts.map +1 -0
- package/dist/stories/edit-message.stories.js +54 -0
- package/dist/stories/navigate-long-message-lists.stories.d.ts.map +1 -1
- package/dist/stories/navigate-long-message-lists.stories.js +5 -3
- package/dist/types/types.d.ts +2 -1
- package/dist/types/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +7 -6
package/dist/index.cjs.js
CHANGED
|
@@ -53,6 +53,7 @@ var throttle = require('lodash.throttle');
|
|
|
53
53
|
var streamChat = require('stream-chat');
|
|
54
54
|
var deepequal = require('react-fast-compare');
|
|
55
55
|
var DefaultEmojiIndex = require('emoji-mart/dist/utils/emoji-index/nimble-emoji-index.js');
|
|
56
|
+
var resizeObserver = require('@juggle/resize-observer');
|
|
56
57
|
var reactVirtuoso = require('react-virtuoso');
|
|
57
58
|
|
|
58
59
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
@@ -1028,28 +1029,25 @@ var Modal = function (props) {
|
|
|
1028
1029
|
var innerRef = React.useRef(null);
|
|
1029
1030
|
var closeRef = React.useRef(null);
|
|
1030
1031
|
var handleClick = function (event) {
|
|
1031
|
-
var
|
|
1032
|
-
if (
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
((_b = closeRef.current) === null || _b === void 0 ? void 0 : _b.contains(event.target)) &&
|
|
1037
|
-
onClose)) {
|
|
1038
|
-
onClose();
|
|
1039
|
-
}
|
|
1032
|
+
var target = event.target;
|
|
1033
|
+
if (!innerRef.current || !closeRef.current)
|
|
1034
|
+
return;
|
|
1035
|
+
if (!innerRef.current.contains(target) || closeRef.current.contains(target))
|
|
1036
|
+
onClose === null || onClose === void 0 ? void 0 : onClose();
|
|
1040
1037
|
};
|
|
1041
1038
|
React.useEffect(function () {
|
|
1042
1039
|
if (!open)
|
|
1043
|
-
return
|
|
1040
|
+
return;
|
|
1044
1041
|
var handleEscKey = function (event) {
|
|
1045
|
-
if (event
|
|
1046
|
-
onClose();
|
|
1047
|
-
}
|
|
1042
|
+
if (event.key === 'Escape')
|
|
1043
|
+
onClose === null || onClose === void 0 ? void 0 : onClose();
|
|
1048
1044
|
};
|
|
1049
|
-
document.addEventListener('
|
|
1050
|
-
return function () { return document.removeEventListener('
|
|
1045
|
+
document.addEventListener('keydown', handleEscKey);
|
|
1046
|
+
return function () { return document.removeEventListener('keydown', handleEscKey); };
|
|
1051
1047
|
}, [onClose, open]);
|
|
1052
1048
|
var openClasses = open ? 'str-chat__modal--open' : 'str-chat__modal--closed';
|
|
1049
|
+
if (!open)
|
|
1050
|
+
return null;
|
|
1053
1051
|
return (React__default['default'].createElement("div", { className: "str-chat__modal " + openClasses, onClick: handleClick },
|
|
1054
1052
|
React__default['default'].createElement("button", { className: 'str-chat__modal__close-button', ref: closeRef, title: 'Close' },
|
|
1055
1053
|
t('Close'),
|
|
@@ -2569,7 +2567,7 @@ var channelReducer = function (state, action) {
|
|
|
2569
2567
|
}
|
|
2570
2568
|
case 'setLoadingMore': {
|
|
2571
2569
|
var loadingMore = action.loadingMore;
|
|
2572
|
-
//
|
|
2570
|
+
// suppress the autoscroll behavior
|
|
2573
2571
|
return __assign(__assign({}, state), { loadingMore: loadingMore, suppressAutoscroll: true });
|
|
2574
2572
|
}
|
|
2575
2573
|
case 'setLoadingMoreNewer': {
|
|
@@ -4702,7 +4700,9 @@ var UploadsPreview = function () {
|
|
|
4702
4700
|
var _a = useChannelStateContext('UploadsPreview'), maxNumberOfFiles = _a.maxNumberOfFiles, multipleUploads = _a.multipleUploads;
|
|
4703
4701
|
var messageInput = useMessageInputContext('UploadsPreview');
|
|
4704
4702
|
var fileOrder = messageInput.fileOrder, fileUploads = messageInput.fileUploads, imageOrder = messageInput.imageOrder, imageUploads = messageInput.imageUploads, numberOfUploads = messageInput.numberOfUploads, removeFile = messageInput.removeFile, removeImage = messageInput.removeImage, uploadFile = messageInput.uploadFile, uploadImage = messageInput.uploadImage, uploadNewFiles = messageInput.uploadNewFiles;
|
|
4705
|
-
var imagesToPreview = imageOrder
|
|
4703
|
+
var imagesToPreview = imageOrder
|
|
4704
|
+
.map(function (id) { return imageUploads[id]; })
|
|
4705
|
+
.filter(function (image) { return !image.og_scrape_url; });
|
|
4706
4706
|
var filesToPreview = fileOrder.map(function (id) { return fileUploads[id]; });
|
|
4707
4707
|
return (React__default['default'].createElement(React__default['default'].Fragment, null,
|
|
4708
4708
|
imageOrder.length > 0 && (React__default['default'].createElement(reactFileUtils.ImagePreviewer, { disabled: !multipleUploads ||
|
|
@@ -4747,8 +4747,8 @@ var EditMessageForm = function () {
|
|
|
4747
4747
|
var _c = useComponentContext('EditMessageForm'), _d = _c.EmojiIcon, EmojiIcon = _d === void 0 ? EmojiIconSmall : _d, _e = _c.FileUploadIcon, FileUploadIcon$1 = _e === void 0 ? FileUploadIcon : _e;
|
|
4748
4748
|
React.useEffect(function () {
|
|
4749
4749
|
var onKeyDown = function (event) {
|
|
4750
|
-
if (event.key === 'Escape'
|
|
4751
|
-
clearEditingState();
|
|
4750
|
+
if (event.key === 'Escape')
|
|
4751
|
+
clearEditingState === null || clearEditingState === void 0 ? void 0 : clearEditingState();
|
|
4752
4752
|
};
|
|
4753
4753
|
document.addEventListener('keydown', onKeyDown);
|
|
4754
4754
|
return function () { return document.removeEventListener('keydown', onKeyDown); };
|
|
@@ -4771,11 +4771,7 @@ var EditMessageForm = function () {
|
|
|
4771
4771
|
React__default['default'].createElement("span", { className: 'str-chat__input-fileupload' },
|
|
4772
4772
|
React__default['default'].createElement(FileUploadIcon$1, null)))))),
|
|
4773
4773
|
React__default['default'].createElement("div", null,
|
|
4774
|
-
React__default['default'].createElement("button", { onClick:
|
|
4775
|
-
if (clearEditingState) {
|
|
4776
|
-
clearEditingState();
|
|
4777
|
-
}
|
|
4778
|
-
} }, t('Cancel')),
|
|
4774
|
+
React__default['default'].createElement("button", { onClick: clearEditingState }, t('Cancel')),
|
|
4779
4775
|
React__default['default'].createElement("button", { type: 'submit' }, t('Send'))))))));
|
|
4780
4776
|
};
|
|
4781
4777
|
|
|
@@ -5048,11 +5044,11 @@ var useAttachments = function (props, state, dispatch, textareaRef) {
|
|
|
5048
5044
|
// Number of files that the user can still add. Should never be more than the amount allowed by the API.
|
|
5049
5045
|
// If multipleUploads is false, we only want to allow a single upload.
|
|
5050
5046
|
var maxFilesAllowed = !multipleUploads ? 1 : maxNumberOfFiles || apiMaxNumberOfFiles;
|
|
5047
|
+
// OG attachments should not be counted towards "numberOfImages"
|
|
5051
5048
|
var numberOfImages = Object.values(imageUploads).filter(function (_a) {
|
|
5052
|
-
var state = _a.state;
|
|
5053
|
-
return state !== 'failed';
|
|
5054
|
-
})
|
|
5055
|
-
.length;
|
|
5049
|
+
var og_scrape_url = _a.og_scrape_url, state = _a.state;
|
|
5050
|
+
return state !== 'failed' && !og_scrape_url;
|
|
5051
|
+
}).length;
|
|
5056
5052
|
var numberOfFiles = Object.values(fileUploads).filter(function (_a) {
|
|
5057
5053
|
var state = _a.state;
|
|
5058
5054
|
return state !== 'failed';
|
|
@@ -5238,6 +5234,14 @@ var useSubmitHandler = function (props, state, dispatch, numberOfUploads) {
|
|
|
5238
5234
|
var channel = useChannelStateContext('useSubmitHandler').channel;
|
|
5239
5235
|
var _a = useChannelActionContext('useSubmitHandler'), addNotification = _a.addNotification, editMessage = _a.editMessage, sendMessage = _a.sendMessage;
|
|
5240
5236
|
var t = useTranslationContext('useSubmitHandler').t;
|
|
5237
|
+
var textReference = React.useRef({ hasChanged: false, initialText: text });
|
|
5238
|
+
React.useEffect(function () {
|
|
5239
|
+
if (!textReference.current.initialText.length) {
|
|
5240
|
+
textReference.current.initialText = text;
|
|
5241
|
+
return;
|
|
5242
|
+
}
|
|
5243
|
+
textReference.current.hasChanged = text !== textReference.current.initialText;
|
|
5244
|
+
}, [text]);
|
|
5241
5245
|
var getAttachmentsFromUploads = function () {
|
|
5242
5246
|
var imageAttachments = imageOrder
|
|
5243
5247
|
.map(function (id) { return imageUploads[id]; })
|
|
@@ -5246,25 +5250,36 @@ var useSubmitHandler = function (props, state, dispatch, numberOfUploads) {
|
|
|
5246
5250
|
var id = _a.id, url = _a.url;
|
|
5247
5251
|
return self.every(function (upload) { return upload.id === id || upload.url !== url; });
|
|
5248
5252
|
})
|
|
5249
|
-
.
|
|
5253
|
+
.filter(function (upload) {
|
|
5254
|
+
// keep the OG attachments in case the text has not changed as the BE
|
|
5255
|
+
// won't re-enrich the message when only attachments have changed
|
|
5256
|
+
if (!textReference.current.hasChanged)
|
|
5257
|
+
return true;
|
|
5258
|
+
return !upload.og_scrape_url;
|
|
5259
|
+
})
|
|
5260
|
+
.map(function (_a) {
|
|
5261
|
+
var name = _a.file.name, url = _a.url, rest = __rest(_a, ["file", "url"]);
|
|
5250
5262
|
return ({
|
|
5251
|
-
|
|
5252
|
-
|
|
5263
|
+
author_name: rest.author_name,
|
|
5264
|
+
fallback: name,
|
|
5265
|
+
image_url: url,
|
|
5266
|
+
og_scrape_url: rest.og_scrape_url,
|
|
5267
|
+
text: rest.text,
|
|
5268
|
+
title: rest.title,
|
|
5269
|
+
title_link: rest.title_link,
|
|
5253
5270
|
type: 'image',
|
|
5254
5271
|
});
|
|
5255
5272
|
});
|
|
5256
5273
|
var fileAttachments = fileOrder
|
|
5257
5274
|
.map(function (id) { return fileUploads[id]; })
|
|
5258
5275
|
.filter(function (upload) { return upload.state !== 'failed'; })
|
|
5259
|
-
.map(function (upload) {
|
|
5260
|
-
|
|
5261
|
-
|
|
5262
|
-
|
|
5263
|
-
|
|
5264
|
-
|
|
5265
|
-
|
|
5266
|
-
});
|
|
5267
|
-
});
|
|
5276
|
+
.map(function (upload) { return ({
|
|
5277
|
+
asset_url: upload.url,
|
|
5278
|
+
file_size: upload.file.size,
|
|
5279
|
+
mime_type: upload.file.type,
|
|
5280
|
+
title: upload.file.name,
|
|
5281
|
+
type: getAttachmentTypeFromMime(upload.file.type || ''),
|
|
5282
|
+
}); });
|
|
5268
5283
|
return __spreadArray(__spreadArray(__spreadArray([], attachments), imageAttachments), fileAttachments);
|
|
5269
5284
|
};
|
|
5270
5285
|
var handleSubmit = function (event, customMessageData) { return __awaiter(void 0, void 0, void 0, function () {
|
|
@@ -5307,8 +5322,7 @@ var useSubmitHandler = function (props, state, dispatch, numberOfUploads) {
|
|
|
5307
5322
|
return [4 /*yield*/, editMessage(__assign(__assign({}, message), updatedMessage))];
|
|
5308
5323
|
case 2:
|
|
5309
5324
|
_a.sent();
|
|
5310
|
-
|
|
5311
|
-
clearEditingState();
|
|
5325
|
+
clearEditingState === null || clearEditingState === void 0 ? void 0 : clearEditingState();
|
|
5312
5326
|
dispatch({ type: 'clear' });
|
|
5313
5327
|
return [3 /*break*/, 4];
|
|
5314
5328
|
case 3:
|
|
@@ -5341,11 +5355,9 @@ var useSubmitHandler = function (props, state, dispatch, numberOfUploads) {
|
|
|
5341
5355
|
getNewText: function () { return text; },
|
|
5342
5356
|
type: 'setText',
|
|
5343
5357
|
});
|
|
5344
|
-
|
|
5345
|
-
|
|
5346
|
-
|
|
5347
|
-
});
|
|
5348
|
-
}
|
|
5358
|
+
actualMentionedUsers === null || actualMentionedUsers === void 0 ? void 0 : actualMentionedUsers.forEach(function (user) {
|
|
5359
|
+
dispatch({ type: 'addMentionedUser', user: user });
|
|
5360
|
+
});
|
|
5349
5361
|
addNotification(t('Send message request failed'), 'error');
|
|
5350
5362
|
return [3 /*break*/, 13];
|
|
5351
5363
|
case 13: return [2 /*return*/];
|
|
@@ -5406,15 +5418,13 @@ var usePasteHandler = function (uploadNewFiles, insertText, isUploadEnabled) {
|
|
|
5406
5418
|
return { onPaste: onPaste };
|
|
5407
5419
|
};
|
|
5408
5420
|
|
|
5409
|
-
var emptyFileUploads = {};
|
|
5410
|
-
var emptyImageUploads = {};
|
|
5411
5421
|
var makeEmptyMessageInputState = function () { return ({
|
|
5412
5422
|
attachments: [],
|
|
5413
5423
|
emojiPickerIsOpen: false,
|
|
5414
5424
|
fileOrder: [],
|
|
5415
|
-
fileUploads:
|
|
5425
|
+
fileUploads: {},
|
|
5416
5426
|
imageOrder: [],
|
|
5417
|
-
imageUploads:
|
|
5427
|
+
imageUploads: {},
|
|
5418
5428
|
mentioned_users: [],
|
|
5419
5429
|
setText: function () { return null; },
|
|
5420
5430
|
text: '',
|
|
@@ -5423,46 +5433,53 @@ var makeEmptyMessageInputState = function () { return ({
|
|
|
5423
5433
|
* Initializes the state. Empty if the message prop is falsy.
|
|
5424
5434
|
*/
|
|
5425
5435
|
var initState = function (message) {
|
|
5426
|
-
var _a, _b, _c;
|
|
5436
|
+
var _a, _b, _c, _d, _e;
|
|
5427
5437
|
if (!message) {
|
|
5428
5438
|
return makeEmptyMessageInputState();
|
|
5429
5439
|
}
|
|
5430
5440
|
// if message prop is defined, get image uploads, file uploads, text, etc.
|
|
5431
|
-
var imageUploads = ((_a = message.attachments) === null || _a === void 0 ? void 0 : _a.filter(function (_a) {
|
|
5441
|
+
var imageUploads = (_b = (_a = message.attachments) === null || _a === void 0 ? void 0 : _a.filter(function (_a) {
|
|
5432
5442
|
var type = _a.type;
|
|
5433
5443
|
return type === 'image';
|
|
5434
|
-
}).reduce(function (acc,
|
|
5444
|
+
}).reduce(function (acc, _a) {
|
|
5445
|
+
var author_name = _a.author_name, _b = _a.fallback, fallback = _b === void 0 ? '' : _b, image_url = _a.image_url, og_scrape_url = _a.og_scrape_url, text = _a.text, title = _a.title, title_link = _a.title_link;
|
|
5435
5446
|
var id = nanoid.nanoid();
|
|
5436
5447
|
acc[id] = {
|
|
5448
|
+
author_name: author_name,
|
|
5437
5449
|
file: {
|
|
5438
|
-
name:
|
|
5450
|
+
name: fallback,
|
|
5439
5451
|
},
|
|
5440
5452
|
id: id,
|
|
5453
|
+
og_scrape_url: og_scrape_url,
|
|
5441
5454
|
state: 'finished',
|
|
5442
|
-
|
|
5455
|
+
text: text,
|
|
5456
|
+
title: title,
|
|
5457
|
+
title_link: title_link,
|
|
5458
|
+
url: image_url,
|
|
5443
5459
|
};
|
|
5444
5460
|
return acc;
|
|
5445
|
-
}, {}))
|
|
5446
|
-
var
|
|
5447
|
-
var fileUploads = ((_b = message.attachments) === null || _b === void 0 ? void 0 : _b.filter(function (_a) {
|
|
5461
|
+
}, {})) !== null && _b !== void 0 ? _b : {};
|
|
5462
|
+
var fileUploads = (_d = (_c = message.attachments) === null || _c === void 0 ? void 0 : _c.filter(function (_a) {
|
|
5448
5463
|
var type = _a.type;
|
|
5449
5464
|
return type === 'file';
|
|
5450
|
-
}).reduce(function (acc,
|
|
5465
|
+
}).reduce(function (acc, _a) {
|
|
5466
|
+
var asset_url = _a.asset_url, file_size = _a.file_size, mime_type = _a.mime_type, _b = _a.title, title = _b === void 0 ? '' : _b;
|
|
5451
5467
|
var id = nanoid.nanoid();
|
|
5452
5468
|
acc[id] = {
|
|
5453
5469
|
file: {
|
|
5454
|
-
name:
|
|
5455
|
-
size:
|
|
5456
|
-
type:
|
|
5470
|
+
name: title,
|
|
5471
|
+
size: file_size,
|
|
5472
|
+
type: mime_type,
|
|
5457
5473
|
},
|
|
5458
5474
|
id: id,
|
|
5459
5475
|
state: 'finished',
|
|
5460
|
-
url:
|
|
5476
|
+
url: asset_url,
|
|
5461
5477
|
};
|
|
5462
5478
|
return acc;
|
|
5463
|
-
}, {}))
|
|
5479
|
+
}, {})) !== null && _d !== void 0 ? _d : {};
|
|
5480
|
+
var imageOrder = Object.keys(imageUploads);
|
|
5464
5481
|
var fileOrder = Object.keys(fileUploads);
|
|
5465
|
-
var attachments = ((
|
|
5482
|
+
var attachments = ((_e = message.attachments) === null || _e === void 0 ? void 0 : _e.filter(function (_a) {
|
|
5466
5483
|
var type = _a.type;
|
|
5467
5484
|
return type !== 'file' && type !== 'image';
|
|
5468
5485
|
})) || [];
|
|
@@ -6151,9 +6168,15 @@ var makeAddNotifications = function (setNotifications, notificationTimeouts) { r
|
|
|
6151
6168
|
|
|
6152
6169
|
var JUMP_MESSAGE_PAGE_SIZE = 25;
|
|
6153
6170
|
var UnMemoizedChannel = function (props) {
|
|
6154
|
-
var propsChannel = props.channel, _a = props.EmptyPlaceholder, EmptyPlaceholder = _a === void 0 ? null : _a;
|
|
6155
|
-
var
|
|
6171
|
+
var propsChannel = props.channel, _a = props.EmptyPlaceholder, EmptyPlaceholder = _a === void 0 ? null : _a, LoadingErrorIndicator = props.LoadingErrorIndicator, LoadingIndicator = props.LoadingIndicator;
|
|
6172
|
+
var _b = useChatContext('Channel'), contextChannel = _b.channel, channelsQueryState = _b.channelsQueryState;
|
|
6156
6173
|
var channel = propsChannel || contextChannel;
|
|
6174
|
+
if (channelsQueryState.queryInProgress === 'reload' && LoadingIndicator) {
|
|
6175
|
+
return React__default['default'].createElement(LoadingIndicator, { size: 25 });
|
|
6176
|
+
}
|
|
6177
|
+
if (channelsQueryState.error && LoadingErrorIndicator) {
|
|
6178
|
+
return React__default['default'].createElement(LoadingErrorIndicator, { error: channelsQueryState.error });
|
|
6179
|
+
}
|
|
6157
6180
|
if (!(channel === null || channel === void 0 ? void 0 : channel.cid))
|
|
6158
6181
|
return EmptyPlaceholder;
|
|
6159
6182
|
return React__default['default'].createElement(ChannelInner, __assign({}, props, { channel: channel, key: channel.cid }));
|
|
@@ -6167,7 +6190,7 @@ var ChannelInner = function (props) {
|
|
|
6167
6190
|
var _k = React.useState([]), notifications = _k[0], setNotifications = _k[1];
|
|
6168
6191
|
var _l = React.useState(), quotedMessage = _l[0], setQuotedMessage = _l[1];
|
|
6169
6192
|
var notificationTimeouts = [];
|
|
6170
|
-
var _m = React.useReducer(channelReducer, initialState), state = _m[0], dispatch = _m[1];
|
|
6193
|
+
var _m = React.useReducer(channelReducer, __assign(__assign({}, initialState), { loading: !channel.initialized })), state = _m[0], dispatch = _m[1];
|
|
6171
6194
|
var isMounted = useIsMounted();
|
|
6172
6195
|
var originalTitle = React.useRef('');
|
|
6173
6196
|
var lastRead = React.useRef(new Date());
|
|
@@ -6501,7 +6524,7 @@ var ChannelInner = function (props) {
|
|
|
6501
6524
|
error_1 = _b.sent();
|
|
6502
6525
|
stringError = JSON.stringify(error_1);
|
|
6503
6526
|
parsedError = stringError ? JSON.parse(stringError) : {};
|
|
6504
|
-
updateMessage(__assign(__assign({}, message), { errorStatusCode: parsedError.status || undefined, status: 'failed' }));
|
|
6527
|
+
updateMessage(__assign(__assign({}, message), { error: parsedError, errorStatusCode: parsedError.status || undefined, status: 'failed' }));
|
|
6505
6528
|
return [3 /*break*/, 7];
|
|
6506
6529
|
case 7: return [2 /*return*/];
|
|
6507
6530
|
}
|
|
@@ -6770,7 +6793,6 @@ var UnMemoizedChatDown = function (_a) {
|
|
|
6770
6793
|
var _b = _a.image, image = _b === void 0 ? React__default['default'].createElement(ConnectionErrorIcon, null) : _b, text = _a.text, _c = _a.type, type = _c === void 0 ? 'Error' : _c;
|
|
6771
6794
|
var t = useTranslationContext('ChatDown').t;
|
|
6772
6795
|
return (React__default['default'].createElement("div", { className: 'str-chat__down' },
|
|
6773
|
-
React__default['default'].createElement(LoadingChannels, null),
|
|
6774
6796
|
React__default['default'].createElement("div", { className: 'str-chat__down-main' },
|
|
6775
6797
|
typeof image === 'string' ? (React__default['default'].createElement("img", { alt: 'Connection error', "data-testid": 'chatdown-img', src: image })) : (image),
|
|
6776
6798
|
React__default['default'].createElement("h1", null, type),
|
|
@@ -6785,7 +6807,7 @@ var ChatDown = React__default['default'].memo(UnMemoizedChatDown);
|
|
|
6785
6807
|
* A preview list of channels, allowing you to select the channel you want to open
|
|
6786
6808
|
*/
|
|
6787
6809
|
var ChannelListMessenger = function (props) {
|
|
6788
|
-
var children = props.children, _a = props.error, error = _a === void 0 ?
|
|
6810
|
+
var children = props.children, _a = props.error, error = _a === void 0 ? null : _a, loading = props.loading, _b = props.LoadingErrorIndicator, LoadingErrorIndicator = _b === void 0 ? ChatDown : _b, _c = props.LoadingIndicator, LoadingIndicator = _c === void 0 ? LoadingChannels : _c;
|
|
6789
6811
|
if (error) {
|
|
6790
6812
|
return React__default['default'].createElement(LoadingErrorIndicator, { type: 'Connection Error' });
|
|
6791
6813
|
}
|
|
@@ -7084,11 +7106,9 @@ var useNotificationRemovedFromChannelListener = function (setChannels, customHan
|
|
|
7084
7106
|
};
|
|
7085
7107
|
|
|
7086
7108
|
var usePaginatedChannels = function (client, filters, sort, options, activeChannelHandler) {
|
|
7087
|
-
var _a =
|
|
7088
|
-
var _b = React.useState(
|
|
7109
|
+
var _a = useChatContext('usePaginatedChannels').channelsQueryState, setError = _a.setError, setQueryInProgress = _a.setQueryInProgress;
|
|
7110
|
+
var _b = React.useState([]), channels = _b[0], setChannels = _b[1];
|
|
7089
7111
|
var _c = React.useState(true), hasNextPage = _c[0], setHasNextPage = _c[1];
|
|
7090
|
-
var _d = React.useState(true), loadingChannels = _d[0], setLoadingChannels = _d[1];
|
|
7091
|
-
var _e = React.useState(true), refreshing = _e[0], setRefreshing = _e[1];
|
|
7092
7112
|
var filterString = React.useMemo(function () { return JSON.stringify(filters); }, [filters]);
|
|
7093
7113
|
var sortString = React.useMemo(function () { return JSON.stringify(sort); }, [sort]);
|
|
7094
7114
|
var queryChannels = function (queryType) { return __awaiter(void 0, void 0, void 0, function () {
|
|
@@ -7097,12 +7117,14 @@ var usePaginatedChannels = function (client, filters, sort, options, activeChann
|
|
|
7097
7117
|
return __generator(this, function (_b) {
|
|
7098
7118
|
switch (_b.label) {
|
|
7099
7119
|
case 0:
|
|
7100
|
-
setError(
|
|
7120
|
+
setError(null);
|
|
7101
7121
|
if (queryType === 'reload') {
|
|
7102
7122
|
setChannels([]);
|
|
7103
|
-
|
|
7123
|
+
setQueryInProgress('reload');
|
|
7124
|
+
}
|
|
7125
|
+
else {
|
|
7126
|
+
setQueryInProgress('load-more');
|
|
7104
7127
|
}
|
|
7105
|
-
setRefreshing(true);
|
|
7106
7128
|
offset = queryType === 'reload' ? 0 : channels.length;
|
|
7107
7129
|
newOptions = __assign({ limit: (_a = options === null || options === void 0 ? void 0 : options.limit) !== null && _a !== void 0 ? _a : MAX_QUERY_CHANNELS_LIMIT, offset: offset }, options);
|
|
7108
7130
|
_b.label = 1;
|
|
@@ -7122,11 +7144,10 @@ var usePaginatedChannels = function (client, filters, sort, options, activeChann
|
|
|
7122
7144
|
case 3:
|
|
7123
7145
|
err_1 = _b.sent();
|
|
7124
7146
|
console.warn(err_1);
|
|
7125
|
-
setError(
|
|
7147
|
+
setError(err_1);
|
|
7126
7148
|
return [3 /*break*/, 4];
|
|
7127
7149
|
case 4:
|
|
7128
|
-
|
|
7129
|
-
setRefreshing(false);
|
|
7150
|
+
setQueryInProgress(null);
|
|
7130
7151
|
return [2 /*return*/];
|
|
7131
7152
|
}
|
|
7132
7153
|
});
|
|
@@ -7142,11 +7163,6 @@ var usePaginatedChannels = function (client, filters, sort, options, activeChann
|
|
|
7142
7163
|
hasNextPage: hasNextPage,
|
|
7143
7164
|
loadNextPage: loadNextPage,
|
|
7144
7165
|
setChannels: setChannels,
|
|
7145
|
-
status: {
|
|
7146
|
-
error: error,
|
|
7147
|
-
loadingChannels: loadingChannels,
|
|
7148
|
-
refreshing: refreshing,
|
|
7149
|
-
},
|
|
7150
7166
|
};
|
|
7151
7167
|
};
|
|
7152
7168
|
|
|
@@ -7553,8 +7569,8 @@ var DEFAULT_FILTERS = {};
|
|
|
7553
7569
|
var DEFAULT_OPTIONS = {};
|
|
7554
7570
|
var DEFAULT_SORT = {};
|
|
7555
7571
|
var UnMemoizedChannelList = function (props) {
|
|
7556
|
-
var additionalChannelSearchProps = props.additionalChannelSearchProps, _a = props.Avatar, Avatar$1 = _a === void 0 ? Avatar : _a, allowNewMessagesFromUnfilteredChannels = props.allowNewMessagesFromUnfilteredChannels, channelRenderFilterFn = props.channelRenderFilterFn, _b = props.ChannelSearch, ChannelSearch$1 = _b === void 0 ? ChannelSearch : _b, customActiveChannel = props.customActiveChannel, _c = props.EmptyStateIndicator, EmptyStateIndicator$1 = _c === void 0 ? EmptyStateIndicator : _c, filters = props.filters, _d = props.LoadingErrorIndicator, LoadingErrorIndicator = _d === void 0 ? ChatDown : _d, _e = props.LoadingIndicator, LoadingIndicator = _e === void 0 ? LoadingChannels : _e, _f = props.List, List = _f === void 0 ? ChannelListMessenger : _f, lockChannelOrder = props.lockChannelOrder, onAddedToChannel = props.onAddedToChannel, onChannelDeleted = props.onChannelDeleted, onChannelHidden = props.onChannelHidden, onChannelTruncated = props.onChannelTruncated, onChannelUpdated = props.onChannelUpdated, onChannelVisible = props.onChannelVisible, onMessageNew = props.onMessageNew, onRemovedFromChannel = props.onRemovedFromChannel, options = props.options, _g = props.Paginator, Paginator = _g === void 0 ? LoadMorePaginator : _g, Preview = props.Preview, _h = props.sendChannelsToList, sendChannelsToList = _h === void 0 ? false : _h, _j = props.setActiveChannelOnMount, setActiveChannelOnMount = _j === void 0 ? true : _j, _k = props.showChannelSearch, showChannelSearch = _k === void 0 ? false : _k, _l = props.sort, sort = _l === void 0 ? DEFAULT_SORT : _l, _m = props.watchers, watchers = _m === void 0 ? {} : _m;
|
|
7557
|
-
var _o = useChatContext('ChannelList'), channel = _o.channel, client = _o.client, closeMobileNav = _o.closeMobileNav, customClasses = _o.customClasses, _p = _o.navOpen, navOpen = _p === void 0 ? false : _p, setActiveChannel = _o.setActiveChannel, theme = _o.theme, useImageFlagEmojisOnWindows = _o.useImageFlagEmojisOnWindows;
|
|
7572
|
+
var additionalChannelSearchProps = props.additionalChannelSearchProps, _a = props.Avatar, Avatar$1 = _a === void 0 ? Avatar : _a, allowNewMessagesFromUnfilteredChannels = props.allowNewMessagesFromUnfilteredChannels, channelRenderFilterFn = props.channelRenderFilterFn, _b = props.ChannelSearch, ChannelSearch$1 = _b === void 0 ? ChannelSearch : _b, customActiveChannel = props.customActiveChannel, _c = props.EmptyStateIndicator, EmptyStateIndicator$1 = _c === void 0 ? EmptyStateIndicator : _c, filters = props.filters, _d = props.LoadingErrorIndicator, LoadingErrorIndicator = _d === void 0 ? ChatDown : _d, _e = props.LoadingIndicator, LoadingIndicator = _e === void 0 ? LoadingChannels : _e, _f = props.List, List = _f === void 0 ? ChannelListMessenger : _f, lockChannelOrder = props.lockChannelOrder, onAddedToChannel = props.onAddedToChannel, onChannelDeleted = props.onChannelDeleted, onChannelHidden = props.onChannelHidden, onChannelTruncated = props.onChannelTruncated, onChannelUpdated = props.onChannelUpdated, onChannelVisible = props.onChannelVisible, onMessageNew = props.onMessageNew, onRemovedFromChannel = props.onRemovedFromChannel, options = props.options, _g = props.Paginator, Paginator = _g === void 0 ? LoadMorePaginator : _g, Preview = props.Preview, renderChannels = props.renderChannels, _h = props.sendChannelsToList, sendChannelsToList = _h === void 0 ? false : _h, _j = props.setActiveChannelOnMount, setActiveChannelOnMount = _j === void 0 ? true : _j, _k = props.showChannelSearch, showChannelSearch = _k === void 0 ? false : _k, _l = props.sort, sort = _l === void 0 ? DEFAULT_SORT : _l, _m = props.watchers, watchers = _m === void 0 ? {} : _m;
|
|
7573
|
+
var _o = useChatContext('ChannelList'), channel = _o.channel, channelsQueryState = _o.channelsQueryState, client = _o.client, closeMobileNav = _o.closeMobileNav, customClasses = _o.customClasses, _p = _o.navOpen, navOpen = _p === void 0 ? false : _p, setActiveChannel = _o.setActiveChannel, theme = _o.theme, useImageFlagEmojisOnWindows = _o.useImageFlagEmojisOnWindows;
|
|
7558
7574
|
var channelListRef = React.useRef(null);
|
|
7559
7575
|
var _q = React.useState(0), channelUpdateCount = _q[0], setChannelUpdateCount = _q[1];
|
|
7560
7576
|
/**
|
|
@@ -7601,7 +7617,7 @@ var UnMemoizedChannelList = function (props) {
|
|
|
7601
7617
|
* force a re-render. Incrementing this dummy variable ensures the channel previews update.
|
|
7602
7618
|
*/
|
|
7603
7619
|
var forceUpdate = function () { return setChannelUpdateCount(function (count) { return count + 1; }); };
|
|
7604
|
-
var _r = usePaginatedChannels(client, filters || DEFAULT_FILTERS, sort || DEFAULT_SORT, options || DEFAULT_OPTIONS, activeChannelHandler), channels = _r.channels, hasNextPage = _r.hasNextPage, loadNextPage = _r.loadNextPage, setChannels = _r.setChannels
|
|
7620
|
+
var _r = usePaginatedChannels(client, filters || DEFAULT_FILTERS, sort || DEFAULT_SORT, options || DEFAULT_OPTIONS, activeChannelHandler), channels = _r.channels, hasNextPage = _r.hasNextPage, loadNextPage = _r.loadNextPage, setChannels = _r.setChannels;
|
|
7605
7621
|
var loadedChannels = channelRenderFilterFn ? channelRenderFilterFn(channels) : channels;
|
|
7606
7622
|
useMobileNavigation(channelListRef, navOpen, closeMobileNav);
|
|
7607
7623
|
useMessageNewListener(setChannels, lockChannelOrder, allowNewMessagesFromUnfilteredChannels);
|
|
@@ -7651,14 +7667,16 @@ var UnMemoizedChannelList = function (props) {
|
|
|
7651
7667
|
return (React__default['default'].createElement(React__default['default'].Fragment, null,
|
|
7652
7668
|
React__default['default'].createElement("div", { className: chatClass + " " + channelListClass + " " + theme + " " + navigationClass + " " + windowsEmojiClass, ref: channelListRef },
|
|
7653
7669
|
showChannelSearch && React__default['default'].createElement(ChannelSearch$1, __assign({}, additionalChannelSearchProps)),
|
|
7654
|
-
React__default['default'].createElement(List, { error:
|
|
7670
|
+
React__default['default'].createElement(List, { error: channelsQueryState.error, loadedChannels: sendChannelsToList ? loadedChannels : undefined, loading: channelsQueryState.queryInProgress === 'reload', LoadingErrorIndicator: LoadingErrorIndicator, LoadingIndicator: LoadingIndicator, setChannels: setChannels }, !(loadedChannels === null || loadedChannels === void 0 ? void 0 : loadedChannels.length) ? (React__default['default'].createElement(EmptyStateIndicator$1, { listType: 'channel' })) : (React__default['default'].createElement(Paginator, { hasNextPage: hasNextPage, loadNextPage: loadNextPage, refreshing: channelsQueryState.queryInProgress === 'load-more' }, renderChannels
|
|
7671
|
+
? renderChannels(loadedChannels, renderChannel)
|
|
7672
|
+
: loadedChannels.map(renderChannel)))))));
|
|
7655
7673
|
};
|
|
7656
7674
|
/**
|
|
7657
7675
|
* Renders a preview list of Channels, allowing you to select the Channel you want to open
|
|
7658
7676
|
*/
|
|
7659
7677
|
var ChannelList = React__default['default'].memo(UnMemoizedChannelList);
|
|
7660
7678
|
|
|
7661
|
-
var version = '9.
|
|
7679
|
+
var version = '9.1.1';
|
|
7662
7680
|
|
|
7663
7681
|
var useChat = function (_a) {
|
|
7664
7682
|
var _b, _c;
|
|
@@ -7755,12 +7773,15 @@ var useChat = function (_a) {
|
|
|
7755
7773
|
|
|
7756
7774
|
var useCreateChatContext = function (value) {
|
|
7757
7775
|
var _a;
|
|
7758
|
-
var channel = value.channel, client = value.client, closeMobileNav = value.closeMobileNav, customClasses = value.customClasses, getAppSettings = value.getAppSettings, latestMessageDatesByChannels = value.latestMessageDatesByChannels, mutes = value.mutes, navOpen = value.navOpen, openMobileNav = value.openMobileNav, setActiveChannel = value.setActiveChannel, theme = value.theme, useImageFlagEmojisOnWindows = value.useImageFlagEmojisOnWindows;
|
|
7776
|
+
var channel = value.channel, channelsQueryState = value.channelsQueryState, client = value.client, closeMobileNav = value.closeMobileNav, customClasses = value.customClasses, getAppSettings = value.getAppSettings, latestMessageDatesByChannels = value.latestMessageDatesByChannels, mutes = value.mutes, navOpen = value.navOpen, openMobileNav = value.openMobileNav, setActiveChannel = value.setActiveChannel, theme = value.theme, useImageFlagEmojisOnWindows = value.useImageFlagEmojisOnWindows;
|
|
7759
7777
|
var channelCid = channel === null || channel === void 0 ? void 0 : channel.cid;
|
|
7778
|
+
var channelsQueryError = channelsQueryState.error;
|
|
7779
|
+
var channelsQueryInProgress = channelsQueryState.queryInProgress;
|
|
7760
7780
|
var clientValues = "" + client.clientID + Object.keys(client.activeChannels).length + Object.keys(client.listeners).length + client.mutedChannels.length + "\n " + ((_a = client.user) === null || _a === void 0 ? void 0 : _a.id);
|
|
7761
7781
|
var mutedUsersLength = mutes.length;
|
|
7762
7782
|
var chatContext = React.useMemo(function () { return ({
|
|
7763
7783
|
channel: channel,
|
|
7784
|
+
channelsQueryState: channelsQueryState,
|
|
7764
7785
|
client: client,
|
|
7765
7786
|
closeMobileNav: closeMobileNav,
|
|
7766
7787
|
customClasses: customClasses,
|
|
@@ -7772,10 +7793,29 @@ var useCreateChatContext = function (value) {
|
|
|
7772
7793
|
setActiveChannel: setActiveChannel,
|
|
7773
7794
|
theme: theme,
|
|
7774
7795
|
useImageFlagEmojisOnWindows: useImageFlagEmojisOnWindows,
|
|
7775
|
-
}); }, [
|
|
7796
|
+
}); }, [
|
|
7797
|
+
channelCid,
|
|
7798
|
+
channelsQueryError,
|
|
7799
|
+
channelsQueryInProgress,
|
|
7800
|
+
clientValues,
|
|
7801
|
+
getAppSettings,
|
|
7802
|
+
mutedUsersLength,
|
|
7803
|
+
navOpen,
|
|
7804
|
+
]);
|
|
7776
7805
|
return chatContext;
|
|
7777
7806
|
};
|
|
7778
7807
|
|
|
7808
|
+
var useChannelsQueryState = function () {
|
|
7809
|
+
var _a = React.useState(null), error = _a[0], setError = _a[1];
|
|
7810
|
+
var _b = React.useState(null), queryInProgress = _b[0], setQueryInProgress = _b[1];
|
|
7811
|
+
return {
|
|
7812
|
+
error: error,
|
|
7813
|
+
queryInProgress: queryInProgress,
|
|
7814
|
+
setError: setError,
|
|
7815
|
+
setQueryInProgress: setQueryInProgress,
|
|
7816
|
+
};
|
|
7817
|
+
};
|
|
7818
|
+
|
|
7779
7819
|
var darkModeTheme = {
|
|
7780
7820
|
'--bg-gradient-end': '#101214',
|
|
7781
7821
|
'--bg-gradient-start': '#070a0d',
|
|
@@ -7813,9 +7853,11 @@ var useCustomStyles = function (customStyles) {
|
|
|
7813
7853
|
var Chat = function (props) {
|
|
7814
7854
|
var children = props.children, client = props.client, customClasses = props.customClasses, customStyles = props.customStyles, _a = props.darkMode, darkMode = _a === void 0 ? false : _a, defaultLanguage = props.defaultLanguage, i18nInstance = props.i18nInstance, _b = props.initialNavOpen, initialNavOpen = _b === void 0 ? true : _b, _c = props.theme, theme = _c === void 0 ? 'messaging light' : _c, _d = props.useImageFlagEmojisOnWindows, useImageFlagEmojisOnWindows = _d === void 0 ? false : _d;
|
|
7815
7855
|
var _e = useChat({ client: client, defaultLanguage: defaultLanguage, i18nInstance: i18nInstance, initialNavOpen: initialNavOpen }), channel = _e.channel, closeMobileNav = _e.closeMobileNav, getAppSettings = _e.getAppSettings, latestMessageDatesByChannels = _e.latestMessageDatesByChannels, mutes = _e.mutes, navOpen = _e.navOpen, openMobileNav = _e.openMobileNav, setActiveChannel = _e.setActiveChannel, translators = _e.translators;
|
|
7856
|
+
var channelsQueryState = useChannelsQueryState();
|
|
7816
7857
|
useCustomStyles(darkMode ? darkModeTheme : customStyles);
|
|
7817
7858
|
var chatContextValue = useCreateChatContext({
|
|
7818
7859
|
channel: channel,
|
|
7860
|
+
channelsQueryState: channelsQueryState,
|
|
7819
7861
|
client: client,
|
|
7820
7862
|
closeMobileNav: closeMobileNav,
|
|
7821
7863
|
customClasses: customClasses,
|
|
@@ -7926,9 +7968,6 @@ var InfiniteScroll = function (props) {
|
|
|
7926
7968
|
}
|
|
7927
7969
|
scrollElement.addEventListener('scroll', scrollListener, useCapture);
|
|
7928
7970
|
scrollElement.addEventListener('resize', scrollListener, useCapture);
|
|
7929
|
-
if (initialLoad) {
|
|
7930
|
-
scrollListener();
|
|
7931
|
-
}
|
|
7932
7971
|
return function () {
|
|
7933
7972
|
scrollElement.removeEventListener('scroll', scrollListener, useCapture);
|
|
7934
7973
|
scrollElement.removeEventListener('resize', scrollListener, useCapture);
|
|
@@ -7949,10 +7988,7 @@ var InfiniteScroll = function (props) {
|
|
|
7949
7988
|
var attributes = __assign(__assign({}, elementProps), { ref: function (element) {
|
|
7950
7989
|
scrollComponent.current = element;
|
|
7951
7990
|
} });
|
|
7952
|
-
var childrenArray = [children];
|
|
7953
|
-
if (isLoading && loader) {
|
|
7954
|
-
childrenArray.unshift(loader);
|
|
7955
|
-
}
|
|
7991
|
+
var childrenArray = [loader, children];
|
|
7956
7992
|
return React__default['default'].createElement(element, attributes, childrenArray);
|
|
7957
7993
|
};
|
|
7958
7994
|
|
|
@@ -8692,9 +8728,6 @@ function useMessageListScrollManager(params) {
|
|
|
8692
8728
|
});
|
|
8693
8729
|
var messages = React.useRef();
|
|
8694
8730
|
var scrollTop = React.useRef(0);
|
|
8695
|
-
React.useEffect(function () {
|
|
8696
|
-
scrollToBottom();
|
|
8697
|
-
}, []);
|
|
8698
8731
|
React.useEffect(function () {
|
|
8699
8732
|
var _a, _b, _c;
|
|
8700
8733
|
var prevMeasures = measures.current;
|
|
@@ -8740,49 +8773,62 @@ function useMessageListScrollManager(params) {
|
|
|
8740
8773
|
};
|
|
8741
8774
|
}
|
|
8742
8775
|
|
|
8776
|
+
var ResizeObserver = window.ResizeObserver || resizeObserver.ResizeObserver;
|
|
8743
8777
|
var useScrollLocationLogic = function (params) {
|
|
8744
|
-
var _a = params.messages, messages = _a === void 0 ? [] : _a, _b = params.scrolledUpThreshold, scrolledUpThreshold = _b === void 0 ? 200 : _b, hasMoreNewer = params.hasMoreNewer, suppressAutoscroll = params.suppressAutoscroll;
|
|
8778
|
+
var _a = params.messages, messages = _a === void 0 ? [] : _a, _b = params.scrolledUpThreshold, scrolledUpThreshold = _b === void 0 ? 200 : _b, hasMoreNewer = params.hasMoreNewer, suppressAutoscroll = params.suppressAutoscroll, listElement = params.listElement, ulElement = params.ulElement;
|
|
8745
8779
|
var _c = React.useState(false), hasNewMessages = _c[0], setHasNewMessages = _c[1];
|
|
8746
8780
|
var _d = React.useState(), wrapperRect = _d[0], setWrapperRect = _d[1];
|
|
8747
8781
|
var closeToBottom = React.useRef(false);
|
|
8748
8782
|
var closeToTop = React.useRef(false);
|
|
8749
|
-
var
|
|
8783
|
+
var scrollCounter = React.useRef({ autoScroll: 0, scroll: 0 });
|
|
8750
8784
|
var scrollToBottom = React.useCallback(function () {
|
|
8751
|
-
|
|
8752
|
-
if (!((_a = listRef.current) === null || _a === void 0 ? void 0 : _a.scrollTo) || hasMoreNewer || suppressAutoscroll) {
|
|
8785
|
+
if (!(listElement === null || listElement === void 0 ? void 0 : listElement.scrollTo) || hasMoreNewer || suppressAutoscroll) {
|
|
8753
8786
|
return;
|
|
8754
8787
|
}
|
|
8755
|
-
|
|
8756
|
-
|
|
8788
|
+
scrollCounter.current.autoScroll += 1;
|
|
8789
|
+
listElement.scrollTo({
|
|
8790
|
+
top: listElement.scrollHeight,
|
|
8757
8791
|
});
|
|
8758
8792
|
setHasNewMessages(false);
|
|
8759
|
-
|
|
8760
|
-
|
|
8761
|
-
|
|
8762
|
-
|
|
8763
|
-
|
|
8764
|
-
|
|
8765
|
-
|
|
8766
|
-
|
|
8793
|
+
}, [listElement, hasMoreNewer, suppressAutoscroll]);
|
|
8794
|
+
React.useEffect(function () {
|
|
8795
|
+
if (!listElement)
|
|
8796
|
+
return;
|
|
8797
|
+
var observer = new ResizeObserver(scrollToBottom);
|
|
8798
|
+
var cancelObserverOnUserScroll = function () {
|
|
8799
|
+
scrollCounter.current.scroll += 1;
|
|
8800
|
+
var userScrolled = scrollCounter.current.autoScroll < scrollCounter.current.scroll;
|
|
8801
|
+
if (ulElement && userScrolled) {
|
|
8802
|
+
observer.unobserve(ulElement);
|
|
8803
|
+
listElement === null || listElement === void 0 ? void 0 : listElement.removeEventListener('scroll', cancelObserverOnUserScroll);
|
|
8804
|
+
}
|
|
8805
|
+
};
|
|
8806
|
+
if (ulElement) {
|
|
8807
|
+
observer.observe(ulElement);
|
|
8808
|
+
}
|
|
8809
|
+
listElement.addEventListener('scroll', cancelObserverOnUserScroll);
|
|
8810
|
+
return function () {
|
|
8811
|
+
observer.disconnect();
|
|
8812
|
+
if (listElement) {
|
|
8813
|
+
listElement.removeEventListener('scroll', cancelObserverOnUserScroll);
|
|
8814
|
+
}
|
|
8815
|
+
};
|
|
8816
|
+
}, [ulElement, scrollToBottom]);
|
|
8767
8817
|
React.useLayoutEffect(function () {
|
|
8768
|
-
if (
|
|
8769
|
-
setWrapperRect(
|
|
8818
|
+
if (listElement) {
|
|
8819
|
+
setWrapperRect(listElement.getBoundingClientRect());
|
|
8770
8820
|
scrollToBottom();
|
|
8771
8821
|
}
|
|
8772
|
-
}, [
|
|
8822
|
+
}, [listElement, hasMoreNewer]);
|
|
8773
8823
|
var updateScrollTop = useMessageListScrollManager({
|
|
8774
8824
|
messages: messages,
|
|
8775
8825
|
onScrollBy: function (scrollBy) {
|
|
8776
|
-
|
|
8777
|
-
(_a = listRef.current) === null || _a === void 0 ? void 0 : _a.scrollBy({ top: scrollBy });
|
|
8778
|
-
},
|
|
8779
|
-
scrollContainerMeasures: function () {
|
|
8780
|
-
var _a, _b;
|
|
8781
|
-
return ({
|
|
8782
|
-
offsetHeight: ((_a = listRef.current) === null || _a === void 0 ? void 0 : _a.offsetHeight) || 0,
|
|
8783
|
-
scrollHeight: ((_b = listRef.current) === null || _b === void 0 ? void 0 : _b.scrollHeight) || 0,
|
|
8784
|
-
});
|
|
8826
|
+
listElement === null || listElement === void 0 ? void 0 : listElement.scrollBy({ top: scrollBy });
|
|
8785
8827
|
},
|
|
8828
|
+
scrollContainerMeasures: function () { return ({
|
|
8829
|
+
offsetHeight: (listElement === null || listElement === void 0 ? void 0 : listElement.offsetHeight) || 0,
|
|
8830
|
+
scrollHeight: (listElement === null || listElement === void 0 ? void 0 : listElement.scrollHeight) || 0,
|
|
8831
|
+
}); },
|
|
8786
8832
|
scrolledUpThreshold: scrolledUpThreshold,
|
|
8787
8833
|
scrollToBottom: scrollToBottom,
|
|
8788
8834
|
showNewMessages: function () { return setHasNewMessages(true); },
|
|
@@ -8810,7 +8856,7 @@ var useScrollLocationLogic = function (params) {
|
|
|
8810
8856
|
}, [closeToTop, closeToBottom, scrollToBottom]);
|
|
8811
8857
|
return {
|
|
8812
8858
|
hasNewMessages: hasNewMessages,
|
|
8813
|
-
|
|
8859
|
+
listElement: listElement,
|
|
8814
8860
|
onMessageLoadCaptured: onMessageLoadCaptured,
|
|
8815
8861
|
onScroll: onScroll,
|
|
8816
8862
|
scrollToBottom: scrollToBottom,
|
|
@@ -8818,12 +8864,6 @@ var useScrollLocationLogic = function (params) {
|
|
|
8818
8864
|
};
|
|
8819
8865
|
};
|
|
8820
8866
|
|
|
8821
|
-
var UnMemoizedCenter = function (_a) {
|
|
8822
|
-
var children = _a.children;
|
|
8823
|
-
return (React__default['default'].createElement("div", { className: 'str-chat__list__center' }, children));
|
|
8824
|
-
};
|
|
8825
|
-
var Center = React__default['default'].memo(UnMemoizedCenter);
|
|
8826
|
-
|
|
8827
8867
|
var UnMemoizedMessageNotification = function (props) {
|
|
8828
8868
|
var children = props.children, onClick = props.onClick, _a = props.showNotification, showNotification = _a === void 0 ? true : _a;
|
|
8829
8869
|
if (!showNotification)
|
|
@@ -8886,15 +8926,19 @@ var MessageListWithContext = function (props) {
|
|
|
8886
8926
|
var channel = props.channel, _a = props.disableDateSeparator, disableDateSeparator = _a === void 0 ? false : _a, groupStyles = props.groupStyles, _b = props.hideDeletedMessages, hideDeletedMessages = _b === void 0 ? false : _b, _c = props.hideNewMessageSeparator, hideNewMessageSeparator = _c === void 0 ? false : _c, _d = props.messageActions, messageActions = _d === void 0 ? Object.keys(MESSAGE_ACTIONS) : _d, _e = props.messages, messages = _e === void 0 ? [] : _e, notifications = props.notifications, _f = props.noGroupByUser, noGroupByUser = _f === void 0 ? false : _f, _g = props.pinPermissions, pinPermissions = _g === void 0 ? defaultPinPermissions : _g, // @deprecated in favor of `channelCapabilities` - TODO: remove in next major release
|
|
8887
8927
|
_h = props.returnAllReadData, // @deprecated in favor of `channelCapabilities` - TODO: remove in next major release
|
|
8888
8928
|
returnAllReadData = _h === void 0 ? false : _h, _j = props.threadList, threadList = _j === void 0 ? false : _j, _k = props.unsafeHTML, unsafeHTML = _k === void 0 ? false : _k, headerPosition = props.headerPosition, read = props.read, _l = props.messageLimit, messageLimit = _l === void 0 ? 100 : _l, loadMoreCallback = props.loadMore, loadMoreNewerCallback = props.loadMoreNewer, _m = props.hasMoreNewer, hasMoreNewer = _m === void 0 ? false : _m, suppressAutoscroll = props.suppressAutoscroll, highlightedMessageId = props.highlightedMessageId, _o = props.jumpToLatestMessage, jumpToLatestMessage = _o === void 0 ? function () { return Promise.resolve(); } : _o;
|
|
8929
|
+
var _p = React__default['default'].useState(null), listElement = _p[0], setListElement = _p[1];
|
|
8930
|
+
var _q = React__default['default'].useState(null), ulElement = _q[0], setUlElement = _q[1];
|
|
8889
8931
|
var customClasses = useChatContext('MessageList').customClasses;
|
|
8890
|
-
var
|
|
8891
|
-
var
|
|
8932
|
+
var _r = useComponentContext('MessageList'), _s = _r.EmptyStateIndicator, EmptyStateIndicator$1 = _s === void 0 ? EmptyStateIndicator : _s, _t = _r.MessageListNotifications, MessageListNotifications$1 = _t === void 0 ? MessageListNotifications : _t, _u = _r.MessageNotification, MessageNotification$1 = _u === void 0 ? MessageNotification : _u, _v = _r.TypingIndicator, TypingIndicator$1 = _v === void 0 ? TypingIndicator : _v;
|
|
8933
|
+
var _w = useScrollLocationLogic({
|
|
8892
8934
|
hasMoreNewer: hasMoreNewer,
|
|
8935
|
+
listElement: listElement,
|
|
8893
8936
|
messages: messages,
|
|
8894
8937
|
scrolledUpThreshold: props.scrolledUpThreshold,
|
|
8895
8938
|
suppressAutoscroll: suppressAutoscroll,
|
|
8896
|
-
|
|
8897
|
-
|
|
8939
|
+
ulElement: ulElement,
|
|
8940
|
+
}), hasNewMessages = _w.hasNewMessages, onMessageLoadCaptured = _w.onMessageLoadCaptured, onScroll = _w.onScroll, scrollToBottom = _w.scrollToBottom, wrapperRect = _w.wrapperRect;
|
|
8941
|
+
var _x = useEnrichedMessages({
|
|
8898
8942
|
channel: channel,
|
|
8899
8943
|
disableDateSeparator: disableDateSeparator,
|
|
8900
8944
|
groupStyles: groupStyles,
|
|
@@ -8903,7 +8947,7 @@ var MessageListWithContext = function (props) {
|
|
|
8903
8947
|
hideNewMessageSeparator: hideNewMessageSeparator,
|
|
8904
8948
|
messages: messages,
|
|
8905
8949
|
noGroupByUser: noGroupByUser,
|
|
8906
|
-
}), messageGroupStyles =
|
|
8950
|
+
}), messageGroupStyles = _x.messageGroupStyles, enrichedMessages = _x.messages;
|
|
8907
8951
|
var elements = useMessageListElements({
|
|
8908
8952
|
enrichedMessages: enrichedMessages,
|
|
8909
8953
|
internalMessageProps: {
|
|
@@ -8938,7 +8982,7 @@ var MessageListWithContext = function (props) {
|
|
|
8938
8982
|
returnAllReadData: returnAllReadData,
|
|
8939
8983
|
threadList: threadList,
|
|
8940
8984
|
});
|
|
8941
|
-
var
|
|
8985
|
+
var _y = useComponentContext('useInternalInfiniteScrollProps').LoadingIndicator, LoadingIndicator$1 = _y === void 0 ? LoadingIndicator : _y;
|
|
8942
8986
|
var messageListClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.messageList) || 'str-chat__list';
|
|
8943
8987
|
var threadListClass = threadList ? (customClasses === null || customClasses === void 0 ? void 0 : customClasses.threadList) || 'str-chat__list--thread' : '';
|
|
8944
8988
|
var loadMore = React__default['default'].useCallback(function () {
|
|
@@ -8967,18 +9011,15 @@ var MessageListWithContext = function (props) {
|
|
|
8967
9011
|
}
|
|
8968
9012
|
});
|
|
8969
9013
|
}); }, [scrollToBottom, hasMoreNewer]);
|
|
8970
|
-
var ulRef = React__default['default'].useRef(null);
|
|
8971
9014
|
React__default['default'].useLayoutEffect(function () {
|
|
8972
|
-
var _a;
|
|
8973
9015
|
if (highlightedMessageId) {
|
|
8974
|
-
var element =
|
|
9016
|
+
var element = ulElement === null || ulElement === void 0 ? void 0 : ulElement.querySelector("[data-message-id='" + highlightedMessageId + "']");
|
|
8975
9017
|
element === null || element === void 0 ? void 0 : element.scrollIntoView({ block: 'center' });
|
|
8976
9018
|
}
|
|
8977
9019
|
}, [highlightedMessageId]);
|
|
8978
9020
|
return (React__default['default'].createElement(React__default['default'].Fragment, null,
|
|
8979
|
-
React__default['default'].createElement("div", { className: messageListClass + " " + threadListClass, onScroll: onScroll, ref:
|
|
8980
|
-
|
|
8981
|
-
React__default['default'].createElement("ul", { className: 'str-chat__ul', ref: ulRef }, elements),
|
|
9021
|
+
React__default['default'].createElement("div", { className: messageListClass + " " + threadListClass, onScroll: onScroll, ref: setListElement, tabIndex: 0 }, !elements.length ? (React__default['default'].createElement(EmptyStateIndicator$1, { listType: 'message' })) : (React__default['default'].createElement(InfiniteScroll, __assign({ className: 'str-chat__reverse-infinite-scroll', "data-testid": 'reverse-infinite-scroll', hasMore: props.hasMore, hasMoreNewer: props.hasMoreNewer, isLoading: props.loadingMore, loader: React__default['default'].createElement("div", { className: 'str-chat__list__loading', key: 'loadingindicator' }, props.loadingMore && React__default['default'].createElement(LoadingIndicator$1, { size: 20 })), loadMore: loadMore, loadMoreNewer: loadMoreNewer }, props.internalInfiniteScrollProps),
|
|
9022
|
+
React__default['default'].createElement("ul", { className: 'str-chat__ul', ref: setUlElement }, elements),
|
|
8982
9023
|
React__default['default'].createElement(TypingIndicator$1, { threadList: threadList }),
|
|
8983
9024
|
React__default['default'].createElement("div", { key: 'bottom' })))),
|
|
8984
9025
|
React__default['default'].createElement(MessageListNotifications$1, { hasNewMessages: hasNewMessages, isNotAtLatestMessageSet: hasMoreNewer, MessageNotification: MessageNotification$1, notifications: notifications, scrollToBottom: scrollToBottomFromNotification })));
|