@sendbird/uikit-chat-hooks 2.0.2 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/lib/commonjs/channel/useGroupChannel.js +33 -0
  2. package/lib/commonjs/channel/useGroupChannel.js.map +1 -0
  3. package/lib/commonjs/channel/useGroupChannelMessages/reducer.js +3 -3
  4. package/lib/commonjs/channel/useGroupChannelMessages/reducer.js.map +1 -1
  5. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +56 -68
  6. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
  7. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +26 -35
  8. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
  9. package/lib/commonjs/common/useAppFeatures.js +4 -4
  10. package/lib/commonjs/common/useAppFeatures.js.map +1 -1
  11. package/lib/commonjs/common/useMessageOutgoingStatus.js +1 -1
  12. package/lib/commonjs/common/useMessageOutgoingStatus.js.map +1 -1
  13. package/lib/commonjs/common/useUserList.js +25 -7
  14. package/lib/commonjs/common/useUserList.js.map +1 -1
  15. package/lib/commonjs/index.js +8 -0
  16. package/lib/commonjs/index.js.map +1 -1
  17. package/lib/commonjs/types.js.map +1 -1
  18. package/lib/module/channel/useGroupChannel.js +22 -0
  19. package/lib/module/channel/useGroupChannel.js.map +1 -0
  20. package/lib/module/channel/useGroupChannelMessages/reducer.js +3 -3
  21. package/lib/module/channel/useGroupChannelMessages/reducer.js.map +1 -1
  22. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +57 -68
  23. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
  24. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +26 -34
  25. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
  26. package/lib/module/common/useAppFeatures.js +4 -4
  27. package/lib/module/common/useAppFeatures.js.map +1 -1
  28. package/lib/module/common/useMessageOutgoingStatus.js +1 -1
  29. package/lib/module/common/useMessageOutgoingStatus.js.map +1 -1
  30. package/lib/module/common/useUserList.js +27 -9
  31. package/lib/module/common/useUserList.js.map +1 -1
  32. package/lib/module/index.js +1 -0
  33. package/lib/module/index.js.map +1 -1
  34. package/lib/module/types.js.map +1 -1
  35. package/lib/typescript/src/channel/useGroupChannel.d.ts +6 -0
  36. package/lib/typescript/src/common/useUserList.d.ts +2 -2
  37. package/lib/typescript/src/index.d.ts +2 -1
  38. package/lib/typescript/src/types.d.ts +13 -6
  39. package/package.json +3 -3
  40. package/src/channel/useGroupChannel.ts +21 -0
  41. package/src/channel/useGroupChannelMessages/reducer.ts +4 -4
  42. package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.ts +70 -76
  43. package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.ts +29 -31
  44. package/src/common/useAppFeatures.ts +4 -4
  45. package/src/common/useMessageOutgoingStatus.ts +2 -1
  46. package/src/common/useUserList.ts +38 -12
  47. package/src/index.ts +3 -1
  48. package/src/types.ts +16 -7
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useGroupChannel = void 0;
7
+
8
+ var _react = require("react");
9
+
10
+ var _uikitUtils = require("@sendbird/uikit-utils");
11
+
12
+ const useGroupChannel = (sdk, channelUrl) => {
13
+ const [channel, setChannel] = (0, _react.useState)();
14
+ const [loading, setLoading] = (0, _react.useState)(true);
15
+ const [error, setError] = (0, _react.useState)();
16
+ (0, _uikitUtils.useAsyncEffect)(async () => {
17
+ try {
18
+ setChannel(await sdk.groupChannel.getChannel(channelUrl));
19
+ } catch (e) {
20
+ setError(e);
21
+ } finally {
22
+ setLoading(false);
23
+ }
24
+ }, []);
25
+ return {
26
+ channel,
27
+ loading,
28
+ error
29
+ };
30
+ };
31
+
32
+ exports.useGroupChannel = useGroupChannel;
33
+ //# sourceMappingURL=useGroupChannel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useGroupChannel","sdk","channelUrl","channel","setChannel","useState","loading","setLoading","error","setError","useAsyncEffect","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;;AAEA;;AAEO,MAAMA,eAAe,GAAG,CAACC,GAAD,EAAuBC,UAAvB,KAA8C;EAC3E,MAAM,CAACC,OAAD,EAAUC,UAAV,IAAwB,IAAAC,eAAA,GAA9B;EACA,MAAM,CAACC,OAAD,EAAUC,UAAV,IAAwB,IAAAF,eAAA,EAAS,IAAT,CAA9B;EACA,MAAM,CAACG,KAAD,EAAQC,QAAR,IAAoB,IAAAJ,eAAA,GAA1B;EAEA,IAAAK,0BAAA,EAAe,YAAY;IACzB,IAAI;MACFN,UAAU,CAAC,MAAMH,GAAG,CAACU,YAAJ,CAAiBC,UAAjB,CAA4BV,UAA5B,CAAP,CAAV;IACD,CAFD,CAEE,OAAOW,CAAP,EAAU;MACVJ,QAAQ,CAACI,CAAD,CAAR;IACD,CAJD,SAIU;MACRN,UAAU,CAAC,KAAD,CAAV;IACD;EACF,CARD,EAQG,EARH;EAUA,OAAO;IAAEJ,OAAF;IAAWG,OAAX;IAAoBE;EAApB,CAAP;AACD,CAhBM"}
@@ -26,13 +26,13 @@ const defaultReducer = (_ref, action) => {
26
26
  case 'update_next_messages':
27
27
  {
28
28
  const key = action.type === 'update_messages' ? 'messageMap' : 'nextMessageMap';
29
- const messageMap = (0, _uikitUtils.arrayToMapWithGetter)(action.value.messages, _uikitUtils.getMessageUniqId);
29
+ const receivedMessagesAsMap = (0, _uikitUtils.arrayToMapWithGetter)(action.value.messages, _uikitUtils.getMessageUniqId);
30
30
 
31
31
  if (action.value.clearPrev) {
32
- draft[key] = messageMap;
32
+ draft[key] = receivedMessagesAsMap;
33
33
  } else {
34
34
  draft[key] = { ...draft[key],
35
- ...messageMap
35
+ ...receivedMessagesAsMap
36
36
  }; // NOTE: Replace pending message to succeeded message
37
37
 
38
38
  action.value.messages.filter(m => {
@@ -1 +1 @@
1
- {"version":3,"names":["defaultReducer","action","draft","type","key","value","status","messageMap","arrayToMapWithGetter","messages","getMessageUniqId","clearPrev","filter","m","isFileMessage","isUserMessage","Boolean","reqId","sendingStatus","isMyMessage","currentUserId","forEach","messageIds","msgId","reqIds","useGroupChannelMessagesReducer","userId","sortComparator","loading","refreshing","nextMessageMap","dispatch","useReducer","updateMessages","deleteMessages","updateNextMessages","deleteNextMessages","updateLoading","updateRefreshing","useIIFE","Object","values","sort","nextMessages","newMessagesFromMembers","msg","isNewMessage"],"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' as const);\n const messageMap = arrayToMapWithGetter(action.value.messages, getMessageUniqId);\n if (action.value.clearPrev) {\n draft[key] = messageMap;\n } else {\n draft[key] = { ...draft[key], ...messageMap };\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
+ {"version":3,"names":["defaultReducer","action","draft","type","key","value","status","receivedMessagesAsMap","arrayToMapWithGetter","messages","getMessageUniqId","clearPrev","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"],"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":";;;;;;;AAAA;;AAGA;;AAyBA,MAAMA,cAAc,GAAG,OAAsBC,MAAtB,KAAyC;EAAA,IAAxC,EAAE,GAAGC;EAAL,CAAwC;;EAC9D,QAAQD,MAAM,CAACE,IAAf;IACE,KAAK,mBAAL;IACA,KAAK,gBAAL;MAAuB;QACrB,MAAMC,GAAG,GAAGH,MAAM,CAACE,IAAP,KAAgB,gBAAhB,GAAmC,SAAnC,GAA+C,YAA3D;QACAD,KAAK,CAACE,GAAD,CAAL,GAAaH,MAAM,CAACI,KAAP,CAAaC,MAA1B;QAEA,OAAOJ,KAAP;MACD;;IACD,KAAK,iBAAL;IACA,KAAK,sBAAL;MAA6B;QAC3B,MAAME,GAAG,GAAGH,MAAM,CAACE,IAAP,KAAgB,iBAAhB,GAAoC,YAApC,GAAmD,gBAA/D;QACA,MAAMI,qBAAqB,GAAG,IAAAC,gCAAA,EAAqBP,MAAM,CAACI,KAAP,CAAaI,QAAlC,EAA4CC,4BAA5C,CAA9B;;QACA,IAAIT,MAAM,CAACI,KAAP,CAAaM,SAAjB,EAA4B;UAC1BT,KAAK,CAACE,GAAD,CAAL,GAAaG,qBAAb;QACD,CAFD,MAEO;UACLL,KAAK,CAACE,GAAD,CAAL,GAAa,EAAE,GAAGF,KAAK,CAACE,GAAD,CAAV;YAAiB,GAAGG;UAApB,CAAb,CADK,CAGL;;UACAN,MAAM,CAACI,KAAP,CAAaI,QAAb,CACGG,MADH,CACWC,CAAD,IAAuD;YAC7D,OACE,CAACA,CAAC,CAACC,aAAF,MAAqBD,CAAC,CAACE,aAAF,EAAtB,KACAC,OAAO,CAACd,KAAK,CAACE,GAAD,CAAL,CAAWS,CAAC,CAACI,KAAb,CAAD,CADP,IAEAJ,CAAC,CAACK,aAAF,KAAoB,WAFpB,IAGA,IAAAC,uBAAA,EAAYN,CAAZ,EAAeZ,MAAM,CAACI,KAAP,CAAae,aAA5B,CAJF;UAMD,CARH,EASGC,OATH,CASYR,CAAD,IAAO,OAAOX,KAAK,CAACE,GAAD,CAAL,CAAWS,CAAC,CAACI,KAAb,CATzB;QAUD;;QAED,IAAIhB,MAAM,CAACE,IAAP,KAAgB,iBAApB,EAAuC;UACrCD,KAAK,CAAC,gBAAD,CAAL,GAA0B,EAA1B;QACD;;QAED,OAAOA,KAAP;MACD;;IACD,KAAK,iBAAL;IACA,KAAK,sBAAL;MAA6B;QAC3B,MAAME,GAAG,GAAGH,MAAM,CAACE,IAAP,KAAgB,iBAAhB,GAAoC,YAApC,GAAmD,gBAA/D;QACAD,KAAK,CAACE,GAAD,CAAL,GAAa,EAAE,GAAGF,KAAK,CAACE,GAAD;QAAV,CAAb;QACAH,MAAM,CAACI,KAAP,CAAaiB,UAAb,CAAwBD,OAAxB,CAAiCE,KAAD,IAAW,OAAOrB,KAAK,CAACE,GAAD,CAAL,CAAWmB,KAAX,CAAlD;QACAtB,MAAM,CAACI,KAAP,CAAamB,MAAb,CAAoBH,OAApB,CAA6BJ,KAAD,IAAW,OAAOf,KAAK,CAACE,GAAD,CAAL,CAAWa,KAAX,CAA9C;QAEA,OAAOf,KAAP;MACD;EA5CH;AA8CD,CA/CD;;AAiDO,MAAMuB,8BAA8B,GAAG,CAC5CC,MAD4C,EAE5CC,cAF4C,KAGzC;EACH,MAAM,CAAC;IAAEC,OAAF;IAAWC,UAAX;IAAuBC,UAAvB;IAAmCC;EAAnC,CAAD,EAAsDC,QAAtD,IAAkE,IAAAC,iBAAA,EAAWjC,cAAX,EAA2B;IACjG4B,OAAO,EAAE,IADwF;IAEjGC,UAAU,EAAE,KAFqF;IAGjGC,UAAU,EAAE,EAHqF;IAIjGC,cAAc,EAAE;EAJiF,CAA3B,CAAxE;;EAOA,MAAMG,cAAc,GAAG,CAACzB,QAAD,EAAkCE,SAAlC,EAAsDS,aAAtD,KAAiF;IACtGY,QAAQ,CAAC;MAAE7B,IAAI,EAAE,iBAAR;MAA2BE,KAAK,EAAE;QAAEI,QAAF;QAAYE,SAAZ;QAAuBS;MAAvB;IAAlC,CAAD,CAAR;EACD,CAFD;;EAGA,MAAMe,cAAc,GAAG,CAACb,UAAD,EAAuBE,MAAvB,KAA4C;IACjEQ,QAAQ,CAAC;MAAE7B,IAAI,EAAE,iBAAR;MAA2BE,KAAK,EAAE;QAAEiB,UAAF;QAAcE;MAAd;IAAlC,CAAD,CAAR;EACD,CAFD;;EAGA,MAAMY,kBAAkB,GAAG,CAAC3B,QAAD,EAAkCE,SAAlC,EAAsDS,aAAtD,KAAiF;IAC1GY,QAAQ,CAAC;MAAE7B,IAAI,EAAE,sBAAR;MAAgCE,KAAK,EAAE;QAAEI,QAAF;QAAYE,SAAZ;QAAuBS;MAAvB;IAAvC,CAAD,CAAR;EACD,CAFD;;EAGA,MAAMiB,kBAAkB,GAAG,CAACf,UAAD,EAAuBE,MAAvB,KAA4C;IACrEQ,QAAQ,CAAC;MAAE7B,IAAI,EAAE,sBAAR;MAAgCE,KAAK,EAAE;QAAEiB,UAAF;QAAcE;MAAd;IAAvC,CAAD,CAAR;EACD,CAFD;;EAGA,MAAMc,aAAa,GAAIhC,MAAD,IAAqB;IACzC0B,QAAQ,CAAC;MAAE7B,IAAI,EAAE,gBAAR;MAA0BE,KAAK,EAAE;QAAEC;MAAF;IAAjC,CAAD,CAAR;EACD,CAFD;;EAGA,MAAMiC,gBAAgB,GAAIjC,MAAD,IAAqB;IAC5C0B,QAAQ,CAAC;MAAE7B,IAAI,EAAE,mBAAR;MAA6BE,KAAK,EAAE;QAAEC;MAAF;IAApC,CAAD,CAAR;EACD,CAFD;;EAIA,MAAMG,QAAQ,GAAG,IAAA+B,mBAAA,EAAQ,MAAM;IAC7B,IAAIb,cAAJ,EAAoB,OAAOc,MAAM,CAACC,MAAP,CAAcZ,UAAd,EAA0Ba,IAA1B,CAA+BhB,cAA/B,CAAP;IACpB,OAAOc,MAAM,CAACC,MAAP,CAAcZ,UAAd,CAAP;EACD,CAHgB,CAAjB;EAIA,MAAMc,YAAY,GAAGH,MAAM,CAACC,MAAP,CAAcX,cAAd,CAArB;EACA,MAAMc,sBAAsB,GAAGD,YAAY,CAAChC,MAAb,CAAqBkC,GAAD,IAAS,IAAAC,wBAAA,EAAaD,GAAb,EAAkBpB,MAAlB,CAA7B,CAA/B;EAEA,OAAO;IACLY,aADK;IAELC,gBAFK;IAGLL,cAHK;IAILE,kBAJK;IAKLD,cALK;IAMLE,kBANK;IAQLT,OARK;IASLC,UATK;IAULpB,QAVK;IAWLmC,YAXK;IAYLC;EAZK,CAAP;AAcD,CAnDM"}
@@ -13,8 +13,6 @@ var _uikitUtils = require("@sendbird/uikit-utils");
13
13
 
14
14
  var _useChannelHandler = require("../../handler/useChannelHandler");
15
15
 
16
- var _useActiveGroupChannel = require("../useActiveGroupChannel");
17
-
18
16
  var _reducer = require("./reducer");
19
17
 
20
18
  const createMessageCollection = (channel, creator) => {
@@ -29,13 +27,8 @@ const createMessageCollection = (channel, creator) => {
29
27
  const HOOK_NAME = 'useGroupChannelMessagesWithCollection';
30
28
 
31
29
  const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) => {
32
- const collectionRef = (0, _react.useRef)(); // NOTE: We cannot determine the channel object of Sendbird SDK is stale or not, so force update af
33
-
34
- const {
35
- activeChannel,
36
- setActiveChannel
37
- } = (0, _useActiveGroupChannel.useActiveGroupChannel)(sdk, channel);
38
30
  const forceUpdate = (0, _uikitUtils.useForceUpdate)();
31
+ const collectionRef = (0, _react.useRef)();
39
32
  const {
40
33
  loading,
41
34
  refreshing,
@@ -52,18 +45,12 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
52
45
 
53
46
  const channelMarkAs = async () => {
54
47
  try {
55
- await (0, _uikitUtils.confirmAndMarkAsRead)([activeChannel]);
48
+ await (0, _uikitUtils.confirmAndMarkAsRead)([channel]);
56
49
  } catch (e) {
57
50
  _uikitUtils.Logger.warn(`[${HOOK_NAME}/channelMarkAs/Read]`, e);
58
51
  }
59
52
  };
60
53
 
61
- const updateChannel = channel => {
62
- if (channel.isGroupChannel() && !(0, _uikitUtils.isDifferentChannel)(channel, activeChannel)) {
63
- forceUpdate();
64
- }
65
- };
66
-
67
54
  const init = (0, _react.useCallback)(async (uid, callback) => {
68
55
  var _collectionRef$curren;
69
56
 
@@ -72,7 +59,7 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
72
59
  if (uid) {
73
60
  var _collectionRef$curren2;
74
61
 
75
- collectionRef.current = createMessageCollection(activeChannel, options === null || options === void 0 ? void 0 : options.collectionCreator);
62
+ collectionRef.current = createMessageCollection(channel, options === null || options === void 0 ? void 0 : options.collectionCreator);
76
63
  updateNextMessages([], true, sdk.currentUser.userId);
77
64
  channelMarkAs();
78
65
  (_collectionRef$curren2 = collectionRef.current) === null || _collectionRef$curren2 === void 0 ? void 0 : _collectionRef$curren2.setMessageCollectionHandler({
@@ -86,24 +73,27 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
86
73
  }
87
74
 
88
75
  updateNextMessages(messages, false, sdk.currentUser.userId);
89
- updateChannel(channel);
90
76
  },
91
- onMessagesUpdated: (_, channel, messages) => {
92
- updateMessages(messages, false, sdk.currentUser.userId);
93
- updateChannel(channel);
77
+ onMessagesUpdated: (_, __, messages) => {
78
+ // NOTE: v4 MESSAGE_RECEIVED is called twice from onMessagesAdded and onMessagesUpdated when receiving new message.
79
+ // This is not intended behavior but not bugs.
80
+ if (_.source !== _groupChannel.MessageEventSource.EVENT_MESSAGE_RECEIVED) {
81
+ updateMessages(messages, false, sdk.currentUser.userId);
82
+ }
94
83
  },
95
- onMessagesDeleted: (_, channel, messageIds) => {
84
+ onMessagesDeleted: (_, __, messageIds) => {
96
85
  deleteMessages(messageIds, []);
97
86
  deleteNextMessages(messageIds, []);
98
- updateChannel(channel);
99
87
  },
100
88
  onChannelDeleted: () => {
101
89
  var _options$onChannelDel;
102
90
 
103
91
  options === null || options === void 0 ? void 0 : (_options$onChannelDel = options.onChannelDeleted) === null || _options$onChannelDel === void 0 ? void 0 : _options$onChannelDel.call(options);
104
92
  },
105
- onChannelUpdated: (_, channel) => {
106
- updateChannel(channel);
93
+ onChannelUpdated: (_, eventChannel) => {
94
+ if (eventChannel.isGroupChannel() && !(0, _uikitUtils.isDifferentChannel)(eventChannel, channel)) {
95
+ forceUpdate();
96
+ }
107
97
  },
108
98
  onHugeGapDetected: () => {
109
99
  init(uid);
@@ -118,8 +108,8 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
118
108
  updateMessages(messages, true, sdk.currentUser.userId);
119
109
  updateMessages(((_collectionRef$curren3 = collectionRef.current) === null || _collectionRef$curren3 === void 0 ? void 0 : _collectionRef$curren3.pendingMessages) ?? [], false, sdk.currentUser.userId);
120
110
  updateMessages(((_collectionRef$curren4 = collectionRef.current) === null || _collectionRef$curren4 === void 0 ? void 0 : _collectionRef$curren4.failedMessages) ?? [], false, sdk.currentUser.userId);
121
- if (messages !== null && messages !== void 0 && messages.length) callback === null || callback === void 0 ? void 0 : callback();
122
111
  }
112
+ callback === null || callback === void 0 ? void 0 : callback();
123
113
  }).onApiResult((err, messages) => {
124
114
  if (err) _uikitUtils.Logger.warn(`[${HOOK_NAME}/onApiResult]`, err);else {
125
115
  _uikitUtils.Logger.debug(`[${HOOK_NAME}/onApiResult]`, 'message length:', messages.length);
@@ -136,16 +126,15 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
136
126
  callback === null || callback === void 0 ? void 0 : callback();
137
127
  });
138
128
  }
139
- }, [sdk, activeChannel.url, options === null || options === void 0 ? void 0 : options.collectionCreator]);
129
+ }, [sdk, channel.url, options === null || options === void 0 ? void 0 : options.collectionCreator]);
140
130
  (0, _useChannelHandler.useChannelHandler)(sdk, HOOK_NAME, {
141
131
  onUserBanned(channel, bannedUser) {
142
- if (channel.isGroupChannel() && !(0, _uikitUtils.isDifferentChannel)(channel, activeChannel)) {
132
+ if (channel.isGroupChannel() && !(0, _uikitUtils.isDifferentChannel)(channel, channel)) {
143
133
  if (bannedUser.userId === sdk.currentUser.userId) {
144
134
  var _options$onChannelDel2;
145
135
 
146
136
  options === null || options === void 0 ? void 0 : (_options$onChannelDel2 = options.onChannelDeleted) === null || _options$onChannelDel2 === void 0 ? void 0 : _options$onChannelDel2.call(options);
147
137
  } else {
148
- setActiveChannel(channel);
149
138
  forceUpdate();
150
139
  }
151
140
  }
@@ -153,7 +142,7 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
153
142
 
154
143
  });
155
144
  (0, _react.useEffect)(() => {
156
- // NOTE: Cache read is heavy synchronous task, and it prevents smooth ui transition
145
+ // NOTE: Cache read is heavy task, and it prevents smooth ui transition
157
146
  setTimeout(async () => {
158
147
  updateLoading(true);
159
148
  init(userId, () => updateLoading(false));
@@ -166,11 +155,11 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
166
155
  if (collectionRef.current) (_collectionRef$curren7 = collectionRef.current) === null || _collectionRef$curren7 === void 0 ? void 0 : _collectionRef$curren7.dispose();
167
156
  };
168
157
  }, []);
169
- const refresh = (0, _react.useCallback)(async () => {
158
+ const refresh = (0, _uikitUtils.useFreshCallback)(async () => {
170
159
  updateRefreshing(true);
171
160
  init(userId, () => updateRefreshing(false));
172
- }, [init, userId]);
173
- const prev = (0, _react.useCallback)(async () => {
161
+ });
162
+ const prev = (0, _uikitUtils.useFreshCallback)(async () => {
174
163
  var _collectionRef$curren8;
175
164
 
176
165
  if (collectionRef.current && (_collectionRef$curren8 = collectionRef.current) !== null && _collectionRef$curren8 !== void 0 && _collectionRef$curren8.hasPrevious) {
@@ -181,33 +170,33 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
181
170
  updateMessages(list, false, sdk.currentUser.userId);
182
171
  } catch {}
183
172
  }
184
- }, []);
185
- const next = (0, _react.useCallback)(async () => {
173
+ });
174
+ const next = (0, _uikitUtils.useFreshCallback)(async () => {
186
175
  var _collectionRef$curren10;
187
176
 
188
- const list = [];
177
+ const messageCandidates = [];
189
178
 
190
179
  if (collectionRef.current && (_collectionRef$curren10 = collectionRef.current) !== null && _collectionRef$curren10 !== void 0 && _collectionRef$curren10.hasNext) {
191
180
  try {
192
181
  var _collectionRef$curren11;
193
182
 
194
183
  const fetchedList = await ((_collectionRef$curren11 = collectionRef.current) === null || _collectionRef$curren11 === void 0 ? void 0 : _collectionRef$curren11.loadNext());
195
- list.push(...fetchedList);
184
+ messageCandidates.push(...fetchedList);
196
185
  } catch {}
197
186
  }
198
187
 
199
188
  if (nextMessages.length > 0) {
200
- list.push(...nextMessages);
189
+ messageCandidates.push(...nextMessages);
201
190
  }
202
191
 
203
- if (list.length > 0) {
204
- updateMessages(list, false, sdk.currentUser.userId);
192
+ if (messageCandidates.length > 0) {
193
+ updateMessages(messageCandidates, false, sdk.currentUser.userId);
205
194
  updateNextMessages([], true, sdk.currentUser.userId);
206
195
  }
207
- }, [nextMessages.length]);
208
- const sendUserMessage = (0, _react.useCallback)((params, onPending) => {
196
+ });
197
+ const sendUserMessage = (0, _uikitUtils.useFreshCallback)((params, onPending) => {
209
198
  return new Promise((resolve, reject) => {
210
- activeChannel.sendUserMessage(params).onPending(pendingMessage => {
199
+ channel.sendUserMessage(params).onPending(pendingMessage => {
211
200
  if (pendingMessage.isUserMessage()) {
212
201
  onPending === null || onPending === void 0 ? void 0 : onPending(pendingMessage);
213
202
  updateMessages([pendingMessage], false, sdk.currentUser.userId);
@@ -217,14 +206,15 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
217
206
  updateMessages([sentMessage], false, sdk.currentUser.userId);
218
207
  resolve(sentMessage);
219
208
  }
220
- }).onFailed(err => {
209
+ }).onFailed((err, _failedMessage) => {
210
+ // updateMessages([failedMessage], false, sdk.currentUser.userId);
221
211
  reject(err);
222
212
  });
223
213
  });
224
- }, [activeChannel]);
225
- const sendFileMessage = (0, _react.useCallback)((params, onPending) => {
214
+ });
215
+ const sendFileMessage = (0, _uikitUtils.useFreshCallback)((params, onPending) => {
226
216
  return new Promise((resolve, reject) => {
227
- activeChannel.sendFileMessage(params).onPending(pendingMessage => {
217
+ channel.sendFileMessage(params).onPending(pendingMessage => {
228
218
  if (pendingMessage.isFileMessage()) {
229
219
  updateMessages([pendingMessage], false, sdk.currentUser.userId);
230
220
  onPending === null || onPending === void 0 ? void 0 : onPending(pendingMessage);
@@ -234,35 +224,34 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
234
224
  updateMessages([sentMessage], false, sdk.currentUser.userId);
235
225
  resolve(sentMessage);
236
226
  }
237
- }).onFailed(err => {
227
+ }).onFailed((err, _failedMessage) => {
228
+ // updateMessages([failedMessage], false, sdk.currentUser.userId);
238
229
  reject(err);
239
230
  });
240
231
  });
241
- }, [activeChannel]);
242
- const updateUserMessage = (0, _react.useCallback)(async (messageId, params) => {
243
- const updatedMessage = await activeChannel.updateUserMessage(messageId, params);
232
+ });
233
+ const updateUserMessage = (0, _uikitUtils.useFreshCallback)(async (messageId, params) => {
234
+ const updatedMessage = await channel.updateUserMessage(messageId, params);
244
235
  updateMessages([updatedMessage], false, sdk.currentUser.userId);
245
236
  return updatedMessage;
246
- }, [activeChannel]);
247
- const updateFileMessage = (0, _react.useCallback)(async (messageId, params) => {
248
- const updatedMessage = await activeChannel.updateFileMessage(messageId, params);
237
+ });
238
+ const updateFileMessage = (0, _uikitUtils.useFreshCallback)(async (messageId, params) => {
239
+ const updatedMessage = await channel.updateFileMessage(messageId, params);
249
240
  updateMessages([updatedMessage], false, sdk.currentUser.userId);
250
241
  return updatedMessage;
251
- }, [activeChannel]);
252
- const resendMessage = (0, _react.useCallback)(async failedMessage => {
253
- const message = await (() => {
254
- if (failedMessage.isUserMessage()) return activeChannel.resendUserMessage(failedMessage); // FIXME: v4 bugs
255
- // @ts-ignore
256
-
257
- if (failedMessage.isFileMessage()) return activeChannel.resendFileMessage(failedMessage);
242
+ });
243
+ const resendMessage = (0, _uikitUtils.useFreshCallback)(async failedMessage => {
244
+ const resentMessage = await (() => {
245
+ if (failedMessage.isUserMessage()) return channel.resendUserMessage(failedMessage);
246
+ if (failedMessage.isFileMessage()) return channel.resendFileMessage(failedMessage);
258
247
  return null;
259
248
  })();
260
- if (message) updateMessages([message], false, sdk.currentUser.userId);
261
- }, [activeChannel]);
262
- const deleteMessage = (0, _react.useCallback)(async message => {
249
+ if (resentMessage) updateMessages([resentMessage], false, sdk.currentUser.userId);
250
+ });
251
+ const deleteMessage = (0, _uikitUtils.useFreshCallback)(async message => {
263
252
  if (message.sendingStatus === 'succeeded') {
264
- if (message.isUserMessage()) await activeChannel.deleteMessage(message);
265
- if (message.isFileMessage()) await activeChannel.deleteMessage(message);
253
+ if (message.isUserMessage()) await channel.deleteMessage(message);
254
+ if (message.isFileMessage()) await channel.deleteMessage(message);
266
255
  } else {
267
256
  try {
268
257
  var _collectionRef$curren12;
@@ -272,7 +261,7 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
272
261
  deleteMessages([message.messageId], [message.reqId]);
273
262
  }
274
263
  }
275
- }, [activeChannel]);
264
+ });
276
265
  return {
277
266
  loading,
278
267
  refreshing,
@@ -287,8 +276,7 @@ const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) =>
287
276
  updateUserMessage,
288
277
  updateFileMessage,
289
278
  resendMessage,
290
- deleteMessage,
291
- activeChannel
279
+ deleteMessage
292
280
  };
293
281
  };
294
282
 
@@ -1 +1 @@
1
- {"version":3,"names":["createMessageCollection","channel","creator","filter","MessageFilter","limit","HOOK_NAME","useGroupChannelMessagesWithCollection","sdk","userId","options","collectionRef","useRef","activeChannel","setActiveChannel","useActiveGroupChannel","forceUpdate","useForceUpdate","loading","refreshing","messages","nextMessages","newMessagesFromMembers","updateMessages","updateNextMessages","deleteNextMessages","deleteMessages","updateLoading","updateRefreshing","useGroupChannelMessagesReducer","sortComparator","channelMarkAs","confirmAndMarkAsRead","e","Logger","warn","updateChannel","isGroupChannel","isDifferentChannel","init","useCallback","uid","callback","current","dispose","collectionCreator","currentUser","setMessageCollectionHandler","onMessagesAdded","_","__","source","MessageEventSource","EVENT_MESSAGE_RECEIVED","EVENT_MESSAGE_SENT_SUCCESS","SYNC_MESSAGE_FILL","onMessagesUpdated","onMessagesDeleted","messageIds","onChannelDeleted","onChannelUpdated","onHugeGapDetected","initialize","MessageCollectionInitPolicy","CACHE_AND_REPLACE_BY_API","onCacheResult","err","isCacheEnabled","error","debug","length","pendingMessages","failedMessages","onApiResult","url","useChannelHandler","onUserBanned","bannedUser","useEffect","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":["createMessageCollection","channel","creator","filter","MessageFilter","limit","HOOK_NAME","useGroupChannelMessagesWithCollection","sdk","userId","options","forceUpdate","useForceUpdate","collectionRef","useRef","loading","refreshing","messages","nextMessages","newMessagesFromMembers","updateMessages","updateNextMessages","deleteNextMessages","deleteMessages","updateLoading","updateRefreshing","useGroupChannelMessagesReducer","sortComparator","channelMarkAs","confirmAndMarkAsRead","e","Logger","warn","init","useCallback","uid","callback","current","dispose","collectionCreator","currentUser","setMessageCollectionHandler","onMessagesAdded","_","__","source","MessageEventSource","EVENT_MESSAGE_RECEIVED","EVENT_MESSAGE_SENT_SUCCESS","SYNC_MESSAGE_FILL","onMessagesUpdated","onMessagesDeleted","messageIds","onChannelDeleted","onChannelUpdated","eventChannel","isGroupChannel","isDifferentChannel","onHugeGapDetected","initialize","MessageCollectionInitPolicy","CACHE_AND_REPLACE_BY_API","onCacheResult","err","isCacheEnabled","error","debug","length","pendingMessages","failedMessages","onApiResult","url","useChannelHandler","onUserBanned","bannedUser","useEffect","setTimeout","refresh","useFreshCallback","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","messageId","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 channelMarkAs = async () => {\n try {\n await confirmAndMarkAsRead([channel]);\n } catch (e) {\n Logger.warn(`[${HOOK_NAME}/channelMarkAs/Read]`, 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 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 },\n onMessagesUpdated: (_, __, messages) => {\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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"}