stream-chat-react 10.10.2 → 10.12.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.
Files changed (35) hide show
  1. package/dist/browser.full-bundle.js +181 -70
  2. package/dist/browser.full-bundle.js.map +1 -1
  3. package/dist/browser.full-bundle.min.js +5 -5
  4. package/dist/browser.full-bundle.min.js.map +1 -1
  5. package/dist/components/ChannelPreview/ChannelPreview.d.ts +3 -0
  6. package/dist/components/ChannelPreview/ChannelPreview.d.ts.map +1 -1
  7. package/dist/components/ChannelPreview/ChannelPreview.js +6 -1
  8. package/dist/components/ChannelPreview/hooks/index.d.ts +1 -0
  9. package/dist/components/ChannelPreview/hooks/index.d.ts.map +1 -1
  10. package/dist/components/ChannelPreview/hooks/index.js +1 -0
  11. package/dist/components/ChannelPreview/hooks/useMessageDeliveryStatus.d.ts +17 -0
  12. package/dist/components/ChannelPreview/hooks/useMessageDeliveryStatus.d.ts.map +1 -0
  13. package/dist/components/ChannelPreview/hooks/useMessageDeliveryStatus.js +58 -0
  14. package/dist/components/ChannelSearch/hooks/useChannelSearch.d.ts +4 -3
  15. package/dist/components/ChannelSearch/hooks/useChannelSearch.d.ts.map +1 -1
  16. package/dist/components/ChannelSearch/hooks/useChannelSearch.js +52 -31
  17. package/dist/components/Message/MessageSimple.d.ts.map +1 -1
  18. package/dist/components/Message/MessageSimple.js +10 -3
  19. package/dist/components/Message/hooks/useReactionHandler.d.ts.map +1 -1
  20. package/dist/components/Message/hooks/useReactionHandler.js +17 -21
  21. package/dist/components/MessageInput/CooldownTimer.js +1 -1
  22. package/dist/components/MessageInput/hooks/useCooldownTimer.d.ts.map +1 -1
  23. package/dist/components/MessageInput/hooks/useCooldownTimer.js +5 -2
  24. package/dist/context/MessageContext.d.ts +3 -1
  25. package/dist/context/MessageContext.d.ts.map +1 -1
  26. package/dist/context/TranslationContext.d.ts +1 -1
  27. package/dist/context/TranslationContext.d.ts.map +1 -1
  28. package/dist/i18n/Streami18n.d.ts +9 -3
  29. package/dist/i18n/Streami18n.d.ts.map +1 -1
  30. package/dist/i18n/Streami18n.js +18 -11
  31. package/dist/index.cjs.js +167 -70
  32. package/dist/index.cjs.js.map +1 -1
  33. package/dist/version.d.ts +1 -1
  34. package/dist/version.js +1 -1
  35. package/package.json +2 -2
@@ -6,6 +6,8 @@ import updateLocale from 'dayjs/plugin/updateLocale';
6
6
  import LocalizedFormat from 'dayjs/plugin/localizedFormat';
7
7
  import localeData from 'dayjs/plugin/localeData';
8
8
  import relativeTime from 'dayjs/plugin/relativeTime';
9
+ import utc from 'dayjs/plugin/utc';
10
+ import timezone from 'dayjs/plugin/timezone';
9
11
  import { deTranslations, enTranslations, esTranslations, frTranslations, hiTranslations, itTranslations, jaTranslations, koTranslations, nlTranslations, ptTranslations, ruTranslations, trTranslations, } from './translations';
10
12
  var defaultNS = 'translation';
11
13
  var defaultLng = 'en';
@@ -25,6 +27,8 @@ import 'dayjs/locale/tr';
25
27
  // to make sure I don't mess up language at other places in app.
26
28
  import 'dayjs/locale/en';
27
29
  Dayjs.extend(updateLocale);
30
+ Dayjs.extend(utc);
31
+ Dayjs.extend(timezone);
28
32
  Dayjs.updateLocale('de', {
29
33
  calendar: {
30
34
  lastDay: '[gestern um] LT',
@@ -193,6 +197,9 @@ var en_locale = {
193
197
  var isDayJs = function (dateTimeParser) {
194
198
  return dateTimeParser.extend !== undefined;
195
199
  };
200
+ var supportsTz = function (dateTimeParser) {
201
+ return dateTimeParser.tz !== undefined;
202
+ };
196
203
  /**
197
204
  * Wrapper around [i18next](https://www.i18next.com/) class for Stream related translations.
198
205
  * Instance of this class should be provided to Chat component to handle translations.
@@ -436,6 +443,7 @@ var Streami18n = /** @class */ (function () {
436
443
  this.logger = finalOptions.logger;
437
444
  this.currentLanguage = finalOptions.language;
438
445
  this.DateTimeParser = finalOptions.DateTimeParser;
446
+ this.timezone = finalOptions.timezone;
439
447
  try {
440
448
  if (this.DateTimeParser && isDayJs(this.DateTimeParser)) {
441
449
  this.DateTimeParser.extend(LocalizedFormat);
@@ -485,19 +493,18 @@ var Streami18n = /** @class */ (function () {
485
493
  "register the locale config with Streami18n using registerTranslation(language, translation, customDayjsLocale)");
486
494
  }
487
495
  this.tDateTimeParser = function (timestamp) {
488
- if (finalOptions.disableDateTimeTranslations || !_this.localeExists(_this.currentLanguage)) {
489
- /**
490
- * TS needs to know which is being called to accept the chain call
491
- */
492
- if (isDayJs(_this.DateTimeParser)) {
493
- return _this.DateTimeParser(timestamp).locale(defaultLng);
494
- }
495
- return _this.DateTimeParser(timestamp).locale(defaultLng);
496
- }
496
+ var language = finalOptions.disableDateTimeTranslations || !_this.localeExists(_this.currentLanguage)
497
+ ? defaultLng
498
+ : _this.currentLanguage;
497
499
  if (isDayJs(_this.DateTimeParser)) {
498
- return _this.DateTimeParser(timestamp).locale(_this.currentLanguage);
500
+ return supportsTz(_this.DateTimeParser)
501
+ ? _this.DateTimeParser(timestamp).tz(_this.timezone).locale(language)
502
+ : _this.DateTimeParser(timestamp).locale(language);
503
+ }
504
+ if (supportsTz(_this.DateTimeParser) && _this.timezone) {
505
+ return _this.DateTimeParser(timestamp).tz(_this.timezone).locale(language);
499
506
  }
500
- return _this.DateTimeParser(timestamp).locale(_this.currentLanguage);
507
+ return _this.DateTimeParser(timestamp).locale(language);
501
508
  };
502
509
  }
503
510
  /**
package/dist/index.cjs.js CHANGED
@@ -14,6 +14,8 @@ var i18n = require('i18next');
14
14
  var updateLocale = require('dayjs/plugin/updateLocale');
15
15
  var localeData = require('dayjs/plugin/localeData');
16
16
  var relativeTime = require('dayjs/plugin/relativeTime');
17
+ var utc = require('dayjs/plugin/utc');
18
+ var timezone = require('dayjs/plugin/timezone');
17
19
  require('dayjs/locale/de');
18
20
  require('dayjs/locale/es');
19
21
  require('dayjs/locale/fr');
@@ -88,6 +90,8 @@ var i18n__default = /*#__PURE__*/_interopDefaultLegacy(i18n);
88
90
  var updateLocale__default = /*#__PURE__*/_interopDefaultLegacy(updateLocale);
89
91
  var localeData__default = /*#__PURE__*/_interopDefaultLegacy(localeData);
90
92
  var relativeTime__default = /*#__PURE__*/_interopDefaultLegacy(relativeTime);
93
+ var utc__default = /*#__PURE__*/_interopDefaultLegacy(utc);
94
+ var timezone__default = /*#__PURE__*/_interopDefaultLegacy(timezone);
91
95
  var ImageGallery__default = /*#__PURE__*/_interopDefaultLegacy(ImageGallery);
92
96
  var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
93
97
  var linkify__namespace = /*#__PURE__*/_interopNamespace(linkify);
@@ -609,6 +613,8 @@ var Cancel="İptal";var Close="Kapat";var Delete="Sil";var Delivered="İletildi"
609
613
  var defaultNS = 'translation';
610
614
  var defaultLng = 'en';
611
615
  Dayjs__default["default"].extend(updateLocale__default["default"]);
616
+ Dayjs__default["default"].extend(utc__default["default"]);
617
+ Dayjs__default["default"].extend(timezone__default["default"]);
612
618
  Dayjs__default["default"].updateLocale('de', {
613
619
  calendar: {
614
620
  lastDay: '[gestern um] LT',
@@ -777,6 +783,9 @@ var en_locale = {
777
783
  var isDayJs = function (dateTimeParser) {
778
784
  return dateTimeParser.extend !== undefined;
779
785
  };
786
+ var supportsTz = function (dateTimeParser) {
787
+ return dateTimeParser.tz !== undefined;
788
+ };
780
789
  /**
781
790
  * Wrapper around [i18next](https://www.i18next.com/) class for Stream related translations.
782
791
  * Instance of this class should be provided to Chat component to handle translations.
@@ -1020,6 +1029,7 @@ var Streami18n = /** @class */ (function () {
1020
1029
  this.logger = finalOptions.logger;
1021
1030
  this.currentLanguage = finalOptions.language;
1022
1031
  this.DateTimeParser = finalOptions.DateTimeParser;
1032
+ this.timezone = finalOptions.timezone;
1023
1033
  try {
1024
1034
  if (this.DateTimeParser && isDayJs(this.DateTimeParser)) {
1025
1035
  this.DateTimeParser.extend(LocalizedFormat__default["default"]);
@@ -1069,19 +1079,18 @@ var Streami18n = /** @class */ (function () {
1069
1079
  "register the locale config with Streami18n using registerTranslation(language, translation, customDayjsLocale)");
1070
1080
  }
1071
1081
  this.tDateTimeParser = function (timestamp) {
1072
- if (finalOptions.disableDateTimeTranslations || !_this.localeExists(_this.currentLanguage)) {
1073
- /**
1074
- * TS needs to know which is being called to accept the chain call
1075
- */
1076
- if (isDayJs(_this.DateTimeParser)) {
1077
- return _this.DateTimeParser(timestamp).locale(defaultLng);
1078
- }
1079
- return _this.DateTimeParser(timestamp).locale(defaultLng);
1080
- }
1082
+ var language = finalOptions.disableDateTimeTranslations || !_this.localeExists(_this.currentLanguage)
1083
+ ? defaultLng
1084
+ : _this.currentLanguage;
1081
1085
  if (isDayJs(_this.DateTimeParser)) {
1082
- return _this.DateTimeParser(timestamp).locale(_this.currentLanguage);
1086
+ return supportsTz(_this.DateTimeParser)
1087
+ ? _this.DateTimeParser(timestamp).tz(_this.timezone).locale(language)
1088
+ : _this.DateTimeParser(timestamp).locale(language);
1089
+ }
1090
+ if (supportsTz(_this.DateTimeParser) && _this.timezone) {
1091
+ return _this.DateTimeParser(timestamp).tz(_this.timezone).locale(language);
1083
1092
  }
1084
- return _this.DateTimeParser(timestamp).locale(_this.currentLanguage);
1093
+ return _this.DateTimeParser(timestamp).locale(language);
1085
1094
  };
1086
1095
  }
1087
1096
  /**
@@ -30422,7 +30431,7 @@ var CooldownTimer = function (_a) {
30422
30431
  }, 1000);
30423
30432
  return function () { return clearInterval(countdownInterval); };
30424
30433
  });
30425
- return (React__default["default"].createElement("div", { className: 'str-chat__message-input-cooldown', "data-testid": 'cooldown-timer' }, seconds === 0 ? null : seconds));
30434
+ return (React__default["default"].createElement("div", { className: 'str-chat__message-input-cooldown', "data-testid": 'cooldown-timer' }, seconds));
30426
30435
  };
30427
30436
 
30428
30437
  var useCommandTrigger = function () {
@@ -31138,9 +31147,12 @@ var useCooldownTimer = function () {
31138
31147
  }, [messages, (_a = client.user) === null || _a === void 0 ? void 0 : _a.id, latestMessageDatesByChannels, channel.cid]);
31139
31148
  React.useEffect(function () {
31140
31149
  var timeSinceOwnLastMessage = ownLatestMessageDate
31141
- ? (new Date().getTime() - ownLatestMessageDate.getTime()) / 1000
31150
+ ? // prevent negative values
31151
+ Math.max(0, (new Date().getTime() - ownLatestMessageDate.getTime()) / 1000)
31142
31152
  : undefined;
31143
- setCooldownRemaining(!skipCooldown && timeSinceOwnLastMessage && cooldownInterval > timeSinceOwnLastMessage
31153
+ setCooldownRemaining(!skipCooldown &&
31154
+ typeof timeSinceOwnLastMessage !== 'undefined' &&
31155
+ cooldownInterval > timeSinceOwnLastMessage
31144
31156
  ? Math.round(cooldownInterval - timeSinceOwnLastMessage)
31145
31157
  : 0);
31146
31158
  }, [cooldownInterval, ownLatestMessageDate, skipCooldown]);
@@ -32575,6 +32587,13 @@ var MessageSimpleWithContext = function (props) {
32575
32587
  if (message.deleted_at || message.type === 'deleted') {
32576
32588
  return React__default["default"].createElement(MessageDeleted$1, { message: message });
32577
32589
  }
32590
+ /** FIXME: isReactionEnabled should be removed with next major version and a proper centralized permissions logic should be put in place
32591
+ * With the current permissions implementation it would be sth like:
32592
+ * const messageActions = getMessageActions();
32593
+ * const canReact = messageActions.includes(MESSAGE_ACTIONS.react);
32594
+ */
32595
+ var canReact = isReactionEnabled;
32596
+ var canShowReactions = hasReactions;
32578
32597
  var showMetadata = !groupedByUser || endOfGroup;
32579
32598
  var showReplyCountButton = !threadList && !!message.reply_count;
32580
32599
  var allowRetry = message.status === 'failed' && message.errorStatusCode !== 403;
@@ -32584,7 +32603,7 @@ var MessageSimpleWithContext = function (props) {
32584
32603
  'pinned-message': message.pinned,
32585
32604
  'str-chat__message--has-attachment': hasAttachment,
32586
32605
  'str-chat__message--highlighted': highlighted,
32587
- 'str-chat__message--with-reactions str-chat__message-with-thread-link': hasReactions && isReactionEnabled,
32606
+ 'str-chat__message--with-reactions str-chat__message-with-thread-link': canShowReactions,
32588
32607
  'str-chat__message-send-can-be-retried': (message === null || message === void 0 ? void 0 : message.status) === 'failed' && (message === null || message === void 0 ? void 0 : message.errorStatusCode) !== 403,
32589
32608
  'str-chat__virtual-message__wrapper--end': endOfGroup,
32590
32609
  'str-chat__virtual-message__wrapper--first': firstOfGroup,
@@ -32601,8 +32620,8 @@ var MessageSimpleWithContext = function (props) {
32601
32620
  }), "data-testid": 'message-inner', onClick: allowRetry ? function () { return handleRetry(message); } : undefined, onKeyUp: allowRetry ? function () { return handleRetry(message); } : undefined },
32602
32621
  React__default["default"].createElement(MessageOptions$1, null),
32603
32622
  React__default["default"].createElement("div", { className: 'str-chat__message-reactions-host' },
32604
- hasReactions && isReactionEnabled && React__default["default"].createElement(ReactionsList$1, { reverse: true }),
32605
- showDetailedReactions && isReactionEnabled && (React__default["default"].createElement(ReactionSelector$1, { ref: reactionSelectorRef }))),
32623
+ canShowReactions && React__default["default"].createElement(ReactionsList$1, { reverse: true }),
32624
+ showDetailedReactions && canReact && React__default["default"].createElement(ReactionSelector$1, { ref: reactionSelectorRef })),
32606
32625
  React__default["default"].createElement("div", { className: 'str-chat__message-bubble' },
32607
32626
  ((_a = message.attachments) === null || _a === void 0 ? void 0 : _a.length) && !message.quoted_message ? (React__default["default"].createElement(Attachment, { actionHandler: handleAction, attachments: message.attachments })) : null,
32608
32627
  React__default["default"].createElement(MessageText, { message: message, renderText: renderText }),
@@ -34274,6 +34293,63 @@ var useIsChannelMuted = function (channel) {
34274
34293
  return muted;
34275
34294
  };
34276
34295
 
34296
+ exports.MessageDeliveryStatus = void 0;
34297
+ (function (MessageDeliveryStatus) {
34298
+ MessageDeliveryStatus["DELIVERED"] = "delivered";
34299
+ MessageDeliveryStatus["READ"] = "read";
34300
+ })(exports.MessageDeliveryStatus || (exports.MessageDeliveryStatus = {}));
34301
+ var useMessageDeliveryStatus = function (_a) {
34302
+ var channel = _a.channel, lastMessage = _a.lastMessage;
34303
+ var client = useChatContext().client;
34304
+ var _b = React.useState(), messageDeliveryStatus = _b[0], setMessageDeliveryStatus = _b[1];
34305
+ var isOwnMessage = React.useCallback(function (message) { var _a; return client.user && ((_a = message === null || message === void 0 ? void 0 : message.user) === null || _a === void 0 ? void 0 : _a.id) === client.user.id; }, [client]);
34306
+ React.useEffect(function () {
34307
+ var lastMessageIsOwn = isOwnMessage(lastMessage);
34308
+ if (!(lastMessage === null || lastMessage === void 0 ? void 0 : lastMessage.created_at) || !lastMessageIsOwn)
34309
+ return;
34310
+ var lastMessageCreatedAtDate = typeof lastMessage.created_at === 'string'
34311
+ ? new Date(lastMessage.created_at)
34312
+ : lastMessage.created_at;
34313
+ var channelReadByOthersAfterLastMessageUpdate = Object.values(channel.state.read).some(function (_a) {
34314
+ var channelLastMarkedReadDate = _a.last_read, user = _a.user;
34315
+ var ignoreOwnReadStatus = client.user && user.id !== client.user.id;
34316
+ return ignoreOwnReadStatus && lastMessageCreatedAtDate < channelLastMarkedReadDate;
34317
+ });
34318
+ setMessageDeliveryStatus(channelReadByOthersAfterLastMessageUpdate
34319
+ ? exports.MessageDeliveryStatus.READ
34320
+ : exports.MessageDeliveryStatus.DELIVERED);
34321
+ }, [channel.state.read, client, isOwnMessage, lastMessage]);
34322
+ React.useEffect(function () {
34323
+ var handleMessageNew = function (event) {
34324
+ // the last message is not mine, so do not show the delivery status
34325
+ if (!isOwnMessage(event.message)) {
34326
+ return setMessageDeliveryStatus(undefined);
34327
+ }
34328
+ return setMessageDeliveryStatus(exports.MessageDeliveryStatus.DELIVERED);
34329
+ };
34330
+ channel.on('message.new', handleMessageNew);
34331
+ return function () {
34332
+ channel.off('message.new', handleMessageNew);
34333
+ };
34334
+ }, [channel, client, isOwnMessage]);
34335
+ React.useEffect(function () {
34336
+ if (!isOwnMessage(lastMessage))
34337
+ return;
34338
+ var handleMarkRead = function (event) {
34339
+ var _a, _b;
34340
+ if (((_a = event.user) === null || _a === void 0 ? void 0 : _a.id) !== ((_b = client.user) === null || _b === void 0 ? void 0 : _b.id))
34341
+ setMessageDeliveryStatus(exports.MessageDeliveryStatus.READ);
34342
+ };
34343
+ channel.on('message.read', handleMarkRead);
34344
+ return function () {
34345
+ channel.off('message.read', handleMarkRead);
34346
+ };
34347
+ }, [channel, client, lastMessage, isOwnMessage]);
34348
+ return {
34349
+ messageDeliveryStatus: messageDeliveryStatus,
34350
+ };
34351
+ };
34352
+
34277
34353
  var ChannelPreview = function (props) {
34278
34354
  var channel = props.channel, _a = props.Preview, Preview = _a === void 0 ? ChannelPreviewMessenger : _a, channelUpdateCount = props.channelUpdateCount;
34279
34355
  var _b = useChatContext('ChannelPreview'), activeChannel = _b.channel, client = _b.client, setActiveChannel = _b.setActiveChannel;
@@ -34281,6 +34357,10 @@ var ChannelPreview = function (props) {
34281
34357
  var _d = useChannelPreviewInfo({ channel: channel }), displayImage = _d.displayImage, displayTitle = _d.displayTitle;
34282
34358
  var _e = React.useState(channel.state.messages[channel.state.messages.length - 1]), lastMessage = _e[0], setLastMessage = _e[1];
34283
34359
  var _f = React.useState(0), unread = _f[0], setUnread = _f[1];
34360
+ var messageDeliveryStatus = useMessageDeliveryStatus({
34361
+ channel: channel,
34362
+ lastMessage: lastMessage,
34363
+ }).messageDeliveryStatus;
34284
34364
  var isActive = (activeChannel === null || activeChannel === void 0 ? void 0 : activeChannel.cid) === channel.cid;
34285
34365
  var muted = useIsChannelMuted(channel).muted;
34286
34366
  React.useEffect(function () {
@@ -34320,24 +34400,29 @@ var ChannelPreview = function (props) {
34320
34400
  if (!Preview)
34321
34401
  return null;
34322
34402
  var latestMessage = getLatestMessagePreview(channel, t, userLanguage);
34323
- return (React__default["default"].createElement(Preview, __assign({}, props, { active: isActive, displayImage: displayImage, displayTitle: displayTitle, lastMessage: lastMessage, latestMessage: latestMessage, setActiveChannel: setActiveChannel, unread: unread })));
34403
+ return (React__default["default"].createElement(Preview, __assign({}, props, { active: isActive, displayImage: displayImage, displayTitle: displayTitle, lastMessage: lastMessage, latestMessage: latestMessage, messageDeliveryStatus: messageDeliveryStatus, setActiveChannel: setActiveChannel, unread: unread })));
34324
34404
  };
34325
34405
 
34326
34406
  var isChannel = function (output) { return output.cid != null; };
34327
34407
 
34328
34408
  var useChannelSearch = function (_a) {
34329
- var _b = _a.channelType, channelType = _b === void 0 ? 'messaging' : _b, _c = _a.clearSearchOnClickOutside, clearSearchOnClickOutside = _c === void 0 ? true : _c, _d = _a.disabled, disabled = _d === void 0 ? false : _d, onSearchCallback = _a.onSearch, onSearchExit = _a.onSearchExit, onSelectResult = _a.onSelectResult, _e = _a.searchForChannels, searchForChannels = _e === void 0 ? false : _e, searchFunction = _a.searchFunction, searchQueryParams = _a.searchQueryParams, setChannels = _a.setChannels;
34330
- var _f = useChatContext('useChannelSearch'), client = _f.client, setActiveChannel = _f.setActiveChannel, themeVersion = _f.themeVersion;
34331
- var _g = React.useState(false), inputIsFocused = _g[0], setInputIsFocused = _g[1];
34332
- var _h = React.useState(''), query = _h[0], setQuery = _h[1];
34333
- var _j = React.useState([]), results = _j[0], setResults = _j[1];
34334
- var _k = React.useState(false), searching = _k[0], setSearching = _k[1];
34409
+ var _b = _a.channelType, channelType = _b === void 0 ? 'messaging' : _b, _c = _a.clearSearchOnClickOutside, clearSearchOnClickOutside = _c === void 0 ? true : _c, _d = _a.disabled, disabled = _d === void 0 ? false : _d, onSearchCallback = _a.onSearch, onSearchExit = _a.onSearchExit, onSelectResult = _a.onSelectResult, _e = _a.searchDebounceIntervalMs, searchDebounceIntervalMs = _e === void 0 ? 300 : _e, _f = _a.searchForChannels, searchForChannels = _f === void 0 ? false : _f, searchFunction = _a.searchFunction, searchQueryParams = _a.searchQueryParams, setChannels = _a.setChannels;
34410
+ var _g = useChatContext('useChannelSearch'), client = _g.client, setActiveChannel = _g.setActiveChannel, themeVersion = _g.themeVersion;
34411
+ var _h = React.useState(false), inputIsFocused = _h[0], setInputIsFocused = _h[1];
34412
+ var _j = React.useState(''), query = _j[0], setQuery = _j[1];
34413
+ var _k = React.useState([]), results = _k[0], setResults = _k[1];
34414
+ var _l = React.useState(false), searching = _l[0], setSearching = _l[1];
34415
+ var searchQueryPromiseInProgress = React.useRef();
34416
+ var shouldIgnoreQueryResults = React.useRef(false);
34335
34417
  var inputRef = React.useRef(null);
34336
34418
  var searchBarRef = React.useRef(null);
34337
34419
  var clearState = React.useCallback(function () {
34338
34420
  setQuery('');
34339
34421
  setResults([]);
34340
34422
  setSearching(false);
34423
+ if (searchQueryPromiseInProgress.current) {
34424
+ shouldIgnoreQueryResults.current = true;
34425
+ }
34341
34426
  }, []);
34342
34427
  var activateSearch = React.useCallback(function () {
34343
34428
  setInputIsFocused(true);
@@ -34420,45 +34505,56 @@ var useChannelSearch = function (_a) {
34420
34505
  });
34421
34506
  }); }, [clearSearchOnClickOutside, client, exitSearch, onSelectResult, setActiveChannel, setChannels]);
34422
34507
  var getChannels = React.useCallback(function (text) { return __awaiter(void 0, void 0, void 0, function () {
34423
- var userResponse, channelResponse, _a, channels, users_1, users, error_1;
34508
+ var results, userQueryPromise, users, channelQueryPromise, _a, channels, users, error_1;
34424
34509
  var _b, _c, _d, _e, _f, _g;
34425
34510
  return __generator(this, function (_h) {
34426
34511
  switch (_h.label) {
34427
34512
  case 0:
34428
- if (!text || searching)
34429
- return [2 /*return*/];
34430
- setSearching(true);
34513
+ results = [];
34431
34514
  _h.label = 1;
34432
34515
  case 1:
34433
34516
  _h.trys.push([1, 6, , 7]);
34434
- return [4 /*yield*/, client.queryUsers(__assign({ $or: [{ id: { $autocomplete: text } }, { name: { $autocomplete: text } }], id: { $ne: client.userID } }, (_b = searchQueryParams === null || searchQueryParams === void 0 ? void 0 : searchQueryParams.userFilters) === null || _b === void 0 ? void 0 : _b.filters), __assign({ id: 1 }, (_c = searchQueryParams === null || searchQueryParams === void 0 ? void 0 : searchQueryParams.userFilters) === null || _c === void 0 ? void 0 : _c.sort), __assign({ limit: 8 }, (_d = searchQueryParams === null || searchQueryParams === void 0 ? void 0 : searchQueryParams.userFilters) === null || _d === void 0 ? void 0 : _d.options))];
34517
+ userQueryPromise = client.queryUsers(__assign({ $or: [{ id: { $autocomplete: text } }, { name: { $autocomplete: text } }], id: { $ne: client.userID } }, (_b = searchQueryParams === null || searchQueryParams === void 0 ? void 0 : searchQueryParams.userFilters) === null || _b === void 0 ? void 0 : _b.filters), __assign({ id: 1 }, (_c = searchQueryParams === null || searchQueryParams === void 0 ? void 0 : searchQueryParams.userFilters) === null || _c === void 0 ? void 0 : _c.sort), __assign({ limit: 8 }, (_d = searchQueryParams === null || searchQueryParams === void 0 ? void 0 : searchQueryParams.userFilters) === null || _d === void 0 ? void 0 : _d.options));
34518
+ if (!!searchForChannels) return [3 /*break*/, 3];
34519
+ searchQueryPromiseInProgress.current = userQueryPromise;
34520
+ return [4 /*yield*/, searchQueryPromiseInProgress.current];
34435
34521
  case 2:
34436
- userResponse = _h.sent();
34437
- if (!searchForChannels) return [3 /*break*/, 4];
34438
- channelResponse = client.queryChannels(__assign({ name: { $autocomplete: text } }, (_e = searchQueryParams === null || searchQueryParams === void 0 ? void 0 : searchQueryParams.channelFilters) === null || _e === void 0 ? void 0 : _e.filters), ((_f = searchQueryParams === null || searchQueryParams === void 0 ? void 0 : searchQueryParams.channelFilters) === null || _f === void 0 ? void 0 : _f.sort) || {}, __assign({ limit: 5 }, (_g = searchQueryParams === null || searchQueryParams === void 0 ? void 0 : searchQueryParams.channelFilters) === null || _g === void 0 ? void 0 : _g.options));
34439
- return [4 /*yield*/, Promise.all([channelResponse, userResponse])];
34440
- case 3:
34441
- _a = _h.sent(), channels = _a[0], users_1 = _a[1].users;
34442
- setResults(__spreadArray(__spreadArray([], channels, true), users_1, true));
34443
- setSearching(false);
34444
- return [2 /*return*/];
34445
- case 4: return [4 /*yield*/, Promise.resolve(userResponse)];
34446
- case 5:
34447
34522
  users = (_h.sent()).users;
34448
- setResults(users);
34449
- return [3 /*break*/, 7];
34523
+ results = users;
34524
+ return [3 /*break*/, 5];
34525
+ case 3:
34526
+ channelQueryPromise = client.queryChannels(__assign({ name: { $autocomplete: text } }, (_e = searchQueryParams === null || searchQueryParams === void 0 ? void 0 : searchQueryParams.channelFilters) === null || _e === void 0 ? void 0 : _e.filters), ((_f = searchQueryParams === null || searchQueryParams === void 0 ? void 0 : searchQueryParams.channelFilters) === null || _f === void 0 ? void 0 : _f.sort) || {}, __assign({ limit: 5 }, (_g = searchQueryParams === null || searchQueryParams === void 0 ? void 0 : searchQueryParams.channelFilters) === null || _g === void 0 ? void 0 : _g.options));
34527
+ searchQueryPromiseInProgress.current = Promise.all([
34528
+ channelQueryPromise,
34529
+ userQueryPromise,
34530
+ ]);
34531
+ return [4 /*yield*/, searchQueryPromiseInProgress.current];
34532
+ case 4:
34533
+ _a = _h.sent(), channels = _a[0], users = _a[1].users;
34534
+ results = __spreadArray(__spreadArray([], channels, true), users, true);
34535
+ _h.label = 5;
34536
+ case 5: return [3 /*break*/, 7];
34450
34537
  case 6:
34451
34538
  error_1 = _h.sent();
34452
- clearState();
34453
34539
  console.error(error_1);
34454
34540
  return [3 /*break*/, 7];
34455
34541
  case 7:
34456
34542
  setSearching(false);
34543
+ if (!shouldIgnoreQueryResults.current) {
34544
+ setResults(results);
34545
+ }
34546
+ else {
34547
+ shouldIgnoreQueryResults.current = false;
34548
+ }
34549
+ searchQueryPromiseInProgress.current = undefined;
34457
34550
  return [2 /*return*/];
34458
34551
  }
34459
34552
  });
34460
- }); }, [client, searching, searchForChannels]);
34461
- var getChannelsThrottled = throttle__default["default"](getChannels, 200);
34553
+ }); }, [client, searchForChannels, searchQueryParams]);
34554
+ var scheduleGetChannels = React.useCallback(debounce__default["default"](getChannels, searchDebounceIntervalMs), [
34555
+ getChannels,
34556
+ searchDebounceIntervalMs,
34557
+ ]);
34462
34558
  var onSearch = React.useCallback(function (event) {
34463
34559
  event.preventDefault();
34464
34560
  if (disabled)
@@ -34470,12 +34566,17 @@ var useChannelSearch = function (_a) {
34470
34566
  setSearching: setSearching,
34471
34567
  }, event);
34472
34568
  }
34473
- else {
34569
+ else if (event.target.value) {
34570
+ setSearching(true);
34474
34571
  setQuery(event.target.value);
34475
- getChannelsThrottled(event.target.value);
34572
+ scheduleGetChannels(event.target.value);
34573
+ }
34574
+ else if (!event.target.value) {
34575
+ clearState();
34576
+ scheduleGetChannels.cancel();
34476
34577
  }
34477
34578
  onSearchCallback === null || onSearchCallback === void 0 ? void 0 : onSearchCallback(event);
34478
- }, [disabled, getChannelsThrottled, onSearchCallback, searchFunction]);
34579
+ }, [clearState, disabled, scheduleGetChannels, onSearchCallback, searchFunction]);
34479
34580
  return {
34480
34581
  activateSearch: activateSearch,
34481
34582
  clearState: clearState,
@@ -34868,7 +34969,7 @@ var UnMemoizedChannelList = function (props) {
34868
34969
  */
34869
34970
  var ChannelList = React__default["default"].memo(UnMemoizedChannelList);
34870
34971
 
34871
- var version = '10.10.2';
34972
+ var version = '10.12.0';
34872
34973
 
34873
34974
  var useChat = function (_a) {
34874
34975
  var _b, _c;
@@ -35520,7 +35621,7 @@ notifications) {
35520
35621
  var reactionHandlerWarning = "Reaction handler was called, but it is missing one of its required arguments.\nMake sure the ChannelAction and ChannelState contexts are properly set and the hook is initialized with a valid message.";
35521
35622
  var useReactionHandler = function (message) {
35522
35623
  var updateMessage = useChannelActionContext('useReactionHandler').updateMessage;
35523
- var channel = useChannelStateContext('useReactionHandler').channel;
35624
+ var _a = useChannelStateContext('useReactionHandler'), channel = _a.channel, channelCapabilities = _a.channelCapabilities;
35524
35625
  var client = useChatContext('useReactionHandler').client;
35525
35626
  var createMessagePreview = React.useCallback(function (add, reaction, message) {
35526
35627
  var _a, _b;
@@ -35544,7 +35645,7 @@ var useReactionHandler = function (message) {
35544
35645
  ? __spreadArray([reaction], ((message === null || message === void 0 ? void 0 : message.own_reactions) || []), true) : (_b = message === null || message === void 0 ? void 0 : message.own_reactions) === null || _b === void 0 ? void 0 : _b.filter(function (item) { return item.type !== reaction.type; });
35545
35646
  return __assign(__assign({}, message), { latest_reactions: newReactions || message.latest_reactions, own_reactions: newOwnReactions, reaction_counts: newReactionCounts, reaction_scores: newReactionCounts });
35546
35647
  }, [client.user, client.userID]);
35547
- var creatReactionPreview = function (type) {
35648
+ var createReactionPreview = function (type) {
35548
35649
  var _a;
35549
35650
  return ({
35550
35651
  message_id: message === null || message === void 0 ? void 0 : message.id,
@@ -35556,33 +35657,32 @@ var useReactionHandler = function (message) {
35556
35657
  };
35557
35658
  var toggleReaction = throttle__default["default"](function (id, type, add) { return __awaiter(void 0, void 0, void 0, function () {
35558
35659
  var newReaction, tempMessage, messageResponse, _a;
35559
- var _b;
35560
- return __generator(this, function (_c) {
35561
- switch (_c.label) {
35660
+ return __generator(this, function (_b) {
35661
+ switch (_b.label) {
35562
35662
  case 0:
35563
- if (!message || ((_b = channel.data) === null || _b === void 0 ? void 0 : _b.frozen))
35663
+ if (!message || !channelCapabilities['send-reaction'])
35564
35664
  return [2 /*return*/];
35565
- newReaction = creatReactionPreview(type);
35665
+ newReaction = createReactionPreview(type);
35566
35666
  tempMessage = createMessagePreview(add, newReaction, message);
35567
- _c.label = 1;
35667
+ _b.label = 1;
35568
35668
  case 1:
35569
- _c.trys.push([1, 6, , 7]);
35669
+ _b.trys.push([1, 6, , 7]);
35570
35670
  updateMessage(tempMessage);
35571
35671
  if (!add) return [3 /*break*/, 3];
35572
35672
  return [4 /*yield*/, channel.sendReaction(id, { type: type })];
35573
35673
  case 2:
35574
- _a = _c.sent();
35674
+ _a = _b.sent();
35575
35675
  return [3 /*break*/, 5];
35576
35676
  case 3: return [4 /*yield*/, channel.deleteReaction(id, type)];
35577
35677
  case 4:
35578
- _a = _c.sent();
35579
- _c.label = 5;
35678
+ _a = _b.sent();
35679
+ _b.label = 5;
35580
35680
  case 5:
35581
35681
  messageResponse = _a;
35582
35682
  updateMessage(messageResponse.message);
35583
35683
  return [3 /*break*/, 7];
35584
35684
  case 6:
35585
- _c.sent();
35685
+ _b.sent();
35586
35686
  // revert to the original message if the API call fails
35587
35687
  updateMessage(message);
35588
35688
  return [3 /*break*/, 7];
@@ -35637,12 +35737,10 @@ var useReactionHandler = function (message) {
35637
35737
  }); };
35638
35738
  };
35639
35739
  var useReactionClick = function (message, reactionSelectorRef, messageWrapperRef, closeReactionSelectorOnClick) {
35640
- var _a;
35641
- var _b = useChannelStateContext('useReactionClick'), channel = _b.channel, _c = _b.channelCapabilities, channelCapabilities = _c === void 0 ? {} : _c, channelConfig = _b.channelConfig;
35642
- var _d = React.useState(false), showDetailedReactions = _d[0], setShowDetailedReactions = _d[1];
35740
+ var _a = useChannelStateContext('useReactionClick').channelCapabilities, channelCapabilities = _a === void 0 ? {} : _a;
35741
+ var _b = React.useState(false), showDetailedReactions = _b[0], setShowDetailedReactions = _b[1];
35643
35742
  var hasListener = React.useRef(false);
35644
- var isFrozen = !!((_a = channel.data) === null || _a === void 0 ? void 0 : _a.frozen);
35645
- var isReactionEnabled = ((channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.reactions) !== false && channelCapabilities['send-reaction']) || isFrozen;
35743
+ var isReactionEnabled = channelCapabilities['send-reaction'];
35646
35744
  var messageDeleted = !!(message === null || message === void 0 ? void 0 : message.deleted_at);
35647
35745
  var closeDetailedReactions = React.useCallback(function (event) {
35648
35746
  var _a;
@@ -35690,9 +35788,8 @@ var useReactionClick = function (message, reactionSelectorRef, messageWrapperRef
35690
35788
  }
35691
35789
  }, [messageDeleted, closeDetailedReactions, messageWrapperRef]);
35692
35790
  var onReactionListClick = function (event) {
35693
- if (event === null || event === void 0 ? void 0 : event.stopPropagation) {
35694
- event.stopPropagation();
35695
- }
35791
+ var _a;
35792
+ (_a = event === null || event === void 0 ? void 0 : event.stopPropagation) === null || _a === void 0 ? void 0 : _a.call(event);
35696
35793
  setShowDetailedReactions(function (prev) { return !prev; });
35697
35794
  };
35698
35795
  return {