@sendbird/uikit-chat-hooks 3.0.4 → 3.1.1
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.
- package/lib/commonjs/channel/useChannelMessagesReducer.js +60 -11
- package/lib/commonjs/channel/useChannelMessagesReducer.js.map +1 -1
- package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +94 -83
- package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
- package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +44 -26
- package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
- package/lib/commonjs/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js +46 -28
- package/lib/commonjs/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js.map +1 -1
- package/lib/commonjs/types.js.map +1 -1
- package/lib/module/channel/useChannelMessagesReducer.js +61 -12
- package/lib/module/channel/useChannelMessagesReducer.js.map +1 -1
- package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +96 -85
- package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
- package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +44 -26
- package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
- package/lib/module/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js +46 -28
- package/lib/module/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js.map +1 -1
- package/lib/module/types.js.map +1 -1
- package/lib/typescript/src/types.d.ts +1 -0
- package/package.json +5 -5
- package/src/channel/useChannelMessagesReducer.ts +66 -17
- package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.ts +75 -84
- package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.ts +26 -22
- package/src/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.ts +31 -26
- package/src/types.ts +1 -0
|
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.useChannelMessagesReducer = void 0;
|
|
7
7
|
var _react = require("react");
|
|
8
|
+
var _message = require("@sendbird/chat/message");
|
|
8
9
|
var _uikitUtils = require("@sendbird/uikit-utils");
|
|
9
10
|
const defaultReducer = (_ref, action) => {
|
|
10
11
|
let {
|
|
@@ -23,26 +24,42 @@ const defaultReducer = (_ref, action) => {
|
|
|
23
24
|
}
|
|
24
25
|
case 'update_messages':
|
|
25
26
|
{
|
|
27
|
+
const userId = action.value.currentUserId;
|
|
26
28
|
if (action.value.clearBeforeAction) {
|
|
27
|
-
draft['messageMap'] = (
|
|
29
|
+
draft['messageMap'] = messagesToObject(action.value.messages);
|
|
28
30
|
} else {
|
|
29
|
-
//
|
|
30
|
-
const
|
|
31
|
-
|
|
31
|
+
// Filtering meaningless message updates
|
|
32
|
+
const nextMessages = action.value.messages.filter(next => {
|
|
33
|
+
if ((0, _uikitUtils.isMyMessage)(next, userId)) {
|
|
34
|
+
const prev = draft['messageMap'][next.reqId] ?? draft['messageMap'][next.messageId];
|
|
35
|
+
if ((0, _uikitUtils.isMyMessage)(prev, userId)) {
|
|
36
|
+
const shouldUpdate = shouldUpdateMessage(prev, next);
|
|
37
|
+
if (shouldUpdate) {
|
|
38
|
+
// Remove existing messages before update to prevent duplicate display
|
|
39
|
+
delete draft['messageMap'][prev.reqId];
|
|
40
|
+
delete draft['messageMap'][prev.messageId];
|
|
41
|
+
}
|
|
42
|
+
return shouldUpdate;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return true;
|
|
46
|
+
});
|
|
47
|
+
const obj = messagesToObject(nextMessages);
|
|
32
48
|
draft['messageMap'] = {
|
|
33
49
|
...draft['messageMap'],
|
|
34
|
-
...
|
|
50
|
+
...obj
|
|
35
51
|
};
|
|
36
52
|
}
|
|
37
53
|
return draft;
|
|
38
54
|
}
|
|
39
55
|
case 'update_new_messages':
|
|
40
56
|
{
|
|
41
|
-
const
|
|
57
|
+
const userId = action.value.currentUserId;
|
|
58
|
+
const newMessages = action.value.messages.filter(it => (0, _uikitUtils.isNewMessage)(it, userId));
|
|
42
59
|
if (action.value.clearBeforeAction) {
|
|
43
60
|
draft['newMessageMap'] = (0, _uikitUtils.arrayToMapWithGetter)(newMessages, _uikitUtils.getMessageUniqId);
|
|
44
61
|
} else {
|
|
45
|
-
// Remove existing messages before update
|
|
62
|
+
// Remove existing messages before update to prevent duplicate display
|
|
46
63
|
const messageKeys = newMessages.map(it => it.messageId);
|
|
47
64
|
messageKeys.forEach(key => delete draft['newMessageMap'][key]);
|
|
48
65
|
draft['newMessageMap'] = {
|
|
@@ -59,12 +76,44 @@ const defaultReducer = (_ref, action) => {
|
|
|
59
76
|
draft[key] = {
|
|
60
77
|
...draft[key]
|
|
61
78
|
};
|
|
62
|
-
action.value.messageIds.forEach(msgId =>
|
|
63
|
-
|
|
79
|
+
action.value.messageIds.forEach(msgId => {
|
|
80
|
+
const message = draft[key][msgId];
|
|
81
|
+
if (message) {
|
|
82
|
+
if ((0, _uikitUtils.isSendableMessage)(message)) delete draft[key][message.reqId];
|
|
83
|
+
delete draft[key][message.messageId];
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
action.value.reqIds.forEach(reqId => {
|
|
87
|
+
const message = draft[key][reqId];
|
|
88
|
+
if (message) {
|
|
89
|
+
if ((0, _uikitUtils.isSendableMessage)(message)) delete draft[key][message.reqId];
|
|
90
|
+
delete draft[key][message.messageId];
|
|
91
|
+
}
|
|
92
|
+
});
|
|
64
93
|
return draft;
|
|
65
94
|
}
|
|
66
95
|
}
|
|
67
96
|
};
|
|
97
|
+
const messagesToObject = messages => {
|
|
98
|
+
return messages.reduce((accum, curr) => {
|
|
99
|
+
if ((0, _uikitUtils.isSendableMessage)(curr)) {
|
|
100
|
+
accum[curr.reqId] = curr;
|
|
101
|
+
if (curr.sendingStatus === _message.SendingStatus.SUCCEEDED) {
|
|
102
|
+
accum[curr.messageId] = curr;
|
|
103
|
+
}
|
|
104
|
+
} else {
|
|
105
|
+
accum[curr.messageId] = curr;
|
|
106
|
+
}
|
|
107
|
+
return accum;
|
|
108
|
+
}, {});
|
|
109
|
+
};
|
|
110
|
+
const shouldUpdateMessage = (prev, next) => {
|
|
111
|
+
// message data update (e.g. reactions)
|
|
112
|
+
if (prev.sendingStatus === _message.SendingStatus.SUCCEEDED) return next.sendingStatus === _message.SendingStatus.SUCCEEDED;
|
|
113
|
+
|
|
114
|
+
// message sending status update
|
|
115
|
+
return prev.sendingStatus !== next.sendingStatus;
|
|
116
|
+
};
|
|
68
117
|
const useChannelMessagesReducer = sortComparator => {
|
|
69
118
|
const [{
|
|
70
119
|
loading,
|
|
@@ -132,8 +181,8 @@ const useChannelMessagesReducer = sortComparator => {
|
|
|
132
181
|
});
|
|
133
182
|
};
|
|
134
183
|
const messages = (0, _uikitUtils.useIIFE)(() => {
|
|
135
|
-
if (sortComparator) return Object.values(messageMap).sort(sortComparator);
|
|
136
|
-
return Object.values(messageMap);
|
|
184
|
+
if (sortComparator) return Array.from(new Set(Object.values(messageMap))).sort(sortComparator);
|
|
185
|
+
return Array.from(new Set(Object.values(messageMap)));
|
|
137
186
|
});
|
|
138
187
|
const newMessages = Object.values(newMessageMap);
|
|
139
188
|
return {
|
|
@@ -1 +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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"}
|
|
1
|
+
{"version":3,"names":["_react","require","_message","_uikitUtils","defaultReducer","_ref","action","draft","type","value","status","userId","currentUserId","clearBeforeAction","messagesToObject","messages","nextMessages","filter","next","isMyMessage","prev","reqId","messageId","shouldUpdate","shouldUpdateMessage","obj","newMessages","it","isNewMessage","arrayToMapWithGetter","getMessageUniqId","messageKeys","map","forEach","key","messageIds","msgId","message","isSendableMessage","reqIds","reduce","accum","curr","sendingStatus","SendingStatus","SUCCEEDED","useChannelMessagesReducer","sortComparator","loading","refreshing","messageMap","newMessageMap","dispatch","useReducer","updateMessages","deleteMessages","updateNewMessages","deleteNewMessages","updateLoading","updateRefreshing","useIIFE","Array","from","Set","Object","values","sort","exports"],"sources":["useChannelMessagesReducer.ts"],"sourcesContent":["import { useReducer } from 'react';\n\nimport { SendableMessage } from '@sendbird/chat/lib/__definition';\nimport { SendingStatus } from '@sendbird/chat/message';\nimport type { SendbirdBaseMessage } from '@sendbird/uikit-utils';\nimport {\n SendbirdMessage,\n arrayToMapWithGetter,\n getMessageUniqId,\n isMyMessage,\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 const userId = action.value.currentUserId;\n\n if (action.value.clearBeforeAction) {\n draft['messageMap'] = messagesToObject(action.value.messages);\n } else {\n // Filtering meaningless message updates\n const nextMessages = action.value.messages.filter((next) => {\n if (isMyMessage(next, userId)) {\n const prev = draft['messageMap'][next.reqId] ?? draft['messageMap'][next.messageId];\n if (isMyMessage(prev, userId)) {\n const shouldUpdate = shouldUpdateMessage(prev, next);\n if (shouldUpdate) {\n // Remove existing messages before update to prevent duplicate display\n delete draft['messageMap'][prev.reqId];\n delete draft['messageMap'][prev.messageId];\n }\n return shouldUpdate;\n }\n }\n return true;\n });\n\n const obj = messagesToObject(nextMessages);\n draft['messageMap'] = { ...draft['messageMap'], ...obj };\n }\n\n return draft;\n }\n case 'update_new_messages': {\n const userId = action.value.currentUserId;\n const newMessages = action.value.messages.filter((it) => isNewMessage(it, userId));\n\n if (action.value.clearBeforeAction) {\n draft['newMessageMap'] = arrayToMapWithGetter(newMessages, getMessageUniqId);\n } else {\n // Remove existing messages before update to 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) => {\n const message = draft[key][msgId];\n if (message) {\n if (isSendableMessage(message)) delete draft[key][message.reqId];\n delete draft[key][message.messageId];\n }\n });\n action.value.reqIds.forEach((reqId) => {\n const message = draft[key][reqId];\n if (message) {\n if (isSendableMessage(message)) delete draft[key][message.reqId];\n delete draft[key][message.messageId];\n }\n });\n\n return draft;\n }\n }\n};\n\nconst messagesToObject = (messages: SendbirdBaseMessage[]) => {\n return messages.reduce((accum, curr) => {\n if (isSendableMessage(curr)) {\n accum[curr.reqId] = curr;\n if (curr.sendingStatus === SendingStatus.SUCCEEDED) {\n accum[curr.messageId] = curr;\n }\n } else {\n accum[curr.messageId] = curr;\n }\n return accum;\n }, {} as Record<string, SendbirdBaseMessage>);\n};\n\nconst shouldUpdateMessage = (prev: SendableMessage, next: SendableMessage) => {\n // message data update (e.g. reactions)\n if (prev.sendingStatus === SendingStatus.SUCCEEDED) return next.sendingStatus === SendingStatus.SUCCEEDED;\n\n // message sending status update\n return prev.sendingStatus !== next.sendingStatus;\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 Array.from(new Set(Object.values(messageMap))).sort(sortComparator);\n return Array.from(new Set(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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"}
|
package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js
CHANGED
|
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.useGroupChannelMessagesWithCollection = void 0;
|
|
7
7
|
var _react = require("react");
|
|
8
|
+
var _chat = require("@sendbird/chat");
|
|
8
9
|
var _groupChannel = require("@sendbird/chat/groupChannel");
|
|
9
10
|
var _uikitUtils = require("@sendbird/uikit-utils");
|
|
10
11
|
var _useChannelHandler = require("../../handler/useChannelHandler");
|
|
@@ -29,9 +30,12 @@ function isNotEmpty(arr) {
|
|
|
29
30
|
if (!arr) return false;
|
|
30
31
|
return arr.length !== 0;
|
|
31
32
|
}
|
|
33
|
+
function shouldUseSearchLimit(startingPoint) {
|
|
34
|
+
return startingPoint < Date.now();
|
|
35
|
+
}
|
|
32
36
|
const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) => {
|
|
33
37
|
const initialStartingPoint = (options === null || options === void 0 ? void 0 : options.startingPoint) ?? Number.MAX_SAFE_INTEGER;
|
|
34
|
-
const initialLimit =
|
|
38
|
+
const initialLimit = shouldUseSearchLimit(initialStartingPoint) ? MESSAGE_LIMIT.SEARCH : MESSAGE_LIMIT.DEFAULT;
|
|
35
39
|
const forceUpdate = (0, _uikitUtils.useForceUpdate)();
|
|
36
40
|
const collectionRef = (0, _react.useRef)();
|
|
37
41
|
const collectionInitializedRef = (0, _react.useRef)(false);
|
|
@@ -51,9 +55,9 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
|
|
|
51
55
|
const channelMarkAsRead = async source => {
|
|
52
56
|
try {
|
|
53
57
|
switch (source) {
|
|
54
|
-
case
|
|
55
|
-
case
|
|
56
|
-
case
|
|
58
|
+
case _chat.CollectionEventSource.EVENT_MESSAGE_RECEIVED:
|
|
59
|
+
case _chat.CollectionEventSource.EVENT_MESSAGE_SENT_SUCCESS:
|
|
60
|
+
case _chat.CollectionEventSource.SYNC_MESSAGE_FILL:
|
|
57
61
|
case undefined:
|
|
58
62
|
await (0, _uikitUtils.confirmAndMarkAsRead)([channel]);
|
|
59
63
|
break;
|
|
@@ -62,77 +66,66 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
|
|
|
62
66
|
_uikitUtils.Logger.warn('[useGroupChannelMessagesWithCollection/channelMarkAsRead]', e);
|
|
63
67
|
}
|
|
64
68
|
};
|
|
65
|
-
const
|
|
69
|
+
const updateNewMessagesReceived = (source, messages) => {
|
|
70
|
+
const incomingMessages = messages.filter(it => {
|
|
71
|
+
var _sdk$currentUser;
|
|
72
|
+
return !(0, _uikitUtils.isMyMessage)(it, (_sdk$currentUser = sdk.currentUser) === null || _sdk$currentUser === void 0 ? void 0 : _sdk$currentUser.userId);
|
|
73
|
+
});
|
|
74
|
+
if (incomingMessages.length > 0) {
|
|
75
|
+
switch (source) {
|
|
76
|
+
case _chat.CollectionEventSource.EVENT_MESSAGE_RECEIVED:
|
|
77
|
+
case _chat.CollectionEventSource.SYNC_MESSAGE_FILL:
|
|
78
|
+
{
|
|
79
|
+
var _options$shouldCountN, _sdk$currentUser2, _options$onMessagesRe;
|
|
80
|
+
if (options !== null && options !== void 0 && (_options$shouldCountN = options.shouldCountNewMessages) !== null && _options$shouldCountN !== void 0 && _options$shouldCountN.call(options)) updateNewMessages(incomingMessages, false, (_sdk$currentUser2 = sdk.currentUser) === null || _sdk$currentUser2 === void 0 ? void 0 : _sdk$currentUser2.userId);
|
|
81
|
+
options === null || options === void 0 ? void 0 : (_options$onMessagesRe = options.onMessagesReceived) === null || _options$onMessagesRe === void 0 ? void 0 : _options$onMessagesRe.call(options, incomingMessages);
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
const updateUnsentMessages = () => {
|
|
88
|
+
var _sdk$currentUser3, _sdk$currentUser4;
|
|
66
89
|
const {
|
|
67
90
|
pendingMessages,
|
|
68
91
|
failedMessages
|
|
69
92
|
} = collectionRef.current ?? {};
|
|
70
|
-
if (isNotEmpty(pendingMessages)) updateMessages(pendingMessages, false, sdk.currentUser.userId);
|
|
71
|
-
if (isNotEmpty(failedMessages)) updateMessages(failedMessages, false, sdk.currentUser.userId);
|
|
93
|
+
if (isNotEmpty(pendingMessages)) updateMessages(pendingMessages, false, (_sdk$currentUser3 = sdk.currentUser) === null || _sdk$currentUser3 === void 0 ? void 0 : _sdk$currentUser3.userId);
|
|
94
|
+
if (isNotEmpty(failedMessages)) updateMessages(failedMessages, false, (_sdk$currentUser4 = sdk.currentUser) === null || _sdk$currentUser4 === void 0 ? void 0 : _sdk$currentUser4.userId);
|
|
72
95
|
};
|
|
73
96
|
const init = (0, _uikitUtils.useFreshCallback)(async (startingPoint, limit, callback) => {
|
|
74
|
-
var _collectionRef$curren, _collectionRef$curren2;
|
|
97
|
+
var _collectionRef$curren, _sdk$currentUser5, _collectionRef$curren2;
|
|
75
98
|
if (collectionRef.current) (_collectionRef$curren = collectionRef.current) === null || _collectionRef$curren === void 0 ? void 0 : _collectionRef$curren.dispose();
|
|
76
99
|
channelMarkAsRead();
|
|
77
|
-
updateNewMessages([], true, sdk.currentUser.userId);
|
|
100
|
+
updateNewMessages([], true, (_sdk$currentUser5 = sdk.currentUser) === null || _sdk$currentUser5 === void 0 ? void 0 : _sdk$currentUser5.userId);
|
|
78
101
|
collectionInitializedRef.current = false;
|
|
79
102
|
collectionRef.current = createMessageCollection(channel, limit, {
|
|
80
103
|
...options,
|
|
81
104
|
startingPoint
|
|
82
105
|
});
|
|
83
106
|
(_collectionRef$curren2 = collectionRef.current) === null || _collectionRef$curren2 === void 0 ? void 0 : _collectionRef$curren2.setMessageCollectionHandler({
|
|
84
|
-
onMessagesAdded: (
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
case _groupChannel.MessageEventSource.EVENT_MESSAGE_SENT_SUCCESS:
|
|
90
|
-
case _groupChannel.MessageEventSource.EVENT_MESSAGE_SENT_FAILED:
|
|
91
|
-
return !(0, _uikitUtils.isMyMessage)(it, sdk.currentUser.userId);
|
|
92
|
-
default:
|
|
93
|
-
return true;
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
if (incomingMessages.length > 0) {
|
|
97
|
-
var _options$shouldCountN;
|
|
98
|
-
updateMessages(incomingMessages, false, sdk.currentUser.userId);
|
|
99
|
-
if (options !== null && options !== void 0 && (_options$shouldCountN = options.shouldCountNewMessages) !== null && _options$shouldCountN !== void 0 && _options$shouldCountN.call(options)) {
|
|
100
|
-
updateNewMessages(incomingMessages, false, sdk.currentUser.userId);
|
|
101
|
-
}
|
|
102
|
-
switch (_.source) {
|
|
103
|
-
case _groupChannel.MessageEventSource.EVENT_MESSAGE_RECEIVED:
|
|
104
|
-
case _groupChannel.MessageEventSource.SYNC_MESSAGE_FILL:
|
|
105
|
-
{
|
|
106
|
-
var _options$onMessagesRe;
|
|
107
|
-
options === null || options === void 0 ? void 0 : (_options$onMessagesRe = options.onMessagesReceived) === null || _options$onMessagesRe === void 0 ? void 0 : _options$onMessagesRe.call(options, incomingMessages);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
107
|
+
onMessagesAdded: (ctx, __, messages) => {
|
|
108
|
+
var _sdk$currentUser6;
|
|
109
|
+
channelMarkAsRead(ctx.source);
|
|
110
|
+
updateNewMessagesReceived(ctx.source, messages);
|
|
111
|
+
updateMessages(messages, false, (_sdk$currentUser6 = sdk.currentUser) === null || _sdk$currentUser6 === void 0 ? void 0 : _sdk$currentUser6.userId);
|
|
111
112
|
},
|
|
112
|
-
onMessagesUpdated: (
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
});
|
|
122
|
-
if (incomingMessages.length > 0) {
|
|
123
|
-
var _options$shouldCountN2;
|
|
124
|
-
// NOTE: admin message is not added via onMessagesAdded handler, not checked yet is this a bug.
|
|
125
|
-
updateMessages(messages, false, sdk.currentUser.userId);
|
|
126
|
-
if (options !== null && options !== void 0 && (_options$shouldCountN2 = options.shouldCountNewMessages) !== null && _options$shouldCountN2 !== void 0 && _options$shouldCountN2.call(options)) {
|
|
127
|
-
if (_.source === _groupChannel.MessageEventSource.EVENT_MESSAGE_RECEIVED) {
|
|
128
|
-
updateNewMessages(messages, false, sdk.currentUser.userId);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
113
|
+
onMessagesUpdated: (ctx, __, messages) => {
|
|
114
|
+
var _sdk$currentUser7;
|
|
115
|
+
channelMarkAsRead(ctx.source);
|
|
116
|
+
updateNewMessagesReceived(ctx.source, messages); // NOTE: admin message is not added via onMessagesAdded handler, not checked yet is this a bug.
|
|
117
|
+
|
|
118
|
+
updateMessages(messages, false, (_sdk$currentUser7 = sdk.currentUser) === null || _sdk$currentUser7 === void 0 ? void 0 : _sdk$currentUser7.userId);
|
|
119
|
+
if (ctx.source === _chat.CollectionEventSource.EVENT_MESSAGE_UPDATED) {
|
|
120
|
+
var _options$onMessagesUp;
|
|
121
|
+
options === null || options === void 0 ? void 0 : (_options$onMessagesUp = options.onMessagesUpdated) === null || _options$onMessagesUp === void 0 ? void 0 : _options$onMessagesUp.call(options, messages);
|
|
131
122
|
}
|
|
132
123
|
},
|
|
133
|
-
onMessagesDeleted: (_, __,
|
|
134
|
-
|
|
135
|
-
|
|
124
|
+
onMessagesDeleted: (_, __, ___, messages) => {
|
|
125
|
+
const msgIds = messages.map(it => it.messageId);
|
|
126
|
+
const reqIds = messages.filter(_uikitUtils.isSendableMessage).map(it => it.reqId);
|
|
127
|
+
deleteMessages(msgIds, reqIds);
|
|
128
|
+
deleteNewMessages(msgIds, reqIds);
|
|
136
129
|
},
|
|
137
130
|
onChannelDeleted: () => {
|
|
138
131
|
var _options$onChannelDel;
|
|
@@ -148,19 +141,20 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
|
|
|
148
141
|
}
|
|
149
142
|
});
|
|
150
143
|
collectionRef.current.initialize(_groupChannel.MessageCollectionInitPolicy.CACHE_AND_REPLACE_BY_API).onCacheResult((err, messages) => {
|
|
151
|
-
if (err) sdk.isCacheEnabled && _uikitUtils.Logger.error('[useGroupChannelMessagesWithCollection/onCacheResult]', err);else {
|
|
144
|
+
if (err) sdk.isCacheEnabled && _uikitUtils.Logger.error('[useGroupChannelMessagesWithCollection/onCacheResult]', err);else if (messages) {
|
|
145
|
+
var _sdk$currentUser8;
|
|
152
146
|
_uikitUtils.Logger.debug('[useGroupChannelMessagesWithCollection/onCacheResult]', 'message length:', messages.length);
|
|
153
|
-
updateMessages(messages, true, sdk.currentUser.userId);
|
|
154
|
-
|
|
147
|
+
updateMessages(messages, true, (_sdk$currentUser8 = sdk.currentUser) === null || _sdk$currentUser8 === void 0 ? void 0 : _sdk$currentUser8.userId);
|
|
148
|
+
updateUnsentMessages();
|
|
155
149
|
}
|
|
156
150
|
callback === null || callback === void 0 ? void 0 : callback();
|
|
157
151
|
}).onApiResult((err, messages) => {
|
|
158
|
-
if (err) _uikitUtils.Logger.warn('[useGroupChannelMessagesWithCollection/onApiResult]', err);else {
|
|
159
|
-
var _options$onMessagesRe2;
|
|
152
|
+
if (err) _uikitUtils.Logger.warn('[useGroupChannelMessagesWithCollection/onApiResult]', err);else if (messages) {
|
|
153
|
+
var _sdk$currentUser9, _options$onMessagesRe2;
|
|
160
154
|
_uikitUtils.Logger.debug('[useGroupChannelMessagesWithCollection/onApiResult]', 'message length:', messages.length);
|
|
161
|
-
updateMessages(messages, true, sdk.currentUser.userId);
|
|
155
|
+
updateMessages(messages, true, (_sdk$currentUser9 = sdk.currentUser) === null || _sdk$currentUser9 === void 0 ? void 0 : _sdk$currentUser9.userId);
|
|
162
156
|
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);
|
|
163
|
-
if (sdk.isCacheEnabled)
|
|
157
|
+
if (sdk.isCacheEnabled) updateUnsentMessages();
|
|
164
158
|
}
|
|
165
159
|
collectionInitializedRef.current = true;
|
|
166
160
|
callback === null || callback === void 0 ? void 0 : callback();
|
|
@@ -169,7 +163,8 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
|
|
|
169
163
|
(0, _useChannelHandler.useChannelHandler)(sdk, handlerId, {
|
|
170
164
|
onUserBanned(channel, bannedUser) {
|
|
171
165
|
if (channel.isGroupChannel() && !(0, _uikitUtils.isDifferentChannel)(channel, channel)) {
|
|
172
|
-
|
|
166
|
+
var _sdk$currentUser10;
|
|
167
|
+
if (bannedUser.userId === ((_sdk$currentUser10 = sdk.currentUser) === null || _sdk$currentUser10 === void 0 ? void 0 : _sdk$currentUser10.userId)) {
|
|
173
168
|
var _options$onChannelDel2;
|
|
174
169
|
options === null || options === void 0 ? void 0 : (_options$onChannelDel2 = options.onChannelDeleted) === null || _options$onChannelDel2 === void 0 ? void 0 : _options$onChannelDel2.call(options);
|
|
175
170
|
} else {
|
|
@@ -184,7 +179,7 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
|
|
|
184
179
|
updateLoading(true);
|
|
185
180
|
init(initialStartingPoint, initialLimit, () => updateLoading(false));
|
|
186
181
|
}, 0);
|
|
187
|
-
}, [channel.url, userId]);
|
|
182
|
+
}, [channel.url, userId, options === null || options === void 0 ? void 0 : options.replyType]);
|
|
188
183
|
(0, _react.useEffect)(() => {
|
|
189
184
|
return () => {
|
|
190
185
|
var _collectionRef$curren3;
|
|
@@ -199,9 +194,9 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
|
|
|
199
194
|
var _collectionRef$curren4;
|
|
200
195
|
if (collectionRef.current && (_collectionRef$curren4 = collectionRef.current) !== null && _collectionRef$curren4 !== void 0 && _collectionRef$curren4.hasPrevious) {
|
|
201
196
|
try {
|
|
202
|
-
var _collectionRef$curren5;
|
|
197
|
+
var _collectionRef$curren5, _sdk$currentUser11;
|
|
203
198
|
const list = await ((_collectionRef$curren5 = collectionRef.current) === null || _collectionRef$curren5 === void 0 ? void 0 : _collectionRef$curren5.loadPrevious());
|
|
204
|
-
updateMessages(list, false, sdk.currentUser.userId);
|
|
199
|
+
updateMessages(list, false, (_sdk$currentUser11 = sdk.currentUser) === null || _sdk$currentUser11 === void 0 ? void 0 : _sdk$currentUser11.userId);
|
|
205
200
|
} catch {}
|
|
206
201
|
}
|
|
207
202
|
});
|
|
@@ -216,9 +211,9 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
|
|
|
216
211
|
var _collectionRef$curren6;
|
|
217
212
|
if (collectionRef.current && (_collectionRef$curren6 = collectionRef.current) !== null && _collectionRef$curren6 !== void 0 && _collectionRef$curren6.hasNext) {
|
|
218
213
|
try {
|
|
219
|
-
var _collectionRef$curren7;
|
|
214
|
+
var _collectionRef$curren7, _sdk$currentUser12;
|
|
220
215
|
const fetchedList = await ((_collectionRef$curren7 = collectionRef.current) === null || _collectionRef$curren7 === void 0 ? void 0 : _collectionRef$curren7.loadNext());
|
|
221
|
-
updateMessages(fetchedList, false, sdk.currentUser.userId);
|
|
216
|
+
updateMessages(fetchedList, false, (_sdk$currentUser12 = sdk.currentUser) === null || _sdk$currentUser12 === void 0 ? void 0 : _sdk$currentUser12.userId);
|
|
222
217
|
} catch {}
|
|
223
218
|
}
|
|
224
219
|
});
|
|
@@ -233,16 +228,21 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
|
|
|
233
228
|
return new Promise((resolve, reject) => {
|
|
234
229
|
channel.sendUserMessage(params).onPending(pendingMessage => {
|
|
235
230
|
if (pendingMessage.isUserMessage()) {
|
|
231
|
+
var _sdk$currentUser13;
|
|
236
232
|
onPending === null || onPending === void 0 ? void 0 : onPending(pendingMessage);
|
|
237
|
-
updateMessages([pendingMessage], false, sdk.currentUser.userId);
|
|
233
|
+
updateMessages([pendingMessage], false, (_sdk$currentUser13 = sdk.currentUser) === null || _sdk$currentUser13 === void 0 ? void 0 : _sdk$currentUser13.userId);
|
|
238
234
|
}
|
|
239
235
|
}).onSucceeded(sentMessage => {
|
|
240
236
|
if (sentMessage.isUserMessage()) {
|
|
241
|
-
|
|
237
|
+
var _sdk$currentUser14;
|
|
238
|
+
updateMessages([sentMessage], false, (_sdk$currentUser14 = sdk.currentUser) === null || _sdk$currentUser14 === void 0 ? void 0 : _sdk$currentUser14.userId);
|
|
242
239
|
resolve(sentMessage);
|
|
243
240
|
}
|
|
244
241
|
}).onFailed((err, failedMessage) => {
|
|
245
|
-
|
|
242
|
+
if (failedMessage) {
|
|
243
|
+
var _sdk$currentUser15;
|
|
244
|
+
updateMessages([failedMessage], false, (_sdk$currentUser15 = sdk.currentUser) === null || _sdk$currentUser15 === void 0 ? void 0 : _sdk$currentUser15.userId);
|
|
245
|
+
}
|
|
246
246
|
reject(err);
|
|
247
247
|
});
|
|
248
248
|
});
|
|
@@ -251,37 +251,45 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
|
|
|
251
251
|
return new Promise((resolve, reject) => {
|
|
252
252
|
channel.sendFileMessage(params).onPending(pendingMessage => {
|
|
253
253
|
if (pendingMessage.isFileMessage()) {
|
|
254
|
-
|
|
254
|
+
var _sdk$currentUser16;
|
|
255
|
+
updateMessages([pendingMessage], false, (_sdk$currentUser16 = sdk.currentUser) === null || _sdk$currentUser16 === void 0 ? void 0 : _sdk$currentUser16.userId);
|
|
255
256
|
onPending === null || onPending === void 0 ? void 0 : onPending(pendingMessage);
|
|
256
257
|
}
|
|
257
258
|
}).onSucceeded(sentMessage => {
|
|
258
259
|
if (sentMessage.isFileMessage()) {
|
|
259
|
-
|
|
260
|
+
var _sdk$currentUser17;
|
|
261
|
+
updateMessages([sentMessage], false, (_sdk$currentUser17 = sdk.currentUser) === null || _sdk$currentUser17 === void 0 ? void 0 : _sdk$currentUser17.userId);
|
|
260
262
|
resolve(sentMessage);
|
|
261
263
|
}
|
|
262
264
|
}).onFailed((err, failedMessage) => {
|
|
263
|
-
|
|
265
|
+
if (failedMessage) {
|
|
266
|
+
var _sdk$currentUser18;
|
|
267
|
+
updateMessages([failedMessage], false, (_sdk$currentUser18 = sdk.currentUser) === null || _sdk$currentUser18 === void 0 ? void 0 : _sdk$currentUser18.userId);
|
|
268
|
+
}
|
|
264
269
|
reject(err);
|
|
265
270
|
});
|
|
266
271
|
});
|
|
267
272
|
});
|
|
268
273
|
const updateUserMessage = (0, _uikitUtils.useFreshCallback)(async (messageId, params) => {
|
|
274
|
+
var _sdk$currentUser19;
|
|
269
275
|
const updatedMessage = await channel.updateUserMessage(messageId, params);
|
|
270
|
-
updateMessages([updatedMessage], false, sdk.currentUser.userId);
|
|
276
|
+
updateMessages([updatedMessage], false, (_sdk$currentUser19 = sdk.currentUser) === null || _sdk$currentUser19 === void 0 ? void 0 : _sdk$currentUser19.userId);
|
|
271
277
|
return updatedMessage;
|
|
272
278
|
});
|
|
273
279
|
const updateFileMessage = (0, _uikitUtils.useFreshCallback)(async (messageId, params) => {
|
|
280
|
+
var _sdk$currentUser20;
|
|
274
281
|
const updatedMessage = await channel.updateFileMessage(messageId, params);
|
|
275
|
-
updateMessages([updatedMessage], false, sdk.currentUser.userId);
|
|
282
|
+
updateMessages([updatedMessage], false, (_sdk$currentUser20 = sdk.currentUser) === null || _sdk$currentUser20 === void 0 ? void 0 : _sdk$currentUser20.userId);
|
|
276
283
|
return updatedMessage;
|
|
277
284
|
});
|
|
278
285
|
const resendMessage = (0, _uikitUtils.useFreshCallback)(async failedMessage => {
|
|
286
|
+
var _sdk$currentUser21;
|
|
279
287
|
const resentMessage = await (() => {
|
|
280
288
|
if (failedMessage.isUserMessage()) return channel.resendUserMessage(failedMessage);
|
|
281
289
|
if (failedMessage.isFileMessage()) return channel.resendFileMessage(failedMessage);
|
|
282
290
|
return null;
|
|
283
291
|
})();
|
|
284
|
-
if (resentMessage) updateMessages([resentMessage], false, sdk.currentUser.userId);
|
|
292
|
+
if (resentMessage) updateMessages([resentMessage], false, (_sdk$currentUser21 = sdk.currentUser) === null || _sdk$currentUser21 === void 0 ? void 0 : _sdk$currentUser21.userId);
|
|
285
293
|
});
|
|
286
294
|
const deleteMessage = (0, _uikitUtils.useFreshCallback)(async message => {
|
|
287
295
|
if (message.sendingStatus === 'succeeded') {
|
|
@@ -297,12 +305,15 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
|
|
|
297
305
|
}
|
|
298
306
|
});
|
|
299
307
|
const resetNewMessages = (0, _uikitUtils.useFreshCallback)(() => {
|
|
300
|
-
|
|
308
|
+
var _sdk$currentUser22;
|
|
309
|
+
updateNewMessages([], true, (_sdk$currentUser22 = sdk.currentUser) === null || _sdk$currentUser22 === void 0 ? void 0 : _sdk$currentUser22.userId);
|
|
301
310
|
});
|
|
302
311
|
const resetWithStartingPoint = (0, _uikitUtils.useFreshCallback)((startingPoint, callback) => {
|
|
312
|
+
var _sdk$currentUser23;
|
|
313
|
+
const limit = shouldUseSearchLimit(startingPoint) ? MESSAGE_LIMIT.SEARCH : MESSAGE_LIMIT.DEFAULT;
|
|
303
314
|
updateLoading(true);
|
|
304
|
-
updateMessages([], true, sdk.currentUser.userId);
|
|
305
|
-
init(startingPoint,
|
|
315
|
+
updateMessages([], true, (_sdk$currentUser23 = sdk.currentUser) === null || _sdk$currentUser23 === void 0 ? void 0 : _sdk$currentUser23.userId);
|
|
316
|
+
init(startingPoint, limit, () => {
|
|
306
317
|
updateLoading(false);
|
|
307
318
|
callback === null || callback === void 0 ? void 0 : callback();
|
|
308
319
|
});
|