@sendbird/uikit-chat-hooks 2.4.1 → 2.5.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/README.md +2 -2
  2. package/lib/commonjs/channel/useChannelMessagesReducer.js +153 -0
  3. package/lib/commonjs/channel/useChannelMessagesReducer.js.map +1 -0
  4. package/lib/commonjs/channel/useGroupChannel.js +0 -4
  5. package/lib/commonjs/channel/useGroupChannel.js.map +1 -1
  6. package/lib/commonjs/channel/useGroupChannelList/index.js +0 -5
  7. package/lib/commonjs/channel/useGroupChannelList/index.js.map +1 -1
  8. package/lib/commonjs/channel/useGroupChannelList/reducer.js +12 -29
  9. package/lib/commonjs/channel/useGroupChannelList/reducer.js.map +1 -1
  10. package/lib/commonjs/channel/useGroupChannelList/useGroupChannelListWithCollection.js +1 -22
  11. package/lib/commonjs/channel/useGroupChannelList/useGroupChannelListWithCollection.js.map +1 -1
  12. package/lib/commonjs/channel/useGroupChannelList/useGroupChannelListWithQuery.js +1 -18
  13. package/lib/commonjs/channel/useGroupChannelList/useGroupChannelListWithQuery.js.map +1 -1
  14. package/lib/commonjs/channel/useGroupChannelMessages/index.js +0 -5
  15. package/lib/commonjs/channel/useGroupChannelMessages/index.js.map +1 -1
  16. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +172 -131
  17. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
  18. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +76 -73
  19. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
  20. package/lib/commonjs/channel/useOpenChannel.js +0 -4
  21. package/lib/commonjs/channel/useOpenChannel.js.map +1 -1
  22. package/lib/commonjs/channel/useOpenChannelList/index.js +0 -3
  23. package/lib/commonjs/channel/useOpenChannelList/index.js.map +1 -1
  24. package/lib/commonjs/channel/useOpenChannelList/reducer.js +2 -21
  25. package/lib/commonjs/channel/useOpenChannelList/reducer.js.map +1 -1
  26. package/lib/commonjs/channel/useOpenChannelList/useOpenChannelListWithQuery.js +1 -22
  27. package/lib/commonjs/channel/useOpenChannelList/useOpenChannelListWithQuery.js.map +1 -1
  28. package/lib/commonjs/channel/useOpenChannelMessages/index.js +0 -3
  29. package/lib/commonjs/channel/useOpenChannelMessages/index.js.map +1 -1
  30. package/lib/commonjs/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js +128 -57
  31. package/lib/commonjs/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js.map +1 -1
  32. package/lib/commonjs/common/useAppFeatures.js +0 -3
  33. package/lib/commonjs/common/useAppFeatures.js.map +1 -1
  34. package/lib/commonjs/common/useMessageOutgoingStatus.js +0 -11
  35. package/lib/commonjs/common/useMessageOutgoingStatus.js.map +1 -1
  36. package/lib/commonjs/common/usePushTrigger.js +0 -6
  37. package/lib/commonjs/common/usePushTrigger.js.map +1 -1
  38. package/lib/commonjs/common/useTotalUnreadMessageCount.js +0 -7
  39. package/lib/commonjs/common/useTotalUnreadMessageCount.js.map +1 -1
  40. package/lib/commonjs/common/useUserList.js +5 -20
  41. package/lib/commonjs/common/useUserList.js.map +1 -1
  42. package/lib/commonjs/handler/useChannelHandler.js +15 -41
  43. package/lib/commonjs/handler/useChannelHandler.js.map +1 -1
  44. package/lib/commonjs/handler/useConnectionHandler.js +14 -11
  45. package/lib/commonjs/handler/useConnectionHandler.js.map +1 -1
  46. package/lib/commonjs/handler/useUserEventHandler.js +0 -8
  47. package/lib/commonjs/handler/useUserEventHandler.js.map +1 -1
  48. package/lib/commonjs/index.js +0 -23
  49. package/lib/commonjs/index.js.map +1 -1
  50. package/lib/commonjs/model/CustomQuery.js +0 -6
  51. package/lib/commonjs/model/CustomQuery.js.map +1 -1
  52. package/lib/commonjs/types.js.map +1 -1
  53. package/lib/module/channel/useChannelMessagesReducer.js +146 -0
  54. package/lib/module/channel/useChannelMessagesReducer.js.map +1 -0
  55. package/lib/module/channel/useGroupChannel.js.map +1 -1
  56. package/lib/module/channel/useGroupChannelList/index.js.map +1 -1
  57. package/lib/module/channel/useGroupChannelList/reducer.js +12 -26
  58. package/lib/module/channel/useGroupChannelList/reducer.js.map +1 -1
  59. package/lib/module/channel/useGroupChannelList/useGroupChannelListWithCollection.js +1 -15
  60. package/lib/module/channel/useGroupChannelList/useGroupChannelListWithCollection.js.map +1 -1
  61. package/lib/module/channel/useGroupChannelList/useGroupChannelListWithQuery.js +1 -11
  62. package/lib/module/channel/useGroupChannelList/useGroupChannelListWithQuery.js.map +1 -1
  63. package/lib/module/channel/useGroupChannelMessages/index.js.map +1 -1
  64. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +174 -125
  65. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
  66. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +78 -70
  67. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
  68. package/lib/module/channel/useOpenChannel.js.map +1 -1
  69. package/lib/module/channel/useOpenChannelList/index.js.map +1 -1
  70. package/lib/module/channel/useOpenChannelList/reducer.js +2 -18
  71. package/lib/module/channel/useOpenChannelList/reducer.js.map +1 -1
  72. package/lib/module/channel/useOpenChannelList/useOpenChannelListWithQuery.js +1 -17
  73. package/lib/module/channel/useOpenChannelList/useOpenChannelListWithQuery.js.map +1 -1
  74. package/lib/module/channel/useOpenChannelMessages/index.js.map +1 -1
  75. package/lib/module/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js +129 -53
  76. package/lib/module/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js.map +1 -1
  77. package/lib/module/common/useAppFeatures.js.map +1 -1
  78. package/lib/module/common/useMessageOutgoingStatus.js +0 -6
  79. package/lib/module/common/useMessageOutgoingStatus.js.map +1 -1
  80. package/lib/module/common/usePushTrigger.js.map +1 -1
  81. package/lib/module/common/useTotalUnreadMessageCount.js +0 -1
  82. package/lib/module/common/useTotalUnreadMessageCount.js.map +1 -1
  83. package/lib/module/common/useUserList.js +5 -15
  84. package/lib/module/common/useUserList.js.map +1 -1
  85. package/lib/module/handler/useChannelHandler.js +15 -35
  86. package/lib/module/handler/useChannelHandler.js.map +1 -1
  87. package/lib/module/handler/useConnectionHandler.js +15 -6
  88. package/lib/module/handler/useConnectionHandler.js.map +1 -1
  89. package/lib/module/handler/useUserEventHandler.js +0 -2
  90. package/lib/module/handler/useUserEventHandler.js.map +1 -1
  91. package/lib/module/index.js +0 -1
  92. package/lib/module/index.js.map +1 -1
  93. package/lib/module/model/CustomQuery.js +0 -4
  94. package/lib/module/model/CustomQuery.js.map +1 -1
  95. package/lib/module/types.js.map +1 -1
  96. package/lib/typescript/src/channel/useChannelMessagesReducer.d.ts +18 -0
  97. package/lib/typescript/src/channel/useGroupChannelList/reducer.d.ts +1 -1
  98. package/lib/typescript/src/common/useUserList.d.ts +1 -1
  99. package/lib/typescript/src/handler/useChannelHandler.d.ts +1 -1
  100. package/lib/typescript/src/handler/useConnectionHandler.d.ts +1 -2
  101. package/lib/typescript/src/index.d.ts +0 -1
  102. package/lib/typescript/src/types.d.ts +51 -20
  103. package/package.json +15 -10
  104. package/src/channel/useChannelMessagesReducer.ts +143 -0
  105. package/src/channel/useGroupChannelList/reducer.ts +11 -7
  106. package/src/channel/useGroupChannelList/useGroupChannelListWithCollection.ts +1 -1
  107. package/src/channel/useGroupChannelList/useGroupChannelListWithQuery.ts +1 -1
  108. package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.ts +174 -105
  109. package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.ts +90 -63
  110. package/src/channel/useOpenChannelList/useOpenChannelListWithQuery.ts +1 -5
  111. package/src/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.ts +143 -26
  112. package/src/common/useUserList.ts +4 -4
  113. package/src/handler/useChannelHandler.ts +11 -24
  114. package/src/handler/useConnectionHandler.ts +11 -5
  115. package/src/index.ts +0 -1
  116. package/src/types.ts +58 -20
  117. package/lib/commonjs/channel/useGroupChannelMessages/reducer.js +0 -154
  118. package/lib/commonjs/channel/useGroupChannelMessages/reducer.js.map +0 -1
  119. package/lib/commonjs/channel/useOpenChannelMessages/reducer.js +0 -154
  120. package/lib/commonjs/channel/useOpenChannelMessages/reducer.js.map +0 -1
  121. package/lib/commonjs/common/useTotalUnreadChannelCount.js +0 -29
  122. package/lib/commonjs/common/useTotalUnreadChannelCount.js.map +0 -1
  123. package/lib/module/channel/useGroupChannelMessages/reducer.js +0 -144
  124. package/lib/module/channel/useGroupChannelMessages/reducer.js.map +0 -1
  125. package/lib/module/channel/useOpenChannelMessages/reducer.js +0 -144
  126. package/lib/module/channel/useOpenChannelMessages/reducer.js.map +0 -1
  127. package/lib/module/common/useTotalUnreadChannelCount.js +0 -17
  128. package/lib/module/common/useTotalUnreadChannelCount.js.map +0 -1
  129. package/lib/typescript/src/channel/useGroupChannelMessages/reducer.d.ts +0 -15
  130. package/lib/typescript/src/channel/useOpenChannelMessages/reducer.d.ts +0 -15
  131. package/lib/typescript/src/common/useTotalUnreadChannelCount.d.ts +0 -6
  132. package/src/channel/useGroupChannelMessages/reducer.ts +0 -125
  133. package/src/channel/useOpenChannelMessages/reducer.ts +0 -125
  134. package/src/common/useTotalUnreadChannelCount.ts +0 -26
@@ -1 +1 @@
1
- {"version":3,"names":["useRef","GroupChannelListOrder","confirmAndMarkAsDelivered","useAsyncEffect","useFreshCallback","useUniqHandlerId","useAppFeatures","useChannelHandler","useGroupChannelListReducer","createGroupChannelListQuery","sdk","queryCreator","passedQuery","groupChannel","createMyGroupChannelListQuery","includeEmpty","limit","order","LATEST_LAST_MESSAGE","useGroupChannelListWithQuery","userId","options","deliveryReceiptEnabled","queryRef","handlerId","loading","groupChannels","refreshing","updateChannels","setChannels","deleteChannels","updateRefreshing","updateLoading","updateOrder","updateChannelsAndMarkAsDelivered","channels","init","uid","current","hasNext","next","onChannelChanged","channel","onChannelFrozen","onChannelUnfrozen","onChannelMemberCountChanged","onChannelDeleted","url","onUserJoined","onUserLeft","user","isMe","onUserBanned","onMessageReceived","refresh"],"sources":["useGroupChannelListWithQuery.ts"],"sourcesContent":["import { useRef } from 'react';\n\nimport { GroupChannelListOrder } from '@sendbird/chat/groupChannel';\nimport type { SendbirdChannel, SendbirdChatSDK, SendbirdGroupChannelListQuery } from '@sendbird/uikit-utils';\nimport { confirmAndMarkAsDelivered, useAsyncEffect, useFreshCallback, useUniqHandlerId } from '@sendbird/uikit-utils';\n\nimport { useAppFeatures } from '../../common/useAppFeatures';\nimport { useChannelHandler } from '../../handler/useChannelHandler';\nimport type { UseGroupChannelList, UseGroupChannelListOptions } from '../../types';\nimport { useGroupChannelListReducer } from './reducer';\n\nconst createGroupChannelListQuery = (\n sdk: SendbirdChatSDK,\n queryCreator: UseGroupChannelListOptions['queryCreator'],\n) => {\n const passedQuery = queryCreator?.();\n if (passedQuery) return passedQuery;\n\n return sdk.groupChannel.createMyGroupChannelListQuery({\n includeEmpty: false,\n limit: 20,\n order: GroupChannelListOrder.LATEST_LAST_MESSAGE,\n });\n};\n\nexport const useGroupChannelListWithQuery: UseGroupChannelList = (sdk, userId, options) => {\n const { deliveryReceiptEnabled } = useAppFeatures(sdk);\n const queryRef = useRef<SendbirdGroupChannelListQuery>();\n const handlerId = useUniqHandlerId('useGroupChannelListWithQuery');\n\n const {\n loading,\n groupChannels,\n refreshing,\n updateChannels,\n setChannels,\n deleteChannels,\n updateRefreshing,\n updateLoading,\n updateOrder,\n } = useGroupChannelListReducer();\n\n const updateChannelsAndMarkAsDelivered = (channels: SendbirdChannel[]) => {\n updateChannels(channels);\n if (deliveryReceiptEnabled) confirmAndMarkAsDelivered(channels);\n };\n\n const init = useFreshCallback(async (uid?: string) => {\n if (uid) {\n queryRef.current = createGroupChannelListQuery(sdk, options?.queryCreator);\n updateOrder(queryRef.current?.order);\n\n if (queryRef.current?.hasNext) {\n const channels = await queryRef.current.next();\n\n setChannels(channels, true);\n if (deliveryReceiptEnabled) confirmAndMarkAsDelivered(channels);\n }\n }\n });\n\n useAsyncEffect(async () => {\n updateLoading(true);\n await init(userId);\n updateLoading(false);\n }, [init, userId]);\n\n useChannelHandler(sdk, handlerId, {\n onChannelChanged: (channel) => updateChannels([channel]),\n onChannelFrozen: (channel) => updateChannels([channel]),\n onChannelUnfrozen: (channel) => updateChannels([channel]),\n onChannelMemberCountChanged: (channels) => updateChannels(channels),\n onChannelDeleted: (url) => deleteChannels([url]),\n onUserJoined: (channel) => updateChannels([channel]),\n onUserLeft: (channel, user) => {\n const isMe = user.userId === userId;\n if (isMe) deleteChannels([channel.url]);\n else updateChannels([channel]);\n },\n onUserBanned(channel, user) {\n const isMe = user.userId === userId;\n if (isMe) deleteChannels([channel.url]);\n else updateChannels([channel]);\n },\n onMessageReceived(channel) {\n updateChannelsAndMarkAsDelivered([channel]);\n },\n });\n\n const refresh = useFreshCallback(async () => {\n updateRefreshing(true);\n await init(userId);\n updateRefreshing(false);\n });\n\n const next = useFreshCallback(async () => {\n if (queryRef.current?.hasNext) {\n const channels = await queryRef.current.next();\n setChannels(channels, false);\n if (deliveryReceiptEnabled) confirmAndMarkAsDelivered(channels);\n }\n });\n\n return {\n loading,\n groupChannels,\n refresh,\n refreshing,\n next,\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["useRef","GroupChannelListOrder","confirmAndMarkAsDelivered","useAsyncEffect","useFreshCallback","useUniqHandlerId","useAppFeatures","useChannelHandler","useGroupChannelListReducer","createGroupChannelListQuery","sdk","queryCreator","passedQuery","groupChannel","createMyGroupChannelListQuery","includeEmpty","limit","order","LATEST_LAST_MESSAGE","useGroupChannelListWithQuery","userId","options","deliveryReceiptEnabled","queryRef","handlerId","loading","groupChannels","refreshing","updateChannels","setChannels","deleteChannels","updateRefreshing","updateLoading","updateOrder","updateChannelsAndMarkAsDelivered","channels","init","uid","_queryRef$current","_queryRef$current2","current","hasNext","next","onChannelChanged","channel","onChannelFrozen","onChannelUnfrozen","onChannelMemberCountChanged","onChannelDeleted","url","onUserJoined","onUserLeft","user","isMe","onUserBanned","onMessageReceived","refresh","_queryRef$current3"],"sources":["useGroupChannelListWithQuery.ts"],"sourcesContent":["import { useRef } from 'react';\n\nimport { GroupChannelListOrder } from '@sendbird/chat/groupChannel';\nimport type { SendbirdChannel, SendbirdChatSDK, SendbirdGroupChannelListQuery } from '@sendbird/uikit-utils';\nimport { confirmAndMarkAsDelivered, useAsyncEffect, useFreshCallback, useUniqHandlerId } from '@sendbird/uikit-utils';\n\nimport { useAppFeatures } from '../../common/useAppFeatures';\nimport { useChannelHandler } from '../../handler/useChannelHandler';\nimport type { UseGroupChannelList, UseGroupChannelListOptions } from '../../types';\nimport { useGroupChannelListReducer } from './reducer';\n\nconst createGroupChannelListQuery = (\n sdk: SendbirdChatSDK,\n queryCreator: UseGroupChannelListOptions['queryCreator'],\n) => {\n const passedQuery = queryCreator?.();\n if (passedQuery) return passedQuery;\n\n return sdk.groupChannel.createMyGroupChannelListQuery({\n includeEmpty: false,\n limit: 20,\n order: GroupChannelListOrder.LATEST_LAST_MESSAGE,\n });\n};\n\nexport const useGroupChannelListWithQuery: UseGroupChannelList = (sdk, userId, options) => {\n const { deliveryReceiptEnabled } = useAppFeatures(sdk);\n const queryRef = useRef<SendbirdGroupChannelListQuery>();\n const handlerId = useUniqHandlerId('useGroupChannelListWithQuery');\n\n const {\n loading,\n groupChannels,\n refreshing,\n updateChannels,\n setChannels,\n deleteChannels,\n updateRefreshing,\n updateLoading,\n updateOrder,\n } = useGroupChannelListReducer();\n\n const updateChannelsAndMarkAsDelivered = (channels: SendbirdChannel[]) => {\n updateChannels(channels);\n if (deliveryReceiptEnabled) confirmAndMarkAsDelivered(channels);\n };\n\n const init = useFreshCallback(async (uid?: string) => {\n if (uid) {\n queryRef.current = createGroupChannelListQuery(sdk, options?.queryCreator);\n updateOrder(queryRef.current?.order);\n\n if (queryRef.current?.hasNext) {\n const channels = await queryRef.current.next();\n\n setChannels(channels, true);\n if (deliveryReceiptEnabled) confirmAndMarkAsDelivered(channels);\n }\n }\n });\n\n useAsyncEffect(async () => {\n updateLoading(true);\n await init(userId);\n updateLoading(false);\n }, [userId]);\n\n useChannelHandler(sdk, handlerId, {\n onChannelChanged: (channel) => updateChannels([channel]),\n onChannelFrozen: (channel) => updateChannels([channel]),\n onChannelUnfrozen: (channel) => updateChannels([channel]),\n onChannelMemberCountChanged: (channels) => updateChannels(channels),\n onChannelDeleted: (url) => deleteChannels([url]),\n onUserJoined: (channel) => updateChannels([channel]),\n onUserLeft: (channel, user) => {\n const isMe = user.userId === userId;\n if (isMe) deleteChannels([channel.url]);\n else updateChannels([channel]);\n },\n onUserBanned(channel, user) {\n const isMe = user.userId === userId;\n if (isMe) deleteChannels([channel.url]);\n else updateChannels([channel]);\n },\n onMessageReceived(channel) {\n updateChannelsAndMarkAsDelivered([channel]);\n },\n });\n\n const refresh = useFreshCallback(async () => {\n updateRefreshing(true);\n await init(userId);\n updateRefreshing(false);\n });\n\n const next = useFreshCallback(async () => {\n if (queryRef.current?.hasNext) {\n const channels = await queryRef.current.next();\n setChannels(channels, false);\n if (deliveryReceiptEnabled) confirmAndMarkAsDelivered(channels);\n }\n });\n\n return {\n loading,\n groupChannels,\n refresh,\n refreshing,\n next,\n };\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"names":["Logger","useGroupChannelMessagesWithCollection","useGroupChannelMessagesWithQuery","useGroupChannelMessages","sdk","channel","userId","options","isCacheEnabled","enableCollectionWithoutLocalCache","queryCreator","warn"],"sources":["index.ts"],"sourcesContent":["import { Logger } from '@sendbird/uikit-utils';\n\nimport type { UseGroupChannelMessages } from '../../types';\nimport { useGroupChannelMessagesWithCollection } from './useGroupChannelMessagesWithCollection';\nimport { useGroupChannelMessagesWithQuery } from './useGroupChannelMessagesWithQuery';\n\nexport const useGroupChannelMessages: UseGroupChannelMessages = (sdk, channel, userId, options) => {\n if (sdk.isCacheEnabled || options?.enableCollectionWithoutLocalCache) {\n if (options?.queryCreator) Logger.warn('`queryCreator` is ignored, please use `collectionCreator` instead.');\n return useGroupChannelMessagesWithCollection(sdk, channel, userId, options);\n } else {\n return useGroupChannelMessagesWithQuery(sdk, channel, userId, options);\n }\n};\n"],"mappings":"AAAA,SAASA,MAAT,QAAuB,uBAAvB;AAGA,SAASC,qCAAT,QAAsD,yCAAtD;AACA,SAASC,gCAAT,QAAiD,oCAAjD;AAEA,OAAO,MAAMC,uBAAgD,GAAG,CAACC,GAAD,EAAMC,OAAN,EAAeC,MAAf,EAAuBC,OAAvB,KAAmC;EACjG,IAAIH,GAAG,CAACI,cAAJ,IAAsBD,OAAtB,aAAsBA,OAAtB,eAAsBA,OAAO,CAAEE,iCAAnC,EAAsE;IACpE,IAAIF,OAAJ,aAAIA,OAAJ,eAAIA,OAAO,CAAEG,YAAb,EAA2BV,MAAM,CAACW,IAAP,CAAY,oEAAZ;IAC3B,OAAOV,qCAAqC,CAACG,GAAD,EAAMC,OAAN,EAAeC,MAAf,EAAuBC,OAAvB,CAA5C;EACD,CAHD,MAGO;IACL,OAAOL,gCAAgC,CAACE,GAAD,EAAMC,OAAN,EAAeC,MAAf,EAAuBC,OAAvB,CAAvC;EACD;AACF,CAPM"}
1
+ {"version":3,"names":["Logger","useGroupChannelMessagesWithCollection","useGroupChannelMessagesWithQuery","useGroupChannelMessages","sdk","channel","userId","options","isCacheEnabled","enableCollectionWithoutLocalCache","queryCreator","warn"],"sources":["index.ts"],"sourcesContent":["import { Logger } from '@sendbird/uikit-utils';\n\nimport type { UseGroupChannelMessages } from '../../types';\nimport { useGroupChannelMessagesWithCollection } from './useGroupChannelMessagesWithCollection';\nimport { useGroupChannelMessagesWithQuery } from './useGroupChannelMessagesWithQuery';\n\nexport const useGroupChannelMessages: UseGroupChannelMessages = (sdk, channel, userId, options) => {\n if (sdk.isCacheEnabled || options?.enableCollectionWithoutLocalCache) {\n if (options?.queryCreator) Logger.warn('`queryCreator` is ignored, please use `collectionCreator` instead.');\n return useGroupChannelMessagesWithCollection(sdk, channel, userId, options);\n } else {\n return useGroupChannelMessagesWithQuery(sdk, channel, userId, options);\n }\n};\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,uBAAuB;AAG9C,SAASC,qCAAqC,QAAQ,yCAAyC;AAC/F,SAASC,gCAAgC,QAAQ,oCAAoC;AAErF,OAAO,MAAMC,uBAAgD,GAAGA,CAACC,GAAG,EAAEC,OAAO,EAAEC,MAAM,EAAEC,OAAO,KAAK;EACjG,IAAIH,GAAG,CAACI,cAAc,IAAID,OAAO,aAAPA,OAAO,eAAPA,OAAO,CAAEE,iCAAiC,EAAE;IACpE,IAAIF,OAAO,aAAPA,OAAO,eAAPA,OAAO,CAAEG,YAAY,EAAEV,MAAM,CAACW,IAAI,CAAC,oEAAoE,CAAC;IAC5G,OAAOV,qCAAqC,CAACG,GAAG,EAAEC,OAAO,EAAEC,MAAM,EAAEC,OAAO,CAAC;EAC7E,CAAC,MAAM;IACL,OAAOL,gCAAgC,CAACE,GAAG,EAAEC,OAAO,EAAEC,MAAM,EAAEC,OAAO,CAAC;EACxE;AACF,CAAC"}
@@ -1,36 +1,46 @@
1
- import { useCallback, useEffect, useRef } from 'react';
1
+ import { useEffect, useRef } from 'react';
2
2
  import { MessageCollectionInitPolicy, MessageEventSource, MessageFilter } from '@sendbird/chat/groupChannel';
3
- import { Logger, confirmAndMarkAsRead, isDifferentChannel, useForceUpdate, useFreshCallback, useUniqHandlerId } from '@sendbird/uikit-utils';
3
+ import { Logger, confirmAndMarkAsRead, isDifferentChannel, isMyMessage, useForceUpdate, useFreshCallback, useUniqHandlerId } from '@sendbird/uikit-utils';
4
4
  import { useChannelHandler } from '../../handler/useChannelHandler';
5
- import { useGroupChannelMessagesReducer } from './reducer';
6
-
7
- const createMessageCollection = (channel, creator) => {
8
- if (creator) return creator();
5
+ import { useChannelMessagesReducer } from '../useChannelMessagesReducer';
6
+ const MESSAGE_LIMIT = {
7
+ DEFAULT: 50,
8
+ SEARCH: 20
9
+ };
10
+ const createMessageCollection = (channel, limit, options) => {
11
+ if (options !== null && options !== void 0 && options.collectionCreator) return options === null || options === void 0 ? void 0 : options.collectionCreator({
12
+ startingPoint: options === null || options === void 0 ? void 0 : options.startingPoint
13
+ });
9
14
  const filter = new MessageFilter();
10
15
  return channel.createMessageCollection({
11
16
  filter,
12
- limit: 100
17
+ limit,
18
+ startingPoint: options === null || options === void 0 ? void 0 : options.startingPoint
13
19
  });
14
20
  };
15
-
21
+ function isNotEmpty(arr) {
22
+ if (!arr) return false;
23
+ return arr.length !== 0;
24
+ }
16
25
  export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, options) => {
26
+ const initialStartingPoint = (options === null || options === void 0 ? void 0 : options.startingPoint) ?? Number.MAX_SAFE_INTEGER;
27
+ const initialLimit = typeof (options === null || options === void 0 ? void 0 : options.startingPoint) === 'number' ? MESSAGE_LIMIT.SEARCH : MESSAGE_LIMIT.DEFAULT;
17
28
  const forceUpdate = useForceUpdate();
18
29
  const collectionRef = useRef();
30
+ const collectionInitializedRef = useRef(false);
19
31
  const handlerId = useUniqHandlerId('useGroupChannelMessagesWithCollection');
20
32
  const {
21
33
  loading,
22
34
  refreshing,
23
35
  messages,
24
- nextMessages,
25
- newMessagesFromMembers,
36
+ newMessages,
26
37
  updateMessages,
27
- updateNextMessages,
28
- deleteNextMessages,
38
+ updateNewMessages,
39
+ deleteNewMessages,
29
40
  deleteMessages,
30
41
  updateLoading,
31
42
  updateRefreshing
32
- } = useGroupChannelMessagesReducer(userId, options === null || options === void 0 ? void 0 : options.sortComparator);
33
-
43
+ } = useChannelMessagesReducer(options === null || options === void 0 ? void 0 : options.sortComparator);
34
44
  const channelMarkAsRead = async source => {
35
45
  try {
36
46
  switch (source) {
@@ -45,147 +55,171 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
45
55
  Logger.warn('[useGroupChannelMessagesWithCollection/channelMarkAsRead]', e);
46
56
  }
47
57
  };
48
-
49
- const init = useCallback(async (uid, callback) => {
50
- var _collectionRef$curren;
51
-
58
+ const updateUnsendMessages = () => {
59
+ const {
60
+ pendingMessages,
61
+ failedMessages
62
+ } = collectionRef.current ?? {};
63
+ if (isNotEmpty(pendingMessages)) updateMessages(pendingMessages, false, sdk.currentUser.userId);
64
+ if (isNotEmpty(failedMessages)) updateMessages(failedMessages, false, sdk.currentUser.userId);
65
+ };
66
+ const init = useFreshCallback(async (startingPoint, limit, callback) => {
67
+ var _collectionRef$curren, _collectionRef$curren2;
52
68
  if (collectionRef.current) (_collectionRef$curren = collectionRef.current) === null || _collectionRef$curren === void 0 ? void 0 : _collectionRef$curren.dispose();
53
-
54
- if (uid) {
55
- var _collectionRef$curren2;
56
-
57
- collectionRef.current = createMessageCollection(channel, options === null || options === void 0 ? void 0 : options.collectionCreator);
58
- updateNextMessages([], true, sdk.currentUser.userId);
59
- channelMarkAsRead();
60
- (_collectionRef$curren2 = collectionRef.current) === null || _collectionRef$curren2 === void 0 ? void 0 : _collectionRef$curren2.setMessageCollectionHandler({
61
- onMessagesAdded: (_, __, messages) => {
62
- channelMarkAsRead(_.source);
63
- updateNextMessages(messages, false, sdk.currentUser.userId);
64
- },
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);
69
+ channelMarkAsRead();
70
+ updateNewMessages([], true, sdk.currentUser.userId);
71
+ collectionInitializedRef.current = false;
72
+ collectionRef.current = createMessageCollection(channel, limit, {
73
+ collectionCreator: options === null || options === void 0 ? void 0 : options.collectionCreator,
74
+ startingPoint
75
+ });
76
+ (_collectionRef$curren2 = collectionRef.current) === null || _collectionRef$curren2 === void 0 ? void 0 : _collectionRef$curren2.setMessageCollectionHandler({
77
+ onMessagesAdded: (_, __, messages) => {
78
+ channelMarkAsRead(_.source);
79
+ const incomingMessages = messages.filter(it => {
80
+ switch (_.source) {
81
+ case MessageEventSource.EVENT_MESSAGE_SENT_PENDING:
82
+ case MessageEventSource.EVENT_MESSAGE_SENT_SUCCESS:
83
+ case MessageEventSource.EVENT_MESSAGE_SENT_FAILED:
84
+ return !isMyMessage(it, sdk.currentUser.userId);
85
+ default:
86
+ return true;
78
87
  }
79
- },
80
- onMessagesDeleted: (_, __, messageIds) => {
81
- deleteMessages(messageIds, []);
82
- deleteNextMessages(messageIds, []);
83
- },
84
- onChannelDeleted: () => {
85
- var _options$onChannelDel;
86
-
87
- options === null || options === void 0 ? void 0 : (_options$onChannelDel = options.onChannelDeleted) === null || _options$onChannelDel === void 0 ? void 0 : _options$onChannelDel.call(options);
88
- },
89
- onChannelUpdated: (_, eventChannel) => {
90
- if (eventChannel.isGroupChannel() && !isDifferentChannel(eventChannel, channel)) {
91
- forceUpdate();
88
+ });
89
+ if (incomingMessages.length > 0) {
90
+ var _options$shouldCountN;
91
+ updateMessages(incomingMessages, false, sdk.currentUser.userId);
92
+ if (options !== null && options !== void 0 && (_options$shouldCountN = options.shouldCountNewMessages) !== null && _options$shouldCountN !== void 0 && _options$shouldCountN.call(options)) {
93
+ updateNewMessages(incomingMessages, false, sdk.currentUser.userId);
94
+ }
95
+ switch (_.source) {
96
+ case MessageEventSource.EVENT_MESSAGE_RECEIVED:
97
+ case MessageEventSource.SYNC_MESSAGE_FILL:
98
+ {
99
+ var _options$onMessagesRe;
100
+ options === null || options === void 0 ? void 0 : (_options$onMessagesRe = options.onMessagesReceived) === null || _options$onMessagesRe === void 0 ? void 0 : _options$onMessagesRe.call(options, incomingMessages);
101
+ }
92
102
  }
93
- },
94
- onHugeGapDetected: () => {
95
- init(uid);
96
- }
97
- });
98
- collectionRef.current.initialize(MessageCollectionInitPolicy.CACHE_AND_REPLACE_BY_API).onCacheResult((err, messages) => {
99
- if (err) sdk.isCacheEnabled && Logger.error('[useGroupChannelMessagesWithCollection/onCacheResult]', err);else {
100
- var _collectionRef$curren3, _collectionRef$curren4;
101
-
102
- Logger.debug('[useGroupChannelMessagesWithCollection/onCacheResult]', 'message length:', messages.length);
103
- updateMessages(messages, true, sdk.currentUser.userId);
104
- updateMessages(((_collectionRef$curren3 = collectionRef.current) === null || _collectionRef$curren3 === void 0 ? void 0 : _collectionRef$curren3.pendingMessages) ?? [], false, sdk.currentUser.userId);
105
- updateMessages(((_collectionRef$curren4 = collectionRef.current) === null || _collectionRef$curren4 === void 0 ? void 0 : _collectionRef$curren4.failedMessages) ?? [], false, sdk.currentUser.userId);
106
103
  }
107
- callback === null || callback === void 0 ? void 0 : callback();
108
- }).onApiResult((err, messages) => {
109
- if (err) Logger.warn('[useGroupChannelMessagesWithCollection/onApiResult]', err);else {
110
- Logger.debug('[useGroupChannelMessagesWithCollection/onApiResult]', 'message length:', messages.length);
111
- updateMessages(messages, true, sdk.currentUser.userId);
112
-
113
- if (sdk.isCacheEnabled) {
114
- var _collectionRef$curren5, _collectionRef$curren6;
115
-
116
- updateMessages(((_collectionRef$curren5 = collectionRef.current) === null || _collectionRef$curren5 === void 0 ? void 0 : _collectionRef$curren5.pendingMessages) ?? [], false, sdk.currentUser.userId);
117
- updateMessages(((_collectionRef$curren6 = collectionRef.current) === null || _collectionRef$curren6 === void 0 ? void 0 : _collectionRef$curren6.failedMessages) ?? [], false, sdk.currentUser.userId);
104
+ },
105
+ onMessagesUpdated: (_, __, messages) => {
106
+ channelMarkAsRead(_.source);
107
+ const incomingMessages = messages.filter(it => {
108
+ switch (_.source) {
109
+ case MessageEventSource.EVENT_MESSAGE_UPDATED:
110
+ return !isMyMessage(it, sdk.currentUser.userId);
111
+ default:
112
+ return true;
113
+ }
114
+ });
115
+ if (incomingMessages.length > 0) {
116
+ var _options$shouldCountN2;
117
+ // NOTE: admin message is not added via onMessagesAdded handler, not checked yet is this a bug.
118
+ updateMessages(messages, false, sdk.currentUser.userId);
119
+ if (options !== null && options !== void 0 && (_options$shouldCountN2 = options.shouldCountNewMessages) !== null && _options$shouldCountN2 !== void 0 && _options$shouldCountN2.call(options)) {
120
+ if (_.source === MessageEventSource.EVENT_MESSAGE_RECEIVED) {
121
+ updateNewMessages(messages, false, sdk.currentUser.userId);
122
+ }
118
123
  }
119
124
  }
120
- callback === null || callback === void 0 ? void 0 : callback();
121
- });
122
- }
123
- }, [sdk, channel.url, options === null || options === void 0 ? void 0 : options.collectionCreator]);
125
+ },
126
+ onMessagesDeleted: (_, __, messageIds) => {
127
+ deleteMessages(messageIds, []);
128
+ deleteNewMessages(messageIds, []);
129
+ },
130
+ onChannelDeleted: () => {
131
+ var _options$onChannelDel;
132
+ options === null || options === void 0 ? void 0 : (_options$onChannelDel = options.onChannelDeleted) === null || _options$onChannelDel === void 0 ? void 0 : _options$onChannelDel.call(options);
133
+ },
134
+ onChannelUpdated: (_, eventChannel) => {
135
+ if (eventChannel.isGroupChannel() && !isDifferentChannel(eventChannel, channel)) {
136
+ forceUpdate();
137
+ }
138
+ },
139
+ onHugeGapDetected: () => {
140
+ init(Number.MAX_SAFE_INTEGER, MESSAGE_LIMIT.DEFAULT);
141
+ }
142
+ });
143
+ collectionRef.current.initialize(MessageCollectionInitPolicy.CACHE_AND_REPLACE_BY_API).onCacheResult((err, messages) => {
144
+ if (err) sdk.isCacheEnabled && Logger.error('[useGroupChannelMessagesWithCollection/onCacheResult]', err);else {
145
+ Logger.debug('[useGroupChannelMessagesWithCollection/onCacheResult]', 'message length:', messages.length);
146
+ updateMessages(messages, true, sdk.currentUser.userId);
147
+ updateUnsendMessages();
148
+ }
149
+ callback === null || callback === void 0 ? void 0 : callback();
150
+ }).onApiResult((err, messages) => {
151
+ if (err) Logger.warn('[useGroupChannelMessagesWithCollection/onApiResult]', err);else {
152
+ var _options$onMessagesRe2;
153
+ Logger.debug('[useGroupChannelMessagesWithCollection/onApiResult]', 'message length:', messages.length);
154
+ updateMessages(messages, true, sdk.currentUser.userId);
155
+ if (!(options !== null && options !== void 0 && options.startingPoint)) options === null || options === void 0 ? void 0 : (_options$onMessagesRe2 = options.onMessagesReceived) === null || _options$onMessagesRe2 === void 0 ? void 0 : _options$onMessagesRe2.call(options, messages);
156
+ if (sdk.isCacheEnabled) updateUnsendMessages();
157
+ }
158
+ collectionInitializedRef.current = true;
159
+ callback === null || callback === void 0 ? void 0 : callback();
160
+ });
161
+ });
124
162
  useChannelHandler(sdk, handlerId, {
125
163
  onUserBanned(channel, bannedUser) {
126
164
  if (channel.isGroupChannel() && !isDifferentChannel(channel, channel)) {
127
165
  if (bannedUser.userId === sdk.currentUser.userId) {
128
166
  var _options$onChannelDel2;
129
-
130
167
  options === null || options === void 0 ? void 0 : (_options$onChannelDel2 = options.onChannelDeleted) === null || _options$onChannelDel2 === void 0 ? void 0 : _options$onChannelDel2.call(options);
131
168
  } else {
132
169
  forceUpdate();
133
170
  }
134
171
  }
135
172
  }
136
-
137
173
  });
138
174
  useEffect(() => {
139
175
  // NOTE: Cache read is heavy task, and it prevents smooth ui transition
140
176
  setTimeout(async () => {
141
177
  updateLoading(true);
142
- init(userId, () => updateLoading(false));
178
+ init(initialStartingPoint, initialLimit, () => updateLoading(false));
143
179
  }, 0);
144
- }, [init, userId]);
180
+ }, [channel.url, userId]);
145
181
  useEffect(() => {
146
182
  return () => {
147
- var _collectionRef$curren7;
148
-
149
- if (collectionRef.current) (_collectionRef$curren7 = collectionRef.current) === null || _collectionRef$curren7 === void 0 ? void 0 : _collectionRef$curren7.dispose();
183
+ var _collectionRef$curren3;
184
+ if (collectionRef.current) (_collectionRef$curren3 = collectionRef.current) === null || _collectionRef$curren3 === void 0 ? void 0 : _collectionRef$curren3.dispose();
150
185
  };
151
186
  }, []);
152
187
  const refresh = useFreshCallback(async () => {
153
188
  updateRefreshing(true);
154
- init(userId, () => updateRefreshing(false));
189
+ init(Number.MAX_SAFE_INTEGER, MESSAGE_LIMIT.DEFAULT, () => updateRefreshing(false));
155
190
  });
156
191
  const prev = useFreshCallback(async () => {
157
- var _collectionRef$curren8;
158
-
159
- if (collectionRef.current && (_collectionRef$curren8 = collectionRef.current) !== null && _collectionRef$curren8 !== void 0 && _collectionRef$curren8.hasPrevious) {
192
+ var _collectionRef$curren4;
193
+ if (collectionRef.current && (_collectionRef$curren4 = collectionRef.current) !== null && _collectionRef$curren4 !== void 0 && _collectionRef$curren4.hasPrevious) {
160
194
  try {
161
- var _collectionRef$curren9;
162
-
163
- const list = await ((_collectionRef$curren9 = collectionRef.current) === null || _collectionRef$curren9 === void 0 ? void 0 : _collectionRef$curren9.loadPrevious());
195
+ var _collectionRef$curren5;
196
+ const list = await ((_collectionRef$curren5 = collectionRef.current) === null || _collectionRef$curren5 === void 0 ? void 0 : _collectionRef$curren5.loadPrevious());
164
197
  updateMessages(list, false, sdk.currentUser.userId);
165
198
  } catch {}
166
199
  }
167
200
  });
201
+ const hasPrev = useFreshCallback(() => {
202
+ if (collectionInitializedRef.current && collectionRef.current) {
203
+ return collectionRef.current.hasPrevious;
204
+ } else {
205
+ return false;
206
+ }
207
+ });
168
208
  const next = useFreshCallback(async () => {
169
- var _collectionRef$curren10;
170
-
171
- const messageCandidates = [];
172
-
173
- if (collectionRef.current && (_collectionRef$curren10 = collectionRef.current) !== null && _collectionRef$curren10 !== void 0 && _collectionRef$curren10.hasNext) {
209
+ var _collectionRef$curren6;
210
+ if (collectionRef.current && (_collectionRef$curren6 = collectionRef.current) !== null && _collectionRef$curren6 !== void 0 && _collectionRef$curren6.hasNext) {
174
211
  try {
175
- var _collectionRef$curren11;
176
-
177
- const fetchedList = await ((_collectionRef$curren11 = collectionRef.current) === null || _collectionRef$curren11 === void 0 ? void 0 : _collectionRef$curren11.loadNext());
178
- messageCandidates.push(...fetchedList);
212
+ var _collectionRef$curren7;
213
+ const fetchedList = await ((_collectionRef$curren7 = collectionRef.current) === null || _collectionRef$curren7 === void 0 ? void 0 : _collectionRef$curren7.loadNext());
214
+ updateMessages(fetchedList, false, sdk.currentUser.userId);
179
215
  } catch {}
180
216
  }
181
-
182
- if (nextMessages.length > 0) {
183
- messageCandidates.push(...nextMessages);
184
- }
185
-
186
- if (messageCandidates.length > 0) {
187
- updateMessages(messageCandidates, false, sdk.currentUser.userId);
188
- updateNextMessages([], true, sdk.currentUser.userId);
217
+ });
218
+ const hasNext = useFreshCallback(() => {
219
+ if (collectionInitializedRef.current && collectionRef.current) {
220
+ return collectionRef.current.hasNext;
221
+ } else {
222
+ return false;
189
223
  }
190
224
  });
191
225
  const sendUserMessage = useFreshCallback((params, onPending) => {
@@ -200,8 +234,8 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
200
234
  updateMessages([sentMessage], false, sdk.currentUser.userId);
201
235
  resolve(sentMessage);
202
236
  }
203
- }).onFailed((err, _failedMessage) => {
204
- // updateMessages([failedMessage], false, sdk.currentUser.userId);
237
+ }).onFailed((err, failedMessage) => {
238
+ updateMessages([failedMessage], false, sdk.currentUser.userId);
205
239
  reject(err);
206
240
  });
207
241
  });
@@ -218,8 +252,8 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
218
252
  updateMessages([sentMessage], false, sdk.currentUser.userId);
219
253
  resolve(sentMessage);
220
254
  }
221
- }).onFailed((err, _failedMessage) => {
222
- // updateMessages([failedMessage], false, sdk.currentUser.userId);
255
+ }).onFailed((err, failedMessage) => {
256
+ updateMessages([failedMessage], false, sdk.currentUser.userId);
223
257
  reject(err);
224
258
  });
225
259
  });
@@ -248,29 +282,44 @@ export const useGroupChannelMessagesWithCollection = (sdk, channel, userId, opti
248
282
  if (message.isFileMessage()) await channel.deleteMessage(message);
249
283
  } else {
250
284
  try {
251
- var _collectionRef$curren12;
252
-
253
- await ((_collectionRef$curren12 = collectionRef.current) === null || _collectionRef$curren12 === void 0 ? void 0 : _collectionRef$curren12.removeFailedMessage(message.reqId));
285
+ var _collectionRef$curren8;
286
+ await ((_collectionRef$curren8 = collectionRef.current) === null || _collectionRef$curren8 === void 0 ? void 0 : _collectionRef$curren8.removeFailedMessage(message.reqId));
254
287
  } finally {
255
288
  deleteMessages([message.messageId], [message.reqId]);
256
289
  }
257
290
  }
258
291
  });
292
+ const resetNewMessages = useFreshCallback(() => {
293
+ updateNewMessages([], true, sdk.currentUser.userId);
294
+ });
295
+ const resetWithStartingPoint = useFreshCallback((startingPoint, callback) => {
296
+ updateLoading(true);
297
+ updateMessages([], true, sdk.currentUser.userId);
298
+ init(startingPoint, MESSAGE_LIMIT.DEFAULT, () => {
299
+ updateLoading(false);
300
+ callback === null || callback === void 0 ? void 0 : callback();
301
+ });
302
+ });
259
303
  return {
260
304
  loading,
261
305
  refreshing,
262
306
  refresh,
263
307
  messages,
264
- nextMessages,
265
- newMessagesFromMembers,
266
308
  next,
309
+ hasNext,
267
310
  prev,
311
+ hasPrev,
312
+ newMessages,
313
+ resetNewMessages,
268
314
  sendUserMessage,
269
315
  sendFileMessage,
270
316
  updateUserMessage,
271
317
  updateFileMessage,
272
318
  resendMessage,
273
- deleteMessage
319
+ deleteMessage,
320
+ resetWithStartingPoint,
321
+ nextMessages: newMessages,
322
+ newMessagesFromMembers: newMessages
274
323
  };
275
324
  };
276
325
  //# sourceMappingURL=useGroupChannelMessagesWithCollection.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useEffect","useRef","MessageCollectionInitPolicy","MessageEventSource","MessageFilter","Logger","confirmAndMarkAsRead","isDifferentChannel","useForceUpdate","useFreshCallback","useUniqHandlerId","useChannelHandler","useGroupChannelMessagesReducer","createMessageCollection","channel","creator","filter","limit","useGroupChannelMessagesWithCollection","sdk","userId","options","forceUpdate","collectionRef","handlerId","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 useUniqHandlerId,\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\nexport const useGroupChannelMessagesWithCollection: UseGroupChannelMessages = (sdk, channel, userId, options) => {\n const forceUpdate = useForceUpdate();\n const collectionRef = useRef<SendbirdMessageCollection>();\n const handlerId = useUniqHandlerId('useGroupChannelMessagesWithCollection');\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('[useGroupChannelMessagesWithCollection/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('[useGroupChannelMessagesWithCollection/onCacheResult]', err);\n else {\n Logger.debug('[useGroupChannelMessagesWithCollection/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('[useGroupChannelMessagesWithCollection/onApiResult]', err);\n else {\n Logger.debug('[useGroupChannelMessagesWithCollection/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, handlerId, {\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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"}
1
+ {"version":3,"names":["useEffect","useRef","MessageCollectionInitPolicy","MessageEventSource","MessageFilter","Logger","confirmAndMarkAsRead","isDifferentChannel","isMyMessage","useForceUpdate","useFreshCallback","useUniqHandlerId","useChannelHandler","useChannelMessagesReducer","MESSAGE_LIMIT","DEFAULT","SEARCH","createMessageCollection","channel","limit","options","collectionCreator","startingPoint","filter","isNotEmpty","arr","length","useGroupChannelMessagesWithCollection","sdk","userId","initialStartingPoint","Number","MAX_SAFE_INTEGER","initialLimit","forceUpdate","collectionRef","collectionInitializedRef","handlerId","loading","refreshing","messages","newMessages","updateMessages","updateNewMessages","deleteNewMessages","deleteMessages","updateLoading","updateRefreshing","sortComparator","channelMarkAsRead","source","EVENT_MESSAGE_RECEIVED","EVENT_MESSAGE_SENT_SUCCESS","SYNC_MESSAGE_FILL","undefined","e","warn","updateUnsendMessages","pendingMessages","failedMessages","current","currentUser","init","callback","_collectionRef$curren","_collectionRef$curren2","dispose","setMessageCollectionHandler","onMessagesAdded","_","__","incomingMessages","it","EVENT_MESSAGE_SENT_PENDING","EVENT_MESSAGE_SENT_FAILED","_options$shouldCountN","shouldCountNewMessages","call","_options$onMessagesRe","onMessagesReceived","onMessagesUpdated","EVENT_MESSAGE_UPDATED","_options$shouldCountN2","onMessagesDeleted","messageIds","onChannelDeleted","_options$onChannelDel","onChannelUpdated","eventChannel","isGroupChannel","onHugeGapDetected","initialize","CACHE_AND_REPLACE_BY_API","onCacheResult","err","isCacheEnabled","error","debug","onApiResult","_options$onMessagesRe2","onUserBanned","bannedUser","_options$onChannelDel2","setTimeout","url","_collectionRef$curren3","refresh","prev","_collectionRef$curren4","hasPrevious","_collectionRef$curren5","list","loadPrevious","hasPrev","next","_collectionRef$curren6","hasNext","_collectionRef$curren7","fetchedList","loadNext","sendUserMessage","params","onPending","Promise","resolve","reject","pendingMessage","isUserMessage","onSucceeded","sentMessage","onFailed","failedMessage","sendFileMessage","isFileMessage","updateUserMessage","messageId","updatedMessage","updateFileMessage","resendMessage","resentMessage","resendUserMessage","resendFileMessage","deleteMessage","message","sendingStatus","_collectionRef$curren8","removeFailedMessage","reqId","resetNewMessages","resetWithStartingPoint","nextMessages","newMessagesFromMembers"],"sources":["useGroupChannelMessagesWithCollection.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport { MessageCollectionInitPolicy, MessageEventSource, MessageFilter } from '@sendbird/chat/groupChannel';\nimport type { SendbirdFileMessage, SendbirdGroupChannel, SendbirdMessageCollection } from '@sendbird/uikit-utils';\nimport {\n Logger,\n confirmAndMarkAsRead,\n isDifferentChannel,\n isMyMessage,\n useForceUpdate,\n useFreshCallback,\n useUniqHandlerId,\n} from '@sendbird/uikit-utils';\n\nimport { useChannelHandler } from '../../handler/useChannelHandler';\nimport type { UseGroupChannelMessages, UseGroupChannelMessagesOptions } from '../../types';\nimport { useChannelMessagesReducer } from '../useChannelMessagesReducer';\n\nconst MESSAGE_LIMIT = {\n DEFAULT: 50,\n SEARCH: 20,\n};\n\nconst createMessageCollection = (\n channel: SendbirdGroupChannel,\n limit: number,\n options?: UseGroupChannelMessagesOptions,\n) => {\n if (options?.collectionCreator) return options?.collectionCreator({ startingPoint: options?.startingPoint });\n const filter = new MessageFilter();\n return channel.createMessageCollection({ filter, limit, startingPoint: options?.startingPoint });\n};\n\nfunction isNotEmpty(arr?: unknown[]): arr is unknown[] {\n if (!arr) return false;\n return arr.length !== 0;\n}\n\nexport const useGroupChannelMessagesWithCollection: UseGroupChannelMessages = (sdk, channel, userId, options) => {\n const initialStartingPoint = options?.startingPoint ?? Number.MAX_SAFE_INTEGER;\n const initialLimit = typeof options?.startingPoint === 'number' ? MESSAGE_LIMIT.SEARCH : MESSAGE_LIMIT.DEFAULT;\n\n const forceUpdate = useForceUpdate();\n const collectionRef = useRef<SendbirdMessageCollection>();\n const collectionInitializedRef = useRef(false);\n const handlerId = useUniqHandlerId('useGroupChannelMessagesWithCollection');\n\n const {\n loading,\n refreshing,\n messages,\n newMessages,\n updateMessages,\n updateNewMessages,\n deleteNewMessages,\n deleteMessages,\n updateLoading,\n updateRefreshing,\n } = useChannelMessagesReducer(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('[useGroupChannelMessagesWithCollection/channelMarkAsRead]', e);\n }\n };\n\n const updateUnsendMessages = () => {\n const { pendingMessages, failedMessages } = collectionRef.current ?? {};\n if (isNotEmpty(pendingMessages)) updateMessages(pendingMessages, false, sdk.currentUser.userId);\n if (isNotEmpty(failedMessages)) updateMessages(failedMessages, false, sdk.currentUser.userId);\n };\n\n const init = useFreshCallback(async (startingPoint: number, limit: number, callback?: () => void) => {\n if (collectionRef.current) collectionRef.current?.dispose();\n\n channelMarkAsRead();\n updateNewMessages([], true, sdk.currentUser.userId);\n\n collectionInitializedRef.current = false;\n collectionRef.current = createMessageCollection(channel, limit, {\n collectionCreator: options?.collectionCreator,\n startingPoint,\n });\n\n collectionRef.current?.setMessageCollectionHandler({\n onMessagesAdded: (_, __, messages) => {\n channelMarkAsRead(_.source);\n\n const incomingMessages = messages.filter((it) => {\n switch (_.source) {\n case MessageEventSource.EVENT_MESSAGE_SENT_PENDING:\n case MessageEventSource.EVENT_MESSAGE_SENT_SUCCESS:\n case MessageEventSource.EVENT_MESSAGE_SENT_FAILED:\n return !isMyMessage(it, sdk.currentUser.userId);\n default:\n return true;\n }\n });\n\n if (incomingMessages.length > 0) {\n updateMessages(incomingMessages, false, sdk.currentUser.userId);\n\n if (options?.shouldCountNewMessages?.()) {\n updateNewMessages(incomingMessages, false, sdk.currentUser.userId);\n }\n\n switch (_.source) {\n case MessageEventSource.EVENT_MESSAGE_RECEIVED:\n case MessageEventSource.SYNC_MESSAGE_FILL: {\n options?.onMessagesReceived?.(incomingMessages);\n }\n }\n }\n },\n onMessagesUpdated: (_, __, messages) => {\n channelMarkAsRead(_.source);\n\n const incomingMessages = messages.filter((it) => {\n switch (_.source) {\n case MessageEventSource.EVENT_MESSAGE_UPDATED:\n return !isMyMessage(it, sdk.currentUser.userId);\n default:\n return true;\n }\n });\n\n if (incomingMessages.length > 0) {\n // NOTE: admin message is not added via onMessagesAdded handler, not checked yet is this a bug.\n updateMessages(messages, false, sdk.currentUser.userId);\n\n if (options?.shouldCountNewMessages?.()) {\n if (_.source === MessageEventSource.EVENT_MESSAGE_RECEIVED) {\n updateNewMessages(messages, false, sdk.currentUser.userId);\n }\n }\n }\n },\n onMessagesDeleted: (_, __, messageIds) => {\n deleteMessages(messageIds, []);\n deleteNewMessages(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(Number.MAX_SAFE_INTEGER, MESSAGE_LIMIT.DEFAULT);\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('[useGroupChannelMessagesWithCollection/onCacheResult]', err);\n else {\n Logger.debug('[useGroupChannelMessagesWithCollection/onCacheResult]', 'message length:', messages.length);\n\n updateMessages(messages, true, sdk.currentUser.userId);\n updateUnsendMessages();\n }\n\n callback?.();\n })\n .onApiResult((err, messages) => {\n if (err) Logger.warn('[useGroupChannelMessagesWithCollection/onApiResult]', err);\n else {\n Logger.debug('[useGroupChannelMessagesWithCollection/onApiResult]', 'message length:', messages.length);\n\n updateMessages(messages, true, sdk.currentUser.userId);\n if (!options?.startingPoint) options?.onMessagesReceived?.(messages);\n if (sdk.isCacheEnabled) updateUnsendMessages();\n }\n\n collectionInitializedRef.current = true;\n callback?.();\n });\n });\n\n useChannelHandler(sdk, handlerId, {\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(initialStartingPoint, initialLimit, () => updateLoading(false));\n }, 0);\n }, [channel.url, 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(Number.MAX_SAFE_INTEGER, MESSAGE_LIMIT.DEFAULT, () => 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 hasPrev: ReturnType<UseGroupChannelMessages>['hasPrev'] = useFreshCallback(() => {\n if (collectionInitializedRef.current && collectionRef.current) {\n return collectionRef.current.hasPrevious;\n } else {\n return false;\n }\n });\n\n const next: ReturnType<UseGroupChannelMessages>['next'] = useFreshCallback(async () => {\n if (collectionRef.current && collectionRef.current?.hasNext) {\n try {\n const fetchedList = await collectionRef.current?.loadNext();\n updateMessages(fetchedList, false, sdk.currentUser.userId);\n } catch {}\n }\n });\n\n const hasNext: ReturnType<UseGroupChannelMessages>['hasNext'] = useFreshCallback(() => {\n if (collectionInitializedRef.current && collectionRef.current) {\n return collectionRef.current.hasNext;\n } else {\n return false;\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 const resetNewMessages: ReturnType<UseGroupChannelMessages>['resetNewMessages'] = useFreshCallback(() => {\n updateNewMessages([], true, sdk.currentUser.userId);\n });\n const resetWithStartingPoint: ReturnType<UseGroupChannelMessages>['resetWithStartingPoint'] = useFreshCallback(\n (startingPoint, callback) => {\n updateLoading(true);\n updateMessages([], true, sdk.currentUser.userId);\n init(startingPoint, MESSAGE_LIMIT.DEFAULT, () => {\n updateLoading(false);\n callback?.();\n });\n },\n );\n\n return {\n loading,\n refreshing,\n refresh,\n messages,\n next,\n hasNext,\n prev,\n hasPrev,\n newMessages,\n resetNewMessages,\n sendUserMessage,\n sendFileMessage,\n updateUserMessage,\n updateFileMessage,\n resendMessage,\n deleteMessage,\n resetWithStartingPoint,\n nextMessages: newMessages,\n newMessagesFromMembers: newMessages,\n };\n};\n"],"mappings":"AAAA,SAASA,SAAS,EAAEC,MAAM,QAAQ,OAAO;AAEzC,SAASC,2BAA2B,EAAEC,kBAAkB,EAAEC,aAAa,QAAQ,6BAA6B;AAE5G,SACEC,MAAM,EACNC,oBAAoB,EACpBC,kBAAkB,EAClBC,WAAW,EACXC,cAAc,EACdC,gBAAgB,EAChBC,gBAAgB,QACX,uBAAuB;AAE9B,SAASC,iBAAiB,QAAQ,iCAAiC;AAEnE,SAASC,yBAAyB,QAAQ,8BAA8B;AAExE,MAAMC,aAAa,GAAG;EACpBC,OAAO,EAAE,EAAE;EACXC,MAAM,EAAE;AACV,CAAC;AAED,MAAMC,uBAAuB,GAAGA,CAC9BC,OAA6B,EAC7BC,KAAa,EACbC,OAAwC,KACrC;EACH,IAAIA,OAAO,aAAPA,OAAO,eAAPA,OAAO,CAAEC,iBAAiB,EAAE,OAAOD,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEC,iBAAiB,CAAC;IAAEC,aAAa,EAAEF,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEE;EAAc,CAAC,CAAC;EAC5G,MAAMC,MAAM,GAAG,IAAInB,aAAa,EAAE;EAClC,OAAOc,OAAO,CAACD,uBAAuB,CAAC;IAAEM,MAAM;IAAEJ,KAAK;IAAEG,aAAa,EAAEF,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEE;EAAc,CAAC,CAAC;AAClG,CAAC;AAED,SAASE,UAAUA,CAACC,GAAe,EAAoB;EACrD,IAAI,CAACA,GAAG,EAAE,OAAO,KAAK;EACtB,OAAOA,GAAG,CAACC,MAAM,KAAK,CAAC;AACzB;AAEA,OAAO,MAAMC,qCAA8D,GAAGA,CAACC,GAAG,EAAEV,OAAO,EAAEW,MAAM,EAAET,OAAO,KAAK;EAC/G,MAAMU,oBAAoB,GAAG,CAAAV,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEE,aAAa,KAAIS,MAAM,CAACC,gBAAgB;EAC9E,MAAMC,YAAY,GAAG,QAAOb,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEE,aAAa,MAAK,QAAQ,GAAGR,aAAa,CAACE,MAAM,GAAGF,aAAa,CAACC,OAAO;EAE9G,MAAMmB,WAAW,GAAGzB,cAAc,EAAE;EACpC,MAAM0B,aAAa,GAAGlC,MAAM,EAA6B;EACzD,MAAMmC,wBAAwB,GAAGnC,MAAM,CAAC,KAAK,CAAC;EAC9C,MAAMoC,SAAS,GAAG1B,gBAAgB,CAAC,uCAAuC,CAAC;EAE3E,MAAM;IACJ2B,OAAO;IACPC,UAAU;IACVC,QAAQ;IACRC,WAAW;IACXC,cAAc;IACdC,iBAAiB;IACjBC,iBAAiB;IACjBC,cAAc;IACdC,aAAa;IACbC;EACF,CAAC,GAAGlC,yBAAyB,CAACO,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAE4B,cAAc,CAAC;EAEtD,MAAMC,iBAAiB,GAAG,MAAOC,MAA2B,IAAK;IAC/D,IAAI;MACF,QAAQA,MAAM;QACZ,KAAK/C,kBAAkB,CAACgD,sBAAsB;QAC9C,KAAKhD,kBAAkB,CAACiD,0BAA0B;QAClD,KAAKjD,kBAAkB,CAACkD,iBAAiB;QACzC,KAAKC,SAAS;UACZ,MAAMhD,oBAAoB,CAAC,CAACY,OAAO,CAAC,CAAC;UACrC;MAAM;IAEZ,CAAC,CAAC,OAAOqC,CAAC,EAAE;MACVlD,MAAM,CAACmD,IAAI,CAAC,2DAA2D,EAAED,CAAC,CAAC;IAC7E;EACF,CAAC;EAED,MAAME,oBAAoB,GAAGA,CAAA,KAAM;IACjC,MAAM;MAAEC,eAAe;MAAEC;IAAe,CAAC,GAAGxB,aAAa,CAACyB,OAAO,IAAI,CAAC,CAAC;IACvE,IAAIpC,UAAU,CAACkC,eAAe,CAAC,EAAEhB,cAAc,CAACgB,eAAe,EAAE,KAAK,EAAE9B,GAAG,CAACiC,WAAW,CAAChC,MAAM,CAAC;IAC/F,IAAIL,UAAU,CAACmC,cAAc,CAAC,EAAEjB,cAAc,CAACiB,cAAc,EAAE,KAAK,EAAE/B,GAAG,CAACiC,WAAW,CAAChC,MAAM,CAAC;EAC/F,CAAC;EAED,MAAMiC,IAAI,GAAGpD,gBAAgB,CAAC,OAAOY,aAAqB,EAAEH,KAAa,EAAE4C,QAAqB,KAAK;IAAA,IAAAC,qBAAA,EAAAC,sBAAA;IACnG,IAAI9B,aAAa,CAACyB,OAAO,EAAE,CAAAI,qBAAA,GAAA7B,aAAa,CAACyB,OAAO,cAAAI,qBAAA,uBAArBA,qBAAA,CAAuBE,OAAO,EAAE;IAE3DjB,iBAAiB,EAAE;IACnBN,iBAAiB,CAAC,EAAE,EAAE,IAAI,EAAEf,GAAG,CAACiC,WAAW,CAAChC,MAAM,CAAC;IAEnDO,wBAAwB,CAACwB,OAAO,GAAG,KAAK;IACxCzB,aAAa,CAACyB,OAAO,GAAG3C,uBAAuB,CAACC,OAAO,EAAEC,KAAK,EAAE;MAC9DE,iBAAiB,EAAED,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEC,iBAAiB;MAC7CC;IACF,CAAC,CAAC;IAEF,CAAA2C,sBAAA,GAAA9B,aAAa,CAACyB,OAAO,cAAAK,sBAAA,uBAArBA,sBAAA,CAAuBE,2BAA2B,CAAC;MACjDC,eAAe,EAAEA,CAACC,CAAC,EAAEC,EAAE,EAAE9B,QAAQ,KAAK;QACpCS,iBAAiB,CAACoB,CAAC,CAACnB,MAAM,CAAC;QAE3B,MAAMqB,gBAAgB,GAAG/B,QAAQ,CAACjB,MAAM,CAAEiD,EAAE,IAAK;UAC/C,QAAQH,CAAC,CAACnB,MAAM;YACd,KAAK/C,kBAAkB,CAACsE,0BAA0B;YAClD,KAAKtE,kBAAkB,CAACiD,0BAA0B;YAClD,KAAKjD,kBAAkB,CAACuE,yBAAyB;cAC/C,OAAO,CAAClE,WAAW,CAACgE,EAAE,EAAE5C,GAAG,CAACiC,WAAW,CAAChC,MAAM,CAAC;YACjD;cACE,OAAO,IAAI;UAAC;QAElB,CAAC,CAAC;QAEF,IAAI0C,gBAAgB,CAAC7C,MAAM,GAAG,CAAC,EAAE;UAAA,IAAAiD,qBAAA;UAC/BjC,cAAc,CAAC6B,gBAAgB,EAAE,KAAK,EAAE3C,GAAG,CAACiC,WAAW,CAAChC,MAAM,CAAC;UAE/D,IAAIT,OAAO,aAAPA,OAAO,gBAAAuD,qBAAA,GAAPvD,OAAO,CAAEwD,sBAAsB,cAAAD,qBAAA,eAA/BA,qBAAA,CAAAE,IAAA,CAAAzD,OAAO,CAA4B,EAAE;YACvCuB,iBAAiB,CAAC4B,gBAAgB,EAAE,KAAK,EAAE3C,GAAG,CAACiC,WAAW,CAAChC,MAAM,CAAC;UACpE;UAEA,QAAQwC,CAAC,CAACnB,MAAM;YACd,KAAK/C,kBAAkB,CAACgD,sBAAsB;YAC9C,KAAKhD,kBAAkB,CAACkD,iBAAiB;cAAE;gBAAA,IAAAyB,qBAAA;gBACzC1D,OAAO,aAAPA,OAAO,wBAAA0D,qBAAA,GAAP1D,OAAO,CAAE2D,kBAAkB,cAAAD,qBAAA,uBAA3BA,qBAAA,CAAAD,IAAA,CAAAzD,OAAO,EAAuBmD,gBAAgB,CAAC;cACjD;UAAC;QAEL;MACF,CAAC;MACDS,iBAAiB,EAAEA,CAACX,CAAC,EAAEC,EAAE,EAAE9B,QAAQ,KAAK;QACtCS,iBAAiB,CAACoB,CAAC,CAACnB,MAAM,CAAC;QAE3B,MAAMqB,gBAAgB,GAAG/B,QAAQ,CAACjB,MAAM,CAAEiD,EAAE,IAAK;UAC/C,QAAQH,CAAC,CAACnB,MAAM;YACd,KAAK/C,kBAAkB,CAAC8E,qBAAqB;cAC3C,OAAO,CAACzE,WAAW,CAACgE,EAAE,EAAE5C,GAAG,CAACiC,WAAW,CAAChC,MAAM,CAAC;YACjD;cACE,OAAO,IAAI;UAAC;QAElB,CAAC,CAAC;QAEF,IAAI0C,gBAAgB,CAAC7C,MAAM,GAAG,CAAC,EAAE;UAAA,IAAAwD,sBAAA;UAC/B;UACAxC,cAAc,CAACF,QAAQ,EAAE,KAAK,EAAEZ,GAAG,CAACiC,WAAW,CAAChC,MAAM,CAAC;UAEvD,IAAIT,OAAO,aAAPA,OAAO,gBAAA8D,sBAAA,GAAP9D,OAAO,CAAEwD,sBAAsB,cAAAM,sBAAA,eAA/BA,sBAAA,CAAAL,IAAA,CAAAzD,OAAO,CAA4B,EAAE;YACvC,IAAIiD,CAAC,CAACnB,MAAM,KAAK/C,kBAAkB,CAACgD,sBAAsB,EAAE;cAC1DR,iBAAiB,CAACH,QAAQ,EAAE,KAAK,EAAEZ,GAAG,CAACiC,WAAW,CAAChC,MAAM,CAAC;YAC5D;UACF;QACF;MACF,CAAC;MACDsD,iBAAiB,EAAEA,CAACd,CAAC,EAAEC,EAAE,EAAEc,UAAU,KAAK;QACxCvC,cAAc,CAACuC,UAAU,EAAE,EAAE,CAAC;QAC9BxC,iBAAiB,CAACwC,UAAU,EAAE,EAAE,CAAC;MACnC,CAAC;MACDC,gBAAgB,EAAEA,CAAA,KAAM;QAAA,IAAAC,qBAAA;QACtBlE,OAAO,aAAPA,OAAO,wBAAAkE,qBAAA,GAAPlE,OAAO,CAAEiE,gBAAgB,cAAAC,qBAAA,uBAAzBA,qBAAA,CAAAT,IAAA,CAAAzD,OAAO,CAAsB;MAC/B,CAAC;MACDmE,gBAAgB,EAAEA,CAAClB,CAAC,EAAEmB,YAAY,KAAK;QACrC,IAAIA,YAAY,CAACC,cAAc,EAAE,IAAI,CAAClF,kBAAkB,CAACiF,YAAY,EAAEtE,OAAO,CAAC,EAAE;UAC/EgB,WAAW,EAAE;QACf;MACF,CAAC;MACDwD,iBAAiB,EAAEA,CAAA,KAAM;QACvB5B,IAAI,CAAC/B,MAAM,CAACC,gBAAgB,EAAElB,aAAa,CAACC,OAAO,CAAC;MACtD;IACF,CAAC,CAAC;IAEFoB,aAAa,CAACyB,OAAO,CAClB+B,UAAU,CAACzF,2BAA2B,CAAC0F,wBAAwB,CAAC,CAChEC,aAAa,CAAC,CAACC,GAAG,EAAEtD,QAAQ,KAAK;MAChC,IAAIsD,GAAG,EAAElE,GAAG,CAACmE,cAAc,IAAI1F,MAAM,CAAC2F,KAAK,CAAC,uDAAuD,EAAEF,GAAG,CAAC,CAAC,KACrG;QACHzF,MAAM,CAAC4F,KAAK,CAAC,uDAAuD,EAAE,iBAAiB,EAAEzD,QAAQ,CAACd,MAAM,CAAC;QAEzGgB,cAAc,CAACF,QAAQ,EAAE,IAAI,EAAEZ,GAAG,CAACiC,WAAW,CAAChC,MAAM,CAAC;QACtD4B,oBAAoB,EAAE;MACxB;MAEAM,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,EAAI;IACd,CAAC,CAAC,CACDmC,WAAW,CAAC,CAACJ,GAAG,EAAEtD,QAAQ,KAAK;MAC9B,IAAIsD,GAAG,EAAEzF,MAAM,CAACmD,IAAI,CAAC,qDAAqD,EAAEsC,GAAG,CAAC,CAAC,KAC5E;QAAA,IAAAK,sBAAA;QACH9F,MAAM,CAAC4F,KAAK,CAAC,qDAAqD,EAAE,iBAAiB,EAAEzD,QAAQ,CAACd,MAAM,CAAC;QAEvGgB,cAAc,CAACF,QAAQ,EAAE,IAAI,EAAEZ,GAAG,CAACiC,WAAW,CAAChC,MAAM,CAAC;QACtD,IAAI,EAACT,OAAO,aAAPA,OAAO,eAAPA,OAAO,CAAEE,aAAa,GAAEF,OAAO,aAAPA,OAAO,wBAAA+E,sBAAA,GAAP/E,OAAO,CAAE2D,kBAAkB,cAAAoB,sBAAA,uBAA3BA,sBAAA,CAAAtB,IAAA,CAAAzD,OAAO,EAAuBoB,QAAQ,CAAC;QACpE,IAAIZ,GAAG,CAACmE,cAAc,EAAEtC,oBAAoB,EAAE;MAChD;MAEArB,wBAAwB,CAACwB,OAAO,GAAG,IAAI;MACvCG,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,EAAI;IACd,CAAC,CAAC;EACN,CAAC,CAAC;EAEFnD,iBAAiB,CAACgB,GAAG,EAAES,SAAS,EAAE;IAChC+D,YAAYA,CAAClF,OAAO,EAAEmF,UAAU,EAAE;MAChC,IAAInF,OAAO,CAACuE,cAAc,EAAE,IAAI,CAAClF,kBAAkB,CAACW,OAAO,EAAEA,OAAO,CAAC,EAAE;QACrE,IAAImF,UAAU,CAACxE,MAAM,KAAKD,GAAG,CAACiC,WAAW,CAAChC,MAAM,EAAE;UAAA,IAAAyE,sBAAA;UAChDlF,OAAO,aAAPA,OAAO,wBAAAkF,sBAAA,GAAPlF,OAAO,CAAEiE,gBAAgB,cAAAiB,sBAAA,uBAAzBA,sBAAA,CAAAzB,IAAA,CAAAzD,OAAO,CAAsB;QAC/B,CAAC,MAAM;UACLc,WAAW,EAAE;QACf;MACF;IACF;EACF,CAAC,CAAC;EAEFlC,SAAS,CAAC,MAAM;IACd;IACAuG,UAAU,CAAC,YAAY;MACrBzD,aAAa,CAAC,IAAI,CAAC;MACnBgB,IAAI,CAAChC,oBAAoB,EAAEG,YAAY,EAAE,MAAMa,aAAa,CAAC,KAAK,CAAC,CAAC;IACtE,CAAC,EAAE,CAAC,CAAC;EACP,CAAC,EAAE,CAAC5B,OAAO,CAACsF,GAAG,EAAE3E,MAAM,CAAC,CAAC;EAEzB7B,SAAS,CAAC,MAAM;IACd,OAAO,MAAM;MAAA,IAAAyG,sBAAA;MACX,IAAItE,aAAa,CAACyB,OAAO,EAAE,CAAA6C,sBAAA,GAAAtE,aAAa,CAACyB,OAAO,cAAA6C,sBAAA,uBAArBA,sBAAA,CAAuBvC,OAAO,EAAE;IAC7D,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMwC,OAAuD,GAAGhG,gBAAgB,CAAC,YAAY;IAC3FqC,gBAAgB,CAAC,IAAI,CAAC;IACtBe,IAAI,CAAC/B,MAAM,CAACC,gBAAgB,EAAElB,aAAa,CAACC,OAAO,EAAE,MAAMgC,gBAAgB,CAAC,KAAK,CAAC,CAAC;EACrF,CAAC,CAAC;EAEF,MAAM4D,IAAiD,GAAGjG,gBAAgB,CAAC,YAAY;IAAA,IAAAkG,sBAAA;IACrF,IAAIzE,aAAa,CAACyB,OAAO,KAAAgD,sBAAA,GAAIzE,aAAa,CAACyB,OAAO,cAAAgD,sBAAA,eAArBA,sBAAA,CAAuBC,WAAW,EAAE;MAC/D,IAAI;QAAA,IAAAC,sBAAA;QACF,MAAMC,IAAI,GAAG,QAAAD,sBAAA,GAAM3E,aAAa,CAACyB,OAAO,cAAAkD,sBAAA,uBAArBA,sBAAA,CAAuBE,YAAY,EAAE;QACxDtE,cAAc,CAACqE,IAAI,EAAE,KAAK,EAAEnF,GAAG,CAACiC,WAAW,CAAChC,MAAM,CAAC;MACrD,CAAC,CAAC,MAAM,CAAC;IACX;EACF,CAAC,CAAC;EAEF,MAAMoF,OAAuD,GAAGvG,gBAAgB,CAAC,MAAM;IACrF,IAAI0B,wBAAwB,CAACwB,OAAO,IAAIzB,aAAa,CAACyB,OAAO,EAAE;MAC7D,OAAOzB,aAAa,CAACyB,OAAO,CAACiD,WAAW;IAC1C,CAAC,MAAM;MACL,OAAO,KAAK;IACd;EACF,CAAC,CAAC;EAEF,MAAMK,IAAiD,GAAGxG,gBAAgB,CAAC,YAAY;IAAA,IAAAyG,sBAAA;IACrF,IAAIhF,aAAa,CAACyB,OAAO,KAAAuD,sBAAA,GAAIhF,aAAa,CAACyB,OAAO,cAAAuD,sBAAA,eAArBA,sBAAA,CAAuBC,OAAO,EAAE;MAC3D,IAAI;QAAA,IAAAC,sBAAA;QACF,MAAMC,WAAW,GAAG,QAAAD,sBAAA,GAAMlF,aAAa,CAACyB,OAAO,cAAAyD,sBAAA,uBAArBA,sBAAA,CAAuBE,QAAQ,EAAE;QAC3D7E,cAAc,CAAC4E,WAAW,EAAE,KAAK,EAAE1F,GAAG,CAACiC,WAAW,CAAChC,MAAM,CAAC;MAC5D,CAAC,CAAC,MAAM,CAAC;IACX;EACF,CAAC,CAAC;EAEF,MAAMuF,OAAuD,GAAG1G,gBAAgB,CAAC,MAAM;IACrF,IAAI0B,wBAAwB,CAACwB,OAAO,IAAIzB,aAAa,CAACyB,OAAO,EAAE;MAC7D,OAAOzB,aAAa,CAACyB,OAAO,CAACwD,OAAO;IACtC,CAAC,MAAM;MACL,OAAO,KAAK;IACd;EACF,CAAC,CAAC;EAEF,MAAMI,eAAuE,GAAG9G,gBAAgB,CAC9F,CAAC+G,MAAM,EAAEC,SAAS,KAAK;IACrB,OAAO,IAAIC,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;MACtC3G,OAAO,CACJsG,eAAe,CAACC,MAAM,CAAC,CACvBC,SAAS,CAAEI,cAAc,IAAK;QAC7B,IAAIA,cAAc,CAACC,aAAa,EAAE,EAAE;UAClCL,SAAS,aAATA,SAAS,uBAATA,SAAS,CAAGI,cAAc,CAAC;UAC3BpF,cAAc,CAAC,CAACoF,cAAc,CAAC,EAAE,KAAK,EAAElG,GAAG,CAACiC,WAAW,CAAChC,MAAM,CAAC;QACjE;MACF,CAAC,CAAC,CACDmG,WAAW,CAAEC,WAAW,IAAK;QAC5B,IAAIA,WAAW,CAACF,aAAa,EAAE,EAAE;UAC/BrF,cAAc,CAAC,CAACuF,WAAW,CAAC,EAAE,KAAK,EAAErG,GAAG,CAACiC,WAAW,CAAChC,MAAM,CAAC;UAC5D+F,OAAO,CAACK,WAAW,CAAC;QACtB;MACF,CAAC,CAAC,CACDC,QAAQ,CAAC,CAACpC,GAAG,EAAEqC,aAAa,KAAK;QAChCzF,cAAc,CAAC,CAACyF,aAAa,CAAC,EAAE,KAAK,EAAEvG,GAAG,CAACiC,WAAW,CAAChC,MAAM,CAAC;QAC9DgG,MAAM,CAAC/B,GAAG,CAAC;MACb,CAAC,CAAC;IACN,CAAC,CAAC;EACJ,CAAC,CACF;EACD,MAAMsC,eAAuE,GAAG1H,gBAAgB,CAC9F,CAAC+G,MAAM,EAAEC,SAAS,KAAK;IACrB,OAAO,IAAIC,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;MACtC3G,OAAO,CACJkH,eAAe,CAACX,MAAM,CAAC,CACvBC,SAAS,CAAEI,cAAc,IAAK;QAC7B,IAAIA,cAAc,CAACO,aAAa,EAAE,EAAE;UAClC3F,cAAc,CAAC,CAACoF,cAAc,CAAC,EAAE,KAAK,EAAElG,GAAG,CAACiC,WAAW,CAAChC,MAAM,CAAC;UAC/D6F,SAAS,aAATA,SAAS,uBAATA,SAAS,CAAGI,cAAc,CAAC;QAC7B;MACF,CAAC,CAAC,CACDE,WAAW,CAAEC,WAAW,IAAK;QAC5B,IAAIA,WAAW,CAACI,aAAa,EAAE,EAAE;UAC/B3F,cAAc,CAAC,CAACuF,WAAW,CAAC,EAAE,KAAK,EAAErG,GAAG,CAACiC,WAAW,CAAChC,MAAM,CAAC;UAC5D+F,OAAO,CAACK,WAAW,CAAwB;QAC7C;MACF,CAAC,CAAC,CACDC,QAAQ,CAAC,CAACpC,GAAG,EAAEqC,aAAa,KAAK;QAChCzF,cAAc,CAAC,CAACyF,aAAa,CAAC,EAAE,KAAK,EAAEvG,GAAG,CAACiC,WAAW,CAAChC,MAAM,CAAC;QAC9DgG,MAAM,CAAC/B,GAAG,CAAC;MACb,CAAC,CAAC;IACN,CAAC,CAAC;EACJ,CAAC,CACF;EACD,MAAMwC,iBAA2E,GAAG5H,gBAAgB,CAClG,OAAO6H,SAAS,EAAEd,MAAM,KAAK;IAC3B,MAAMe,cAAc,GAAG,MAAMtH,OAAO,CAACoH,iBAAiB,CAACC,SAAS,EAAEd,MAAM,CAAC;IACzE/E,cAAc,CAAC,CAAC8F,cAAc,CAAC,EAAE,KAAK,EAAE5G,GAAG,CAACiC,WAAW,CAAChC,MAAM,CAAC;IAC/D,OAAO2G,cAAc;EACvB,CAAC,CACF;EACD,MAAMC,iBAA2E,GAAG/H,gBAAgB,CAClG,OAAO6H,SAAS,EAAEd,MAAM,KAAK;IAC3B,MAAMe,cAAc,GAAG,MAAMtH,OAAO,CAACuH,iBAAiB,CAACF,SAAS,EAAEd,MAAM,CAAC;IACzE/E,cAAc,CAAC,CAAC8F,cAAc,CAAC,EAAE,KAAK,EAAE5G,GAAG,CAACiC,WAAW,CAAChC,MAAM,CAAC;IAC/D,OAAO2G,cAAc;EACvB,CAAC,CACF;EACD,MAAME,aAAmE,GAAGhI,gBAAgB,CAC1F,MAAOyH,aAAa,IAAK;IACvB,MAAMQ,aAAa,GAAG,MAAM,CAAC,MAAM;MACjC,IAAIR,aAAa,CAACJ,aAAa,EAAE,EAAE,OAAO7G,OAAO,CAAC0H,iBAAiB,CAACT,aAAa,CAAC;MAClF,IAAIA,aAAa,CAACE,aAAa,EAAE,EAAE,OAAOnH,OAAO,CAAC2H,iBAAiB,CAACV,aAAa,CAAC;MAClF,OAAO,IAAI;IACb,CAAC,GAAG;IAEJ,IAAIQ,aAAa,EAAEjG,cAAc,CAAC,CAACiG,aAAa,CAAC,EAAE,KAAK,EAAE/G,GAAG,CAACiC,WAAW,CAAChC,MAAM,CAAC;EACnF,CAAC,CACF;EACD,MAAMiH,aAAmE,GAAGpI,gBAAgB,CAAC,MAAOqI,OAAO,IAAK;IAC9G,IAAIA,OAAO,CAACC,aAAa,KAAK,WAAW,EAAE;MACzC,IAAID,OAAO,CAAChB,aAAa,EAAE,EAAE,MAAM7G,OAAO,CAAC4H,aAAa,CAACC,OAAO,CAAC;MACjE,IAAIA,OAAO,CAACV,aAAa,EAAE,EAAE,MAAMnH,OAAO,CAAC4H,aAAa,CAACC,OAAO,CAAC;IACnE,CAAC,MAAM;MACL,IAAI;QAAA,IAAAE,sBAAA;QACF,QAAAA,sBAAA,GAAM9G,aAAa,CAACyB,OAAO,cAAAqF,sBAAA,uBAArBA,sBAAA,CAAuBC,mBAAmB,CAACH,OAAO,CAACI,KAAK,CAAC;MACjE,CAAC,SAAS;QACRtG,cAAc,CAAC,CAACkG,OAAO,CAACR,SAAS,CAAC,EAAE,CAACQ,OAAO,CAACI,KAAK,CAAC,CAAC;MACtD;IACF;EACF,CAAC,CAAC;EACF,MAAMC,gBAAyE,GAAG1I,gBAAgB,CAAC,MAAM;IACvGiC,iBAAiB,CAAC,EAAE,EAAE,IAAI,EAAEf,GAAG,CAACiC,WAAW,CAAChC,MAAM,CAAC;EACrD,CAAC,CAAC;EACF,MAAMwH,sBAAqF,GAAG3I,gBAAgB,CAC5G,CAACY,aAAa,EAAEyC,QAAQ,KAAK;IAC3BjB,aAAa,CAAC,IAAI,CAAC;IACnBJ,cAAc,CAAC,EAAE,EAAE,IAAI,EAAEd,GAAG,CAACiC,WAAW,CAAChC,MAAM,CAAC;IAChDiC,IAAI,CAACxC,aAAa,EAAER,aAAa,CAACC,OAAO,EAAE,MAAM;MAC/C+B,aAAa,CAAC,KAAK,CAAC;MACpBiB,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,EAAI;IACd,CAAC,CAAC;EACJ,CAAC,CACF;EAED,OAAO;IACLzB,OAAO;IACPC,UAAU;IACVmE,OAAO;IACPlE,QAAQ;IACR0E,IAAI;IACJE,OAAO;IACPT,IAAI;IACJM,OAAO;IACPxE,WAAW;IACX2G,gBAAgB;IAChB5B,eAAe;IACfY,eAAe;IACfE,iBAAiB;IACjBG,iBAAiB;IACjBC,aAAa;IACbI,aAAa;IACbO,sBAAsB;IACtBC,YAAY,EAAE7G,WAAW;IACzB8G,sBAAsB,EAAE9G;EAC1B,CAAC;AACH,CAAC"}