@sendbird/uikit-chat-hooks 2.4.2 → 2.5.0-rc.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 (46) hide show
  1. package/lib/commonjs/channel/{useGroupChannelMessages/reducer.js → useChannelMessagesReducer.js} +39 -30
  2. package/lib/commonjs/channel/useChannelMessagesReducer.js.map +1 -0
  3. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +169 -99
  4. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
  5. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +56 -25
  6. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
  7. package/lib/commonjs/channel/useOpenChannelList/useOpenChannelListWithQuery.js +0 -4
  8. package/lib/commonjs/channel/useOpenChannelList/useOpenChannelListWithQuery.js.map +1 -1
  9. package/lib/commonjs/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js +128 -28
  10. package/lib/commonjs/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js.map +1 -1
  11. package/lib/commonjs/common/useUserList.js +2 -2
  12. package/lib/commonjs/common/useUserList.js.map +1 -1
  13. package/lib/commonjs/types.js.map +1 -1
  14. package/lib/module/channel/{useGroupChannelMessages/reducer.js → useChannelMessagesReducer.js} +38 -29
  15. package/lib/module/channel/useChannelMessagesReducer.js.map +1 -0
  16. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +170 -100
  17. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
  18. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +57 -26
  19. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
  20. package/lib/module/channel/useOpenChannelList/useOpenChannelListWithQuery.js +0 -4
  21. package/lib/module/channel/useOpenChannelList/useOpenChannelListWithQuery.js.map +1 -1
  22. package/lib/module/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js +129 -29
  23. package/lib/module/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js.map +1 -1
  24. package/lib/module/common/useUserList.js +2 -2
  25. package/lib/module/common/useUserList.js.map +1 -1
  26. package/lib/module/types.js.map +1 -1
  27. package/lib/typescript/src/channel/useChannelMessagesReducer.d.ts +18 -0
  28. package/lib/typescript/src/types.d.ts +51 -20
  29. package/package.json +4 -5
  30. package/src/channel/useChannelMessagesReducer.ts +143 -0
  31. package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.ts +168 -96
  32. package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.ts +62 -25
  33. package/src/channel/useOpenChannelList/useOpenChannelListWithQuery.ts +0 -4
  34. package/src/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.ts +142 -25
  35. package/src/common/useUserList.ts +2 -2
  36. package/src/types.ts +58 -20
  37. package/lib/commonjs/channel/useGroupChannelMessages/reducer.js.map +0 -1
  38. package/lib/commonjs/channel/useOpenChannelMessages/reducer.js +0 -144
  39. package/lib/commonjs/channel/useOpenChannelMessages/reducer.js.map +0 -1
  40. package/lib/module/channel/useGroupChannelMessages/reducer.js.map +0 -1
  41. package/lib/module/channel/useOpenChannelMessages/reducer.js +0 -137
  42. package/lib/module/channel/useOpenChannelMessages/reducer.js.map +0 -1
  43. package/lib/typescript/src/channel/useGroupChannelMessages/reducer.d.ts +0 -15
  44. package/lib/typescript/src/channel/useOpenChannelMessages/reducer.d.ts +0 -15
  45. package/src/channel/useGroupChannelMessages/reducer.ts +0 -126
  46. package/src/channel/useOpenChannelMessages/reducer.ts +0 -126
@@ -1,9 +1,16 @@
1
1
  import { useRef } from 'react';
2
2
 
3
- import type { SendbirdBaseChannel, SendbirdOpenChannel, SendbirdPreviousMessageListQuery } from '@sendbird/uikit-utils';
3
+ import type {
4
+ SendbirdBaseChannel,
5
+ SendbirdBaseMessage,
6
+ SendbirdOpenChannel,
7
+ SendbirdPreviousMessageListQuery,
8
+ } from '@sendbird/uikit-utils';
4
9
  import {
10
+ ASYNC_NOOP,
5
11
  NOOP,
6
12
  isDifferentChannel,
13
+ isMyMessage,
7
14
  useAsyncEffect,
8
15
  useForceUpdate,
9
16
  useFreshCallback,
@@ -11,8 +18,9 @@ import {
11
18
  } from '@sendbird/uikit-utils';
12
19
 
13
20
  import { useChannelHandler } from '../../handler/useChannelHandler';
21
+ import { useConnectionHandler } from '../../handler/useConnectionHandler';
14
22
  import type { UseOpenChannelMessages, UseOpenChannelMessagesOptions } from '../../types';
15
- import { useOpenChannelMessagesReducer } from './reducer';
23
+ import { useChannelMessagesReducer } from '../useChannelMessagesReducer';
16
24
 
17
25
  const createMessageQuery = (channel: SendbirdOpenChannel, creator?: UseOpenChannelMessagesOptions['queryCreator']) => {
18
26
  if (creator) return creator();
@@ -31,15 +39,14 @@ export const useOpenChannelMessagesWithQuery: UseOpenChannelMessages = (sdk, cha
31
39
  loading,
32
40
  refreshing,
33
41
  messages,
34
- nextMessages,
35
- newMessagesFromMembers,
42
+ newMessages,
36
43
  updateMessages,
37
- updateNextMessages,
38
- deleteNextMessages,
44
+ updateNewMessages,
45
+ deleteNewMessages,
39
46
  deleteMessages,
40
47
  updateLoading,
41
48
  updateRefreshing,
42
- } = useOpenChannelMessagesReducer(userId, options?.sortComparator);
49
+ } = useChannelMessagesReducer(options?.sortComparator);
43
50
 
44
51
  const init = useFreshCallback(async (uid?: string) => {
45
52
  if (uid) {
@@ -49,7 +56,7 @@ export const useOpenChannelMessagesWithQuery: UseOpenChannelMessages = (sdk, cha
49
56
 
50
57
  updateMessages(list, true, sdk.currentUser.userId);
51
58
  }
52
- updateNextMessages([], true, sdk.currentUser.userId);
59
+ updateNewMessages([], true, sdk.currentUser.userId);
53
60
  }
54
61
  });
55
62
 
@@ -59,6 +66,99 @@ export const useOpenChannelMessagesWithQuery: UseOpenChannelMessages = (sdk, cha
59
66
  }
60
67
  };
61
68
 
69
+ useConnectionHandler(sdk, handlerId, {
70
+ async onReconnectSucceeded() {
71
+ const lastMessage = messages[0];
72
+ if (!lastMessage) return;
73
+
74
+ const messageContext = {
75
+ updatedMessages: [] as SendbirdBaseMessage[],
76
+ addedMessages: [] as SendbirdBaseMessage[],
77
+ deletedMessageIds: [] as number[],
78
+ };
79
+ const changeLogsContext = {
80
+ hasMore: false,
81
+ token: '',
82
+ };
83
+ const messageQueryContext = {
84
+ hasMore: false,
85
+ timestamp: lastMessage.createdAt,
86
+ };
87
+
88
+ // Updated & Deleted messages
89
+ const changelogsParams = {
90
+ replyType: queryRef.current?.replyType,
91
+ includeMetaArray: queryRef.current?.includeMetaArray,
92
+ includeReactions: queryRef.current?.includeReactions,
93
+ includeThreadInfo: queryRef.current?.includeThreadInfo,
94
+ includeParentMessageInfo: queryRef.current?.includeParentMessageInfo,
95
+ };
96
+
97
+ const changeLogsByTS = await channel.getMessageChangeLogsSinceTimestamp(lastMessage.createdAt);
98
+ changeLogsContext.token = changeLogsByTS.token;
99
+ changeLogsContext.hasMore = changeLogsByTS.hasMore;
100
+ messageContext.updatedMessages.push(...changeLogsByTS.updatedMessages);
101
+ messageContext.deletedMessageIds.push(...changeLogsByTS.deletedMessageIds);
102
+
103
+ while (changeLogsContext.hasMore) {
104
+ const changeLogsByToken = await channel.getMessageChangeLogsSinceToken(changeLogsByTS.token, changelogsParams);
105
+ changeLogsContext.token = changeLogsByToken.token;
106
+ changeLogsContext.hasMore = changeLogsByToken.hasMore;
107
+ messageContext.updatedMessages.push(...changeLogsByToken.updatedMessages);
108
+ messageContext.deletedMessageIds.push(...changeLogsByToken.deletedMessageIds);
109
+ }
110
+
111
+ // Added messages
112
+ const messageQueryParams = {
113
+ prevResultSize: 0,
114
+ nextResultSize: queryRef.current?.limit ?? 100,
115
+ reverse: queryRef.current?.reverse,
116
+ includeParentMessageInfo: queryRef.current?.includeParentMessageInfo,
117
+ includeThreadInfo: queryRef.current?.includeThreadInfo,
118
+ includeReactions: queryRef.current?.includeReactions,
119
+ includeMetaArray: queryRef.current?.includeMetaArray,
120
+ replyType: queryRef.current?.replyType,
121
+ customTypesFilter: queryRef.current?.customTypesFilter,
122
+ messageTypeFilter: queryRef.current?.messageTypeFilter,
123
+ senderUserIdsFilter: queryRef.current?.senderUserIdsFilter,
124
+ showSubchannelMessagesOnly: queryRef.current?.showSubchannelMessagesOnly,
125
+ };
126
+
127
+ const queriedMessages = await channel.getMessagesByTimestamp(lastMessage.createdAt, messageQueryParams);
128
+ messageQueryContext.hasMore = queriedMessages.length > 0;
129
+ if (messageQueryContext.hasMore) {
130
+ messageQueryContext.timestamp = queriedMessages[0].createdAt;
131
+ messageContext.addedMessages.unshift(...queriedMessages);
132
+ }
133
+
134
+ while (messageQueryContext.hasMore) {
135
+ const queriedMessages = await channel.getMessagesByTimestamp(messageQueryContext.timestamp, messageQueryParams);
136
+ messageQueryContext.hasMore = queriedMessages.length > 0;
137
+ if (messageQueryContext.hasMore) {
138
+ messageQueryContext.timestamp = queriedMessages[0].createdAt;
139
+ messageContext.addedMessages.unshift(...queriedMessages);
140
+ }
141
+ }
142
+
143
+ // Update to View
144
+ updateMessages(
145
+ [...messageContext.addedMessages, ...messageContext.updatedMessages],
146
+ false,
147
+ sdk.currentUser.userId,
148
+ );
149
+ deleteMessages(messageContext.deletedMessageIds, []);
150
+
151
+ if (messageContext.addedMessages.length > 0) {
152
+ if (options?.shouldCountNewMessages?.()) {
153
+ updateNewMessages(messageContext.addedMessages, false, sdk.currentUser.userId);
154
+ }
155
+ if (options?.onMessagesReceived) {
156
+ options.onMessagesReceived(messageContext.addedMessages);
157
+ }
158
+ }
159
+ },
160
+ });
161
+
62
162
  useChannelHandler(
63
163
  sdk,
64
164
  handlerId,
@@ -66,16 +166,26 @@ export const useOpenChannelMessagesWithQuery: UseOpenChannelMessages = (sdk, cha
66
166
  // Messages
67
167
  onMessageReceived(eventChannel, message) {
68
168
  if (isDifferentChannel(channel, eventChannel)) return;
69
- updateNextMessages([message], false, sdk.currentUser.userId);
169
+ if (isMyMessage(message, sdk.currentUser.userId)) return;
170
+
171
+ updateMessages([message], false, sdk.currentUser.userId);
172
+ if (options?.shouldCountNewMessages?.()) {
173
+ updateNewMessages([message], false, sdk.currentUser.userId);
174
+ }
175
+ if (options?.onMessagesReceived) {
176
+ options.onMessagesReceived([message]);
177
+ }
70
178
  },
71
179
  onMessageUpdated(eventChannel, message) {
72
180
  if (isDifferentChannel(channel, eventChannel)) return;
181
+ if (isMyMessage(message, sdk.currentUser.userId)) return;
182
+
73
183
  updateMessages([message], false, sdk.currentUser.userId);
74
184
  },
75
185
  onMessageDeleted(eventChannel, messageId) {
76
186
  if (isDifferentChannel(channel, eventChannel)) return;
77
187
  deleteMessages([messageId], []);
78
- deleteNextMessages([messageId], []);
188
+ deleteNewMessages([messageId], []);
79
189
  },
80
190
  // Channels
81
191
  onChannelChanged: channelUpdater,
@@ -138,13 +248,12 @@ export const useOpenChannelMessagesWithQuery: UseOpenChannelMessages = (sdk, cha
138
248
  updateMessages(list, false, sdk.currentUser.userId);
139
249
  }
140
250
  });
251
+ const hasPrev: ReturnType<UseOpenChannelMessages>['hasPrev'] = useFreshCallback(
252
+ () => queryRef.current?.hasNext ?? false,
253
+ );
141
254
 
142
- const next: ReturnType<UseOpenChannelMessages>['next'] = useFreshCallback(async () => {
143
- if (nextMessages.length > 0) {
144
- updateMessages(nextMessages, false, sdk.currentUser.userId);
145
- updateNextMessages([], true, sdk.currentUser.userId);
146
- }
147
- });
255
+ const next: ReturnType<UseOpenChannelMessages>['next'] = useFreshCallback(ASYNC_NOOP);
256
+ const hasNext: ReturnType<UseOpenChannelMessages>['hasNext'] = useFreshCallback(() => false);
148
257
 
149
258
  const sendUserMessage: ReturnType<UseOpenChannelMessages>['sendUserMessage'] = useFreshCallback(
150
259
  (params, onPending) => {
@@ -153,18 +262,18 @@ export const useOpenChannelMessagesWithQuery: UseOpenChannelMessages = (sdk, cha
153
262
  .sendUserMessage(params)
154
263
  .onPending((pendingMessage) => {
155
264
  if (pendingMessage.isUserMessage()) {
156
- updateNextMessages([pendingMessage], false, sdk.currentUser.userId);
265
+ updateMessages([pendingMessage], false, sdk.currentUser.userId);
157
266
  onPending?.(pendingMessage);
158
267
  }
159
268
  })
160
269
  .onSucceeded((sentMessage) => {
161
270
  if (sentMessage.isUserMessage()) {
162
- updateNextMessages([sentMessage], false, sdk.currentUser.userId);
271
+ updateMessages([sentMessage], false, sdk.currentUser.userId);
163
272
  resolve(sentMessage);
164
273
  }
165
274
  })
166
275
  .onFailed((err, sentMessage) => {
167
- updateNextMessages([sentMessage], false, sdk.currentUser.userId);
276
+ updateMessages([sentMessage], false, sdk.currentUser.userId);
168
277
  reject(err);
169
278
  });
170
279
  });
@@ -178,18 +287,18 @@ export const useOpenChannelMessagesWithQuery: UseOpenChannelMessages = (sdk, cha
178
287
  .sendFileMessage(params)
179
288
  .onPending((pendingMessage) => {
180
289
  if (pendingMessage.isFileMessage()) {
181
- updateNextMessages([pendingMessage], false, sdk.currentUser.userId);
290
+ updateMessages([pendingMessage], false, sdk.currentUser.userId);
182
291
  onPending?.(pendingMessage);
183
292
  }
184
293
  })
185
294
  .onSucceeded((sentMessage) => {
186
295
  if (sentMessage.isFileMessage()) {
187
- updateNextMessages([sentMessage], false, sdk.currentUser.userId);
296
+ updateMessages([sentMessage], false, sdk.currentUser.userId);
188
297
  resolve(sentMessage);
189
298
  }
190
299
  })
191
300
  .onFailed((err, sentMessage) => {
192
- updateNextMessages([sentMessage], false, sdk.currentUser.userId);
301
+ updateMessages([sentMessage], false, sdk.currentUser.userId);
193
302
  reject(err);
194
303
  });
195
304
  });
@@ -217,7 +326,7 @@ export const useOpenChannelMessagesWithQuery: UseOpenChannelMessages = (sdk, cha
217
326
  return null;
218
327
  })();
219
328
 
220
- if (message) updateNextMessages([message], false, sdk.currentUser.userId);
329
+ if (message) updateMessages([message], false, sdk.currentUser.userId);
221
330
  });
222
331
  const deleteMessage: ReturnType<UseOpenChannelMessages>['deleteMessage'] = useFreshCallback(async (message) => {
223
332
  if (message.sendingStatus === 'succeeded') {
@@ -227,21 +336,29 @@ export const useOpenChannelMessagesWithQuery: UseOpenChannelMessages = (sdk, cha
227
336
  deleteMessages([message.messageId], [message.reqId]);
228
337
  }
229
338
  });
339
+ const resetNewMessages: ReturnType<UseOpenChannelMessages>['resetNewMessages'] = useFreshCallback(() => {
340
+ updateNewMessages([], true, sdk.currentUser.userId);
341
+ });
230
342
 
231
343
  return {
232
344
  loading,
233
345
  refreshing,
234
346
  refresh,
235
347
  messages,
236
- nextMessages,
237
- newMessagesFromMembers,
348
+ newMessages,
238
349
  next,
350
+ hasNext,
239
351
  prev,
352
+ hasPrev,
240
353
  sendUserMessage,
241
354
  sendFileMessage,
242
355
  updateUserMessage,
243
356
  updateFileMessage,
244
357
  resendMessage,
245
358
  deleteMessage,
359
+ resetNewMessages,
360
+
361
+ nextMessages: newMessages,
362
+ newMessagesFromMembers: newMessages,
246
363
  };
247
364
  };
@@ -85,7 +85,7 @@ export const useUserList = <
85
85
  if (query.current?.hasNext) {
86
86
  const users = await query.current?.next().catch((e) => {
87
87
  Logger.error(e);
88
- if (e.code === SBErrorCode.NON_AUTHORIZED) Logger.warn(SBErrorMessage.ACL);
88
+ if (e.code === SBErrorCode.UNAUTHORIZED_REQUEST) Logger.warn(SBErrorMessage.ACL);
89
89
  throw e;
90
90
  });
91
91
  updateUsers(users, true);
@@ -122,7 +122,7 @@ export const useUserList = <
122
122
  if (query.current && query.current?.hasNext) {
123
123
  const nextUsers = await query.current.next().catch((e) => {
124
124
  Logger.error(e);
125
- if (e.code === SBErrorCode.NON_AUTHORIZED) Logger.warn(SBErrorMessage.ACL);
125
+ if (e.code === SBErrorCode.UNAUTHORIZED_REQUEST) Logger.warn(SBErrorMessage.ACL);
126
126
  throw e;
127
127
  });
128
128
  updateUsers(nextUsers, false);
package/src/types.ts CHANGED
@@ -74,9 +74,9 @@ export type UseGroupChannelListOptions = {
74
74
  /**
75
75
  * @interface UseGroupChannelMessages
76
76
  * @description interface for group channel messages hook
77
- * - Receive new messages from other users -> append to state(nextMessages)
77
+ * - Receive new messages from other users & should count new messages -> append to state(newMessages)
78
78
  * - onTopReached -> prev() -> fetch prev messages and append to state(messages)
79
- * - onBottomReached -> next() -> nextMessages append to state(messages)
79
+ * - onBottomReached -> next() -> fetch next messages and append to state(messages)
80
80
  * */
81
81
  export interface UseGroupChannelMessages {
82
82
  (sdk: SendbirdChatSDK, channel: SendbirdGroupChannel, userId?: string, options?: UseGroupChannelMessagesOptions): {
@@ -111,26 +111,40 @@ export interface UseGroupChannelMessages {
111
111
  prev: () => Promise<void>;
112
112
 
113
113
  /**
114
- * Get messages, this state is for temporary data before render
115
- * For example, if a user receives a new messages while searching for an old message
116
- * for this case, new messages will be included here.
114
+ * Check if there are more prev messages to fetch
115
+ * @return {boolean}
117
116
  * */
118
- nextMessages: SendbirdMessage[];
117
+ hasPrev: () => boolean;
118
+
119
+ /**
120
+ * Fetch next messages to state
121
+ * @return {Promise<void>}
122
+ * */
123
+ next: () => Promise<void>;
124
+
125
+ /**
126
+ * Check if there are more next messages to fetch
127
+ * @return {boolean}
128
+ * */
129
+ hasNext: () => boolean;
119
130
 
120
131
  /**
121
- * Get new messages from nextMessages
122
132
  * A new message means a message that meets the below conditions
123
133
  * - Not admin message
124
134
  * - Not updated message
125
135
  * - Not current user's message
126
136
  * */
127
- newMessagesFromMembers: SendbirdMessage[];
137
+ newMessages: SendbirdMessage[];
128
138
 
129
139
  /**
130
- * Fetch next messages to state
131
- * @return {Promise<void>}
140
+ * reset message list with starting point
132
141
  * */
133
- next: () => Promise<void>;
142
+ resetWithStartingPoint: (startingPoint: number, callback?: () => void) => void;
143
+
144
+ /**
145
+ * Reset new messages
146
+ * */
147
+ resetNewMessages: () => void;
134
148
 
135
149
  /**
136
150
  * Send file message
@@ -183,15 +197,23 @@ export interface UseGroupChannelMessages {
183
197
  * @return {Promise<void>}
184
198
  * */
185
199
  deleteMessage: (message: SendbirdFileMessage | SendbirdUserMessage) => Promise<void>;
200
+
201
+ /** @deprecated Please use `newMessages` instead **/
202
+ newMessagesFromMembers: SendbirdMessage[];
203
+ /** @deprecated Please use `newMessages` instead **/
204
+ nextMessages: SendbirdMessage[];
186
205
  };
187
206
  }
188
207
 
189
208
  export type UseGroupChannelMessagesOptions = {
190
209
  sortComparator?: (a: SendbirdMessage, b: SendbirdMessage) => number;
191
210
  queryCreator?: () => SendbirdPreviousMessageListQuery;
192
- collectionCreator?: () => SendbirdMessageCollection;
211
+ collectionCreator?: (options?: Pick<UseGroupChannelMessagesOptions, 'startingPoint'>) => SendbirdMessageCollection;
193
212
  enableCollectionWithoutLocalCache?: boolean;
194
213
  onChannelDeleted?: () => void;
214
+ shouldCountNewMessages?: () => boolean;
215
+ startingPoint?: number;
216
+ onMessagesReceived?: (messages: SendbirdMessage[]) => void;
195
217
  };
196
218
 
197
219
  /**
@@ -240,9 +262,9 @@ export type UseOpenChannelListOptions = {
240
262
  /**
241
263
  * @interface UseOpenChannelMessages
242
264
  * @description interface for open channel messages hook
243
- * - Receive new messages from other users -> append to state(nextMessages)
265
+ * - Receive new messages from other users & should count new messages -> append to state(newMessages)
244
266
  * - onTopReached -> prev() -> fetch prev messages and append to state(messages)
245
- * - onBottomReached -> next() -> nextMessages append to state(messages)
267
+ * - onBottomReached -> noop
246
268
  * */
247
269
  export interface UseOpenChannelMessages {
248
270
  (sdk: SendbirdChatSDK, channel: SendbirdOpenChannel, userId?: string, options?: UseOpenChannelMessagesOptions): {
@@ -277,20 +299,23 @@ export interface UseOpenChannelMessages {
277
299
  prev: () => Promise<void>;
278
300
 
279
301
  /**
280
- * Get messages, this state is for temporary data before render
281
- * For example, if a user receives a new messages while searching for an old message
282
- * for this case, new messages will be included here.
302
+ * Check if there are more prev messages to fetch
303
+ * @return {boolean}
283
304
  * */
284
- nextMessages: SendbirdMessage[];
305
+ hasPrev: () => boolean;
285
306
 
286
307
  /**
287
- * Get new messages from nextMessages
288
308
  * A new message means a message that meets the below conditions
289
309
  * - Not admin message
290
310
  * - Not updated message
291
311
  * - Not current user's message
292
312
  * */
293
- newMessagesFromMembers: SendbirdMessage[];
313
+ newMessages: SendbirdMessage[];
314
+
315
+ /**
316
+ * Reset new messages
317
+ * */
318
+ resetNewMessages: () => void;
294
319
 
295
320
  /**
296
321
  * Fetch next messages to state
@@ -298,6 +323,12 @@ export interface UseOpenChannelMessages {
298
323
  * */
299
324
  next: () => Promise<void>;
300
325
 
326
+ /**
327
+ * Check if there are more next messages to fetch
328
+ * @return {boolean}
329
+ * */
330
+ hasNext: () => boolean;
331
+
301
332
  /**
302
333
  * Send file message
303
334
  * @param params file message params
@@ -349,6 +380,11 @@ export interface UseOpenChannelMessages {
349
380
  * @return {Promise<void>}
350
381
  * */
351
382
  deleteMessage: (message: SendbirdFileMessage | SendbirdUserMessage) => Promise<void>;
383
+
384
+ /** @deprecated Please use `newMessages` instead **/
385
+ newMessagesFromMembers: SendbirdMessage[];
386
+ /** @deprecated Please use `newMessages` instead **/
387
+ nextMessages: SendbirdMessage[];
352
388
  };
353
389
  }
354
390
 
@@ -357,6 +393,8 @@ export type UseOpenChannelMessagesOptions = {
357
393
  queryCreator?: () => SendbirdPreviousMessageListQuery;
358
394
  onChannelDeleted?: () => void;
359
395
  onError?: (error?: unknown) => void;
396
+ shouldCountNewMessages?: () => boolean;
397
+ onMessagesReceived?: (messages: SendbirdMessage[]) => void;
360
398
  };
361
399
 
362
400
  /**
@@ -1 +0,0 @@
1
- {"version":3,"names":["_react","require","_uikitUtils","defaultReducer","_ref","action","draft","type","value","status","key","receivedMessagesAsMap","arrayToMapWithGetter","messages","getMessageUniqId","clearBeforeAction","filter","m","isFileMessage","isUserMessage","Boolean","reqId","sendingStatus","isMyMessage","currentUserId","forEach","messageIds","msgId","reqIds","useGroupChannelMessagesReducer","userId","sortComparator","loading","refreshing","messageMap","nextMessageMap","dispatch","useReducer","updateMessages","deleteMessages","updateNextMessages","deleteNextMessages","updateLoading","updateRefreshing","useIIFE","Object","values","sort","nextMessages","newMessagesFromMembers","msg","isNewMessage","exports"],"sources":["reducer.ts"],"sourcesContent":["import { useReducer } from 'react';\n\nimport type { SendbirdBaseMessage, SendbirdFileMessage, SendbirdUserMessage } from '@sendbird/uikit-utils';\nimport { arrayToMapWithGetter, getMessageUniqId, isMyMessage, isNewMessage, useIIFE } from '@sendbird/uikit-utils';\n\nimport type { UseGroupChannelMessagesOptions } from '../../types';\n\ntype Action =\n | {\n type: 'update_loading' | 'update_refreshing';\n value: { status: boolean };\n }\n | {\n type: 'update_messages' | 'update_next_messages';\n value: { messages: SendbirdBaseMessage[]; clearBeforeAction: boolean; currentUserId?: string };\n }\n | {\n type: 'delete_messages' | 'delete_next_messages';\n value: { messageIds: number[]; reqIds: string[] };\n };\n\ntype State = {\n loading: boolean;\n refreshing: boolean;\n messageMap: Record<string, SendbirdBaseMessage>;\n nextMessageMap: 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 case 'update_next_messages': {\n const key = action.type === 'update_messages' ? 'messageMap' : 'nextMessageMap';\n const receivedMessagesAsMap = arrayToMapWithGetter(action.value.messages, getMessageUniqId);\n if (action.value.clearBeforeAction) {\n draft[key] = receivedMessagesAsMap;\n } else {\n draft[key] = { ...draft[key], ...receivedMessagesAsMap };\n\n // NOTE: Replace pending message to succeeded message\n action.value.messages\n .filter((m): m is SendbirdUserMessage | SendbirdFileMessage => {\n return (\n (m.isFileMessage() || m.isUserMessage()) &&\n Boolean(draft[key][m.reqId]) &&\n m.sendingStatus === 'succeeded' &&\n isMyMessage(m, action.value.currentUserId)\n );\n })\n .forEach((m) => delete draft[key][m.reqId]);\n }\n\n return draft;\n }\n case 'delete_messages':\n case 'delete_next_messages': {\n const key = action.type === 'delete_messages' ? 'messageMap' : 'nextMessageMap';\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 useGroupChannelMessagesReducer = (\n userId?: string,\n sortComparator?: UseGroupChannelMessagesOptions['sortComparator'],\n) => {\n const [{ loading, refreshing, messageMap, nextMessageMap }, dispatch] = useReducer(defaultReducer, {\n loading: true,\n refreshing: false,\n messageMap: {},\n nextMessageMap: {},\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 updateNextMessages = (messages: SendbirdBaseMessage[], clearBeforeAction: boolean, currentUserId?: string) => {\n dispatch({ type: 'update_next_messages', value: { messages, clearBeforeAction, currentUserId } });\n };\n const deleteNextMessages = (messageIds: number[], reqIds: string[]) => {\n dispatch({ type: 'delete_next_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 nextMessages = Object.values(nextMessageMap);\n const newMessagesFromMembers = nextMessages.filter((msg) => isNewMessage(msg, userId));\n\n return {\n updateLoading,\n updateRefreshing,\n updateMessages,\n updateNextMessages,\n deleteMessages,\n deleteNextMessages,\n\n loading,\n refreshing,\n messages,\n nextMessages,\n newMessagesFromMembers,\n };\n};\n"],"mappings":"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"}
@@ -1,144 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.useOpenChannelMessagesReducer = void 0;
7
- var _react = require("react");
8
- var _uikitUtils = require("@sendbird/uikit-utils");
9
- const defaultReducer = (_ref, action) => {
10
- let {
11
- ...draft
12
- } = _ref;
13
- switch (action.type) {
14
- case 'update_refreshing':
15
- {
16
- draft['refreshing'] = action.value.status;
17
- return draft;
18
- }
19
- case 'update_loading':
20
- {
21
- draft['loading'] = action.value.status;
22
- return draft;
23
- }
24
- case 'update_messages':
25
- case 'update_next_messages':
26
- {
27
- const key = action.type === 'update_messages' ? 'messageMap' : 'nextMessageMap';
28
- const receivedMessagesAsMap = (0, _uikitUtils.arrayToMapWithGetter)(action.value.messages, _uikitUtils.getMessageUniqId);
29
- if (action.value.clearBeforeAction) {
30
- draft[key] = receivedMessagesAsMap;
31
- } else {
32
- draft[key] = {
33
- ...draft[key],
34
- ...receivedMessagesAsMap
35
- };
36
-
37
- // NOTE: Replace pending message to succeeded message
38
- action.value.messages.filter(m => {
39
- return (m.isFileMessage() || m.isUserMessage()) && Boolean(draft[key][m.reqId]) && m.sendingStatus === 'succeeded' && (0, _uikitUtils.isMyMessage)(m, action.value.currentUserId);
40
- }).forEach(m => delete draft[key][m.reqId]);
41
- }
42
- return draft;
43
- }
44
- case 'delete_messages':
45
- case 'delete_next_messages':
46
- {
47
- const key = action.type === 'delete_messages' ? 'messageMap' : 'nextMessageMap';
48
- draft[key] = {
49
- ...draft[key]
50
- };
51
- action.value.messageIds.forEach(msgId => delete draft[key][msgId]);
52
- action.value.reqIds.forEach(reqId => delete draft[key][reqId]);
53
- return draft;
54
- }
55
- }
56
- };
57
- const useOpenChannelMessagesReducer = (userId, sortComparator) => {
58
- const [{
59
- loading,
60
- refreshing,
61
- messageMap,
62
- nextMessageMap
63
- }, dispatch] = (0, _react.useReducer)(defaultReducer, {
64
- loading: true,
65
- refreshing: false,
66
- messageMap: {},
67
- nextMessageMap: {}
68
- });
69
- const updateMessages = (messages, clearBeforeAction, currentUserId) => {
70
- dispatch({
71
- type: 'update_messages',
72
- value: {
73
- messages,
74
- clearBeforeAction,
75
- currentUserId
76
- }
77
- });
78
- };
79
- const deleteMessages = (messageIds, reqIds) => {
80
- dispatch({
81
- type: 'delete_messages',
82
- value: {
83
- messageIds,
84
- reqIds
85
- }
86
- });
87
- };
88
- const updateNextMessages = (messages, clearBeforeAction, currentUserId) => {
89
- dispatch({
90
- type: 'update_next_messages',
91
- value: {
92
- messages,
93
- clearBeforeAction,
94
- currentUserId
95
- }
96
- });
97
- };
98
- const deleteNextMessages = (messageIds, reqIds) => {
99
- dispatch({
100
- type: 'delete_next_messages',
101
- value: {
102
- messageIds,
103
- reqIds
104
- }
105
- });
106
- };
107
- const updateLoading = status => {
108
- dispatch({
109
- type: 'update_loading',
110
- value: {
111
- status
112
- }
113
- });
114
- };
115
- const updateRefreshing = status => {
116
- dispatch({
117
- type: 'update_refreshing',
118
- value: {
119
- status
120
- }
121
- });
122
- };
123
- const messages = (0, _uikitUtils.useIIFE)(() => {
124
- if (sortComparator) return Object.values(messageMap).sort(sortComparator);
125
- return Object.values(messageMap);
126
- });
127
- const nextMessages = Object.values(nextMessageMap);
128
- const newMessagesFromMembers = nextMessages.filter(msg => (0, _uikitUtils.isNewMessage)(msg, userId));
129
- return {
130
- updateLoading,
131
- updateRefreshing,
132
- updateMessages,
133
- updateNextMessages,
134
- deleteMessages,
135
- deleteNextMessages,
136
- loading,
137
- refreshing,
138
- messages,
139
- nextMessages,
140
- newMessagesFromMembers
141
- };
142
- };
143
- exports.useOpenChannelMessagesReducer = useOpenChannelMessagesReducer;
144
- //# sourceMappingURL=reducer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["_react","require","_uikitUtils","defaultReducer","_ref","action","draft","type","value","status","key","receivedMessagesAsMap","arrayToMapWithGetter","messages","getMessageUniqId","clearBeforeAction","filter","m","isFileMessage","isUserMessage","Boolean","reqId","sendingStatus","isMyMessage","currentUserId","forEach","messageIds","msgId","reqIds","useOpenChannelMessagesReducer","userId","sortComparator","loading","refreshing","messageMap","nextMessageMap","dispatch","useReducer","updateMessages","deleteMessages","updateNextMessages","deleteNextMessages","updateLoading","updateRefreshing","useIIFE","Object","values","sort","nextMessages","newMessagesFromMembers","msg","isNewMessage","exports"],"sources":["reducer.ts"],"sourcesContent":["import { useReducer } from 'react';\n\nimport type { SendbirdBaseMessage, SendbirdFileMessage, SendbirdUserMessage } from '@sendbird/uikit-utils';\nimport { arrayToMapWithGetter, getMessageUniqId, isMyMessage, isNewMessage, useIIFE } from '@sendbird/uikit-utils';\n\nimport type { UseOpenChannelMessagesOptions } from '../../types';\n\ntype Action =\n | {\n type: 'update_loading' | 'update_refreshing';\n value: { status: boolean };\n }\n | {\n type: 'update_messages' | 'update_next_messages';\n value: { messages: SendbirdBaseMessage[]; clearBeforeAction: boolean; currentUserId?: string };\n }\n | {\n type: 'delete_messages' | 'delete_next_messages';\n value: { messageIds: number[]; reqIds: string[] };\n };\n\ntype State = {\n loading: boolean;\n refreshing: boolean;\n messageMap: Record<string, SendbirdBaseMessage>;\n nextMessageMap: 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 case 'update_next_messages': {\n const key = action.type === 'update_messages' ? 'messageMap' : 'nextMessageMap';\n const receivedMessagesAsMap = arrayToMapWithGetter(action.value.messages, getMessageUniqId);\n if (action.value.clearBeforeAction) {\n draft[key] = receivedMessagesAsMap;\n } else {\n draft[key] = { ...draft[key], ...receivedMessagesAsMap };\n\n // NOTE: Replace pending message to succeeded message\n action.value.messages\n .filter((m): m is SendbirdUserMessage | SendbirdFileMessage => {\n return (\n (m.isFileMessage() || m.isUserMessage()) &&\n Boolean(draft[key][m.reqId]) &&\n m.sendingStatus === 'succeeded' &&\n isMyMessage(m, action.value.currentUserId)\n );\n })\n .forEach((m) => delete draft[key][m.reqId]);\n }\n\n return draft;\n }\n case 'delete_messages':\n case 'delete_next_messages': {\n const key = action.type === 'delete_messages' ? 'messageMap' : 'nextMessageMap';\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 useOpenChannelMessagesReducer = (\n userId?: string,\n sortComparator?: UseOpenChannelMessagesOptions['sortComparator'],\n) => {\n const [{ loading, refreshing, messageMap, nextMessageMap }, dispatch] = useReducer(defaultReducer, {\n loading: true,\n refreshing: false,\n messageMap: {},\n nextMessageMap: {},\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 updateNextMessages = (messages: SendbirdBaseMessage[], clearBeforeAction: boolean, currentUserId?: string) => {\n dispatch({ type: 'update_next_messages', value: { messages, clearBeforeAction, currentUserId } });\n };\n const deleteNextMessages = (messageIds: number[], reqIds: string[]) => {\n dispatch({ type: 'delete_next_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 nextMessages = Object.values(nextMessageMap);\n const newMessagesFromMembers = nextMessages.filter((msg) => isNewMessage(msg, userId));\n\n return {\n updateLoading,\n updateRefreshing,\n updateMessages,\n updateNextMessages,\n deleteMessages,\n deleteNextMessages,\n\n loading,\n refreshing,\n messages,\n nextMessages,\n newMessagesFromMembers,\n };\n};\n"],"mappings":"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"}