stream-chat-react 8.2.0 → 9.1.0
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 +700 -147
- package/dist/browser.full-bundle.js.map +1 -1
- package/dist/browser.full-bundle.min.js +3 -3
- 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 +0 -3
- package/dist/components/MessageInput/EditMessageForm.js +2 -2
- 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 -11
- 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.map +1 -1
- package/dist/components/Modal/Modal.js +10 -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/index.cjs.js +186 -133
- package/dist/index.cjs.js.map +1 -1
- 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/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 +4 -3
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,26 +1029,21 @@ 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';
|
|
1053
1049
|
return (React__default['default'].createElement("div", { className: "str-chat__modal " + openClasses, onClick: handleClick },
|
|
@@ -2569,7 +2565,7 @@ var channelReducer = function (state, action) {
|
|
|
2569
2565
|
}
|
|
2570
2566
|
case 'setLoadingMore': {
|
|
2571
2567
|
var loadingMore = action.loadingMore;
|
|
2572
|
-
//
|
|
2568
|
+
// suppress the autoscroll behavior
|
|
2573
2569
|
return __assign(__assign({}, state), { loadingMore: loadingMore, suppressAutoscroll: true });
|
|
2574
2570
|
}
|
|
2575
2571
|
case 'setLoadingMoreNewer': {
|
|
@@ -4702,7 +4698,9 @@ var UploadsPreview = function () {
|
|
|
4702
4698
|
var _a = useChannelStateContext('UploadsPreview'), maxNumberOfFiles = _a.maxNumberOfFiles, multipleUploads = _a.multipleUploads;
|
|
4703
4699
|
var messageInput = useMessageInputContext('UploadsPreview');
|
|
4704
4700
|
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
|
|
4701
|
+
var imagesToPreview = imageOrder
|
|
4702
|
+
.map(function (id) { return imageUploads[id]; })
|
|
4703
|
+
.filter(function (image) { return !image.og_scrape_url; });
|
|
4706
4704
|
var filesToPreview = fileOrder.map(function (id) { return fileUploads[id]; });
|
|
4707
4705
|
return (React__default['default'].createElement(React__default['default'].Fragment, null,
|
|
4708
4706
|
imageOrder.length > 0 && (React__default['default'].createElement(reactFileUtils.ImagePreviewer, { disabled: !multipleUploads ||
|
|
@@ -4747,8 +4745,8 @@ var EditMessageForm = function () {
|
|
|
4747
4745
|
var _c = useComponentContext('EditMessageForm'), _d = _c.EmojiIcon, EmojiIcon = _d === void 0 ? EmojiIconSmall : _d, _e = _c.FileUploadIcon, FileUploadIcon$1 = _e === void 0 ? FileUploadIcon : _e;
|
|
4748
4746
|
React.useEffect(function () {
|
|
4749
4747
|
var onKeyDown = function (event) {
|
|
4750
|
-
if (event.key === 'Escape'
|
|
4751
|
-
clearEditingState();
|
|
4748
|
+
if (event.key === 'Escape')
|
|
4749
|
+
clearEditingState === null || clearEditingState === void 0 ? void 0 : clearEditingState();
|
|
4752
4750
|
};
|
|
4753
4751
|
document.addEventListener('keydown', onKeyDown);
|
|
4754
4752
|
return function () { return document.removeEventListener('keydown', onKeyDown); };
|
|
@@ -5048,11 +5046,11 @@ var useAttachments = function (props, state, dispatch, textareaRef) {
|
|
|
5048
5046
|
// Number of files that the user can still add. Should never be more than the amount allowed by the API.
|
|
5049
5047
|
// If multipleUploads is false, we only want to allow a single upload.
|
|
5050
5048
|
var maxFilesAllowed = !multipleUploads ? 1 : maxNumberOfFiles || apiMaxNumberOfFiles;
|
|
5049
|
+
// OG attachments should not be counted towards "numberOfImages"
|
|
5051
5050
|
var numberOfImages = Object.values(imageUploads).filter(function (_a) {
|
|
5052
|
-
var state = _a.state;
|
|
5053
|
-
return state !== 'failed';
|
|
5054
|
-
})
|
|
5055
|
-
.length;
|
|
5051
|
+
var og_scrape_url = _a.og_scrape_url, state = _a.state;
|
|
5052
|
+
return state !== 'failed' && !og_scrape_url;
|
|
5053
|
+
}).length;
|
|
5056
5054
|
var numberOfFiles = Object.values(fileUploads).filter(function (_a) {
|
|
5057
5055
|
var state = _a.state;
|
|
5058
5056
|
return state !== 'failed';
|
|
@@ -5238,6 +5236,14 @@ var useSubmitHandler = function (props, state, dispatch, numberOfUploads) {
|
|
|
5238
5236
|
var channel = useChannelStateContext('useSubmitHandler').channel;
|
|
5239
5237
|
var _a = useChannelActionContext('useSubmitHandler'), addNotification = _a.addNotification, editMessage = _a.editMessage, sendMessage = _a.sendMessage;
|
|
5240
5238
|
var t = useTranslationContext('useSubmitHandler').t;
|
|
5239
|
+
var textReference = React.useRef({ hasChanged: false, initialText: text });
|
|
5240
|
+
React.useEffect(function () {
|
|
5241
|
+
if (!textReference.current.initialText.length) {
|
|
5242
|
+
textReference.current.initialText = text;
|
|
5243
|
+
return;
|
|
5244
|
+
}
|
|
5245
|
+
textReference.current.hasChanged = text !== textReference.current.initialText;
|
|
5246
|
+
}, [text]);
|
|
5241
5247
|
var getAttachmentsFromUploads = function () {
|
|
5242
5248
|
var imageAttachments = imageOrder
|
|
5243
5249
|
.map(function (id) { return imageUploads[id]; })
|
|
@@ -5246,25 +5252,36 @@ var useSubmitHandler = function (props, state, dispatch, numberOfUploads) {
|
|
|
5246
5252
|
var id = _a.id, url = _a.url;
|
|
5247
5253
|
return self.every(function (upload) { return upload.id === id || upload.url !== url; });
|
|
5248
5254
|
})
|
|
5249
|
-
.
|
|
5255
|
+
.filter(function (upload) {
|
|
5256
|
+
// keep the OG attachments in case the text has not changed as the BE
|
|
5257
|
+
// won't re-enrich the message when only attachments have changed
|
|
5258
|
+
if (!textReference.current.hasChanged)
|
|
5259
|
+
return true;
|
|
5260
|
+
return !upload.og_scrape_url;
|
|
5261
|
+
})
|
|
5262
|
+
.map(function (_a) {
|
|
5263
|
+
var name = _a.file.name, url = _a.url, rest = __rest(_a, ["file", "url"]);
|
|
5250
5264
|
return ({
|
|
5251
|
-
|
|
5252
|
-
|
|
5265
|
+
author_name: rest.author_name,
|
|
5266
|
+
fallback: name,
|
|
5267
|
+
image_url: url,
|
|
5268
|
+
og_scrape_url: rest.og_scrape_url,
|
|
5269
|
+
text: rest.text,
|
|
5270
|
+
title: rest.title,
|
|
5271
|
+
title_link: rest.title_link,
|
|
5253
5272
|
type: 'image',
|
|
5254
5273
|
});
|
|
5255
5274
|
});
|
|
5256
5275
|
var fileAttachments = fileOrder
|
|
5257
5276
|
.map(function (id) { return fileUploads[id]; })
|
|
5258
5277
|
.filter(function (upload) { return upload.state !== 'failed'; })
|
|
5259
|
-
.map(function (upload) {
|
|
5260
|
-
|
|
5261
|
-
|
|
5262
|
-
|
|
5263
|
-
|
|
5264
|
-
|
|
5265
|
-
|
|
5266
|
-
});
|
|
5267
|
-
});
|
|
5278
|
+
.map(function (upload) { return ({
|
|
5279
|
+
asset_url: upload.url,
|
|
5280
|
+
file_size: upload.file.size,
|
|
5281
|
+
mime_type: upload.file.type,
|
|
5282
|
+
title: upload.file.name,
|
|
5283
|
+
type: getAttachmentTypeFromMime(upload.file.type || ''),
|
|
5284
|
+
}); });
|
|
5268
5285
|
return __spreadArray(__spreadArray(__spreadArray([], attachments), imageAttachments), fileAttachments);
|
|
5269
5286
|
};
|
|
5270
5287
|
var handleSubmit = function (event, customMessageData) { return __awaiter(void 0, void 0, void 0, function () {
|
|
@@ -5307,8 +5324,7 @@ var useSubmitHandler = function (props, state, dispatch, numberOfUploads) {
|
|
|
5307
5324
|
return [4 /*yield*/, editMessage(__assign(__assign({}, message), updatedMessage))];
|
|
5308
5325
|
case 2:
|
|
5309
5326
|
_a.sent();
|
|
5310
|
-
|
|
5311
|
-
clearEditingState();
|
|
5327
|
+
clearEditingState === null || clearEditingState === void 0 ? void 0 : clearEditingState();
|
|
5312
5328
|
dispatch({ type: 'clear' });
|
|
5313
5329
|
return [3 /*break*/, 4];
|
|
5314
5330
|
case 3:
|
|
@@ -5341,11 +5357,9 @@ var useSubmitHandler = function (props, state, dispatch, numberOfUploads) {
|
|
|
5341
5357
|
getNewText: function () { return text; },
|
|
5342
5358
|
type: 'setText',
|
|
5343
5359
|
});
|
|
5344
|
-
|
|
5345
|
-
|
|
5346
|
-
|
|
5347
|
-
});
|
|
5348
|
-
}
|
|
5360
|
+
actualMentionedUsers === null || actualMentionedUsers === void 0 ? void 0 : actualMentionedUsers.forEach(function (user) {
|
|
5361
|
+
dispatch({ type: 'addMentionedUser', user: user });
|
|
5362
|
+
});
|
|
5349
5363
|
addNotification(t('Send message request failed'), 'error');
|
|
5350
5364
|
return [3 /*break*/, 13];
|
|
5351
5365
|
case 13: return [2 /*return*/];
|
|
@@ -5406,15 +5420,13 @@ var usePasteHandler = function (uploadNewFiles, insertText, isUploadEnabled) {
|
|
|
5406
5420
|
return { onPaste: onPaste };
|
|
5407
5421
|
};
|
|
5408
5422
|
|
|
5409
|
-
var emptyFileUploads = {};
|
|
5410
|
-
var emptyImageUploads = {};
|
|
5411
5423
|
var makeEmptyMessageInputState = function () { return ({
|
|
5412
5424
|
attachments: [],
|
|
5413
5425
|
emojiPickerIsOpen: false,
|
|
5414
5426
|
fileOrder: [],
|
|
5415
|
-
fileUploads:
|
|
5427
|
+
fileUploads: {},
|
|
5416
5428
|
imageOrder: [],
|
|
5417
|
-
imageUploads:
|
|
5429
|
+
imageUploads: {},
|
|
5418
5430
|
mentioned_users: [],
|
|
5419
5431
|
setText: function () { return null; },
|
|
5420
5432
|
text: '',
|
|
@@ -5423,46 +5435,53 @@ var makeEmptyMessageInputState = function () { return ({
|
|
|
5423
5435
|
* Initializes the state. Empty if the message prop is falsy.
|
|
5424
5436
|
*/
|
|
5425
5437
|
var initState = function (message) {
|
|
5426
|
-
var _a, _b, _c;
|
|
5438
|
+
var _a, _b, _c, _d, _e;
|
|
5427
5439
|
if (!message) {
|
|
5428
5440
|
return makeEmptyMessageInputState();
|
|
5429
5441
|
}
|
|
5430
5442
|
// 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) {
|
|
5443
|
+
var imageUploads = (_b = (_a = message.attachments) === null || _a === void 0 ? void 0 : _a.filter(function (_a) {
|
|
5432
5444
|
var type = _a.type;
|
|
5433
5445
|
return type === 'image';
|
|
5434
|
-
}).reduce(function (acc,
|
|
5446
|
+
}).reduce(function (acc, _a) {
|
|
5447
|
+
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
5448
|
var id = nanoid.nanoid();
|
|
5436
5449
|
acc[id] = {
|
|
5450
|
+
author_name: author_name,
|
|
5437
5451
|
file: {
|
|
5438
|
-
name:
|
|
5452
|
+
name: fallback,
|
|
5439
5453
|
},
|
|
5440
5454
|
id: id,
|
|
5455
|
+
og_scrape_url: og_scrape_url,
|
|
5441
5456
|
state: 'finished',
|
|
5442
|
-
|
|
5457
|
+
text: text,
|
|
5458
|
+
title: title,
|
|
5459
|
+
title_link: title_link,
|
|
5460
|
+
url: image_url,
|
|
5443
5461
|
};
|
|
5444
5462
|
return acc;
|
|
5445
|
-
}, {}))
|
|
5446
|
-
var
|
|
5447
|
-
var fileUploads = ((_b = message.attachments) === null || _b === void 0 ? void 0 : _b.filter(function (_a) {
|
|
5463
|
+
}, {})) !== null && _b !== void 0 ? _b : {};
|
|
5464
|
+
var fileUploads = (_d = (_c = message.attachments) === null || _c === void 0 ? void 0 : _c.filter(function (_a) {
|
|
5448
5465
|
var type = _a.type;
|
|
5449
5466
|
return type === 'file';
|
|
5450
|
-
}).reduce(function (acc,
|
|
5467
|
+
}).reduce(function (acc, _a) {
|
|
5468
|
+
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
5469
|
var id = nanoid.nanoid();
|
|
5452
5470
|
acc[id] = {
|
|
5453
5471
|
file: {
|
|
5454
|
-
name:
|
|
5455
|
-
size:
|
|
5456
|
-
type:
|
|
5472
|
+
name: title,
|
|
5473
|
+
size: file_size,
|
|
5474
|
+
type: mime_type,
|
|
5457
5475
|
},
|
|
5458
5476
|
id: id,
|
|
5459
5477
|
state: 'finished',
|
|
5460
|
-
url:
|
|
5478
|
+
url: asset_url,
|
|
5461
5479
|
};
|
|
5462
5480
|
return acc;
|
|
5463
|
-
}, {}))
|
|
5481
|
+
}, {})) !== null && _d !== void 0 ? _d : {};
|
|
5482
|
+
var imageOrder = Object.keys(imageUploads);
|
|
5464
5483
|
var fileOrder = Object.keys(fileUploads);
|
|
5465
|
-
var attachments = ((
|
|
5484
|
+
var attachments = ((_e = message.attachments) === null || _e === void 0 ? void 0 : _e.filter(function (_a) {
|
|
5466
5485
|
var type = _a.type;
|
|
5467
5486
|
return type !== 'file' && type !== 'image';
|
|
5468
5487
|
})) || [];
|
|
@@ -6151,9 +6170,15 @@ var makeAddNotifications = function (setNotifications, notificationTimeouts) { r
|
|
|
6151
6170
|
|
|
6152
6171
|
var JUMP_MESSAGE_PAGE_SIZE = 25;
|
|
6153
6172
|
var UnMemoizedChannel = function (props) {
|
|
6154
|
-
var propsChannel = props.channel, _a = props.EmptyPlaceholder, EmptyPlaceholder = _a === void 0 ? null : _a;
|
|
6155
|
-
var
|
|
6173
|
+
var propsChannel = props.channel, _a = props.EmptyPlaceholder, EmptyPlaceholder = _a === void 0 ? null : _a, LoadingErrorIndicator = props.LoadingErrorIndicator, LoadingIndicator = props.LoadingIndicator;
|
|
6174
|
+
var _b = useChatContext('Channel'), contextChannel = _b.channel, channelsQueryState = _b.channelsQueryState;
|
|
6156
6175
|
var channel = propsChannel || contextChannel;
|
|
6176
|
+
if (channelsQueryState.queryInProgress === 'reload' && LoadingIndicator) {
|
|
6177
|
+
return React__default['default'].createElement(LoadingIndicator, { size: 25 });
|
|
6178
|
+
}
|
|
6179
|
+
if (channelsQueryState.error && LoadingErrorIndicator) {
|
|
6180
|
+
return React__default['default'].createElement(LoadingErrorIndicator, { error: channelsQueryState.error });
|
|
6181
|
+
}
|
|
6157
6182
|
if (!(channel === null || channel === void 0 ? void 0 : channel.cid))
|
|
6158
6183
|
return EmptyPlaceholder;
|
|
6159
6184
|
return React__default['default'].createElement(ChannelInner, __assign({}, props, { channel: channel, key: channel.cid }));
|
|
@@ -6167,7 +6192,7 @@ var ChannelInner = function (props) {
|
|
|
6167
6192
|
var _k = React.useState([]), notifications = _k[0], setNotifications = _k[1];
|
|
6168
6193
|
var _l = React.useState(), quotedMessage = _l[0], setQuotedMessage = _l[1];
|
|
6169
6194
|
var notificationTimeouts = [];
|
|
6170
|
-
var _m = React.useReducer(channelReducer, initialState), state = _m[0], dispatch = _m[1];
|
|
6195
|
+
var _m = React.useReducer(channelReducer, __assign(__assign({}, initialState), { loading: !channel.initialized })), state = _m[0], dispatch = _m[1];
|
|
6171
6196
|
var isMounted = useIsMounted();
|
|
6172
6197
|
var originalTitle = React.useRef('');
|
|
6173
6198
|
var lastRead = React.useRef(new Date());
|
|
@@ -6501,7 +6526,7 @@ var ChannelInner = function (props) {
|
|
|
6501
6526
|
error_1 = _b.sent();
|
|
6502
6527
|
stringError = JSON.stringify(error_1);
|
|
6503
6528
|
parsedError = stringError ? JSON.parse(stringError) : {};
|
|
6504
|
-
updateMessage(__assign(__assign({}, message), { errorStatusCode: parsedError.status || undefined, status: 'failed' }));
|
|
6529
|
+
updateMessage(__assign(__assign({}, message), { error: parsedError, errorStatusCode: parsedError.status || undefined, status: 'failed' }));
|
|
6505
6530
|
return [3 /*break*/, 7];
|
|
6506
6531
|
case 7: return [2 /*return*/];
|
|
6507
6532
|
}
|
|
@@ -6770,7 +6795,6 @@ var UnMemoizedChatDown = function (_a) {
|
|
|
6770
6795
|
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
6796
|
var t = useTranslationContext('ChatDown').t;
|
|
6772
6797
|
return (React__default['default'].createElement("div", { className: 'str-chat__down' },
|
|
6773
|
-
React__default['default'].createElement(LoadingChannels, null),
|
|
6774
6798
|
React__default['default'].createElement("div", { className: 'str-chat__down-main' },
|
|
6775
6799
|
typeof image === 'string' ? (React__default['default'].createElement("img", { alt: 'Connection error', "data-testid": 'chatdown-img', src: image })) : (image),
|
|
6776
6800
|
React__default['default'].createElement("h1", null, type),
|
|
@@ -6785,7 +6809,7 @@ var ChatDown = React__default['default'].memo(UnMemoizedChatDown);
|
|
|
6785
6809
|
* A preview list of channels, allowing you to select the channel you want to open
|
|
6786
6810
|
*/
|
|
6787
6811
|
var ChannelListMessenger = function (props) {
|
|
6788
|
-
var children = props.children, _a = props.error, error = _a === void 0 ?
|
|
6812
|
+
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
6813
|
if (error) {
|
|
6790
6814
|
return React__default['default'].createElement(LoadingErrorIndicator, { type: 'Connection Error' });
|
|
6791
6815
|
}
|
|
@@ -7084,11 +7108,9 @@ var useNotificationRemovedFromChannelListener = function (setChannels, customHan
|
|
|
7084
7108
|
};
|
|
7085
7109
|
|
|
7086
7110
|
var usePaginatedChannels = function (client, filters, sort, options, activeChannelHandler) {
|
|
7087
|
-
var _a =
|
|
7088
|
-
var _b = React.useState(
|
|
7111
|
+
var _a = useChatContext('usePaginatedChannels').channelsQueryState, setError = _a.setError, setQueryInProgress = _a.setQueryInProgress;
|
|
7112
|
+
var _b = React.useState([]), channels = _b[0], setChannels = _b[1];
|
|
7089
7113
|
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
7114
|
var filterString = React.useMemo(function () { return JSON.stringify(filters); }, [filters]);
|
|
7093
7115
|
var sortString = React.useMemo(function () { return JSON.stringify(sort); }, [sort]);
|
|
7094
7116
|
var queryChannels = function (queryType) { return __awaiter(void 0, void 0, void 0, function () {
|
|
@@ -7097,12 +7119,14 @@ var usePaginatedChannels = function (client, filters, sort, options, activeChann
|
|
|
7097
7119
|
return __generator(this, function (_b) {
|
|
7098
7120
|
switch (_b.label) {
|
|
7099
7121
|
case 0:
|
|
7100
|
-
setError(
|
|
7122
|
+
setError(null);
|
|
7101
7123
|
if (queryType === 'reload') {
|
|
7102
7124
|
setChannels([]);
|
|
7103
|
-
|
|
7125
|
+
setQueryInProgress('reload');
|
|
7126
|
+
}
|
|
7127
|
+
else {
|
|
7128
|
+
setQueryInProgress('load-more');
|
|
7104
7129
|
}
|
|
7105
|
-
setRefreshing(true);
|
|
7106
7130
|
offset = queryType === 'reload' ? 0 : channels.length;
|
|
7107
7131
|
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
7132
|
_b.label = 1;
|
|
@@ -7122,11 +7146,10 @@ var usePaginatedChannels = function (client, filters, sort, options, activeChann
|
|
|
7122
7146
|
case 3:
|
|
7123
7147
|
err_1 = _b.sent();
|
|
7124
7148
|
console.warn(err_1);
|
|
7125
|
-
setError(
|
|
7149
|
+
setError(err_1);
|
|
7126
7150
|
return [3 /*break*/, 4];
|
|
7127
7151
|
case 4:
|
|
7128
|
-
|
|
7129
|
-
setRefreshing(false);
|
|
7152
|
+
setQueryInProgress(null);
|
|
7130
7153
|
return [2 /*return*/];
|
|
7131
7154
|
}
|
|
7132
7155
|
});
|
|
@@ -7142,11 +7165,6 @@ var usePaginatedChannels = function (client, filters, sort, options, activeChann
|
|
|
7142
7165
|
hasNextPage: hasNextPage,
|
|
7143
7166
|
loadNextPage: loadNextPage,
|
|
7144
7167
|
setChannels: setChannels,
|
|
7145
|
-
status: {
|
|
7146
|
-
error: error,
|
|
7147
|
-
loadingChannels: loadingChannels,
|
|
7148
|
-
refreshing: refreshing,
|
|
7149
|
-
},
|
|
7150
7168
|
};
|
|
7151
7169
|
};
|
|
7152
7170
|
|
|
@@ -7553,8 +7571,8 @@ var DEFAULT_FILTERS = {};
|
|
|
7553
7571
|
var DEFAULT_OPTIONS = {};
|
|
7554
7572
|
var DEFAULT_SORT = {};
|
|
7555
7573
|
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;
|
|
7574
|
+
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;
|
|
7575
|
+
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
7576
|
var channelListRef = React.useRef(null);
|
|
7559
7577
|
var _q = React.useState(0), channelUpdateCount = _q[0], setChannelUpdateCount = _q[1];
|
|
7560
7578
|
/**
|
|
@@ -7601,7 +7619,7 @@ var UnMemoizedChannelList = function (props) {
|
|
|
7601
7619
|
* force a re-render. Incrementing this dummy variable ensures the channel previews update.
|
|
7602
7620
|
*/
|
|
7603
7621
|
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
|
|
7622
|
+
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
7623
|
var loadedChannels = channelRenderFilterFn ? channelRenderFilterFn(channels) : channels;
|
|
7606
7624
|
useMobileNavigation(channelListRef, navOpen, closeMobileNav);
|
|
7607
7625
|
useMessageNewListener(setChannels, lockChannelOrder, allowNewMessagesFromUnfilteredChannels);
|
|
@@ -7651,14 +7669,16 @@ var UnMemoizedChannelList = function (props) {
|
|
|
7651
7669
|
return (React__default['default'].createElement(React__default['default'].Fragment, null,
|
|
7652
7670
|
React__default['default'].createElement("div", { className: chatClass + " " + channelListClass + " " + theme + " " + navigationClass + " " + windowsEmojiClass, ref: channelListRef },
|
|
7653
7671
|
showChannelSearch && React__default['default'].createElement(ChannelSearch$1, __assign({}, additionalChannelSearchProps)),
|
|
7654
|
-
React__default['default'].createElement(List, { error:
|
|
7672
|
+
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
|
|
7673
|
+
? renderChannels(loadedChannels, renderChannel)
|
|
7674
|
+
: loadedChannels.map(renderChannel)))))));
|
|
7655
7675
|
};
|
|
7656
7676
|
/**
|
|
7657
7677
|
* Renders a preview list of Channels, allowing you to select the Channel you want to open
|
|
7658
7678
|
*/
|
|
7659
7679
|
var ChannelList = React__default['default'].memo(UnMemoizedChannelList);
|
|
7660
7680
|
|
|
7661
|
-
var version = '
|
|
7681
|
+
var version = '9.1.0';
|
|
7662
7682
|
|
|
7663
7683
|
var useChat = function (_a) {
|
|
7664
7684
|
var _b, _c;
|
|
@@ -7755,12 +7775,15 @@ var useChat = function (_a) {
|
|
|
7755
7775
|
|
|
7756
7776
|
var useCreateChatContext = function (value) {
|
|
7757
7777
|
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;
|
|
7778
|
+
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
7779
|
var channelCid = channel === null || channel === void 0 ? void 0 : channel.cid;
|
|
7780
|
+
var channelsQueryError = channelsQueryState.error;
|
|
7781
|
+
var channelsQueryInProgress = channelsQueryState.queryInProgress;
|
|
7760
7782
|
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
7783
|
var mutedUsersLength = mutes.length;
|
|
7762
7784
|
var chatContext = React.useMemo(function () { return ({
|
|
7763
7785
|
channel: channel,
|
|
7786
|
+
channelsQueryState: channelsQueryState,
|
|
7764
7787
|
client: client,
|
|
7765
7788
|
closeMobileNav: closeMobileNav,
|
|
7766
7789
|
customClasses: customClasses,
|
|
@@ -7772,10 +7795,29 @@ var useCreateChatContext = function (value) {
|
|
|
7772
7795
|
setActiveChannel: setActiveChannel,
|
|
7773
7796
|
theme: theme,
|
|
7774
7797
|
useImageFlagEmojisOnWindows: useImageFlagEmojisOnWindows,
|
|
7775
|
-
}); }, [
|
|
7798
|
+
}); }, [
|
|
7799
|
+
channelCid,
|
|
7800
|
+
channelsQueryError,
|
|
7801
|
+
channelsQueryInProgress,
|
|
7802
|
+
clientValues,
|
|
7803
|
+
getAppSettings,
|
|
7804
|
+
mutedUsersLength,
|
|
7805
|
+
navOpen,
|
|
7806
|
+
]);
|
|
7776
7807
|
return chatContext;
|
|
7777
7808
|
};
|
|
7778
7809
|
|
|
7810
|
+
var useChannelsQueryState = function () {
|
|
7811
|
+
var _a = React.useState(null), error = _a[0], setError = _a[1];
|
|
7812
|
+
var _b = React.useState(null), queryInProgress = _b[0], setQueryInProgress = _b[1];
|
|
7813
|
+
return {
|
|
7814
|
+
error: error,
|
|
7815
|
+
queryInProgress: queryInProgress,
|
|
7816
|
+
setError: setError,
|
|
7817
|
+
setQueryInProgress: setQueryInProgress,
|
|
7818
|
+
};
|
|
7819
|
+
};
|
|
7820
|
+
|
|
7779
7821
|
var darkModeTheme = {
|
|
7780
7822
|
'--bg-gradient-end': '#101214',
|
|
7781
7823
|
'--bg-gradient-start': '#070a0d',
|
|
@@ -7813,9 +7855,11 @@ var useCustomStyles = function (customStyles) {
|
|
|
7813
7855
|
var Chat = function (props) {
|
|
7814
7856
|
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
7857
|
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;
|
|
7858
|
+
var channelsQueryState = useChannelsQueryState();
|
|
7816
7859
|
useCustomStyles(darkMode ? darkModeTheme : customStyles);
|
|
7817
7860
|
var chatContextValue = useCreateChatContext({
|
|
7818
7861
|
channel: channel,
|
|
7862
|
+
channelsQueryState: channelsQueryState,
|
|
7819
7863
|
client: client,
|
|
7820
7864
|
closeMobileNav: closeMobileNav,
|
|
7821
7865
|
customClasses: customClasses,
|
|
@@ -7926,9 +7970,6 @@ var InfiniteScroll = function (props) {
|
|
|
7926
7970
|
}
|
|
7927
7971
|
scrollElement.addEventListener('scroll', scrollListener, useCapture);
|
|
7928
7972
|
scrollElement.addEventListener('resize', scrollListener, useCapture);
|
|
7929
|
-
if (initialLoad) {
|
|
7930
|
-
scrollListener();
|
|
7931
|
-
}
|
|
7932
7973
|
return function () {
|
|
7933
7974
|
scrollElement.removeEventListener('scroll', scrollListener, useCapture);
|
|
7934
7975
|
scrollElement.removeEventListener('resize', scrollListener, useCapture);
|
|
@@ -8692,9 +8733,6 @@ function useMessageListScrollManager(params) {
|
|
|
8692
8733
|
});
|
|
8693
8734
|
var messages = React.useRef();
|
|
8694
8735
|
var scrollTop = React.useRef(0);
|
|
8695
|
-
React.useEffect(function () {
|
|
8696
|
-
scrollToBottom();
|
|
8697
|
-
}, []);
|
|
8698
8736
|
React.useEffect(function () {
|
|
8699
8737
|
var _a, _b, _c;
|
|
8700
8738
|
var prevMeasures = measures.current;
|
|
@@ -8740,49 +8778,62 @@ function useMessageListScrollManager(params) {
|
|
|
8740
8778
|
};
|
|
8741
8779
|
}
|
|
8742
8780
|
|
|
8781
|
+
var ResizeObserver = window.ResizeObserver || resizeObserver.ResizeObserver;
|
|
8743
8782
|
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;
|
|
8783
|
+
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
8784
|
var _c = React.useState(false), hasNewMessages = _c[0], setHasNewMessages = _c[1];
|
|
8746
8785
|
var _d = React.useState(), wrapperRect = _d[0], setWrapperRect = _d[1];
|
|
8747
8786
|
var closeToBottom = React.useRef(false);
|
|
8748
8787
|
var closeToTop = React.useRef(false);
|
|
8749
|
-
var
|
|
8788
|
+
var scrollCounter = React.useRef({ autoScroll: 0, scroll: 0 });
|
|
8750
8789
|
var scrollToBottom = React.useCallback(function () {
|
|
8751
|
-
|
|
8752
|
-
if (!((_a = listRef.current) === null || _a === void 0 ? void 0 : _a.scrollTo) || hasMoreNewer || suppressAutoscroll) {
|
|
8790
|
+
if (!(listElement === null || listElement === void 0 ? void 0 : listElement.scrollTo) || hasMoreNewer || suppressAutoscroll) {
|
|
8753
8791
|
return;
|
|
8754
8792
|
}
|
|
8755
|
-
|
|
8756
|
-
|
|
8793
|
+
scrollCounter.current.autoScroll += 1;
|
|
8794
|
+
listElement.scrollTo({
|
|
8795
|
+
top: listElement.scrollHeight,
|
|
8757
8796
|
});
|
|
8758
8797
|
setHasNewMessages(false);
|
|
8759
|
-
|
|
8760
|
-
|
|
8761
|
-
|
|
8762
|
-
|
|
8763
|
-
|
|
8764
|
-
|
|
8765
|
-
|
|
8766
|
-
|
|
8798
|
+
}, [listElement, hasMoreNewer, suppressAutoscroll]);
|
|
8799
|
+
React.useEffect(function () {
|
|
8800
|
+
if (!listElement)
|
|
8801
|
+
return;
|
|
8802
|
+
var observer = new ResizeObserver(scrollToBottom);
|
|
8803
|
+
var cancelObserverOnUserScroll = function () {
|
|
8804
|
+
scrollCounter.current.scroll += 1;
|
|
8805
|
+
var userScrolled = scrollCounter.current.autoScroll < scrollCounter.current.scroll;
|
|
8806
|
+
if (ulElement && userScrolled) {
|
|
8807
|
+
observer.unobserve(ulElement);
|
|
8808
|
+
listElement === null || listElement === void 0 ? void 0 : listElement.removeEventListener('scroll', cancelObserverOnUserScroll);
|
|
8809
|
+
}
|
|
8810
|
+
};
|
|
8811
|
+
if (ulElement) {
|
|
8812
|
+
observer.observe(ulElement);
|
|
8813
|
+
}
|
|
8814
|
+
listElement.addEventListener('scroll', cancelObserverOnUserScroll);
|
|
8815
|
+
return function () {
|
|
8816
|
+
observer.disconnect();
|
|
8817
|
+
if (listElement) {
|
|
8818
|
+
listElement.removeEventListener('scroll', cancelObserverOnUserScroll);
|
|
8819
|
+
}
|
|
8820
|
+
};
|
|
8821
|
+
}, [ulElement, scrollToBottom]);
|
|
8767
8822
|
React.useLayoutEffect(function () {
|
|
8768
|
-
if (
|
|
8769
|
-
setWrapperRect(
|
|
8823
|
+
if (listElement) {
|
|
8824
|
+
setWrapperRect(listElement.getBoundingClientRect());
|
|
8770
8825
|
scrollToBottom();
|
|
8771
8826
|
}
|
|
8772
|
-
}, [
|
|
8827
|
+
}, [listElement, hasMoreNewer]);
|
|
8773
8828
|
var updateScrollTop = useMessageListScrollManager({
|
|
8774
8829
|
messages: messages,
|
|
8775
8830
|
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
|
-
});
|
|
8831
|
+
listElement === null || listElement === void 0 ? void 0 : listElement.scrollBy({ top: scrollBy });
|
|
8785
8832
|
},
|
|
8833
|
+
scrollContainerMeasures: function () { return ({
|
|
8834
|
+
offsetHeight: (listElement === null || listElement === void 0 ? void 0 : listElement.offsetHeight) || 0,
|
|
8835
|
+
scrollHeight: (listElement === null || listElement === void 0 ? void 0 : listElement.scrollHeight) || 0,
|
|
8836
|
+
}); },
|
|
8786
8837
|
scrolledUpThreshold: scrolledUpThreshold,
|
|
8787
8838
|
scrollToBottom: scrollToBottom,
|
|
8788
8839
|
showNewMessages: function () { return setHasNewMessages(true); },
|
|
@@ -8810,7 +8861,7 @@ var useScrollLocationLogic = function (params) {
|
|
|
8810
8861
|
}, [closeToTop, closeToBottom, scrollToBottom]);
|
|
8811
8862
|
return {
|
|
8812
8863
|
hasNewMessages: hasNewMessages,
|
|
8813
|
-
|
|
8864
|
+
listElement: listElement,
|
|
8814
8865
|
onMessageLoadCaptured: onMessageLoadCaptured,
|
|
8815
8866
|
onScroll: onScroll,
|
|
8816
8867
|
scrollToBottom: scrollToBottom,
|
|
@@ -8886,15 +8937,19 @@ var MessageListWithContext = function (props) {
|
|
|
8886
8937
|
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
8938
|
_h = props.returnAllReadData, // @deprecated in favor of `channelCapabilities` - TODO: remove in next major release
|
|
8888
8939
|
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;
|
|
8940
|
+
var _p = React__default['default'].useState(null), listElement = _p[0], setListElement = _p[1];
|
|
8941
|
+
var _q = React__default['default'].useState(null), ulElement = _q[0], setUlElement = _q[1];
|
|
8889
8942
|
var customClasses = useChatContext('MessageList').customClasses;
|
|
8890
|
-
var
|
|
8891
|
-
var
|
|
8943
|
+
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;
|
|
8944
|
+
var _w = useScrollLocationLogic({
|
|
8892
8945
|
hasMoreNewer: hasMoreNewer,
|
|
8946
|
+
listElement: listElement,
|
|
8893
8947
|
messages: messages,
|
|
8894
8948
|
scrolledUpThreshold: props.scrolledUpThreshold,
|
|
8895
8949
|
suppressAutoscroll: suppressAutoscroll,
|
|
8896
|
-
|
|
8897
|
-
|
|
8950
|
+
ulElement: ulElement,
|
|
8951
|
+
}), hasNewMessages = _w.hasNewMessages, onMessageLoadCaptured = _w.onMessageLoadCaptured, onScroll = _w.onScroll, scrollToBottom = _w.scrollToBottom, wrapperRect = _w.wrapperRect;
|
|
8952
|
+
var _x = useEnrichedMessages({
|
|
8898
8953
|
channel: channel,
|
|
8899
8954
|
disableDateSeparator: disableDateSeparator,
|
|
8900
8955
|
groupStyles: groupStyles,
|
|
@@ -8903,7 +8958,7 @@ var MessageListWithContext = function (props) {
|
|
|
8903
8958
|
hideNewMessageSeparator: hideNewMessageSeparator,
|
|
8904
8959
|
messages: messages,
|
|
8905
8960
|
noGroupByUser: noGroupByUser,
|
|
8906
|
-
}), messageGroupStyles =
|
|
8961
|
+
}), messageGroupStyles = _x.messageGroupStyles, enrichedMessages = _x.messages;
|
|
8907
8962
|
var elements = useMessageListElements({
|
|
8908
8963
|
enrichedMessages: enrichedMessages,
|
|
8909
8964
|
internalMessageProps: {
|
|
@@ -8938,7 +8993,7 @@ var MessageListWithContext = function (props) {
|
|
|
8938
8993
|
returnAllReadData: returnAllReadData,
|
|
8939
8994
|
threadList: threadList,
|
|
8940
8995
|
});
|
|
8941
|
-
var
|
|
8996
|
+
var _y = useComponentContext('useInternalInfiniteScrollProps').LoadingIndicator, LoadingIndicator$1 = _y === void 0 ? LoadingIndicator : _y;
|
|
8942
8997
|
var messageListClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.messageList) || 'str-chat__list';
|
|
8943
8998
|
var threadListClass = threadList ? (customClasses === null || customClasses === void 0 ? void 0 : customClasses.threadList) || 'str-chat__list--thread' : '';
|
|
8944
8999
|
var loadMore = React__default['default'].useCallback(function () {
|
|
@@ -8967,18 +9022,16 @@ var MessageListWithContext = function (props) {
|
|
|
8967
9022
|
}
|
|
8968
9023
|
});
|
|
8969
9024
|
}); }, [scrollToBottom, hasMoreNewer]);
|
|
8970
|
-
var ulRef = React__default['default'].useRef(null);
|
|
8971
9025
|
React__default['default'].useLayoutEffect(function () {
|
|
8972
|
-
var _a;
|
|
8973
9026
|
if (highlightedMessageId) {
|
|
8974
|
-
var element =
|
|
9027
|
+
var element = ulElement === null || ulElement === void 0 ? void 0 : ulElement.querySelector("[data-message-id='" + highlightedMessageId + "']");
|
|
8975
9028
|
element === null || element === void 0 ? void 0 : element.scrollIntoView({ block: 'center' });
|
|
8976
9029
|
}
|
|
8977
9030
|
}, [highlightedMessageId]);
|
|
8978
9031
|
return (React__default['default'].createElement(React__default['default'].Fragment, null,
|
|
8979
|
-
React__default['default'].createElement("div", { className: messageListClass + " " + threadListClass, onScroll: onScroll, ref:
|
|
9032
|
+
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(Center, { key: 'loadingindicator' },
|
|
8980
9033
|
React__default['default'].createElement(LoadingIndicator$1, { size: 20 })), loadMore: loadMore, loadMoreNewer: loadMoreNewer }, props.internalInfiniteScrollProps),
|
|
8981
|
-
React__default['default'].createElement("ul", { className: 'str-chat__ul', ref:
|
|
9034
|
+
React__default['default'].createElement("ul", { className: 'str-chat__ul', ref: setUlElement }, elements),
|
|
8982
9035
|
React__default['default'].createElement(TypingIndicator$1, { threadList: threadList }),
|
|
8983
9036
|
React__default['default'].createElement("div", { key: 'bottom' })))),
|
|
8984
9037
|
React__default['default'].createElement(MessageListNotifications$1, { hasNewMessages: hasNewMessages, isNotAtLatestMessageSet: hasMoreNewer, MessageNotification: MessageNotification$1, notifications: notifications, scrollToBottom: scrollToBottomFromNotification })));
|