@sendbird/uikit-chat-hooks 2.0.3 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/channel/useGroupChannel.js +33 -0
- package/lib/commonjs/channel/useGroupChannel.js.map +1 -0
- package/lib/commonjs/channel/useGroupChannelMessages/reducer.js +3 -3
- package/lib/commonjs/channel/useGroupChannelMessages/reducer.js.map +1 -1
- package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +75 -79
- package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
- package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +30 -41
- package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
- package/lib/commonjs/common/useAppFeatures.js +4 -4
- package/lib/commonjs/common/useAppFeatures.js.map +1 -1
- package/lib/commonjs/common/useMessageOutgoingStatus.js +1 -0
- package/lib/commonjs/common/useMessageOutgoingStatus.js.map +1 -1
- package/lib/commonjs/common/useTotalUnreadChannelCount.js +1 -1
- package/lib/commonjs/common/useTotalUnreadChannelCount.js.map +1 -1
- package/lib/commonjs/common/useTotalUnreadMessageCount.js +1 -1
- package/lib/commonjs/common/useTotalUnreadMessageCount.js.map +1 -1
- package/lib/commonjs/common/useUserList.js +33 -15
- package/lib/commonjs/common/useUserList.js.map +1 -1
- package/lib/commonjs/index.js +8 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/types.js.map +1 -1
- package/lib/module/channel/useGroupChannel.js +22 -0
- package/lib/module/channel/useGroupChannel.js.map +1 -0
- package/lib/module/channel/useGroupChannelMessages/reducer.js +3 -3
- package/lib/module/channel/useGroupChannelMessages/reducer.js.map +1 -1
- package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +76 -79
- package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
- package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +30 -40
- package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
- package/lib/module/common/useAppFeatures.js +4 -4
- package/lib/module/common/useAppFeatures.js.map +1 -1
- package/lib/module/common/useMessageOutgoingStatus.js +1 -0
- package/lib/module/common/useMessageOutgoingStatus.js.map +1 -1
- package/lib/module/common/useTotalUnreadChannelCount.js +2 -2
- package/lib/module/common/useTotalUnreadChannelCount.js.map +1 -1
- package/lib/module/common/useTotalUnreadMessageCount.js +2 -2
- package/lib/module/common/useTotalUnreadMessageCount.js.map +1 -1
- package/lib/module/common/useUserList.js +35 -17
- package/lib/module/common/useUserList.js.map +1 -1
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/types.js.map +1 -1
- package/lib/typescript/src/channel/useGroupChannel.d.ts +6 -0
- package/lib/typescript/src/channel/useGroupChannelList/reducer.d.ts +1 -1
- package/lib/typescript/src/common/useMessageOutgoingStatus.d.ts +1 -1
- package/lib/typescript/src/common/useTotalUnreadChannelCount.d.ts +1 -1
- package/lib/typescript/src/common/useTotalUnreadMessageCount.d.ts +1 -1
- package/lib/typescript/src/common/useUserList.d.ts +2 -2
- package/lib/typescript/src/index.d.ts +2 -1
- package/lib/typescript/src/model/CustomQuery.d.ts +1 -1
- package/lib/typescript/src/types.d.ts +13 -9
- package/package.json +4 -4
- package/src/channel/useGroupChannel.ts +21 -0
- package/src/channel/useGroupChannelMessages/reducer.ts +4 -4
- package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.ts +92 -86
- package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.ts +33 -37
- package/src/common/useAppFeatures.ts +4 -4
- package/src/common/useMessageOutgoingStatus.ts +2 -0
- package/src/common/useTotalUnreadChannelCount.ts +2 -2
- package/src/common/useTotalUnreadMessageCount.ts +2 -2
- package/src/common/useUserList.ts +46 -20
- package/src/index.ts +2 -1
- package/src/types.ts +13 -7
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
import { useAsyncEffect } from '@sendbird/uikit-utils';
|
|
3
|
+
export const useGroupChannel = (sdk, channelUrl) => {
|
|
4
|
+
const [channel, setChannel] = useState();
|
|
5
|
+
const [loading, setLoading] = useState(true);
|
|
6
|
+
const [error, setError] = useState();
|
|
7
|
+
useAsyncEffect(async () => {
|
|
8
|
+
try {
|
|
9
|
+
setChannel(await sdk.groupChannel.getChannel(channelUrl));
|
|
10
|
+
} catch (e) {
|
|
11
|
+
setError(e);
|
|
12
|
+
} finally {
|
|
13
|
+
setLoading(false);
|
|
14
|
+
}
|
|
15
|
+
}, []);
|
|
16
|
+
return {
|
|
17
|
+
channel,
|
|
18
|
+
loading,
|
|
19
|
+
error
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=useGroupChannel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useState","useAsyncEffect","useGroupChannel","sdk","channelUrl","channel","setChannel","loading","setLoading","error","setError","groupChannel","getChannel","e"],"sources":["useGroupChannel.ts"],"sourcesContent":["import { useState } from 'react';\n\nimport { SendbirdChatSDK, SendbirdGroupChannel, useAsyncEffect } from '@sendbird/uikit-utils';\n\nexport const useGroupChannel = (sdk: SendbirdChatSDK, channelUrl: string) => {\n const [channel, setChannel] = useState<SendbirdGroupChannel>();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<unknown>();\n\n useAsyncEffect(async () => {\n try {\n setChannel(await sdk.groupChannel.getChannel(channelUrl));\n } catch (e) {\n setError(e);\n } finally {\n setLoading(false);\n }\n }, []);\n\n return { channel, loading, error };\n};\n"],"mappings":"AAAA,SAASA,QAAT,QAAyB,OAAzB;AAEA,SAAgDC,cAAhD,QAAsE,uBAAtE;AAEA,OAAO,MAAMC,eAAe,GAAG,CAACC,GAAD,EAAuBC,UAAvB,KAA8C;EAC3E,MAAM,CAACC,OAAD,EAAUC,UAAV,IAAwBN,QAAQ,EAAtC;EACA,MAAM,CAACO,OAAD,EAAUC,UAAV,IAAwBR,QAAQ,CAAC,IAAD,CAAtC;EACA,MAAM,CAACS,KAAD,EAAQC,QAAR,IAAoBV,QAAQ,EAAlC;EAEAC,cAAc,CAAC,YAAY;IACzB,IAAI;MACFK,UAAU,CAAC,MAAMH,GAAG,CAACQ,YAAJ,CAAiBC,UAAjB,CAA4BR,UAA5B,CAAP,CAAV;IACD,CAFD,CAEE,OAAOS,CAAP,EAAU;MACVH,QAAQ,CAACG,CAAD,CAAR;IACD,CAJD,SAIU;MACRL,UAAU,CAAC,KAAD,CAAV;IACD;EACF,CARa,EAQX,EARW,CAAd;EAUA,OAAO;IAAEH,OAAF;IAAWE,OAAX;IAAoBE;EAApB,CAAP;AACD,CAhBM"}
|
|
@@ -18,13 +18,13 @@ const defaultReducer = (_ref, action) => {
|
|
|
18
18
|
case 'update_next_messages':
|
|
19
19
|
{
|
|
20
20
|
const key = action.type === 'update_messages' ? 'messageMap' : 'nextMessageMap';
|
|
21
|
-
const
|
|
21
|
+
const receivedMessagesAsMap = arrayToMapWithGetter(action.value.messages, getMessageUniqId);
|
|
22
22
|
|
|
23
23
|
if (action.value.clearPrev) {
|
|
24
|
-
draft[key] =
|
|
24
|
+
draft[key] = receivedMessagesAsMap;
|
|
25
25
|
} else {
|
|
26
26
|
draft[key] = { ...draft[key],
|
|
27
|
-
...
|
|
27
|
+
...receivedMessagesAsMap
|
|
28
28
|
}; // NOTE: Replace pending message to succeeded message
|
|
29
29
|
|
|
30
30
|
action.value.messages.filter(m => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useReducer","arrayToMapWithGetter","getMessageUniqId","isMyMessage","isNewMessage","useIIFE","defaultReducer","action","draft","type","key","value","status","
|
|
1
|
+
{"version":3,"names":["useReducer","arrayToMapWithGetter","getMessageUniqId","isMyMessage","isNewMessage","useIIFE","defaultReducer","action","draft","type","key","value","status","receivedMessagesAsMap","messages","clearPrev","filter","m","isFileMessage","isUserMessage","Boolean","reqId","sendingStatus","currentUserId","forEach","messageIds","msgId","reqIds","useGroupChannelMessagesReducer","userId","sortComparator","loading","refreshing","messageMap","nextMessageMap","dispatch","updateMessages","deleteMessages","updateNextMessages","deleteNextMessages","updateLoading","updateRefreshing","Object","values","sort","nextMessages","newMessagesFromMembers","msg"],"sources":["reducer.ts"],"sourcesContent":["import { useReducer } from 'react';\n\nimport type { SendbirdBaseMessage, SendbirdFileMessage, SendbirdUserMessage } from '@sendbird/uikit-utils';\nimport { arrayToMapWithGetter, getMessageUniqId, isMyMessage, isNewMessage, useIIFE } from '@sendbird/uikit-utils';\n\nimport type { UseGroupChannelMessagesOptions } from '../../types';\n\ntype Action =\n | {\n type: 'update_loading' | 'update_refreshing';\n value: { status: boolean };\n }\n | {\n type: 'update_messages' | 'update_next_messages';\n value: { messages: SendbirdBaseMessage[]; clearPrev: boolean; currentUserId?: string };\n }\n | {\n type: 'delete_messages' | 'delete_next_messages';\n value: { messageIds: number[]; reqIds: string[] };\n };\n\ntype State = {\n loading: boolean;\n refreshing: boolean;\n messageMap: Record<string, SendbirdBaseMessage>;\n nextMessageMap: Record<string, SendbirdBaseMessage>;\n};\n\nconst defaultReducer = ({ ...draft }: State, action: Action) => {\n switch (action.type) {\n case 'update_refreshing':\n case 'update_loading': {\n const key = action.type === 'update_loading' ? 'loading' : 'refreshing';\n draft[key] = action.value.status;\n\n return draft;\n }\n case 'update_messages':\n case 'update_next_messages': {\n const key = action.type === 'update_messages' ? 'messageMap' : 'nextMessageMap';\n const receivedMessagesAsMap = arrayToMapWithGetter(action.value.messages, getMessageUniqId);\n if (action.value.clearPrev) {\n draft[key] = receivedMessagesAsMap;\n } else {\n draft[key] = { ...draft[key], ...receivedMessagesAsMap };\n\n // NOTE: Replace pending message to succeeded message\n action.value.messages\n .filter((m): m is SendbirdUserMessage | SendbirdFileMessage => {\n return (\n (m.isFileMessage() || m.isUserMessage()) &&\n Boolean(draft[key][m.reqId]) &&\n m.sendingStatus === 'succeeded' &&\n isMyMessage(m, action.value.currentUserId)\n );\n })\n .forEach((m) => delete draft[key][m.reqId]);\n }\n\n if (action.type === 'update_messages') {\n draft['nextMessageMap'] = {};\n }\n\n return draft;\n }\n case 'delete_messages':\n case 'delete_next_messages': {\n const key = action.type === 'delete_messages' ? 'messageMap' : 'nextMessageMap';\n draft[key] = { ...draft[key] };\n action.value.messageIds.forEach((msgId) => delete draft[key][msgId]);\n action.value.reqIds.forEach((reqId) => delete draft[key][reqId]);\n\n return draft;\n }\n }\n};\n\nexport const useGroupChannelMessagesReducer = (\n userId?: string,\n sortComparator?: UseGroupChannelMessagesOptions['sortComparator'],\n) => {\n const [{ loading, refreshing, messageMap, nextMessageMap }, dispatch] = useReducer(defaultReducer, {\n loading: true,\n refreshing: false,\n messageMap: {},\n nextMessageMap: {},\n });\n\n const updateMessages = (messages: SendbirdBaseMessage[], clearPrev: boolean, currentUserId?: string) => {\n dispatch({ type: 'update_messages', value: { messages, clearPrev, currentUserId } });\n };\n const deleteMessages = (messageIds: number[], reqIds: string[]) => {\n dispatch({ type: 'delete_messages', value: { messageIds, reqIds } });\n };\n const updateNextMessages = (messages: SendbirdBaseMessage[], clearPrev: boolean, currentUserId?: string) => {\n dispatch({ type: 'update_next_messages', value: { messages, clearPrev, currentUserId } });\n };\n const deleteNextMessages = (messageIds: number[], reqIds: string[]) => {\n dispatch({ type: 'delete_next_messages', value: { messageIds, reqIds } });\n };\n const updateLoading = (status: boolean) => {\n dispatch({ type: 'update_loading', value: { status } });\n };\n const updateRefreshing = (status: boolean) => {\n dispatch({ type: 'update_refreshing', value: { status } });\n };\n\n const messages = useIIFE(() => {\n if (sortComparator) return Object.values(messageMap).sort(sortComparator);\n return Object.values(messageMap);\n });\n const nextMessages = Object.values(nextMessageMap);\n const newMessagesFromMembers = nextMessages.filter((msg) => isNewMessage(msg, userId));\n\n return {\n updateLoading,\n updateRefreshing,\n updateMessages,\n updateNextMessages,\n deleteMessages,\n deleteNextMessages,\n\n loading,\n refreshing,\n messages,\n nextMessages,\n newMessagesFromMembers,\n };\n};\n"],"mappings":"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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { useCallback, useEffect, useRef } from 'react';
|
|
2
2
|
import { MessageCollectionInitPolicy, MessageEventSource, MessageFilter } from '@sendbird/chat/groupChannel';
|
|
3
|
-
import { Logger, confirmAndMarkAsRead, isDifferentChannel, useForceUpdate } from '@sendbird/uikit-utils';
|
|
3
|
+
import { Logger, confirmAndMarkAsRead, isDifferentChannel, useForceUpdate, useFreshCallback } from '@sendbird/uikit-utils';
|
|
4
4
|
import { useChannelHandler } from '../../handler/useChannelHandler';
|
|
5
|
-
import { useActiveGroupChannel } from '../useActiveGroupChannel';
|
|
6
5
|
import { useGroupChannelMessagesReducer } from './reducer';
|
|
7
6
|
|
|
8
7
|
const createMessageCollection = (channel, creator) => {
|
|
@@ -16,13 +15,8 @@ const createMessageCollection = (channel, creator) => {
|
|
|
16
15
|
|
|
17
16
|
const HOOK_NAME = 'useGroupChannelMessagesWithCollection';
|
|
18
17
|
export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) => {
|
|
19
|
-
const collectionRef = useRef(); // NOTE: We cannot determine the channel object of Sendbird SDK is stale or not, so force update af
|
|
20
|
-
|
|
21
|
-
const {
|
|
22
|
-
activeChannel,
|
|
23
|
-
setActiveChannel
|
|
24
|
-
} = useActiveGroupChannel(sdk, channel);
|
|
25
18
|
const forceUpdate = useForceUpdate();
|
|
19
|
+
const collectionRef = useRef();
|
|
26
20
|
const {
|
|
27
21
|
loading,
|
|
28
22
|
refreshing,
|
|
@@ -37,17 +31,18 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
|
|
|
37
31
|
updateRefreshing
|
|
38
32
|
} = useGroupChannelMessagesReducer(userId, options === null || options === void 0 ? void 0 : options.sortComparator);
|
|
39
33
|
|
|
40
|
-
const
|
|
34
|
+
const channelMarkAsRead = async source => {
|
|
41
35
|
try {
|
|
42
|
-
|
|
36
|
+
switch (source) {
|
|
37
|
+
case MessageEventSource.EVENT_MESSAGE_RECEIVED:
|
|
38
|
+
case MessageEventSource.EVENT_MESSAGE_SENT_SUCCESS:
|
|
39
|
+
case MessageEventSource.SYNC_MESSAGE_FILL:
|
|
40
|
+
case undefined:
|
|
41
|
+
await confirmAndMarkAsRead([channel]);
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
43
44
|
} catch (e) {
|
|
44
|
-
Logger.warn(`[${HOOK_NAME}/
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
const updateChannel = channel => {
|
|
49
|
-
if (channel.isGroupChannel() && !isDifferentChannel(channel, activeChannel)) {
|
|
50
|
-
forceUpdate();
|
|
45
|
+
Logger.warn(`[${HOOK_NAME}/channelMarkAsRead]`, e);
|
|
51
46
|
}
|
|
52
47
|
};
|
|
53
48
|
|
|
@@ -59,38 +54,42 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
|
|
|
59
54
|
if (uid) {
|
|
60
55
|
var _collectionRef$curren2;
|
|
61
56
|
|
|
62
|
-
collectionRef.current = createMessageCollection(
|
|
57
|
+
collectionRef.current = createMessageCollection(channel, options === null || options === void 0 ? void 0 : options.collectionCreator);
|
|
63
58
|
updateNextMessages([], true, sdk.currentUser.userId);
|
|
64
|
-
|
|
59
|
+
channelMarkAsRead();
|
|
65
60
|
(_collectionRef$curren2 = collectionRef.current) === null || _collectionRef$curren2 === void 0 ? void 0 : _collectionRef$curren2.setMessageCollectionHandler({
|
|
66
61
|
onMessagesAdded: (_, __, messages) => {
|
|
67
|
-
|
|
68
|
-
case MessageEventSource.EVENT_MESSAGE_RECEIVED:
|
|
69
|
-
case MessageEventSource.EVENT_MESSAGE_SENT_SUCCESS:
|
|
70
|
-
case MessageEventSource.SYNC_MESSAGE_FILL:
|
|
71
|
-
channelMarkAs();
|
|
72
|
-
break;
|
|
73
|
-
}
|
|
74
|
-
|
|
62
|
+
channelMarkAsRead(_.source);
|
|
75
63
|
updateNextMessages(messages, false, sdk.currentUser.userId);
|
|
76
|
-
updateChannel(channel);
|
|
77
64
|
},
|
|
78
|
-
onMessagesUpdated: (_,
|
|
79
|
-
|
|
80
|
-
|
|
65
|
+
onMessagesUpdated: (_, __, messages) => {
|
|
66
|
+
channelMarkAsRead(_.source); // NOTE: admin message is not added via onMessagesAdded handler, not checked yet is this a bug.
|
|
67
|
+
|
|
68
|
+
if (_.source === MessageEventSource.EVENT_MESSAGE_RECEIVED) {
|
|
69
|
+
const nextMessageIds = nextMessages.map(it => it.messageId);
|
|
70
|
+
const nonAddedMessagesFromReceivedEvent = messages.filter(it => nextMessageIds.indexOf(it.messageId) === -1);
|
|
71
|
+
updateNextMessages(nonAddedMessagesFromReceivedEvent, false, sdk.currentUser.userId);
|
|
72
|
+
} // NOTE: v4 MESSAGE_RECEIVED is called twice from onMessagesAdded and onMessagesUpdated when receiving new message.
|
|
73
|
+
// This is not intended behavior but not bugs.
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
if (_.source !== MessageEventSource.EVENT_MESSAGE_RECEIVED) {
|
|
77
|
+
updateMessages(messages, false, sdk.currentUser.userId);
|
|
78
|
+
}
|
|
81
79
|
},
|
|
82
|
-
onMessagesDeleted: (_,
|
|
80
|
+
onMessagesDeleted: (_, __, messageIds) => {
|
|
83
81
|
deleteMessages(messageIds, []);
|
|
84
82
|
deleteNextMessages(messageIds, []);
|
|
85
|
-
updateChannel(channel);
|
|
86
83
|
},
|
|
87
84
|
onChannelDeleted: () => {
|
|
88
85
|
var _options$onChannelDel;
|
|
89
86
|
|
|
90
87
|
options === null || options === void 0 ? void 0 : (_options$onChannelDel = options.onChannelDeleted) === null || _options$onChannelDel === void 0 ? void 0 : _options$onChannelDel.call(options);
|
|
91
88
|
},
|
|
92
|
-
onChannelUpdated: (_,
|
|
93
|
-
|
|
89
|
+
onChannelUpdated: (_, eventChannel) => {
|
|
90
|
+
if (eventChannel.isGroupChannel() && !isDifferentChannel(eventChannel, channel)) {
|
|
91
|
+
forceUpdate();
|
|
92
|
+
}
|
|
94
93
|
},
|
|
95
94
|
onHugeGapDetected: () => {
|
|
96
95
|
init(uid);
|
|
@@ -104,8 +103,8 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
|
|
|
104
103
|
updateMessages(messages, true, sdk.currentUser.userId);
|
|
105
104
|
updateMessages(((_collectionRef$curren3 = collectionRef.current) === null || _collectionRef$curren3 === void 0 ? void 0 : _collectionRef$curren3.pendingMessages) ?? [], false, sdk.currentUser.userId);
|
|
106
105
|
updateMessages(((_collectionRef$curren4 = collectionRef.current) === null || _collectionRef$curren4 === void 0 ? void 0 : _collectionRef$curren4.failedMessages) ?? [], false, sdk.currentUser.userId);
|
|
107
|
-
if (messages !== null && messages !== void 0 && messages.length) callback === null || callback === void 0 ? void 0 : callback();
|
|
108
106
|
}
|
|
107
|
+
callback === null || callback === void 0 ? void 0 : callback();
|
|
109
108
|
}).onApiResult((err, messages) => {
|
|
110
109
|
if (err) Logger.warn(`[${HOOK_NAME}/onApiResult]`, err);else {
|
|
111
110
|
Logger.debug(`[${HOOK_NAME}/onApiResult]`, 'message length:', messages.length);
|
|
@@ -121,16 +120,15 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
|
|
|
121
120
|
callback === null || callback === void 0 ? void 0 : callback();
|
|
122
121
|
});
|
|
123
122
|
}
|
|
124
|
-
}, [sdk,
|
|
123
|
+
}, [sdk, channel.url, options === null || options === void 0 ? void 0 : options.collectionCreator]);
|
|
125
124
|
useChannelHandler(sdk, HOOK_NAME, {
|
|
126
125
|
onUserBanned(channel, bannedUser) {
|
|
127
|
-
if (channel.isGroupChannel() && !isDifferentChannel(channel,
|
|
126
|
+
if (channel.isGroupChannel() && !isDifferentChannel(channel, channel)) {
|
|
128
127
|
if (bannedUser.userId === sdk.currentUser.userId) {
|
|
129
128
|
var _options$onChannelDel2;
|
|
130
129
|
|
|
131
130
|
options === null || options === void 0 ? void 0 : (_options$onChannelDel2 = options.onChannelDeleted) === null || _options$onChannelDel2 === void 0 ? void 0 : _options$onChannelDel2.call(options);
|
|
132
131
|
} else {
|
|
133
|
-
setActiveChannel(channel);
|
|
134
132
|
forceUpdate();
|
|
135
133
|
}
|
|
136
134
|
}
|
|
@@ -138,7 +136,7 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
|
|
|
138
136
|
|
|
139
137
|
});
|
|
140
138
|
useEffect(() => {
|
|
141
|
-
// NOTE: Cache read is heavy
|
|
139
|
+
// NOTE: Cache read is heavy task, and it prevents smooth ui transition
|
|
142
140
|
setTimeout(async () => {
|
|
143
141
|
updateLoading(true);
|
|
144
142
|
init(userId, () => updateLoading(false));
|
|
@@ -151,11 +149,11 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
|
|
|
151
149
|
if (collectionRef.current) (_collectionRef$curren7 = collectionRef.current) === null || _collectionRef$curren7 === void 0 ? void 0 : _collectionRef$curren7.dispose();
|
|
152
150
|
};
|
|
153
151
|
}, []);
|
|
154
|
-
const refresh =
|
|
152
|
+
const refresh = useFreshCallback(async () => {
|
|
155
153
|
updateRefreshing(true);
|
|
156
154
|
init(userId, () => updateRefreshing(false));
|
|
157
|
-
}
|
|
158
|
-
const prev =
|
|
155
|
+
});
|
|
156
|
+
const prev = useFreshCallback(async () => {
|
|
159
157
|
var _collectionRef$curren8;
|
|
160
158
|
|
|
161
159
|
if (collectionRef.current && (_collectionRef$curren8 = collectionRef.current) !== null && _collectionRef$curren8 !== void 0 && _collectionRef$curren8.hasPrevious) {
|
|
@@ -166,33 +164,33 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
|
|
|
166
164
|
updateMessages(list, false, sdk.currentUser.userId);
|
|
167
165
|
} catch {}
|
|
168
166
|
}
|
|
169
|
-
}
|
|
170
|
-
const next =
|
|
167
|
+
});
|
|
168
|
+
const next = useFreshCallback(async () => {
|
|
171
169
|
var _collectionRef$curren10;
|
|
172
170
|
|
|
173
|
-
const
|
|
171
|
+
const messageCandidates = [];
|
|
174
172
|
|
|
175
173
|
if (collectionRef.current && (_collectionRef$curren10 = collectionRef.current) !== null && _collectionRef$curren10 !== void 0 && _collectionRef$curren10.hasNext) {
|
|
176
174
|
try {
|
|
177
175
|
var _collectionRef$curren11;
|
|
178
176
|
|
|
179
177
|
const fetchedList = await ((_collectionRef$curren11 = collectionRef.current) === null || _collectionRef$curren11 === void 0 ? void 0 : _collectionRef$curren11.loadNext());
|
|
180
|
-
|
|
178
|
+
messageCandidates.push(...fetchedList);
|
|
181
179
|
} catch {}
|
|
182
180
|
}
|
|
183
181
|
|
|
184
182
|
if (nextMessages.length > 0) {
|
|
185
|
-
|
|
183
|
+
messageCandidates.push(...nextMessages);
|
|
186
184
|
}
|
|
187
185
|
|
|
188
|
-
if (
|
|
189
|
-
updateMessages(
|
|
186
|
+
if (messageCandidates.length > 0) {
|
|
187
|
+
updateMessages(messageCandidates, false, sdk.currentUser.userId);
|
|
190
188
|
updateNextMessages([], true, sdk.currentUser.userId);
|
|
191
189
|
}
|
|
192
|
-
}
|
|
193
|
-
const sendUserMessage =
|
|
190
|
+
});
|
|
191
|
+
const sendUserMessage = useFreshCallback((params, onPending) => {
|
|
194
192
|
return new Promise((resolve, reject) => {
|
|
195
|
-
|
|
193
|
+
channel.sendUserMessage(params).onPending(pendingMessage => {
|
|
196
194
|
if (pendingMessage.isUserMessage()) {
|
|
197
195
|
onPending === null || onPending === void 0 ? void 0 : onPending(pendingMessage);
|
|
198
196
|
updateMessages([pendingMessage], false, sdk.currentUser.userId);
|
|
@@ -202,14 +200,15 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
|
|
|
202
200
|
updateMessages([sentMessage], false, sdk.currentUser.userId);
|
|
203
201
|
resolve(sentMessage);
|
|
204
202
|
}
|
|
205
|
-
}).onFailed(err => {
|
|
203
|
+
}).onFailed((err, _failedMessage) => {
|
|
204
|
+
// updateMessages([failedMessage], false, sdk.currentUser.userId);
|
|
206
205
|
reject(err);
|
|
207
206
|
});
|
|
208
207
|
});
|
|
209
|
-
}
|
|
210
|
-
const sendFileMessage =
|
|
208
|
+
});
|
|
209
|
+
const sendFileMessage = useFreshCallback((params, onPending) => {
|
|
211
210
|
return new Promise((resolve, reject) => {
|
|
212
|
-
|
|
211
|
+
channel.sendFileMessage(params).onPending(pendingMessage => {
|
|
213
212
|
if (pendingMessage.isFileMessage()) {
|
|
214
213
|
updateMessages([pendingMessage], false, sdk.currentUser.userId);
|
|
215
214
|
onPending === null || onPending === void 0 ? void 0 : onPending(pendingMessage);
|
|
@@ -219,35 +218,34 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
|
|
|
219
218
|
updateMessages([sentMessage], false, sdk.currentUser.userId);
|
|
220
219
|
resolve(sentMessage);
|
|
221
220
|
}
|
|
222
|
-
}).onFailed(err => {
|
|
221
|
+
}).onFailed((err, _failedMessage) => {
|
|
222
|
+
// updateMessages([failedMessage], false, sdk.currentUser.userId);
|
|
223
223
|
reject(err);
|
|
224
224
|
});
|
|
225
225
|
});
|
|
226
|
-
}
|
|
227
|
-
const updateUserMessage =
|
|
228
|
-
const updatedMessage = await
|
|
226
|
+
});
|
|
227
|
+
const updateUserMessage = useFreshCallback(async (messageId, params) => {
|
|
228
|
+
const updatedMessage = await channel.updateUserMessage(messageId, params);
|
|
229
229
|
updateMessages([updatedMessage], false, sdk.currentUser.userId);
|
|
230
230
|
return updatedMessage;
|
|
231
|
-
}
|
|
232
|
-
const updateFileMessage =
|
|
233
|
-
const updatedMessage = await
|
|
231
|
+
});
|
|
232
|
+
const updateFileMessage = useFreshCallback(async (messageId, params) => {
|
|
233
|
+
const updatedMessage = await channel.updateFileMessage(messageId, params);
|
|
234
234
|
updateMessages([updatedMessage], false, sdk.currentUser.userId);
|
|
235
235
|
return updatedMessage;
|
|
236
|
-
}
|
|
237
|
-
const resendMessage =
|
|
238
|
-
const
|
|
239
|
-
if (failedMessage.isUserMessage()) return
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
if (failedMessage.isFileMessage()) return activeChannel.resendFileMessage(failedMessage);
|
|
236
|
+
});
|
|
237
|
+
const resendMessage = useFreshCallback(async failedMessage => {
|
|
238
|
+
const resentMessage = await (() => {
|
|
239
|
+
if (failedMessage.isUserMessage()) return channel.resendUserMessage(failedMessage);
|
|
240
|
+
if (failedMessage.isFileMessage()) return channel.resendFileMessage(failedMessage);
|
|
243
241
|
return null;
|
|
244
242
|
})();
|
|
245
|
-
if (
|
|
246
|
-
}
|
|
247
|
-
const deleteMessage =
|
|
243
|
+
if (resentMessage) updateMessages([resentMessage], false, sdk.currentUser.userId);
|
|
244
|
+
});
|
|
245
|
+
const deleteMessage = useFreshCallback(async message => {
|
|
248
246
|
if (message.sendingStatus === 'succeeded') {
|
|
249
|
-
if (message.isUserMessage()) await
|
|
250
|
-
if (message.isFileMessage()) await
|
|
247
|
+
if (message.isUserMessage()) await channel.deleteMessage(message);
|
|
248
|
+
if (message.isFileMessage()) await channel.deleteMessage(message);
|
|
251
249
|
} else {
|
|
252
250
|
try {
|
|
253
251
|
var _collectionRef$curren12;
|
|
@@ -257,7 +255,7 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
|
|
|
257
255
|
deleteMessages([message.messageId], [message.reqId]);
|
|
258
256
|
}
|
|
259
257
|
}
|
|
260
|
-
}
|
|
258
|
+
});
|
|
261
259
|
return {
|
|
262
260
|
loading,
|
|
263
261
|
refreshing,
|
|
@@ -272,8 +270,7 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
|
|
|
272
270
|
updateUserMessage,
|
|
273
271
|
updateFileMessage,
|
|
274
272
|
resendMessage,
|
|
275
|
-
deleteMessage
|
|
276
|
-
activeChannel
|
|
273
|
+
deleteMessage
|
|
277
274
|
};
|
|
278
275
|
};
|
|
279
276
|
//# sourceMappingURL=useGroupChannelMessagesWithCollection.js.map
|
package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useCallback","useEffect","useRef","MessageCollectionInitPolicy","MessageEventSource","MessageFilter","Logger","confirmAndMarkAsRead","isDifferentChannel","useForceUpdate","useChannelHandler","useActiveGroupChannel","useGroupChannelMessagesReducer","createMessageCollection","channel","creator","filter","limit","HOOK_NAME","useGroupChannelMessagesWithCollection","sdk","userId","options","collectionRef","activeChannel","setActiveChannel","forceUpdate","loading","refreshing","messages","nextMessages","newMessagesFromMembers","updateMessages","updateNextMessages","deleteNextMessages","deleteMessages","updateLoading","updateRefreshing","sortComparator","channelMarkAs","e","warn","updateChannel","isGroupChannel","init","uid","callback","current","dispose","collectionCreator","currentUser","setMessageCollectionHandler","onMessagesAdded","_","__","source","EVENT_MESSAGE_RECEIVED","EVENT_MESSAGE_SENT_SUCCESS","SYNC_MESSAGE_FILL","onMessagesUpdated","onMessagesDeleted","messageIds","onChannelDeleted","onChannelUpdated","onHugeGapDetected","initialize","CACHE_AND_REPLACE_BY_API","onCacheResult","err","isCacheEnabled","error","debug","length","pendingMessages","failedMessages","onApiResult","url","onUserBanned","bannedUser","setTimeout","refresh","prev","hasPrevious","list","loadPrevious","next","hasNext","fetchedList","loadNext","push","sendUserMessage","params","onPending","Promise","resolve","reject","pendingMessage","isUserMessage","onSucceeded","sentMessage","onFailed","sendFileMessage","isFileMessage","updateUserMessage","messageId","updatedMessage","updateFileMessage","resendMessage","failedMessage","message","resendUserMessage","resendFileMessage","deleteMessage","sendingStatus","removeFailedMessage","reqId"],"sources":["useGroupChannelMessagesWithCollection.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\n\nimport { MessageCollectionInitPolicy, MessageEventSource, MessageFilter } from '@sendbird/chat/groupChannel';\nimport type {\n SendbirdChannel,\n SendbirdFileMessage,\n SendbirdGroupChannel,\n SendbirdMessageCollection,\n} from '@sendbird/uikit-utils';\nimport { Logger, confirmAndMarkAsRead, isDifferentChannel, useForceUpdate } from '@sendbird/uikit-utils';\n\nimport { useChannelHandler } from '../../handler/useChannelHandler';\nimport type { UseGroupChannelMessages, UseGroupChannelMessagesOptions } from '../../types';\nimport { useActiveGroupChannel } from '../useActiveGroupChannel';\nimport { useGroupChannelMessagesReducer } from './reducer';\n\nconst createMessageCollection = (\n channel: SendbirdGroupChannel,\n creator?: UseGroupChannelMessagesOptions['collectionCreator'],\n) => {\n if (creator) return creator();\n const filter = new MessageFilter();\n return channel.createMessageCollection({ filter, limit: 100 });\n};\n\nconst HOOK_NAME = 'useGroupChannelMessagesWithCollection';\n\nexport const useGroupChannelMessagesWithCollection: UseGroupChannelMessages = (sdk, channel, userId, options) => {\n const collectionRef = useRef<SendbirdMessageCollection>();\n\n // NOTE: We cannot determine the channel object of Sendbird SDK is stale or not, so force update af\n const { activeChannel, setActiveChannel } = useActiveGroupChannel(sdk, channel);\n const forceUpdate = useForceUpdate();\n\n const {\n loading,\n refreshing,\n messages,\n nextMessages,\n newMessagesFromMembers,\n updateMessages,\n updateNextMessages,\n deleteNextMessages,\n deleteMessages,\n updateLoading,\n updateRefreshing,\n } = useGroupChannelMessagesReducer(userId, options?.sortComparator);\n\n const channelMarkAs = async () => {\n try {\n await confirmAndMarkAsRead([activeChannel]);\n } catch (e) {\n Logger.warn(`[${HOOK_NAME}/channelMarkAs/Read]`, e);\n }\n };\n\n const updateChannel = (channel: SendbirdChannel) => {\n if (channel.isGroupChannel() && !isDifferentChannel(channel, activeChannel)) {\n forceUpdate();\n }\n };\n\n const init = useCallback(\n async (uid?: string, callback?: () => void) => {\n if (collectionRef.current) collectionRef.current?.dispose();\n\n if (uid) {\n collectionRef.current = createMessageCollection(activeChannel, options?.collectionCreator);\n updateNextMessages([], true, sdk.currentUser.userId);\n channelMarkAs();\n\n collectionRef.current?.setMessageCollectionHandler({\n onMessagesAdded: (_, __, messages) => {\n switch (_.source) {\n case MessageEventSource.EVENT_MESSAGE_RECEIVED:\n case MessageEventSource.EVENT_MESSAGE_SENT_SUCCESS:\n case MessageEventSource.SYNC_MESSAGE_FILL:\n channelMarkAs();\n break;\n }\n updateNextMessages(messages, false, sdk.currentUser.userId);\n updateChannel(channel);\n },\n onMessagesUpdated: (_, channel, messages) => {\n updateMessages(messages, false, sdk.currentUser.userId);\n updateChannel(channel);\n },\n onMessagesDeleted: (_, channel, messageIds) => {\n deleteMessages(messageIds, []);\n deleteNextMessages(messageIds, []);\n updateChannel(channel);\n },\n onChannelDeleted: () => {\n options?.onChannelDeleted?.();\n },\n onChannelUpdated: (_, channel) => {\n updateChannel(channel);\n },\n onHugeGapDetected: () => {\n init(uid);\n },\n });\n\n collectionRef.current\n .initialize(MessageCollectionInitPolicy.CACHE_AND_REPLACE_BY_API)\n .onCacheResult((err, messages) => {\n if (err) sdk.isCacheEnabled && Logger.error(`[${HOOK_NAME}/onCacheResult]`, err);\n else {\n Logger.debug(`[${HOOK_NAME}/onCacheResult]`, 'message length:', messages.length);\n updateMessages(messages, true, sdk.currentUser.userId);\n updateMessages(collectionRef.current?.pendingMessages ?? [], false, sdk.currentUser.userId);\n updateMessages(collectionRef.current?.failedMessages ?? [], false, sdk.currentUser.userId);\n if (messages?.length) callback?.();\n }\n })\n .onApiResult((err, messages) => {\n if (err) Logger.warn(`[${HOOK_NAME}/onApiResult]`, err);\n else {\n Logger.debug(`[${HOOK_NAME}/onApiResult]`, 'message length:', messages.length);\n updateMessages(messages, true, sdk.currentUser.userId);\n if (sdk.isCacheEnabled) {\n updateMessages(collectionRef.current?.pendingMessages ?? [], false, sdk.currentUser.userId);\n updateMessages(collectionRef.current?.failedMessages ?? [], false, sdk.currentUser.userId);\n }\n }\n callback?.();\n });\n }\n },\n [sdk, activeChannel.url, options?.collectionCreator],\n );\n\n useChannelHandler(sdk, HOOK_NAME, {\n onUserBanned(channel, bannedUser) {\n if (channel.isGroupChannel() && !isDifferentChannel(channel, activeChannel)) {\n if (bannedUser.userId === sdk.currentUser.userId) {\n options?.onChannelDeleted?.();\n } else {\n setActiveChannel(channel);\n forceUpdate();\n }\n }\n },\n });\n\n useEffect(() => {\n // NOTE: Cache read is heavy synchronous task, and it prevents smooth ui transition\n setTimeout(async () => {\n updateLoading(true);\n init(userId, () => updateLoading(false));\n }, 0);\n }, [init, userId]);\n\n useEffect(() => {\n return () => {\n if (collectionRef.current) collectionRef.current?.dispose();\n };\n }, []);\n\n const refresh: ReturnType<UseGroupChannelMessages>['refresh'] = useCallback(async () => {\n updateRefreshing(true);\n init(userId, () => updateRefreshing(false));\n }, [init, userId]);\n\n const prev: ReturnType<UseGroupChannelMessages>['prev'] = useCallback(async () => {\n if (collectionRef.current && collectionRef.current?.hasPrevious) {\n try {\n const list = await collectionRef.current?.loadPrevious();\n updateMessages(list, false, sdk.currentUser.userId);\n } catch {}\n }\n }, []);\n\n const next: ReturnType<UseGroupChannelMessages>['next'] = useCallback(async () => {\n const list = [];\n if (collectionRef.current && collectionRef.current?.hasNext) {\n try {\n const fetchedList = await collectionRef.current?.loadNext();\n list.push(...fetchedList);\n } catch {}\n }\n if (nextMessages.length > 0) {\n list.push(...nextMessages);\n }\n if (list.length > 0) {\n updateMessages(list, false, sdk.currentUser.userId);\n updateNextMessages([], true, sdk.currentUser.userId);\n }\n }, [nextMessages.length]);\n\n const sendUserMessage: ReturnType<UseGroupChannelMessages>['sendUserMessage'] = useCallback(\n (params, onPending) => {\n return new Promise((resolve, reject) => {\n activeChannel\n .sendUserMessage(params)\n .onPending((pendingMessage) => {\n if (pendingMessage.isUserMessage()) {\n onPending?.(pendingMessage);\n updateMessages([pendingMessage], false, sdk.currentUser.userId);\n }\n })\n .onSucceeded((sentMessage) => {\n if (sentMessage.isUserMessage()) {\n updateMessages([sentMessage], false, sdk.currentUser.userId);\n resolve(sentMessage);\n }\n })\n .onFailed((err) => {\n reject(err);\n });\n });\n },\n [activeChannel],\n );\n const sendFileMessage: ReturnType<UseGroupChannelMessages>['sendFileMessage'] = useCallback(\n (params, onPending) => {\n return new Promise((resolve, reject) => {\n activeChannel\n .sendFileMessage(params)\n .onPending((pendingMessage) => {\n if (pendingMessage.isFileMessage()) {\n updateMessages([pendingMessage], false, sdk.currentUser.userId);\n onPending?.(pendingMessage);\n }\n })\n .onSucceeded((sentMessage) => {\n if (sentMessage.isFileMessage()) {\n updateMessages([sentMessage], false, sdk.currentUser.userId);\n resolve(sentMessage as SendbirdFileMessage);\n }\n })\n .onFailed((err) => {\n reject(err);\n });\n });\n },\n [activeChannel],\n );\n const updateUserMessage: ReturnType<UseGroupChannelMessages>['updateUserMessage'] = useCallback(\n async (messageId, params) => {\n const updatedMessage = await activeChannel.updateUserMessage(messageId, params);\n updateMessages([updatedMessage], false, sdk.currentUser.userId);\n return updatedMessage;\n },\n [activeChannel],\n );\n const updateFileMessage: ReturnType<UseGroupChannelMessages>['updateFileMessage'] = useCallback(\n async (messageId, params) => {\n const updatedMessage = await activeChannel.updateFileMessage(messageId, params);\n updateMessages([updatedMessage], false, sdk.currentUser.userId);\n return updatedMessage;\n },\n [activeChannel],\n );\n const resendMessage: ReturnType<UseGroupChannelMessages>['resendMessage'] = useCallback(\n async (failedMessage) => {\n const message = await (() => {\n if (failedMessage.isUserMessage()) return activeChannel.resendUserMessage(failedMessage);\n // FIXME: v4 bugs\n // @ts-ignore\n if (failedMessage.isFileMessage()) return activeChannel.resendFileMessage(failedMessage);\n return null;\n })();\n\n if (message) updateMessages([message], false, sdk.currentUser.userId);\n },\n [activeChannel],\n );\n const deleteMessage: ReturnType<UseGroupChannelMessages>['deleteMessage'] = useCallback(\n async (message) => {\n if (message.sendingStatus === 'succeeded') {\n if (message.isUserMessage()) await activeChannel.deleteMessage(message);\n if (message.isFileMessage()) await activeChannel.deleteMessage(message);\n } else {\n try {\n await collectionRef.current?.removeFailedMessage(message.reqId);\n } finally {\n deleteMessages([message.messageId], [message.reqId]);\n }\n }\n },\n [activeChannel],\n );\n\n return {\n loading,\n refreshing,\n refresh,\n messages,\n nextMessages,\n newMessagesFromMembers,\n next,\n prev,\n sendUserMessage,\n sendFileMessage,\n updateUserMessage,\n updateFileMessage,\n resendMessage,\n deleteMessage,\n activeChannel,\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["useCallback","useEffect","useRef","MessageCollectionInitPolicy","MessageEventSource","MessageFilter","Logger","confirmAndMarkAsRead","isDifferentChannel","useForceUpdate","useFreshCallback","useChannelHandler","useGroupChannelMessagesReducer","createMessageCollection","channel","creator","filter","limit","HOOK_NAME","useGroupChannelMessagesWithCollection","sdk","userId","options","forceUpdate","collectionRef","loading","refreshing","messages","nextMessages","newMessagesFromMembers","updateMessages","updateNextMessages","deleteNextMessages","deleteMessages","updateLoading","updateRefreshing","sortComparator","channelMarkAsRead","source","EVENT_MESSAGE_RECEIVED","EVENT_MESSAGE_SENT_SUCCESS","SYNC_MESSAGE_FILL","undefined","e","warn","init","uid","callback","current","dispose","collectionCreator","currentUser","setMessageCollectionHandler","onMessagesAdded","_","__","onMessagesUpdated","nextMessageIds","map","it","messageId","nonAddedMessagesFromReceivedEvent","indexOf","onMessagesDeleted","messageIds","onChannelDeleted","onChannelUpdated","eventChannel","isGroupChannel","onHugeGapDetected","initialize","CACHE_AND_REPLACE_BY_API","onCacheResult","err","isCacheEnabled","error","debug","length","pendingMessages","failedMessages","onApiResult","url","onUserBanned","bannedUser","setTimeout","refresh","prev","hasPrevious","list","loadPrevious","next","messageCandidates","hasNext","fetchedList","loadNext","push","sendUserMessage","params","onPending","Promise","resolve","reject","pendingMessage","isUserMessage","onSucceeded","sentMessage","onFailed","_failedMessage","sendFileMessage","isFileMessage","updateUserMessage","updatedMessage","updateFileMessage","resendMessage","failedMessage","resentMessage","resendUserMessage","resendFileMessage","deleteMessage","message","sendingStatus","removeFailedMessage","reqId"],"sources":["useGroupChannelMessagesWithCollection.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\n\nimport { MessageCollectionInitPolicy, MessageEventSource, MessageFilter } from '@sendbird/chat/groupChannel';\nimport type {\n SendbirdBaseMessage,\n SendbirdFileMessage,\n SendbirdGroupChannel,\n SendbirdMessageCollection,\n} from '@sendbird/uikit-utils';\nimport {\n Logger,\n confirmAndMarkAsRead,\n isDifferentChannel,\n useForceUpdate,\n useFreshCallback,\n} from '@sendbird/uikit-utils';\n\nimport { useChannelHandler } from '../../handler/useChannelHandler';\nimport type { UseGroupChannelMessages, UseGroupChannelMessagesOptions } from '../../types';\nimport { useGroupChannelMessagesReducer } from './reducer';\n\nconst createMessageCollection = (\n channel: SendbirdGroupChannel,\n creator?: UseGroupChannelMessagesOptions['collectionCreator'],\n) => {\n if (creator) return creator();\n const filter = new MessageFilter();\n return channel.createMessageCollection({ filter, limit: 100 });\n};\n\nconst HOOK_NAME = 'useGroupChannelMessagesWithCollection';\n\nexport const useGroupChannelMessagesWithCollection: UseGroupChannelMessages = (sdk, channel, userId, options) => {\n const forceUpdate = useForceUpdate();\n const collectionRef = useRef<SendbirdMessageCollection>();\n\n const {\n loading,\n refreshing,\n messages,\n nextMessages,\n newMessagesFromMembers,\n updateMessages,\n updateNextMessages,\n deleteNextMessages,\n deleteMessages,\n updateLoading,\n updateRefreshing,\n } = useGroupChannelMessagesReducer(userId, options?.sortComparator);\n\n const channelMarkAsRead = async (source?: MessageEventSource) => {\n try {\n switch (source) {\n case MessageEventSource.EVENT_MESSAGE_RECEIVED:\n case MessageEventSource.EVENT_MESSAGE_SENT_SUCCESS:\n case MessageEventSource.SYNC_MESSAGE_FILL:\n case undefined:\n await confirmAndMarkAsRead([channel]);\n break;\n }\n } catch (e) {\n Logger.warn(`[${HOOK_NAME}/channelMarkAsRead]`, e);\n }\n };\n\n const init = useCallback(\n async (uid?: string, callback?: () => void) => {\n if (collectionRef.current) collectionRef.current?.dispose();\n\n if (uid) {\n collectionRef.current = createMessageCollection(channel, options?.collectionCreator);\n updateNextMessages([], true, sdk.currentUser.userId);\n channelMarkAsRead();\n\n collectionRef.current?.setMessageCollectionHandler({\n onMessagesAdded: (_, __, messages) => {\n channelMarkAsRead(_.source);\n updateNextMessages(messages, false, sdk.currentUser.userId);\n },\n onMessagesUpdated: (_, __, messages) => {\n channelMarkAsRead(_.source);\n\n // NOTE: admin message is not added via onMessagesAdded handler, not checked yet is this a bug.\n if (_.source === MessageEventSource.EVENT_MESSAGE_RECEIVED) {\n const nextMessageIds = nextMessages.map((it) => it.messageId);\n const nonAddedMessagesFromReceivedEvent = messages.filter(\n (it) => nextMessageIds.indexOf(it.messageId) === -1,\n );\n updateNextMessages(nonAddedMessagesFromReceivedEvent, false, sdk.currentUser.userId);\n }\n\n // NOTE: v4 MESSAGE_RECEIVED is called twice from onMessagesAdded and onMessagesUpdated when receiving new message.\n // This is not intended behavior but not bugs.\n if (_.source !== MessageEventSource.EVENT_MESSAGE_RECEIVED) {\n updateMessages(messages, false, sdk.currentUser.userId);\n }\n },\n onMessagesDeleted: (_, __, messageIds) => {\n deleteMessages(messageIds, []);\n deleteNextMessages(messageIds, []);\n },\n onChannelDeleted: () => {\n options?.onChannelDeleted?.();\n },\n onChannelUpdated: (_, eventChannel) => {\n if (eventChannel.isGroupChannel() && !isDifferentChannel(eventChannel, channel)) {\n forceUpdate();\n }\n },\n onHugeGapDetected: () => {\n init(uid);\n },\n });\n\n collectionRef.current\n .initialize(MessageCollectionInitPolicy.CACHE_AND_REPLACE_BY_API)\n .onCacheResult((err, messages) => {\n if (err) sdk.isCacheEnabled && Logger.error(`[${HOOK_NAME}/onCacheResult]`, err);\n else {\n Logger.debug(`[${HOOK_NAME}/onCacheResult]`, 'message length:', messages.length);\n\n updateMessages(messages, true, sdk.currentUser.userId);\n updateMessages(collectionRef.current?.pendingMessages ?? [], false, sdk.currentUser.userId);\n updateMessages(collectionRef.current?.failedMessages ?? [], false, sdk.currentUser.userId);\n }\n callback?.();\n })\n .onApiResult((err, messages) => {\n if (err) Logger.warn(`[${HOOK_NAME}/onApiResult]`, err);\n else {\n Logger.debug(`[${HOOK_NAME}/onApiResult]`, 'message length:', messages.length);\n\n updateMessages(messages, true, sdk.currentUser.userId);\n if (sdk.isCacheEnabled) {\n updateMessages(collectionRef.current?.pendingMessages ?? [], false, sdk.currentUser.userId);\n updateMessages(collectionRef.current?.failedMessages ?? [], false, sdk.currentUser.userId);\n }\n }\n callback?.();\n });\n }\n },\n [sdk, channel.url, options?.collectionCreator],\n );\n\n useChannelHandler(sdk, HOOK_NAME, {\n onUserBanned(channel, bannedUser) {\n if (channel.isGroupChannel() && !isDifferentChannel(channel, channel)) {\n if (bannedUser.userId === sdk.currentUser.userId) {\n options?.onChannelDeleted?.();\n } else {\n forceUpdate();\n }\n }\n },\n });\n\n useEffect(() => {\n // NOTE: Cache read is heavy task, and it prevents smooth ui transition\n setTimeout(async () => {\n updateLoading(true);\n init(userId, () => updateLoading(false));\n }, 0);\n }, [init, userId]);\n\n useEffect(() => {\n return () => {\n if (collectionRef.current) collectionRef.current?.dispose();\n };\n }, []);\n\n const refresh: ReturnType<UseGroupChannelMessages>['refresh'] = useFreshCallback(async () => {\n updateRefreshing(true);\n init(userId, () => updateRefreshing(false));\n });\n\n const prev: ReturnType<UseGroupChannelMessages>['prev'] = useFreshCallback(async () => {\n if (collectionRef.current && collectionRef.current?.hasPrevious) {\n try {\n const list = await collectionRef.current?.loadPrevious();\n updateMessages(list, false, sdk.currentUser.userId);\n } catch {}\n }\n });\n\n const next: ReturnType<UseGroupChannelMessages>['next'] = useFreshCallback(async () => {\n const messageCandidates: SendbirdBaseMessage[] = [];\n\n if (collectionRef.current && collectionRef.current?.hasNext) {\n try {\n const fetchedList = await collectionRef.current?.loadNext();\n messageCandidates.push(...fetchedList);\n } catch {}\n }\n\n if (nextMessages.length > 0) {\n messageCandidates.push(...nextMessages);\n }\n\n if (messageCandidates.length > 0) {\n updateMessages(messageCandidates, false, sdk.currentUser.userId);\n updateNextMessages([], true, sdk.currentUser.userId);\n }\n });\n\n const sendUserMessage: ReturnType<UseGroupChannelMessages>['sendUserMessage'] = useFreshCallback(\n (params, onPending) => {\n return new Promise((resolve, reject) => {\n channel\n .sendUserMessage(params)\n .onPending((pendingMessage) => {\n if (pendingMessage.isUserMessage()) {\n onPending?.(pendingMessage);\n updateMessages([pendingMessage], false, sdk.currentUser.userId);\n }\n })\n .onSucceeded((sentMessage) => {\n if (sentMessage.isUserMessage()) {\n updateMessages([sentMessage], false, sdk.currentUser.userId);\n resolve(sentMessage);\n }\n })\n .onFailed((err, _failedMessage) => {\n // updateMessages([failedMessage], false, sdk.currentUser.userId);\n reject(err);\n });\n });\n },\n );\n const sendFileMessage: ReturnType<UseGroupChannelMessages>['sendFileMessage'] = useFreshCallback(\n (params, onPending) => {\n return new Promise((resolve, reject) => {\n channel\n .sendFileMessage(params)\n .onPending((pendingMessage) => {\n if (pendingMessage.isFileMessage()) {\n updateMessages([pendingMessage], false, sdk.currentUser.userId);\n onPending?.(pendingMessage);\n }\n })\n .onSucceeded((sentMessage) => {\n if (sentMessage.isFileMessage()) {\n updateMessages([sentMessage], false, sdk.currentUser.userId);\n resolve(sentMessage as SendbirdFileMessage);\n }\n })\n .onFailed((err, _failedMessage) => {\n // updateMessages([failedMessage], false, sdk.currentUser.userId);\n reject(err);\n });\n });\n },\n );\n const updateUserMessage: ReturnType<UseGroupChannelMessages>['updateUserMessage'] = useFreshCallback(\n async (messageId, params) => {\n const updatedMessage = await channel.updateUserMessage(messageId, params);\n updateMessages([updatedMessage], false, sdk.currentUser.userId);\n return updatedMessage;\n },\n );\n const updateFileMessage: ReturnType<UseGroupChannelMessages>['updateFileMessage'] = useFreshCallback(\n async (messageId, params) => {\n const updatedMessage = await channel.updateFileMessage(messageId, params);\n updateMessages([updatedMessage], false, sdk.currentUser.userId);\n return updatedMessage;\n },\n );\n const resendMessage: ReturnType<UseGroupChannelMessages>['resendMessage'] = useFreshCallback(\n async (failedMessage) => {\n const resentMessage = await (() => {\n if (failedMessage.isUserMessage()) return channel.resendUserMessage(failedMessage);\n if (failedMessage.isFileMessage()) return channel.resendFileMessage(failedMessage);\n return null;\n })();\n\n if (resentMessage) updateMessages([resentMessage], false, sdk.currentUser.userId);\n },\n );\n const deleteMessage: ReturnType<UseGroupChannelMessages>['deleteMessage'] = useFreshCallback(async (message) => {\n if (message.sendingStatus === 'succeeded') {\n if (message.isUserMessage()) await channel.deleteMessage(message);\n if (message.isFileMessage()) await channel.deleteMessage(message);\n } else {\n try {\n await collectionRef.current?.removeFailedMessage(message.reqId);\n } finally {\n deleteMessages([message.messageId], [message.reqId]);\n }\n }\n });\n\n return {\n loading,\n refreshing,\n refresh,\n messages,\n nextMessages,\n newMessagesFromMembers,\n next,\n prev,\n sendUserMessage,\n sendFileMessage,\n updateUserMessage,\n updateFileMessage,\n resendMessage,\n deleteMessage,\n };\n};\n"],"mappings":"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"}
|