stream-chat-react 10.0.0-theming-v2.2 → 10.0.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.
Files changed (93) hide show
  1. package/dist/browser.full-bundle.js +1839 -2237
  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/Attachment/AttachmentActions.d.ts.map +1 -1
  6. package/dist/components/Attachment/AttachmentActions.js +1 -1
  7. package/dist/components/Attachment/AttachmentContainer.js +2 -2
  8. package/dist/components/AutoCompleteTextarea/Textarea.d.ts +7 -0
  9. package/dist/components/AutoCompleteTextarea/Textarea.d.ts.map +1 -1
  10. package/dist/components/AutoCompleteTextarea/Textarea.js +10 -1
  11. package/dist/components/Channel/Channel.d.ts.map +1 -1
  12. package/dist/components/Channel/Channel.js +31 -23
  13. package/dist/components/ChannelList/ChannelList.d.ts +3 -9
  14. package/dist/components/ChannelList/ChannelList.d.ts.map +1 -1
  15. package/dist/components/ChannelList/ChannelList.js +24 -26
  16. package/dist/components/ChannelSearch/ChannelSearch.d.ts +6 -3
  17. package/dist/components/ChannelSearch/ChannelSearch.d.ts.map +1 -1
  18. package/dist/components/ChannelSearch/ChannelSearch.js +19 -2
  19. package/dist/components/ChannelSearch/SearchBar.js +1 -1
  20. package/dist/components/ChannelSearch/SearchInput.d.ts +3 -1
  21. package/dist/components/ChannelSearch/SearchInput.d.ts.map +1 -1
  22. package/dist/components/ChannelSearch/SearchInput.js +2 -2
  23. package/dist/components/ChannelSearch/SearchResults.js +1 -2
  24. package/dist/components/ChannelSearch/hooks/useChannelSearch.d.ts +9 -7
  25. package/dist/components/ChannelSearch/hooks/useChannelSearch.d.ts.map +1 -1
  26. package/dist/components/ChannelSearch/hooks/useChannelSearch.js +23 -29
  27. package/dist/components/Message/MessageStatus.d.ts.map +1 -1
  28. package/dist/components/Message/MessageStatus.js +32 -30
  29. package/dist/components/MessageActions/MessageActionsBox.js +1 -1
  30. package/dist/components/MessageInput/CooldownTimer.d.ts +7 -0
  31. package/dist/components/MessageInput/CooldownTimer.d.ts.map +1 -0
  32. package/dist/components/MessageInput/CooldownTimer.js +17 -0
  33. package/dist/components/MessageInput/MessageInputFlat.d.ts.map +1 -1
  34. package/dist/components/MessageInput/MessageInputFlat.js +6 -3
  35. package/dist/components/MessageInput/MessageInputSmall.d.ts.map +1 -1
  36. package/dist/components/MessageInput/MessageInputSmall.js +1 -1
  37. package/dist/components/MessageInput/hooks/useCooldownTimer.d.ts +0 -5
  38. package/dist/components/MessageInput/hooks/useCooldownTimer.d.ts.map +1 -1
  39. package/dist/components/MessageInput/hooks/useCooldownTimer.js +1 -17
  40. package/dist/components/MessageInput/icons.d.ts.map +1 -1
  41. package/dist/components/MessageInput/icons.js +3 -2
  42. package/dist/components/MessageInput/index.d.ts +1 -0
  43. package/dist/components/MessageInput/index.d.ts.map +1 -1
  44. package/dist/components/MessageInput/index.js +1 -0
  45. package/dist/components/Reactions/ReactionsList.d.ts.map +1 -1
  46. package/dist/components/Reactions/ReactionsList.js +18 -3
  47. package/dist/components/Reactions/hooks/useProcessReactions.d.ts +1 -0
  48. package/dist/components/Reactions/hooks/useProcessReactions.d.ts.map +1 -1
  49. package/dist/components/Reactions/hooks/useProcessReactions.js +11 -0
  50. package/dist/components/Tooltip/Tooltip.d.ts +14 -2
  51. package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
  52. package/dist/components/Tooltip/Tooltip.js +22 -3
  53. package/dist/components/Tooltip/hooks/index.d.ts +2 -0
  54. package/dist/components/Tooltip/hooks/index.d.ts.map +1 -0
  55. package/dist/components/Tooltip/hooks/index.js +1 -0
  56. package/dist/components/Tooltip/hooks/useEnterLeaveHandlers.d.ts +7 -0
  57. package/dist/components/Tooltip/hooks/useEnterLeaveHandlers.d.ts.map +1 -0
  58. package/dist/components/Tooltip/hooks/useEnterLeaveHandlers.js +14 -0
  59. package/dist/context/ChannelActionContext.d.ts +1 -1
  60. package/dist/context/ChannelActionContext.d.ts.map +1 -1
  61. package/dist/context/ChannelStateContext.d.ts +1 -1
  62. package/dist/context/ComponentContext.d.ts +1 -1
  63. package/dist/context/ComponentContext.d.ts.map +1 -1
  64. package/dist/context/DefaultEmoji.d.ts +3 -0
  65. package/dist/context/DefaultEmoji.d.ts.map +1 -0
  66. package/dist/context/DefaultEmoji.js +3 -0
  67. package/dist/context/DefaultEmojiPicker.d.ts +3 -0
  68. package/dist/context/DefaultEmojiPicker.d.ts.map +1 -0
  69. package/dist/context/DefaultEmojiPicker.js +3 -0
  70. package/dist/context/EmojiContext.d.ts.map +1 -1
  71. package/dist/context/EmojiContext.js +2 -58
  72. package/dist/css/index.css +1 -1
  73. package/dist/css/index.css.map +1 -1
  74. package/dist/css/v2/index.css +1 -1
  75. package/dist/css/v2/index.css.map +1 -1
  76. package/dist/css/v2/index.layout.css +1 -1
  77. package/dist/css/v2/index.layout.css.map +1 -1
  78. package/dist/index.cjs.js +1275 -1647
  79. package/dist/index.cjs.js.map +1 -1
  80. package/dist/scss/Attachment.scss +45 -2
  81. package/dist/scss/Gallery.scss +12 -6
  82. package/dist/scss/ImageCarousel.scss +6 -0
  83. package/dist/scss/Message.scss +8 -2
  84. package/dist/scss/MessageInput.scss +1 -0
  85. package/dist/scss/v2/AttachmentList/AttachmentList-layout.scss +72 -46
  86. package/dist/scss/v2/Autocomplete/Autocomplete-layout.scss +2 -0
  87. package/dist/scss/v2/Message/Message-layout.scss +7 -18
  88. package/dist/scss/v2/MessageReactions/MessageReactions-layout.scss +1 -10
  89. package/dist/scss/v2/Tooltip/Tooltip-layout.scss +2 -23
  90. package/dist/version.d.ts +1 -1
  91. package/dist/version.d.ts.map +1 -1
  92. package/dist/version.js +1 -1
  93. package/package.json +7 -9
@@ -54,38 +54,37 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
54
54
  }
55
55
  return to.concat(ar || Array.prototype.slice.call(from));
56
56
  };
57
- import { useEffect, useRef, useState } from 'react';
57
+ import { useCallback, useEffect, useRef, useState } from 'react';
58
58
  import throttle from 'lodash.throttle';
59
59
  import uniqBy from 'lodash.uniqby';
60
60
  import { isChannel } from '../utils';
61
61
  import { useChatContext } from '../../../context/ChatContext';
62
62
  export var useChannelSearch = function (_a) {
63
- var _b = _a.channelType, channelType = _b === void 0 ? 'messaging' : _b, _c = _a.clearSearchOnClickOutside, clearSearchOnClickOutside = _c === void 0 ? true : _c, _d = _a.enabled, enabled = _d === void 0 ? false : _d, onSelectResult = _a.onSelectResult, _e = _a.searchForChannels, searchForChannels = _e === void 0 ? false : _e, searchFunction = _a.searchFunction, searchQueryParams = _a.searchQueryParams, setChannels = _a.setChannels;
63
+ 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;
64
64
  var _f = useChatContext('useChannelSearch'), client = _f.client, navOpen = _f.navOpen, setActiveChannel = _f.setActiveChannel, themeVersion = _f.themeVersion;
65
65
  var _g = useState(false), inputIsFocused = _g[0], setInputIsFocused = _g[1];
66
66
  var _h = useState(''), query = _h[0], setQuery = _h[1];
67
67
  var _j = useState([]), results = _j[0], setResults = _j[1];
68
- var _k = useState(false), resultsOpen = _k[0], setResultsOpen = _k[1];
69
- var _l = useState(false), searching = _l[0], setSearching = _l[1];
68
+ var _k = useState(false), searching = _k[0], setSearching = _k[1];
70
69
  var inputRef = useRef(null);
71
70
  var searchBarRef = useRef(null);
72
- var clearState = function () {
71
+ var clearState = useCallback(function () {
73
72
  setQuery('');
74
73
  setResults([]);
75
- setResultsOpen(false);
76
74
  setSearching(false);
77
- };
78
- var activateSearch = function () {
75
+ }, []);
76
+ var activateSearch = useCallback(function () {
79
77
  setInputIsFocused(true);
80
- };
81
- var exitSearch = function () {
78
+ }, []);
79
+ var exitSearch = useCallback(function () {
82
80
  var _a;
83
81
  setInputIsFocused(false);
84
82
  (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.blur();
85
83
  clearState();
86
- };
84
+ onSearchExit === null || onSearchExit === void 0 ? void 0 : onSearchExit();
85
+ }, [clearState, onSearchExit]);
87
86
  useEffect(function () {
88
- if (!enabled)
87
+ if (disabled)
89
88
  return;
90
89
  var clickListener = function (event) {
91
90
  var _a, _b;
@@ -96,17 +95,15 @@ export var useChannelSearch = function (_a) {
96
95
  : (_b = inputRef.current) === null || _b === void 0 ? void 0 : _b.contains(event.target);
97
96
  if (isInputClick)
98
97
  return;
99
- if ((navOpen && inputIsFocused) ||
100
- (resultsOpen && clearSearchOnClickOutside) ||
101
- (inputIsFocused && !query)) {
98
+ if ((inputIsFocused && (!query || navOpen)) || clearSearchOnClickOutside) {
102
99
  exitSearch();
103
100
  }
104
101
  };
105
102
  document.addEventListener('click', clickListener);
106
103
  return function () { return document.removeEventListener('click', clickListener); };
107
- }, [enabled, inputIsFocused, resultsOpen]);
104
+ }, [disabled, inputIsFocused]);
108
105
  useEffect(function () {
109
- if (!(inputRef.current && enabled))
106
+ if (!inputRef.current || disabled)
110
107
  return;
111
108
  var handleKeyDown = function (event) {
112
109
  if (event.key === 'Escape')
@@ -118,7 +115,7 @@ export var useChannelSearch = function (_a) {
118
115
  (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.removeEventListener('keydown', handleKeyDown);
119
116
  };
120
117
  }, []);
121
- var selectResult = function (result) { return __awaiter(void 0, void 0, void 0, function () {
118
+ var selectResult = useCallback(function (result) { return __awaiter(void 0, void 0, void 0, function () {
122
119
  var selectedChannel, newChannel;
123
120
  return __generator(this, function (_a) {
124
121
  switch (_a.label) {
@@ -129,7 +126,6 @@ export var useChannelSearch = function (_a) {
129
126
  return [4 /*yield*/, onSelectResult({
130
127
  setQuery: setQuery,
131
128
  setResults: setResults,
132
- setResultsOpen: setResultsOpen,
133
129
  setSearching: setSearching,
134
130
  }, result)];
135
131
  case 1:
@@ -151,13 +147,13 @@ export var useChannelSearch = function (_a) {
151
147
  case 5:
152
148
  setChannels(function (channels) { return uniqBy(__spreadArray([selectedChannel], channels, true), 'cid'); });
153
149
  if (clearSearchOnClickOutside) {
154
- clearState();
150
+ exitSearch();
155
151
  }
156
152
  return [2 /*return*/];
157
153
  }
158
154
  });
159
- }); };
160
- var getChannels = function (text) { return __awaiter(void 0, void 0, void 0, function () {
155
+ }); }, [clearSearchOnClickOutside, client, exitSearch, onSelectResult]);
156
+ var getChannels = useCallback(function (text) { return __awaiter(void 0, void 0, void 0, function () {
161
157
  var userResponse, channelResponse, _a, channels, users_1, users, error_1;
162
158
  var _b, _c, _d, _e, _f, _g;
163
159
  return __generator(this, function (_h) {
@@ -178,14 +174,12 @@ export var useChannelSearch = function (_a) {
178
174
  case 3:
179
175
  _a = _h.sent(), channels = _a[0], users_1 = _a[1].users;
180
176
  setResults(__spreadArray(__spreadArray([], channels, true), users_1, true));
181
- setResultsOpen(true);
182
177
  setSearching(false);
183
178
  return [2 /*return*/];
184
179
  case 4: return [4 /*yield*/, Promise.resolve(userResponse)];
185
180
  case 5:
186
181
  users = (_h.sent()).users;
187
182
  setResults(users);
188
- setResultsOpen(true);
189
183
  return [3 /*break*/, 7];
190
184
  case 6:
191
185
  error_1 = _h.sent();
@@ -197,17 +191,16 @@ export var useChannelSearch = function (_a) {
197
191
  return [2 /*return*/];
198
192
  }
199
193
  });
200
- }); };
194
+ }); }, [client, searching]);
201
195
  var getChannelsThrottled = throttle(getChannels, 200);
202
- var onSearch = function (event) {
196
+ var onSearch = useCallback(function (event) {
203
197
  event.preventDefault();
204
- if (!enabled)
198
+ if (disabled)
205
199
  return;
206
200
  if (searchFunction) {
207
201
  searchFunction({
208
202
  setQuery: setQuery,
209
203
  setResults: setResults,
210
- setResultsOpen: setResultsOpen,
211
204
  setSearching: setSearching,
212
205
  }, event);
213
206
  }
@@ -215,7 +208,8 @@ export var useChannelSearch = function (_a) {
215
208
  setQuery(event.target.value);
216
209
  getChannelsThrottled(event.target.value);
217
210
  }
218
- };
211
+ onSearchCallback === null || onSearchCallback === void 0 ? void 0 : onSearchCallback(event);
212
+ }, [disabled, getChannelsThrottled, searchFunction]);
219
213
  return {
220
214
  activateSearch: activateSearch,
221
215
  clearState: clearState,
@@ -1 +1 @@
1
- {"version":3,"file":"MessageStatus.d.ts","sourceRoot":"","sources":["../../../src/components/Message/MessageStatus.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAA2C,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAEzF,OAAO,EAAE,WAAW,EAA2B,MAAM,WAAW,CAAC;AASjE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAEnE,oBAAY,kBAAkB,GAAG;IAC/B,MAAM,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;CAC/C,CAAC;AA2FF,eAAO,MAAM,aAAa,4FA5EjB,kBAAkB,uBA4EuE,CAAC"}
1
+ {"version":3,"file":"MessageStatus.d.ts","sourceRoot":"","sources":["../../../src/components/Message/MessageStatus.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAIxC,OAAO,EAA2C,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAEzF,OAAO,EAAE,WAAW,EAA2B,MAAM,WAAW,CAAC;AAUjE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAEnE,oBAAY,kBAAkB,GAAG;IAC/B,MAAM,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;CAC/C,CAAC;AA0HF,eAAO,MAAM,aAAa,4FArHjB,kBAAkB,uBAqHuE,CAAC"}
@@ -1,51 +1,53 @@
1
- import React from 'react';
1
+ import React, { useState } from 'react';
2
+ import clsx from 'clsx';
2
3
  import { DeliveredCheckIcon, MessageDeliveredIcon } from './icons';
3
4
  import { getReadByTooltipText, mapToUserNameOrId } from './utils';
4
5
  import { Avatar as DefaultAvatar } from '../Avatar';
5
6
  import { LoadingIndicator } from '../Loading';
6
- import { Tooltip } from '../Tooltip';
7
+ import { PopperTooltip, Tooltip } from '../Tooltip';
8
+ import { useEnterLeaveHandlers } from '../Tooltip/hooks';
7
9
  import { useChatContext } from '../../context/ChatContext';
8
10
  import { useComponentContext } from '../../context/ComponentContext';
9
11
  import { useMessageContext } from '../../context/MessageContext';
10
12
  import { useTranslationContext } from '../../context/TranslationContext';
11
- // TODO: remove after fully deprecating V1 theming
12
- var TooltipContainer = function (_a) {
13
- var children = _a.children;
14
- var themeVersion = useChatContext('TooltipContainer').themeVersion;
15
- return themeVersion === '2' ? (React.createElement("div", { className: 'str-chat__message-status-tooltip-container' }, children)) : (React.createElement(React.Fragment, null, children));
16
- };
17
13
  var UnMemoizedMessageStatus = function (props) {
18
14
  var _a;
19
15
  var propAvatar = props.Avatar, _b = props.messageType, messageType = _b === void 0 ? 'simple' : _b, _c = props.tooltipUserNameMapper, tooltipUserNameMapper = _c === void 0 ? mapToUserNameOrId : _c;
16
+ var _d = useEnterLeaveHandlers(), handleEnter = _d.handleEnter, handleLeave = _d.handleLeave, tooltipVisible = _d.tooltipVisible;
20
17
  var client = useChatContext('MessageStatus').client;
21
18
  var contextAvatar = useComponentContext('MessageStatus').Avatar;
22
- var _d = useMessageContext('MessageStatus'), isMyMessage = _d.isMyMessage, lastReceivedId = _d.lastReceivedId, message = _d.message, readBy = _d.readBy, threadList = _d.threadList;
19
+ var _e = useMessageContext('MessageStatus'), isMyMessage = _e.isMyMessage, lastReceivedId = _e.lastReceivedId, message = _e.message, readBy = _e.readBy, threadList = _e.threadList;
23
20
  var t = useTranslationContext('MessageStatus').t;
24
21
  var themeVersion = useChatContext('MessageStatus').themeVersion;
22
+ var _f = useState(null), referenceElement = _f[0], setReferenceElement = _f[1];
25
23
  var Avatar = propAvatar || contextAvatar || DefaultAvatar;
26
- if (!isMyMessage() || message.type === 'error') {
24
+ if (!isMyMessage() || message.type === 'error')
27
25
  return null;
28
- }
29
26
  var justReadByMe = (readBy === null || readBy === void 0 ? void 0 : readBy.length) === 1 && readBy[0].id === ((_a = client.user) === null || _a === void 0 ? void 0 : _a.id);
30
27
  var rootClassName = "str-chat__message-".concat(messageType, "-status str-chat__message-status");
31
- if (message.status === 'sending') {
32
- return (React.createElement("span", { className: rootClassName, "data-testid": 'message-status-sending' },
33
- React.createElement(Tooltip, null, t('Sending...')),
34
- React.createElement(LoadingIndicator, null)));
35
- }
36
- if ((readBy === null || readBy === void 0 ? void 0 : readBy.length) && !threadList && !justReadByMe) {
37
- var lastReadUser = readBy.filter(function (item) { var _a; return item.id !== ((_a = client.user) === null || _a === void 0 ? void 0 : _a.id); })[0];
38
- return (React.createElement("span", { className: rootClassName, "data-testid": 'message-status-read-by' },
39
- React.createElement(TooltipContainer, null,
40
- React.createElement(Tooltip, null, getReadByTooltipText(readBy, t, client, tooltipUserNameMapper)),
41
- React.createElement(Avatar, { image: lastReadUser.image, name: lastReadUser.name || lastReadUser.id, size: 15, user: lastReadUser })),
42
- readBy.length > 2 && (React.createElement("span", { className: "str-chat__message-".concat(messageType, "-status-number"), "data-testid": 'message-status-read-by-many' }, readBy.length - 1))));
43
- }
44
- if (message.status === 'received' && message.id === lastReceivedId && !threadList) {
45
- return (React.createElement("span", { className: rootClassName, "data-testid": 'message-status-received' },
46
- React.createElement(Tooltip, null, t('Delivered')),
47
- themeVersion === '2' ? React.createElement(MessageDeliveredIcon, null) : React.createElement(DeliveredCheckIcon, null)));
48
- }
49
- return null;
28
+ var sending = message.status === 'sending';
29
+ var delivered = message.status === 'received' && message.id === lastReceivedId && !threadList;
30
+ var deliveredAndRead = !!((readBy === null || readBy === void 0 ? void 0 : readBy.length) && !threadList && !justReadByMe);
31
+ var lastReadUser = (deliveredAndRead
32
+ ? readBy.filter(function (item) { var _a; return item.id !== ((_a = client.user) === null || _a === void 0 ? void 0 : _a.id); })
33
+ : [])[0];
34
+ return (React.createElement("span", { className: rootClassName, "data-testid": clsx({
35
+ 'message-status-read-by': deliveredAndRead,
36
+ 'message-status-received': delivered && !deliveredAndRead,
37
+ 'message-status-sending': sending,
38
+ }), onMouseEnter: handleEnter, onMouseLeave: handleLeave, ref: setReferenceElement },
39
+ sending && (React.createElement(React.Fragment, null,
40
+ themeVersion === '1' && React.createElement(Tooltip, null, t('Sending...')),
41
+ themeVersion === '2' && (React.createElement(PopperTooltip, { offset: [0, 5], referenceElement: referenceElement, visible: tooltipVisible }, t('Sending...'))),
42
+ React.createElement(LoadingIndicator, null))),
43
+ delivered && !deliveredAndRead && (React.createElement(React.Fragment, null,
44
+ themeVersion === '1' && React.createElement(Tooltip, null, t('Delivered')),
45
+ themeVersion === '2' && (React.createElement(PopperTooltip, { offset: [0, 5], referenceElement: referenceElement, visible: tooltipVisible }, t('Delivered'))),
46
+ themeVersion === '2' ? React.createElement(MessageDeliveredIcon, null) : React.createElement(DeliveredCheckIcon, null))),
47
+ deliveredAndRead && (React.createElement(React.Fragment, null,
48
+ themeVersion === '1' && (React.createElement(Tooltip, null, getReadByTooltipText(readBy, t, client, tooltipUserNameMapper))),
49
+ themeVersion === '2' && (React.createElement(PopperTooltip, { offset: [0, 5], referenceElement: referenceElement, visible: tooltipVisible }, getReadByTooltipText(readBy, t, client, tooltipUserNameMapper))),
50
+ React.createElement(Avatar, { image: lastReadUser.image, name: lastReadUser.name || lastReadUser.id, size: 15, user: lastReadUser }),
51
+ readBy.length > 2 && (React.createElement("span", { className: "str-chat__message-".concat(messageType, "-status-number"), "data-testid": 'message-status-read-by-many' }, readBy.length - 1))))));
50
52
  };
51
53
  export var MessageStatus = React.memo(UnMemoizedMessageStatus);
@@ -9,7 +9,7 @@ var CustomMessageActionsList = function (props) {
9
9
  var customActionsArray = Object.keys(customMessageActions);
10
10
  return (React.createElement(React.Fragment, null, customActionsArray.map(function (customAction) {
11
11
  var customHandler = customMessageActions[customAction];
12
- return (React.createElement("button", { "aria-selected": 'false', className: 'str-chat__message-actions-list-item', key: customAction, onClick: function (event) { return customHandler(message, event); }, role: 'option' }, customAction));
12
+ return (React.createElement("button", { "aria-selected": 'false', className: 'str-chat__message-actions-list-item str-chat__message-actions-list-item-button', key: customAction, onClick: function (event) { return customHandler(message, event); }, role: 'option' }, customAction));
13
13
  })));
14
14
  };
15
15
  var UnMemoizedMessageActionsBox = function (props) {
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ export declare type CooldownTimerProps = {
3
+ cooldownInterval: number;
4
+ setCooldownRemaining: React.Dispatch<React.SetStateAction<number | undefined>>;
5
+ };
6
+ export declare const CooldownTimer: ({ cooldownInterval, setCooldownRemaining }: CooldownTimerProps) => JSX.Element;
7
+ //# sourceMappingURL=CooldownTimer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CooldownTimer.d.ts","sourceRoot":"","sources":["../../../src/components/MessageInput/CooldownTimer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAEnD,oBAAY,kBAAkB,GAAG;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;CAChF,CAAC;AACF,eAAO,MAAM,aAAa,+CAAgD,kBAAkB,gBAoB3F,CAAC"}
@@ -0,0 +1,17 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ export var CooldownTimer = function (_a) {
3
+ var cooldownInterval = _a.cooldownInterval, setCooldownRemaining = _a.setCooldownRemaining;
4
+ var _b = useState(cooldownInterval), seconds = _b[0], setSeconds = _b[1];
5
+ useEffect(function () {
6
+ var countdownInterval = setInterval(function () {
7
+ if (seconds > 0) {
8
+ setSeconds(seconds - 1);
9
+ }
10
+ else {
11
+ setCooldownRemaining(0);
12
+ }
13
+ }, 1000);
14
+ return function () { return clearInterval(countdownInterval); };
15
+ });
16
+ return (React.createElement("div", { className: 'str-chat__message-input-cooldown', "data-testid": 'cooldown-timer' }, seconds === 0 ? null : seconds));
17
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"MessageInputFlat.d.ts","sourceRoot":"","sources":["../../../src/components/MessageInput/MessageInputFlat.tsx"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAEnE,eAAO,MAAM,gBAAgB,qGA8B5B,CAAC"}
1
+ {"version":3,"file":"MessageInputFlat.d.ts","sourceRoot":"","sources":["../../../src/components/MessageInput/MessageInputFlat.tsx"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAGnE,eAAO,MAAM,gBAAgB,qGA8B5B,CAAC"}
@@ -14,10 +14,8 @@ import { FileUploadButton, ImageDropzone, UploadButton } from 'react-file-utils'
14
14
  import clsx from 'clsx';
15
15
  import { usePopper } from 'react-popper';
16
16
  import { useDropzone } from 'react-dropzone';
17
- import zipObject from 'lodash/zipObject';
18
17
  import { nanoid } from 'nanoid';
19
18
  import { EmojiPicker } from './EmojiPicker';
20
- import { CooldownTimer as DefaultCooldownTimer } from './hooks/useCooldownTimer';
21
19
  import { EmojiIconLarge as DefaultEmojiIcon, EmojiPickerIcon as DefaultEmojiPickerIcon, FileUploadIconFlat as DefaultFileUploadIcon, SendButton as DefaultSendButton, UploadIcon as DefaultUploadIcon, } from './icons';
22
20
  import { QuotedMessagePreview as DefaultQuotedMessagePreview, QuotedMessagePreviewHeader, } from './QuotedMessagePreview';
23
21
  import { AttachmentPreviewList } from './AttachmentPreviewList';
@@ -30,6 +28,7 @@ import { useChannelStateContext } from '../../context/ChannelStateContext';
30
28
  import { useTranslationContext } from '../../context/TranslationContext';
31
29
  import { useMessageInputContext } from '../../context/MessageInputContext';
32
30
  import { useComponentContext } from '../../context/ComponentContext';
31
+ import { CooldownTimer as DefaultCooldownTimer } from './CooldownTimer';
33
32
  export var MessageInputFlat = function () {
34
33
  var quotedMessage = useChannelStateContext('MessageInputFlat').quotedMessage;
35
34
  var setQuotedMessage = useChannelActionContext('MessageInputFlat').setQuotedMessage;
@@ -98,7 +97,11 @@ var MessageInputV2 = function () {
98
97
  }), attributes = _m.attributes, styles = _m.styles;
99
98
  var id = useMemo(function () { return nanoid(); }, []);
100
99
  var accept = useMemo(function () {
101
- return zipObject(acceptedFiles, Array.from({ length: acceptedFiles.length }, function () { return []; }));
100
+ return acceptedFiles.reduce(function (mediaTypeMap, mediaType) {
101
+ var _a;
102
+ (_a = mediaTypeMap[mediaType]) !== null && _a !== void 0 ? _a : (mediaTypeMap[mediaType] = []);
103
+ return mediaTypeMap;
104
+ }, {});
102
105
  }, [acceptedFiles]);
103
106
  var _o = useDropzone({
104
107
  accept: accept,
@@ -1 +1 @@
1
- {"version":3,"file":"MessageInputSmall.d.ts","sourceRoot":"","sources":["../../../src/components/MessageInput/MessageInputSmall.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAElF;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,8IA4H7B,CAAC"}
1
+ {"version":3,"file":"MessageInputSmall.d.ts","sourceRoot":"","sources":["../../../src/components/MessageInput/MessageInputSmall.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAGlF;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,8IA4H7B,CAAC"}
@@ -1,7 +1,6 @@
1
1
  import React, { useEffect } from 'react';
2
2
  import { FileUploadButton, ImageDropzone } from 'react-file-utils';
3
3
  import { EmojiPicker } from './EmojiPicker';
4
- import { CooldownTimer as DefaultCooldownTimer } from './hooks/useCooldownTimer';
5
4
  import { EmojiIconSmall as DefaultEmojiIcon, FileUploadIconFlat as DefaultFileUploadIcon, SendButton as DefaultSendButton, } from './icons';
6
5
  import { UploadsPreview } from './UploadsPreview';
7
6
  import { ChatAutoComplete } from '../ChatAutoComplete/ChatAutoComplete';
@@ -13,6 +12,7 @@ import { useTranslationContext } from '../../context/TranslationContext';
13
12
  import { useMessageInputContext } from '../../context/MessageInputContext';
14
13
  import { useComponentContext } from '../../context/ComponentContext';
15
14
  import { QuotedMessagePreview as DefaultQuotedMessagePreview } from './QuotedMessagePreview';
15
+ import { CooldownTimer as DefaultCooldownTimer } from './CooldownTimer';
16
16
  /**
17
17
  * @deprecated This component has beend deprecated in favor of [`MessageInputFlat`](./MessageInputFlat.tsx) from which
18
18
  * `MessageInputSmall` "inherited" most of the code with only slight modification to classNames
@@ -1,10 +1,5 @@
1
1
  import React from 'react';
2
2
  import type { DefaultStreamChatGenerics } from '../../../types/types';
3
- export declare type CooldownTimerProps = {
4
- cooldownInterval: number;
5
- setCooldownRemaining: React.Dispatch<React.SetStateAction<number | undefined>>;
6
- };
7
- export declare const CooldownTimer: ({ cooldownInterval, setCooldownRemaining }: CooldownTimerProps) => JSX.Element;
8
3
  export declare type CooldownTimerState = {
9
4
  cooldownInterval: number;
10
5
  setCooldownRemaining: React.Dispatch<React.SetStateAction<number | undefined>>;
@@ -1 +1 @@
1
- {"version":3,"file":"useCooldownTimer.d.ts","sourceRoot":"","sources":["../../../../src/components/MessageInput/hooks/useCooldownTimer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAOnD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAEtE,oBAAY,kBAAkB,GAAG;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;CAChF,CAAC;AAEF,eAAO,MAAM,aAAa,+CAAgD,kBAAkB,gBAoB3F,CAAC;AAEF,oBAAY,kBAAkB,GAAG;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAC/E,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,gBAAgB,0FAExB,kBA6BJ,CAAC"}
1
+ {"version":3,"file":"useCooldownTimer.d.ts","sourceRoot":"","sources":["../../../../src/components/MessageInput/hooks/useCooldownTimer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAOnD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAEtE,oBAAY,kBAAkB,GAAG;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAC/E,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,gBAAgB,0FAExB,kBA6BJ,CAAC"}
@@ -1,22 +1,6 @@
1
- import React, { useEffect, useState } from 'react';
1
+ import { useEffect, useState } from 'react';
2
2
  import { useChatContext } from '../../../context/ChatContext';
3
3
  import { useChannelStateContext } from '../../../context/ChannelStateContext';
4
- export var CooldownTimer = function (_a) {
5
- var cooldownInterval = _a.cooldownInterval, setCooldownRemaining = _a.setCooldownRemaining;
6
- var _b = useState(cooldownInterval), seconds = _b[0], setSeconds = _b[1];
7
- useEffect(function () {
8
- var countdownInterval = setInterval(function () {
9
- if (seconds > 0) {
10
- setSeconds(seconds - 1);
11
- }
12
- else {
13
- setCooldownRemaining(0);
14
- }
15
- }, 1000);
16
- return function () { return clearInterval(countdownInterval); };
17
- });
18
- return (React.createElement("div", { className: 'str-chat__message-input-cooldown', "data-testid": 'cooldown-timer' }, seconds === 0 ? null : seconds));
19
- };
20
4
  export var useCooldownTimer = function () {
21
5
  var latestMessageDatesByChannels = useChatContext('useCooldownTimer').latestMessageDatesByChannels;
22
6
  var channel = useChannelStateContext('useCooldownTimer').channel;
@@ -1 +1 @@
1
- {"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../../src/components/MessageInput/icons.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgB,MAAM,OAAO,CAAC;AAKrC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAEnE,eAAO,MAAM,cAAc,mBAW1B,CAAC;AAEF,eAAO,MAAM,cAAc,mBAW1B,CAAC;AAGF,eAAO,MAAM,eAAe,mBAW3B,CAAC;AAEF,eAAO,MAAM,cAAc,mBAY1B,CAAC;AAEF,eAAO,MAAM,kBAAkB,mBAY9B,CAAC;AAEF,eAAO,MAAM,oBAAoB;;iBA0BhC,CAAC;AAGF,eAAO,MAAM,UAAU,mBAqBtB,CAAC;AAEF,eAAO,MAAM,SAAS,mBAcrB,CAAC;AAEF,eAAO,MAAM,SAAS,mBAcrB,CAAC;AAEF,eAAO,MAAM,YAAY,mBAcxB,CAAC;AAEF,eAAO,MAAM,UAAU,mBAYtB,CAAC;AAEF,eAAO,MAAM,UAAU,mBAkBtB,CAAC;AAEF,oBAAY,eAAe,CACzB,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,IAC9E;IACF,WAAW,EAAE,CACX,KAAK,EAAE,KAAK,CAAC,kBAAkB,EAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,KACrD,IAAI,CAAC;CACX,GAAG,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;AAEnC,eAAO,MAAM,UAAU,kKAoBtB,CAAC"}
1
+ {"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../../src/components/MessageInput/icons.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAMvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAEnE,eAAO,MAAM,cAAc,mBAW1B,CAAC;AAEF,eAAO,MAAM,cAAc,mBAW1B,CAAC;AAGF,eAAO,MAAM,eAAe,mBAW3B,CAAC;AAEF,eAAO,MAAM,cAAc,mBAY1B,CAAC;AAEF,eAAO,MAAM,kBAAkB,mBAY9B,CAAC;AAEF,eAAO,MAAM,oBAAoB;;iBA0BhC,CAAC;AAGF,eAAO,MAAM,UAAU,mBAqBtB,CAAC;AAEF,eAAO,MAAM,SAAS,mBAcrB,CAAC;AAEF,eAAO,MAAM,SAAS,mBAcrB,CAAC;AAEF,eAAO,MAAM,YAAY,mBAcxB,CAAC;AAEF,eAAO,MAAM,UAAU,mBAYtB,CAAC;AAEF,eAAO,MAAM,UAAU,mBAkBtB,CAAC;AAEF,oBAAY,eAAe,CACzB,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,IAC9E;IACF,WAAW,EAAE,CACX,KAAK,EAAE,KAAK,CAAC,kBAAkB,EAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,KACrD,IAAI,CAAC;CACX,GAAG,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;AAEnC,eAAO,MAAM,UAAU,kKAoBtB,CAAC"}
@@ -20,7 +20,8 @@ var __rest = (this && this.__rest) || function (s, e) {
20
20
  }
21
21
  return t;
22
22
  };
23
- import React, { useId } from 'react';
23
+ import React, { useMemo } from 'react';
24
+ import { nanoid } from 'nanoid';
24
25
  import { useTranslationContext } from '../../context/TranslationContext';
25
26
  import { useChatContext } from '../../context/ChatContext';
26
27
  export var EmojiIconLarge = function () {
@@ -55,7 +56,7 @@ export var FileUploadIconFlat = function () {
55
56
  };
56
57
  export var LoadingIndicatorIcon = function (_a) {
57
58
  var _b = _a.size, size = _b === void 0 ? 20 : _b;
58
- var id = useId();
59
+ var id = useMemo(function () { return nanoid(); }, []);
59
60
  return (React.createElement("div", { className: 'str-chat__loading-indicator' },
60
61
  React.createElement("svg", { "data-testid": 'loading-indicator', height: size, viewBox: '0 0 30 30', width: size, xmlns: 'http://www.w3.org/2000/svg' },
61
62
  React.createElement("defs", null,
@@ -8,4 +8,5 @@ export * from './MessageInputFlat';
8
8
  export * from './MessageInputSmall';
9
9
  export * from './QuotedMessagePreview';
10
10
  export * from './UploadsPreview';
11
+ export * from './CooldownTimer';
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/MessageInput/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/MessageInput/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC"}
@@ -8,3 +8,4 @@ export * from './MessageInputFlat';
8
8
  export * from './MessageInputSmall';
9
9
  export * from './QuotedMessagePreview';
10
10
  export * from './UploadsPreview';
11
+ export * from './CooldownTimer';
@@ -1 +1 @@
1
- {"version":3,"file":"ReactionsList.d.ts","sourceRoot":"","sources":["../../../src/components/Reactions/ReactionsList.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,oBAAY,kBAAkB,CAC5B,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,IAC9E;IACF,6KAA6K;IAC7K,oBAAoB,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACjD,sHAAsH;IACtH,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,iFAAiF;IACjF,aAAa,CAAC,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,EAAE,CAAC;IACvD,oFAAoF;IACpF,eAAe,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAC5C,+DAA+D;IAC/D,eAAe,CAAC,EAAE,aAAa,EAAE,CAAC;IAClC,8DAA8D;IAC9D,SAAS,CAAC,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,EAAE,CAAC;IACnD,4EAA4E;IAC5E,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAkFF;;GAEG;AACH,eAAO,MAAM,aAAa,yJAAwE,CAAC"}
1
+ {"version":3,"file":"ReactionsList.d.ts","sourceRoot":"","sources":["../../../src/components/Reactions/ReactionsList.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAK1D,oBAAY,kBAAkB,CAC5B,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,IAC9E;IACF,6KAA6K;IAC7K,oBAAoB,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACjD,sHAAsH;IACtH,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,iFAAiF;IACjF,aAAa,CAAC,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,EAAE,CAAC;IACvD,oFAAoF;IACpF,eAAe,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAC5C,+DAA+D;IAC/D,eAAe,CAAC,EAAE,aAAa,EAAE,CAAC;IAClC,8DAA8D;IAC9D,SAAS,CAAC,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,EAAE,CAAC;IACnD,4EAA4E;IAC5E,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAyHF;;GAEG;AACH,eAAO,MAAM,aAAa,yJAAwE,CAAC"}
@@ -20,16 +20,31 @@ var __rest = (this && this.__rest) || function (s, e) {
20
20
  }
21
21
  return t;
22
22
  };
23
- import React, { Suspense } from 'react';
23
+ import React, { Suspense, useState } from 'react';
24
24
  import clsx from 'clsx';
25
25
  import { useEmojiContext } from '../../context/EmojiContext';
26
26
  import { useMessageContext } from '../../context/MessageContext';
27
+ import { useChatContext } from '../../context/ChatContext';
27
28
  import { useProcessReactions } from './hooks/useProcessReactions';
29
+ import { PopperTooltip } from '../Tooltip';
30
+ import { useEnterLeaveHandlers } from '../Tooltip/hooks';
31
+ var ButtonWithTooltip = function (_a) {
32
+ var children = _a.children, onMouseEnter = _a.onMouseEnter, onMouseLeave = _a.onMouseLeave, rest = __rest(_a, ["children", "onMouseEnter", "onMouseLeave"]);
33
+ var _b = useState(null), referenceElement = _b[0], setReferenceElement = _b[1];
34
+ var _c = useEnterLeaveHandlers({
35
+ onMouseEnter: onMouseEnter,
36
+ onMouseLeave: onMouseLeave,
37
+ }), handleEnter = _c.handleEnter, handleLeave = _c.handleLeave, tooltipVisible = _c.tooltipVisible;
38
+ var themeVersion = useChatContext('ButtonWithTooltip').themeVersion;
39
+ return (React.createElement(React.Fragment, null,
40
+ themeVersion === '2' && (React.createElement(PopperTooltip, { referenceElement: referenceElement, visible: tooltipVisible }, rest.title)),
41
+ React.createElement("button", __assign({ onMouseEnter: handleEnter, onMouseLeave: handleLeave, ref: setReferenceElement }, rest), children)));
42
+ };
28
43
  var UnMemoizedReactionsList = function (props) {
29
44
  var onClick = props.onClick, _a = props.reverse, reverse = _a === void 0 ? false : _a, rest = __rest(props, ["onClick", "reverse"]);
30
45
  var _b = useEmojiContext('ReactionsList'), Emoji = _b.Emoji, emojiConfig = _b.emojiConfig;
31
46
  var onReactionListClick = useMessageContext('ReactionsList').onReactionListClick;
32
- var _c = useProcessReactions(__assign({ emojiConfig: emojiConfig }, rest)), additionalEmojiProps = _c.additionalEmojiProps, emojiData = _c.emojiData, getEmojiByReactionType = _c.getEmojiByReactionType, iHaveReactedWithReaction = _c.iHaveReactedWithReaction, latestReactions = _c.latestReactions, latestReactionTypes = _c.latestReactionTypes, reactionCounts = _c.reactionCounts, supportedReactionsArePresent = _c.supportedReactionsArePresent, totalReactionCount = _c.totalReactionCount;
47
+ var _c = useProcessReactions(__assign({ emojiConfig: emojiConfig }, rest)), additionalEmojiProps = _c.additionalEmojiProps, aggregatedUserNamesByType = _c.aggregatedUserNamesByType, emojiData = _c.emojiData, getEmojiByReactionType = _c.getEmojiByReactionType, iHaveReactedWithReaction = _c.iHaveReactedWithReaction, latestReactions = _c.latestReactions, latestReactionTypes = _c.latestReactionTypes, reactionCounts = _c.reactionCounts, supportedReactionsArePresent = _c.supportedReactionsArePresent, totalReactionCount = _c.totalReactionCount;
33
48
  if (!latestReactions.length)
34
49
  return null;
35
50
  if (!supportedReactionsArePresent)
@@ -44,7 +59,7 @@ var UnMemoizedReactionsList = function (props) {
44
59
  return emojiObject ? (React.createElement("li", { className: clsx('str-chat__message-reaction', {
45
60
  'str-chat__message-reaction-own': isOwnReaction,
46
61
  }), key: emojiObject.id },
47
- React.createElement("button", { "aria-label": "Reactions: ".concat(reactionType) },
62
+ React.createElement(ButtonWithTooltip, { "aria-label": "Reactions: ".concat(reactionType), title: aggregatedUserNamesByType[reactionType].join(', '), type: 'button' },
48
63
  React.createElement(Suspense, { fallback: null },
49
64
  React.createElement("span", { className: 'str-chat__message-reaction-emoji' },
50
65
  React.createElement(Emoji, __assign({ data: emojiData, emoji: emojiObject, size: 16 }, additionalEmojiProps)))),
@@ -6,6 +6,7 @@ declare type SharedReactionListProps = 'additionalEmojiProps' | 'own_reactions'
6
6
  declare type UseProcessReactionsParams = Pick<ReactionsListProps, SharedReactionListProps> & Pick<EmojiContextValue, 'emojiConfig'>;
7
7
  export declare const useProcessReactions: <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>(params: UseProcessReactionsParams) => {
8
8
  additionalEmojiProps: import("../../../context").EmojiSetDef | Partial<import("emoji-mart").NimbleEmojiProps>;
9
+ aggregatedUserNamesByType: Record<string, string[]>;
9
10
  emojiData: import("emoji-mart").Data;
10
11
  getEmojiByReactionType: (type: string) => ReactionEmoji | undefined;
11
12
  iHaveReactedWithReaction: (reactionType: string) => import("stream-chat").ReactionResponse<DefaultStreamChatGenerics> | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"useProcessReactions.d.ts","sourceRoot":"","sources":["../../../../src/components/Reactions/hooks/useProcessReactions.tsx"],"names":[],"mappings":"AACA,OAAO,EAAwB,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAEtE,aAAK,uBAAuB,GACxB,sBAAsB,GACtB,eAAe,GACf,iBAAiB,GACjB,iBAAiB,GACjB,WAAW,CAAC;AAEhB,aAAK,yBAAyB,GAAG,IAAI,CAAC,kBAAkB,EAAE,uBAAuB,CAAC,GAChF,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;AAEzC,eAAO,MAAM,mBAAmB,6FAGtB,yBAAyB;;;mCAyBxB,MAAM,KAAG,aAAa,GAAG,SAAS;6CAL1B,MAAM;;;;;;;;CA2DxB,CAAC"}
1
+ {"version":3,"file":"useProcessReactions.d.ts","sourceRoot":"","sources":["../../../../src/components/Reactions/hooks/useProcessReactions.tsx"],"names":[],"mappings":"AACA,OAAO,EAAwB,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAEtE,aAAK,uBAAuB,GACxB,sBAAsB,GACtB,eAAe,GACf,iBAAiB,GACjB,iBAAiB,GACjB,WAAW,CAAC;AAEhB,aAAK,yBAAyB,GAAG,IAAI,CAAC,kBAAkB,EAAE,uBAAuB,CAAC,GAChF,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;AAEzC,eAAO,MAAM,mBAAmB,6FAGtB,yBAAyB;;;;mCAyBxB,MAAM,KAAG,aAAa,GAAG,SAAS;6CAL1B,MAAM;;;;;;;;CAwExB,CAAC"}
@@ -37,8 +37,19 @@ export var useProcessReactions = function (params) {
37
37
  ? Object.values(reactionCounts).reduce(function (total, count) { return total + count; }, 0)
38
38
  : 0;
39
39
  }, [reactionCounts, supportedReactionsArePresent]);
40
+ var aggregatedUserNamesByType = useMemo(function () {
41
+ return latestReactions.reduce(function (typeMap, _a) {
42
+ var _b;
43
+ var type = _a.type, user = _a.user;
44
+ (_b = typeMap[type]) !== null && _b !== void 0 ? _b : (typeMap[type] = []);
45
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
46
+ typeMap[type].push((user === null || user === void 0 ? void 0 : user.name) || user.id);
47
+ return typeMap;
48
+ }, {});
49
+ }, [latestReactions]);
40
50
  return {
41
51
  additionalEmojiProps: reactionsAreCustom ? additionalEmojiProps : emojiSetDef,
52
+ aggregatedUserNamesByType: aggregatedUserNamesByType,
42
53
  emojiData: emojiData,
43
54
  getEmojiByReactionType: getEmojiByReactionType,
44
55
  iHaveReactedWithReaction: iHaveReactedWithReaction,
@@ -1,3 +1,15 @@
1
- import { ComponentProps } from 'react';
2
- export declare const Tooltip: (props: ComponentProps<'div'>) => JSX.Element;
1
+ import React, { ComponentProps } from 'react';
2
+ import { PopperProps } from 'react-popper';
3
+ export declare const Tooltip: ({ children, ...rest }: ComponentProps<'div'>) => JSX.Element;
4
+ export declare type PopperTooltipProps<T extends HTMLElement> = React.PropsWithChildren<{
5
+ /** Reference element to which the tooltip should attach to */
6
+ referenceElement: T | null;
7
+ /** Popper's modifier (offset) property - [xAxis offset, yAxis offset], default [0, 10] */
8
+ offset?: [number, number];
9
+ /** Popper's placement property defining default position of the tooltip, default 'top' */
10
+ placement?: PopperProps<unknown>['placement'];
11
+ /** Tells component whether to render it's contents */
12
+ visible?: boolean;
13
+ }>;
14
+ export declare const PopperTooltip: <T extends HTMLElement>({ children, offset, referenceElement, placement, visible, }: PopperTooltipProps<T>) => JSX.Element | null;
3
15
  //# sourceMappingURL=Tooltip.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../../src/components/Tooltip/Tooltip.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAE9C,eAAO,MAAM,OAAO,UAAW,eAAe,KAAK,CAAC,gBAOnD,CAAC"}
1
+ {"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../../src/components/Tooltip/Tooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,cAAc,EAAY,MAAM,OAAO,CAAC;AACxD,OAAO,EAAE,WAAW,EAAa,MAAM,cAAc,CAAC;AAEtD,eAAO,MAAM,OAAO,0BAA2B,eAAe,KAAK,CAAC,gBAInE,CAAC;AAEF,oBAAY,kBAAkB,CAAC,CAAC,SAAS,WAAW,IAAI,KAAK,CAAC,iBAAiB,CAAC;IAC9E,8DAA8D;IAC9D,gBAAgB,EAAE,CAAC,GAAG,IAAI,CAAC;IAC3B,0FAA0F;IAC1F,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,0FAA0F;IAC1F,SAAS,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC;IAC9C,sDAAsD;IACtD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC,CAAC;AAEH,eAAO,MAAM,aAAa,mIAgCzB,CAAC"}
@@ -20,8 +20,27 @@ var __rest = (this && this.__rest) || function (s, e) {
20
20
  }
21
21
  return t;
22
22
  };
23
- import React from 'react';
24
- export var Tooltip = function (props) {
25
- var children = props.children, rest = __rest(props, ["children"]);
23
+ import React, { useState } from 'react';
24
+ import { usePopper } from 'react-popper';
25
+ export var Tooltip = function (_a) {
26
+ var children = _a.children, rest = __rest(_a, ["children"]);
26
27
  return (React.createElement("div", __assign({ className: 'str-chat__tooltip' }, rest), children));
27
28
  };
29
+ export var PopperTooltip = function (_a) {
30
+ var children = _a.children, _b = _a.offset, offset = _b === void 0 ? [0, 10] : _b, referenceElement = _a.referenceElement, _c = _a.placement, placement = _c === void 0 ? 'top' : _c, _d = _a.visible, visible = _d === void 0 ? false : _d;
31
+ var _e = useState(null), popperElement = _e[0], setPopperElement = _e[1];
32
+ var _f = usePopper(referenceElement, popperElement, {
33
+ modifiers: [
34
+ {
35
+ name: 'offset',
36
+ options: {
37
+ offset: offset,
38
+ },
39
+ },
40
+ ],
41
+ placement: placement,
42
+ }), attributes = _f.attributes, styles = _f.styles;
43
+ if (!visible)
44
+ return null;
45
+ return (React.createElement("div", __assign({ className: 'str-chat__tooltip', ref: setPopperElement, style: styles.popper }, attributes.popper), children));
46
+ };
@@ -0,0 +1,2 @@
1
+ export * from './useEnterLeaveHandlers';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/Tooltip/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1 @@
1
+ export * from './useEnterLeaveHandlers';
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ export declare const useEnterLeaveHandlers: <T extends HTMLElement>({ onMouseEnter, onMouseLeave, }?: Partial<Record<"onMouseEnter" | "onMouseLeave", React.MouseEventHandler<T>>>) => {
3
+ handleEnter: React.MouseEventHandler<T>;
4
+ handleLeave: React.MouseEventHandler<T>;
5
+ tooltipVisible: boolean;
6
+ };
7
+ //# sourceMappingURL=useEnterLeaveHandlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEnterLeaveHandlers.d.ts","sourceRoot":"","sources":["../../../../src/components/Tooltip/hooks/useEnterLeaveHandlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAErD,eAAO,MAAM,qBAAqB;;;;CAuBjC,CAAC"}