stream-chat-react 10.11.0 → 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.
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import { ChatContextValue } from '../../context/ChatContext';
3
+ import { MessageDeliveryStatus } from './hooks/useMessageDeliveryStatus';
3
4
  import type { Channel } from 'stream-chat';
4
5
  import type { AvatarProps } from '../Avatar/Avatar';
5
6
  import type { StreamMessage } from '../../context/ChannelStateContext';
@@ -15,6 +16,8 @@ export declare type ChannelPreviewUIComponentProps<StreamChatGenerics extends De
15
16
  lastMessage?: StreamMessage<StreamChatGenerics>;
16
17
  /** Latest message preview to display, will be a string or JSX element supporting markdown. */
17
18
  latestMessage?: string | JSX.Element;
19
+ /** Status describing whether own message has been delivered or read by another. If the last message is not an own message, then the status is undefined. */
20
+ messageDeliveryStatus?: MessageDeliveryStatus;
18
21
  /** Number of unread Messages */
19
22
  unread?: number;
20
23
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ChannelPreview.d.ts","sourceRoot":"","sources":["../../../src/components/ChannelPreview/ChannelPreview.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAOhE,OAAO,EAAE,gBAAgB,EAAkB,MAAM,2BAA2B,CAAC;AAG7E,OAAO,KAAK,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAElD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAEvE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAEnE,oBAAY,8BAA8B,CACxC,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,IAC9E,mBAAmB,CAAC,kBAAkB,CAAC,GAAG;IAC5C,kEAAkE;IAClE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kCAAkC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC;IAChD,8FAA8F;IAC9F,aAAa,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;IACrC,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,oBAAY,mBAAmB,CAC7B,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,IAC9E;IACF,6MAA6M;IAC7M,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACrC,sCAAsC;IACtC,aAAa,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC5C,+LAA+L;IAC/L,MAAM,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAC1C,+DAA+D;IAC/D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;IAC7C,6PAA6P;IAC7P,OAAO,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,8BAA8B,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAClF,kCAAkC;IAClC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAC5E,2CAA2C;IAC3C,QAAQ,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAChD,CAAC;AAEF,eAAO,MAAM,cAAc,0JAyE1B,CAAC"}
1
+ {"version":3,"file":"ChannelPreview.d.ts","sourceRoot":"","sources":["../../../src/components/ChannelPreview/ChannelPreview.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAOhE,OAAO,EAAE,gBAAgB,EAAkB,MAAM,2BAA2B,CAAC;AAE7E,OAAO,EAAE,qBAAqB,EAA4B,MAAM,kCAAkC,CAAC;AAEnG,OAAO,KAAK,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAElD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAEvE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAEnE,oBAAY,8BAA8B,CACxC,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,IAC9E,mBAAmB,CAAC,kBAAkB,CAAC,GAAG;IAC5C,kEAAkE;IAClE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kCAAkC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC;IAChD,8FAA8F;IAC9F,aAAa,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;IACrC,4JAA4J;IAC5J,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,oBAAY,mBAAmB,CAC7B,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,IAC9E;IACF,6MAA6M;IAC7M,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACrC,sCAAsC;IACtC,aAAa,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC5C,+LAA+L;IAC/L,MAAM,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAC1C,+DAA+D;IAC/D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;IAC7C,6PAA6P;IAC7P,OAAO,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,8BAA8B,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAClF,kCAAkC;IAClC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAC5E,2CAA2C;IAC3C,QAAQ,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAChD,CAAC;AAEF,eAAO,MAAM,cAAc,0JA8E1B,CAAC"}
@@ -6,6 +6,7 @@ import { useChannelPreviewInfo } from './hooks/useChannelPreviewInfo';
6
6
  import { getLatestMessagePreview } from './utils';
7
7
  import { useChatContext } from '../../context/ChatContext';
8
8
  import { useTranslationContext } from '../../context/TranslationContext';
9
+ import { useMessageDeliveryStatus } from './hooks/useMessageDeliveryStatus';
9
10
  export var ChannelPreview = function (props) {
10
11
  var channel = props.channel, _a = props.Preview, Preview = _a === void 0 ? ChannelPreviewMessenger : _a, channelUpdateCount = props.channelUpdateCount;
11
12
  var _b = useChatContext('ChannelPreview'), activeChannel = _b.channel, client = _b.client, setActiveChannel = _b.setActiveChannel;
@@ -13,6 +14,10 @@ export var ChannelPreview = function (props) {
13
14
  var _d = useChannelPreviewInfo({ channel: channel }), displayImage = _d.displayImage, displayTitle = _d.displayTitle;
14
15
  var _e = useState(channel.state.messages[channel.state.messages.length - 1]), lastMessage = _e[0], setLastMessage = _e[1];
15
16
  var _f = useState(0), unread = _f[0], setUnread = _f[1];
17
+ var messageDeliveryStatus = useMessageDeliveryStatus({
18
+ channel: channel,
19
+ lastMessage: lastMessage,
20
+ }).messageDeliveryStatus;
16
21
  var isActive = (activeChannel === null || activeChannel === void 0 ? void 0 : activeChannel.cid) === channel.cid;
17
22
  var muted = useIsChannelMuted(channel).muted;
18
23
  useEffect(function () {
@@ -52,5 +57,5 @@ export var ChannelPreview = function (props) {
52
57
  if (!Preview)
53
58
  return null;
54
59
  var latestMessage = getLatestMessagePreview(channel, t, userLanguage);
55
- return (React.createElement(Preview, __assign({}, props, { active: isActive, displayImage: displayImage, displayTitle: displayTitle, lastMessage: lastMessage, latestMessage: latestMessage, setActiveChannel: setActiveChannel, unread: unread })));
60
+ return (React.createElement(Preview, __assign({}, props, { active: isActive, displayImage: displayImage, displayTitle: displayTitle, lastMessage: lastMessage, latestMessage: latestMessage, messageDeliveryStatus: messageDeliveryStatus, setActiveChannel: setActiveChannel, unread: unread })));
56
61
  };
@@ -1,2 +1,3 @@
1
1
  export { useChannelPreviewInfo } from './useChannelPreviewInfo';
2
+ export { MessageDeliveryStatus } from './useMessageDeliveryStatus';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/ChannelPreview/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/ChannelPreview/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -1 +1,2 @@
1
1
  export { useChannelPreviewInfo } from './useChannelPreviewInfo';
2
+ export { MessageDeliveryStatus } from './useMessageDeliveryStatus';
@@ -0,0 +1,17 @@
1
+ import type { Channel } from 'stream-chat';
2
+ import type { DefaultStreamChatGenerics } from '../../../types/types';
3
+ import type { StreamMessage } from '../../../context';
4
+ export declare enum MessageDeliveryStatus {
5
+ DELIVERED = "delivered",
6
+ READ = "read"
7
+ }
8
+ declare type UseMessageStatusParamsChannelPreviewProps<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> = {
9
+ channel: Channel<StreamChatGenerics>;
10
+ /** The last message received in a channel */
11
+ lastMessage?: StreamMessage<StreamChatGenerics>;
12
+ };
13
+ export declare const useMessageDeliveryStatus: <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>({ channel, lastMessage, }: UseMessageStatusParamsChannelPreviewProps<StreamChatGenerics>) => {
14
+ messageDeliveryStatus: MessageDeliveryStatus | undefined;
15
+ };
16
+ export {};
17
+ //# sourceMappingURL=useMessageDeliveryStatus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMessageDeliveryStatus.d.ts","sourceRoot":"","sources":["../../../../src/components/ChannelPreview/hooks/useMessageDeliveryStatus.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAIlD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,oBAAY,qBAAqB;IAC/B,SAAS,cAAc;IACvB,IAAI,SAAS;CACd;AAED,aAAK,yCAAyC,CAC5C,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,IAC9E;IACF,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACrC,6CAA6C;IAC7C,WAAW,CAAC,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC;CACjD,CAAC;AAEF,eAAO,MAAM,wBAAwB;;CAwEpC,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { useCallback, useEffect, useState } from 'react';
2
+ import { useChatContext } from '../../../context';
3
+ export var MessageDeliveryStatus;
4
+ (function (MessageDeliveryStatus) {
5
+ MessageDeliveryStatus["DELIVERED"] = "delivered";
6
+ MessageDeliveryStatus["READ"] = "read";
7
+ })(MessageDeliveryStatus || (MessageDeliveryStatus = {}));
8
+ export var useMessageDeliveryStatus = function (_a) {
9
+ var channel = _a.channel, lastMessage = _a.lastMessage;
10
+ var client = useChatContext().client;
11
+ var _b = useState(), messageDeliveryStatus = _b[0], setMessageDeliveryStatus = _b[1];
12
+ var isOwnMessage = 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]);
13
+ useEffect(function () {
14
+ var lastMessageIsOwn = isOwnMessage(lastMessage);
15
+ if (!(lastMessage === null || lastMessage === void 0 ? void 0 : lastMessage.created_at) || !lastMessageIsOwn)
16
+ return;
17
+ var lastMessageCreatedAtDate = typeof lastMessage.created_at === 'string'
18
+ ? new Date(lastMessage.created_at)
19
+ : lastMessage.created_at;
20
+ var channelReadByOthersAfterLastMessageUpdate = Object.values(channel.state.read).some(function (_a) {
21
+ var channelLastMarkedReadDate = _a.last_read, user = _a.user;
22
+ var ignoreOwnReadStatus = client.user && user.id !== client.user.id;
23
+ return ignoreOwnReadStatus && lastMessageCreatedAtDate < channelLastMarkedReadDate;
24
+ });
25
+ setMessageDeliveryStatus(channelReadByOthersAfterLastMessageUpdate
26
+ ? MessageDeliveryStatus.READ
27
+ : MessageDeliveryStatus.DELIVERED);
28
+ }, [channel.state.read, client, isOwnMessage, lastMessage]);
29
+ useEffect(function () {
30
+ var handleMessageNew = function (event) {
31
+ // the last message is not mine, so do not show the delivery status
32
+ if (!isOwnMessage(event.message)) {
33
+ return setMessageDeliveryStatus(undefined);
34
+ }
35
+ return setMessageDeliveryStatus(MessageDeliveryStatus.DELIVERED);
36
+ };
37
+ channel.on('message.new', handleMessageNew);
38
+ return function () {
39
+ channel.off('message.new', handleMessageNew);
40
+ };
41
+ }, [channel, client, isOwnMessage]);
42
+ useEffect(function () {
43
+ if (!isOwnMessage(lastMessage))
44
+ return;
45
+ var handleMarkRead = function (event) {
46
+ var _a, _b;
47
+ if (((_a = event.user) === null || _a === void 0 ? void 0 : _a.id) !== ((_b = client.user) === null || _b === void 0 ? void 0 : _b.id))
48
+ setMessageDeliveryStatus(MessageDeliveryStatus.READ);
49
+ };
50
+ channel.on('message.read', handleMarkRead);
51
+ return function () {
52
+ channel.off('message.read', handleMarkRead);
53
+ };
54
+ }, [channel, client, lastMessage, isOwnMessage]);
55
+ return {
56
+ messageDeliveryStatus: messageDeliveryStatus,
57
+ };
58
+ };
@@ -1,7 +1,6 @@
1
1
  import React from 'react';
2
2
  import { ChannelOrUserResponse } from '../utils';
3
- import type { ChannelFilters, ChannelOptions, ChannelSort, UserFilters, UserOptions, UserSort } from 'stream-chat';
4
- import type { Channel } from 'stream-chat';
3
+ import type { Channel, ChannelFilters, ChannelOptions, ChannelSort, UserFilters, UserOptions, UserSort } from 'stream-chat';
5
4
  import type { SearchBarController } from '../SearchBar';
6
5
  import type { SearchInputController } from '../SearchInput';
7
6
  import type { SearchResultsController } from '../SearchResults';
@@ -37,6 +36,8 @@ export declare type ChannelSearchParams<StreamChatGenerics extends DefaultStream
37
36
  onSearchExit?: () => void;
38
37
  /** Custom handler function to run on search result item selection */
39
38
  onSelectResult?: (params: ChannelSearchFunctionParams<StreamChatGenerics>, result: ChannelOrUserResponse<StreamChatGenerics>) => Promise<void> | void;
39
+ /** The number of milliseconds to debounce the search query. The default interval is 200ms. */
40
+ searchDebounceIntervalMs?: number;
40
41
  /** Boolean to search for channels as well as users in the server query, default is false and just searches for users */
41
42
  searchForChannels?: boolean;
42
43
  /** Custom search function to override the default implementation */
@@ -48,5 +49,5 @@ export declare type ChannelSearchControllerParams<StreamChatGenerics extends Def
48
49
  /** Set the array of channels displayed in the ChannelList */
49
50
  setChannels: React.Dispatch<React.SetStateAction<Array<Channel<StreamChatGenerics>>>>;
50
51
  };
51
- export declare const useChannelSearch: <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>({ channelType, clearSearchOnClickOutside, disabled, onSearch: onSearchCallback, onSearchExit, onSelectResult, searchForChannels, searchFunction, searchQueryParams, setChannels, }: ChannelSearchControllerParams<StreamChatGenerics>) => SearchController<StreamChatGenerics>;
52
+ export declare const useChannelSearch: <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>({ channelType, clearSearchOnClickOutside, disabled, onSearch: onSearchCallback, onSearchExit, onSelectResult, searchDebounceIntervalMs, searchForChannels, searchFunction, searchQueryParams, setChannels, }: ChannelSearchControllerParams<StreamChatGenerics>) => SearchController<StreamChatGenerics>;
52
53
  //# sourceMappingURL=useChannelSearch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useChannelSearch.d.ts","sourceRoot":"","sources":["../../../../src/components/ChannelSearch/hooks/useChannelSearch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useChannelSearch.d.ts","sourceRoot":"","sources":["../../../../src/components/ChannelSearch/hooks/useChannelSearch.ts"],"names":[],"mappings":"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"}
@@ -1,22 +1,27 @@
1
1
  import { __assign, __awaiter, __generator, __spreadArray } from "tslib";
2
2
  import { useCallback, useEffect, useRef, useState } from 'react';
3
- import throttle from 'lodash.throttle';
3
+ import debounce from 'lodash.debounce';
4
4
  import uniqBy from 'lodash.uniqby';
5
5
  import { isChannel } from '../utils';
6
6
  import { useChatContext } from '../../../context/ChatContext';
7
7
  export var useChannelSearch = function (_a) {
8
- 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;
9
- var _f = useChatContext('useChannelSearch'), client = _f.client, setActiveChannel = _f.setActiveChannel, themeVersion = _f.themeVersion;
10
- var _g = useState(false), inputIsFocused = _g[0], setInputIsFocused = _g[1];
11
- var _h = useState(''), query = _h[0], setQuery = _h[1];
12
- var _j = useState([]), results = _j[0], setResults = _j[1];
13
- var _k = useState(false), searching = _k[0], setSearching = _k[1];
8
+ 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;
9
+ var _g = useChatContext('useChannelSearch'), client = _g.client, setActiveChannel = _g.setActiveChannel, themeVersion = _g.themeVersion;
10
+ var _h = useState(false), inputIsFocused = _h[0], setInputIsFocused = _h[1];
11
+ var _j = useState(''), query = _j[0], setQuery = _j[1];
12
+ var _k = useState([]), results = _k[0], setResults = _k[1];
13
+ var _l = useState(false), searching = _l[0], setSearching = _l[1];
14
+ var searchQueryPromiseInProgress = useRef();
15
+ var shouldIgnoreQueryResults = useRef(false);
14
16
  var inputRef = useRef(null);
15
17
  var searchBarRef = useRef(null);
16
18
  var clearState = useCallback(function () {
17
19
  setQuery('');
18
20
  setResults([]);
19
21
  setSearching(false);
22
+ if (searchQueryPromiseInProgress.current) {
23
+ shouldIgnoreQueryResults.current = true;
24
+ }
20
25
  }, []);
21
26
  var activateSearch = useCallback(function () {
22
27
  setInputIsFocused(true);
@@ -99,45 +104,56 @@ export var useChannelSearch = function (_a) {
99
104
  });
100
105
  }); }, [clearSearchOnClickOutside, client, exitSearch, onSelectResult, setActiveChannel, setChannels]);
101
106
  var getChannels = useCallback(function (text) { return __awaiter(void 0, void 0, void 0, function () {
102
- var userResponse, channelResponse, _a, channels, users_1, users, error_1;
107
+ var results, userQueryPromise, users, channelQueryPromise, _a, channels, users, error_1;
103
108
  var _b, _c, _d, _e, _f, _g;
104
109
  return __generator(this, function (_h) {
105
110
  switch (_h.label) {
106
111
  case 0:
107
- if (!text || searching)
108
- return [2 /*return*/];
109
- setSearching(true);
112
+ results = [];
110
113
  _h.label = 1;
111
114
  case 1:
112
115
  _h.trys.push([1, 6, , 7]);
113
- 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))];
116
+ 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));
117
+ if (!!searchForChannels) return [3 /*break*/, 3];
118
+ searchQueryPromiseInProgress.current = userQueryPromise;
119
+ return [4 /*yield*/, searchQueryPromiseInProgress.current];
114
120
  case 2:
115
- userResponse = _h.sent();
116
- if (!searchForChannels) return [3 /*break*/, 4];
117
- 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));
118
- return [4 /*yield*/, Promise.all([channelResponse, userResponse])];
119
- case 3:
120
- _a = _h.sent(), channels = _a[0], users_1 = _a[1].users;
121
- setResults(__spreadArray(__spreadArray([], channels, true), users_1, true));
122
- setSearching(false);
123
- return [2 /*return*/];
124
- case 4: return [4 /*yield*/, Promise.resolve(userResponse)];
125
- case 5:
126
121
  users = (_h.sent()).users;
127
- setResults(users);
128
- return [3 /*break*/, 7];
122
+ results = users;
123
+ return [3 /*break*/, 5];
124
+ case 3:
125
+ 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));
126
+ searchQueryPromiseInProgress.current = Promise.all([
127
+ channelQueryPromise,
128
+ userQueryPromise,
129
+ ]);
130
+ return [4 /*yield*/, searchQueryPromiseInProgress.current];
131
+ case 4:
132
+ _a = _h.sent(), channels = _a[0], users = _a[1].users;
133
+ results = __spreadArray(__spreadArray([], channels, true), users, true);
134
+ _h.label = 5;
135
+ case 5: return [3 /*break*/, 7];
129
136
  case 6:
130
137
  error_1 = _h.sent();
131
- clearState();
132
138
  console.error(error_1);
133
139
  return [3 /*break*/, 7];
134
140
  case 7:
135
141
  setSearching(false);
142
+ if (!shouldIgnoreQueryResults.current) {
143
+ setResults(results);
144
+ }
145
+ else {
146
+ shouldIgnoreQueryResults.current = false;
147
+ }
148
+ searchQueryPromiseInProgress.current = undefined;
136
149
  return [2 /*return*/];
137
150
  }
138
151
  });
139
- }); }, [client, searching, searchForChannels]);
140
- var getChannelsThrottled = throttle(getChannels, 200);
152
+ }); }, [client, searchForChannels, searchQueryParams]);
153
+ var scheduleGetChannels = useCallback(debounce(getChannels, searchDebounceIntervalMs), [
154
+ getChannels,
155
+ searchDebounceIntervalMs,
156
+ ]);
141
157
  var onSearch = useCallback(function (event) {
142
158
  event.preventDefault();
143
159
  if (disabled)
@@ -149,12 +165,17 @@ export var useChannelSearch = function (_a) {
149
165
  setSearching: setSearching,
150
166
  }, event);
151
167
  }
152
- else {
168
+ else if (event.target.value) {
169
+ setSearching(true);
153
170
  setQuery(event.target.value);
154
- getChannelsThrottled(event.target.value);
171
+ scheduleGetChannels(event.target.value);
172
+ }
173
+ else if (!event.target.value) {
174
+ clearState();
175
+ scheduleGetChannels.cancel();
155
176
  }
156
177
  onSearchCallback === null || onSearchCallback === void 0 ? void 0 : onSearchCallback(event);
157
- }, [disabled, getChannelsThrottled, onSearchCallback, searchFunction]);
178
+ }, [clearState, disabled, scheduleGetChannels, onSearchCallback, searchFunction]);
158
179
  return {
159
180
  activateSearch: activateSearch,
160
181
  clearState: clearState,
package/dist/index.cjs.js CHANGED
@@ -34293,6 +34293,63 @@ var useIsChannelMuted = function (channel) {
34293
34293
  return muted;
34294
34294
  };
34295
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
+
34296
34353
  var ChannelPreview = function (props) {
34297
34354
  var channel = props.channel, _a = props.Preview, Preview = _a === void 0 ? ChannelPreviewMessenger : _a, channelUpdateCount = props.channelUpdateCount;
34298
34355
  var _b = useChatContext('ChannelPreview'), activeChannel = _b.channel, client = _b.client, setActiveChannel = _b.setActiveChannel;
@@ -34300,6 +34357,10 @@ var ChannelPreview = function (props) {
34300
34357
  var _d = useChannelPreviewInfo({ channel: channel }), displayImage = _d.displayImage, displayTitle = _d.displayTitle;
34301
34358
  var _e = React.useState(channel.state.messages[channel.state.messages.length - 1]), lastMessage = _e[0], setLastMessage = _e[1];
34302
34359
  var _f = React.useState(0), unread = _f[0], setUnread = _f[1];
34360
+ var messageDeliveryStatus = useMessageDeliveryStatus({
34361
+ channel: channel,
34362
+ lastMessage: lastMessage,
34363
+ }).messageDeliveryStatus;
34303
34364
  var isActive = (activeChannel === null || activeChannel === void 0 ? void 0 : activeChannel.cid) === channel.cid;
34304
34365
  var muted = useIsChannelMuted(channel).muted;
34305
34366
  React.useEffect(function () {
@@ -34339,24 +34400,29 @@ var ChannelPreview = function (props) {
34339
34400
  if (!Preview)
34340
34401
  return null;
34341
34402
  var latestMessage = getLatestMessagePreview(channel, t, userLanguage);
34342
- 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 })));
34343
34404
  };
34344
34405
 
34345
34406
  var isChannel = function (output) { return output.cid != null; };
34346
34407
 
34347
34408
  var useChannelSearch = function (_a) {
34348
- 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;
34349
- var _f = useChatContext('useChannelSearch'), client = _f.client, setActiveChannel = _f.setActiveChannel, themeVersion = _f.themeVersion;
34350
- var _g = React.useState(false), inputIsFocused = _g[0], setInputIsFocused = _g[1];
34351
- var _h = React.useState(''), query = _h[0], setQuery = _h[1];
34352
- var _j = React.useState([]), results = _j[0], setResults = _j[1];
34353
- 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);
34354
34417
  var inputRef = React.useRef(null);
34355
34418
  var searchBarRef = React.useRef(null);
34356
34419
  var clearState = React.useCallback(function () {
34357
34420
  setQuery('');
34358
34421
  setResults([]);
34359
34422
  setSearching(false);
34423
+ if (searchQueryPromiseInProgress.current) {
34424
+ shouldIgnoreQueryResults.current = true;
34425
+ }
34360
34426
  }, []);
34361
34427
  var activateSearch = React.useCallback(function () {
34362
34428
  setInputIsFocused(true);
@@ -34439,45 +34505,56 @@ var useChannelSearch = function (_a) {
34439
34505
  });
34440
34506
  }); }, [clearSearchOnClickOutside, client, exitSearch, onSelectResult, setActiveChannel, setChannels]);
34441
34507
  var getChannels = React.useCallback(function (text) { return __awaiter(void 0, void 0, void 0, function () {
34442
- var userResponse, channelResponse, _a, channels, users_1, users, error_1;
34508
+ var results, userQueryPromise, users, channelQueryPromise, _a, channels, users, error_1;
34443
34509
  var _b, _c, _d, _e, _f, _g;
34444
34510
  return __generator(this, function (_h) {
34445
34511
  switch (_h.label) {
34446
34512
  case 0:
34447
- if (!text || searching)
34448
- return [2 /*return*/];
34449
- setSearching(true);
34513
+ results = [];
34450
34514
  _h.label = 1;
34451
34515
  case 1:
34452
34516
  _h.trys.push([1, 6, , 7]);
34453
- 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];
34454
34521
  case 2:
34455
- userResponse = _h.sent();
34456
- if (!searchForChannels) return [3 /*break*/, 4];
34457
- 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));
34458
- return [4 /*yield*/, Promise.all([channelResponse, userResponse])];
34459
- case 3:
34460
- _a = _h.sent(), channels = _a[0], users_1 = _a[1].users;
34461
- setResults(__spreadArray(__spreadArray([], channels, true), users_1, true));
34462
- setSearching(false);
34463
- return [2 /*return*/];
34464
- case 4: return [4 /*yield*/, Promise.resolve(userResponse)];
34465
- case 5:
34466
34522
  users = (_h.sent()).users;
34467
- setResults(users);
34468
- 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];
34469
34537
  case 6:
34470
34538
  error_1 = _h.sent();
34471
- clearState();
34472
34539
  console.error(error_1);
34473
34540
  return [3 /*break*/, 7];
34474
34541
  case 7:
34475
34542
  setSearching(false);
34543
+ if (!shouldIgnoreQueryResults.current) {
34544
+ setResults(results);
34545
+ }
34546
+ else {
34547
+ shouldIgnoreQueryResults.current = false;
34548
+ }
34549
+ searchQueryPromiseInProgress.current = undefined;
34476
34550
  return [2 /*return*/];
34477
34551
  }
34478
34552
  });
34479
- }); }, [client, searching, searchForChannels]);
34480
- 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
+ ]);
34481
34558
  var onSearch = React.useCallback(function (event) {
34482
34559
  event.preventDefault();
34483
34560
  if (disabled)
@@ -34489,12 +34566,17 @@ var useChannelSearch = function (_a) {
34489
34566
  setSearching: setSearching,
34490
34567
  }, event);
34491
34568
  }
34492
- else {
34569
+ else if (event.target.value) {
34570
+ setSearching(true);
34493
34571
  setQuery(event.target.value);
34494
- getChannelsThrottled(event.target.value);
34572
+ scheduleGetChannels(event.target.value);
34573
+ }
34574
+ else if (!event.target.value) {
34575
+ clearState();
34576
+ scheduleGetChannels.cancel();
34495
34577
  }
34496
34578
  onSearchCallback === null || onSearchCallback === void 0 ? void 0 : onSearchCallback(event);
34497
- }, [disabled, getChannelsThrottled, onSearchCallback, searchFunction]);
34579
+ }, [clearState, disabled, scheduleGetChannels, onSearchCallback, searchFunction]);
34498
34580
  return {
34499
34581
  activateSearch: activateSearch,
34500
34582
  clearState: clearState,
@@ -34887,7 +34969,7 @@ var UnMemoizedChannelList = function (props) {
34887
34969
  */
34888
34970
  var ChannelList = React__default["default"].memo(UnMemoizedChannelList);
34889
34971
 
34890
- var version = '10.11.0';
34972
+ var version = '10.12.0';
34891
34973
 
34892
34974
  var useChat = function (_a) {
34893
34975
  var _b, _c;