@sendbird/uikit-chat-hooks 2.0.2 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/lib/commonjs/channel/useGroupChannel.js +33 -0
  2. package/lib/commonjs/channel/useGroupChannel.js.map +1 -0
  3. package/lib/commonjs/channel/useGroupChannelMessages/reducer.js +3 -3
  4. package/lib/commonjs/channel/useGroupChannelMessages/reducer.js.map +1 -1
  5. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +56 -68
  6. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
  7. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +26 -35
  8. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
  9. package/lib/commonjs/common/useAppFeatures.js +4 -4
  10. package/lib/commonjs/common/useAppFeatures.js.map +1 -1
  11. package/lib/commonjs/common/useMessageOutgoingStatus.js +1 -1
  12. package/lib/commonjs/common/useMessageOutgoingStatus.js.map +1 -1
  13. package/lib/commonjs/common/useUserList.js +25 -7
  14. package/lib/commonjs/common/useUserList.js.map +1 -1
  15. package/lib/commonjs/index.js +8 -0
  16. package/lib/commonjs/index.js.map +1 -1
  17. package/lib/commonjs/types.js.map +1 -1
  18. package/lib/module/channel/useGroupChannel.js +22 -0
  19. package/lib/module/channel/useGroupChannel.js.map +1 -0
  20. package/lib/module/channel/useGroupChannelMessages/reducer.js +3 -3
  21. package/lib/module/channel/useGroupChannelMessages/reducer.js.map +1 -1
  22. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +57 -68
  23. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
  24. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +26 -34
  25. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
  26. package/lib/module/common/useAppFeatures.js +4 -4
  27. package/lib/module/common/useAppFeatures.js.map +1 -1
  28. package/lib/module/common/useMessageOutgoingStatus.js +1 -1
  29. package/lib/module/common/useMessageOutgoingStatus.js.map +1 -1
  30. package/lib/module/common/useUserList.js +27 -9
  31. package/lib/module/common/useUserList.js.map +1 -1
  32. package/lib/module/index.js +1 -0
  33. package/lib/module/index.js.map +1 -1
  34. package/lib/module/types.js.map +1 -1
  35. package/lib/typescript/src/channel/useGroupChannel.d.ts +6 -0
  36. package/lib/typescript/src/common/useUserList.d.ts +2 -2
  37. package/lib/typescript/src/index.d.ts +2 -1
  38. package/lib/typescript/src/types.d.ts +13 -6
  39. package/package.json +3 -3
  40. package/src/channel/useGroupChannel.ts +21 -0
  41. package/src/channel/useGroupChannelMessages/reducer.ts +4 -4
  42. package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.ts +70 -76
  43. package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.ts +29 -31
  44. package/src/common/useAppFeatures.ts +4 -4
  45. package/src/common/useMessageOutgoingStatus.ts +2 -1
  46. package/src/common/useUserList.ts +38 -12
  47. package/src/index.ts +3 -1
  48. package/src/types.ts +16 -7
@@ -1,8 +1,7 @@
1
1
  import { useCallback, useEffect, useRef } from 'react';
2
2
  import { MessageCollectionInitPolicy, MessageEventSource, MessageFilter } from '@sendbird/chat/groupChannel';
3
- import { Logger, confirmAndMarkAsRead, isDifferentChannel, useForceUpdate } from '@sendbird/uikit-utils';
3
+ import { Logger, confirmAndMarkAsRead, isDifferentChannel, useForceUpdate, useFreshCallback } from '@sendbird/uikit-utils';
4
4
  import { useChannelHandler } from '../../handler/useChannelHandler';
5
- import { useActiveGroupChannel } from '../useActiveGroupChannel';
6
5
  import { useGroupChannelMessagesReducer } from './reducer';
7
6
 
8
7
  const createMessageCollection = (channel, creator) => {
@@ -16,13 +15,8 @@ const createMessageCollection = (channel, creator) => {
16
15
 
17
16
  const HOOK_NAME = 'useGroupChannelMessagesWithCollection';
18
17
  export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) => {
19
- const collectionRef = useRef(); // NOTE: We cannot determine the channel object of Sendbird SDK is stale or not, so force update af
20
-
21
- const {
22
- activeChannel,
23
- setActiveChannel
24
- } = useActiveGroupChannel(sdk, channel);
25
18
  const forceUpdate = useForceUpdate();
19
+ const collectionRef = useRef();
26
20
  const {
27
21
  loading,
28
22
  refreshing,
@@ -39,18 +33,12 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
39
33
 
40
34
  const channelMarkAs = async () => {
41
35
  try {
42
- await confirmAndMarkAsRead([activeChannel]);
36
+ await confirmAndMarkAsRead([channel]);
43
37
  } catch (e) {
44
38
  Logger.warn(`[${HOOK_NAME}/channelMarkAs/Read]`, e);
45
39
  }
46
40
  };
47
41
 
48
- const updateChannel = channel => {
49
- if (channel.isGroupChannel() && !isDifferentChannel(channel, activeChannel)) {
50
- forceUpdate();
51
- }
52
- };
53
-
54
42
  const init = useCallback(async (uid, callback) => {
55
43
  var _collectionRef$curren;
56
44
 
@@ -59,7 +47,7 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
59
47
  if (uid) {
60
48
  var _collectionRef$curren2;
61
49
 
62
- collectionRef.current = createMessageCollection(activeChannel, options === null || options === void 0 ? void 0 : options.collectionCreator);
50
+ collectionRef.current = createMessageCollection(channel, options === null || options === void 0 ? void 0 : options.collectionCreator);
63
51
  updateNextMessages([], true, sdk.currentUser.userId);
64
52
  channelMarkAs();
65
53
  (_collectionRef$curren2 = collectionRef.current) === null || _collectionRef$curren2 === void 0 ? void 0 : _collectionRef$curren2.setMessageCollectionHandler({
@@ -73,24 +61,27 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
73
61
  }
74
62
 
75
63
  updateNextMessages(messages, false, sdk.currentUser.userId);
76
- updateChannel(channel);
77
64
  },
78
- onMessagesUpdated: (_, channel, messages) => {
79
- updateMessages(messages, false, sdk.currentUser.userId);
80
- updateChannel(channel);
65
+ onMessagesUpdated: (_, __, messages) => {
66
+ // NOTE: v4 MESSAGE_RECEIVED is called twice from onMessagesAdded and onMessagesUpdated when receiving new message.
67
+ // This is not intended behavior but not bugs.
68
+ if (_.source !== MessageEventSource.EVENT_MESSAGE_RECEIVED) {
69
+ updateMessages(messages, false, sdk.currentUser.userId);
70
+ }
81
71
  },
82
- onMessagesDeleted: (_, channel, messageIds) => {
72
+ onMessagesDeleted: (_, __, messageIds) => {
83
73
  deleteMessages(messageIds, []);
84
74
  deleteNextMessages(messageIds, []);
85
- updateChannel(channel);
86
75
  },
87
76
  onChannelDeleted: () => {
88
77
  var _options$onChannelDel;
89
78
 
90
79
  options === null || options === void 0 ? void 0 : (_options$onChannelDel = options.onChannelDeleted) === null || _options$onChannelDel === void 0 ? void 0 : _options$onChannelDel.call(options);
91
80
  },
92
- onChannelUpdated: (_, channel) => {
93
- updateChannel(channel);
81
+ onChannelUpdated: (_, eventChannel) => {
82
+ if (eventChannel.isGroupChannel() && !isDifferentChannel(eventChannel, channel)) {
83
+ forceUpdate();
84
+ }
94
85
  },
95
86
  onHugeGapDetected: () => {
96
87
  init(uid);
@@ -104,8 +95,8 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
104
95
  updateMessages(messages, true, sdk.currentUser.userId);
105
96
  updateMessages(((_collectionRef$curren3 = collectionRef.current) === null || _collectionRef$curren3 === void 0 ? void 0 : _collectionRef$curren3.pendingMessages) ?? [], false, sdk.currentUser.userId);
106
97
  updateMessages(((_collectionRef$curren4 = collectionRef.current) === null || _collectionRef$curren4 === void 0 ? void 0 : _collectionRef$curren4.failedMessages) ?? [], false, sdk.currentUser.userId);
107
- if (messages !== null && messages !== void 0 && messages.length) callback === null || callback === void 0 ? void 0 : callback();
108
98
  }
99
+ callback === null || callback === void 0 ? void 0 : callback();
109
100
  }).onApiResult((err, messages) => {
110
101
  if (err) Logger.warn(`[${HOOK_NAME}/onApiResult]`, err);else {
111
102
  Logger.debug(`[${HOOK_NAME}/onApiResult]`, 'message length:', messages.length);
@@ -121,16 +112,15 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
121
112
  callback === null || callback === void 0 ? void 0 : callback();
122
113
  });
123
114
  }
124
- }, [sdk, activeChannel.url, options === null || options === void 0 ? void 0 : options.collectionCreator]);
115
+ }, [sdk, channel.url, options === null || options === void 0 ? void 0 : options.collectionCreator]);
125
116
  useChannelHandler(sdk, HOOK_NAME, {
126
117
  onUserBanned(channel, bannedUser) {
127
- if (channel.isGroupChannel() && !isDifferentChannel(channel, activeChannel)) {
118
+ if (channel.isGroupChannel() && !isDifferentChannel(channel, channel)) {
128
119
  if (bannedUser.userId === sdk.currentUser.userId) {
129
120
  var _options$onChannelDel2;
130
121
 
131
122
  options === null || options === void 0 ? void 0 : (_options$onChannelDel2 = options.onChannelDeleted) === null || _options$onChannelDel2 === void 0 ? void 0 : _options$onChannelDel2.call(options);
132
123
  } else {
133
- setActiveChannel(channel);
134
124
  forceUpdate();
135
125
  }
136
126
  }
@@ -138,7 +128,7 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
138
128
 
139
129
  });
140
130
  useEffect(() => {
141
- // NOTE: Cache read is heavy synchronous task, and it prevents smooth ui transition
131
+ // NOTE: Cache read is heavy task, and it prevents smooth ui transition
142
132
  setTimeout(async () => {
143
133
  updateLoading(true);
144
134
  init(userId, () => updateLoading(false));
@@ -151,11 +141,11 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
151
141
  if (collectionRef.current) (_collectionRef$curren7 = collectionRef.current) === null || _collectionRef$curren7 === void 0 ? void 0 : _collectionRef$curren7.dispose();
152
142
  };
153
143
  }, []);
154
- const refresh = useCallback(async () => {
144
+ const refresh = useFreshCallback(async () => {
155
145
  updateRefreshing(true);
156
146
  init(userId, () => updateRefreshing(false));
157
- }, [init, userId]);
158
- const prev = useCallback(async () => {
147
+ });
148
+ const prev = useFreshCallback(async () => {
159
149
  var _collectionRef$curren8;
160
150
 
161
151
  if (collectionRef.current && (_collectionRef$curren8 = collectionRef.current) !== null && _collectionRef$curren8 !== void 0 && _collectionRef$curren8.hasPrevious) {
@@ -166,33 +156,33 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
166
156
  updateMessages(list, false, sdk.currentUser.userId);
167
157
  } catch {}
168
158
  }
169
- }, []);
170
- const next = useCallback(async () => {
159
+ });
160
+ const next = useFreshCallback(async () => {
171
161
  var _collectionRef$curren10;
172
162
 
173
- const list = [];
163
+ const messageCandidates = [];
174
164
 
175
165
  if (collectionRef.current && (_collectionRef$curren10 = collectionRef.current) !== null && _collectionRef$curren10 !== void 0 && _collectionRef$curren10.hasNext) {
176
166
  try {
177
167
  var _collectionRef$curren11;
178
168
 
179
169
  const fetchedList = await ((_collectionRef$curren11 = collectionRef.current) === null || _collectionRef$curren11 === void 0 ? void 0 : _collectionRef$curren11.loadNext());
180
- list.push(...fetchedList);
170
+ messageCandidates.push(...fetchedList);
181
171
  } catch {}
182
172
  }
183
173
 
184
174
  if (nextMessages.length > 0) {
185
- list.push(...nextMessages);
175
+ messageCandidates.push(...nextMessages);
186
176
  }
187
177
 
188
- if (list.length > 0) {
189
- updateMessages(list, false, sdk.currentUser.userId);
178
+ if (messageCandidates.length > 0) {
179
+ updateMessages(messageCandidates, false, sdk.currentUser.userId);
190
180
  updateNextMessages([], true, sdk.currentUser.userId);
191
181
  }
192
- }, [nextMessages.length]);
193
- const sendUserMessage = useCallback((params, onPending) => {
182
+ });
183
+ const sendUserMessage = useFreshCallback((params, onPending) => {
194
184
  return new Promise((resolve, reject) => {
195
- activeChannel.sendUserMessage(params).onPending(pendingMessage => {
185
+ channel.sendUserMessage(params).onPending(pendingMessage => {
196
186
  if (pendingMessage.isUserMessage()) {
197
187
  onPending === null || onPending === void 0 ? void 0 : onPending(pendingMessage);
198
188
  updateMessages([pendingMessage], false, sdk.currentUser.userId);
@@ -202,14 +192,15 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
202
192
  updateMessages([sentMessage], false, sdk.currentUser.userId);
203
193
  resolve(sentMessage);
204
194
  }
205
- }).onFailed(err => {
195
+ }).onFailed((err, _failedMessage) => {
196
+ // updateMessages([failedMessage], false, sdk.currentUser.userId);
206
197
  reject(err);
207
198
  });
208
199
  });
209
- }, [activeChannel]);
210
- const sendFileMessage = useCallback((params, onPending) => {
200
+ });
201
+ const sendFileMessage = useFreshCallback((params, onPending) => {
211
202
  return new Promise((resolve, reject) => {
212
- activeChannel.sendFileMessage(params).onPending(pendingMessage => {
203
+ channel.sendFileMessage(params).onPending(pendingMessage => {
213
204
  if (pendingMessage.isFileMessage()) {
214
205
  updateMessages([pendingMessage], false, sdk.currentUser.userId);
215
206
  onPending === null || onPending === void 0 ? void 0 : onPending(pendingMessage);
@@ -219,35 +210,34 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
219
210
  updateMessages([sentMessage], false, sdk.currentUser.userId);
220
211
  resolve(sentMessage);
221
212
  }
222
- }).onFailed(err => {
213
+ }).onFailed((err, _failedMessage) => {
214
+ // updateMessages([failedMessage], false, sdk.currentUser.userId);
223
215
  reject(err);
224
216
  });
225
217
  });
226
- }, [activeChannel]);
227
- const updateUserMessage = useCallback(async (messageId, params) => {
228
- const updatedMessage = await activeChannel.updateUserMessage(messageId, params);
218
+ });
219
+ const updateUserMessage = useFreshCallback(async (messageId, params) => {
220
+ const updatedMessage = await channel.updateUserMessage(messageId, params);
229
221
  updateMessages([updatedMessage], false, sdk.currentUser.userId);
230
222
  return updatedMessage;
231
- }, [activeChannel]);
232
- const updateFileMessage = useCallback(async (messageId, params) => {
233
- const updatedMessage = await activeChannel.updateFileMessage(messageId, params);
223
+ });
224
+ const updateFileMessage = useFreshCallback(async (messageId, params) => {
225
+ const updatedMessage = await channel.updateFileMessage(messageId, params);
234
226
  updateMessages([updatedMessage], false, sdk.currentUser.userId);
235
227
  return updatedMessage;
236
- }, [activeChannel]);
237
- const resendMessage = useCallback(async failedMessage => {
238
- const message = await (() => {
239
- if (failedMessage.isUserMessage()) return activeChannel.resendUserMessage(failedMessage); // FIXME: v4 bugs
240
- // @ts-ignore
241
-
242
- if (failedMessage.isFileMessage()) return activeChannel.resendFileMessage(failedMessage);
228
+ });
229
+ const resendMessage = useFreshCallback(async failedMessage => {
230
+ const resentMessage = await (() => {
231
+ if (failedMessage.isUserMessage()) return channel.resendUserMessage(failedMessage);
232
+ if (failedMessage.isFileMessage()) return channel.resendFileMessage(failedMessage);
243
233
  return null;
244
234
  })();
245
- if (message) updateMessages([message], false, sdk.currentUser.userId);
246
- }, [activeChannel]);
247
- const deleteMessage = useCallback(async message => {
235
+ if (resentMessage) updateMessages([resentMessage], false, sdk.currentUser.userId);
236
+ });
237
+ const deleteMessage = useFreshCallback(async message => {
248
238
  if (message.sendingStatus === 'succeeded') {
249
- if (message.isUserMessage()) await activeChannel.deleteMessage(message);
250
- if (message.isFileMessage()) await activeChannel.deleteMessage(message);
239
+ if (message.isUserMessage()) await channel.deleteMessage(message);
240
+ if (message.isFileMessage()) await channel.deleteMessage(message);
251
241
  } else {
252
242
  try {
253
243
  var _collectionRef$curren12;
@@ -257,7 +247,7 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
257
247
  deleteMessages([message.messageId], [message.reqId]);
258
248
  }
259
249
  }
260
- }, [activeChannel]);
250
+ });
261
251
  return {
262
252
  loading,
263
253
  refreshing,
@@ -272,8 +262,7 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
272
262
  updateUserMessage,
273
263
  updateFileMessage,
274
264
  resendMessage,
275
- deleteMessage,
276
- activeChannel
265
+ deleteMessage
277
266
  };
278
267
  };
279
268
  //# sourceMappingURL=useGroupChannelMessagesWithCollection.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useEffect","useRef","MessageCollectionInitPolicy","MessageEventSource","MessageFilter","Logger","confirmAndMarkAsRead","isDifferentChannel","useForceUpdate","useChannelHandler","useActiveGroupChannel","useGroupChannelMessagesReducer","createMessageCollection","channel","creator","filter","limit","HOOK_NAME","useGroupChannelMessagesWithCollection","sdk","userId","options","collectionRef","activeChannel","setActiveChannel","forceUpdate","loading","refreshing","messages","nextMessages","newMessagesFromMembers","updateMessages","updateNextMessages","deleteNextMessages","deleteMessages","updateLoading","updateRefreshing","sortComparator","channelMarkAs","e","warn","updateChannel","isGroupChannel","init","uid","callback","current","dispose","collectionCreator","currentUser","setMessageCollectionHandler","onMessagesAdded","_","__","source","EVENT_MESSAGE_RECEIVED","EVENT_MESSAGE_SENT_SUCCESS","SYNC_MESSAGE_FILL","onMessagesUpdated","onMessagesDeleted","messageIds","onChannelDeleted","onChannelUpdated","onHugeGapDetected","initialize","CACHE_AND_REPLACE_BY_API","onCacheResult","err","isCacheEnabled","error","debug","length","pendingMessages","failedMessages","onApiResult","url","onUserBanned","bannedUser","setTimeout","refresh","prev","hasPrevious","list","loadPrevious","next","hasNext","fetchedList","loadNext","push","sendUserMessage","params","onPending","Promise","resolve","reject","pendingMessage","isUserMessage","onSucceeded","sentMessage","onFailed","sendFileMessage","isFileMessage","updateUserMessage","messageId","updatedMessage","updateFileMessage","resendMessage","failedMessage","message","resendUserMessage","resendFileMessage","deleteMessage","sendingStatus","removeFailedMessage","reqId"],"sources":["useGroupChannelMessagesWithCollection.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\n\nimport { MessageCollectionInitPolicy, MessageEventSource, MessageFilter } from '@sendbird/chat/groupChannel';\nimport type {\n SendbirdChannel,\n SendbirdFileMessage,\n SendbirdGroupChannel,\n SendbirdMessageCollection,\n} from '@sendbird/uikit-utils';\nimport { Logger, confirmAndMarkAsRead, isDifferentChannel, useForceUpdate } from '@sendbird/uikit-utils';\n\nimport { useChannelHandler } from '../../handler/useChannelHandler';\nimport type { UseGroupChannelMessages, UseGroupChannelMessagesOptions } from '../../types';\nimport { useActiveGroupChannel } from '../useActiveGroupChannel';\nimport { useGroupChannelMessagesReducer } from './reducer';\n\nconst createMessageCollection = (\n channel: SendbirdGroupChannel,\n creator?: UseGroupChannelMessagesOptions['collectionCreator'],\n) => {\n if (creator) return creator();\n const filter = new MessageFilter();\n return channel.createMessageCollection({ filter, limit: 100 });\n};\n\nconst HOOK_NAME = 'useGroupChannelMessagesWithCollection';\n\nexport const useGroupChannelMessagesWithCollection: UseGroupChannelMessages = (sdk, channel, userId, options) => {\n const collectionRef = useRef<SendbirdMessageCollection>();\n\n // NOTE: We cannot determine the channel object of Sendbird SDK is stale or not, so force update af\n const { activeChannel, setActiveChannel } = useActiveGroupChannel(sdk, channel);\n const forceUpdate = useForceUpdate();\n\n const {\n loading,\n refreshing,\n messages,\n nextMessages,\n newMessagesFromMembers,\n updateMessages,\n updateNextMessages,\n deleteNextMessages,\n deleteMessages,\n updateLoading,\n updateRefreshing,\n } = useGroupChannelMessagesReducer(userId, options?.sortComparator);\n\n const channelMarkAs = async () => {\n try {\n await confirmAndMarkAsRead([activeChannel]);\n } catch (e) {\n Logger.warn(`[${HOOK_NAME}/channelMarkAs/Read]`, e);\n }\n };\n\n const updateChannel = (channel: SendbirdChannel) => {\n if (channel.isGroupChannel() && !isDifferentChannel(channel, activeChannel)) {\n forceUpdate();\n }\n };\n\n const init = useCallback(\n async (uid?: string, callback?: () => void) => {\n if (collectionRef.current) collectionRef.current?.dispose();\n\n if (uid) {\n collectionRef.current = createMessageCollection(activeChannel, options?.collectionCreator);\n updateNextMessages([], true, sdk.currentUser.userId);\n channelMarkAs();\n\n collectionRef.current?.setMessageCollectionHandler({\n onMessagesAdded: (_, __, messages) => {\n switch (_.source) {\n case MessageEventSource.EVENT_MESSAGE_RECEIVED:\n case MessageEventSource.EVENT_MESSAGE_SENT_SUCCESS:\n case MessageEventSource.SYNC_MESSAGE_FILL:\n channelMarkAs();\n break;\n }\n updateNextMessages(messages, false, sdk.currentUser.userId);\n updateChannel(channel);\n },\n onMessagesUpdated: (_, channel, messages) => {\n updateMessages(messages, false, sdk.currentUser.userId);\n updateChannel(channel);\n },\n onMessagesDeleted: (_, channel, messageIds) => {\n deleteMessages(messageIds, []);\n deleteNextMessages(messageIds, []);\n updateChannel(channel);\n },\n onChannelDeleted: () => {\n options?.onChannelDeleted?.();\n },\n onChannelUpdated: (_, channel) => {\n updateChannel(channel);\n },\n onHugeGapDetected: () => {\n init(uid);\n },\n });\n\n collectionRef.current\n .initialize(MessageCollectionInitPolicy.CACHE_AND_REPLACE_BY_API)\n .onCacheResult((err, messages) => {\n if (err) sdk.isCacheEnabled && Logger.error(`[${HOOK_NAME}/onCacheResult]`, err);\n else {\n Logger.debug(`[${HOOK_NAME}/onCacheResult]`, 'message length:', messages.length);\n updateMessages(messages, true, sdk.currentUser.userId);\n updateMessages(collectionRef.current?.pendingMessages ?? [], false, sdk.currentUser.userId);\n updateMessages(collectionRef.current?.failedMessages ?? [], false, sdk.currentUser.userId);\n if (messages?.length) callback?.();\n }\n })\n .onApiResult((err, messages) => {\n if (err) Logger.warn(`[${HOOK_NAME}/onApiResult]`, err);\n else {\n Logger.debug(`[${HOOK_NAME}/onApiResult]`, 'message length:', messages.length);\n updateMessages(messages, true, sdk.currentUser.userId);\n if (sdk.isCacheEnabled) {\n updateMessages(collectionRef.current?.pendingMessages ?? [], false, sdk.currentUser.userId);\n updateMessages(collectionRef.current?.failedMessages ?? [], false, sdk.currentUser.userId);\n }\n }\n callback?.();\n });\n }\n },\n [sdk, activeChannel.url, options?.collectionCreator],\n );\n\n useChannelHandler(sdk, HOOK_NAME, {\n onUserBanned(channel, bannedUser) {\n if (channel.isGroupChannel() && !isDifferentChannel(channel, activeChannel)) {\n if (bannedUser.userId === sdk.currentUser.userId) {\n options?.onChannelDeleted?.();\n } else {\n setActiveChannel(channel);\n forceUpdate();\n }\n }\n },\n });\n\n useEffect(() => {\n // NOTE: Cache read is heavy synchronous task, and it prevents smooth ui transition\n setTimeout(async () => {\n updateLoading(true);\n init(userId, () => updateLoading(false));\n }, 0);\n }, [init, userId]);\n\n useEffect(() => {\n return () => {\n if (collectionRef.current) collectionRef.current?.dispose();\n };\n }, []);\n\n const refresh: ReturnType<UseGroupChannelMessages>['refresh'] = useCallback(async () => {\n updateRefreshing(true);\n init(userId, () => updateRefreshing(false));\n }, [init, userId]);\n\n const prev: ReturnType<UseGroupChannelMessages>['prev'] = useCallback(async () => {\n if (collectionRef.current && collectionRef.current?.hasPrevious) {\n try {\n const list = await collectionRef.current?.loadPrevious();\n updateMessages(list, false, sdk.currentUser.userId);\n } catch {}\n }\n }, []);\n\n const next: ReturnType<UseGroupChannelMessages>['next'] = useCallback(async () => {\n const list = [];\n if (collectionRef.current && collectionRef.current?.hasNext) {\n try {\n const fetchedList = await collectionRef.current?.loadNext();\n list.push(...fetchedList);\n } catch {}\n }\n if (nextMessages.length > 0) {\n list.push(...nextMessages);\n }\n if (list.length > 0) {\n updateMessages(list, false, sdk.currentUser.userId);\n updateNextMessages([], true, sdk.currentUser.userId);\n }\n }, [nextMessages.length]);\n\n const sendUserMessage: ReturnType<UseGroupChannelMessages>['sendUserMessage'] = useCallback(\n (params, onPending) => {\n return new Promise((resolve, reject) => {\n activeChannel\n .sendUserMessage(params)\n .onPending((pendingMessage) => {\n if (pendingMessage.isUserMessage()) {\n onPending?.(pendingMessage);\n updateMessages([pendingMessage], false, sdk.currentUser.userId);\n }\n })\n .onSucceeded((sentMessage) => {\n if (sentMessage.isUserMessage()) {\n updateMessages([sentMessage], false, sdk.currentUser.userId);\n resolve(sentMessage);\n }\n })\n .onFailed((err) => {\n reject(err);\n });\n });\n },\n [activeChannel],\n );\n const sendFileMessage: ReturnType<UseGroupChannelMessages>['sendFileMessage'] = useCallback(\n (params, onPending) => {\n return new Promise((resolve, reject) => {\n activeChannel\n .sendFileMessage(params)\n .onPending((pendingMessage) => {\n if (pendingMessage.isFileMessage()) {\n updateMessages([pendingMessage], false, sdk.currentUser.userId);\n onPending?.(pendingMessage);\n }\n })\n .onSucceeded((sentMessage) => {\n if (sentMessage.isFileMessage()) {\n updateMessages([sentMessage], false, sdk.currentUser.userId);\n resolve(sentMessage as SendbirdFileMessage);\n }\n })\n .onFailed((err) => {\n reject(err);\n });\n });\n },\n [activeChannel],\n );\n const updateUserMessage: ReturnType<UseGroupChannelMessages>['updateUserMessage'] = useCallback(\n async (messageId, params) => {\n const updatedMessage = await activeChannel.updateUserMessage(messageId, params);\n updateMessages([updatedMessage], false, sdk.currentUser.userId);\n return updatedMessage;\n },\n [activeChannel],\n );\n const updateFileMessage: ReturnType<UseGroupChannelMessages>['updateFileMessage'] = useCallback(\n async (messageId, params) => {\n const updatedMessage = await activeChannel.updateFileMessage(messageId, params);\n updateMessages([updatedMessage], false, sdk.currentUser.userId);\n return updatedMessage;\n },\n [activeChannel],\n );\n const resendMessage: ReturnType<UseGroupChannelMessages>['resendMessage'] = useCallback(\n async (failedMessage) => {\n const message = await (() => {\n if (failedMessage.isUserMessage()) return activeChannel.resendUserMessage(failedMessage);\n // FIXME: v4 bugs\n // @ts-ignore\n if (failedMessage.isFileMessage()) return activeChannel.resendFileMessage(failedMessage);\n return null;\n })();\n\n if (message) updateMessages([message], false, sdk.currentUser.userId);\n },\n [activeChannel],\n );\n const deleteMessage: ReturnType<UseGroupChannelMessages>['deleteMessage'] = useCallback(\n async (message) => {\n if (message.sendingStatus === 'succeeded') {\n if (message.isUserMessage()) await activeChannel.deleteMessage(message);\n if (message.isFileMessage()) await activeChannel.deleteMessage(message);\n } else {\n try {\n await collectionRef.current?.removeFailedMessage(message.reqId);\n } finally {\n deleteMessages([message.messageId], [message.reqId]);\n }\n }\n },\n [activeChannel],\n );\n\n return {\n loading,\n refreshing,\n refresh,\n messages,\n nextMessages,\n newMessagesFromMembers,\n next,\n prev,\n sendUserMessage,\n sendFileMessage,\n updateUserMessage,\n updateFileMessage,\n resendMessage,\n deleteMessage,\n activeChannel,\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["useCallback","useEffect","useRef","MessageCollectionInitPolicy","MessageEventSource","MessageFilter","Logger","confirmAndMarkAsRead","isDifferentChannel","useForceUpdate","useFreshCallback","useChannelHandler","useGroupChannelMessagesReducer","createMessageCollection","channel","creator","filter","limit","HOOK_NAME","useGroupChannelMessagesWithCollection","sdk","userId","options","forceUpdate","collectionRef","loading","refreshing","messages","nextMessages","newMessagesFromMembers","updateMessages","updateNextMessages","deleteNextMessages","deleteMessages","updateLoading","updateRefreshing","sortComparator","channelMarkAs","e","warn","init","uid","callback","current","dispose","collectionCreator","currentUser","setMessageCollectionHandler","onMessagesAdded","_","__","source","EVENT_MESSAGE_RECEIVED","EVENT_MESSAGE_SENT_SUCCESS","SYNC_MESSAGE_FILL","onMessagesUpdated","onMessagesDeleted","messageIds","onChannelDeleted","onChannelUpdated","eventChannel","isGroupChannel","onHugeGapDetected","initialize","CACHE_AND_REPLACE_BY_API","onCacheResult","err","isCacheEnabled","error","debug","length","pendingMessages","failedMessages","onApiResult","url","onUserBanned","bannedUser","setTimeout","refresh","prev","hasPrevious","list","loadPrevious","next","messageCandidates","hasNext","fetchedList","loadNext","push","sendUserMessage","params","onPending","Promise","resolve","reject","pendingMessage","isUserMessage","onSucceeded","sentMessage","onFailed","_failedMessage","sendFileMessage","isFileMessage","updateUserMessage","messageId","updatedMessage","updateFileMessage","resendMessage","failedMessage","resentMessage","resendUserMessage","resendFileMessage","deleteMessage","message","sendingStatus","removeFailedMessage","reqId"],"sources":["useGroupChannelMessagesWithCollection.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\n\nimport { MessageCollectionInitPolicy, MessageEventSource, MessageFilter } from '@sendbird/chat/groupChannel';\nimport type {\n SendbirdBaseMessage,\n SendbirdFileMessage,\n SendbirdGroupChannel,\n SendbirdMessageCollection,\n} from '@sendbird/uikit-utils';\nimport {\n Logger,\n confirmAndMarkAsRead,\n isDifferentChannel,\n useForceUpdate,\n useFreshCallback,\n} from '@sendbird/uikit-utils';\n\nimport { useChannelHandler } from '../../handler/useChannelHandler';\nimport type { UseGroupChannelMessages, UseGroupChannelMessagesOptions } from '../../types';\nimport { useGroupChannelMessagesReducer } from './reducer';\n\nconst createMessageCollection = (\n channel: SendbirdGroupChannel,\n creator?: UseGroupChannelMessagesOptions['collectionCreator'],\n) => {\n if (creator) return creator();\n const filter = new MessageFilter();\n return channel.createMessageCollection({ filter, limit: 100 });\n};\n\nconst HOOK_NAME = 'useGroupChannelMessagesWithCollection';\n\nexport const useGroupChannelMessagesWithCollection: UseGroupChannelMessages = (sdk, channel, userId, options) => {\n const forceUpdate = useForceUpdate();\n const collectionRef = useRef<SendbirdMessageCollection>();\n\n const {\n loading,\n refreshing,\n messages,\n nextMessages,\n newMessagesFromMembers,\n updateMessages,\n updateNextMessages,\n deleteNextMessages,\n deleteMessages,\n updateLoading,\n updateRefreshing,\n } = useGroupChannelMessagesReducer(userId, options?.sortComparator);\n\n const channelMarkAs = async () => {\n try {\n await confirmAndMarkAsRead([channel]);\n } catch (e) {\n Logger.warn(`[${HOOK_NAME}/channelMarkAs/Read]`, e);\n }\n };\n\n const init = useCallback(\n async (uid?: string, callback?: () => void) => {\n if (collectionRef.current) collectionRef.current?.dispose();\n\n if (uid) {\n collectionRef.current = createMessageCollection(channel, options?.collectionCreator);\n updateNextMessages([], true, sdk.currentUser.userId);\n channelMarkAs();\n\n collectionRef.current?.setMessageCollectionHandler({\n onMessagesAdded: (_, __, messages) => {\n switch (_.source) {\n case MessageEventSource.EVENT_MESSAGE_RECEIVED:\n case MessageEventSource.EVENT_MESSAGE_SENT_SUCCESS:\n case MessageEventSource.SYNC_MESSAGE_FILL:\n channelMarkAs();\n break;\n }\n updateNextMessages(messages, false, sdk.currentUser.userId);\n },\n onMessagesUpdated: (_, __, messages) => {\n // NOTE: v4 MESSAGE_RECEIVED is called twice from onMessagesAdded and onMessagesUpdated when receiving new message.\n // This is not intended behavior but not bugs.\n if (_.source !== MessageEventSource.EVENT_MESSAGE_RECEIVED) {\n updateMessages(messages, false, sdk.currentUser.userId);\n }\n },\n onMessagesDeleted: (_, __, messageIds) => {\n deleteMessages(messageIds, []);\n deleteNextMessages(messageIds, []);\n },\n onChannelDeleted: () => {\n options?.onChannelDeleted?.();\n },\n onChannelUpdated: (_, eventChannel) => {\n if (eventChannel.isGroupChannel() && !isDifferentChannel(eventChannel, channel)) {\n forceUpdate();\n }\n },\n onHugeGapDetected: () => {\n init(uid);\n },\n });\n\n collectionRef.current\n .initialize(MessageCollectionInitPolicy.CACHE_AND_REPLACE_BY_API)\n .onCacheResult((err, messages) => {\n if (err) sdk.isCacheEnabled && Logger.error(`[${HOOK_NAME}/onCacheResult]`, err);\n else {\n Logger.debug(`[${HOOK_NAME}/onCacheResult]`, 'message length:', messages.length);\n\n updateMessages(messages, true, sdk.currentUser.userId);\n updateMessages(collectionRef.current?.pendingMessages ?? [], false, sdk.currentUser.userId);\n updateMessages(collectionRef.current?.failedMessages ?? [], false, sdk.currentUser.userId);\n }\n callback?.();\n })\n .onApiResult((err, messages) => {\n if (err) Logger.warn(`[${HOOK_NAME}/onApiResult]`, err);\n else {\n Logger.debug(`[${HOOK_NAME}/onApiResult]`, 'message length:', messages.length);\n\n updateMessages(messages, true, sdk.currentUser.userId);\n if (sdk.isCacheEnabled) {\n updateMessages(collectionRef.current?.pendingMessages ?? [], false, sdk.currentUser.userId);\n updateMessages(collectionRef.current?.failedMessages ?? [], false, sdk.currentUser.userId);\n }\n }\n callback?.();\n });\n }\n },\n [sdk, channel.url, options?.collectionCreator],\n );\n\n useChannelHandler(sdk, HOOK_NAME, {\n onUserBanned(channel, bannedUser) {\n if (channel.isGroupChannel() && !isDifferentChannel(channel, channel)) {\n if (bannedUser.userId === sdk.currentUser.userId) {\n options?.onChannelDeleted?.();\n } else {\n forceUpdate();\n }\n }\n },\n });\n\n useEffect(() => {\n // NOTE: Cache read is heavy task, and it prevents smooth ui transition\n setTimeout(async () => {\n updateLoading(true);\n init(userId, () => updateLoading(false));\n }, 0);\n }, [init, userId]);\n\n useEffect(() => {\n return () => {\n if (collectionRef.current) collectionRef.current?.dispose();\n };\n }, []);\n\n const refresh: ReturnType<UseGroupChannelMessages>['refresh'] = useFreshCallback(async () => {\n updateRefreshing(true);\n init(userId, () => updateRefreshing(false));\n });\n\n const prev: ReturnType<UseGroupChannelMessages>['prev'] = useFreshCallback(async () => {\n if (collectionRef.current && collectionRef.current?.hasPrevious) {\n try {\n const list = await collectionRef.current?.loadPrevious();\n updateMessages(list, false, sdk.currentUser.userId);\n } catch {}\n }\n });\n\n const next: ReturnType<UseGroupChannelMessages>['next'] = useFreshCallback(async () => {\n const messageCandidates: SendbirdBaseMessage[] = [];\n\n if (collectionRef.current && collectionRef.current?.hasNext) {\n try {\n const fetchedList = await collectionRef.current?.loadNext();\n messageCandidates.push(...fetchedList);\n } catch {}\n }\n\n if (nextMessages.length > 0) {\n messageCandidates.push(...nextMessages);\n }\n\n if (messageCandidates.length > 0) {\n updateMessages(messageCandidates, false, sdk.currentUser.userId);\n updateNextMessages([], true, sdk.currentUser.userId);\n }\n });\n\n const sendUserMessage: ReturnType<UseGroupChannelMessages>['sendUserMessage'] = useFreshCallback(\n (params, onPending) => {\n return new Promise((resolve, reject) => {\n channel\n .sendUserMessage(params)\n .onPending((pendingMessage) => {\n if (pendingMessage.isUserMessage()) {\n onPending?.(pendingMessage);\n updateMessages([pendingMessage], false, sdk.currentUser.userId);\n }\n })\n .onSucceeded((sentMessage) => {\n if (sentMessage.isUserMessage()) {\n updateMessages([sentMessage], false, sdk.currentUser.userId);\n resolve(sentMessage);\n }\n })\n .onFailed((err, _failedMessage) => {\n // updateMessages([failedMessage], false, sdk.currentUser.userId);\n reject(err);\n });\n });\n },\n );\n const sendFileMessage: ReturnType<UseGroupChannelMessages>['sendFileMessage'] = useFreshCallback(\n (params, onPending) => {\n return new Promise((resolve, reject) => {\n channel\n .sendFileMessage(params)\n .onPending((pendingMessage) => {\n if (pendingMessage.isFileMessage()) {\n updateMessages([pendingMessage], false, sdk.currentUser.userId);\n onPending?.(pendingMessage);\n }\n })\n .onSucceeded((sentMessage) => {\n if (sentMessage.isFileMessage()) {\n updateMessages([sentMessage], false, sdk.currentUser.userId);\n resolve(sentMessage as SendbirdFileMessage);\n }\n })\n .onFailed((err, _failedMessage) => {\n // updateMessages([failedMessage], false, sdk.currentUser.userId);\n reject(err);\n });\n });\n },\n );\n const updateUserMessage: ReturnType<UseGroupChannelMessages>['updateUserMessage'] = useFreshCallback(\n async (messageId, params) => {\n const updatedMessage = await channel.updateUserMessage(messageId, params);\n updateMessages([updatedMessage], false, sdk.currentUser.userId);\n return updatedMessage;\n },\n );\n const updateFileMessage: ReturnType<UseGroupChannelMessages>['updateFileMessage'] = useFreshCallback(\n async (messageId, params) => {\n const updatedMessage = await channel.updateFileMessage(messageId, params);\n updateMessages([updatedMessage], false, sdk.currentUser.userId);\n return updatedMessage;\n },\n );\n const resendMessage: ReturnType<UseGroupChannelMessages>['resendMessage'] = useFreshCallback(\n async (failedMessage) => {\n const resentMessage = await (() => {\n if (failedMessage.isUserMessage()) return channel.resendUserMessage(failedMessage);\n if (failedMessage.isFileMessage()) return channel.resendFileMessage(failedMessage);\n return null;\n })();\n\n if (resentMessage) updateMessages([resentMessage], false, sdk.currentUser.userId);\n },\n );\n const deleteMessage: ReturnType<UseGroupChannelMessages>['deleteMessage'] = useFreshCallback(async (message) => {\n if (message.sendingStatus === 'succeeded') {\n if (message.isUserMessage()) await channel.deleteMessage(message);\n if (message.isFileMessage()) await channel.deleteMessage(message);\n } else {\n try {\n await collectionRef.current?.removeFailedMessage(message.reqId);\n } finally {\n deleteMessages([message.messageId], [message.reqId]);\n }\n }\n });\n\n return {\n loading,\n refreshing,\n refresh,\n messages,\n nextMessages,\n newMessagesFromMembers,\n next,\n prev,\n sendUserMessage,\n sendFileMessage,\n updateUserMessage,\n updateFileMessage,\n resendMessage,\n deleteMessage,\n };\n};\n"],"mappings":"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"}
@@ -1,7 +1,6 @@
1
1
  import { useCallback, useRef } from 'react';
2
2
  import { Logger, confirmAndMarkAsRead, isDifferentChannel, useAsyncEffect, useForceUpdate } from '@sendbird/uikit-utils';
3
3
  import { useChannelHandler } from '../../handler/useChannelHandler';
4
- import { useActiveGroupChannel } from '../useActiveGroupChannel';
5
4
  import { useGroupChannelMessagesReducer } from './reducer';
6
5
 
7
6
  const createMessageQuery = (channel, creator) => {
@@ -14,12 +13,7 @@ const createMessageQuery = (channel, creator) => {
14
13
 
15
14
  const HOOK_NAME = 'useGroupChannelMessagesWithQuery';
16
15
  export const useGroupChannelMessagesWithQuery = (sdk, channel, userId, options) => {
17
- const queryRef = useRef(); // NOTE: We cannot determine the channel object of Sendbird SDK is stale or not, so force update after setActiveChannel
18
-
19
- const {
20
- activeChannel,
21
- setActiveChannel
22
- } = useActiveGroupChannel(sdk, channel);
16
+ const queryRef = useRef();
23
17
  const forceUpdate = useForceUpdate();
24
18
  const {
25
19
  loading,
@@ -47,7 +41,7 @@ export const useGroupChannelMessagesWithQuery = (sdk, channel, userId, options)
47
41
  if (uid) {
48
42
  var _queryRef$current;
49
43
 
50
- queryRef.current = createMessageQuery(activeChannel, options === null || options === void 0 ? void 0 : options.queryCreator);
44
+ queryRef.current = createMessageQuery(channel, options === null || options === void 0 ? void 0 : options.queryCreator);
51
45
  channelMarkAs().catch();
52
46
 
53
47
  if ((_queryRef$current = queryRef.current) !== null && _queryRef$current !== void 0 && _queryRef$current.hasNext) {
@@ -59,11 +53,10 @@ export const useGroupChannelMessagesWithQuery = (sdk, channel, userId, options)
59
53
 
60
54
  updateNextMessages([], true, sdk.currentUser.userId);
61
55
  }
62
- }, [sdk, activeChannel.url, options === null || options === void 0 ? void 0 : options.queryCreator]);
56
+ }, [sdk, channel.url, options === null || options === void 0 ? void 0 : options.queryCreator]);
63
57
 
64
58
  const channelUpdater = channel => {
65
- if (channel.isGroupChannel() && !isDifferentChannel(channel, activeChannel)) {
66
- setActiveChannel(channel);
59
+ if (channel.isGroupChannel() && !isDifferentChannel(channel, channel)) {
67
60
  forceUpdate();
68
61
  }
69
62
  };
@@ -71,18 +64,18 @@ export const useGroupChannelMessagesWithQuery = (sdk, channel, userId, options)
71
64
  useChannelHandler(sdk, HOOK_NAME, {
72
65
  // Messages
73
66
  onMessageReceived(eventChannel, message) {
74
- if (isDifferentChannel(activeChannel, eventChannel)) return;
67
+ if (isDifferentChannel(channel, eventChannel)) return;
75
68
  channelMarkAs();
76
69
  updateNextMessages([message], false, sdk.currentUser.userId);
77
70
  },
78
71
 
79
72
  onMessageUpdated(eventChannel, message) {
80
- if (isDifferentChannel(activeChannel, eventChannel)) return;
73
+ if (isDifferentChannel(channel, eventChannel)) return;
81
74
  updateMessages([message], false, sdk.currentUser.userId);
82
75
  },
83
76
 
84
77
  onMessageDeleted(eventChannel, messageId) {
85
- if (isDifferentChannel(activeChannel, eventChannel)) return;
78
+ if (isDifferentChannel(channel, eventChannel)) return;
86
79
  deleteMessages([messageId], []);
87
80
  deleteNextMessages([messageId], []);
88
81
  },
@@ -94,14 +87,14 @@ export const useGroupChannelMessagesWithQuery = (sdk, channel, userId, options)
94
87
  onChannelHidden: channelUpdater,
95
88
 
96
89
  onChannelMemberCountChanged(channels) {
97
- const channel = channels.find(c => !isDifferentChannel(c, activeChannel));
98
- if (channel) channelUpdater(channel);
90
+ const foundChannel = channels.find(c => !isDifferentChannel(c, channel));
91
+ if (foundChannel) channelUpdater(foundChannel);
99
92
  },
100
93
 
101
94
  onChannelDeleted(channelUrl) {
102
95
  var _options$onChannelDel;
103
96
 
104
- if (activeChannel.url === channelUrl) options === null || options === void 0 ? void 0 : (_options$onChannelDel = options.onChannelDeleted) === null || _options$onChannelDel === void 0 ? void 0 : _options$onChannelDel.call(options);
97
+ if (channel.url === channelUrl) options === null || options === void 0 ? void 0 : (_options$onChannelDel = options.onChannelDeleted) === null || _options$onChannelDel === void 0 ? void 0 : _options$onChannelDel.call(options);
105
98
  },
106
99
 
107
100
  // Users
@@ -115,7 +108,7 @@ export const useGroupChannelMessagesWithQuery = (sdk, channel, userId, options)
115
108
  onUserUnmuted: channelUpdater,
116
109
 
117
110
  onUserBanned(eventChannel, bannedUser) {
118
- if (isDifferentChannel(activeChannel, eventChannel)) return;
111
+ if (isDifferentChannel(channel, eventChannel)) return;
119
112
 
120
113
  if (bannedUser.userId === sdk.currentUser.userId) {
121
114
  var _options$onChannelDel2;
@@ -155,7 +148,7 @@ export const useGroupChannelMessagesWithQuery = (sdk, channel, userId, options)
155
148
  }, [nextMessages.length]);
156
149
  const sendUserMessage = useCallback((params, onPending) => {
157
150
  return new Promise((resolve, reject) => {
158
- activeChannel.sendUserMessage(params).onPending(pendingMessage => {
151
+ channel.sendUserMessage(params).onPending(pendingMessage => {
159
152
  if (pendingMessage.isUserMessage()) {
160
153
  updateNextMessages([pendingMessage], false, sdk.currentUser.userId);
161
154
  onPending === null || onPending === void 0 ? void 0 : onPending(pendingMessage);
@@ -169,10 +162,10 @@ export const useGroupChannelMessagesWithQuery = (sdk, channel, userId, options)
169
162
  reject(err);
170
163
  });
171
164
  });
172
- }, [activeChannel]);
165
+ }, [channel]);
173
166
  const sendFileMessage = useCallback((params, onPending) => {
174
167
  return new Promise((resolve, reject) => {
175
- activeChannel.sendFileMessage(params).onPending(pendingMessage => {
168
+ channel.sendFileMessage(params).onPending(pendingMessage => {
176
169
  if (pendingMessage.isFileMessage()) {
177
170
  updateNextMessages([pendingMessage], false, sdk.currentUser.userId);
178
171
  onPending === null || onPending === void 0 ? void 0 : onPending(pendingMessage);
@@ -186,35 +179,35 @@ export const useGroupChannelMessagesWithQuery = (sdk, channel, userId, options)
186
179
  reject(err);
187
180
  });
188
181
  });
189
- }, [activeChannel]);
182
+ }, [channel]);
190
183
  const updateUserMessage = useCallback(async (messageId, params) => {
191
- const updatedMessage = await activeChannel.updateUserMessage(messageId, params);
184
+ const updatedMessage = await channel.updateUserMessage(messageId, params);
192
185
  updateMessages([updatedMessage], false, sdk.currentUser.userId);
193
186
  return updatedMessage;
194
- }, [activeChannel]);
187
+ }, [channel]);
195
188
  const updateFileMessage = useCallback(async (messageId, params) => {
196
- const updatedMessage = await activeChannel.updateFileMessage(messageId, params);
189
+ const updatedMessage = await channel.updateFileMessage(messageId, params);
197
190
  updateMessages([updatedMessage], false, sdk.currentUser.userId);
198
191
  return updatedMessage;
199
- }, [activeChannel]);
192
+ }, [channel]);
200
193
  const resendMessage = useCallback(async failedMessage => {
201
194
  const message = await (() => {
202
- if (failedMessage.isUserMessage()) return activeChannel.resendUserMessage(failedMessage); // FIXME: v4 bugs
195
+ if (failedMessage.isUserMessage()) return channel.resendUserMessage(failedMessage); // FIXME: v4 bugs
203
196
  // @ts-ignore
204
197
 
205
- if (failedMessage.isFileMessage()) return activeChannel.resendFileMessage(failedMessage);
198
+ if (failedMessage.isFileMessage()) return channel.resendFileMessage(failedMessage);
206
199
  return null;
207
200
  })();
208
201
  if (message) updateNextMessages([message], false, sdk.currentUser.userId);
209
- }, [activeChannel]);
202
+ }, [channel]);
210
203
  const deleteMessage = useCallback(async message => {
211
204
  if (message.sendingStatus === 'succeeded') {
212
- if (message.isUserMessage()) await activeChannel.deleteMessage(message);
213
- if (message.isFileMessage()) await activeChannel.deleteMessage(message);
205
+ if (message.isUserMessage()) await channel.deleteMessage(message);
206
+ if (message.isFileMessage()) await channel.deleteMessage(message);
214
207
  } else {
215
208
  deleteMessages([message.messageId], [message.reqId]);
216
209
  }
217
- }, [activeChannel]);
210
+ }, [channel]);
218
211
  return {
219
212
  loading,
220
213
  refreshing,
@@ -229,8 +222,7 @@ export const useGroupChannelMessagesWithQuery = (sdk, channel, userId, options)
229
222
  updateUserMessage,
230
223
  updateFileMessage,
231
224
  resendMessage,
232
- deleteMessage,
233
- activeChannel
225
+ deleteMessage
234
226
  };
235
227
  };
236
228
  //# sourceMappingURL=useGroupChannelMessagesWithQuery.js.map