@sendbird/uikit-chat-hooks 2.4.1 → 2.4.2

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 (124) hide show
  1. package/README.md +2 -2
  2. package/lib/commonjs/channel/useGroupChannel.js +0 -4
  3. package/lib/commonjs/channel/useGroupChannel.js.map +1 -1
  4. package/lib/commonjs/channel/useGroupChannelList/index.js +0 -5
  5. package/lib/commonjs/channel/useGroupChannelList/index.js.map +1 -1
  6. package/lib/commonjs/channel/useGroupChannelList/reducer.js +12 -29
  7. package/lib/commonjs/channel/useGroupChannelList/reducer.js.map +1 -1
  8. package/lib/commonjs/channel/useGroupChannelList/useGroupChannelListWithCollection.js +1 -22
  9. package/lib/commonjs/channel/useGroupChannelList/useGroupChannelListWithCollection.js.map +1 -1
  10. package/lib/commonjs/channel/useGroupChannelList/useGroupChannelListWithQuery.js +1 -18
  11. package/lib/commonjs/channel/useGroupChannelList/useGroupChannelListWithQuery.js.map +1 -1
  12. package/lib/commonjs/channel/useGroupChannelMessages/index.js +0 -5
  13. package/lib/commonjs/channel/useGroupChannelMessages/index.js.map +1 -1
  14. package/lib/commonjs/channel/useGroupChannelMessages/reducer.js +18 -28
  15. package/lib/commonjs/channel/useGroupChannelMessages/reducer.js.map +1 -1
  16. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +8 -37
  17. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
  18. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +21 -49
  19. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
  20. package/lib/commonjs/channel/useOpenChannel.js +0 -4
  21. package/lib/commonjs/channel/useOpenChannel.js.map +1 -1
  22. package/lib/commonjs/channel/useOpenChannelList/index.js +0 -3
  23. package/lib/commonjs/channel/useOpenChannelList/index.js.map +1 -1
  24. package/lib/commonjs/channel/useOpenChannelList/reducer.js +2 -21
  25. package/lib/commonjs/channel/useOpenChannelList/reducer.js.map +1 -1
  26. package/lib/commonjs/channel/useOpenChannelList/useOpenChannelListWithQuery.js +1 -18
  27. package/lib/commonjs/channel/useOpenChannelList/useOpenChannelListWithQuery.js.map +1 -1
  28. package/lib/commonjs/channel/useOpenChannelMessages/index.js +0 -3
  29. package/lib/commonjs/channel/useOpenChannelMessages/index.js.map +1 -1
  30. package/lib/commonjs/channel/useOpenChannelMessages/reducer.js +18 -28
  31. package/lib/commonjs/channel/useOpenChannelMessages/reducer.js.map +1 -1
  32. package/lib/commonjs/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js +1 -30
  33. package/lib/commonjs/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js.map +1 -1
  34. package/lib/commonjs/common/useAppFeatures.js +0 -3
  35. package/lib/commonjs/common/useAppFeatures.js.map +1 -1
  36. package/lib/commonjs/common/useMessageOutgoingStatus.js +0 -11
  37. package/lib/commonjs/common/useMessageOutgoingStatus.js.map +1 -1
  38. package/lib/commonjs/common/usePushTrigger.js +0 -6
  39. package/lib/commonjs/common/usePushTrigger.js.map +1 -1
  40. package/lib/commonjs/common/useTotalUnreadMessageCount.js +0 -7
  41. package/lib/commonjs/common/useTotalUnreadMessageCount.js.map +1 -1
  42. package/lib/commonjs/common/useUserList.js +3 -18
  43. package/lib/commonjs/common/useUserList.js.map +1 -1
  44. package/lib/commonjs/handler/useChannelHandler.js +15 -41
  45. package/lib/commonjs/handler/useChannelHandler.js.map +1 -1
  46. package/lib/commonjs/handler/useConnectionHandler.js +14 -11
  47. package/lib/commonjs/handler/useConnectionHandler.js.map +1 -1
  48. package/lib/commonjs/handler/useUserEventHandler.js +0 -8
  49. package/lib/commonjs/handler/useUserEventHandler.js.map +1 -1
  50. package/lib/commonjs/index.js +0 -23
  51. package/lib/commonjs/index.js.map +1 -1
  52. package/lib/commonjs/model/CustomQuery.js +0 -6
  53. package/lib/commonjs/model/CustomQuery.js.map +1 -1
  54. package/lib/module/channel/useGroupChannel.js.map +1 -1
  55. package/lib/module/channel/useGroupChannelList/index.js.map +1 -1
  56. package/lib/module/channel/useGroupChannelList/reducer.js +12 -26
  57. package/lib/module/channel/useGroupChannelList/reducer.js.map +1 -1
  58. package/lib/module/channel/useGroupChannelList/useGroupChannelListWithCollection.js +1 -15
  59. package/lib/module/channel/useGroupChannelList/useGroupChannelListWithCollection.js.map +1 -1
  60. package/lib/module/channel/useGroupChannelList/useGroupChannelListWithQuery.js +1 -11
  61. package/lib/module/channel/useGroupChannelList/useGroupChannelListWithQuery.js.map +1 -1
  62. package/lib/module/channel/useGroupChannelMessages/index.js.map +1 -1
  63. package/lib/module/channel/useGroupChannelMessages/reducer.js +18 -25
  64. package/lib/module/channel/useGroupChannelMessages/reducer.js.map +1 -1
  65. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +9 -30
  66. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
  67. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +23 -46
  68. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
  69. package/lib/module/channel/useOpenChannel.js.map +1 -1
  70. package/lib/module/channel/useOpenChannelList/index.js.map +1 -1
  71. package/lib/module/channel/useOpenChannelList/reducer.js +2 -18
  72. package/lib/module/channel/useOpenChannelList/reducer.js.map +1 -1
  73. package/lib/module/channel/useOpenChannelList/useOpenChannelListWithQuery.js +1 -13
  74. package/lib/module/channel/useOpenChannelList/useOpenChannelListWithQuery.js.map +1 -1
  75. package/lib/module/channel/useOpenChannelMessages/index.js.map +1 -1
  76. package/lib/module/channel/useOpenChannelMessages/reducer.js +18 -25
  77. package/lib/module/channel/useOpenChannelMessages/reducer.js.map +1 -1
  78. package/lib/module/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js +1 -25
  79. package/lib/module/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js.map +1 -1
  80. package/lib/module/common/useAppFeatures.js.map +1 -1
  81. package/lib/module/common/useMessageOutgoingStatus.js +0 -6
  82. package/lib/module/common/useMessageOutgoingStatus.js.map +1 -1
  83. package/lib/module/common/usePushTrigger.js.map +1 -1
  84. package/lib/module/common/useTotalUnreadMessageCount.js +0 -1
  85. package/lib/module/common/useTotalUnreadMessageCount.js.map +1 -1
  86. package/lib/module/common/useUserList.js +3 -13
  87. package/lib/module/common/useUserList.js.map +1 -1
  88. package/lib/module/handler/useChannelHandler.js +15 -35
  89. package/lib/module/handler/useChannelHandler.js.map +1 -1
  90. package/lib/module/handler/useConnectionHandler.js +15 -6
  91. package/lib/module/handler/useConnectionHandler.js.map +1 -1
  92. package/lib/module/handler/useUserEventHandler.js +0 -2
  93. package/lib/module/handler/useUserEventHandler.js.map +1 -1
  94. package/lib/module/index.js +0 -1
  95. package/lib/module/index.js.map +1 -1
  96. package/lib/module/model/CustomQuery.js +0 -4
  97. package/lib/module/model/CustomQuery.js.map +1 -1
  98. package/lib/typescript/src/channel/useGroupChannelList/reducer.d.ts +1 -1
  99. package/lib/typescript/src/channel/useGroupChannelMessages/reducer.d.ts +2 -2
  100. package/lib/typescript/src/channel/useOpenChannelMessages/reducer.d.ts +2 -2
  101. package/lib/typescript/src/common/useUserList.d.ts +1 -1
  102. package/lib/typescript/src/handler/useChannelHandler.d.ts +1 -1
  103. package/lib/typescript/src/handler/useConnectionHandler.d.ts +1 -2
  104. package/lib/typescript/src/index.d.ts +0 -1
  105. package/package.json +15 -9
  106. package/src/channel/useGroupChannelList/reducer.ts +11 -7
  107. package/src/channel/useGroupChannelList/useGroupChannelListWithCollection.ts +1 -1
  108. package/src/channel/useGroupChannelList/useGroupChannelListWithQuery.ts +1 -1
  109. package/src/channel/useGroupChannelMessages/reducer.ts +11 -10
  110. package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.ts +69 -72
  111. package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.ts +32 -42
  112. package/src/channel/useOpenChannelList/useOpenChannelListWithQuery.ts +1 -1
  113. package/src/channel/useOpenChannelMessages/reducer.ts +11 -10
  114. package/src/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.ts +1 -1
  115. package/src/common/useUserList.ts +2 -2
  116. package/src/handler/useChannelHandler.ts +11 -24
  117. package/src/handler/useConnectionHandler.ts +11 -5
  118. package/src/index.ts +0 -1
  119. package/lib/commonjs/common/useTotalUnreadChannelCount.js +0 -29
  120. package/lib/commonjs/common/useTotalUnreadChannelCount.js.map +0 -1
  121. package/lib/module/common/useTotalUnreadChannelCount.js +0 -17
  122. package/lib/module/common/useTotalUnreadChannelCount.js.map +0 -1
  123. package/lib/typescript/src/common/useTotalUnreadChannelCount.d.ts +0 -6
  124. package/src/common/useTotalUnreadChannelCount.ts +0 -26
@@ -1 +1 @@
1
- {"version":3,"names":["useReducer","arrayToMapWithGetter","getMessageUniqId","isMyMessage","isNewMessage","useIIFE","defaultReducer","action","draft","type","key","value","status","receivedMessagesAsMap","messages","clearPrev","filter","m","isFileMessage","isUserMessage","Boolean","reqId","sendingStatus","currentUserId","forEach","messageIds","msgId","reqIds","useGroupChannelMessagesReducer","userId","sortComparator","loading","refreshing","messageMap","nextMessageMap","dispatch","updateMessages","deleteMessages","updateNextMessages","deleteNextMessages","updateLoading","updateRefreshing","Object","values","sort","nextMessages","newMessagesFromMembers","msg"],"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[]; clearPrev: 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 case 'update_loading': {\n const key = action.type === 'update_loading' ? 'loading' : 'refreshing';\n draft[key] = action.value.status;\n\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.clearPrev) {\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[], clearPrev: boolean, currentUserId?: string) => {\n dispatch({ type: 'update_messages', value: { messages, clearPrev, currentUserId } });\n };\n const deleteMessages = (messageIds: number[], reqIds: string[]) => {\n dispatch({ type: 'delete_messages', value: { messageIds, reqIds } });\n };\n const updateNextMessages = (messages: SendbirdBaseMessage[], clearPrev: boolean, currentUserId?: string) => {\n dispatch({ type: 'update_next_messages', value: { messages, clearPrev, 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
+ {"version":3,"names":["useReducer","arrayToMapWithGetter","getMessageUniqId","isMyMessage","isNewMessage","useIIFE","defaultReducer","_ref","action","draft","type","value","status","key","receivedMessagesAsMap","messages","clearBeforeAction","filter","m","isFileMessage","isUserMessage","Boolean","reqId","sendingStatus","currentUserId","forEach","messageIds","msgId","reqIds","useGroupChannelMessagesReducer","userId","sortComparator","loading","refreshing","messageMap","nextMessageMap","dispatch","updateMessages","deleteMessages","updateNextMessages","deleteNextMessages","updateLoading","updateRefreshing","Object","values","sort","nextMessages","newMessagesFromMembers","msg"],"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,9 +1,8 @@
1
- import { useCallback, useEffect, useRef } from 'react';
1
+ import { useEffect, useRef } from 'react';
2
2
  import { MessageCollectionInitPolicy, MessageEventSource, MessageFilter } from '@sendbird/chat/groupChannel';
3
3
  import { Logger, confirmAndMarkAsRead, isDifferentChannel, useForceUpdate, useFreshCallback, useUniqHandlerId } from '@sendbird/uikit-utils';
4
4
  import { useChannelHandler } from '../../handler/useChannelHandler';
5
5
  import { useGroupChannelMessagesReducer } from './reducer';
6
-
7
6
  const createMessageCollection = (channel, creator) => {
8
7
  if (creator) return creator();
9
8
  const filter = new MessageFilter();
@@ -12,7 +11,6 @@ const createMessageCollection = (channel, creator) => {
12
11
  limit: 100
13
12
  });
14
13
  };
15
-
16
14
  export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) => {
17
15
  const forceUpdate = useForceUpdate();
18
16
  const collectionRef = useRef();
@@ -30,7 +28,6 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
30
28
  updateLoading,
31
29
  updateRefreshing
32
30
  } = useGroupChannelMessagesReducer(userId, options === null || options === void 0 ? void 0 : options.sortComparator);
33
-
34
31
  const channelMarkAsRead = async source => {
35
32
  try {
36
33
  switch (source) {
@@ -45,15 +42,11 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
45
42
  Logger.warn('[useGroupChannelMessagesWithCollection/channelMarkAsRead]', e);
46
43
  }
47
44
  };
48
-
49
- const init = useCallback(async (uid, callback) => {
45
+ const init = useFreshCallback(async (uid, callback) => {
50
46
  var _collectionRef$curren;
51
-
52
47
  if (collectionRef.current) (_collectionRef$curren = collectionRef.current) === null || _collectionRef$curren === void 0 ? void 0 : _collectionRef$curren.dispose();
53
-
54
48
  if (uid) {
55
49
  var _collectionRef$curren2;
56
-
57
50
  collectionRef.current = createMessageCollection(channel, options === null || options === void 0 ? void 0 : options.collectionCreator);
58
51
  updateNextMessages([], true, sdk.currentUser.userId);
59
52
  channelMarkAsRead();
@@ -63,16 +56,17 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
63
56
  updateNextMessages(messages, false, sdk.currentUser.userId);
64
57
  },
65
58
  onMessagesUpdated: (_, __, messages) => {
66
- channelMarkAsRead(_.source); // NOTE: admin message is not added via onMessagesAdded handler, not checked yet is this a bug.
59
+ channelMarkAsRead(_.source);
67
60
 
61
+ // NOTE: admin message is not added via onMessagesAdded handler, not checked yet is this a bug.
68
62
  if (_.source === MessageEventSource.EVENT_MESSAGE_RECEIVED) {
69
63
  const nextMessageIds = nextMessages.map(it => it.messageId);
70
64
  const nonAddedMessagesFromReceivedEvent = messages.filter(it => nextMessageIds.indexOf(it.messageId) === -1);
71
65
  updateNextMessages(nonAddedMessagesFromReceivedEvent, false, sdk.currentUser.userId);
72
- } // NOTE: v4 MESSAGE_RECEIVED is called twice from onMessagesAdded and onMessagesUpdated when receiving new message.
73
- // This is not intended behavior but not bugs.
74
-
66
+ }
75
67
 
68
+ // NOTE: v4 MESSAGE_RECEIVED is called twice from onMessagesAdded and onMessagesUpdated when receiving new message.
69
+ // This is not intended behavior but not bugs.
76
70
  if (_.source !== MessageEventSource.EVENT_MESSAGE_RECEIVED) {
77
71
  updateMessages(messages, false, sdk.currentUser.userId);
78
72
  }
@@ -83,7 +77,6 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
83
77
  },
84
78
  onChannelDeleted: () => {
85
79
  var _options$onChannelDel;
86
-
87
80
  options === null || options === void 0 ? void 0 : (_options$onChannelDel = options.onChannelDeleted) === null || _options$onChannelDel === void 0 ? void 0 : _options$onChannelDel.call(options);
88
81
  },
89
82
  onChannelUpdated: (_, eventChannel) => {
@@ -98,7 +91,6 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
98
91
  collectionRef.current.initialize(MessageCollectionInitPolicy.CACHE_AND_REPLACE_BY_API).onCacheResult((err, messages) => {
99
92
  if (err) sdk.isCacheEnabled && Logger.error('[useGroupChannelMessagesWithCollection/onCacheResult]', err);else {
100
93
  var _collectionRef$curren3, _collectionRef$curren4;
101
-
102
94
  Logger.debug('[useGroupChannelMessagesWithCollection/onCacheResult]', 'message length:', messages.length);
103
95
  updateMessages(messages, true, sdk.currentUser.userId);
104
96
  updateMessages(((_collectionRef$curren3 = collectionRef.current) === null || _collectionRef$curren3 === void 0 ? void 0 : _collectionRef$curren3.pendingMessages) ?? [], false, sdk.currentUser.userId);
@@ -109,10 +101,8 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
109
101
  if (err) Logger.warn('[useGroupChannelMessagesWithCollection/onApiResult]', err);else {
110
102
  Logger.debug('[useGroupChannelMessagesWithCollection/onApiResult]', 'message length:', messages.length);
111
103
  updateMessages(messages, true, sdk.currentUser.userId);
112
-
113
104
  if (sdk.isCacheEnabled) {
114
105
  var _collectionRef$curren5, _collectionRef$curren6;
115
-
116
106
  updateMessages(((_collectionRef$curren5 = collectionRef.current) === null || _collectionRef$curren5 === void 0 ? void 0 : _collectionRef$curren5.pendingMessages) ?? [], false, sdk.currentUser.userId);
117
107
  updateMessages(((_collectionRef$curren6 = collectionRef.current) === null || _collectionRef$curren6 === void 0 ? void 0 : _collectionRef$curren6.failedMessages) ?? [], false, sdk.currentUser.userId);
118
108
  }
@@ -120,20 +110,18 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
120
110
  callback === null || callback === void 0 ? void 0 : callback();
121
111
  });
122
112
  }
123
- }, [sdk, channel.url, options === null || options === void 0 ? void 0 : options.collectionCreator]);
113
+ });
124
114
  useChannelHandler(sdk, handlerId, {
125
115
  onUserBanned(channel, bannedUser) {
126
116
  if (channel.isGroupChannel() && !isDifferentChannel(channel, channel)) {
127
117
  if (bannedUser.userId === sdk.currentUser.userId) {
128
118
  var _options$onChannelDel2;
129
-
130
119
  options === null || options === void 0 ? void 0 : (_options$onChannelDel2 = options.onChannelDeleted) === null || _options$onChannelDel2 === void 0 ? void 0 : _options$onChannelDel2.call(options);
131
120
  } else {
132
121
  forceUpdate();
133
122
  }
134
123
  }
135
124
  }
136
-
137
125
  });
138
126
  useEffect(() => {
139
127
  // NOTE: Cache read is heavy task, and it prevents smooth ui transition
@@ -141,11 +129,10 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
141
129
  updateLoading(true);
142
130
  init(userId, () => updateLoading(false));
143
131
  }, 0);
144
- }, [init, userId]);
132
+ }, [channel.url, userId]);
145
133
  useEffect(() => {
146
134
  return () => {
147
135
  var _collectionRef$curren7;
148
-
149
136
  if (collectionRef.current) (_collectionRef$curren7 = collectionRef.current) === null || _collectionRef$curren7 === void 0 ? void 0 : _collectionRef$curren7.dispose();
150
137
  };
151
138
  }, []);
@@ -155,11 +142,9 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
155
142
  });
156
143
  const prev = useFreshCallback(async () => {
157
144
  var _collectionRef$curren8;
158
-
159
145
  if (collectionRef.current && (_collectionRef$curren8 = collectionRef.current) !== null && _collectionRef$curren8 !== void 0 && _collectionRef$curren8.hasPrevious) {
160
146
  try {
161
147
  var _collectionRef$curren9;
162
-
163
148
  const list = await ((_collectionRef$curren9 = collectionRef.current) === null || _collectionRef$curren9 === void 0 ? void 0 : _collectionRef$curren9.loadPrevious());
164
149
  updateMessages(list, false, sdk.currentUser.userId);
165
150
  } catch {}
@@ -167,22 +152,17 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
167
152
  });
168
153
  const next = useFreshCallback(async () => {
169
154
  var _collectionRef$curren10;
170
-
171
155
  const messageCandidates = [];
172
-
173
156
  if (collectionRef.current && (_collectionRef$curren10 = collectionRef.current) !== null && _collectionRef$curren10 !== void 0 && _collectionRef$curren10.hasNext) {
174
157
  try {
175
158
  var _collectionRef$curren11;
176
-
177
159
  const fetchedList = await ((_collectionRef$curren11 = collectionRef.current) === null || _collectionRef$curren11 === void 0 ? void 0 : _collectionRef$curren11.loadNext());
178
160
  messageCandidates.push(...fetchedList);
179
161
  } catch {}
180
162
  }
181
-
182
163
  if (nextMessages.length > 0) {
183
164
  messageCandidates.push(...nextMessages);
184
165
  }
185
-
186
166
  if (messageCandidates.length > 0) {
187
167
  updateMessages(messageCandidates, false, sdk.currentUser.userId);
188
168
  updateNextMessages([], true, sdk.currentUser.userId);
@@ -249,7 +229,6 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
249
229
  } else {
250
230
  try {
251
231
  var _collectionRef$curren12;
252
-
253
232
  await ((_collectionRef$curren12 = collectionRef.current) === null || _collectionRef$curren12 === void 0 ? void 0 : _collectionRef$curren12.removeFailedMessage(message.reqId));
254
233
  } finally {
255
234
  deleteMessages([message.messageId], [message.reqId]);
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useEffect","useRef","MessageCollectionInitPolicy","MessageEventSource","MessageFilter","Logger","confirmAndMarkAsRead","isDifferentChannel","useForceUpdate","useFreshCallback","useUniqHandlerId","useChannelHandler","useGroupChannelMessagesReducer","createMessageCollection","channel","creator","filter","limit","useGroupChannelMessagesWithCollection","sdk","userId","options","forceUpdate","collectionRef","handlerId","loading","refreshing","messages","nextMessages","newMessagesFromMembers","updateMessages","updateNextMessages","deleteNextMessages","deleteMessages","updateLoading","updateRefreshing","sortComparator","channelMarkAsRead","source","EVENT_MESSAGE_RECEIVED","EVENT_MESSAGE_SENT_SUCCESS","SYNC_MESSAGE_FILL","undefined","e","warn","init","uid","callback","current","dispose","collectionCreator","currentUser","setMessageCollectionHandler","onMessagesAdded","_","__","onMessagesUpdated","nextMessageIds","map","it","messageId","nonAddedMessagesFromReceivedEvent","indexOf","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","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 useUniqHandlerId,\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\nexport const useGroupChannelMessagesWithCollection: UseGroupChannelMessages = (sdk, channel, userId, options) => {\n const forceUpdate = useForceUpdate();\n const collectionRef = useRef<SendbirdMessageCollection>();\n const handlerId = useUniqHandlerId('useGroupChannelMessagesWithCollection');\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 channelMarkAsRead = async (source?: MessageEventSource) => {\n try {\n switch (source) {\n case MessageEventSource.EVENT_MESSAGE_RECEIVED:\n case MessageEventSource.EVENT_MESSAGE_SENT_SUCCESS:\n case MessageEventSource.SYNC_MESSAGE_FILL:\n case undefined:\n await confirmAndMarkAsRead([channel]);\n break;\n }\n } catch (e) {\n Logger.warn('[useGroupChannelMessagesWithCollection/channelMarkAsRead]', 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 channelMarkAsRead();\n\n collectionRef.current?.setMessageCollectionHandler({\n onMessagesAdded: (_, __, messages) => {\n channelMarkAsRead(_.source);\n updateNextMessages(messages, false, sdk.currentUser.userId);\n },\n onMessagesUpdated: (_, __, messages) => {\n channelMarkAsRead(_.source);\n\n // NOTE: admin message is not added via onMessagesAdded handler, not checked yet is this a bug.\n if (_.source === MessageEventSource.EVENT_MESSAGE_RECEIVED) {\n const nextMessageIds = nextMessages.map((it) => it.messageId);\n const nonAddedMessagesFromReceivedEvent = messages.filter(\n (it) => nextMessageIds.indexOf(it.messageId) === -1,\n );\n updateNextMessages(nonAddedMessagesFromReceivedEvent, false, sdk.currentUser.userId);\n }\n\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('[useGroupChannelMessagesWithCollection/onCacheResult]', err);\n else {\n Logger.debug('[useGroupChannelMessagesWithCollection/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('[useGroupChannelMessagesWithCollection/onApiResult]', err);\n else {\n Logger.debug('[useGroupChannelMessagesWithCollection/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, handlerId, {\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
+ {"version":3,"names":["useEffect","useRef","MessageCollectionInitPolicy","MessageEventSource","MessageFilter","Logger","confirmAndMarkAsRead","isDifferentChannel","useForceUpdate","useFreshCallback","useUniqHandlerId","useChannelHandler","useGroupChannelMessagesReducer","createMessageCollection","channel","creator","filter","limit","useGroupChannelMessagesWithCollection","sdk","userId","options","forceUpdate","collectionRef","handlerId","loading","refreshing","messages","nextMessages","newMessagesFromMembers","updateMessages","updateNextMessages","deleteNextMessages","deleteMessages","updateLoading","updateRefreshing","sortComparator","channelMarkAsRead","source","EVENT_MESSAGE_RECEIVED","EVENT_MESSAGE_SENT_SUCCESS","SYNC_MESSAGE_FILL","undefined","e","warn","init","uid","callback","_collectionRef$curren","current","dispose","_collectionRef$curren2","collectionCreator","currentUser","setMessageCollectionHandler","onMessagesAdded","_","__","onMessagesUpdated","nextMessageIds","map","it","messageId","nonAddedMessagesFromReceivedEvent","indexOf","onMessagesDeleted","messageIds","onChannelDeleted","_options$onChannelDel","call","onChannelUpdated","eventChannel","isGroupChannel","onHugeGapDetected","initialize","CACHE_AND_REPLACE_BY_API","onCacheResult","err","isCacheEnabled","error","_collectionRef$curren3","_collectionRef$curren4","debug","length","pendingMessages","failedMessages","onApiResult","_collectionRef$curren5","_collectionRef$curren6","onUserBanned","bannedUser","_options$onChannelDel2","setTimeout","url","_collectionRef$curren7","refresh","prev","_collectionRef$curren8","hasPrevious","_collectionRef$curren9","list","loadPrevious","next","_collectionRef$curren10","messageCandidates","hasNext","_collectionRef$curren11","fetchedList","loadNext","push","sendUserMessage","params","onPending","Promise","resolve","reject","pendingMessage","isUserMessage","onSucceeded","sentMessage","onFailed","_failedMessage","sendFileMessage","isFileMessage","updateUserMessage","updatedMessage","updateFileMessage","resendMessage","failedMessage","resentMessage","resendUserMessage","resendFileMessage","deleteMessage","message","sendingStatus","_collectionRef$curren12","removeFailedMessage","reqId"],"sources":["useGroupChannelMessagesWithCollection.ts"],"sourcesContent":["import { 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 useUniqHandlerId,\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\nexport const useGroupChannelMessagesWithCollection: UseGroupChannelMessages = (sdk, channel, userId, options) => {\n const forceUpdate = useForceUpdate();\n const collectionRef = useRef<SendbirdMessageCollection>();\n const handlerId = useUniqHandlerId('useGroupChannelMessagesWithCollection');\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 channelMarkAsRead = async (source?: MessageEventSource) => {\n try {\n switch (source) {\n case MessageEventSource.EVENT_MESSAGE_RECEIVED:\n case MessageEventSource.EVENT_MESSAGE_SENT_SUCCESS:\n case MessageEventSource.SYNC_MESSAGE_FILL:\n case undefined:\n await confirmAndMarkAsRead([channel]);\n break;\n }\n } catch (e) {\n Logger.warn('[useGroupChannelMessagesWithCollection/channelMarkAsRead]', e);\n }\n };\n\n const init = useFreshCallback(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 channelMarkAsRead();\n\n collectionRef.current?.setMessageCollectionHandler({\n onMessagesAdded: (_, __, messages) => {\n channelMarkAsRead(_.source);\n updateNextMessages(messages, false, sdk.currentUser.userId);\n },\n onMessagesUpdated: (_, __, messages) => {\n channelMarkAsRead(_.source);\n\n // NOTE: admin message is not added via onMessagesAdded handler, not checked yet is this a bug.\n if (_.source === MessageEventSource.EVENT_MESSAGE_RECEIVED) {\n const nextMessageIds = nextMessages.map((it) => it.messageId);\n const nonAddedMessagesFromReceivedEvent = messages.filter(\n (it) => nextMessageIds.indexOf(it.messageId) === -1,\n );\n updateNextMessages(nonAddedMessagesFromReceivedEvent, false, sdk.currentUser.userId);\n }\n\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('[useGroupChannelMessagesWithCollection/onCacheResult]', err);\n else {\n Logger.debug('[useGroupChannelMessagesWithCollection/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('[useGroupChannelMessagesWithCollection/onApiResult]', err);\n else {\n Logger.debug('[useGroupChannelMessagesWithCollection/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\n useChannelHandler(sdk, handlerId, {\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 }, [channel.url, 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,8 +1,7 @@
1
- import { useCallback, useRef } from 'react';
2
- import { Logger, confirmAndMarkAsRead, isDifferentChannel, useAsyncEffect, useForceUpdate, useUniqHandlerId } from '@sendbird/uikit-utils';
1
+ import { useRef } from 'react';
2
+ import { Logger, confirmAndMarkAsRead, isDifferentChannel, useAsyncEffect, useForceUpdate, useFreshCallback, useUniqHandlerId } from '@sendbird/uikit-utils';
3
3
  import { useChannelHandler } from '../../handler/useChannelHandler';
4
4
  import { useGroupChannelMessagesReducer } from './reducer';
5
-
6
5
  const createMessageQuery = (channel, creator) => {
7
6
  if (creator) return creator();
8
7
  return channel.createPreviousMessageListQuery({
@@ -10,7 +9,6 @@ const createMessageQuery = (channel, creator) => {
10
9
  reverse: true
11
10
  });
12
11
  };
13
-
14
12
  export const useGroupChannelMessagesWithQuery = (sdk, channel, userId, options) => {
15
13
  const queryRef = useRef();
16
14
  const handlerId = useUniqHandlerId('useGroupChannelMessagesWithQuery');
@@ -28,7 +26,6 @@ export const useGroupChannelMessagesWithQuery = (sdk, channel, userId, options)
28
26
  updateLoading,
29
27
  updateRefreshing
30
28
  } = useGroupChannelMessagesReducer(userId, options === null || options === void 0 ? void 0 : options.sortComparator);
31
-
32
29
  const channelMarkAsRead = async () => {
33
30
  try {
34
31
  await confirmAndMarkAsRead([channel]);
@@ -36,31 +33,24 @@ export const useGroupChannelMessagesWithQuery = (sdk, channel, userId, options)
36
33
  Logger.warn('[useGroupChannelMessagesWithQuery/channelMarkAsRead]', e);
37
34
  }
38
35
  };
39
-
40
- const init = useCallback(async uid => {
36
+ const init = useFreshCallback(async uid => {
41
37
  if (uid) {
42
38
  var _queryRef$current;
43
-
44
39
  queryRef.current = createMessageQuery(channel, options === null || options === void 0 ? void 0 : options.queryCreator);
45
40
  channelMarkAsRead();
46
-
47
41
  if ((_queryRef$current = queryRef.current) !== null && _queryRef$current !== void 0 && _queryRef$current.hasNext) {
48
42
  var _queryRef$current2;
49
-
50
43
  const list = await ((_queryRef$current2 = queryRef.current) === null || _queryRef$current2 === void 0 ? void 0 : _queryRef$current2.load());
51
44
  updateMessages(list, true, sdk.currentUser.userId);
52
45
  }
53
-
54
46
  updateNextMessages([], true, sdk.currentUser.userId);
55
47
  }
56
- }, [sdk, channel.url, options === null || options === void 0 ? void 0 : options.queryCreator]);
57
-
48
+ });
58
49
  const channelUpdater = channel => {
59
50
  if (channel.isGroupChannel() && !isDifferentChannel(channel, channel)) {
60
51
  forceUpdate();
61
52
  }
62
53
  };
63
-
64
54
  useChannelHandler(sdk, handlerId, {
65
55
  // Messages
66
56
  onMessageReceived(eventChannel, message) {
@@ -68,35 +58,28 @@ export const useGroupChannelMessagesWithQuery = (sdk, channel, userId, options)
68
58
  channelMarkAsRead();
69
59
  updateNextMessages([message], false, sdk.currentUser.userId);
70
60
  },
71
-
72
61
  onMessageUpdated(eventChannel, message) {
73
62
  if (isDifferentChannel(channel, eventChannel)) return;
74
63
  updateMessages([message], false, sdk.currentUser.userId);
75
64
  },
76
-
77
65
  onMessageDeleted(eventChannel, messageId) {
78
66
  if (isDifferentChannel(channel, eventChannel)) return;
79
67
  deleteMessages([messageId], []);
80
68
  deleteNextMessages([messageId], []);
81
69
  },
82
-
83
70
  // Channels
84
71
  onChannelChanged: channelUpdater,
85
72
  onChannelFrozen: channelUpdater,
86
73
  onChannelUnfrozen: channelUpdater,
87
74
  onChannelHidden: channelUpdater,
88
-
89
75
  onChannelMemberCountChanged(channels) {
90
76
  const foundChannel = channels.find(c => !isDifferentChannel(c, channel));
91
77
  if (foundChannel) channelUpdater(foundChannel);
92
78
  },
93
-
94
79
  onChannelDeleted(channelUrl) {
95
80
  var _options$onChannelDel;
96
-
97
81
  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);
98
82
  },
99
-
100
83
  // Users
101
84
  onOperatorUpdated: channelUpdater,
102
85
  onUserLeft: channelUpdater,
@@ -106,47 +89,41 @@ export const useGroupChannelMessagesWithQuery = (sdk, channel, userId, options)
106
89
  onUserUnbanned: channelUpdater,
107
90
  onUserMuted: channelUpdater,
108
91
  onUserUnmuted: channelUpdater,
109
-
110
92
  onUserBanned(eventChannel, bannedUser) {
111
93
  if (isDifferentChannel(channel, eventChannel)) return;
112
-
113
94
  if (bannedUser.userId === sdk.currentUser.userId) {
114
95
  var _options$onChannelDel2;
115
-
116
96
  options === null || options === void 0 ? void 0 : (_options$onChannelDel2 = options.onChannelDeleted) === null || _options$onChannelDel2 === void 0 ? void 0 : _options$onChannelDel2.call(options);
117
97
  } else {
118
98
  channelUpdater(eventChannel);
119
99
  }
120
100
  }
121
-
122
101
  });
123
102
  useAsyncEffect(async () => {
124
103
  updateLoading(true);
125
104
  await init(userId);
126
105
  updateLoading(false);
127
- }, [init, userId]);
128
- const refresh = useCallback(async () => {
106
+ }, [channel.url, userId]);
107
+ const refresh = useFreshCallback(async () => {
129
108
  updateRefreshing(true);
130
109
  await init(userId);
131
110
  updateRefreshing(false);
132
- }, [init, userId]);
133
- const prev = useCallback(async () => {
111
+ });
112
+ const prev = useFreshCallback(async () => {
134
113
  var _queryRef$current3;
135
-
136
114
  if (queryRef.current && (_queryRef$current3 = queryRef.current) !== null && _queryRef$current3 !== void 0 && _queryRef$current3.hasNext) {
137
115
  var _queryRef$current4;
138
-
139
116
  const list = await ((_queryRef$current4 = queryRef.current) === null || _queryRef$current4 === void 0 ? void 0 : _queryRef$current4.load());
140
117
  updateMessages(list, false, sdk.currentUser.userId);
141
118
  }
142
- }, []);
143
- const next = useCallback(async () => {
119
+ });
120
+ const next = useFreshCallback(async () => {
144
121
  if (nextMessages.length > 0) {
145
122
  updateMessages(nextMessages, false, sdk.currentUser.userId);
146
123
  updateNextMessages([], true, sdk.currentUser.userId);
147
124
  }
148
- }, [nextMessages.length]);
149
- const sendUserMessage = useCallback((params, onPending) => {
125
+ });
126
+ const sendUserMessage = useFreshCallback((params, onPending) => {
150
127
  return new Promise((resolve, reject) => {
151
128
  channel.sendUserMessage(params).onPending(pendingMessage => {
152
129
  if (pendingMessage.isUserMessage()) {
@@ -163,8 +140,8 @@ export const useGroupChannelMessagesWithQuery = (sdk, channel, userId, options)
163
140
  reject(err);
164
141
  });
165
142
  });
166
- }, [channel]);
167
- const sendFileMessage = useCallback((params, onPending) => {
143
+ });
144
+ const sendFileMessage = useFreshCallback((params, onPending) => {
168
145
  return new Promise((resolve, reject) => {
169
146
  channel.sendFileMessage(params).onPending(pendingMessage => {
170
147
  if (pendingMessage.isFileMessage()) {
@@ -181,33 +158,33 @@ export const useGroupChannelMessagesWithQuery = (sdk, channel, userId, options)
181
158
  reject(err);
182
159
  });
183
160
  });
184
- }, [channel]);
185
- const updateUserMessage = useCallback(async (messageId, params) => {
161
+ });
162
+ const updateUserMessage = useFreshCallback(async (messageId, params) => {
186
163
  const updatedMessage = await channel.updateUserMessage(messageId, params);
187
164
  updateMessages([updatedMessage], false, sdk.currentUser.userId);
188
165
  return updatedMessage;
189
- }, [channel]);
190
- const updateFileMessage = useCallback(async (messageId, params) => {
166
+ });
167
+ const updateFileMessage = useFreshCallback(async (messageId, params) => {
191
168
  const updatedMessage = await channel.updateFileMessage(messageId, params);
192
169
  updateMessages([updatedMessage], false, sdk.currentUser.userId);
193
170
  return updatedMessage;
194
- }, [channel]);
195
- const resendMessage = useCallback(async failedMessage => {
171
+ });
172
+ const resendMessage = useFreshCallback(async failedMessage => {
196
173
  const message = await (() => {
197
174
  if (failedMessage.isUserMessage()) return channel.resendUserMessage(failedMessage);
198
175
  if (failedMessage.isFileMessage()) return channel.resendFileMessage(failedMessage);
199
176
  return null;
200
177
  })();
201
178
  if (message) updateNextMessages([message], false, sdk.currentUser.userId);
202
- }, [channel]);
203
- const deleteMessage = useCallback(async message => {
179
+ });
180
+ const deleteMessage = useFreshCallback(async message => {
204
181
  if (message.sendingStatus === 'succeeded') {
205
182
  if (message.isUserMessage()) await channel.deleteMessage(message);
206
183
  if (message.isFileMessage()) await channel.deleteMessage(message);
207
184
  } else {
208
185
  deleteMessages([message.messageId], [message.reqId]);
209
186
  }
210
- }, [channel]);
187
+ });
211
188
  return {
212
189
  loading,
213
190
  refreshing,