@sendbird/uikit-chat-hooks 2.4.2 → 2.5.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/lib/commonjs/channel/{useGroupChannelMessages/reducer.js → useChannelMessagesReducer.js} +39 -30
  2. package/lib/commonjs/channel/useChannelMessagesReducer.js.map +1 -0
  3. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +169 -99
  4. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
  5. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +56 -25
  6. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
  7. package/lib/commonjs/channel/useOpenChannelList/useOpenChannelListWithQuery.js +0 -4
  8. package/lib/commonjs/channel/useOpenChannelList/useOpenChannelListWithQuery.js.map +1 -1
  9. package/lib/commonjs/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js +128 -28
  10. package/lib/commonjs/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js.map +1 -1
  11. package/lib/commonjs/common/useUserList.js +2 -2
  12. package/lib/commonjs/common/useUserList.js.map +1 -1
  13. package/lib/commonjs/types.js.map +1 -1
  14. package/lib/module/channel/{useGroupChannelMessages/reducer.js → useChannelMessagesReducer.js} +38 -29
  15. package/lib/module/channel/useChannelMessagesReducer.js.map +1 -0
  16. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +170 -100
  17. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
  18. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +57 -26
  19. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
  20. package/lib/module/channel/useOpenChannelList/useOpenChannelListWithQuery.js +0 -4
  21. package/lib/module/channel/useOpenChannelList/useOpenChannelListWithQuery.js.map +1 -1
  22. package/lib/module/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js +129 -29
  23. package/lib/module/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js.map +1 -1
  24. package/lib/module/common/useUserList.js +2 -2
  25. package/lib/module/common/useUserList.js.map +1 -1
  26. package/lib/module/types.js.map +1 -1
  27. package/lib/typescript/src/channel/useChannelMessagesReducer.d.ts +18 -0
  28. package/lib/typescript/src/types.d.ts +51 -20
  29. package/package.json +4 -5
  30. package/src/channel/useChannelMessagesReducer.ts +143 -0
  31. package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.ts +168 -96
  32. package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.ts +62 -25
  33. package/src/channel/useOpenChannelList/useOpenChannelListWithQuery.ts +0 -4
  34. package/src/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.ts +142 -25
  35. package/src/common/useUserList.ts +2 -2
  36. package/src/types.ts +58 -20
  37. package/lib/commonjs/channel/useGroupChannelMessages/reducer.js.map +0 -1
  38. package/lib/commonjs/channel/useOpenChannelMessages/reducer.js +0 -144
  39. package/lib/commonjs/channel/useOpenChannelMessages/reducer.js.map +0 -1
  40. package/lib/module/channel/useGroupChannelMessages/reducer.js.map +0 -1
  41. package/lib/module/channel/useOpenChannelMessages/reducer.js +0 -137
  42. package/lib/module/channel/useOpenChannelMessages/reducer.js.map +0 -1
  43. package/lib/typescript/src/channel/useGroupChannelMessages/reducer.d.ts +0 -15
  44. package/lib/typescript/src/channel/useOpenChannelMessages/reducer.d.ts +0 -15
  45. package/src/channel/useGroupChannelMessages/reducer.ts +0 -126
  46. package/src/channel/useOpenChannelMessages/reducer.ts +0 -126
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.useGroupChannelMessagesReducer = void 0;
6
+ exports.useChannelMessagesReducer = void 0;
7
7
  var _react = require("react");
8
8
  var _uikitUtils = require("@sendbird/uikit-utils");
9
9
  const defaultReducer = (_ref, action) => {
@@ -22,29 +22,40 @@ const defaultReducer = (_ref, action) => {
22
22
  return draft;
23
23
  }
24
24
  case 'update_messages':
25
- case 'update_next_messages':
26
25
  {
27
- const key = action.type === 'update_messages' ? 'messageMap' : 'nextMessageMap';
28
- const receivedMessagesAsMap = (0, _uikitUtils.arrayToMapWithGetter)(action.value.messages, _uikitUtils.getMessageUniqId);
29
26
  if (action.value.clearBeforeAction) {
30
- draft[key] = receivedMessagesAsMap;
27
+ draft['messageMap'] = (0, _uikitUtils.arrayToMapWithGetter)(action.value.messages, _uikitUtils.getMessageUniqId);
31
28
  } else {
32
- draft[key] = {
33
- ...draft[key],
34
- ...receivedMessagesAsMap
29
+ // Remove existing messages before update for prevent duplicate display
30
+ const messageKeys = action.value.messages.map(it => (0, _uikitUtils.isSendableMessage)(it) ? [it.messageId, it.reqId] : [it.messageId]).flat();
31
+ messageKeys.forEach(key => delete draft['messageMap'][key]);
32
+ draft['messageMap'] = {
33
+ ...draft['messageMap'],
34
+ ...(0, _uikitUtils.arrayToMapWithGetter)(action.value.messages, _uikitUtils.getMessageUniqId)
35
+ };
36
+ }
37
+ return draft;
38
+ }
39
+ case 'update_new_messages':
40
+ {
41
+ const newMessages = action.value.messages.filter(it => (0, _uikitUtils.isNewMessage)(it, action.value.currentUserId));
42
+ if (action.value.clearBeforeAction) {
43
+ draft['newMessageMap'] = (0, _uikitUtils.arrayToMapWithGetter)(newMessages, _uikitUtils.getMessageUniqId);
44
+ } else {
45
+ // Remove existing messages before update for prevent duplicate display
46
+ const messageKeys = newMessages.map(it => it.messageId);
47
+ messageKeys.forEach(key => delete draft['newMessageMap'][key]);
48
+ draft['newMessageMap'] = {
49
+ ...draft['newMessageMap'],
50
+ ...(0, _uikitUtils.arrayToMapWithGetter)(newMessages, _uikitUtils.getMessageUniqId)
35
51
  };
36
-
37
- // NOTE: Replace pending message to succeeded message
38
- action.value.messages.filter(m => {
39
- return (m.isFileMessage() || m.isUserMessage()) && Boolean(draft[key][m.reqId]) && m.sendingStatus === 'succeeded' && (0, _uikitUtils.isMyMessage)(m, action.value.currentUserId);
40
- }).forEach(m => delete draft[key][m.reqId]);
41
52
  }
42
53
  return draft;
43
54
  }
44
55
  case 'delete_messages':
45
- case 'delete_next_messages':
56
+ case 'delete_new_messages':
46
57
  {
47
- const key = action.type === 'delete_messages' ? 'messageMap' : 'nextMessageMap';
58
+ const key = action.type === 'delete_messages' ? 'messageMap' : 'newMessageMap';
48
59
  draft[key] = {
49
60
  ...draft[key]
50
61
  };
@@ -54,17 +65,17 @@ const defaultReducer = (_ref, action) => {
54
65
  }
55
66
  }
56
67
  };
57
- const useGroupChannelMessagesReducer = (userId, sortComparator) => {
68
+ const useChannelMessagesReducer = sortComparator => {
58
69
  const [{
59
70
  loading,
60
71
  refreshing,
61
72
  messageMap,
62
- nextMessageMap
73
+ newMessageMap
63
74
  }, dispatch] = (0, _react.useReducer)(defaultReducer, {
64
75
  loading: true,
65
76
  refreshing: false,
66
77
  messageMap: {},
67
- nextMessageMap: {}
78
+ newMessageMap: {}
68
79
  });
69
80
  const updateMessages = (messages, clearBeforeAction, currentUserId) => {
70
81
  dispatch({
@@ -85,9 +96,9 @@ const useGroupChannelMessagesReducer = (userId, sortComparator) => {
85
96
  }
86
97
  });
87
98
  };
88
- const updateNextMessages = (messages, clearBeforeAction, currentUserId) => {
99
+ const updateNewMessages = (messages, clearBeforeAction, currentUserId) => {
89
100
  dispatch({
90
- type: 'update_next_messages',
101
+ type: 'update_new_messages',
91
102
  value: {
92
103
  messages,
93
104
  clearBeforeAction,
@@ -95,9 +106,9 @@ const useGroupChannelMessagesReducer = (userId, sortComparator) => {
95
106
  }
96
107
  });
97
108
  };
98
- const deleteNextMessages = (messageIds, reqIds) => {
109
+ const deleteNewMessages = (messageIds, reqIds) => {
99
110
  dispatch({
100
- type: 'delete_next_messages',
111
+ type: 'delete_new_messages',
101
112
  value: {
102
113
  messageIds,
103
114
  reqIds
@@ -124,21 +135,19 @@ const useGroupChannelMessagesReducer = (userId, sortComparator) => {
124
135
  if (sortComparator) return Object.values(messageMap).sort(sortComparator);
125
136
  return Object.values(messageMap);
126
137
  });
127
- const nextMessages = Object.values(nextMessageMap);
128
- const newMessagesFromMembers = nextMessages.filter(msg => (0, _uikitUtils.isNewMessage)(msg, userId));
138
+ const newMessages = Object.values(newMessageMap);
129
139
  return {
130
140
  updateLoading,
131
141
  updateRefreshing,
132
142
  updateMessages,
133
- updateNextMessages,
134
143
  deleteMessages,
135
- deleteNextMessages,
136
144
  loading,
137
145
  refreshing,
138
146
  messages,
139
- nextMessages,
140
- newMessagesFromMembers
147
+ newMessages,
148
+ updateNewMessages,
149
+ deleteNewMessages
141
150
  };
142
151
  };
143
- exports.useGroupChannelMessagesReducer = useGroupChannelMessagesReducer;
144
- //# sourceMappingURL=reducer.js.map
152
+ exports.useChannelMessagesReducer = useChannelMessagesReducer;
153
+ //# sourceMappingURL=useChannelMessagesReducer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","require","_uikitUtils","defaultReducer","_ref","action","draft","type","value","status","clearBeforeAction","arrayToMapWithGetter","messages","getMessageUniqId","messageKeys","map","it","isSendableMessage","messageId","reqId","flat","forEach","key","newMessages","filter","isNewMessage","currentUserId","messageIds","msgId","reqIds","useChannelMessagesReducer","sortComparator","loading","refreshing","messageMap","newMessageMap","dispatch","useReducer","updateMessages","deleteMessages","updateNewMessages","deleteNewMessages","updateLoading","updateRefreshing","useIIFE","Object","values","sort","exports"],"sources":["useChannelMessagesReducer.ts"],"sourcesContent":["import { useReducer } from 'react';\n\nimport type { SendbirdBaseMessage } from '@sendbird/uikit-utils';\nimport {\n SendbirdMessage,\n arrayToMapWithGetter,\n getMessageUniqId,\n isNewMessage,\n isSendableMessage,\n useIIFE,\n} from '@sendbird/uikit-utils';\n\ntype Options = {\n sortComparator?: (a: SendbirdMessage, b: SendbirdMessage) => number;\n};\n\ntype Action =\n | {\n type: 'update_loading' | 'update_refreshing';\n value: { status: boolean };\n }\n | {\n type: 'update_messages' | 'update_new_messages';\n value: { messages: SendbirdBaseMessage[]; clearBeforeAction: boolean; currentUserId?: string };\n }\n | {\n type: 'delete_messages' | 'delete_new_messages';\n value: { messageIds: number[]; reqIds: string[] };\n };\n\ntype State = {\n loading: boolean;\n refreshing: boolean;\n messageMap: Record<string, SendbirdBaseMessage>;\n newMessageMap: Record<string, SendbirdBaseMessage>;\n};\n\nconst defaultReducer = ({ ...draft }: State, action: Action) => {\n switch (action.type) {\n case 'update_refreshing': {\n draft['refreshing'] = action.value.status;\n return draft;\n }\n case 'update_loading': {\n draft['loading'] = action.value.status;\n return draft;\n }\n case 'update_messages': {\n if (action.value.clearBeforeAction) {\n draft['messageMap'] = arrayToMapWithGetter(action.value.messages, getMessageUniqId);\n } else {\n // Remove existing messages before update for prevent duplicate display\n const messageKeys = action.value.messages\n .map((it) => (isSendableMessage(it) ? [it.messageId, it.reqId] : [it.messageId]))\n .flat();\n messageKeys.forEach((key) => delete draft['messageMap'][key]);\n\n draft['messageMap'] = {\n ...draft['messageMap'],\n ...arrayToMapWithGetter(action.value.messages, getMessageUniqId),\n };\n }\n\n return draft;\n }\n case 'update_new_messages': {\n const newMessages = action.value.messages.filter((it) => isNewMessage(it, action.value.currentUserId));\n\n if (action.value.clearBeforeAction) {\n draft['newMessageMap'] = arrayToMapWithGetter(newMessages, getMessageUniqId);\n } else {\n // Remove existing messages before update for prevent duplicate display\n const messageKeys = newMessages.map((it) => it.messageId);\n messageKeys.forEach((key) => delete draft['newMessageMap'][key]);\n\n draft['newMessageMap'] = {\n ...draft['newMessageMap'],\n ...arrayToMapWithGetter(newMessages, getMessageUniqId),\n };\n }\n\n return draft;\n }\n case 'delete_messages':\n case 'delete_new_messages': {\n const key = action.type === 'delete_messages' ? 'messageMap' : 'newMessageMap';\n draft[key] = { ...draft[key] };\n action.value.messageIds.forEach((msgId) => delete draft[key][msgId]);\n action.value.reqIds.forEach((reqId) => delete draft[key][reqId]);\n\n return draft;\n }\n }\n};\n\nexport const useChannelMessagesReducer = (sortComparator?: Options['sortComparator']) => {\n const [{ loading, refreshing, messageMap, newMessageMap }, dispatch] = useReducer(defaultReducer, {\n loading: true,\n refreshing: false,\n messageMap: {},\n newMessageMap: {},\n });\n\n const updateMessages = (messages: SendbirdBaseMessage[], clearBeforeAction: boolean, currentUserId?: string) => {\n dispatch({ type: 'update_messages', value: { messages, clearBeforeAction, currentUserId } });\n };\n const deleteMessages = (messageIds: number[], reqIds: string[]) => {\n dispatch({ type: 'delete_messages', value: { messageIds, reqIds } });\n };\n const updateNewMessages = (messages: SendbirdBaseMessage[], clearBeforeAction: boolean, currentUserId?: string) => {\n dispatch({ type: 'update_new_messages', value: { messages, clearBeforeAction, currentUserId } });\n };\n const deleteNewMessages = (messageIds: number[], reqIds: string[]) => {\n dispatch({ type: 'delete_new_messages', value: { messageIds, reqIds } });\n };\n const updateLoading = (status: boolean) => {\n dispatch({ type: 'update_loading', value: { status } });\n };\n const updateRefreshing = (status: boolean) => {\n dispatch({ type: 'update_refreshing', value: { status } });\n };\n\n const messages = useIIFE(() => {\n if (sortComparator) return Object.values(messageMap).sort(sortComparator);\n return Object.values(messageMap);\n });\n const newMessages = Object.values(newMessageMap);\n\n return {\n updateLoading,\n updateRefreshing,\n updateMessages,\n deleteMessages,\n\n loading,\n refreshing,\n messages,\n\n newMessages,\n updateNewMessages,\n deleteNewMessages,\n };\n};\n"],"mappings":"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"}
@@ -8,32 +8,45 @@ var _react = require("react");
8
8
  var _groupChannel = require("@sendbird/chat/groupChannel");
9
9
  var _uikitUtils = require("@sendbird/uikit-utils");
10
10
  var _useChannelHandler = require("../../handler/useChannelHandler");
11
- var _reducer = require("./reducer");
12
- const createMessageCollection = (channel, creator) => {
13
- if (creator) return creator();
11
+ var _useChannelMessagesReducer = require("../useChannelMessagesReducer");
12
+ const MESSAGE_LIMIT = {
13
+ DEFAULT: 50,
14
+ SEARCH: 20
15
+ };
16
+ const createMessageCollection = (channel, limit, options) => {
17
+ if (options !== null && options !== void 0 && options.collectionCreator) return options === null || options === void 0 ? void 0 : options.collectionCreator({
18
+ startingPoint: options === null || options === void 0 ? void 0 : options.startingPoint
19
+ });
14
20
  const filter = new _groupChannel.MessageFilter();
15
21
  return channel.createMessageCollection({
16
22
  filter,
17
- limit: 100
23
+ limit,
24
+ startingPoint: options === null || options === void 0 ? void 0 : options.startingPoint
18
25
  });
19
26
  };
27
+ function isNotEmpty(arr) {
28
+ if (!arr) return false;
29
+ return arr.length !== 0;
30
+ }
20
31
  const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) => {
32
+ const initialStartingPoint = (options === null || options === void 0 ? void 0 : options.startingPoint) ?? Number.MAX_SAFE_INTEGER;
33
+ const initialLimit = typeof (options === null || options === void 0 ? void 0 : options.startingPoint) === 'number' ? MESSAGE_LIMIT.SEARCH : MESSAGE_LIMIT.DEFAULT;
21
34
  const forceUpdate = (0, _uikitUtils.useForceUpdate)();
22
35
  const collectionRef = (0, _react.useRef)();
36
+ const collectionInitializedRef = (0, _react.useRef)(false);
23
37
  const handlerId = (0, _uikitUtils.useUniqHandlerId)('useGroupChannelMessagesWithCollection');
24
38
  const {
25
39
  loading,
26
40
  refreshing,
27
41
  messages,
28
- nextMessages,
29
- newMessagesFromMembers,
42
+ newMessages,
30
43
  updateMessages,
31
- updateNextMessages,
32
- deleteNextMessages,
44
+ updateNewMessages,
45
+ deleteNewMessages,
33
46
  deleteMessages,
34
47
  updateLoading,
35
48
  updateRefreshing
36
- } = (0, _reducer.useGroupChannelMessagesReducer)(userId, options === null || options === void 0 ? void 0 : options.sortComparator);
49
+ } = (0, _useChannelMessagesReducer.useChannelMessagesReducer)(options === null || options === void 0 ? void 0 : options.sortComparator);
37
50
  const channelMarkAsRead = async source => {
38
51
  try {
39
52
  switch (source) {
@@ -48,74 +61,109 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
48
61
  _uikitUtils.Logger.warn('[useGroupChannelMessagesWithCollection/channelMarkAsRead]', e);
49
62
  }
50
63
  };
51
- const init = (0, _uikitUtils.useFreshCallback)(async (uid, callback) => {
52
- var _collectionRef$curren;
64
+ const updateUnsendMessages = () => {
65
+ const {
66
+ pendingMessages,
67
+ failedMessages
68
+ } = collectionRef.current ?? {};
69
+ if (isNotEmpty(pendingMessages)) updateMessages(pendingMessages, false, sdk.currentUser.userId);
70
+ if (isNotEmpty(failedMessages)) updateMessages(failedMessages, false, sdk.currentUser.userId);
71
+ };
72
+ const init = (0, _uikitUtils.useFreshCallback)(async (startingPoint, limit, callback) => {
73
+ var _collectionRef$curren, _collectionRef$curren2;
53
74
  if (collectionRef.current) (_collectionRef$curren = collectionRef.current) === null || _collectionRef$curren === void 0 ? void 0 : _collectionRef$curren.dispose();
54
- if (uid) {
55
- var _collectionRef$curren2;
56
- collectionRef.current = createMessageCollection(channel, options === null || options === void 0 ? void 0 : options.collectionCreator);
57
- updateNextMessages([], true, sdk.currentUser.userId);
58
- channelMarkAsRead();
59
- (_collectionRef$curren2 = collectionRef.current) === null || _collectionRef$curren2 === void 0 ? void 0 : _collectionRef$curren2.setMessageCollectionHandler({
60
- onMessagesAdded: (_, __, messages) => {
61
- channelMarkAsRead(_.source);
62
- updateNextMessages(messages, false, sdk.currentUser.userId);
63
- },
64
- onMessagesUpdated: (_, __, messages) => {
65
- channelMarkAsRead(_.source);
66
-
67
- // NOTE: admin message is not added via onMessagesAdded handler, not checked yet is this a bug.
68
- if (_.source === _groupChannel.MessageEventSource.EVENT_MESSAGE_RECEIVED) {
69
- const nextMessageIds = nextMessages.map(it => it.messageId);
70
- const nonAddedMessagesFromReceivedEvent = messages.filter(it => nextMessageIds.indexOf(it.messageId) === -1);
71
- updateNextMessages(nonAddedMessagesFromReceivedEvent, false, sdk.currentUser.userId);
75
+ channelMarkAsRead();
76
+ updateNewMessages([], true, sdk.currentUser.userId);
77
+ collectionInitializedRef.current = false;
78
+ collectionRef.current = createMessageCollection(channel, limit, {
79
+ collectionCreator: options === null || options === void 0 ? void 0 : options.collectionCreator,
80
+ startingPoint
81
+ });
82
+ (_collectionRef$curren2 = collectionRef.current) === null || _collectionRef$curren2 === void 0 ? void 0 : _collectionRef$curren2.setMessageCollectionHandler({
83
+ onMessagesAdded: (_, __, messages) => {
84
+ channelMarkAsRead(_.source);
85
+ const incomingMessages = messages.filter(it => {
86
+ switch (_.source) {
87
+ case _groupChannel.MessageEventSource.EVENT_MESSAGE_SENT_PENDING:
88
+ case _groupChannel.MessageEventSource.EVENT_MESSAGE_SENT_SUCCESS:
89
+ case _groupChannel.MessageEventSource.EVENT_MESSAGE_SENT_FAILED:
90
+ return !(0, _uikitUtils.isMyMessage)(it, sdk.currentUser.userId);
91
+ default:
92
+ return true;
72
93
  }
73
-
74
- // NOTE: v4 MESSAGE_RECEIVED is called twice from onMessagesAdded and onMessagesUpdated when receiving new message.
75
- // This is not intended behavior but not bugs.
76
- if (_.source !== _groupChannel.MessageEventSource.EVENT_MESSAGE_RECEIVED) {
77
- updateMessages(messages, false, sdk.currentUser.userId);
94
+ });
95
+ if (incomingMessages.length > 0) {
96
+ var _options$shouldCountN;
97
+ updateMessages(incomingMessages, false, sdk.currentUser.userId);
98
+ if (options !== null && options !== void 0 && (_options$shouldCountN = options.shouldCountNewMessages) !== null && _options$shouldCountN !== void 0 && _options$shouldCountN.call(options)) {
99
+ updateNewMessages(incomingMessages, false, sdk.currentUser.userId);
78
100
  }
79
- },
80
- onMessagesDeleted: (_, __, messageIds) => {
81
- deleteMessages(messageIds, []);
82
- deleteNextMessages(messageIds, []);
83
- },
84
- onChannelDeleted: () => {
85
- var _options$onChannelDel;
86
- options === null || options === void 0 ? void 0 : (_options$onChannelDel = options.onChannelDeleted) === null || _options$onChannelDel === void 0 ? void 0 : _options$onChannelDel.call(options);
87
- },
88
- onChannelUpdated: (_, eventChannel) => {
89
- if (eventChannel.isGroupChannel() && !(0, _uikitUtils.isDifferentChannel)(eventChannel, channel)) {
90
- forceUpdate();
101
+ switch (_.source) {
102
+ case _groupChannel.MessageEventSource.EVENT_MESSAGE_RECEIVED:
103
+ case _groupChannel.MessageEventSource.SYNC_MESSAGE_FILL:
104
+ {
105
+ var _options$onMessagesRe;
106
+ options === null || options === void 0 ? void 0 : (_options$onMessagesRe = options.onMessagesReceived) === null || _options$onMessagesRe === void 0 ? void 0 : _options$onMessagesRe.call(options, incomingMessages);
107
+ }
91
108
  }
92
- },
93
- onHugeGapDetected: () => {
94
- init(uid);
95
109
  }
96
- });
97
- collectionRef.current.initialize(_groupChannel.MessageCollectionInitPolicy.CACHE_AND_REPLACE_BY_API).onCacheResult((err, messages) => {
98
- if (err) sdk.isCacheEnabled && _uikitUtils.Logger.error('[useGroupChannelMessagesWithCollection/onCacheResult]', err);else {
99
- var _collectionRef$curren3, _collectionRef$curren4;
100
- _uikitUtils.Logger.debug('[useGroupChannelMessagesWithCollection/onCacheResult]', 'message length:', messages.length);
101
- updateMessages(messages, true, sdk.currentUser.userId);
102
- updateMessages(((_collectionRef$curren3 = collectionRef.current) === null || _collectionRef$curren3 === void 0 ? void 0 : _collectionRef$curren3.pendingMessages) ?? [], false, sdk.currentUser.userId);
103
- updateMessages(((_collectionRef$curren4 = collectionRef.current) === null || _collectionRef$curren4 === void 0 ? void 0 : _collectionRef$curren4.failedMessages) ?? [], false, sdk.currentUser.userId);
104
- }
105
- callback === null || callback === void 0 ? void 0 : callback();
106
- }).onApiResult((err, messages) => {
107
- if (err) _uikitUtils.Logger.warn('[useGroupChannelMessagesWithCollection/onApiResult]', err);else {
108
- _uikitUtils.Logger.debug('[useGroupChannelMessagesWithCollection/onApiResult]', 'message length:', messages.length);
109
- updateMessages(messages, true, sdk.currentUser.userId);
110
- if (sdk.isCacheEnabled) {
111
- var _collectionRef$curren5, _collectionRef$curren6;
112
- updateMessages(((_collectionRef$curren5 = collectionRef.current) === null || _collectionRef$curren5 === void 0 ? void 0 : _collectionRef$curren5.pendingMessages) ?? [], false, sdk.currentUser.userId);
113
- updateMessages(((_collectionRef$curren6 = collectionRef.current) === null || _collectionRef$curren6 === void 0 ? void 0 : _collectionRef$curren6.failedMessages) ?? [], false, sdk.currentUser.userId);
110
+ },
111
+ onMessagesUpdated: (_, __, messages) => {
112
+ channelMarkAsRead(_.source);
113
+ const incomingMessages = messages.filter(it => {
114
+ switch (_.source) {
115
+ case _groupChannel.MessageEventSource.EVENT_MESSAGE_UPDATED:
116
+ return !(0, _uikitUtils.isMyMessage)(it, sdk.currentUser.userId);
117
+ default:
118
+ return true;
119
+ }
120
+ });
121
+ if (incomingMessages.length > 0) {
122
+ var _options$shouldCountN2;
123
+ // NOTE: admin message is not added via onMessagesAdded handler, not checked yet is this a bug.
124
+ updateMessages(messages, false, sdk.currentUser.userId);
125
+ if (options !== null && options !== void 0 && (_options$shouldCountN2 = options.shouldCountNewMessages) !== null && _options$shouldCountN2 !== void 0 && _options$shouldCountN2.call(options)) {
126
+ if (_.source === _groupChannel.MessageEventSource.EVENT_MESSAGE_RECEIVED) {
127
+ updateNewMessages(messages, false, sdk.currentUser.userId);
128
+ }
114
129
  }
115
130
  }
116
- callback === null || callback === void 0 ? void 0 : callback();
117
- });
118
- }
131
+ },
132
+ onMessagesDeleted: (_, __, messageIds) => {
133
+ deleteMessages(messageIds, []);
134
+ deleteNewMessages(messageIds, []);
135
+ },
136
+ onChannelDeleted: () => {
137
+ var _options$onChannelDel;
138
+ options === null || options === void 0 ? void 0 : (_options$onChannelDel = options.onChannelDeleted) === null || _options$onChannelDel === void 0 ? void 0 : _options$onChannelDel.call(options);
139
+ },
140
+ onChannelUpdated: (_, eventChannel) => {
141
+ if (eventChannel.isGroupChannel() && !(0, _uikitUtils.isDifferentChannel)(eventChannel, channel)) {
142
+ forceUpdate();
143
+ }
144
+ },
145
+ onHugeGapDetected: () => {
146
+ init(Number.MAX_SAFE_INTEGER, MESSAGE_LIMIT.DEFAULT);
147
+ }
148
+ });
149
+ collectionRef.current.initialize(_groupChannel.MessageCollectionInitPolicy.CACHE_AND_REPLACE_BY_API).onCacheResult((err, messages) => {
150
+ if (err) sdk.isCacheEnabled && _uikitUtils.Logger.error('[useGroupChannelMessagesWithCollection/onCacheResult]', err);else {
151
+ _uikitUtils.Logger.debug('[useGroupChannelMessagesWithCollection/onCacheResult]', 'message length:', messages.length);
152
+ updateMessages(messages, true, sdk.currentUser.userId);
153
+ updateUnsendMessages();
154
+ }
155
+ callback === null || callback === void 0 ? void 0 : callback();
156
+ }).onApiResult((err, messages) => {
157
+ if (err) _uikitUtils.Logger.warn('[useGroupChannelMessagesWithCollection/onApiResult]', err);else {
158
+ var _options$onMessagesRe2;
159
+ _uikitUtils.Logger.debug('[useGroupChannelMessagesWithCollection/onApiResult]', 'message length:', messages.length);
160
+ updateMessages(messages, true, sdk.currentUser.userId);
161
+ if (!(options !== null && options !== void 0 && options.startingPoint)) options === null || options === void 0 ? void 0 : (_options$onMessagesRe2 = options.onMessagesReceived) === null || _options$onMessagesRe2 === void 0 ? void 0 : _options$onMessagesRe2.call(options, messages);
162
+ if (sdk.isCacheEnabled) updateUnsendMessages();
163
+ }
164
+ collectionInitializedRef.current = true;
165
+ callback === null || callback === void 0 ? void 0 : callback();
166
+ });
119
167
  });
120
168
  (0, _useChannelHandler.useChannelHandler)(sdk, handlerId, {
121
169
  onUserBanned(channel, bannedUser) {
@@ -133,45 +181,51 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
133
181
  // NOTE: Cache read is heavy task, and it prevents smooth ui transition
134
182
  setTimeout(async () => {
135
183
  updateLoading(true);
136
- init(userId, () => updateLoading(false));
184
+ init(initialStartingPoint, initialLimit, () => updateLoading(false));
137
185
  }, 0);
138
186
  }, [channel.url, userId]);
139
187
  (0, _react.useEffect)(() => {
140
188
  return () => {
141
- var _collectionRef$curren7;
142
- if (collectionRef.current) (_collectionRef$curren7 = collectionRef.current) === null || _collectionRef$curren7 === void 0 ? void 0 : _collectionRef$curren7.dispose();
189
+ var _collectionRef$curren3;
190
+ if (collectionRef.current) (_collectionRef$curren3 = collectionRef.current) === null || _collectionRef$curren3 === void 0 ? void 0 : _collectionRef$curren3.dispose();
143
191
  };
144
192
  }, []);
145
193
  const refresh = (0, _uikitUtils.useFreshCallback)(async () => {
146
194
  updateRefreshing(true);
147
- init(userId, () => updateRefreshing(false));
195
+ init(Number.MAX_SAFE_INTEGER, MESSAGE_LIMIT.DEFAULT, () => updateRefreshing(false));
148
196
  });
149
197
  const prev = (0, _uikitUtils.useFreshCallback)(async () => {
150
- var _collectionRef$curren8;
151
- if (collectionRef.current && (_collectionRef$curren8 = collectionRef.current) !== null && _collectionRef$curren8 !== void 0 && _collectionRef$curren8.hasPrevious) {
198
+ var _collectionRef$curren4;
199
+ if (collectionRef.current && (_collectionRef$curren4 = collectionRef.current) !== null && _collectionRef$curren4 !== void 0 && _collectionRef$curren4.hasPrevious) {
152
200
  try {
153
- var _collectionRef$curren9;
154
- const list = await ((_collectionRef$curren9 = collectionRef.current) === null || _collectionRef$curren9 === void 0 ? void 0 : _collectionRef$curren9.loadPrevious());
201
+ var _collectionRef$curren5;
202
+ const list = await ((_collectionRef$curren5 = collectionRef.current) === null || _collectionRef$curren5 === void 0 ? void 0 : _collectionRef$curren5.loadPrevious());
155
203
  updateMessages(list, false, sdk.currentUser.userId);
156
204
  } catch {}
157
205
  }
158
206
  });
207
+ const hasPrev = (0, _uikitUtils.useFreshCallback)(() => {
208
+ if (collectionInitializedRef.current && collectionRef.current) {
209
+ return collectionRef.current.hasPrevious;
210
+ } else {
211
+ return false;
212
+ }
213
+ });
159
214
  const next = (0, _uikitUtils.useFreshCallback)(async () => {
160
- var _collectionRef$curren10;
161
- const messageCandidates = [];
162
- if (collectionRef.current && (_collectionRef$curren10 = collectionRef.current) !== null && _collectionRef$curren10 !== void 0 && _collectionRef$curren10.hasNext) {
215
+ var _collectionRef$curren6;
216
+ if (collectionRef.current && (_collectionRef$curren6 = collectionRef.current) !== null && _collectionRef$curren6 !== void 0 && _collectionRef$curren6.hasNext) {
163
217
  try {
164
- var _collectionRef$curren11;
165
- const fetchedList = await ((_collectionRef$curren11 = collectionRef.current) === null || _collectionRef$curren11 === void 0 ? void 0 : _collectionRef$curren11.loadNext());
166
- messageCandidates.push(...fetchedList);
218
+ var _collectionRef$curren7;
219
+ const fetchedList = await ((_collectionRef$curren7 = collectionRef.current) === null || _collectionRef$curren7 === void 0 ? void 0 : _collectionRef$curren7.loadNext());
220
+ updateMessages(fetchedList, false, sdk.currentUser.userId);
167
221
  } catch {}
168
222
  }
169
- if (nextMessages.length > 0) {
170
- messageCandidates.push(...nextMessages);
171
- }
172
- if (messageCandidates.length > 0) {
173
- updateMessages(messageCandidates, false, sdk.currentUser.userId);
174
- updateNextMessages([], true, sdk.currentUser.userId);
223
+ });
224
+ const hasNext = (0, _uikitUtils.useFreshCallback)(() => {
225
+ if (collectionInitializedRef.current && collectionRef.current) {
226
+ return collectionRef.current.hasNext;
227
+ } else {
228
+ return false;
175
229
  }
176
230
  });
177
231
  const sendUserMessage = (0, _uikitUtils.useFreshCallback)((params, onPending) => {
@@ -186,8 +240,8 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
186
240
  updateMessages([sentMessage], false, sdk.currentUser.userId);
187
241
  resolve(sentMessage);
188
242
  }
189
- }).onFailed((err, _failedMessage) => {
190
- // updateMessages([failedMessage], false, sdk.currentUser.userId);
243
+ }).onFailed((err, failedMessage) => {
244
+ updateMessages([failedMessage], false, sdk.currentUser.userId);
191
245
  reject(err);
192
246
  });
193
247
  });
@@ -204,8 +258,8 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
204
258
  updateMessages([sentMessage], false, sdk.currentUser.userId);
205
259
  resolve(sentMessage);
206
260
  }
207
- }).onFailed((err, _failedMessage) => {
208
- // updateMessages([failedMessage], false, sdk.currentUser.userId);
261
+ }).onFailed((err, failedMessage) => {
262
+ updateMessages([failedMessage], false, sdk.currentUser.userId);
209
263
  reject(err);
210
264
  });
211
265
  });
@@ -234,28 +288,44 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
234
288
  if (message.isFileMessage()) await channel.deleteMessage(message);
235
289
  } else {
236
290
  try {
237
- var _collectionRef$curren12;
238
- await ((_collectionRef$curren12 = collectionRef.current) === null || _collectionRef$curren12 === void 0 ? void 0 : _collectionRef$curren12.removeFailedMessage(message.reqId));
291
+ var _collectionRef$curren8;
292
+ await ((_collectionRef$curren8 = collectionRef.current) === null || _collectionRef$curren8 === void 0 ? void 0 : _collectionRef$curren8.removeFailedMessage(message.reqId));
239
293
  } finally {
240
294
  deleteMessages([message.messageId], [message.reqId]);
241
295
  }
242
296
  }
243
297
  });
298
+ const resetNewMessages = (0, _uikitUtils.useFreshCallback)(() => {
299
+ updateNewMessages([], true, sdk.currentUser.userId);
300
+ });
301
+ const resetWithStartingPoint = (0, _uikitUtils.useFreshCallback)((startingPoint, callback) => {
302
+ updateLoading(true);
303
+ updateMessages([], true, sdk.currentUser.userId);
304
+ init(startingPoint, MESSAGE_LIMIT.DEFAULT, () => {
305
+ updateLoading(false);
306
+ callback === null || callback === void 0 ? void 0 : callback();
307
+ });
308
+ });
244
309
  return {
245
310
  loading,
246
311
  refreshing,
247
312
  refresh,
248
313
  messages,
249
- nextMessages,
250
- newMessagesFromMembers,
251
314
  next,
315
+ hasNext,
252
316
  prev,
317
+ hasPrev,
318
+ newMessages,
319
+ resetNewMessages,
253
320
  sendUserMessage,
254
321
  sendFileMessage,
255
322
  updateUserMessage,
256
323
  updateFileMessage,
257
324
  resendMessage,
258
- deleteMessage
325
+ deleteMessage,
326
+ resetWithStartingPoint,
327
+ nextMessages: newMessages,
328
+ newMessagesFromMembers: newMessages
259
329
  };
260
330
  };
261
331
  exports.useGroupChannelMessagesWithCollection = useGroupChannelMessagesWithCollection;