@sendbird/uikit-chat-hooks 3.0.4 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/lib/commonjs/channel/useChannelMessagesReducer.js +60 -11
  2. package/lib/commonjs/channel/useChannelMessagesReducer.js.map +1 -1
  3. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +94 -83
  4. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
  5. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +44 -26
  6. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
  7. package/lib/commonjs/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js +46 -28
  8. package/lib/commonjs/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js.map +1 -1
  9. package/lib/commonjs/types.js.map +1 -1
  10. package/lib/module/channel/useChannelMessagesReducer.js +61 -12
  11. package/lib/module/channel/useChannelMessagesReducer.js.map +1 -1
  12. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +96 -85
  13. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
  14. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +44 -26
  15. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
  16. package/lib/module/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js +46 -28
  17. package/lib/module/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js.map +1 -1
  18. package/lib/module/types.js.map +1 -1
  19. package/lib/typescript/src/types.d.ts +1 -0
  20. package/package.json +5 -5
  21. package/src/channel/useChannelMessagesReducer.ts +66 -17
  22. package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.ts +75 -84
  23. package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.ts +26 -22
  24. package/src/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.ts +31 -26
  25. package/src/types.ts +1 -0
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.useChannelMessagesReducer = void 0;
7
7
  var _react = require("react");
8
+ var _message = require("@sendbird/chat/message");
8
9
  var _uikitUtils = require("@sendbird/uikit-utils");
9
10
  const defaultReducer = (_ref, action) => {
10
11
  let {
@@ -23,26 +24,42 @@ const defaultReducer = (_ref, action) => {
23
24
  }
24
25
  case 'update_messages':
25
26
  {
27
+ const userId = action.value.currentUserId;
26
28
  if (action.value.clearBeforeAction) {
27
- draft['messageMap'] = (0, _uikitUtils.arrayToMapWithGetter)(action.value.messages, _uikitUtils.getMessageUniqId);
29
+ draft['messageMap'] = messagesToObject(action.value.messages);
28
30
  } else {
29
- // Remove existing messages before update for prevent duplicate display
30
- const messageKeys = action.value.messages.map(it => (0, _uikitUtils.isSendableMessage)(it) ? [it.messageId, it.reqId] : [it.messageId]).flat();
31
- messageKeys.forEach(key => delete draft['messageMap'][key]);
31
+ // Filtering meaningless message updates
32
+ const nextMessages = action.value.messages.filter(next => {
33
+ if ((0, _uikitUtils.isMyMessage)(next, userId)) {
34
+ const prev = draft['messageMap'][next.reqId] ?? draft['messageMap'][next.messageId];
35
+ if ((0, _uikitUtils.isMyMessage)(prev, userId)) {
36
+ const shouldUpdate = shouldUpdateMessage(prev, next);
37
+ if (shouldUpdate) {
38
+ // Remove existing messages before update to prevent duplicate display
39
+ delete draft['messageMap'][prev.reqId];
40
+ delete draft['messageMap'][prev.messageId];
41
+ }
42
+ return shouldUpdate;
43
+ }
44
+ }
45
+ return true;
46
+ });
47
+ const obj = messagesToObject(nextMessages);
32
48
  draft['messageMap'] = {
33
49
  ...draft['messageMap'],
34
- ...(0, _uikitUtils.arrayToMapWithGetter)(action.value.messages, _uikitUtils.getMessageUniqId)
50
+ ...obj
35
51
  };
36
52
  }
37
53
  return draft;
38
54
  }
39
55
  case 'update_new_messages':
40
56
  {
41
- const newMessages = action.value.messages.filter(it => (0, _uikitUtils.isNewMessage)(it, action.value.currentUserId));
57
+ const userId = action.value.currentUserId;
58
+ const newMessages = action.value.messages.filter(it => (0, _uikitUtils.isNewMessage)(it, userId));
42
59
  if (action.value.clearBeforeAction) {
43
60
  draft['newMessageMap'] = (0, _uikitUtils.arrayToMapWithGetter)(newMessages, _uikitUtils.getMessageUniqId);
44
61
  } else {
45
- // Remove existing messages before update for prevent duplicate display
62
+ // Remove existing messages before update to prevent duplicate display
46
63
  const messageKeys = newMessages.map(it => it.messageId);
47
64
  messageKeys.forEach(key => delete draft['newMessageMap'][key]);
48
65
  draft['newMessageMap'] = {
@@ -59,12 +76,44 @@ const defaultReducer = (_ref, action) => {
59
76
  draft[key] = {
60
77
  ...draft[key]
61
78
  };
62
- action.value.messageIds.forEach(msgId => delete draft[key][msgId]);
63
- action.value.reqIds.forEach(reqId => delete draft[key][reqId]);
79
+ action.value.messageIds.forEach(msgId => {
80
+ const message = draft[key][msgId];
81
+ if (message) {
82
+ if ((0, _uikitUtils.isSendableMessage)(message)) delete draft[key][message.reqId];
83
+ delete draft[key][message.messageId];
84
+ }
85
+ });
86
+ action.value.reqIds.forEach(reqId => {
87
+ const message = draft[key][reqId];
88
+ if (message) {
89
+ if ((0, _uikitUtils.isSendableMessage)(message)) delete draft[key][message.reqId];
90
+ delete draft[key][message.messageId];
91
+ }
92
+ });
64
93
  return draft;
65
94
  }
66
95
  }
67
96
  };
97
+ const messagesToObject = messages => {
98
+ return messages.reduce((accum, curr) => {
99
+ if ((0, _uikitUtils.isSendableMessage)(curr)) {
100
+ accum[curr.reqId] = curr;
101
+ if (curr.sendingStatus === _message.SendingStatus.SUCCEEDED) {
102
+ accum[curr.messageId] = curr;
103
+ }
104
+ } else {
105
+ accum[curr.messageId] = curr;
106
+ }
107
+ return accum;
108
+ }, {});
109
+ };
110
+ const shouldUpdateMessage = (prev, next) => {
111
+ // message data update (e.g. reactions)
112
+ if (prev.sendingStatus === _message.SendingStatus.SUCCEEDED) return next.sendingStatus === _message.SendingStatus.SUCCEEDED;
113
+
114
+ // message sending status update
115
+ return prev.sendingStatus !== next.sendingStatus;
116
+ };
68
117
  const useChannelMessagesReducer = sortComparator => {
69
118
  const [{
70
119
  loading,
@@ -132,8 +181,8 @@ const useChannelMessagesReducer = sortComparator => {
132
181
  });
133
182
  };
134
183
  const messages = (0, _uikitUtils.useIIFE)(() => {
135
- if (sortComparator) return Object.values(messageMap).sort(sortComparator);
136
- return Object.values(messageMap);
184
+ if (sortComparator) return Array.from(new Set(Object.values(messageMap))).sort(sortComparator);
185
+ return Array.from(new Set(Object.values(messageMap)));
137
186
  });
138
187
  const newMessages = Object.values(newMessageMap);
139
188
  return {
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_uikitUtils","defaultReducer","_ref","action","draft","type","value","status","clearBeforeAction","arrayToMapWithGetter","messages","getMessageUniqId","messageKeys","map","it","isSendableMessage","messageId","reqId","flat","forEach","key","newMessages","filter","isNewMessage","currentUserId","messageIds","msgId","reqIds","useChannelMessagesReducer","sortComparator","loading","refreshing","messageMap","newMessageMap","dispatch","useReducer","updateMessages","deleteMessages","updateNewMessages","deleteNewMessages","updateLoading","updateRefreshing","useIIFE","Object","values","sort","exports"],"sources":["useChannelMessagesReducer.ts"],"sourcesContent":["import { useReducer } from 'react';\n\nimport type { SendbirdBaseMessage } from '@sendbird/uikit-utils';\nimport {\n SendbirdMessage,\n arrayToMapWithGetter,\n getMessageUniqId,\n isNewMessage,\n isSendableMessage,\n useIIFE,\n} from '@sendbird/uikit-utils';\n\ntype Options = {\n sortComparator?: (a: SendbirdMessage, b: SendbirdMessage) => number;\n};\n\ntype Action =\n | {\n type: 'update_loading' | 'update_refreshing';\n value: { status: boolean };\n }\n | {\n type: 'update_messages' | 'update_new_messages';\n value: { messages: SendbirdBaseMessage[]; clearBeforeAction: boolean; currentUserId?: string };\n }\n | {\n type: 'delete_messages' | 'delete_new_messages';\n value: { messageIds: number[]; reqIds: string[] };\n };\n\ntype State = {\n loading: boolean;\n refreshing: boolean;\n messageMap: Record<string, SendbirdBaseMessage>;\n newMessageMap: Record<string, SendbirdBaseMessage>;\n};\n\nconst defaultReducer = ({ ...draft }: State, action: Action) => {\n switch (action.type) {\n case 'update_refreshing': {\n draft['refreshing'] = action.value.status;\n return draft;\n }\n case 'update_loading': {\n draft['loading'] = action.value.status;\n return draft;\n }\n case 'update_messages': {\n if (action.value.clearBeforeAction) {\n draft['messageMap'] = arrayToMapWithGetter(action.value.messages, getMessageUniqId);\n } else {\n // Remove existing messages before update for prevent duplicate display\n const messageKeys = action.value.messages\n .map((it) => (isSendableMessage(it) ? [it.messageId, it.reqId] : [it.messageId]))\n .flat();\n messageKeys.forEach((key) => delete draft['messageMap'][key]);\n\n draft['messageMap'] = {\n ...draft['messageMap'],\n ...arrayToMapWithGetter(action.value.messages, getMessageUniqId),\n };\n }\n\n return draft;\n }\n case 'update_new_messages': {\n const newMessages = action.value.messages.filter((it) => isNewMessage(it, action.value.currentUserId));\n\n if (action.value.clearBeforeAction) {\n draft['newMessageMap'] = arrayToMapWithGetter(newMessages, getMessageUniqId);\n } else {\n // Remove existing messages before update for prevent duplicate display\n const messageKeys = newMessages.map((it) => it.messageId);\n messageKeys.forEach((key) => delete draft['newMessageMap'][key]);\n\n draft['newMessageMap'] = {\n ...draft['newMessageMap'],\n ...arrayToMapWithGetter(newMessages, getMessageUniqId),\n };\n }\n\n return draft;\n }\n case 'delete_messages':\n case 'delete_new_messages': {\n const key = action.type === 'delete_messages' ? 'messageMap' : 'newMessageMap';\n draft[key] = { ...draft[key] };\n action.value.messageIds.forEach((msgId) => delete draft[key][msgId]);\n action.value.reqIds.forEach((reqId) => delete draft[key][reqId]);\n\n return draft;\n }\n }\n};\n\nexport const useChannelMessagesReducer = (sortComparator?: Options['sortComparator']) => {\n const [{ loading, refreshing, messageMap, newMessageMap }, dispatch] = useReducer(defaultReducer, {\n loading: true,\n refreshing: false,\n messageMap: {},\n newMessageMap: {},\n });\n\n const updateMessages = (messages: SendbirdBaseMessage[], clearBeforeAction: boolean, currentUserId?: string) => {\n dispatch({ type: 'update_messages', value: { messages, clearBeforeAction, currentUserId } });\n };\n const deleteMessages = (messageIds: number[], reqIds: string[]) => {\n dispatch({ type: 'delete_messages', value: { messageIds, reqIds } });\n };\n const updateNewMessages = (messages: SendbirdBaseMessage[], clearBeforeAction: boolean, currentUserId?: string) => {\n dispatch({ type: 'update_new_messages', value: { messages, clearBeforeAction, currentUserId } });\n };\n const deleteNewMessages = (messageIds: number[], reqIds: string[]) => {\n dispatch({ type: 'delete_new_messages', value: { messageIds, reqIds } });\n };\n const updateLoading = (status: boolean) => {\n dispatch({ type: 'update_loading', value: { status } });\n };\n const updateRefreshing = (status: boolean) => {\n dispatch({ type: 'update_refreshing', value: { status } });\n };\n\n const messages = useIIFE(() => {\n if (sortComparator) return Object.values(messageMap).sort(sortComparator);\n return Object.values(messageMap);\n });\n const newMessages = Object.values(newMessageMap);\n\n return {\n updateLoading,\n updateRefreshing,\n updateMessages,\n deleteMessages,\n\n loading,\n refreshing,\n messages,\n\n newMessages,\n updateNewMessages,\n deleteNewMessages,\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["_react","require","_message","_uikitUtils","defaultReducer","_ref","action","draft","type","value","status","userId","currentUserId","clearBeforeAction","messagesToObject","messages","nextMessages","filter","next","isMyMessage","prev","reqId","messageId","shouldUpdate","shouldUpdateMessage","obj","newMessages","it","isNewMessage","arrayToMapWithGetter","getMessageUniqId","messageKeys","map","forEach","key","messageIds","msgId","message","isSendableMessage","reqIds","reduce","accum","curr","sendingStatus","SendingStatus","SUCCEEDED","useChannelMessagesReducer","sortComparator","loading","refreshing","messageMap","newMessageMap","dispatch","useReducer","updateMessages","deleteMessages","updateNewMessages","deleteNewMessages","updateLoading","updateRefreshing","useIIFE","Array","from","Set","Object","values","sort","exports"],"sources":["useChannelMessagesReducer.ts"],"sourcesContent":["import { useReducer } from 'react';\n\nimport { SendableMessage } from '@sendbird/chat/lib/__definition';\nimport { SendingStatus } from '@sendbird/chat/message';\nimport type { SendbirdBaseMessage } from '@sendbird/uikit-utils';\nimport {\n SendbirdMessage,\n arrayToMapWithGetter,\n getMessageUniqId,\n isMyMessage,\n isNewMessage,\n isSendableMessage,\n useIIFE,\n} from '@sendbird/uikit-utils';\n\ntype Options = {\n sortComparator?: (a: SendbirdMessage, b: SendbirdMessage) => number;\n};\n\ntype Action =\n | {\n type: 'update_loading' | 'update_refreshing';\n value: { status: boolean };\n }\n | {\n type: 'update_messages' | 'update_new_messages';\n value: { messages: SendbirdBaseMessage[]; clearBeforeAction: boolean; currentUserId?: string };\n }\n | {\n type: 'delete_messages' | 'delete_new_messages';\n value: { messageIds: number[]; reqIds: string[] };\n };\n\ntype State = {\n loading: boolean;\n refreshing: boolean;\n messageMap: Record<string, SendbirdBaseMessage>;\n newMessageMap: Record<string, SendbirdBaseMessage>;\n};\n\nconst defaultReducer = ({ ...draft }: State, action: Action) => {\n switch (action.type) {\n case 'update_refreshing': {\n draft['refreshing'] = action.value.status;\n return draft;\n }\n case 'update_loading': {\n draft['loading'] = action.value.status;\n return draft;\n }\n case 'update_messages': {\n const userId = action.value.currentUserId;\n\n if (action.value.clearBeforeAction) {\n draft['messageMap'] = messagesToObject(action.value.messages);\n } else {\n // Filtering meaningless message updates\n const nextMessages = action.value.messages.filter((next) => {\n if (isMyMessage(next, userId)) {\n const prev = draft['messageMap'][next.reqId] ?? draft['messageMap'][next.messageId];\n if (isMyMessage(prev, userId)) {\n const shouldUpdate = shouldUpdateMessage(prev, next);\n if (shouldUpdate) {\n // Remove existing messages before update to prevent duplicate display\n delete draft['messageMap'][prev.reqId];\n delete draft['messageMap'][prev.messageId];\n }\n return shouldUpdate;\n }\n }\n return true;\n });\n\n const obj = messagesToObject(nextMessages);\n draft['messageMap'] = { ...draft['messageMap'], ...obj };\n }\n\n return draft;\n }\n case 'update_new_messages': {\n const userId = action.value.currentUserId;\n const newMessages = action.value.messages.filter((it) => isNewMessage(it, userId));\n\n if (action.value.clearBeforeAction) {\n draft['newMessageMap'] = arrayToMapWithGetter(newMessages, getMessageUniqId);\n } else {\n // Remove existing messages before update to prevent duplicate display\n const messageKeys = newMessages.map((it) => it.messageId);\n messageKeys.forEach((key) => delete draft['newMessageMap'][key]);\n\n draft['newMessageMap'] = {\n ...draft['newMessageMap'],\n ...arrayToMapWithGetter(newMessages, getMessageUniqId),\n };\n }\n\n return draft;\n }\n case 'delete_messages':\n case 'delete_new_messages': {\n const key = action.type === 'delete_messages' ? 'messageMap' : 'newMessageMap';\n draft[key] = { ...draft[key] };\n action.value.messageIds.forEach((msgId) => {\n const message = draft[key][msgId];\n if (message) {\n if (isSendableMessage(message)) delete draft[key][message.reqId];\n delete draft[key][message.messageId];\n }\n });\n action.value.reqIds.forEach((reqId) => {\n const message = draft[key][reqId];\n if (message) {\n if (isSendableMessage(message)) delete draft[key][message.reqId];\n delete draft[key][message.messageId];\n }\n });\n\n return draft;\n }\n }\n};\n\nconst messagesToObject = (messages: SendbirdBaseMessage[]) => {\n return messages.reduce((accum, curr) => {\n if (isSendableMessage(curr)) {\n accum[curr.reqId] = curr;\n if (curr.sendingStatus === SendingStatus.SUCCEEDED) {\n accum[curr.messageId] = curr;\n }\n } else {\n accum[curr.messageId] = curr;\n }\n return accum;\n }, {} as Record<string, SendbirdBaseMessage>);\n};\n\nconst shouldUpdateMessage = (prev: SendableMessage, next: SendableMessage) => {\n // message data update (e.g. reactions)\n if (prev.sendingStatus === SendingStatus.SUCCEEDED) return next.sendingStatus === SendingStatus.SUCCEEDED;\n\n // message sending status update\n return prev.sendingStatus !== next.sendingStatus;\n};\n\nexport const useChannelMessagesReducer = (sortComparator?: Options['sortComparator']) => {\n const [{ loading, refreshing, messageMap, newMessageMap }, dispatch] = useReducer(defaultReducer, {\n loading: true,\n refreshing: false,\n messageMap: {},\n newMessageMap: {},\n });\n\n const updateMessages = (messages: SendbirdBaseMessage[], clearBeforeAction: boolean, currentUserId?: string) => {\n dispatch({ type: 'update_messages', value: { messages, clearBeforeAction, currentUserId } });\n };\n const deleteMessages = (messageIds: number[], reqIds: string[]) => {\n dispatch({ type: 'delete_messages', value: { messageIds, reqIds } });\n };\n const updateNewMessages = (messages: SendbirdBaseMessage[], clearBeforeAction: boolean, currentUserId?: string) => {\n dispatch({ type: 'update_new_messages', value: { messages, clearBeforeAction, currentUserId } });\n };\n const deleteNewMessages = (messageIds: number[], reqIds: string[]) => {\n dispatch({ type: 'delete_new_messages', value: { messageIds, reqIds } });\n };\n const updateLoading = (status: boolean) => {\n dispatch({ type: 'update_loading', value: { status } });\n };\n const updateRefreshing = (status: boolean) => {\n dispatch({ type: 'update_refreshing', value: { status } });\n };\n\n const messages = useIIFE(() => {\n if (sortComparator) return Array.from(new Set(Object.values(messageMap))).sort(sortComparator);\n return Array.from(new Set(Object.values(messageMap)));\n });\n const newMessages = Object.values(newMessageMap);\n\n return {\n updateLoading,\n updateRefreshing,\n updateMessages,\n deleteMessages,\n\n loading,\n refreshing,\n messages,\n\n newMessages,\n updateNewMessages,\n deleteNewMessages,\n };\n};\n"],"mappings":"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"}
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.useGroupChannelMessagesWithCollection = void 0;
7
7
  var _react = require("react");
8
+ var _chat = require("@sendbird/chat");
8
9
  var _groupChannel = require("@sendbird/chat/groupChannel");
9
10
  var _uikitUtils = require("@sendbird/uikit-utils");
10
11
  var _useChannelHandler = require("../../handler/useChannelHandler");
@@ -29,9 +30,12 @@ function isNotEmpty(arr) {
29
30
  if (!arr) return false;
30
31
  return arr.length !== 0;
31
32
  }
33
+ function shouldUseSearchLimit(startingPoint) {
34
+ return startingPoint < Date.now();
35
+ }
32
36
  const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) => {
33
37
  const initialStartingPoint = (options === null || options === void 0 ? void 0 : options.startingPoint) ?? Number.MAX_SAFE_INTEGER;
34
- const initialLimit = typeof (options === null || options === void 0 ? void 0 : options.startingPoint) === 'number' ? MESSAGE_LIMIT.SEARCH : MESSAGE_LIMIT.DEFAULT;
38
+ const initialLimit = shouldUseSearchLimit(initialStartingPoint) ? MESSAGE_LIMIT.SEARCH : MESSAGE_LIMIT.DEFAULT;
35
39
  const forceUpdate = (0, _uikitUtils.useForceUpdate)();
36
40
  const collectionRef = (0, _react.useRef)();
37
41
  const collectionInitializedRef = (0, _react.useRef)(false);
@@ -51,9 +55,9 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
51
55
  const channelMarkAsRead = async source => {
52
56
  try {
53
57
  switch (source) {
54
- case _groupChannel.MessageEventSource.EVENT_MESSAGE_RECEIVED:
55
- case _groupChannel.MessageEventSource.EVENT_MESSAGE_SENT_SUCCESS:
56
- case _groupChannel.MessageEventSource.SYNC_MESSAGE_FILL:
58
+ case _chat.CollectionEventSource.EVENT_MESSAGE_RECEIVED:
59
+ case _chat.CollectionEventSource.EVENT_MESSAGE_SENT_SUCCESS:
60
+ case _chat.CollectionEventSource.SYNC_MESSAGE_FILL:
57
61
  case undefined:
58
62
  await (0, _uikitUtils.confirmAndMarkAsRead)([channel]);
59
63
  break;
@@ -62,77 +66,66 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
62
66
  _uikitUtils.Logger.warn('[useGroupChannelMessagesWithCollection/channelMarkAsRead]', e);
63
67
  }
64
68
  };
65
- const updateUnsendMessages = () => {
69
+ const updateNewMessagesReceived = (source, messages) => {
70
+ const incomingMessages = messages.filter(it => {
71
+ var _sdk$currentUser;
72
+ return !(0, _uikitUtils.isMyMessage)(it, (_sdk$currentUser = sdk.currentUser) === null || _sdk$currentUser === void 0 ? void 0 : _sdk$currentUser.userId);
73
+ });
74
+ if (incomingMessages.length > 0) {
75
+ switch (source) {
76
+ case _chat.CollectionEventSource.EVENT_MESSAGE_RECEIVED:
77
+ case _chat.CollectionEventSource.SYNC_MESSAGE_FILL:
78
+ {
79
+ var _options$shouldCountN, _sdk$currentUser2, _options$onMessagesRe;
80
+ if (options !== null && options !== void 0 && (_options$shouldCountN = options.shouldCountNewMessages) !== null && _options$shouldCountN !== void 0 && _options$shouldCountN.call(options)) updateNewMessages(incomingMessages, false, (_sdk$currentUser2 = sdk.currentUser) === null || _sdk$currentUser2 === void 0 ? void 0 : _sdk$currentUser2.userId);
81
+ options === null || options === void 0 ? void 0 : (_options$onMessagesRe = options.onMessagesReceived) === null || _options$onMessagesRe === void 0 ? void 0 : _options$onMessagesRe.call(options, incomingMessages);
82
+ break;
83
+ }
84
+ }
85
+ }
86
+ };
87
+ const updateUnsentMessages = () => {
88
+ var _sdk$currentUser3, _sdk$currentUser4;
66
89
  const {
67
90
  pendingMessages,
68
91
  failedMessages
69
92
  } = collectionRef.current ?? {};
70
- if (isNotEmpty(pendingMessages)) updateMessages(pendingMessages, false, sdk.currentUser.userId);
71
- if (isNotEmpty(failedMessages)) updateMessages(failedMessages, false, sdk.currentUser.userId);
93
+ if (isNotEmpty(pendingMessages)) updateMessages(pendingMessages, false, (_sdk$currentUser3 = sdk.currentUser) === null || _sdk$currentUser3 === void 0 ? void 0 : _sdk$currentUser3.userId);
94
+ if (isNotEmpty(failedMessages)) updateMessages(failedMessages, false, (_sdk$currentUser4 = sdk.currentUser) === null || _sdk$currentUser4 === void 0 ? void 0 : _sdk$currentUser4.userId);
72
95
  };
73
96
  const init = (0, _uikitUtils.useFreshCallback)(async (startingPoint, limit, callback) => {
74
- var _collectionRef$curren, _collectionRef$curren2;
97
+ var _collectionRef$curren, _sdk$currentUser5, _collectionRef$curren2;
75
98
  if (collectionRef.current) (_collectionRef$curren = collectionRef.current) === null || _collectionRef$curren === void 0 ? void 0 : _collectionRef$curren.dispose();
76
99
  channelMarkAsRead();
77
- updateNewMessages([], true, sdk.currentUser.userId);
100
+ updateNewMessages([], true, (_sdk$currentUser5 = sdk.currentUser) === null || _sdk$currentUser5 === void 0 ? void 0 : _sdk$currentUser5.userId);
78
101
  collectionInitializedRef.current = false;
79
102
  collectionRef.current = createMessageCollection(channel, limit, {
80
103
  ...options,
81
104
  startingPoint
82
105
  });
83
106
  (_collectionRef$curren2 = collectionRef.current) === null || _collectionRef$curren2 === void 0 ? void 0 : _collectionRef$curren2.setMessageCollectionHandler({
84
- onMessagesAdded: (_, __, messages) => {
85
- channelMarkAsRead(_.source);
86
- const incomingMessages = messages.filter(it => {
87
- switch (_.source) {
88
- case _groupChannel.MessageEventSource.EVENT_MESSAGE_SENT_PENDING:
89
- case _groupChannel.MessageEventSource.EVENT_MESSAGE_SENT_SUCCESS:
90
- case _groupChannel.MessageEventSource.EVENT_MESSAGE_SENT_FAILED:
91
- return !(0, _uikitUtils.isMyMessage)(it, sdk.currentUser.userId);
92
- default:
93
- return true;
94
- }
95
- });
96
- if (incomingMessages.length > 0) {
97
- var _options$shouldCountN;
98
- updateMessages(incomingMessages, false, sdk.currentUser.userId);
99
- if (options !== null && options !== void 0 && (_options$shouldCountN = options.shouldCountNewMessages) !== null && _options$shouldCountN !== void 0 && _options$shouldCountN.call(options)) {
100
- updateNewMessages(incomingMessages, false, sdk.currentUser.userId);
101
- }
102
- switch (_.source) {
103
- case _groupChannel.MessageEventSource.EVENT_MESSAGE_RECEIVED:
104
- case _groupChannel.MessageEventSource.SYNC_MESSAGE_FILL:
105
- {
106
- var _options$onMessagesRe;
107
- options === null || options === void 0 ? void 0 : (_options$onMessagesRe = options.onMessagesReceived) === null || _options$onMessagesRe === void 0 ? void 0 : _options$onMessagesRe.call(options, incomingMessages);
108
- }
109
- }
110
- }
107
+ onMessagesAdded: (ctx, __, messages) => {
108
+ var _sdk$currentUser6;
109
+ channelMarkAsRead(ctx.source);
110
+ updateNewMessagesReceived(ctx.source, messages);
111
+ updateMessages(messages, false, (_sdk$currentUser6 = sdk.currentUser) === null || _sdk$currentUser6 === void 0 ? void 0 : _sdk$currentUser6.userId);
111
112
  },
112
- onMessagesUpdated: (_, __, messages) => {
113
- channelMarkAsRead(_.source);
114
- const incomingMessages = messages.filter(it => {
115
- switch (_.source) {
116
- case _groupChannel.MessageEventSource.EVENT_MESSAGE_UPDATED:
117
- return !(0, _uikitUtils.isMyMessage)(it, sdk.currentUser.userId);
118
- default:
119
- return true;
120
- }
121
- });
122
- if (incomingMessages.length > 0) {
123
- var _options$shouldCountN2;
124
- // NOTE: admin message is not added via onMessagesAdded handler, not checked yet is this a bug.
125
- updateMessages(messages, false, sdk.currentUser.userId);
126
- if (options !== null && options !== void 0 && (_options$shouldCountN2 = options.shouldCountNewMessages) !== null && _options$shouldCountN2 !== void 0 && _options$shouldCountN2.call(options)) {
127
- if (_.source === _groupChannel.MessageEventSource.EVENT_MESSAGE_RECEIVED) {
128
- updateNewMessages(messages, false, sdk.currentUser.userId);
129
- }
130
- }
113
+ onMessagesUpdated: (ctx, __, messages) => {
114
+ var _sdk$currentUser7;
115
+ channelMarkAsRead(ctx.source);
116
+ updateNewMessagesReceived(ctx.source, messages); // NOTE: admin message is not added via onMessagesAdded handler, not checked yet is this a bug.
117
+
118
+ updateMessages(messages, false, (_sdk$currentUser7 = sdk.currentUser) === null || _sdk$currentUser7 === void 0 ? void 0 : _sdk$currentUser7.userId);
119
+ if (ctx.source === _chat.CollectionEventSource.EVENT_MESSAGE_UPDATED) {
120
+ var _options$onMessagesUp;
121
+ options === null || options === void 0 ? void 0 : (_options$onMessagesUp = options.onMessagesUpdated) === null || _options$onMessagesUp === void 0 ? void 0 : _options$onMessagesUp.call(options, messages);
131
122
  }
132
123
  },
133
- onMessagesDeleted: (_, __, messageIds) => {
134
- deleteMessages(messageIds, []);
135
- deleteNewMessages(messageIds, []);
124
+ onMessagesDeleted: (_, __, ___, messages) => {
125
+ const msgIds = messages.map(it => it.messageId);
126
+ const reqIds = messages.filter(_uikitUtils.isSendableMessage).map(it => it.reqId);
127
+ deleteMessages(msgIds, reqIds);
128
+ deleteNewMessages(msgIds, reqIds);
136
129
  },
137
130
  onChannelDeleted: () => {
138
131
  var _options$onChannelDel;
@@ -148,19 +141,20 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
148
141
  }
149
142
  });
150
143
  collectionRef.current.initialize(_groupChannel.MessageCollectionInitPolicy.CACHE_AND_REPLACE_BY_API).onCacheResult((err, messages) => {
151
- if (err) sdk.isCacheEnabled && _uikitUtils.Logger.error('[useGroupChannelMessagesWithCollection/onCacheResult]', err);else {
144
+ if (err) sdk.isCacheEnabled && _uikitUtils.Logger.error('[useGroupChannelMessagesWithCollection/onCacheResult]', err);else if (messages) {
145
+ var _sdk$currentUser8;
152
146
  _uikitUtils.Logger.debug('[useGroupChannelMessagesWithCollection/onCacheResult]', 'message length:', messages.length);
153
- updateMessages(messages, true, sdk.currentUser.userId);
154
- updateUnsendMessages();
147
+ updateMessages(messages, true, (_sdk$currentUser8 = sdk.currentUser) === null || _sdk$currentUser8 === void 0 ? void 0 : _sdk$currentUser8.userId);
148
+ updateUnsentMessages();
155
149
  }
156
150
  callback === null || callback === void 0 ? void 0 : callback();
157
151
  }).onApiResult((err, messages) => {
158
- if (err) _uikitUtils.Logger.warn('[useGroupChannelMessagesWithCollection/onApiResult]', err);else {
159
- var _options$onMessagesRe2;
152
+ if (err) _uikitUtils.Logger.warn('[useGroupChannelMessagesWithCollection/onApiResult]', err);else if (messages) {
153
+ var _sdk$currentUser9, _options$onMessagesRe2;
160
154
  _uikitUtils.Logger.debug('[useGroupChannelMessagesWithCollection/onApiResult]', 'message length:', messages.length);
161
- updateMessages(messages, true, sdk.currentUser.userId);
155
+ updateMessages(messages, true, (_sdk$currentUser9 = sdk.currentUser) === null || _sdk$currentUser9 === void 0 ? void 0 : _sdk$currentUser9.userId);
162
156
  if (!(options !== null && options !== void 0 && options.startingPoint)) options === null || options === void 0 ? void 0 : (_options$onMessagesRe2 = options.onMessagesReceived) === null || _options$onMessagesRe2 === void 0 ? void 0 : _options$onMessagesRe2.call(options, messages);
163
- if (sdk.isCacheEnabled) updateUnsendMessages();
157
+ if (sdk.isCacheEnabled) updateUnsentMessages();
164
158
  }
165
159
  collectionInitializedRef.current = true;
166
160
  callback === null || callback === void 0 ? void 0 : callback();
@@ -169,7 +163,8 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
169
163
  (0, _useChannelHandler.useChannelHandler)(sdk, handlerId, {
170
164
  onUserBanned(channel, bannedUser) {
171
165
  if (channel.isGroupChannel() && !(0, _uikitUtils.isDifferentChannel)(channel, channel)) {
172
- if (bannedUser.userId === sdk.currentUser.userId) {
166
+ var _sdk$currentUser10;
167
+ if (bannedUser.userId === ((_sdk$currentUser10 = sdk.currentUser) === null || _sdk$currentUser10 === void 0 ? void 0 : _sdk$currentUser10.userId)) {
173
168
  var _options$onChannelDel2;
174
169
  options === null || options === void 0 ? void 0 : (_options$onChannelDel2 = options.onChannelDeleted) === null || _options$onChannelDel2 === void 0 ? void 0 : _options$onChannelDel2.call(options);
175
170
  } else {
@@ -184,7 +179,7 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
184
179
  updateLoading(true);
185
180
  init(initialStartingPoint, initialLimit, () => updateLoading(false));
186
181
  }, 0);
187
- }, [channel.url, userId]);
182
+ }, [channel.url, userId, options === null || options === void 0 ? void 0 : options.replyType]);
188
183
  (0, _react.useEffect)(() => {
189
184
  return () => {
190
185
  var _collectionRef$curren3;
@@ -199,9 +194,9 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
199
194
  var _collectionRef$curren4;
200
195
  if (collectionRef.current && (_collectionRef$curren4 = collectionRef.current) !== null && _collectionRef$curren4 !== void 0 && _collectionRef$curren4.hasPrevious) {
201
196
  try {
202
- var _collectionRef$curren5;
197
+ var _collectionRef$curren5, _sdk$currentUser11;
203
198
  const list = await ((_collectionRef$curren5 = collectionRef.current) === null || _collectionRef$curren5 === void 0 ? void 0 : _collectionRef$curren5.loadPrevious());
204
- updateMessages(list, false, sdk.currentUser.userId);
199
+ updateMessages(list, false, (_sdk$currentUser11 = sdk.currentUser) === null || _sdk$currentUser11 === void 0 ? void 0 : _sdk$currentUser11.userId);
205
200
  } catch {}
206
201
  }
207
202
  });
@@ -216,9 +211,9 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
216
211
  var _collectionRef$curren6;
217
212
  if (collectionRef.current && (_collectionRef$curren6 = collectionRef.current) !== null && _collectionRef$curren6 !== void 0 && _collectionRef$curren6.hasNext) {
218
213
  try {
219
- var _collectionRef$curren7;
214
+ var _collectionRef$curren7, _sdk$currentUser12;
220
215
  const fetchedList = await ((_collectionRef$curren7 = collectionRef.current) === null || _collectionRef$curren7 === void 0 ? void 0 : _collectionRef$curren7.loadNext());
221
- updateMessages(fetchedList, false, sdk.currentUser.userId);
216
+ updateMessages(fetchedList, false, (_sdk$currentUser12 = sdk.currentUser) === null || _sdk$currentUser12 === void 0 ? void 0 : _sdk$currentUser12.userId);
222
217
  } catch {}
223
218
  }
224
219
  });
@@ -233,16 +228,21 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
233
228
  return new Promise((resolve, reject) => {
234
229
  channel.sendUserMessage(params).onPending(pendingMessage => {
235
230
  if (pendingMessage.isUserMessage()) {
231
+ var _sdk$currentUser13;
236
232
  onPending === null || onPending === void 0 ? void 0 : onPending(pendingMessage);
237
- updateMessages([pendingMessage], false, sdk.currentUser.userId);
233
+ updateMessages([pendingMessage], false, (_sdk$currentUser13 = sdk.currentUser) === null || _sdk$currentUser13 === void 0 ? void 0 : _sdk$currentUser13.userId);
238
234
  }
239
235
  }).onSucceeded(sentMessage => {
240
236
  if (sentMessage.isUserMessage()) {
241
- updateMessages([sentMessage], false, sdk.currentUser.userId);
237
+ var _sdk$currentUser14;
238
+ updateMessages([sentMessage], false, (_sdk$currentUser14 = sdk.currentUser) === null || _sdk$currentUser14 === void 0 ? void 0 : _sdk$currentUser14.userId);
242
239
  resolve(sentMessage);
243
240
  }
244
241
  }).onFailed((err, failedMessage) => {
245
- updateMessages([failedMessage], false, sdk.currentUser.userId);
242
+ if (failedMessage) {
243
+ var _sdk$currentUser15;
244
+ updateMessages([failedMessage], false, (_sdk$currentUser15 = sdk.currentUser) === null || _sdk$currentUser15 === void 0 ? void 0 : _sdk$currentUser15.userId);
245
+ }
246
246
  reject(err);
247
247
  });
248
248
  });
@@ -251,37 +251,45 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
251
251
  return new Promise((resolve, reject) => {
252
252
  channel.sendFileMessage(params).onPending(pendingMessage => {
253
253
  if (pendingMessage.isFileMessage()) {
254
- updateMessages([pendingMessage], false, sdk.currentUser.userId);
254
+ var _sdk$currentUser16;
255
+ updateMessages([pendingMessage], false, (_sdk$currentUser16 = sdk.currentUser) === null || _sdk$currentUser16 === void 0 ? void 0 : _sdk$currentUser16.userId);
255
256
  onPending === null || onPending === void 0 ? void 0 : onPending(pendingMessage);
256
257
  }
257
258
  }).onSucceeded(sentMessage => {
258
259
  if (sentMessage.isFileMessage()) {
259
- updateMessages([sentMessage], false, sdk.currentUser.userId);
260
+ var _sdk$currentUser17;
261
+ updateMessages([sentMessage], false, (_sdk$currentUser17 = sdk.currentUser) === null || _sdk$currentUser17 === void 0 ? void 0 : _sdk$currentUser17.userId);
260
262
  resolve(sentMessage);
261
263
  }
262
264
  }).onFailed((err, failedMessage) => {
263
- updateMessages([failedMessage], false, sdk.currentUser.userId);
265
+ if (failedMessage) {
266
+ var _sdk$currentUser18;
267
+ updateMessages([failedMessage], false, (_sdk$currentUser18 = sdk.currentUser) === null || _sdk$currentUser18 === void 0 ? void 0 : _sdk$currentUser18.userId);
268
+ }
264
269
  reject(err);
265
270
  });
266
271
  });
267
272
  });
268
273
  const updateUserMessage = (0, _uikitUtils.useFreshCallback)(async (messageId, params) => {
274
+ var _sdk$currentUser19;
269
275
  const updatedMessage = await channel.updateUserMessage(messageId, params);
270
- updateMessages([updatedMessage], false, sdk.currentUser.userId);
276
+ updateMessages([updatedMessage], false, (_sdk$currentUser19 = sdk.currentUser) === null || _sdk$currentUser19 === void 0 ? void 0 : _sdk$currentUser19.userId);
271
277
  return updatedMessage;
272
278
  });
273
279
  const updateFileMessage = (0, _uikitUtils.useFreshCallback)(async (messageId, params) => {
280
+ var _sdk$currentUser20;
274
281
  const updatedMessage = await channel.updateFileMessage(messageId, params);
275
- updateMessages([updatedMessage], false, sdk.currentUser.userId);
282
+ updateMessages([updatedMessage], false, (_sdk$currentUser20 = sdk.currentUser) === null || _sdk$currentUser20 === void 0 ? void 0 : _sdk$currentUser20.userId);
276
283
  return updatedMessage;
277
284
  });
278
285
  const resendMessage = (0, _uikitUtils.useFreshCallback)(async failedMessage => {
286
+ var _sdk$currentUser21;
279
287
  const resentMessage = await (() => {
280
288
  if (failedMessage.isUserMessage()) return channel.resendUserMessage(failedMessage);
281
289
  if (failedMessage.isFileMessage()) return channel.resendFileMessage(failedMessage);
282
290
  return null;
283
291
  })();
284
- if (resentMessage) updateMessages([resentMessage], false, sdk.currentUser.userId);
292
+ if (resentMessage) updateMessages([resentMessage], false, (_sdk$currentUser21 = sdk.currentUser) === null || _sdk$currentUser21 === void 0 ? void 0 : _sdk$currentUser21.userId);
285
293
  });
286
294
  const deleteMessage = (0, _uikitUtils.useFreshCallback)(async message => {
287
295
  if (message.sendingStatus === 'succeeded') {
@@ -297,12 +305,15 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
297
305
  }
298
306
  });
299
307
  const resetNewMessages = (0, _uikitUtils.useFreshCallback)(() => {
300
- updateNewMessages([], true, sdk.currentUser.userId);
308
+ var _sdk$currentUser22;
309
+ updateNewMessages([], true, (_sdk$currentUser22 = sdk.currentUser) === null || _sdk$currentUser22 === void 0 ? void 0 : _sdk$currentUser22.userId);
301
310
  });
302
311
  const resetWithStartingPoint = (0, _uikitUtils.useFreshCallback)((startingPoint, callback) => {
312
+ var _sdk$currentUser23;
313
+ const limit = shouldUseSearchLimit(startingPoint) ? MESSAGE_LIMIT.SEARCH : MESSAGE_LIMIT.DEFAULT;
303
314
  updateLoading(true);
304
- updateMessages([], true, sdk.currentUser.userId);
305
- init(startingPoint, MESSAGE_LIMIT.DEFAULT, () => {
315
+ updateMessages([], true, (_sdk$currentUser23 = sdk.currentUser) === null || _sdk$currentUser23 === void 0 ? void 0 : _sdk$currentUser23.userId);
316
+ init(startingPoint, limit, () => {
306
317
  updateLoading(false);
307
318
  callback === null || callback === void 0 ? void 0 : callback();
308
319
  });