@sendbird/uikit-chat-hooks 2.0.3 → 2.2.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 (63) hide show
  1. package/lib/commonjs/channel/useGroupChannel.js +33 -0
  2. package/lib/commonjs/channel/useGroupChannel.js.map +1 -0
  3. package/lib/commonjs/channel/useGroupChannelMessages/reducer.js +3 -3
  4. package/lib/commonjs/channel/useGroupChannelMessages/reducer.js.map +1 -1
  5. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +75 -79
  6. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
  7. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +30 -41
  8. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
  9. package/lib/commonjs/common/useAppFeatures.js +4 -4
  10. package/lib/commonjs/common/useAppFeatures.js.map +1 -1
  11. package/lib/commonjs/common/useMessageOutgoingStatus.js +1 -0
  12. package/lib/commonjs/common/useMessageOutgoingStatus.js.map +1 -1
  13. package/lib/commonjs/common/useTotalUnreadChannelCount.js +1 -1
  14. package/lib/commonjs/common/useTotalUnreadChannelCount.js.map +1 -1
  15. package/lib/commonjs/common/useTotalUnreadMessageCount.js +1 -1
  16. package/lib/commonjs/common/useTotalUnreadMessageCount.js.map +1 -1
  17. package/lib/commonjs/common/useUserList.js +33 -15
  18. package/lib/commonjs/common/useUserList.js.map +1 -1
  19. package/lib/commonjs/index.js +8 -0
  20. package/lib/commonjs/index.js.map +1 -1
  21. package/lib/commonjs/types.js.map +1 -1
  22. package/lib/module/channel/useGroupChannel.js +22 -0
  23. package/lib/module/channel/useGroupChannel.js.map +1 -0
  24. package/lib/module/channel/useGroupChannelMessages/reducer.js +3 -3
  25. package/lib/module/channel/useGroupChannelMessages/reducer.js.map +1 -1
  26. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +76 -79
  27. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
  28. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +30 -40
  29. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
  30. package/lib/module/common/useAppFeatures.js +4 -4
  31. package/lib/module/common/useAppFeatures.js.map +1 -1
  32. package/lib/module/common/useMessageOutgoingStatus.js +1 -0
  33. package/lib/module/common/useMessageOutgoingStatus.js.map +1 -1
  34. package/lib/module/common/useTotalUnreadChannelCount.js +2 -2
  35. package/lib/module/common/useTotalUnreadChannelCount.js.map +1 -1
  36. package/lib/module/common/useTotalUnreadMessageCount.js +2 -2
  37. package/lib/module/common/useTotalUnreadMessageCount.js.map +1 -1
  38. package/lib/module/common/useUserList.js +35 -17
  39. package/lib/module/common/useUserList.js.map +1 -1
  40. package/lib/module/index.js +1 -0
  41. package/lib/module/index.js.map +1 -1
  42. package/lib/module/types.js.map +1 -1
  43. package/lib/typescript/src/channel/useGroupChannel.d.ts +6 -0
  44. package/lib/typescript/src/channel/useGroupChannelList/reducer.d.ts +1 -1
  45. package/lib/typescript/src/common/useMessageOutgoingStatus.d.ts +1 -1
  46. package/lib/typescript/src/common/useTotalUnreadChannelCount.d.ts +1 -1
  47. package/lib/typescript/src/common/useTotalUnreadMessageCount.d.ts +1 -1
  48. package/lib/typescript/src/common/useUserList.d.ts +2 -2
  49. package/lib/typescript/src/index.d.ts +2 -1
  50. package/lib/typescript/src/model/CustomQuery.d.ts +1 -1
  51. package/lib/typescript/src/types.d.ts +13 -9
  52. package/package.json +4 -4
  53. package/src/channel/useGroupChannel.ts +21 -0
  54. package/src/channel/useGroupChannelMessages/reducer.ts +4 -4
  55. package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.ts +92 -86
  56. package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.ts +33 -37
  57. package/src/common/useAppFeatures.ts +4 -4
  58. package/src/common/useMessageOutgoingStatus.ts +2 -0
  59. package/src/common/useTotalUnreadChannelCount.ts +2 -2
  60. package/src/common/useTotalUnreadMessageCount.ts +2 -2
  61. package/src/common/useUserList.ts +46 -20
  62. package/src/index.ts +2 -1
  63. package/src/types.ts +13 -7
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useGroupChannel = void 0;
7
+
8
+ var _react = require("react");
9
+
10
+ var _uikitUtils = require("@sendbird/uikit-utils");
11
+
12
+ const useGroupChannel = (sdk, channelUrl) => {
13
+ const [channel, setChannel] = (0, _react.useState)();
14
+ const [loading, setLoading] = (0, _react.useState)(true);
15
+ const [error, setError] = (0, _react.useState)();
16
+ (0, _uikitUtils.useAsyncEffect)(async () => {
17
+ try {
18
+ setChannel(await sdk.groupChannel.getChannel(channelUrl));
19
+ } catch (e) {
20
+ setError(e);
21
+ } finally {
22
+ setLoading(false);
23
+ }
24
+ }, []);
25
+ return {
26
+ channel,
27
+ loading,
28
+ error
29
+ };
30
+ };
31
+
32
+ exports.useGroupChannel = useGroupChannel;
33
+ //# sourceMappingURL=useGroupChannel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useGroupChannel","sdk","channelUrl","channel","setChannel","useState","loading","setLoading","error","setError","useAsyncEffect","groupChannel","getChannel","e"],"sources":["useGroupChannel.ts"],"sourcesContent":["import { useState } from 'react';\n\nimport { SendbirdChatSDK, SendbirdGroupChannel, useAsyncEffect } from '@sendbird/uikit-utils';\n\nexport const useGroupChannel = (sdk: SendbirdChatSDK, channelUrl: string) => {\n const [channel, setChannel] = useState<SendbirdGroupChannel>();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<unknown>();\n\n useAsyncEffect(async () => {\n try {\n setChannel(await sdk.groupChannel.getChannel(channelUrl));\n } catch (e) {\n setError(e);\n } finally {\n setLoading(false);\n }\n }, []);\n\n return { channel, loading, error };\n};\n"],"mappings":";;;;;;;AAAA;;AAEA;;AAEO,MAAMA,eAAe,GAAG,CAACC,GAAD,EAAuBC,UAAvB,KAA8C;EAC3E,MAAM,CAACC,OAAD,EAAUC,UAAV,IAAwB,IAAAC,eAAA,GAA9B;EACA,MAAM,CAACC,OAAD,EAAUC,UAAV,IAAwB,IAAAF,eAAA,EAAS,IAAT,CAA9B;EACA,MAAM,CAACG,KAAD,EAAQC,QAAR,IAAoB,IAAAJ,eAAA,GAA1B;EAEA,IAAAK,0BAAA,EAAe,YAAY;IACzB,IAAI;MACFN,UAAU,CAAC,MAAMH,GAAG,CAACU,YAAJ,CAAiBC,UAAjB,CAA4BV,UAA5B,CAAP,CAAV;IACD,CAFD,CAEE,OAAOW,CAAP,EAAU;MACVJ,QAAQ,CAACI,CAAD,CAAR;IACD,CAJD,SAIU;MACRN,UAAU,CAAC,KAAD,CAAV;IACD;EACF,CARD,EAQG,EARH;EAUA,OAAO;IAAEJ,OAAF;IAAWG,OAAX;IAAoBE;EAApB,CAAP;AACD,CAhBM"}
@@ -26,13 +26,13 @@ const defaultReducer = (_ref, action) => {
26
26
  case 'update_next_messages':
27
27
  {
28
28
  const key = action.type === 'update_messages' ? 'messageMap' : 'nextMessageMap';
29
- const messageMap = (0, _uikitUtils.arrayToMapWithGetter)(action.value.messages, _uikitUtils.getMessageUniqId);
29
+ const receivedMessagesAsMap = (0, _uikitUtils.arrayToMapWithGetter)(action.value.messages, _uikitUtils.getMessageUniqId);
30
30
 
31
31
  if (action.value.clearPrev) {
32
- draft[key] = messageMap;
32
+ draft[key] = receivedMessagesAsMap;
33
33
  } else {
34
34
  draft[key] = { ...draft[key],
35
- ...messageMap
35
+ ...receivedMessagesAsMap
36
36
  }; // NOTE: Replace pending message to succeeded message
37
37
 
38
38
  action.value.messages.filter(m => {
@@ -1 +1 @@
1
- {"version":3,"names":["defaultReducer","action","draft","type","key","value","status","messageMap","arrayToMapWithGetter","messages","getMessageUniqId","clearPrev","filter","m","isFileMessage","isUserMessage","Boolean","reqId","sendingStatus","isMyMessage","currentUserId","forEach","messageIds","msgId","reqIds","useGroupChannelMessagesReducer","userId","sortComparator","loading","refreshing","nextMessageMap","dispatch","useReducer","updateMessages","deleteMessages","updateNextMessages","deleteNextMessages","updateLoading","updateRefreshing","useIIFE","Object","values","sort","nextMessages","newMessagesFromMembers","msg","isNewMessage"],"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' as const);\n const messageMap = arrayToMapWithGetter(action.value.messages, getMessageUniqId);\n if (action.value.clearPrev) {\n draft[key] = messageMap;\n } else {\n draft[key] = { ...draft[key], ...messageMap };\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 if (action.type === 'update_messages') {\n draft['nextMessageMap'] = {};\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":["defaultReducer","action","draft","type","key","value","status","receivedMessagesAsMap","arrayToMapWithGetter","messages","getMessageUniqId","clearPrev","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"],"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 if (action.type === 'update_messages') {\n draft['nextMessageMap'] = {};\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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"}
@@ -13,8 +13,6 @@ var _uikitUtils = require("@sendbird/uikit-utils");
13
13
 
14
14
  var _useChannelHandler = require("../../handler/useChannelHandler");
15
15
 
16
- var _useActiveGroupChannel = require("../useActiveGroupChannel");
17
-
18
16
  var _reducer = require("./reducer");
19
17
 
20
18
  const createMessageCollection = (channel, creator) => {
@@ -29,13 +27,8 @@ const createMessageCollection = (channel, creator) => {
29
27
  const HOOK_NAME = 'useGroupChannelMessagesWithCollection';
30
28
 
31
29
  const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) => {
32
- const collectionRef = (0, _react.useRef)(); // NOTE: We cannot determine the channel object of Sendbird SDK is stale or not, so force update af
33
-
34
- const {
35
- activeChannel,
36
- setActiveChannel
37
- } = (0, _useActiveGroupChannel.useActiveGroupChannel)(sdk, channel);
38
30
  const forceUpdate = (0, _uikitUtils.useForceUpdate)();
31
+ const collectionRef = (0, _react.useRef)();
39
32
  const {
40
33
  loading,
41
34
  refreshing,
@@ -50,17 +43,18 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
50
43
  updateRefreshing
51
44
  } = (0, _reducer.useGroupChannelMessagesReducer)(userId, options === null || options === void 0 ? void 0 : options.sortComparator);
52
45
 
53
- const channelMarkAs = async () => {
46
+ const channelMarkAsRead = async source => {
54
47
  try {
55
- await (0, _uikitUtils.confirmAndMarkAsRead)([activeChannel]);
48
+ switch (source) {
49
+ case _groupChannel.MessageEventSource.EVENT_MESSAGE_RECEIVED:
50
+ case _groupChannel.MessageEventSource.EVENT_MESSAGE_SENT_SUCCESS:
51
+ case _groupChannel.MessageEventSource.SYNC_MESSAGE_FILL:
52
+ case undefined:
53
+ await (0, _uikitUtils.confirmAndMarkAsRead)([channel]);
54
+ break;
55
+ }
56
56
  } catch (e) {
57
- _uikitUtils.Logger.warn(`[${HOOK_NAME}/channelMarkAs/Read]`, e);
58
- }
59
- };
60
-
61
- const updateChannel = channel => {
62
- if (channel.isGroupChannel() && !(0, _uikitUtils.isDifferentChannel)(channel, activeChannel)) {
63
- forceUpdate();
57
+ _uikitUtils.Logger.warn(`[${HOOK_NAME}/channelMarkAsRead]`, e);
64
58
  }
65
59
  };
66
60
 
@@ -72,38 +66,42 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
72
66
  if (uid) {
73
67
  var _collectionRef$curren2;
74
68
 
75
- collectionRef.current = createMessageCollection(activeChannel, options === null || options === void 0 ? void 0 : options.collectionCreator);
69
+ collectionRef.current = createMessageCollection(channel, options === null || options === void 0 ? void 0 : options.collectionCreator);
76
70
  updateNextMessages([], true, sdk.currentUser.userId);
77
- channelMarkAs();
71
+ channelMarkAsRead();
78
72
  (_collectionRef$curren2 = collectionRef.current) === null || _collectionRef$curren2 === void 0 ? void 0 : _collectionRef$curren2.setMessageCollectionHandler({
79
73
  onMessagesAdded: (_, __, messages) => {
80
- switch (_.source) {
81
- case _groupChannel.MessageEventSource.EVENT_MESSAGE_RECEIVED:
82
- case _groupChannel.MessageEventSource.EVENT_MESSAGE_SENT_SUCCESS:
83
- case _groupChannel.MessageEventSource.SYNC_MESSAGE_FILL:
84
- channelMarkAs();
85
- break;
86
- }
87
-
74
+ channelMarkAsRead(_.source);
88
75
  updateNextMessages(messages, false, sdk.currentUser.userId);
89
- updateChannel(channel);
90
76
  },
91
- onMessagesUpdated: (_, channel, messages) => {
92
- updateMessages(messages, false, sdk.currentUser.userId);
93
- updateChannel(channel);
77
+ onMessagesUpdated: (_, __, messages) => {
78
+ channelMarkAsRead(_.source); // NOTE: admin message is not added via onMessagesAdded handler, not checked yet is this a bug.
79
+
80
+ if (_.source === _groupChannel.MessageEventSource.EVENT_MESSAGE_RECEIVED) {
81
+ const nextMessageIds = nextMessages.map(it => it.messageId);
82
+ const nonAddedMessagesFromReceivedEvent = messages.filter(it => nextMessageIds.indexOf(it.messageId) === -1);
83
+ updateNextMessages(nonAddedMessagesFromReceivedEvent, false, sdk.currentUser.userId);
84
+ } // NOTE: v4 MESSAGE_RECEIVED is called twice from onMessagesAdded and onMessagesUpdated when receiving new message.
85
+ // This is not intended behavior but not bugs.
86
+
87
+
88
+ if (_.source !== _groupChannel.MessageEventSource.EVENT_MESSAGE_RECEIVED) {
89
+ updateMessages(messages, false, sdk.currentUser.userId);
90
+ }
94
91
  },
95
- onMessagesDeleted: (_, channel, messageIds) => {
92
+ onMessagesDeleted: (_, __, messageIds) => {
96
93
  deleteMessages(messageIds, []);
97
94
  deleteNextMessages(messageIds, []);
98
- updateChannel(channel);
99
95
  },
100
96
  onChannelDeleted: () => {
101
97
  var _options$onChannelDel;
102
98
 
103
99
  options === null || options === void 0 ? void 0 : (_options$onChannelDel = options.onChannelDeleted) === null || _options$onChannelDel === void 0 ? void 0 : _options$onChannelDel.call(options);
104
100
  },
105
- onChannelUpdated: (_, channel) => {
106
- updateChannel(channel);
101
+ onChannelUpdated: (_, eventChannel) => {
102
+ if (eventChannel.isGroupChannel() && !(0, _uikitUtils.isDifferentChannel)(eventChannel, channel)) {
103
+ forceUpdate();
104
+ }
107
105
  },
108
106
  onHugeGapDetected: () => {
109
107
  init(uid);
@@ -118,8 +116,8 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
118
116
  updateMessages(messages, true, sdk.currentUser.userId);
119
117
  updateMessages(((_collectionRef$curren3 = collectionRef.current) === null || _collectionRef$curren3 === void 0 ? void 0 : _collectionRef$curren3.pendingMessages) ?? [], false, sdk.currentUser.userId);
120
118
  updateMessages(((_collectionRef$curren4 = collectionRef.current) === null || _collectionRef$curren4 === void 0 ? void 0 : _collectionRef$curren4.failedMessages) ?? [], false, sdk.currentUser.userId);
121
- if (messages !== null && messages !== void 0 && messages.length) callback === null || callback === void 0 ? void 0 : callback();
122
119
  }
120
+ callback === null || callback === void 0 ? void 0 : callback();
123
121
  }).onApiResult((err, messages) => {
124
122
  if (err) _uikitUtils.Logger.warn(`[${HOOK_NAME}/onApiResult]`, err);else {
125
123
  _uikitUtils.Logger.debug(`[${HOOK_NAME}/onApiResult]`, 'message length:', messages.length);
@@ -136,16 +134,15 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
136
134
  callback === null || callback === void 0 ? void 0 : callback();
137
135
  });
138
136
  }
139
- }, [sdk, activeChannel.url, options === null || options === void 0 ? void 0 : options.collectionCreator]);
137
+ }, [sdk, channel.url, options === null || options === void 0 ? void 0 : options.collectionCreator]);
140
138
  (0, _useChannelHandler.useChannelHandler)(sdk, HOOK_NAME, {
141
139
  onUserBanned(channel, bannedUser) {
142
- if (channel.isGroupChannel() && !(0, _uikitUtils.isDifferentChannel)(channel, activeChannel)) {
140
+ if (channel.isGroupChannel() && !(0, _uikitUtils.isDifferentChannel)(channel, channel)) {
143
141
  if (bannedUser.userId === sdk.currentUser.userId) {
144
142
  var _options$onChannelDel2;
145
143
 
146
144
  options === null || options === void 0 ? void 0 : (_options$onChannelDel2 = options.onChannelDeleted) === null || _options$onChannelDel2 === void 0 ? void 0 : _options$onChannelDel2.call(options);
147
145
  } else {
148
- setActiveChannel(channel);
149
146
  forceUpdate();
150
147
  }
151
148
  }
@@ -153,7 +150,7 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
153
150
 
154
151
  });
155
152
  (0, _react.useEffect)(() => {
156
- // NOTE: Cache read is heavy synchronous task, and it prevents smooth ui transition
153
+ // NOTE: Cache read is heavy task, and it prevents smooth ui transition
157
154
  setTimeout(async () => {
158
155
  updateLoading(true);
159
156
  init(userId, () => updateLoading(false));
@@ -166,11 +163,11 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
166
163
  if (collectionRef.current) (_collectionRef$curren7 = collectionRef.current) === null || _collectionRef$curren7 === void 0 ? void 0 : _collectionRef$curren7.dispose();
167
164
  };
168
165
  }, []);
169
- const refresh = (0, _react.useCallback)(async () => {
166
+ const refresh = (0, _uikitUtils.useFreshCallback)(async () => {
170
167
  updateRefreshing(true);
171
168
  init(userId, () => updateRefreshing(false));
172
- }, [init, userId]);
173
- const prev = (0, _react.useCallback)(async () => {
169
+ });
170
+ const prev = (0, _uikitUtils.useFreshCallback)(async () => {
174
171
  var _collectionRef$curren8;
175
172
 
176
173
  if (collectionRef.current && (_collectionRef$curren8 = collectionRef.current) !== null && _collectionRef$curren8 !== void 0 && _collectionRef$curren8.hasPrevious) {
@@ -181,33 +178,33 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
181
178
  updateMessages(list, false, sdk.currentUser.userId);
182
179
  } catch {}
183
180
  }
184
- }, []);
185
- const next = (0, _react.useCallback)(async () => {
181
+ });
182
+ const next = (0, _uikitUtils.useFreshCallback)(async () => {
186
183
  var _collectionRef$curren10;
187
184
 
188
- const list = [];
185
+ const messageCandidates = [];
189
186
 
190
187
  if (collectionRef.current && (_collectionRef$curren10 = collectionRef.current) !== null && _collectionRef$curren10 !== void 0 && _collectionRef$curren10.hasNext) {
191
188
  try {
192
189
  var _collectionRef$curren11;
193
190
 
194
191
  const fetchedList = await ((_collectionRef$curren11 = collectionRef.current) === null || _collectionRef$curren11 === void 0 ? void 0 : _collectionRef$curren11.loadNext());
195
- list.push(...fetchedList);
192
+ messageCandidates.push(...fetchedList);
196
193
  } catch {}
197
194
  }
198
195
 
199
196
  if (nextMessages.length > 0) {
200
- list.push(...nextMessages);
197
+ messageCandidates.push(...nextMessages);
201
198
  }
202
199
 
203
- if (list.length > 0) {
204
- updateMessages(list, false, sdk.currentUser.userId);
200
+ if (messageCandidates.length > 0) {
201
+ updateMessages(messageCandidates, false, sdk.currentUser.userId);
205
202
  updateNextMessages([], true, sdk.currentUser.userId);
206
203
  }
207
- }, [nextMessages.length]);
208
- const sendUserMessage = (0, _react.useCallback)((params, onPending) => {
204
+ });
205
+ const sendUserMessage = (0, _uikitUtils.useFreshCallback)((params, onPending) => {
209
206
  return new Promise((resolve, reject) => {
210
- activeChannel.sendUserMessage(params).onPending(pendingMessage => {
207
+ channel.sendUserMessage(params).onPending(pendingMessage => {
211
208
  if (pendingMessage.isUserMessage()) {
212
209
  onPending === null || onPending === void 0 ? void 0 : onPending(pendingMessage);
213
210
  updateMessages([pendingMessage], false, sdk.currentUser.userId);
@@ -217,14 +214,15 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
217
214
  updateMessages([sentMessage], false, sdk.currentUser.userId);
218
215
  resolve(sentMessage);
219
216
  }
220
- }).onFailed(err => {
217
+ }).onFailed((err, _failedMessage) => {
218
+ // updateMessages([failedMessage], false, sdk.currentUser.userId);
221
219
  reject(err);
222
220
  });
223
221
  });
224
- }, [activeChannel]);
225
- const sendFileMessage = (0, _react.useCallback)((params, onPending) => {
222
+ });
223
+ const sendFileMessage = (0, _uikitUtils.useFreshCallback)((params, onPending) => {
226
224
  return new Promise((resolve, reject) => {
227
- activeChannel.sendFileMessage(params).onPending(pendingMessage => {
225
+ channel.sendFileMessage(params).onPending(pendingMessage => {
228
226
  if (pendingMessage.isFileMessage()) {
229
227
  updateMessages([pendingMessage], false, sdk.currentUser.userId);
230
228
  onPending === null || onPending === void 0 ? void 0 : onPending(pendingMessage);
@@ -234,35 +232,34 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
234
232
  updateMessages([sentMessage], false, sdk.currentUser.userId);
235
233
  resolve(sentMessage);
236
234
  }
237
- }).onFailed(err => {
235
+ }).onFailed((err, _failedMessage) => {
236
+ // updateMessages([failedMessage], false, sdk.currentUser.userId);
238
237
  reject(err);
239
238
  });
240
239
  });
241
- }, [activeChannel]);
242
- const updateUserMessage = (0, _react.useCallback)(async (messageId, params) => {
243
- const updatedMessage = await activeChannel.updateUserMessage(messageId, params);
240
+ });
241
+ const updateUserMessage = (0, _uikitUtils.useFreshCallback)(async (messageId, params) => {
242
+ const updatedMessage = await channel.updateUserMessage(messageId, params);
244
243
  updateMessages([updatedMessage], false, sdk.currentUser.userId);
245
244
  return updatedMessage;
246
- }, [activeChannel]);
247
- const updateFileMessage = (0, _react.useCallback)(async (messageId, params) => {
248
- const updatedMessage = await activeChannel.updateFileMessage(messageId, params);
245
+ });
246
+ const updateFileMessage = (0, _uikitUtils.useFreshCallback)(async (messageId, params) => {
247
+ const updatedMessage = await channel.updateFileMessage(messageId, params);
249
248
  updateMessages([updatedMessage], false, sdk.currentUser.userId);
250
249
  return updatedMessage;
251
- }, [activeChannel]);
252
- const resendMessage = (0, _react.useCallback)(async failedMessage => {
253
- const message = await (() => {
254
- if (failedMessage.isUserMessage()) return activeChannel.resendUserMessage(failedMessage); // FIXME: v4 bugs
255
- // @ts-ignore
256
-
257
- if (failedMessage.isFileMessage()) return activeChannel.resendFileMessage(failedMessage);
250
+ });
251
+ const resendMessage = (0, _uikitUtils.useFreshCallback)(async failedMessage => {
252
+ const resentMessage = await (() => {
253
+ if (failedMessage.isUserMessage()) return channel.resendUserMessage(failedMessage);
254
+ if (failedMessage.isFileMessage()) return channel.resendFileMessage(failedMessage);
258
255
  return null;
259
256
  })();
260
- if (message) updateMessages([message], false, sdk.currentUser.userId);
261
- }, [activeChannel]);
262
- const deleteMessage = (0, _react.useCallback)(async message => {
257
+ if (resentMessage) updateMessages([resentMessage], false, sdk.currentUser.userId);
258
+ });
259
+ const deleteMessage = (0, _uikitUtils.useFreshCallback)(async message => {
263
260
  if (message.sendingStatus === 'succeeded') {
264
- if (message.isUserMessage()) await activeChannel.deleteMessage(message);
265
- if (message.isFileMessage()) await activeChannel.deleteMessage(message);
261
+ if (message.isUserMessage()) await channel.deleteMessage(message);
262
+ if (message.isFileMessage()) await channel.deleteMessage(message);
266
263
  } else {
267
264
  try {
268
265
  var _collectionRef$curren12;
@@ -272,7 +269,7 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
272
269
  deleteMessages([message.messageId], [message.reqId]);
273
270
  }
274
271
  }
275
- }, [activeChannel]);
272
+ });
276
273
  return {
277
274
  loading,
278
275
  refreshing,
@@ -287,8 +284,7 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
287
284
  updateUserMessage,
288
285
  updateFileMessage,
289
286
  resendMessage,
290
- deleteMessage,
291
- activeChannel
287
+ deleteMessage
292
288
  };
293
289
  };
294
290
 
@@ -1 +1 @@
1
- {"version":3,"names":["createMessageCollection","channel","creator","filter","MessageFilter","limit","HOOK_NAME","useGroupChannelMessagesWithCollection","sdk","userId","options","collectionRef","useRef","activeChannel","setActiveChannel","useActiveGroupChannel","forceUpdate","useForceUpdate","loading","refreshing","messages","nextMessages","newMessagesFromMembers","updateMessages","updateNextMessages","deleteNextMessages","deleteMessages","updateLoading","updateRefreshing","useGroupChannelMessagesReducer","sortComparator","channelMarkAs","confirmAndMarkAsRead","e","Logger","warn","updateChannel","isGroupChannel","isDifferentChannel","init","useCallback","uid","callback","current","dispose","collectionCreator","currentUser","setMessageCollectionHandler","onMessagesAdded","_","__","source","MessageEventSource","EVENT_MESSAGE_RECEIVED","EVENT_MESSAGE_SENT_SUCCESS","SYNC_MESSAGE_FILL","onMessagesUpdated","onMessagesDeleted","messageIds","onChannelDeleted","onChannelUpdated","onHugeGapDetected","initialize","MessageCollectionInitPolicy","CACHE_AND_REPLACE_BY_API","onCacheResult","err","isCacheEnabled","error","debug","length","pendingMessages","failedMessages","onApiResult","url","useChannelHandler","onUserBanned","bannedUser","useEffect","setTimeout","refresh","prev","hasPrevious","list","loadPrevious","next","hasNext","fetchedList","loadNext","push","sendUserMessage","params","onPending","Promise","resolve","reject","pendingMessage","isUserMessage","onSucceeded","sentMessage","onFailed","sendFileMessage","isFileMessage","updateUserMessage","messageId","updatedMessage","updateFileMessage","resendMessage","failedMessage","message","resendUserMessage","resendFileMessage","deleteMessage","sendingStatus","removeFailedMessage","reqId"],"sources":["useGroupChannelMessagesWithCollection.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\n\nimport { MessageCollectionInitPolicy, MessageEventSource, MessageFilter } from '@sendbird/chat/groupChannel';\nimport type {\n SendbirdChannel,\n SendbirdFileMessage,\n SendbirdGroupChannel,\n SendbirdMessageCollection,\n} from '@sendbird/uikit-utils';\nimport { Logger, confirmAndMarkAsRead, isDifferentChannel, useForceUpdate } from '@sendbird/uikit-utils';\n\nimport { useChannelHandler } from '../../handler/useChannelHandler';\nimport type { UseGroupChannelMessages, UseGroupChannelMessagesOptions } from '../../types';\nimport { useActiveGroupChannel } from '../useActiveGroupChannel';\nimport { useGroupChannelMessagesReducer } from './reducer';\n\nconst createMessageCollection = (\n channel: SendbirdGroupChannel,\n creator?: UseGroupChannelMessagesOptions['collectionCreator'],\n) => {\n if (creator) return creator();\n const filter = new MessageFilter();\n return channel.createMessageCollection({ filter, limit: 100 });\n};\n\nconst HOOK_NAME = 'useGroupChannelMessagesWithCollection';\n\nexport const useGroupChannelMessagesWithCollection: UseGroupChannelMessages = (sdk, channel, userId, options) => {\n const collectionRef = useRef<SendbirdMessageCollection>();\n\n // NOTE: We cannot determine the channel object of Sendbird SDK is stale or not, so force update af\n const { activeChannel, setActiveChannel } = useActiveGroupChannel(sdk, channel);\n const forceUpdate = useForceUpdate();\n\n const {\n loading,\n refreshing,\n messages,\n nextMessages,\n newMessagesFromMembers,\n updateMessages,\n updateNextMessages,\n deleteNextMessages,\n deleteMessages,\n updateLoading,\n updateRefreshing,\n } = useGroupChannelMessagesReducer(userId, options?.sortComparator);\n\n const channelMarkAs = async () => {\n try {\n await confirmAndMarkAsRead([activeChannel]);\n } catch (e) {\n Logger.warn(`[${HOOK_NAME}/channelMarkAs/Read]`, e);\n }\n };\n\n const updateChannel = (channel: SendbirdChannel) => {\n if (channel.isGroupChannel() && !isDifferentChannel(channel, activeChannel)) {\n forceUpdate();\n }\n };\n\n const init = useCallback(\n async (uid?: string, callback?: () => void) => {\n if (collectionRef.current) collectionRef.current?.dispose();\n\n if (uid) {\n collectionRef.current = createMessageCollection(activeChannel, options?.collectionCreator);\n updateNextMessages([], true, sdk.currentUser.userId);\n channelMarkAs();\n\n collectionRef.current?.setMessageCollectionHandler({\n onMessagesAdded: (_, __, messages) => {\n switch (_.source) {\n case MessageEventSource.EVENT_MESSAGE_RECEIVED:\n case MessageEventSource.EVENT_MESSAGE_SENT_SUCCESS:\n case MessageEventSource.SYNC_MESSAGE_FILL:\n channelMarkAs();\n break;\n }\n updateNextMessages(messages, false, sdk.currentUser.userId);\n updateChannel(channel);\n },\n onMessagesUpdated: (_, channel, messages) => {\n updateMessages(messages, false, sdk.currentUser.userId);\n updateChannel(channel);\n },\n onMessagesDeleted: (_, channel, messageIds) => {\n deleteMessages(messageIds, []);\n deleteNextMessages(messageIds, []);\n updateChannel(channel);\n },\n onChannelDeleted: () => {\n options?.onChannelDeleted?.();\n },\n onChannelUpdated: (_, channel) => {\n updateChannel(channel);\n },\n onHugeGapDetected: () => {\n init(uid);\n },\n });\n\n collectionRef.current\n .initialize(MessageCollectionInitPolicy.CACHE_AND_REPLACE_BY_API)\n .onCacheResult((err, messages) => {\n if (err) sdk.isCacheEnabled && Logger.error(`[${HOOK_NAME}/onCacheResult]`, err);\n else {\n Logger.debug(`[${HOOK_NAME}/onCacheResult]`, 'message length:', messages.length);\n updateMessages(messages, true, sdk.currentUser.userId);\n updateMessages(collectionRef.current?.pendingMessages ?? [], false, sdk.currentUser.userId);\n updateMessages(collectionRef.current?.failedMessages ?? [], false, sdk.currentUser.userId);\n if (messages?.length) callback?.();\n }\n })\n .onApiResult((err, messages) => {\n if (err) Logger.warn(`[${HOOK_NAME}/onApiResult]`, err);\n else {\n Logger.debug(`[${HOOK_NAME}/onApiResult]`, 'message length:', messages.length);\n updateMessages(messages, true, sdk.currentUser.userId);\n if (sdk.isCacheEnabled) {\n updateMessages(collectionRef.current?.pendingMessages ?? [], false, sdk.currentUser.userId);\n updateMessages(collectionRef.current?.failedMessages ?? [], false, sdk.currentUser.userId);\n }\n }\n callback?.();\n });\n }\n },\n [sdk, activeChannel.url, options?.collectionCreator],\n );\n\n useChannelHandler(sdk, HOOK_NAME, {\n onUserBanned(channel, bannedUser) {\n if (channel.isGroupChannel() && !isDifferentChannel(channel, activeChannel)) {\n if (bannedUser.userId === sdk.currentUser.userId) {\n options?.onChannelDeleted?.();\n } else {\n setActiveChannel(channel);\n forceUpdate();\n }\n }\n },\n });\n\n useEffect(() => {\n // NOTE: Cache read is heavy synchronous task, and it prevents smooth ui transition\n setTimeout(async () => {\n updateLoading(true);\n init(userId, () => updateLoading(false));\n }, 0);\n }, [init, userId]);\n\n useEffect(() => {\n return () => {\n if (collectionRef.current) collectionRef.current?.dispose();\n };\n }, []);\n\n const refresh: ReturnType<UseGroupChannelMessages>['refresh'] = useCallback(async () => {\n updateRefreshing(true);\n init(userId, () => updateRefreshing(false));\n }, [init, userId]);\n\n const prev: ReturnType<UseGroupChannelMessages>['prev'] = useCallback(async () => {\n if (collectionRef.current && collectionRef.current?.hasPrevious) {\n try {\n const list = await collectionRef.current?.loadPrevious();\n updateMessages(list, false, sdk.currentUser.userId);\n } catch {}\n }\n }, []);\n\n const next: ReturnType<UseGroupChannelMessages>['next'] = useCallback(async () => {\n const list = [];\n if (collectionRef.current && collectionRef.current?.hasNext) {\n try {\n const fetchedList = await collectionRef.current?.loadNext();\n list.push(...fetchedList);\n } catch {}\n }\n if (nextMessages.length > 0) {\n list.push(...nextMessages);\n }\n if (list.length > 0) {\n updateMessages(list, false, sdk.currentUser.userId);\n updateNextMessages([], true, sdk.currentUser.userId);\n }\n }, [nextMessages.length]);\n\n const sendUserMessage: ReturnType<UseGroupChannelMessages>['sendUserMessage'] = useCallback(\n (params, onPending) => {\n return new Promise((resolve, reject) => {\n activeChannel\n .sendUserMessage(params)\n .onPending((pendingMessage) => {\n if (pendingMessage.isUserMessage()) {\n onPending?.(pendingMessage);\n updateMessages([pendingMessage], false, sdk.currentUser.userId);\n }\n })\n .onSucceeded((sentMessage) => {\n if (sentMessage.isUserMessage()) {\n updateMessages([sentMessage], false, sdk.currentUser.userId);\n resolve(sentMessage);\n }\n })\n .onFailed((err) => {\n reject(err);\n });\n });\n },\n [activeChannel],\n );\n const sendFileMessage: ReturnType<UseGroupChannelMessages>['sendFileMessage'] = useCallback(\n (params, onPending) => {\n return new Promise((resolve, reject) => {\n activeChannel\n .sendFileMessage(params)\n .onPending((pendingMessage) => {\n if (pendingMessage.isFileMessage()) {\n updateMessages([pendingMessage], false, sdk.currentUser.userId);\n onPending?.(pendingMessage);\n }\n })\n .onSucceeded((sentMessage) => {\n if (sentMessage.isFileMessage()) {\n updateMessages([sentMessage], false, sdk.currentUser.userId);\n resolve(sentMessage as SendbirdFileMessage);\n }\n })\n .onFailed((err) => {\n reject(err);\n });\n });\n },\n [activeChannel],\n );\n const updateUserMessage: ReturnType<UseGroupChannelMessages>['updateUserMessage'] = useCallback(\n async (messageId, params) => {\n const updatedMessage = await activeChannel.updateUserMessage(messageId, params);\n updateMessages([updatedMessage], false, sdk.currentUser.userId);\n return updatedMessage;\n },\n [activeChannel],\n );\n const updateFileMessage: ReturnType<UseGroupChannelMessages>['updateFileMessage'] = useCallback(\n async (messageId, params) => {\n const updatedMessage = await activeChannel.updateFileMessage(messageId, params);\n updateMessages([updatedMessage], false, sdk.currentUser.userId);\n return updatedMessage;\n },\n [activeChannel],\n );\n const resendMessage: ReturnType<UseGroupChannelMessages>['resendMessage'] = useCallback(\n async (failedMessage) => {\n const message = await (() => {\n if (failedMessage.isUserMessage()) return activeChannel.resendUserMessage(failedMessage);\n // FIXME: v4 bugs\n // @ts-ignore\n if (failedMessage.isFileMessage()) return activeChannel.resendFileMessage(failedMessage);\n return null;\n })();\n\n if (message) updateMessages([message], false, sdk.currentUser.userId);\n },\n [activeChannel],\n );\n const deleteMessage: ReturnType<UseGroupChannelMessages>['deleteMessage'] = useCallback(\n async (message) => {\n if (message.sendingStatus === 'succeeded') {\n if (message.isUserMessage()) await activeChannel.deleteMessage(message);\n if (message.isFileMessage()) await activeChannel.deleteMessage(message);\n } else {\n try {\n await collectionRef.current?.removeFailedMessage(message.reqId);\n } finally {\n deleteMessages([message.messageId], [message.reqId]);\n }\n }\n },\n [activeChannel],\n );\n\n return {\n loading,\n refreshing,\n refresh,\n messages,\n nextMessages,\n newMessagesFromMembers,\n next,\n prev,\n sendUserMessage,\n sendFileMessage,\n updateUserMessage,\n updateFileMessage,\n resendMessage,\n deleteMessage,\n activeChannel,\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["createMessageCollection","channel","creator","filter","MessageFilter","limit","HOOK_NAME","useGroupChannelMessagesWithCollection","sdk","userId","options","forceUpdate","useForceUpdate","collectionRef","useRef","loading","refreshing","messages","nextMessages","newMessagesFromMembers","updateMessages","updateNextMessages","deleteNextMessages","deleteMessages","updateLoading","updateRefreshing","useGroupChannelMessagesReducer","sortComparator","channelMarkAsRead","source","MessageEventSource","EVENT_MESSAGE_RECEIVED","EVENT_MESSAGE_SENT_SUCCESS","SYNC_MESSAGE_FILL","undefined","confirmAndMarkAsRead","e","Logger","warn","init","useCallback","uid","callback","current","dispose","collectionCreator","currentUser","setMessageCollectionHandler","onMessagesAdded","_","__","onMessagesUpdated","nextMessageIds","map","it","messageId","nonAddedMessagesFromReceivedEvent","indexOf","onMessagesDeleted","messageIds","onChannelDeleted","onChannelUpdated","eventChannel","isGroupChannel","isDifferentChannel","onHugeGapDetected","initialize","MessageCollectionInitPolicy","CACHE_AND_REPLACE_BY_API","onCacheResult","err","isCacheEnabled","error","debug","length","pendingMessages","failedMessages","onApiResult","url","useChannelHandler","onUserBanned","bannedUser","useEffect","setTimeout","refresh","useFreshCallback","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} from '@sendbird/uikit-utils';\n\nimport { useChannelHandler } from '../../handler/useChannelHandler';\nimport type { UseGroupChannelMessages, UseGroupChannelMessagesOptions } from '../../types';\nimport { useGroupChannelMessagesReducer } from './reducer';\n\nconst createMessageCollection = (\n channel: SendbirdGroupChannel,\n creator?: UseGroupChannelMessagesOptions['collectionCreator'],\n) => {\n if (creator) return creator();\n const filter = new MessageFilter();\n return channel.createMessageCollection({ filter, limit: 100 });\n};\n\nconst HOOK_NAME = 'useGroupChannelMessagesWithCollection';\n\nexport const useGroupChannelMessagesWithCollection: UseGroupChannelMessages = (sdk, channel, userId, options) => {\n const forceUpdate = useForceUpdate();\n const collectionRef = useRef<SendbirdMessageCollection>();\n\n const {\n loading,\n refreshing,\n messages,\n nextMessages,\n newMessagesFromMembers,\n updateMessages,\n updateNextMessages,\n deleteNextMessages,\n deleteMessages,\n updateLoading,\n updateRefreshing,\n } = useGroupChannelMessagesReducer(userId, options?.sortComparator);\n\n const 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(`[${HOOK_NAME}/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(`[${HOOK_NAME}/onCacheResult]`, err);\n else {\n Logger.debug(`[${HOOK_NAME}/onCacheResult]`, 'message length:', messages.length);\n\n updateMessages(messages, true, sdk.currentUser.userId);\n updateMessages(collectionRef.current?.pendingMessages ?? [], false, sdk.currentUser.userId);\n updateMessages(collectionRef.current?.failedMessages ?? [], false, sdk.currentUser.userId);\n }\n callback?.();\n })\n .onApiResult((err, messages) => {\n if (err) Logger.warn(`[${HOOK_NAME}/onApiResult]`, err);\n else {\n Logger.debug(`[${HOOK_NAME}/onApiResult]`, 'message length:', messages.length);\n\n updateMessages(messages, true, sdk.currentUser.userId);\n if (sdk.isCacheEnabled) {\n updateMessages(collectionRef.current?.pendingMessages ?? [], false, sdk.currentUser.userId);\n updateMessages(collectionRef.current?.failedMessages ?? [], false, sdk.currentUser.userId);\n }\n }\n callback?.();\n });\n }\n },\n [sdk, channel.url, options?.collectionCreator],\n );\n\n useChannelHandler(sdk, HOOK_NAME, {\n onUserBanned(channel, bannedUser) {\n if (channel.isGroupChannel() && !isDifferentChannel(channel, channel)) {\n if (bannedUser.userId === sdk.currentUser.userId) {\n options?.onChannelDeleted?.();\n } else {\n forceUpdate();\n }\n }\n },\n });\n\n useEffect(() => {\n // NOTE: Cache read is heavy task, and it prevents smooth ui transition\n setTimeout(async () => {\n updateLoading(true);\n init(userId, () => updateLoading(false));\n }, 0);\n }, [init, userId]);\n\n useEffect(() => {\n return () => {\n if (collectionRef.current) collectionRef.current?.dispose();\n };\n }, []);\n\n const refresh: ReturnType<UseGroupChannelMessages>['refresh'] = useFreshCallback(async () => {\n updateRefreshing(true);\n init(userId, () => updateRefreshing(false));\n });\n\n const prev: ReturnType<UseGroupChannelMessages>['prev'] = useFreshCallback(async () => {\n if (collectionRef.current && collectionRef.current?.hasPrevious) {\n try {\n const list = await collectionRef.current?.loadPrevious();\n updateMessages(list, false, sdk.currentUser.userId);\n } catch {}\n }\n });\n\n const next: ReturnType<UseGroupChannelMessages>['next'] = useFreshCallback(async () => {\n const messageCandidates: SendbirdBaseMessage[] = [];\n\n if (collectionRef.current && collectionRef.current?.hasNext) {\n try {\n const fetchedList = await collectionRef.current?.loadNext();\n messageCandidates.push(...fetchedList);\n } catch {}\n }\n\n if (nextMessages.length > 0) {\n messageCandidates.push(...nextMessages);\n }\n\n if (messageCandidates.length > 0) {\n updateMessages(messageCandidates, false, sdk.currentUser.userId);\n updateNextMessages([], true, sdk.currentUser.userId);\n }\n });\n\n const sendUserMessage: ReturnType<UseGroupChannelMessages>['sendUserMessage'] = useFreshCallback(\n (params, onPending) => {\n return new Promise((resolve, reject) => {\n channel\n .sendUserMessage(params)\n .onPending((pendingMessage) => {\n if (pendingMessage.isUserMessage()) {\n onPending?.(pendingMessage);\n updateMessages([pendingMessage], false, sdk.currentUser.userId);\n }\n })\n .onSucceeded((sentMessage) => {\n if (sentMessage.isUserMessage()) {\n updateMessages([sentMessage], false, sdk.currentUser.userId);\n resolve(sentMessage);\n }\n })\n .onFailed((err, _failedMessage) => {\n // updateMessages([failedMessage], false, sdk.currentUser.userId);\n reject(err);\n });\n });\n },\n );\n const sendFileMessage: ReturnType<UseGroupChannelMessages>['sendFileMessage'] = useFreshCallback(\n (params, onPending) => {\n return new Promise((resolve, reject) => {\n channel\n .sendFileMessage(params)\n .onPending((pendingMessage) => {\n if (pendingMessage.isFileMessage()) {\n updateMessages([pendingMessage], false, sdk.currentUser.userId);\n onPending?.(pendingMessage);\n }\n })\n .onSucceeded((sentMessage) => {\n if (sentMessage.isFileMessage()) {\n updateMessages([sentMessage], false, sdk.currentUser.userId);\n resolve(sentMessage as SendbirdFileMessage);\n }\n })\n .onFailed((err, _failedMessage) => {\n // updateMessages([failedMessage], false, sdk.currentUser.userId);\n reject(err);\n });\n });\n },\n );\n const updateUserMessage: ReturnType<UseGroupChannelMessages>['updateUserMessage'] = useFreshCallback(\n async (messageId, params) => {\n const updatedMessage = await channel.updateUserMessage(messageId, params);\n updateMessages([updatedMessage], false, sdk.currentUser.userId);\n return updatedMessage;\n },\n );\n const updateFileMessage: ReturnType<UseGroupChannelMessages>['updateFileMessage'] = useFreshCallback(\n async (messageId, params) => {\n const updatedMessage = await channel.updateFileMessage(messageId, params);\n updateMessages([updatedMessage], false, sdk.currentUser.userId);\n return updatedMessage;\n },\n );\n const resendMessage: ReturnType<UseGroupChannelMessages>['resendMessage'] = useFreshCallback(\n async (failedMessage) => {\n const resentMessage = await (() => {\n if (failedMessage.isUserMessage()) return channel.resendUserMessage(failedMessage);\n if (failedMessage.isFileMessage()) return channel.resendFileMessage(failedMessage);\n return null;\n })();\n\n if (resentMessage) updateMessages([resentMessage], false, sdk.currentUser.userId);\n },\n );\n const deleteMessage: ReturnType<UseGroupChannelMessages>['deleteMessage'] = useFreshCallback(async (message) => {\n if (message.sendingStatus === 'succeeded') {\n if (message.isUserMessage()) await channel.deleteMessage(message);\n if (message.isFileMessage()) await channel.deleteMessage(message);\n } else {\n try {\n await collectionRef.current?.removeFailedMessage(message.reqId);\n } finally {\n deleteMessages([message.messageId], [message.reqId]);\n }\n }\n });\n\n return {\n loading,\n refreshing,\n refresh,\n messages,\n nextMessages,\n newMessagesFromMembers,\n next,\n prev,\n sendUserMessage,\n sendFileMessage,\n updateUserMessage,\n updateFileMessage,\n resendMessage,\n deleteMessage,\n };\n};\n"],"mappings":"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"}