@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
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import { useRef } from 'react';
|
|
2
2
|
|
|
3
|
-
import type {
|
|
3
|
+
import type {
|
|
4
|
+
SendbirdBaseChannel,
|
|
5
|
+
SendbirdBaseMessage,
|
|
6
|
+
SendbirdOpenChannel,
|
|
7
|
+
SendbirdPreviousMessageListQuery,
|
|
8
|
+
} from '@sendbird/uikit-utils';
|
|
4
9
|
import {
|
|
10
|
+
ASYNC_NOOP,
|
|
5
11
|
NOOP,
|
|
6
12
|
isDifferentChannel,
|
|
13
|
+
isMyMessage,
|
|
7
14
|
useAsyncEffect,
|
|
8
15
|
useForceUpdate,
|
|
9
16
|
useFreshCallback,
|
|
@@ -11,8 +18,9 @@ import {
|
|
|
11
18
|
} from '@sendbird/uikit-utils';
|
|
12
19
|
|
|
13
20
|
import { useChannelHandler } from '../../handler/useChannelHandler';
|
|
21
|
+
import { useConnectionHandler } from '../../handler/useConnectionHandler';
|
|
14
22
|
import type { UseOpenChannelMessages, UseOpenChannelMessagesOptions } from '../../types';
|
|
15
|
-
import {
|
|
23
|
+
import { useChannelMessagesReducer } from '../useChannelMessagesReducer';
|
|
16
24
|
|
|
17
25
|
const createMessageQuery = (channel: SendbirdOpenChannel, creator?: UseOpenChannelMessagesOptions['queryCreator']) => {
|
|
18
26
|
if (creator) return creator();
|
|
@@ -31,15 +39,14 @@ export const useOpenChannelMessagesWithQuery: UseOpenChannelMessages = (sdk, cha
|
|
|
31
39
|
loading,
|
|
32
40
|
refreshing,
|
|
33
41
|
messages,
|
|
34
|
-
|
|
35
|
-
newMessagesFromMembers,
|
|
42
|
+
newMessages,
|
|
36
43
|
updateMessages,
|
|
37
|
-
|
|
38
|
-
|
|
44
|
+
updateNewMessages,
|
|
45
|
+
deleteNewMessages,
|
|
39
46
|
deleteMessages,
|
|
40
47
|
updateLoading,
|
|
41
48
|
updateRefreshing,
|
|
42
|
-
} =
|
|
49
|
+
} = useChannelMessagesReducer(options?.sortComparator);
|
|
43
50
|
|
|
44
51
|
const init = useFreshCallback(async (uid?: string) => {
|
|
45
52
|
if (uid) {
|
|
@@ -49,7 +56,7 @@ export const useOpenChannelMessagesWithQuery: UseOpenChannelMessages = (sdk, cha
|
|
|
49
56
|
|
|
50
57
|
updateMessages(list, true, sdk.currentUser.userId);
|
|
51
58
|
}
|
|
52
|
-
|
|
59
|
+
updateNewMessages([], true, sdk.currentUser.userId);
|
|
53
60
|
}
|
|
54
61
|
});
|
|
55
62
|
|
|
@@ -59,6 +66,99 @@ export const useOpenChannelMessagesWithQuery: UseOpenChannelMessages = (sdk, cha
|
|
|
59
66
|
}
|
|
60
67
|
};
|
|
61
68
|
|
|
69
|
+
useConnectionHandler(sdk, handlerId, {
|
|
70
|
+
async onReconnectSucceeded() {
|
|
71
|
+
const lastMessage = messages[0];
|
|
72
|
+
if (!lastMessage) return;
|
|
73
|
+
|
|
74
|
+
const messageContext = {
|
|
75
|
+
updatedMessages: [] as SendbirdBaseMessage[],
|
|
76
|
+
addedMessages: [] as SendbirdBaseMessage[],
|
|
77
|
+
deletedMessageIds: [] as number[],
|
|
78
|
+
};
|
|
79
|
+
const changeLogsContext = {
|
|
80
|
+
hasMore: false,
|
|
81
|
+
token: '',
|
|
82
|
+
};
|
|
83
|
+
const messageQueryContext = {
|
|
84
|
+
hasMore: false,
|
|
85
|
+
timestamp: lastMessage.createdAt,
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
// Updated & Deleted messages
|
|
89
|
+
const changelogsParams = {
|
|
90
|
+
replyType: queryRef.current?.replyType,
|
|
91
|
+
includeMetaArray: queryRef.current?.includeMetaArray,
|
|
92
|
+
includeReactions: queryRef.current?.includeReactions,
|
|
93
|
+
includeThreadInfo: queryRef.current?.includeThreadInfo,
|
|
94
|
+
includeParentMessageInfo: queryRef.current?.includeParentMessageInfo,
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const changeLogsByTS = await channel.getMessageChangeLogsSinceTimestamp(lastMessage.createdAt);
|
|
98
|
+
changeLogsContext.token = changeLogsByTS.token;
|
|
99
|
+
changeLogsContext.hasMore = changeLogsByTS.hasMore;
|
|
100
|
+
messageContext.updatedMessages.push(...changeLogsByTS.updatedMessages);
|
|
101
|
+
messageContext.deletedMessageIds.push(...changeLogsByTS.deletedMessageIds);
|
|
102
|
+
|
|
103
|
+
while (changeLogsContext.hasMore) {
|
|
104
|
+
const changeLogsByToken = await channel.getMessageChangeLogsSinceToken(changeLogsByTS.token, changelogsParams);
|
|
105
|
+
changeLogsContext.token = changeLogsByToken.token;
|
|
106
|
+
changeLogsContext.hasMore = changeLogsByToken.hasMore;
|
|
107
|
+
messageContext.updatedMessages.push(...changeLogsByToken.updatedMessages);
|
|
108
|
+
messageContext.deletedMessageIds.push(...changeLogsByToken.deletedMessageIds);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Added messages
|
|
112
|
+
const messageQueryParams = {
|
|
113
|
+
prevResultSize: 0,
|
|
114
|
+
nextResultSize: queryRef.current?.limit ?? 100,
|
|
115
|
+
reverse: queryRef.current?.reverse,
|
|
116
|
+
includeParentMessageInfo: queryRef.current?.includeParentMessageInfo,
|
|
117
|
+
includeThreadInfo: queryRef.current?.includeThreadInfo,
|
|
118
|
+
includeReactions: queryRef.current?.includeReactions,
|
|
119
|
+
includeMetaArray: queryRef.current?.includeMetaArray,
|
|
120
|
+
replyType: queryRef.current?.replyType,
|
|
121
|
+
customTypesFilter: queryRef.current?.customTypesFilter,
|
|
122
|
+
messageTypeFilter: queryRef.current?.messageTypeFilter,
|
|
123
|
+
senderUserIdsFilter: queryRef.current?.senderUserIdsFilter,
|
|
124
|
+
showSubchannelMessagesOnly: queryRef.current?.showSubchannelMessagesOnly,
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
const queriedMessages = await channel.getMessagesByTimestamp(lastMessage.createdAt, messageQueryParams);
|
|
128
|
+
messageQueryContext.hasMore = queriedMessages.length > 0;
|
|
129
|
+
if (messageQueryContext.hasMore) {
|
|
130
|
+
messageQueryContext.timestamp = queriedMessages[0].createdAt;
|
|
131
|
+
messageContext.addedMessages.unshift(...queriedMessages);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
while (messageQueryContext.hasMore) {
|
|
135
|
+
const queriedMessages = await channel.getMessagesByTimestamp(messageQueryContext.timestamp, messageQueryParams);
|
|
136
|
+
messageQueryContext.hasMore = queriedMessages.length > 0;
|
|
137
|
+
if (messageQueryContext.hasMore) {
|
|
138
|
+
messageQueryContext.timestamp = queriedMessages[0].createdAt;
|
|
139
|
+
messageContext.addedMessages.unshift(...queriedMessages);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Update to View
|
|
144
|
+
updateMessages(
|
|
145
|
+
[...messageContext.addedMessages, ...messageContext.updatedMessages],
|
|
146
|
+
false,
|
|
147
|
+
sdk.currentUser.userId,
|
|
148
|
+
);
|
|
149
|
+
deleteMessages(messageContext.deletedMessageIds, []);
|
|
150
|
+
|
|
151
|
+
if (messageContext.addedMessages.length > 0) {
|
|
152
|
+
if (options?.shouldCountNewMessages?.()) {
|
|
153
|
+
updateNewMessages(messageContext.addedMessages, false, sdk.currentUser.userId);
|
|
154
|
+
}
|
|
155
|
+
if (options?.onMessagesReceived) {
|
|
156
|
+
options.onMessagesReceived(messageContext.addedMessages);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
|
|
62
162
|
useChannelHandler(
|
|
63
163
|
sdk,
|
|
64
164
|
handlerId,
|
|
@@ -66,16 +166,26 @@ export const useOpenChannelMessagesWithQuery: UseOpenChannelMessages = (sdk, cha
|
|
|
66
166
|
// Messages
|
|
67
167
|
onMessageReceived(eventChannel, message) {
|
|
68
168
|
if (isDifferentChannel(channel, eventChannel)) return;
|
|
69
|
-
|
|
169
|
+
if (isMyMessage(message, sdk.currentUser.userId)) return;
|
|
170
|
+
|
|
171
|
+
updateMessages([message], false, sdk.currentUser.userId);
|
|
172
|
+
if (options?.shouldCountNewMessages?.()) {
|
|
173
|
+
updateNewMessages([message], false, sdk.currentUser.userId);
|
|
174
|
+
}
|
|
175
|
+
if (options?.onMessagesReceived) {
|
|
176
|
+
options.onMessagesReceived([message]);
|
|
177
|
+
}
|
|
70
178
|
},
|
|
71
179
|
onMessageUpdated(eventChannel, message) {
|
|
72
180
|
if (isDifferentChannel(channel, eventChannel)) return;
|
|
181
|
+
if (isMyMessage(message, sdk.currentUser.userId)) return;
|
|
182
|
+
|
|
73
183
|
updateMessages([message], false, sdk.currentUser.userId);
|
|
74
184
|
},
|
|
75
185
|
onMessageDeleted(eventChannel, messageId) {
|
|
76
186
|
if (isDifferentChannel(channel, eventChannel)) return;
|
|
77
187
|
deleteMessages([messageId], []);
|
|
78
|
-
|
|
188
|
+
deleteNewMessages([messageId], []);
|
|
79
189
|
},
|
|
80
190
|
// Channels
|
|
81
191
|
onChannelChanged: channelUpdater,
|
|
@@ -138,13 +248,12 @@ export const useOpenChannelMessagesWithQuery: UseOpenChannelMessages = (sdk, cha
|
|
|
138
248
|
updateMessages(list, false, sdk.currentUser.userId);
|
|
139
249
|
}
|
|
140
250
|
});
|
|
251
|
+
const hasPrev: ReturnType<UseOpenChannelMessages>['hasPrev'] = useFreshCallback(
|
|
252
|
+
() => queryRef.current?.hasNext ?? false,
|
|
253
|
+
);
|
|
141
254
|
|
|
142
|
-
const next: ReturnType<UseOpenChannelMessages>['next'] = useFreshCallback(
|
|
143
|
-
|
|
144
|
-
updateMessages(nextMessages, false, sdk.currentUser.userId);
|
|
145
|
-
updateNextMessages([], true, sdk.currentUser.userId);
|
|
146
|
-
}
|
|
147
|
-
});
|
|
255
|
+
const next: ReturnType<UseOpenChannelMessages>['next'] = useFreshCallback(ASYNC_NOOP);
|
|
256
|
+
const hasNext: ReturnType<UseOpenChannelMessages>['hasNext'] = useFreshCallback(() => false);
|
|
148
257
|
|
|
149
258
|
const sendUserMessage: ReturnType<UseOpenChannelMessages>['sendUserMessage'] = useFreshCallback(
|
|
150
259
|
(params, onPending) => {
|
|
@@ -153,18 +262,18 @@ export const useOpenChannelMessagesWithQuery: UseOpenChannelMessages = (sdk, cha
|
|
|
153
262
|
.sendUserMessage(params)
|
|
154
263
|
.onPending((pendingMessage) => {
|
|
155
264
|
if (pendingMessage.isUserMessage()) {
|
|
156
|
-
|
|
265
|
+
updateMessages([pendingMessage], false, sdk.currentUser.userId);
|
|
157
266
|
onPending?.(pendingMessage);
|
|
158
267
|
}
|
|
159
268
|
})
|
|
160
269
|
.onSucceeded((sentMessage) => {
|
|
161
270
|
if (sentMessage.isUserMessage()) {
|
|
162
|
-
|
|
271
|
+
updateMessages([sentMessage], false, sdk.currentUser.userId);
|
|
163
272
|
resolve(sentMessage);
|
|
164
273
|
}
|
|
165
274
|
})
|
|
166
275
|
.onFailed((err, sentMessage) => {
|
|
167
|
-
|
|
276
|
+
updateMessages([sentMessage], false, sdk.currentUser.userId);
|
|
168
277
|
reject(err);
|
|
169
278
|
});
|
|
170
279
|
});
|
|
@@ -178,18 +287,18 @@ export const useOpenChannelMessagesWithQuery: UseOpenChannelMessages = (sdk, cha
|
|
|
178
287
|
.sendFileMessage(params)
|
|
179
288
|
.onPending((pendingMessage) => {
|
|
180
289
|
if (pendingMessage.isFileMessage()) {
|
|
181
|
-
|
|
290
|
+
updateMessages([pendingMessage], false, sdk.currentUser.userId);
|
|
182
291
|
onPending?.(pendingMessage);
|
|
183
292
|
}
|
|
184
293
|
})
|
|
185
294
|
.onSucceeded((sentMessage) => {
|
|
186
295
|
if (sentMessage.isFileMessage()) {
|
|
187
|
-
|
|
296
|
+
updateMessages([sentMessage], false, sdk.currentUser.userId);
|
|
188
297
|
resolve(sentMessage);
|
|
189
298
|
}
|
|
190
299
|
})
|
|
191
300
|
.onFailed((err, sentMessage) => {
|
|
192
|
-
|
|
301
|
+
updateMessages([sentMessage], false, sdk.currentUser.userId);
|
|
193
302
|
reject(err);
|
|
194
303
|
});
|
|
195
304
|
});
|
|
@@ -217,7 +326,7 @@ export const useOpenChannelMessagesWithQuery: UseOpenChannelMessages = (sdk, cha
|
|
|
217
326
|
return null;
|
|
218
327
|
})();
|
|
219
328
|
|
|
220
|
-
if (message)
|
|
329
|
+
if (message) updateMessages([message], false, sdk.currentUser.userId);
|
|
221
330
|
});
|
|
222
331
|
const deleteMessage: ReturnType<UseOpenChannelMessages>['deleteMessage'] = useFreshCallback(async (message) => {
|
|
223
332
|
if (message.sendingStatus === 'succeeded') {
|
|
@@ -227,21 +336,29 @@ export const useOpenChannelMessagesWithQuery: UseOpenChannelMessages = (sdk, cha
|
|
|
227
336
|
deleteMessages([message.messageId], [message.reqId]);
|
|
228
337
|
}
|
|
229
338
|
});
|
|
339
|
+
const resetNewMessages: ReturnType<UseOpenChannelMessages>['resetNewMessages'] = useFreshCallback(() => {
|
|
340
|
+
updateNewMessages([], true, sdk.currentUser.userId);
|
|
341
|
+
});
|
|
230
342
|
|
|
231
343
|
return {
|
|
232
344
|
loading,
|
|
233
345
|
refreshing,
|
|
234
346
|
refresh,
|
|
235
347
|
messages,
|
|
236
|
-
|
|
237
|
-
newMessagesFromMembers,
|
|
348
|
+
newMessages,
|
|
238
349
|
next,
|
|
350
|
+
hasNext,
|
|
239
351
|
prev,
|
|
352
|
+
hasPrev,
|
|
240
353
|
sendUserMessage,
|
|
241
354
|
sendFileMessage,
|
|
242
355
|
updateUserMessage,
|
|
243
356
|
updateFileMessage,
|
|
244
357
|
resendMessage,
|
|
245
358
|
deleteMessage,
|
|
359
|
+
resetNewMessages,
|
|
360
|
+
|
|
361
|
+
nextMessages: newMessages,
|
|
362
|
+
newMessagesFromMembers: newMessages,
|
|
246
363
|
};
|
|
247
364
|
};
|
|
@@ -85,7 +85,7 @@ export const useUserList = <
|
|
|
85
85
|
if (query.current?.hasNext) {
|
|
86
86
|
const users = await query.current?.next().catch((e) => {
|
|
87
87
|
Logger.error(e);
|
|
88
|
-
if (e.code === SBErrorCode.
|
|
88
|
+
if (e.code === SBErrorCode.UNAUTHORIZED_REQUEST) Logger.warn(SBErrorMessage.ACL);
|
|
89
89
|
throw e;
|
|
90
90
|
});
|
|
91
91
|
updateUsers(users, true);
|
|
@@ -122,7 +122,7 @@ export const useUserList = <
|
|
|
122
122
|
if (query.current && query.current?.hasNext) {
|
|
123
123
|
const nextUsers = await query.current.next().catch((e) => {
|
|
124
124
|
Logger.error(e);
|
|
125
|
-
if (e.code === SBErrorCode.
|
|
125
|
+
if (e.code === SBErrorCode.UNAUTHORIZED_REQUEST) Logger.warn(SBErrorMessage.ACL);
|
|
126
126
|
throw e;
|
|
127
127
|
});
|
|
128
128
|
updateUsers(nextUsers, false);
|
package/src/types.ts
CHANGED
|
@@ -74,9 +74,9 @@ export type UseGroupChannelListOptions = {
|
|
|
74
74
|
/**
|
|
75
75
|
* @interface UseGroupChannelMessages
|
|
76
76
|
* @description interface for group channel messages hook
|
|
77
|
-
* - Receive new messages from other users -> append to state(
|
|
77
|
+
* - Receive new messages from other users & should count new messages -> append to state(newMessages)
|
|
78
78
|
* - onTopReached -> prev() -> fetch prev messages and append to state(messages)
|
|
79
|
-
* - onBottomReached -> next() ->
|
|
79
|
+
* - onBottomReached -> next() -> fetch next messages and append to state(messages)
|
|
80
80
|
* */
|
|
81
81
|
export interface UseGroupChannelMessages {
|
|
82
82
|
(sdk: SendbirdChatSDK, channel: SendbirdGroupChannel, userId?: string, options?: UseGroupChannelMessagesOptions): {
|
|
@@ -111,26 +111,40 @@ export interface UseGroupChannelMessages {
|
|
|
111
111
|
prev: () => Promise<void>;
|
|
112
112
|
|
|
113
113
|
/**
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
* for this case, new messages will be included here.
|
|
114
|
+
* Check if there are more prev messages to fetch
|
|
115
|
+
* @return {boolean}
|
|
117
116
|
* */
|
|
118
|
-
|
|
117
|
+
hasPrev: () => boolean;
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Fetch next messages to state
|
|
121
|
+
* @return {Promise<void>}
|
|
122
|
+
* */
|
|
123
|
+
next: () => Promise<void>;
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Check if there are more next messages to fetch
|
|
127
|
+
* @return {boolean}
|
|
128
|
+
* */
|
|
129
|
+
hasNext: () => boolean;
|
|
119
130
|
|
|
120
131
|
/**
|
|
121
|
-
* Get new messages from nextMessages
|
|
122
132
|
* A new message means a message that meets the below conditions
|
|
123
133
|
* - Not admin message
|
|
124
134
|
* - Not updated message
|
|
125
135
|
* - Not current user's message
|
|
126
136
|
* */
|
|
127
|
-
|
|
137
|
+
newMessages: SendbirdMessage[];
|
|
128
138
|
|
|
129
139
|
/**
|
|
130
|
-
*
|
|
131
|
-
* @return {Promise<void>}
|
|
140
|
+
* reset message list with starting point
|
|
132
141
|
* */
|
|
133
|
-
|
|
142
|
+
resetWithStartingPoint: (startingPoint: number, callback?: () => void) => void;
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Reset new messages
|
|
146
|
+
* */
|
|
147
|
+
resetNewMessages: () => void;
|
|
134
148
|
|
|
135
149
|
/**
|
|
136
150
|
* Send file message
|
|
@@ -183,15 +197,23 @@ export interface UseGroupChannelMessages {
|
|
|
183
197
|
* @return {Promise<void>}
|
|
184
198
|
* */
|
|
185
199
|
deleteMessage: (message: SendbirdFileMessage | SendbirdUserMessage) => Promise<void>;
|
|
200
|
+
|
|
201
|
+
/** @deprecated Please use `newMessages` instead **/
|
|
202
|
+
newMessagesFromMembers: SendbirdMessage[];
|
|
203
|
+
/** @deprecated Please use `newMessages` instead **/
|
|
204
|
+
nextMessages: SendbirdMessage[];
|
|
186
205
|
};
|
|
187
206
|
}
|
|
188
207
|
|
|
189
208
|
export type UseGroupChannelMessagesOptions = {
|
|
190
209
|
sortComparator?: (a: SendbirdMessage, b: SendbirdMessage) => number;
|
|
191
210
|
queryCreator?: () => SendbirdPreviousMessageListQuery;
|
|
192
|
-
collectionCreator?: () => SendbirdMessageCollection;
|
|
211
|
+
collectionCreator?: (options?: Pick<UseGroupChannelMessagesOptions, 'startingPoint'>) => SendbirdMessageCollection;
|
|
193
212
|
enableCollectionWithoutLocalCache?: boolean;
|
|
194
213
|
onChannelDeleted?: () => void;
|
|
214
|
+
shouldCountNewMessages?: () => boolean;
|
|
215
|
+
startingPoint?: number;
|
|
216
|
+
onMessagesReceived?: (messages: SendbirdMessage[]) => void;
|
|
195
217
|
};
|
|
196
218
|
|
|
197
219
|
/**
|
|
@@ -240,9 +262,9 @@ export type UseOpenChannelListOptions = {
|
|
|
240
262
|
/**
|
|
241
263
|
* @interface UseOpenChannelMessages
|
|
242
264
|
* @description interface for open channel messages hook
|
|
243
|
-
* - Receive new messages from other users -> append to state(
|
|
265
|
+
* - Receive new messages from other users & should count new messages -> append to state(newMessages)
|
|
244
266
|
* - onTopReached -> prev() -> fetch prev messages and append to state(messages)
|
|
245
|
-
* - onBottomReached ->
|
|
267
|
+
* - onBottomReached -> noop
|
|
246
268
|
* */
|
|
247
269
|
export interface UseOpenChannelMessages {
|
|
248
270
|
(sdk: SendbirdChatSDK, channel: SendbirdOpenChannel, userId?: string, options?: UseOpenChannelMessagesOptions): {
|
|
@@ -277,20 +299,23 @@ export interface UseOpenChannelMessages {
|
|
|
277
299
|
prev: () => Promise<void>;
|
|
278
300
|
|
|
279
301
|
/**
|
|
280
|
-
*
|
|
281
|
-
*
|
|
282
|
-
* for this case, new messages will be included here.
|
|
302
|
+
* Check if there are more prev messages to fetch
|
|
303
|
+
* @return {boolean}
|
|
283
304
|
* */
|
|
284
|
-
|
|
305
|
+
hasPrev: () => boolean;
|
|
285
306
|
|
|
286
307
|
/**
|
|
287
|
-
* Get new messages from nextMessages
|
|
288
308
|
* A new message means a message that meets the below conditions
|
|
289
309
|
* - Not admin message
|
|
290
310
|
* - Not updated message
|
|
291
311
|
* - Not current user's message
|
|
292
312
|
* */
|
|
293
|
-
|
|
313
|
+
newMessages: SendbirdMessage[];
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Reset new messages
|
|
317
|
+
* */
|
|
318
|
+
resetNewMessages: () => void;
|
|
294
319
|
|
|
295
320
|
/**
|
|
296
321
|
* Fetch next messages to state
|
|
@@ -298,6 +323,12 @@ export interface UseOpenChannelMessages {
|
|
|
298
323
|
* */
|
|
299
324
|
next: () => Promise<void>;
|
|
300
325
|
|
|
326
|
+
/**
|
|
327
|
+
* Check if there are more next messages to fetch
|
|
328
|
+
* @return {boolean}
|
|
329
|
+
* */
|
|
330
|
+
hasNext: () => boolean;
|
|
331
|
+
|
|
301
332
|
/**
|
|
302
333
|
* Send file message
|
|
303
334
|
* @param params file message params
|
|
@@ -349,6 +380,11 @@ export interface UseOpenChannelMessages {
|
|
|
349
380
|
* @return {Promise<void>}
|
|
350
381
|
* */
|
|
351
382
|
deleteMessage: (message: SendbirdFileMessage | SendbirdUserMessage) => Promise<void>;
|
|
383
|
+
|
|
384
|
+
/** @deprecated Please use `newMessages` instead **/
|
|
385
|
+
newMessagesFromMembers: SendbirdMessage[];
|
|
386
|
+
/** @deprecated Please use `newMessages` instead **/
|
|
387
|
+
nextMessages: SendbirdMessage[];
|
|
352
388
|
};
|
|
353
389
|
}
|
|
354
390
|
|
|
@@ -357,6 +393,8 @@ export type UseOpenChannelMessagesOptions = {
|
|
|
357
393
|
queryCreator?: () => SendbirdPreviousMessageListQuery;
|
|
358
394
|
onChannelDeleted?: () => void;
|
|
359
395
|
onError?: (error?: unknown) => void;
|
|
396
|
+
shouldCountNewMessages?: () => boolean;
|
|
397
|
+
onMessagesReceived?: (messages: SendbirdMessage[]) => void;
|
|
360
398
|
};
|
|
361
399
|
|
|
362
400
|
/**
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["_react","require","_uikitUtils","defaultReducer","_ref","action","draft","type","value","status","key","receivedMessagesAsMap","arrayToMapWithGetter","messages","getMessageUniqId","clearBeforeAction","filter","m","isFileMessage","isUserMessage","Boolean","reqId","sendingStatus","isMyMessage","currentUserId","forEach","messageIds","msgId","reqIds","useGroupChannelMessagesReducer","userId","sortComparator","loading","refreshing","messageMap","nextMessageMap","dispatch","useReducer","updateMessages","deleteMessages","updateNextMessages","deleteNextMessages","updateLoading","updateRefreshing","useIIFE","Object","values","sort","nextMessages","newMessagesFromMembers","msg","isNewMessage","exports"],"sources":["reducer.ts"],"sourcesContent":["import { useReducer } from 'react';\n\nimport type { SendbirdBaseMessage, SendbirdFileMessage, SendbirdUserMessage } from '@sendbird/uikit-utils';\nimport { arrayToMapWithGetter, getMessageUniqId, isMyMessage, isNewMessage, useIIFE } from '@sendbird/uikit-utils';\n\nimport type { UseGroupChannelMessagesOptions } from '../../types';\n\ntype Action =\n | {\n type: 'update_loading' | 'update_refreshing';\n value: { status: boolean };\n }\n | {\n type: 'update_messages' | 'update_next_messages';\n value: { messages: SendbirdBaseMessage[]; clearBeforeAction: boolean; currentUserId?: string };\n }\n | {\n type: 'delete_messages' | 'delete_next_messages';\n value: { messageIds: number[]; reqIds: string[] };\n };\n\ntype State = {\n loading: boolean;\n refreshing: boolean;\n messageMap: Record<string, SendbirdBaseMessage>;\n nextMessageMap: Record<string, SendbirdBaseMessage>;\n};\n\nconst defaultReducer = ({ ...draft }: State, action: Action) => {\n switch (action.type) {\n case 'update_refreshing': {\n draft['refreshing'] = action.value.status;\n return draft;\n }\n case 'update_loading': {\n draft['loading'] = action.value.status;\n return draft;\n }\n case 'update_messages':\n case 'update_next_messages': {\n const key = action.type === 'update_messages' ? 'messageMap' : 'nextMessageMap';\n const receivedMessagesAsMap = arrayToMapWithGetter(action.value.messages, getMessageUniqId);\n if (action.value.clearBeforeAction) {\n draft[key] = receivedMessagesAsMap;\n } else {\n draft[key] = { ...draft[key], ...receivedMessagesAsMap };\n\n // NOTE: Replace pending message to succeeded message\n action.value.messages\n .filter((m): m is SendbirdUserMessage | SendbirdFileMessage => {\n return (\n (m.isFileMessage() || m.isUserMessage()) &&\n Boolean(draft[key][m.reqId]) &&\n m.sendingStatus === 'succeeded' &&\n isMyMessage(m, action.value.currentUserId)\n );\n })\n .forEach((m) => delete draft[key][m.reqId]);\n }\n\n return draft;\n }\n case 'delete_messages':\n case 'delete_next_messages': {\n const key = action.type === 'delete_messages' ? 'messageMap' : 'nextMessageMap';\n draft[key] = { ...draft[key] };\n action.value.messageIds.forEach((msgId) => delete draft[key][msgId]);\n action.value.reqIds.forEach((reqId) => delete draft[key][reqId]);\n\n return draft;\n }\n }\n};\n\nexport const useGroupChannelMessagesReducer = (\n userId?: string,\n sortComparator?: UseGroupChannelMessagesOptions['sortComparator'],\n) => {\n const [{ loading, refreshing, messageMap, nextMessageMap }, dispatch] = useReducer(defaultReducer, {\n loading: true,\n refreshing: false,\n messageMap: {},\n nextMessageMap: {},\n });\n\n const updateMessages = (messages: SendbirdBaseMessage[], clearBeforeAction: boolean, currentUserId?: string) => {\n dispatch({ type: 'update_messages', value: { messages, clearBeforeAction, currentUserId } });\n };\n const deleteMessages = (messageIds: number[], reqIds: string[]) => {\n dispatch({ type: 'delete_messages', value: { messageIds, reqIds } });\n };\n const updateNextMessages = (messages: SendbirdBaseMessage[], clearBeforeAction: boolean, currentUserId?: string) => {\n dispatch({ type: 'update_next_messages', value: { messages, clearBeforeAction, currentUserId } });\n };\n const deleteNextMessages = (messageIds: number[], reqIds: string[]) => {\n dispatch({ type: 'delete_next_messages', value: { messageIds, reqIds } });\n };\n const updateLoading = (status: boolean) => {\n dispatch({ type: 'update_loading', value: { status } });\n };\n const updateRefreshing = (status: boolean) => {\n dispatch({ type: 'update_refreshing', value: { status } });\n };\n\n const messages = useIIFE(() => {\n if (sortComparator) return Object.values(messageMap).sort(sortComparator);\n return Object.values(messageMap);\n });\n const nextMessages = Object.values(nextMessageMap);\n const newMessagesFromMembers = nextMessages.filter((msg) => isNewMessage(msg, userId));\n\n return {\n updateLoading,\n updateRefreshing,\n updateMessages,\n updateNextMessages,\n deleteMessages,\n deleteNextMessages,\n\n loading,\n refreshing,\n messages,\n nextMessages,\n newMessagesFromMembers,\n };\n};\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAGA,IAAAC,WAAA,GAAAD,OAAA;AAyBA,MAAME,cAAc,GAAGA,CAAAC,IAAA,EAAsBC,MAAc,KAAK;EAAA,IAAxC;IAAE,GAAGC;EAAa,CAAC,GAAAF,IAAA;EACzC,QAAQC,MAAM,CAACE,IAAI;IACjB,KAAK,mBAAmB;MAAE;QACxBD,KAAK,CAAC,YAAY,CAAC,GAAGD,MAAM,CAACG,KAAK,CAACC,MAAM;QACzC,OAAOH,KAAK;MACd;IACA,KAAK,gBAAgB;MAAE;QACrBA,KAAK,CAAC,SAAS,CAAC,GAAGD,MAAM,CAACG,KAAK,CAACC,MAAM;QACtC,OAAOH,KAAK;MACd;IACA,KAAK,iBAAiB;IACtB,KAAK,sBAAsB;MAAE;QAC3B,MAAMI,GAAG,GAAGL,MAAM,CAACE,IAAI,KAAK,iBAAiB,GAAG,YAAY,GAAG,gBAAgB;QAC/E,MAAMI,qBAAqB,GAAG,IAAAC,gCAAoB,EAACP,MAAM,CAACG,KAAK,CAACK,QAAQ,EAAEC,4BAAgB,CAAC;QAC3F,IAAIT,MAAM,CAACG,KAAK,CAACO,iBAAiB,EAAE;UAClCT,KAAK,CAACI,GAAG,CAAC,GAAGC,qBAAqB;QACpC,CAAC,MAAM;UACLL,KAAK,CAACI,GAAG,CAAC,GAAG;YAAE,GAAGJ,KAAK,CAACI,GAAG,CAAC;YAAE,GAAGC;UAAsB,CAAC;;UAExD;UACAN,MAAM,CAACG,KAAK,CAACK,QAAQ,CAClBG,MAAM,CAAEC,CAAC,IAAqD;YAC7D,OACE,CAACA,CAAC,CAACC,aAAa,EAAE,IAAID,CAAC,CAACE,aAAa,EAAE,KACvCC,OAAO,CAACd,KAAK,CAACI,GAAG,CAAC,CAACO,CAAC,CAACI,KAAK,CAAC,CAAC,IAC5BJ,CAAC,CAACK,aAAa,KAAK,WAAW,IAC/B,IAAAC,uBAAW,EAACN,CAAC,EAAEZ,MAAM,CAACG,KAAK,CAACgB,aAAa,CAAC;UAE9C,CAAC,CAAC,CACDC,OAAO,CAAER,CAAC,IAAK,OAAOX,KAAK,CAACI,GAAG,CAAC,CAACO,CAAC,CAACI,KAAK,CAAC,CAAC;QAC/C;QAEA,OAAOf,KAAK;MACd;IACA,KAAK,iBAAiB;IACtB,KAAK,sBAAsB;MAAE;QAC3B,MAAMI,GAAG,GAAGL,MAAM,CAACE,IAAI,KAAK,iBAAiB,GAAG,YAAY,GAAG,gBAAgB;QAC/ED,KAAK,CAACI,GAAG,CAAC,GAAG;UAAE,GAAGJ,KAAK,CAACI,GAAG;QAAE,CAAC;QAC9BL,MAAM,CAACG,KAAK,CAACkB,UAAU,CAACD,OAAO,CAAEE,KAAK,IAAK,OAAOrB,KAAK,CAACI,GAAG,CAAC,CAACiB,KAAK,CAAC,CAAC;QACpEtB,MAAM,CAACG,KAAK,CAACoB,MAAM,CAACH,OAAO,CAAEJ,KAAK,IAAK,OAAOf,KAAK,CAACI,GAAG,CAAC,CAACW,KAAK,CAAC,CAAC;QAEhE,OAAOf,KAAK;MACd;EAAC;AAEL,CAAC;AAEM,MAAMuB,8BAA8B,GAAGA,CAC5CC,MAAe,EACfC,cAAiE,KAC9D;EACH,MAAM,CAAC;IAAEC,OAAO;IAAEC,UAAU;IAAEC,UAAU;IAAEC;EAAe,CAAC,EAAEC,QAAQ,CAAC,GAAG,IAAAC,iBAAU,EAAClC,cAAc,EAAE;IACjG6B,OAAO,EAAE,IAAI;IACbC,UAAU,EAAE,KAAK;IACjBC,UAAU,EAAE,CAAC,CAAC;IACdC,cAAc,EAAE,CAAC;EACnB,CAAC,CAAC;EAEF,MAAMG,cAAc,GAAGA,CAACzB,QAA+B,EAAEE,iBAA0B,EAAES,aAAsB,KAAK;IAC9GY,QAAQ,CAAC;MAAE7B,IAAI,EAAE,iBAAiB;MAAEC,KAAK,EAAE;QAAEK,QAAQ;QAAEE,iBAAiB;QAAES;MAAc;IAAE,CAAC,CAAC;EAC9F,CAAC;EACD,MAAMe,cAAc,GAAGA,CAACb,UAAoB,EAAEE,MAAgB,KAAK;IACjEQ,QAAQ,CAAC;MAAE7B,IAAI,EAAE,iBAAiB;MAAEC,KAAK,EAAE;QAAEkB,UAAU;QAAEE;MAAO;IAAE,CAAC,CAAC;EACtE,CAAC;EACD,MAAMY,kBAAkB,GAAGA,CAAC3B,QAA+B,EAAEE,iBAA0B,EAAES,aAAsB,KAAK;IAClHY,QAAQ,CAAC;MAAE7B,IAAI,EAAE,sBAAsB;MAAEC,KAAK,EAAE;QAAEK,QAAQ;QAAEE,iBAAiB;QAAES;MAAc;IAAE,CAAC,CAAC;EACnG,CAAC;EACD,MAAMiB,kBAAkB,GAAGA,CAACf,UAAoB,EAAEE,MAAgB,KAAK;IACrEQ,QAAQ,CAAC;MAAE7B,IAAI,EAAE,sBAAsB;MAAEC,KAAK,EAAE;QAAEkB,UAAU;QAAEE;MAAO;IAAE,CAAC,CAAC;EAC3E,CAAC;EACD,MAAMc,aAAa,GAAIjC,MAAe,IAAK;IACzC2B,QAAQ,CAAC;MAAE7B,IAAI,EAAE,gBAAgB;MAAEC,KAAK,EAAE;QAAEC;MAAO;IAAE,CAAC,CAAC;EACzD,CAAC;EACD,MAAMkC,gBAAgB,GAAIlC,MAAe,IAAK;IAC5C2B,QAAQ,CAAC;MAAE7B,IAAI,EAAE,mBAAmB;MAAEC,KAAK,EAAE;QAAEC;MAAO;IAAE,CAAC,CAAC;EAC5D,CAAC;EAED,MAAMI,QAAQ,GAAG,IAAA+B,mBAAO,EAAC,MAAM;IAC7B,IAAIb,cAAc,EAAE,OAAOc,MAAM,CAACC,MAAM,CAACZ,UAAU,CAAC,CAACa,IAAI,CAAChB,cAAc,CAAC;IACzE,OAAOc,MAAM,CAACC,MAAM,CAACZ,UAAU,CAAC;EAClC,CAAC,CAAC;EACF,MAAMc,YAAY,GAAGH,MAAM,CAACC,MAAM,CAACX,cAAc,CAAC;EAClD,MAAMc,sBAAsB,GAAGD,YAAY,CAAChC,MAAM,CAAEkC,GAAG,IAAK,IAAAC,wBAAY,EAACD,GAAG,EAAEpB,MAAM,CAAC,CAAC;EAEtF,OAAO;IACLY,aAAa;IACbC,gBAAgB;IAChBL,cAAc;IACdE,kBAAkB;IAClBD,cAAc;IACdE,kBAAkB;IAElBT,OAAO;IACPC,UAAU;IACVpB,QAAQ;IACRmC,YAAY;IACZC;EACF,CAAC;AACH,CAAC;AAACG,OAAA,CAAAvB,8BAAA,GAAAA,8BAAA"}
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.useOpenChannelMessagesReducer = void 0;
|
|
7
|
-
var _react = require("react");
|
|
8
|
-
var _uikitUtils = require("@sendbird/uikit-utils");
|
|
9
|
-
const defaultReducer = (_ref, action) => {
|
|
10
|
-
let {
|
|
11
|
-
...draft
|
|
12
|
-
} = _ref;
|
|
13
|
-
switch (action.type) {
|
|
14
|
-
case 'update_refreshing':
|
|
15
|
-
{
|
|
16
|
-
draft['refreshing'] = action.value.status;
|
|
17
|
-
return draft;
|
|
18
|
-
}
|
|
19
|
-
case 'update_loading':
|
|
20
|
-
{
|
|
21
|
-
draft['loading'] = action.value.status;
|
|
22
|
-
return draft;
|
|
23
|
-
}
|
|
24
|
-
case 'update_messages':
|
|
25
|
-
case 'update_next_messages':
|
|
26
|
-
{
|
|
27
|
-
const key = action.type === 'update_messages' ? 'messageMap' : 'nextMessageMap';
|
|
28
|
-
const receivedMessagesAsMap = (0, _uikitUtils.arrayToMapWithGetter)(action.value.messages, _uikitUtils.getMessageUniqId);
|
|
29
|
-
if (action.value.clearBeforeAction) {
|
|
30
|
-
draft[key] = receivedMessagesAsMap;
|
|
31
|
-
} else {
|
|
32
|
-
draft[key] = {
|
|
33
|
-
...draft[key],
|
|
34
|
-
...receivedMessagesAsMap
|
|
35
|
-
};
|
|
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
|
-
}
|
|
42
|
-
return draft;
|
|
43
|
-
}
|
|
44
|
-
case 'delete_messages':
|
|
45
|
-
case 'delete_next_messages':
|
|
46
|
-
{
|
|
47
|
-
const key = action.type === 'delete_messages' ? 'messageMap' : 'nextMessageMap';
|
|
48
|
-
draft[key] = {
|
|
49
|
-
...draft[key]
|
|
50
|
-
};
|
|
51
|
-
action.value.messageIds.forEach(msgId => delete draft[key][msgId]);
|
|
52
|
-
action.value.reqIds.forEach(reqId => delete draft[key][reqId]);
|
|
53
|
-
return draft;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
const useOpenChannelMessagesReducer = (userId, sortComparator) => {
|
|
58
|
-
const [{
|
|
59
|
-
loading,
|
|
60
|
-
refreshing,
|
|
61
|
-
messageMap,
|
|
62
|
-
nextMessageMap
|
|
63
|
-
}, dispatch] = (0, _react.useReducer)(defaultReducer, {
|
|
64
|
-
loading: true,
|
|
65
|
-
refreshing: false,
|
|
66
|
-
messageMap: {},
|
|
67
|
-
nextMessageMap: {}
|
|
68
|
-
});
|
|
69
|
-
const updateMessages = (messages, clearBeforeAction, currentUserId) => {
|
|
70
|
-
dispatch({
|
|
71
|
-
type: 'update_messages',
|
|
72
|
-
value: {
|
|
73
|
-
messages,
|
|
74
|
-
clearBeforeAction,
|
|
75
|
-
currentUserId
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
};
|
|
79
|
-
const deleteMessages = (messageIds, reqIds) => {
|
|
80
|
-
dispatch({
|
|
81
|
-
type: 'delete_messages',
|
|
82
|
-
value: {
|
|
83
|
-
messageIds,
|
|
84
|
-
reqIds
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
};
|
|
88
|
-
const updateNextMessages = (messages, clearBeforeAction, currentUserId) => {
|
|
89
|
-
dispatch({
|
|
90
|
-
type: 'update_next_messages',
|
|
91
|
-
value: {
|
|
92
|
-
messages,
|
|
93
|
-
clearBeforeAction,
|
|
94
|
-
currentUserId
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
};
|
|
98
|
-
const deleteNextMessages = (messageIds, reqIds) => {
|
|
99
|
-
dispatch({
|
|
100
|
-
type: 'delete_next_messages',
|
|
101
|
-
value: {
|
|
102
|
-
messageIds,
|
|
103
|
-
reqIds
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
};
|
|
107
|
-
const updateLoading = status => {
|
|
108
|
-
dispatch({
|
|
109
|
-
type: 'update_loading',
|
|
110
|
-
value: {
|
|
111
|
-
status
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
};
|
|
115
|
-
const updateRefreshing = status => {
|
|
116
|
-
dispatch({
|
|
117
|
-
type: 'update_refreshing',
|
|
118
|
-
value: {
|
|
119
|
-
status
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
};
|
|
123
|
-
const messages = (0, _uikitUtils.useIIFE)(() => {
|
|
124
|
-
if (sortComparator) return Object.values(messageMap).sort(sortComparator);
|
|
125
|
-
return Object.values(messageMap);
|
|
126
|
-
});
|
|
127
|
-
const nextMessages = Object.values(nextMessageMap);
|
|
128
|
-
const newMessagesFromMembers = nextMessages.filter(msg => (0, _uikitUtils.isNewMessage)(msg, userId));
|
|
129
|
-
return {
|
|
130
|
-
updateLoading,
|
|
131
|
-
updateRefreshing,
|
|
132
|
-
updateMessages,
|
|
133
|
-
updateNextMessages,
|
|
134
|
-
deleteMessages,
|
|
135
|
-
deleteNextMessages,
|
|
136
|
-
loading,
|
|
137
|
-
refreshing,
|
|
138
|
-
messages,
|
|
139
|
-
nextMessages,
|
|
140
|
-
newMessagesFromMembers
|
|
141
|
-
};
|
|
142
|
-
};
|
|
143
|
-
exports.useOpenChannelMessagesReducer = useOpenChannelMessagesReducer;
|
|
144
|
-
//# sourceMappingURL=reducer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["_react","require","_uikitUtils","defaultReducer","_ref","action","draft","type","value","status","key","receivedMessagesAsMap","arrayToMapWithGetter","messages","getMessageUniqId","clearBeforeAction","filter","m","isFileMessage","isUserMessage","Boolean","reqId","sendingStatus","isMyMessage","currentUserId","forEach","messageIds","msgId","reqIds","useOpenChannelMessagesReducer","userId","sortComparator","loading","refreshing","messageMap","nextMessageMap","dispatch","useReducer","updateMessages","deleteMessages","updateNextMessages","deleteNextMessages","updateLoading","updateRefreshing","useIIFE","Object","values","sort","nextMessages","newMessagesFromMembers","msg","isNewMessage","exports"],"sources":["reducer.ts"],"sourcesContent":["import { useReducer } from 'react';\n\nimport type { SendbirdBaseMessage, SendbirdFileMessage, SendbirdUserMessage } from '@sendbird/uikit-utils';\nimport { arrayToMapWithGetter, getMessageUniqId, isMyMessage, isNewMessage, useIIFE } from '@sendbird/uikit-utils';\n\nimport type { UseOpenChannelMessagesOptions } from '../../types';\n\ntype Action =\n | {\n type: 'update_loading' | 'update_refreshing';\n value: { status: boolean };\n }\n | {\n type: 'update_messages' | 'update_next_messages';\n value: { messages: SendbirdBaseMessage[]; clearBeforeAction: boolean; currentUserId?: string };\n }\n | {\n type: 'delete_messages' | 'delete_next_messages';\n value: { messageIds: number[]; reqIds: string[] };\n };\n\ntype State = {\n loading: boolean;\n refreshing: boolean;\n messageMap: Record<string, SendbirdBaseMessage>;\n nextMessageMap: Record<string, SendbirdBaseMessage>;\n};\n\nconst defaultReducer = ({ ...draft }: State, action: Action) => {\n switch (action.type) {\n case 'update_refreshing': {\n draft['refreshing'] = action.value.status;\n return draft;\n }\n case 'update_loading': {\n draft['loading'] = action.value.status;\n return draft;\n }\n case 'update_messages':\n case 'update_next_messages': {\n const key = action.type === 'update_messages' ? 'messageMap' : 'nextMessageMap';\n const receivedMessagesAsMap = arrayToMapWithGetter(action.value.messages, getMessageUniqId);\n if (action.value.clearBeforeAction) {\n draft[key] = receivedMessagesAsMap;\n } else {\n draft[key] = { ...draft[key], ...receivedMessagesAsMap };\n\n // NOTE: Replace pending message to succeeded message\n action.value.messages\n .filter((m): m is SendbirdUserMessage | SendbirdFileMessage => {\n return (\n (m.isFileMessage() || m.isUserMessage()) &&\n Boolean(draft[key][m.reqId]) &&\n m.sendingStatus === 'succeeded' &&\n isMyMessage(m, action.value.currentUserId)\n );\n })\n .forEach((m) => delete draft[key][m.reqId]);\n }\n\n return draft;\n }\n case 'delete_messages':\n case 'delete_next_messages': {\n const key = action.type === 'delete_messages' ? 'messageMap' : 'nextMessageMap';\n draft[key] = { ...draft[key] };\n action.value.messageIds.forEach((msgId) => delete draft[key][msgId]);\n action.value.reqIds.forEach((reqId) => delete draft[key][reqId]);\n\n return draft;\n }\n }\n};\n\nexport const useOpenChannelMessagesReducer = (\n userId?: string,\n sortComparator?: UseOpenChannelMessagesOptions['sortComparator'],\n) => {\n const [{ loading, refreshing, messageMap, nextMessageMap }, dispatch] = useReducer(defaultReducer, {\n loading: true,\n refreshing: false,\n messageMap: {},\n nextMessageMap: {},\n });\n\n const updateMessages = (messages: SendbirdBaseMessage[], clearBeforeAction: boolean, currentUserId?: string) => {\n dispatch({ type: 'update_messages', value: { messages, clearBeforeAction, currentUserId } });\n };\n const deleteMessages = (messageIds: number[], reqIds: string[]) => {\n dispatch({ type: 'delete_messages', value: { messageIds, reqIds } });\n };\n const updateNextMessages = (messages: SendbirdBaseMessage[], clearBeforeAction: boolean, currentUserId?: string) => {\n dispatch({ type: 'update_next_messages', value: { messages, clearBeforeAction, currentUserId } });\n };\n const deleteNextMessages = (messageIds: number[], reqIds: string[]) => {\n dispatch({ type: 'delete_next_messages', value: { messageIds, reqIds } });\n };\n const updateLoading = (status: boolean) => {\n dispatch({ type: 'update_loading', value: { status } });\n };\n const updateRefreshing = (status: boolean) => {\n dispatch({ type: 'update_refreshing', value: { status } });\n };\n\n const messages = useIIFE(() => {\n if (sortComparator) return Object.values(messageMap).sort(sortComparator);\n return Object.values(messageMap);\n });\n const nextMessages = Object.values(nextMessageMap);\n const newMessagesFromMembers = nextMessages.filter((msg) => isNewMessage(msg, userId));\n\n return {\n updateLoading,\n updateRefreshing,\n updateMessages,\n updateNextMessages,\n deleteMessages,\n deleteNextMessages,\n\n loading,\n refreshing,\n messages,\n nextMessages,\n newMessagesFromMembers,\n };\n};\n"],"mappings":"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"}
|