@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.
- package/lib/commonjs/channel/{useGroupChannelMessages/reducer.js → useChannelMessagesReducer.js} +39 -30
- package/lib/commonjs/channel/useChannelMessagesReducer.js.map +1 -0
- package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +169 -99
- package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
- package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +56 -25
- package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
- package/lib/commonjs/channel/useOpenChannelList/useOpenChannelListWithQuery.js +0 -4
- package/lib/commonjs/channel/useOpenChannelList/useOpenChannelListWithQuery.js.map +1 -1
- package/lib/commonjs/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js +128 -28
- package/lib/commonjs/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js.map +1 -1
- package/lib/commonjs/common/useUserList.js +2 -2
- package/lib/commonjs/common/useUserList.js.map +1 -1
- package/lib/commonjs/types.js.map +1 -1
- package/lib/module/channel/{useGroupChannelMessages/reducer.js → useChannelMessagesReducer.js} +38 -29
- package/lib/module/channel/useChannelMessagesReducer.js.map +1 -0
- package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +170 -100
- package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
- package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +57 -26
- package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
- package/lib/module/channel/useOpenChannelList/useOpenChannelListWithQuery.js +0 -4
- package/lib/module/channel/useOpenChannelList/useOpenChannelListWithQuery.js.map +1 -1
- package/lib/module/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js +129 -29
- package/lib/module/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js.map +1 -1
- package/lib/module/common/useUserList.js +2 -2
- package/lib/module/common/useUserList.js.map +1 -1
- package/lib/module/types.js.map +1 -1
- package/lib/typescript/src/channel/useChannelMessagesReducer.d.ts +18 -0
- package/lib/typescript/src/types.d.ts +51 -20
- package/package.json +4 -5
- package/src/channel/useChannelMessagesReducer.ts +143 -0
- package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.ts +168 -96
- package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.ts +62 -25
- package/src/channel/useOpenChannelList/useOpenChannelListWithQuery.ts +0 -4
- package/src/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.ts +142 -25
- package/src/common/useUserList.ts +2 -2
- package/src/types.ts +58 -20
- package/lib/commonjs/channel/useGroupChannelMessages/reducer.js.map +0 -1
- package/lib/commonjs/channel/useOpenChannelMessages/reducer.js +0 -144
- package/lib/commonjs/channel/useOpenChannelMessages/reducer.js.map +0 -1
- package/lib/module/channel/useGroupChannelMessages/reducer.js.map +0 -1
- package/lib/module/channel/useOpenChannelMessages/reducer.js +0 -137
- package/lib/module/channel/useOpenChannelMessages/reducer.js.map +0 -1
- package/lib/typescript/src/channel/useGroupChannelMessages/reducer.d.ts +0 -15
- package/lib/typescript/src/channel/useOpenChannelMessages/reducer.d.ts +0 -15
- package/src/channel/useGroupChannelMessages/reducer.ts +0 -126
- package/src/channel/useOpenChannelMessages/reducer.ts +0 -126
package/lib/commonjs/channel/{useGroupChannelMessages/reducer.js → useChannelMessagesReducer.js}
RENAMED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
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[
|
|
27
|
+
draft['messageMap'] = (0, _uikitUtils.arrayToMapWithGetter)(action.value.messages, _uikitUtils.getMessageUniqId);
|
|
31
28
|
} else {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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 '
|
|
56
|
+
case 'delete_new_messages':
|
|
46
57
|
{
|
|
47
|
-
const key = action.type === 'delete_messages' ? 'messageMap' : '
|
|
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
|
|
68
|
+
const useChannelMessagesReducer = sortComparator => {
|
|
58
69
|
const [{
|
|
59
70
|
loading,
|
|
60
71
|
refreshing,
|
|
61
72
|
messageMap,
|
|
62
|
-
|
|
73
|
+
newMessageMap
|
|
63
74
|
}, dispatch] = (0, _react.useReducer)(defaultReducer, {
|
|
64
75
|
loading: true,
|
|
65
76
|
refreshing: false,
|
|
66
77
|
messageMap: {},
|
|
67
|
-
|
|
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
|
|
99
|
+
const updateNewMessages = (messages, clearBeforeAction, currentUserId) => {
|
|
89
100
|
dispatch({
|
|
90
|
-
type: '
|
|
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
|
|
109
|
+
const deleteNewMessages = (messageIds, reqIds) => {
|
|
99
110
|
dispatch({
|
|
100
|
-
type: '
|
|
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
|
|
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
|
-
|
|
140
|
-
|
|
147
|
+
newMessages,
|
|
148
|
+
updateNewMessages,
|
|
149
|
+
deleteNewMessages
|
|
141
150
|
};
|
|
142
151
|
};
|
|
143
|
-
exports.
|
|
144
|
-
//# sourceMappingURL=
|
|
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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"}
|
package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js
CHANGED
|
@@ -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
|
|
12
|
-
const
|
|
13
|
-
|
|
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
|
|
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
|
-
|
|
29
|
-
newMessagesFromMembers,
|
|
42
|
+
newMessages,
|
|
30
43
|
updateMessages,
|
|
31
|
-
|
|
32
|
-
|
|
44
|
+
updateNewMessages,
|
|
45
|
+
deleteNewMessages,
|
|
33
46
|
deleteMessages,
|
|
34
47
|
updateLoading,
|
|
35
48
|
updateRefreshing
|
|
36
|
-
} = (0,
|
|
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
|
|
52
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
if (
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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
|
-
|
|
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(
|
|
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$
|
|
142
|
-
if (collectionRef.current) (_collectionRef$
|
|
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(
|
|
195
|
+
init(Number.MAX_SAFE_INTEGER, MESSAGE_LIMIT.DEFAULT, () => updateRefreshing(false));
|
|
148
196
|
});
|
|
149
197
|
const prev = (0, _uikitUtils.useFreshCallback)(async () => {
|
|
150
|
-
var _collectionRef$
|
|
151
|
-
if (collectionRef.current && (_collectionRef$
|
|
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$
|
|
154
|
-
const list = await ((_collectionRef$
|
|
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$
|
|
161
|
-
|
|
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$
|
|
165
|
-
const fetchedList = await ((_collectionRef$
|
|
166
|
-
|
|
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
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
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,
|
|
190
|
-
|
|
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,
|
|
208
|
-
|
|
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$
|
|
238
|
-
await ((_collectionRef$
|
|
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;
|