@amityco/ts-sdk-react-native 6.17.0 → 6.17.3

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 (241) hide show
  1. package/dist/@types/core/events.d.ts +15 -4
  2. package/dist/@types/core/events.d.ts.map +1 -1
  3. package/dist/@types/core/payload.d.ts +1 -0
  4. package/dist/@types/core/payload.d.ts.map +1 -1
  5. package/dist/@types/core/permissions.d.ts +5 -0
  6. package/dist/@types/core/permissions.d.ts.map +1 -1
  7. package/dist/@types/domains/client.d.ts +1 -0
  8. package/dist/@types/domains/client.d.ts.map +1 -1
  9. package/dist/@types/domains/story.d.ts +7 -1
  10. package/dist/@types/domains/story.d.ts.map +1 -1
  11. package/dist/channelRepository/channelMembership/observers/getMembers/ChannelMemberLiveCollectionController.d.ts.map +1 -0
  12. package/dist/channelRepository/channelMembership/observers/getMembers/ChannelMemberPaginationController.d.ts.map +1 -0
  13. package/dist/channelRepository/channelMembership/observers/getMembers/ChannelMemberQueryStreamController.d.ts.map +1 -0
  14. package/dist/channelRepository/channelMembership/observers/getMembers/getMembers.d.ts.map +1 -0
  15. package/dist/channelRepository/channelMembership/observers/getMembers/index.d.ts +2 -0
  16. package/dist/channelRepository/channelMembership/observers/getMembers/index.d.ts.map +1 -0
  17. package/dist/channelRepository/observers/getChannel.d.ts.map +1 -1
  18. package/dist/channelRepository/observers/getChannels/ChannelLiveCollectionController.d.ts.map +1 -0
  19. package/dist/channelRepository/observers/getChannels/ChannelPaginationController.d.ts.map +1 -0
  20. package/dist/channelRepository/observers/getChannels/ChannelPagnationNoPageController.d.ts.map +1 -0
  21. package/dist/channelRepository/observers/getChannels/ChannelQueryStreamController.d.ts.map +1 -0
  22. package/dist/channelRepository/observers/getChannels/getChannels.d.ts.map +1 -0
  23. package/dist/channelRepository/observers/getChannels/index.d.ts +2 -0
  24. package/dist/channelRepository/observers/getChannels/index.d.ts.map +1 -0
  25. package/dist/client/api/createClient.d.ts.map +1 -1
  26. package/dist/client/api/login.d.ts.map +1 -1
  27. package/dist/client/api/logout.d.ts.map +1 -1
  28. package/dist/client/observers/getTotalUnreadCount.d.ts.map +1 -1
  29. package/dist/client/observers/getUserUnread.d.ts.map +1 -1
  30. package/dist/client/utils/hasPermission/checkChannelPermission.d.ts +2 -0
  31. package/dist/client/utils/hasPermission/checkChannelPermission.d.ts.map +1 -0
  32. package/dist/client/utils/hasPermission/checkCommunityPermission.d.ts +2 -0
  33. package/dist/client/utils/hasPermission/checkCommunityPermission.d.ts.map +1 -0
  34. package/dist/client/utils/hasPermission/checkUserPermission.d.ts +2 -0
  35. package/dist/client/utils/hasPermission/checkUserPermission.d.ts.map +1 -0
  36. package/dist/client/utils/hasPermission/hasPermission.d.ts +6 -0
  37. package/dist/client/utils/hasPermission/hasPermission.d.ts.map +1 -0
  38. package/dist/client/utils/hasPermission/index.d.ts +2 -0
  39. package/dist/client/utils/hasPermission/index.d.ts.map +1 -0
  40. package/dist/client/utils/markerSyncEngine.d.ts.map +1 -1
  41. package/dist/client/utils/setClientToken.d.ts +1 -1
  42. package/dist/client/utils/setClientToken.d.ts.map +1 -1
  43. package/dist/communityRepository/communityMembership/events/onCommunityJoined.d.ts +1 -1
  44. package/dist/communityRepository/communityMembership/events/onCommunityJoined.d.ts.map +1 -1
  45. package/dist/communityRepository/communityMembership/events/onCommunityLeft.d.ts +1 -1
  46. package/dist/communityRepository/communityMembership/events/onCommunityLeft.d.ts.map +1 -1
  47. package/dist/communityRepository/communityMembership/events/onCommunityUserAdded.d.ts +1 -1
  48. package/dist/communityRepository/communityMembership/events/onCommunityUserAdded.d.ts.map +1 -1
  49. package/dist/communityRepository/communityMembership/events/onCommunityUserBanned.d.ts +1 -1
  50. package/dist/communityRepository/communityMembership/events/onCommunityUserBanned.d.ts.map +1 -1
  51. package/dist/communityRepository/communityMembership/events/onCommunityUserChanged.d.ts +1 -1
  52. package/dist/communityRepository/communityMembership/events/onCommunityUserChanged.d.ts.map +1 -1
  53. package/dist/communityRepository/communityMembership/events/onCommunityUserRemoved.d.ts +1 -1
  54. package/dist/communityRepository/communityMembership/events/onCommunityUserRemoved.d.ts.map +1 -1
  55. package/dist/communityRepository/communityMembership/events/onCommunityUserRoleAdded.d.ts +1 -1
  56. package/dist/communityRepository/communityMembership/events/onCommunityUserRoleAdded.d.ts.map +1 -1
  57. package/dist/communityRepository/communityMembership/events/onCommunityUserRoleRemoved.d.ts +1 -1
  58. package/dist/communityRepository/communityMembership/events/onCommunityUserRoleRemoved.d.ts.map +1 -1
  59. package/dist/communityRepository/communityMembership/events/onCommunityUserUnbanned.d.ts +1 -1
  60. package/dist/communityRepository/communityMembership/events/onCommunityUserUnbanned.d.ts.map +1 -1
  61. package/dist/communityRepository/communityMembership/events/utils.d.ts +1 -1
  62. package/dist/communityRepository/communityMembership/events/utils.d.ts.map +1 -1
  63. package/dist/communityRepository/communityMembership/observers/getMembers.d.ts.map +1 -1
  64. package/dist/core/events.d.ts +3 -3
  65. package/dist/core/events.d.ts.map +1 -1
  66. package/dist/core/liveCollection/LiveCollectionController.d.ts +1 -1
  67. package/dist/core/liveCollection/LiveCollectionController.d.ts.map +1 -1
  68. package/dist/core/liveCollection/QueryStreamController.d.ts +1 -1
  69. package/dist/core/liveCollection/QueryStreamController.d.ts.map +1 -1
  70. package/dist/core/subscription.d.ts +2 -0
  71. package/dist/core/subscription.d.ts.map +1 -1
  72. package/dist/index.cjs.js +734 -114
  73. package/dist/index.esm.js +732 -115
  74. package/dist/index.umd.js +4 -4
  75. package/dist/marker/api/getUserMarker.d.ts +1 -1
  76. package/dist/marker/api/getUserMarker.d.ts.map +1 -1
  77. package/dist/marker/events/onChannelMarkerFetched.d.ts.map +1 -1
  78. package/dist/marker/events/onUserMarkerFetched.d.ts +2 -1
  79. package/dist/marker/events/onUserMarkerFetched.d.ts.map +1 -1
  80. package/dist/messageRepository/events/onMessageCreated.d.ts +2 -1
  81. package/dist/messageRepository/events/onMessageCreated.d.ts.map +1 -1
  82. package/dist/messageRepository/observers/getMessages/MessageLiveCollectionController.d.ts.map +1 -0
  83. package/dist/messageRepository/observers/getMessages/MessagePaginationController.d.ts.map +1 -0
  84. package/dist/messageRepository/observers/getMessages/MessageQueryStreamController.d.ts.map +1 -0
  85. package/dist/messageRepository/observers/getMessages/getMessages.d.ts.map +1 -0
  86. package/dist/messageRepository/observers/getMessages/index.d.ts +2 -0
  87. package/dist/messageRepository/observers/getMessages/index.d.ts.map +1 -0
  88. package/dist/messageRepository/observers/observeMessages.d.ts.map +1 -1
  89. package/dist/messageRepository/utils/prepareMessagePayload.d.ts.map +1 -1
  90. package/dist/storyRepository/constants.d.ts +1 -0
  91. package/dist/storyRepository/constants.d.ts.map +1 -1
  92. package/dist/storyRepository/events/onStoryCreated.d.ts +2 -1
  93. package/dist/storyRepository/events/onStoryCreated.d.ts.map +1 -1
  94. package/dist/storyRepository/events/onStoryDeleted.d.ts +2 -1
  95. package/dist/storyRepository/events/onStoryDeleted.d.ts.map +1 -1
  96. package/dist/storyRepository/events/onStoryReactionAdded.d.ts +3 -0
  97. package/dist/storyRepository/events/onStoryReactionAdded.d.ts.map +1 -0
  98. package/dist/storyRepository/events/onStoryReactionRemoved.d.ts +3 -0
  99. package/dist/storyRepository/events/onStoryReactionRemoved.d.ts.map +1 -0
  100. package/dist/storyRepository/events/onStoryUpdated.d.ts +2 -1
  101. package/dist/storyRepository/events/onStoryUpdated.d.ts.map +1 -1
  102. package/dist/storyRepository/observers/getActiveStoriesByTarget.d.ts +20 -0
  103. package/dist/storyRepository/observers/getActiveStoriesByTarget.d.ts.map +1 -1
  104. package/dist/storyRepository/observers/getStoriesByTargetIds/StoryLiveCollectionController.d.ts +14 -0
  105. package/dist/storyRepository/observers/getStoriesByTargetIds/StoryLiveCollectionController.d.ts.map +1 -0
  106. package/dist/storyRepository/observers/getStoriesByTargetIds/StoryPaginationNoPageController.d.ts +5 -0
  107. package/dist/storyRepository/observers/getStoriesByTargetIds/StoryPaginationNoPageController.d.ts.map +1 -0
  108. package/dist/storyRepository/observers/getStoriesByTargetIds/StoryQueryStreamController.d.ts +16 -0
  109. package/dist/storyRepository/observers/getStoriesByTargetIds/StoryQueryStreamController.d.ts.map +1 -0
  110. package/dist/storyRepository/observers/getStoriesByTargetIds/getStoriesByTargetIds.d.ts +5 -0
  111. package/dist/storyRepository/observers/getStoriesByTargetIds/getStoriesByTargetIds.d.ts.map +1 -0
  112. package/dist/storyRepository/observers/getStoriesByTargetIds/index.d.ts +2 -0
  113. package/dist/storyRepository/observers/getStoriesByTargetIds/index.d.ts.map +1 -0
  114. package/dist/storyRepository/observers/getStoryByStoryId.d.ts.map +1 -1
  115. package/dist/storyRepository/observers/index.d.ts +1 -0
  116. package/dist/storyRepository/observers/index.d.ts.map +1 -1
  117. package/dist/subChannelRepository/observers/getSubChannel.d.ts.map +1 -1
  118. package/dist/subChannelRepository/observers/{liveCollection → getSubChannels}/SubChannelLiveCollectionController.d.ts.map +1 -1
  119. package/dist/subChannelRepository/observers/{liveCollection → getSubChannels}/SubChannelPaginationController.d.ts.map +1 -1
  120. package/dist/subChannelRepository/observers/{liveCollection → getSubChannels}/SubChannelQueryStreamController.d.ts.map +1 -1
  121. package/dist/subChannelRepository/observers/getSubChannels/getSubChannels.d.ts.map +1 -0
  122. package/dist/subChannelRepository/observers/getSubChannels/index.d.ts +2 -0
  123. package/dist/subChannelRepository/observers/getSubChannels/index.d.ts.map +1 -0
  124. package/dist/utils/index.d.ts +1 -0
  125. package/dist/utils/index.d.ts.map +1 -1
  126. package/package.json +1 -1
  127. package/src/@types/core/events.ts +16 -4
  128. package/src/@types/core/payload.ts +1 -0
  129. package/src/@types/core/permissions.ts +6 -0
  130. package/src/@types/domains/client.ts +2 -0
  131. package/src/@types/domains/story.ts +7 -0
  132. package/src/analytic/api/queryReachUser.ts +1 -1
  133. package/src/analytic/service/analytic/AnalyticsEventCapturer.ts +1 -1
  134. package/src/channelRepository/channelMembership/observers/{getMembers.ts → getMembers/getMembers.ts} +1 -1
  135. package/src/channelRepository/channelMembership/observers/getMembers/index.ts +1 -0
  136. package/src/channelRepository/observers/getChannel.ts +30 -2
  137. package/src/channelRepository/observers/{liveCollection → getChannels}/ChannelLiveCollectionController.ts +65 -3
  138. package/src/channelRepository/observers/{getChannels.ts → getChannels/getChannels.ts} +1 -1
  139. package/src/channelRepository/observers/getChannels/index.ts +1 -0
  140. package/src/client/api/createClient.ts +3 -1
  141. package/src/client/api/login.ts +29 -6
  142. package/src/client/api/logout.ts +5 -0
  143. package/src/client/observers/getTotalUnreadCount.ts +14 -4
  144. package/src/client/observers/getUserUnread.ts +95 -11
  145. package/src/client/utils/hasPermission/checkChannelPermission.ts +22 -0
  146. package/src/client/utils/hasPermission/checkCommunityPermission.ts +22 -0
  147. package/src/client/utils/hasPermission/checkUserPermission.ts +12 -0
  148. package/src/client/utils/hasPermission/hasPermission.ts +18 -0
  149. package/src/client/utils/hasPermission/index.ts +1 -0
  150. package/src/client/utils/markerSyncEngine.ts +46 -32
  151. package/src/client/utils/setClientToken.ts +1 -1
  152. package/src/communityRepository/communityMembership/events/onCommunityJoined.ts +1 -1
  153. package/src/communityRepository/communityMembership/events/onCommunityLeft.ts +1 -1
  154. package/src/communityRepository/communityMembership/events/onCommunityUserAdded.ts +1 -1
  155. package/src/communityRepository/communityMembership/events/onCommunityUserBanned.ts +1 -1
  156. package/src/communityRepository/communityMembership/events/onCommunityUserChanged.ts +1 -1
  157. package/src/communityRepository/communityMembership/events/onCommunityUserRemoved.ts +1 -1
  158. package/src/communityRepository/communityMembership/events/onCommunityUserRoleAdded.ts +1 -1
  159. package/src/communityRepository/communityMembership/events/onCommunityUserRoleRemoved.ts +1 -1
  160. package/src/communityRepository/communityMembership/events/onCommunityUserUnbanned.ts +1 -1
  161. package/src/communityRepository/communityMembership/events/utils.ts +19 -13
  162. package/src/communityRepository/communityMembership/observers/getMembers.ts +18 -9
  163. package/src/core/liveCollection/LiveCollectionController.ts +2 -2
  164. package/src/core/liveCollection/QueryStreamController.ts +1 -1
  165. package/src/core/subscription.ts +19 -0
  166. package/src/marker/api/getUserMarker.ts +15 -4
  167. package/src/marker/events/onChannelMarkerFetched.ts +3 -1
  168. package/src/marker/events/onUserMarkerFetched.ts +17 -0
  169. package/src/messageRepository/api/tests/createMessage.test.ts +4 -4
  170. package/src/messageRepository/events/onMessageCreated.ts +20 -8
  171. package/src/messageRepository/events/tests/events.test.ts +2 -2
  172. package/src/messageRepository/observers/{liveCollection → getMessages}/MessageLiveCollectionController.ts +2 -2
  173. package/src/messageRepository/observers/{getMessages.ts → getMessages/getMessages.ts} +4 -26
  174. package/src/messageRepository/observers/getMessages/index.ts +1 -0
  175. package/src/messageRepository/observers/observeMessages.ts +8 -2
  176. package/src/messageRepository/utils/prepareMessagePayload.ts +14 -4
  177. package/src/storyRepository/api/createImageStory.ts +3 -3
  178. package/src/storyRepository/api/createVideoStory.ts +3 -3
  179. package/src/storyRepository/constants.ts +1 -0
  180. package/src/storyRepository/events/onStoryCreated.ts +25 -1
  181. package/src/storyRepository/events/onStoryDeleted.ts +22 -1
  182. package/src/storyRepository/events/onStoryError.ts +1 -1
  183. package/src/storyRepository/events/onStoryLocalDataUpdated.ts +1 -1
  184. package/src/storyRepository/events/onStoryReactionAdded.ts +39 -0
  185. package/src/storyRepository/events/onStoryReactionRemoved.ts +39 -0
  186. package/src/storyRepository/events/onStoryUpdated.ts +25 -1
  187. package/src/storyRepository/internalApi/createStory.ts +1 -1
  188. package/src/storyRepository/observers/getActiveStoriesByTarget.ts +40 -3
  189. package/src/storyRepository/observers/getStoriesByTargetIds/StoryLiveCollectionController.ts +113 -0
  190. package/src/storyRepository/observers/getStoriesByTargetIds/StoryPaginationNoPageController.ts +18 -0
  191. package/src/storyRepository/observers/getStoriesByTargetIds/StoryQueryStreamController.ts +97 -0
  192. package/src/storyRepository/observers/getStoriesByTargetIds/getStoriesByTargetIds.ts +32 -0
  193. package/src/storyRepository/observers/getStoriesByTargetIds/index.ts +1 -0
  194. package/src/storyRepository/observers/getStoryByStoryId.ts +22 -2
  195. package/src/storyRepository/observers/index.ts +1 -0
  196. package/src/subChannelRepository/observers/getSubChannel.ts +35 -2
  197. package/src/subChannelRepository/observers/{liveCollection → getSubChannels}/SubChannelLiveCollectionController.ts +53 -2
  198. package/src/subChannelRepository/observers/{getSubChannels.ts → getSubChannels/getSubChannels.ts} +1 -1
  199. package/src/subChannelRepository/observers/getSubChannels/index.ts +1 -0
  200. package/src/utils/index.ts +4 -0
  201. package/dist/channelRepository/channelMembership/observers/getMembers.d.ts.map +0 -1
  202. package/dist/channelRepository/channelMembership/observers/liveCollection/ChannelMemberLiveCollectionController.d.ts.map +0 -1
  203. package/dist/channelRepository/channelMembership/observers/liveCollection/ChannelMemberPaginationController.d.ts.map +0 -1
  204. package/dist/channelRepository/channelMembership/observers/liveCollection/ChannelMemberQueryStreamController.d.ts.map +0 -1
  205. package/dist/channelRepository/observers/getChannels.d.ts.map +0 -1
  206. package/dist/channelRepository/observers/liveCollection/ChannelLiveCollectionController.d.ts.map +0 -1
  207. package/dist/channelRepository/observers/liveCollection/ChannelPaginationController.d.ts.map +0 -1
  208. package/dist/channelRepository/observers/liveCollection/ChannelPagnationNoPageController.d.ts.map +0 -1
  209. package/dist/channelRepository/observers/liveCollection/ChannelQueryStreamController.d.ts.map +0 -1
  210. package/dist/messageRepository/observers/getMessages.d.ts.map +0 -1
  211. package/dist/messageRepository/observers/liveCollection/MessageLiveCollectionController.d.ts.map +0 -1
  212. package/dist/messageRepository/observers/liveCollection/MessagePaginationController.d.ts.map +0 -1
  213. package/dist/messageRepository/observers/liveCollection/MessageQueryStreamController.d.ts.map +0 -1
  214. package/dist/subChannelRepository/observers/getSubChannels.d.ts.map +0 -1
  215. /package/dist/channelRepository/channelMembership/observers/{liveCollection → getMembers}/ChannelMemberLiveCollectionController.d.ts +0 -0
  216. /package/dist/channelRepository/channelMembership/observers/{liveCollection → getMembers}/ChannelMemberPaginationController.d.ts +0 -0
  217. /package/dist/channelRepository/channelMembership/observers/{liveCollection → getMembers}/ChannelMemberQueryStreamController.d.ts +0 -0
  218. /package/dist/channelRepository/channelMembership/observers/{getMembers.d.ts → getMembers/getMembers.d.ts} +0 -0
  219. /package/dist/channelRepository/observers/{liveCollection → getChannels}/ChannelLiveCollectionController.d.ts +0 -0
  220. /package/dist/channelRepository/observers/{liveCollection → getChannels}/ChannelPaginationController.d.ts +0 -0
  221. /package/dist/channelRepository/observers/{liveCollection → getChannels}/ChannelPagnationNoPageController.d.ts +0 -0
  222. /package/dist/channelRepository/observers/{liveCollection → getChannels}/ChannelQueryStreamController.d.ts +0 -0
  223. /package/dist/channelRepository/observers/{getChannels.d.ts → getChannels/getChannels.d.ts} +0 -0
  224. /package/dist/messageRepository/observers/{liveCollection → getMessages}/MessageLiveCollectionController.d.ts +0 -0
  225. /package/dist/messageRepository/observers/{liveCollection → getMessages}/MessagePaginationController.d.ts +0 -0
  226. /package/dist/messageRepository/observers/{liveCollection → getMessages}/MessageQueryStreamController.d.ts +0 -0
  227. /package/dist/messageRepository/observers/{getMessages.d.ts → getMessages/getMessages.d.ts} +0 -0
  228. /package/dist/subChannelRepository/observers/{liveCollection → getSubChannels}/SubChannelLiveCollectionController.d.ts +0 -0
  229. /package/dist/subChannelRepository/observers/{liveCollection → getSubChannels}/SubChannelPaginationController.d.ts +0 -0
  230. /package/dist/subChannelRepository/observers/{liveCollection → getSubChannels}/SubChannelQueryStreamController.d.ts +0 -0
  231. /package/dist/subChannelRepository/observers/{getSubChannels.d.ts → getSubChannels/getSubChannels.d.ts} +0 -0
  232. /package/src/channelRepository/channelMembership/observers/{liveCollection → getMembers}/ChannelMemberLiveCollectionController.ts +0 -0
  233. /package/src/channelRepository/channelMembership/observers/{liveCollection → getMembers}/ChannelMemberPaginationController.ts +0 -0
  234. /package/src/channelRepository/channelMembership/observers/{liveCollection → getMembers}/ChannelMemberQueryStreamController.ts +0 -0
  235. /package/src/channelRepository/observers/{liveCollection → getChannels}/ChannelPaginationController.ts +0 -0
  236. /package/src/channelRepository/observers/{liveCollection → getChannels}/ChannelPagnationNoPageController.ts +0 -0
  237. /package/src/channelRepository/observers/{liveCollection → getChannels}/ChannelQueryStreamController.ts +0 -0
  238. /package/src/messageRepository/observers/{liveCollection → getMessages}/MessagePaginationController.ts +0 -0
  239. /package/src/messageRepository/observers/{liveCollection → getMessages}/MessageQueryStreamController.ts +0 -0
  240. /package/src/subChannelRepository/observers/{liveCollection → getSubChannels}/SubChannelPaginationController.ts +0 -0
  241. /package/src/subChannelRepository/observers/{liveCollection → getSubChannels}/SubChannelQueryStreamController.ts +0 -0
package/dist/index.esm.js CHANGED
@@ -84,8 +84,8 @@ const PostContentType = Object.freeze({
84
84
 
85
85
  function getVersion() {
86
86
  try {
87
- // the string ''v6.17.0-esm'' should be replaced by actual value by @rollup/plugin-replace
88
- return 'v6.17.0-esm';
87
+ // the string ''v6.17.3-esm'' should be replaced by actual value by @rollup/plugin-replace
88
+ return 'v6.17.3-esm';
89
89
  }
90
90
  catch (error) {
91
91
  return '__dev__';
@@ -1420,6 +1420,16 @@ const getPostTopic = ({ path }, level = SubscriptionLevels.POST) => {
1420
1420
  const getCommentTopic = ({ path }) => {
1421
1421
  return path;
1422
1422
  };
1423
+ // Subscribe on comment and story update on a single story
1424
+ const getStoryTopic = ({ targetId, targetType, storyId, }) => {
1425
+ const user = getActiveUser();
1426
+ return `${getNetworkId(user)}/social/${targetType}/${targetId}/story/${storyId}/#`;
1427
+ };
1428
+ // Subscribe on comment and story update on stories under community
1429
+ const getCommunityStoriesTopic = ({ targetId, targetType, }) => {
1430
+ const user = getActiveUser();
1431
+ return `${getNetworkId(user)}/social/${targetType}/${targetId}/story/#`;
1432
+ };
1423
1433
  const getMyFollowersTopic = () => {
1424
1434
  const user = getActiveUser();
1425
1435
  return `${getNetworkId(user)}/membership/${user._id}/+/+`;
@@ -21060,7 +21070,7 @@ class AnalyticsEventCapturer {
21060
21070
  return;
21061
21071
  this._throttleStoryTimer = setTimeout(() => {
21062
21072
  clearTimeout(this._throttleStoryTimer);
21063
- fireEvent('local.story.updated', { referenceIds: this._bufferNewSeenStoryReferenceIds });
21073
+ fireEvent('local.story.reload', { referenceIds: this._bufferNewSeenStoryReferenceIds });
21064
21074
  this._bufferNewSeenStoryReferenceIds = [];
21065
21075
  }, 300);
21066
21076
  }
@@ -21925,7 +21935,14 @@ const getUserMarker = async () => {
21925
21935
  if (client.cache)
21926
21936
  ingestInCache({ userMarkers }, { cachedAt });
21927
21937
  fireEvent('local.userMarker.fetched', { userMarkers });
21928
- return { data: userMarkers[0], cachedAt };
21938
+ const latestUserMarker = userMarkers.reduce((maxUserMarker, userMarker) => {
21939
+ if (maxUserMarker == null ||
21940
+ new Date(maxUserMarker.lastSyncAt).getTime() < new Date(userMarker.lastSyncAt).getTime()) {
21941
+ return userMarker;
21942
+ }
21943
+ return maxUserMarker;
21944
+ }, null);
21945
+ return { data: latestUserMarker, cachedAt };
21929
21946
  };
21930
21947
 
21931
21948
  /** @hidden */
@@ -22100,17 +22117,25 @@ const preUpdateMessageCache = (rawPayload) => {
22100
22117
  messages: rawPayload.messages.map(message => convertFromRaw(message, rawPayload.reactions)),
22101
22118
  });
22102
22119
  };
22120
+ const DEBOUNCE_TIME = 2000;
22121
+ const currentDebounceMap = {};
22103
22122
  const prepareMessagePayload = async (payload, event) => {
22104
22123
  const markerIds = payload.messages.map(({ messageId }) => messageId);
22105
22124
  if (markerIds.length > 0) {
22106
22125
  // since the get markers method requires a channel cache to function with the reducer.
22107
22126
  preUpdateMessageCache(payload);
22108
- try {
22109
- await getMessageMarkers(markerIds);
22110
- }
22111
- catch (e) {
22112
- // empty block (from the spec, allow marker fetch to fail without having to do anything)
22127
+ const markerIdsKey = markerIds.join('');
22128
+ if (currentDebounceMap[markerIdsKey]) {
22129
+ clearTimeout(currentDebounceMap[markerIdsKey]);
22113
22130
  }
22131
+ currentDebounceMap[markerIdsKey] = setTimeout(() => {
22132
+ try {
22133
+ getMessageMarkers(markerIds);
22134
+ }
22135
+ catch (_error) {
22136
+ // do nothing
22137
+ }
22138
+ }, DEBOUNCE_TIME);
22114
22139
  }
22115
22140
  const { messageFeeds } = payload, restPayload = __rest(payload, ["messageFeeds"]);
22116
22141
  // upsert messageFeeds to subchannel cache because messageFeeds from event payload not include messagePreviewId
@@ -22731,43 +22756,92 @@ const initializeMessagePreviewSetting = async () => {
22731
22756
 
22732
22757
  /**
22733
22758
  * ```js
22734
- * import { getFeedSettings } from '@amityco/ts-sdk-react-native'
22735
- * const feedSettings = await getFeedSettings()
22736
- * const postFeedSetting = feedSettings.post
22759
+ * import { getSocialSettings } from '@amityco/ts-sdk-react-native'
22760
+ * const socialSettings = await getSocialSettings()
22737
22761
  * ```
22738
22762
  *
22739
- * Fetches a {@link Amity.FeedSettings} object
22763
+ * Fetches a {@link Amity.SocialSettings} object
22740
22764
  *
22741
- * @returns A Promise of {@link Amity.FeedSettings} object
22765
+ * @returns A Promise of {@link Amity.SocialSettings} object
22742
22766
  *
22743
22767
  * @category Client API
22744
22768
  * @async
22745
22769
  */
22746
- const getFeedSettings = async () => {
22770
+ const getSocialSettings = async () => {
22747
22771
  const client = getActiveClient();
22748
- const { data } = await client.http.get(`/api/v3/network-settings/feed-setting`);
22749
- return Object.fromEntries(data.feedSettings.map(({ feedType, contentSettings }) => {
22750
- return [feedType, contentSettings];
22751
- }));
22772
+ const { data } = await client.http.get(`/api/v3/network-settings/social`);
22773
+ return data.socialNetworkSetting;
22774
+ };
22775
+
22776
+ const checkUserPermission = (userId, permission) => {
22777
+ var _a;
22778
+ const user = (_a = pullFromCache(['users', 'get', userId])) === null || _a === void 0 ? void 0 : _a.data;
22779
+ if (!user)
22780
+ return false;
22781
+ return user.permissions.some(x => x === permission);
22782
+ };
22783
+
22784
+ const checkCommunityPermission = (userId, permission, communityId) => {
22785
+ var _a;
22786
+ if (!userId)
22787
+ return false;
22788
+ const member = (_a = pullFromCache([
22789
+ 'communityUsers',
22790
+ 'get',
22791
+ `${communityId}#${userId}`,
22792
+ ])) === null || _a === void 0 ? void 0 : _a.data;
22793
+ if (!member)
22794
+ return false;
22795
+ if (member.permissions.some(x => x === permission))
22796
+ return true;
22797
+ return checkUserPermission(userId, permission);
22798
+ };
22799
+
22800
+ const checkChannelPermission = (userId, permission, channelId) => {
22801
+ var _a;
22802
+ if (!userId)
22803
+ return false;
22804
+ const member = (_a = pullFromCache([
22805
+ 'channelUsers',
22806
+ 'get',
22807
+ `${channelId}#${userId}`,
22808
+ ])) === null || _a === void 0 ? void 0 : _a.data;
22809
+ if (!member)
22810
+ return false;
22811
+ if (member.permissions.some(x => x === permission))
22812
+ return true;
22813
+ return checkUserPermission(userId, permission);
22814
+ };
22815
+
22816
+ const hasPermission$1 = (permission) => {
22817
+ const { userId } = getActiveClient();
22818
+ return {
22819
+ currentUser: () => checkUserPermission(userId, permission),
22820
+ community: (communityId) => checkCommunityPermission(userId, permission, communityId),
22821
+ channel: (channelId) => checkChannelPermission(userId, permission, channelId),
22822
+ };
22752
22823
  };
22753
22824
 
22754
22825
  /**
22755
22826
  * ```js
22756
- * import { getSocialSettings } from '@amityco/ts-sdk-react-native'
22757
- * const socialSettings = await getSocialSettings()
22827
+ * import { getFeedSettings } from '@amityco/ts-sdk-react-native'
22828
+ * const feedSettings = await getFeedSettings()
22829
+ * const postFeedSetting = feedSettings.post
22758
22830
  * ```
22759
22831
  *
22760
- * Fetches a {@link Amity.SocialSettings} object
22832
+ * Fetches a {@link Amity.FeedSettings} object
22761
22833
  *
22762
- * @returns A Promise of {@link Amity.SocialSettings} object
22834
+ * @returns A Promise of {@link Amity.FeedSettings} object
22763
22835
  *
22764
22836
  * @category Client API
22765
22837
  * @async
22766
22838
  */
22767
- const getSocialSettings = async () => {
22839
+ const getFeedSettings = async () => {
22768
22840
  const client = getActiveClient();
22769
- const { data } = await client.http.get(`/api/v3/network-settings/social`);
22770
- return data.socialNetworkSetting;
22841
+ const { data } = await client.http.get(`/api/v3/network-settings/feed-setting`);
22842
+ return Object.fromEntries(data.feedSettings.map(({ feedType, contentSettings }) => {
22843
+ return [feedType, contentSettings];
22844
+ }));
22771
22845
  };
22772
22846
 
22773
22847
  /*
@@ -23029,6 +23103,11 @@ const logout = async () => {
23029
23103
  client.userId = undefined;
23030
23104
  client.token = undefined;
23031
23105
  client.http.defaults.headers.common.Authorization = '';
23106
+ client.http.defaults.metadata = {
23107
+ tokenExpiry: '',
23108
+ isGlobalBanned: false,
23109
+ isUserDeleted: false,
23110
+ };
23032
23111
  client.ws.io.opts.query = { token: '' };
23033
23112
  /*
23034
23113
  * Cache should be usable if tokenExpired
@@ -23213,7 +23292,7 @@ async function runMqtt() {
23213
23292
  * @async
23214
23293
  */
23215
23294
  const login = async (params, sessionHandler, config) => {
23216
- var _a, _b, _c;
23295
+ var _a, _b;
23217
23296
  const client = getActiveClient();
23218
23297
  let unsubWatcher;
23219
23298
  client.log('client/api/connectClient', Object.assign({ apiKey: client.apiKey, sessionState: client.sessionState }, params));
@@ -23225,25 +23304,35 @@ const login = async (params, sessionHandler, config) => {
23225
23304
  subscriptions = [];
23226
23305
  }
23227
23306
  // default values
23228
- (_a = params.deviceId) !== null && _a !== void 0 ? _a : (params.deviceId = await getDeviceId());
23307
+ const defaultDeviceId = await getDeviceId();
23229
23308
  try {
23230
- // @ts-ignore: in that particular case, typing can be
23231
- // ignored since we enforce default values just before.
23232
- const { users } = await setClientToken(params);
23309
+ const { users } = await setClientToken(Object.assign(Object.assign({}, params), { displayName: (params === null || params === void 0 ? void 0 : params.displayName) || params.userId, deviceId: (params === null || params === void 0 ? void 0 : params.deviceId) || defaultDeviceId }));
23310
+ const user = users.find(u => u.userId === params.userId);
23311
+ if (user == null) {
23312
+ throw new ASCError(`${params.userId} has not been founded`, 800000 /* Amity.ClientError.UNKNOWN_ERROR */, "error" /* Amity.ErrorLevel.ERROR */);
23313
+ }
23314
+ if (user.isDeleted) {
23315
+ terminateClient("userDeleted" /* Amity.TokenTerminationReason.USER_DELETED */);
23316
+ return false;
23317
+ }
23318
+ if (user.isGlobalBanned) {
23319
+ terminateClient("globalBan" /* Amity.TokenTerminationReason.GLOBAL_BAN */);
23320
+ return false;
23321
+ }
23233
23322
  // FIXME: events are duplicated if connectClient is called few times without disconnectClient
23234
23323
  // wire websocket events to our event emitter
23235
23324
  proxyWebsocketEvents(client.ws, client.emitter);
23236
23325
  client.ws.once('connect', () => {
23237
23326
  client.ws.open();
23238
23327
  });
23239
- client.userId = params.userId;
23328
+ client.userId = user.userId;
23240
23329
  client.sessionHandler = sessionHandler;
23241
23330
  /*
23242
23331
  * Cannot push to subscriptions as watcher needs to continue working even if
23243
23332
  * token expires
23244
23333
  */
23245
- unsubWatcher = client.accessTokenExpiryWatcher((_b = client.token) === null || _b === void 0 ? void 0 : _b.expiresAt, (_c = client.token) === null || _c === void 0 ? void 0 : _c.issuedAt, sessionHandler);
23246
- setActiveUser(users[0]);
23334
+ unsubWatcher = client.accessTokenExpiryWatcher((_a = client.token) === null || _a === void 0 ? void 0 : _a.expiresAt, (_b = client.token) === null || _b === void 0 ? void 0 : _b.issuedAt, sessionHandler);
23335
+ setActiveUser(user);
23247
23336
  }
23248
23337
  catch (error) {
23249
23338
  /*
@@ -23472,6 +23561,7 @@ const createClient = (apiKey, apiRegion = API_REGIONS.SG, { debugSession = DEFAU
23472
23561
  sessionState,
23473
23562
  accessTokenExpiryWatcher,
23474
23563
  sessionHandler,
23564
+ hasPermission: hasPermission$1,
23475
23565
  getFeedSettings,
23476
23566
  getSocialSettings,
23477
23567
  getMessagePreviewSetting,
@@ -23566,7 +23656,9 @@ const markerSync = async (deviceLastSyncAt) => {
23566
23656
  const onChannelMarkerFetched = (callback) => {
23567
23657
  const client = getActiveClient();
23568
23658
  const filter = (payload) => {
23569
- callback(payload.userEntityMarkers[0]);
23659
+ payload.userEntityMarkers.forEach(marker => {
23660
+ callback(marker);
23661
+ });
23570
23662
  };
23571
23663
  return createEventSubscriber(client, 'channelMarker/onChannelMarkerFetched', 'local.channelMarker.fetched', filter);
23572
23664
  };
@@ -23680,6 +23772,13 @@ const onFeedMarkerUpdated = (callback) => {
23680
23772
  * @category UserMarker Events
23681
23773
  */
23682
23774
  const onUserMarkerFetched = (callback) => {
23775
+ const client = getActiveClient();
23776
+ const filter = (payload) => {
23777
+ callback(payload.userMarkers);
23778
+ };
23779
+ return createEventSubscriber(client, 'userMarker/onUserMarkerFetched', 'local.userMarker.fetched', filter);
23780
+ };
23781
+ const onUserMarkerFetchedLegacy = (callback) => {
23683
23782
  const client = getActiveClient();
23684
23783
  const filter = (payload) => {
23685
23784
  callback(payload.userMarkers[0]);
@@ -23935,7 +24034,10 @@ const getTotalUnreadCount = (callback) => {
23935
24034
  if (!userId)
23936
24035
  throw new ASCError('The _id has not been defined in ActiveUser', 800000 /* Amity.ClientError.UNKNOWN_ERROR */, "error" /* Amity.ErrorLevel.ERROR */);
23937
24036
  const callbackDataSelector = (data) => { var _a; return (_a = data === null || data === void 0 ? void 0 : data.unreadCount) !== null && _a !== void 0 ? _a : 0; };
23938
- return liveObject(userId, callback, 'userId', getUserMarker, [onUserMarkerFetched], {
24037
+ return liveObject(userId, callback, 'userId', async () => {
24038
+ const { data: userMarker, cachedAt } = await getUserMarker();
24039
+ return { data: userMarker, cachedAt };
24040
+ }, [onUserMarkerFetchedLegacy], {
23939
24041
  callbackDataSelector,
23940
24042
  });
23941
24043
  };
@@ -23961,16 +24063,77 @@ const getUserUnread = (callback) => {
23961
24063
  const { _id: userId } = getActiveUser();
23962
24064
  if (!userId)
23963
24065
  throw new ASCError('The _id has not been defined in ActiveUser', 800000 /* Amity.ClientError.UNKNOWN_ERROR */, "error" /* Amity.ErrorLevel.ERROR */);
23964
- const callbackDataSelector = (data) => {
24066
+ const { log, cache } = getActiveClient();
24067
+ if (!cache) {
24068
+ console.log('For using Live Object feature you need to enable Cache!');
24069
+ }
24070
+ const timestamp = Date.now();
24071
+ log(`liveUserUnread(tmpid: ${timestamp}) > listen`);
24072
+ const disposers = [];
24073
+ let isUnsyncedModel = false; // for messages
24074
+ const dispatcher = (data) => {
24075
+ const userUnread = data.data;
24076
+ callback({
24077
+ data: {
24078
+ hasMentioned: userUnread.hasMentioned,
24079
+ unreadCount: userUnread.unreadCount,
24080
+ },
24081
+ loading: data.loading,
24082
+ error: data.error,
24083
+ });
24084
+ };
24085
+ const realtimeRouter = (userMarkers) => {
23965
24086
  var _a;
23966
- return {
23967
- unreadCount: (_a = data === null || data === void 0 ? void 0 : data.unreadCount) !== null && _a !== void 0 ? _a : 0,
23968
- hasMentioned: !!(data === null || data === void 0 ? void 0 : data.hasMentioned),
23969
- };
24087
+ const filterUserMarkers = userMarkers.filter(userMarker => userId === userMarker.userId);
24088
+ const latestUserMarker = filterUserMarkers.reduce((currentMaxUserMarker, userMarker) => {
24089
+ if (currentMaxUserMarker == null ||
24090
+ new Date(userMarker.lastSyncAt).getTime() >
24091
+ new Date(currentMaxUserMarker.lastSyncAt).getTime()) {
24092
+ return userMarker;
24093
+ }
24094
+ return currentMaxUserMarker;
24095
+ }, null);
24096
+ dispatcher({
24097
+ loading: false,
24098
+ data: {
24099
+ unreadCount: (_a = latestUserMarker === null || latestUserMarker === void 0 ? void 0 : latestUserMarker.unreadCount) !== null && _a !== void 0 ? _a : 0,
24100
+ hasMentioned: filterUserMarkers.some(userMarker => !!userMarker.hasMentioned),
24101
+ },
24102
+ });
24103
+ };
24104
+ function isAmityUserMarkerData(data) {
24105
+ if (data == null)
24106
+ return false;
24107
+ return (data === null || data === void 0 ? void 0 : data.data) != null;
24108
+ }
24109
+ const onFetch = () => {
24110
+ const query = createQuery(getUserMarker);
24111
+ runQuery(query, ({ error, data, loading, origin, cachedAt }) => {
24112
+ if (!isAmityUserMarkerData(data))
24113
+ return;
24114
+ if (cachedAt === UNSYNCED_OBJECT_CACHED_AT_VALUE) {
24115
+ dispatcher({
24116
+ data,
24117
+ origin,
24118
+ loading: false,
24119
+ error: new ASCApiError(UNSYNCED_OBJECT_CACHED_AT_MESSAGE, 800800 /* Amity.ClientError.DISALOOW_UNSYNCED_OBJECT */, "error" /* Amity.ErrorLevel.ERROR */),
24120
+ });
24121
+ isUnsyncedModel = true;
24122
+ disposers.forEach(fn => fn());
24123
+ }
24124
+ else if (!isUnsyncedModel) {
24125
+ dispatcher({ loading, data, origin, error });
24126
+ }
24127
+ if (error) {
24128
+ disposers.forEach(fn => fn());
24129
+ }
24130
+ });
24131
+ };
24132
+ disposers.push(onUserMarkerFetched(userMarkers => realtimeRouter(userMarkers)));
24133
+ onFetch();
24134
+ return () => {
24135
+ disposers.forEach(fn => fn());
23970
24136
  };
23971
- return liveObject(userId, callback, 'userId', getUserMarker, [onUserMarkerFetched], {
23972
- callbackDataSelector,
23973
- });
23974
24137
  };
23975
24138
 
23976
24139
  /**
@@ -24281,21 +24444,30 @@ const onUserMarkerSync = (callback) => {
24281
24444
  *
24282
24445
  * @category Message Events
24283
24446
  */
24284
- const onMessageCreated = (callback, local = true) => {
24447
+ const onMessageCreatedMqtt = (callback) => {
24285
24448
  const client = getActiveClient();
24286
24449
  const filter = async (rawPayload) => {
24287
24450
  const payload = await prepareMessagePayload(rawPayload);
24288
- const message = payload.messages[0];
24289
24451
  // Update in cache
24290
24452
  ingestInCache(payload);
24291
- callback(message);
24453
+ payload.messages.forEach(message => {
24454
+ callback(message);
24455
+ });
24292
24456
  };
24293
24457
  const disposers = [
24294
24458
  createEventSubscriber(client, 'message/onMessageCreated', 'message.created', filter),
24295
24459
  ];
24296
- if (local) {
24297
- createEventSubscriber(client, 'message/onMessageCreated', 'local.message.created', payload => callback(payload.messages[0]));
24298
- }
24460
+ return () => {
24461
+ disposers.forEach(fn => fn());
24462
+ };
24463
+ };
24464
+ const onMessageCreatedLocal = (callback) => {
24465
+ const client = getActiveClient();
24466
+ const disposers = [
24467
+ createEventSubscriber(client, 'message/onMessageCreated', 'local.message.created', payload => payload.messages.forEach(message => {
24468
+ callback(message);
24469
+ })),
24470
+ ];
24299
24471
  return () => {
24300
24472
  disposers.forEach(fn => fn());
24301
24473
  };
@@ -24609,18 +24781,22 @@ let isWaitingForResponse = false;
24609
24781
  let deviceLastSyncAt = null;
24610
24782
  const getDeviceLastSyncAt = () => {
24611
24783
  if (deviceLastSyncAt == null) {
24612
- return new Date().toISOString();
24784
+ return new Date();
24613
24785
  }
24614
24786
  return deviceLastSyncAt;
24615
24787
  };
24616
24788
  const saveDeviceLastSyncAt = (lastSyncAt) => {
24617
- if (!deviceLastSyncAt || new Date(lastSyncAt).getTime() > new Date(deviceLastSyncAt).getTime()) {
24789
+ if (lastSyncAt == null)
24790
+ return;
24791
+ if (!deviceLastSyncAt || lastSyncAt.getTime() > deviceLastSyncAt.getTime()) {
24618
24792
  deviceLastSyncAt = lastSyncAt;
24619
24793
  }
24620
24794
  };
24621
24795
  const fetchDeviceLastSyncAt = async () => {
24622
24796
  const { data: userMarker } = await getUserMarker();
24623
- saveDeviceLastSyncAt(userMarker.lastSyncAt);
24797
+ if (userMarker == null)
24798
+ return;
24799
+ saveDeviceLastSyncAt(new Date(userMarker.lastSyncAt));
24624
24800
  };
24625
24801
  /**
24626
24802
  * list of conditions that make timer still trigger the syncing process.
@@ -24658,18 +24834,33 @@ const markerSyncTrigger = async () => {
24658
24834
  // no event that require to call marker sync API
24659
24835
  return;
24660
24836
  }
24661
- isWaitingForResponse = true;
24662
- // any past events are considered processed here.
24663
- // however during waiting for the response, RTE could add the new message event;
24664
- // which will make the engine trigger another call next round.
24665
- events = [];
24666
- const response = await markerSync(getDeviceLastSyncAt());
24667
- saveDeviceLastSyncAt(response.data.userMarkers[0].lastSyncAt);
24668
- if (response.hasMore) {
24669
- events.push("has_more" /* Amity.MarkerSyncEvent.HAS_MORE */);
24670
- }
24671
- // eslint-disable-next-line require-atomic-updates
24672
- isWaitingForResponse = false;
24837
+ try {
24838
+ isWaitingForResponse = true;
24839
+ // any past events are considered processed here.
24840
+ // however during waiting for the response, RTE could add the new message event;
24841
+ // which will make the engine trigger another call next round.
24842
+ events = [];
24843
+ const response = await markerSync(getDeviceLastSyncAt().toISOString());
24844
+ const latestLastSyncAt = response.data.userMarkers.reduce((maxLastSyncAt, userMarker) => {
24845
+ if (maxLastSyncAt == null ||
24846
+ maxLastSyncAt.getTime() < new Date(userMarker.lastSyncAt).getTime()) {
24847
+ return new Date(userMarker.lastSyncAt);
24848
+ }
24849
+ return maxLastSyncAt;
24850
+ }, null);
24851
+ saveDeviceLastSyncAt(latestLastSyncAt);
24852
+ if (response.hasMore) {
24853
+ events.push("has_more" /* Amity.MarkerSyncEvent.HAS_MORE */);
24854
+ }
24855
+ }
24856
+ catch (_a) {
24857
+ // prevent sync from stopping
24858
+ }
24859
+ finally {
24860
+ if (isWaitingForResponse) {
24861
+ isWaitingForResponse = false;
24862
+ }
24863
+ }
24673
24864
  };
24674
24865
  const registerEventListeners = () => {
24675
24866
  if (disposers.length > 0) {
@@ -24683,14 +24874,11 @@ const registerEventListeners = () => {
24683
24874
  disposers.push(onOnline(() => {
24684
24875
  // should add RESUME to the event to trigger marker syncing again
24685
24876
  events.push("resume" /* Amity.MarkerSyncEvent.RESUME */);
24686
- }), onMessageCreated(message => {
24877
+ }), onMessageCreatedMqtt(message => {
24687
24878
  // only conversation, community and broadcast types can sync
24688
24879
  if (isUnreadCountSupport(message))
24689
24880
  events.push("new message" /* Amity.MarkerSyncEvent.NEW_MESSAGE */);
24690
- },
24691
- // only trigger sync from remote events to prevent an unread count equal `-1`
24692
- // when an optimistic message creation is performed.
24693
- false), onChannelCreated(() => events.push("subchannel is created" /* Amity.MarkerSyncEvent.CHANNEL_CREATED */)), onChannelDeleted(() => events.push("subchannel is deleted" /* Amity.MarkerSyncEvent.CHANNEL_DELETED */)), onChannelJoined(() => events.push("subchannel is joined" /* Amity.MarkerSyncEvent.CHANNEL_JOINED */)), onChannelLeft(() => events.push("subchannel is left" /* Amity.MarkerSyncEvent.CHANNEL_LEFT */)), onSubChannelCreated(() => events.push("subchannel is created" /* Amity.MarkerSyncEvent.SUB_CHANNEL_CREATED */)), onSubChannelDeleted(() =>
24881
+ }), onChannelCreated(() => events.push("subchannel is created" /* Amity.MarkerSyncEvent.CHANNEL_CREATED */)), onChannelDeleted(() => events.push("subchannel is deleted" /* Amity.MarkerSyncEvent.CHANNEL_DELETED */)), onChannelJoined(() => events.push("subchannel is joined" /* Amity.MarkerSyncEvent.CHANNEL_JOINED */)), onChannelLeft(() => events.push("subchannel is left" /* Amity.MarkerSyncEvent.CHANNEL_LEFT */)), onSubChannelCreated(() => events.push("subchannel is created" /* Amity.MarkerSyncEvent.SUB_CHANNEL_CREATED */)), onSubChannelDeleted(() =>
24694
24882
  /*
24695
24883
  workaround: when receiving the event for sub-channel deletion,
24696
24884
  before triggering marker update, the SDK will have to add a 2-second delay.
@@ -29231,7 +29419,26 @@ const getChannel = (channelId, callback) => {
29231
29419
  });
29232
29420
  callback(message);
29233
29421
  };
29234
- return onMessageCreated(updateMessagePreview);
29422
+ return onMessageCreatedMqtt(updateMessagePreview);
29423
+ }, 'channelId', 'channel'),
29424
+ convertEventPayload((callback) => {
29425
+ const updateMessagePreview = async (message) => {
29426
+ var _a;
29427
+ const messagePreviewSetting = await client.getMessagePreviewSetting(false);
29428
+ if (messagePreviewSetting === "no-message-preview" /* Amity.MessagePreviewSetting.NO_MESSAGE_PREVIEW */)
29429
+ return;
29430
+ await handleMessageCreated(message);
29431
+ if (message.channelId !== channelId)
29432
+ return;
29433
+ const channel = (_a = pullFromCache(['channel', 'get', channelId])) === null || _a === void 0 ? void 0 : _a.data;
29434
+ if (!channel)
29435
+ return;
29436
+ updateChannelCache(channel, {
29437
+ messagePreviewId: message.messageId,
29438
+ });
29439
+ callback(message);
29440
+ };
29441
+ return onMessageCreatedLocal(updateMessagePreview);
29235
29442
  }, 'channelId', 'channel'),
29236
29443
  convertEventPayload((callback) => {
29237
29444
  const updateMessagePreview = async (message) => {
@@ -29670,7 +29877,27 @@ class ChannelLiveCollectionController extends LiveCollectionController {
29670
29877
  {
29671
29878
  // TODO: merge this code to another onMessageCreated in this file
29672
29879
  fn: convertEventPayload((callback) => {
29673
- return onMessageCreated(message => {
29880
+ return onMessageCreatedMqtt(message => {
29881
+ var _a;
29882
+ const cacheData = (_a = pullFromCache([
29883
+ 'channel',
29884
+ 'get',
29885
+ message.channelId,
29886
+ ])) === null || _a === void 0 ? void 0 : _a.data;
29887
+ if (!cacheData)
29888
+ return;
29889
+ updateChannelCache(cacheData, {
29890
+ lastActivity: message.createdAt,
29891
+ });
29892
+ callback(message);
29893
+ });
29894
+ }, 'messageId', 'channel'),
29895
+ action: 'onUpdate',
29896
+ },
29897
+ {
29898
+ // TODO: merge this code to another onMessageCreated in this file
29899
+ fn: convertEventPayload((callback) => {
29900
+ return onMessageCreatedLocal(message => {
29674
29901
  var _a;
29675
29902
  const cacheData = (_a = pullFromCache([
29676
29903
  'channel',
@@ -29724,7 +29951,33 @@ class ChannelLiveCollectionController extends LiveCollectionController {
29724
29951
  });
29725
29952
  callback(message);
29726
29953
  };
29727
- return onMessageCreated(updateMessagePreview);
29954
+ return onMessageCreatedMqtt(updateMessagePreview);
29955
+ }, 'channelId', 'channel'),
29956
+ action: 'onUpdate',
29957
+ },
29958
+ {
29959
+ fn: convertEventPayload((callback) => {
29960
+ const updateMessagePreview = async (message) => {
29961
+ var _a;
29962
+ const messagePreviewSetting = await ChannelLiveCollectionController.getMessagePreviewSetting();
29963
+ if (messagePreviewSetting === "no-message-preview" /* Amity.MessagePreviewSetting.NO_MESSAGE_PREVIEW */)
29964
+ return;
29965
+ handleMessageCreated(message);
29966
+ if (this.shouldAbort(message.channelId))
29967
+ return;
29968
+ const channel = (_a = pullFromCache([
29969
+ 'channel',
29970
+ 'get',
29971
+ message.channelId,
29972
+ ])) === null || _a === void 0 ? void 0 : _a.data;
29973
+ if (!channel)
29974
+ return;
29975
+ updateChannelCache(channel, {
29976
+ messagePreviewId: message.messageId,
29977
+ });
29978
+ callback(message);
29979
+ };
29980
+ return onMessageCreatedLocal(updateMessagePreview);
29728
29981
  }, 'channelId', 'channel'),
29729
29982
  action: 'onUpdate',
29730
29983
  },
@@ -31226,7 +31479,7 @@ class MessageLiveCollectionController extends LiveCollectionController {
31226
31479
  }
31227
31480
  startSubscription() {
31228
31481
  return this.queryStreamController.subscribeRTE([
31229
- { fn: onMessageCreated, action: 'onCreate' },
31482
+ { fn: onMessageCreatedMqtt, action: 'onCreate' },
31230
31483
  { fn: onMessageDeleted, action: 'onDelete' },
31231
31484
  { fn: onMessageUpdated, action: 'onUpdate' },
31232
31485
  { fn: onMessageFlagged, action: 'onFlagged' },
@@ -31304,6 +31557,7 @@ class MessageLiveCollectionController extends LiveCollectionController {
31304
31557
  }
31305
31558
  }
31306
31559
 
31560
+ /* eslint-disable no-use-before-define */
31307
31561
  /* begin_public_function
31308
31562
  id: message.query
31309
31563
  */
@@ -31424,7 +31678,7 @@ const observeMessages = (subChannelId, callback) => {
31424
31678
  (_b = callback.onEvent) === null || _b === void 0 ? void 0 : _b.call(callback, action, message);
31425
31679
  (_c = callback[action]) === null || _c === void 0 ? void 0 : _c.call(callback, message);
31426
31680
  };
31427
- disposers.push(onMessageCreated(data => router({ data, loading: false, origin: 'event' }, 'onCreate')), onMessageUpdated(data => router({ data, loading: false, origin: 'event' }, 'onUpdate')), onMessageDeleted(data => router({ data, loading: false, origin: 'event' }, 'onDelete')), convertEventPayload(onMessageMarkerFetched, 'contentId', 'message')(data => router({ data, loading: false, origin: 'event' }, 'onCreate')), convertEventPayload(onMessageMarked, 'contentId', 'message')(data => router({ data, loading: false, origin: 'event' }, 'onCreate')));
31681
+ disposers.push(onMessageCreatedMqtt(data => router({ data, loading: false, origin: 'event' }, 'onCreate')), onMessageCreatedLocal(data => router({ data, loading: false, origin: 'event' }, 'onCreate')), onMessageUpdated(data => router({ data, loading: false, origin: 'event' }, 'onUpdate')), onMessageDeleted(data => router({ data, loading: false, origin: 'event' }, 'onDelete')), convertEventPayload(onMessageMarkerFetched, 'contentId', 'message')(data => router({ data, loading: false, origin: 'event' }, 'onCreate')), convertEventPayload(onMessageMarked, 'contentId', 'message')(data => router({ data, loading: false, origin: 'event' }, 'onCreate')));
31428
31682
  return () => {
31429
31683
  log(`observeMessages(tmpid: ${timestamp}) > dispose`);
31430
31684
  disposers.forEach(fn => fn());
@@ -31445,7 +31699,8 @@ var index$c = /*#__PURE__*/Object.freeze({
31445
31699
  flagMessage: flagMessage,
31446
31700
  unflagMessage: unflagMessage,
31447
31701
  isMessageFlaggedByMe: isMessageFlaggedByMe,
31448
- onMessageCreated: onMessageCreated,
31702
+ onMessageCreatedMqtt: onMessageCreatedMqtt,
31703
+ onMessageCreatedLocal: onMessageCreatedLocal,
31449
31704
  onMessageUpdated: onMessageUpdated,
31450
31705
  onMessageDeleted: onMessageDeleted,
31451
31706
  onMessageFlagged: onMessageFlagged,
@@ -31713,7 +31968,30 @@ const getSubChannel = (subChannelId, callback) => {
31713
31968
  });
31714
31969
  callback(message);
31715
31970
  };
31716
- return onMessageCreated(updateMessagePreview);
31971
+ return onMessageCreatedMqtt(updateMessagePreview);
31972
+ }, 'subChannelId', 'subChannel'),
31973
+ convertEventPayload((callback) => {
31974
+ const updateMessagePreview = async (message) => {
31975
+ var _a;
31976
+ const messagePreviewSetting = await client.getMessagePreviewSetting(false);
31977
+ if (messagePreviewSetting === "no-message-preview" /* Amity.MessagePreviewSetting.NO_MESSAGE_PREVIEW */)
31978
+ return;
31979
+ await handleMessageCreated(message);
31980
+ if (message.subChannelId !== subChannelId)
31981
+ return;
31982
+ const subChannel = (_a = pullFromCache([
31983
+ 'subChannel',
31984
+ 'get',
31985
+ subChannelId,
31986
+ ])) === null || _a === void 0 ? void 0 : _a.data;
31987
+ if (!subChannel)
31988
+ return;
31989
+ updateSubChannelCache(message.subChannelId, subChannel, {
31990
+ messagePreviewId: message.messageId,
31991
+ });
31992
+ callback(message);
31993
+ };
31994
+ return onMessageCreatedLocal(updateMessagePreview);
31717
31995
  }, 'subChannelId', 'subChannel'),
31718
31996
  convertEventPayload((callback) => {
31719
31997
  const updateMessagePreview = async (message) => {
@@ -31878,7 +32156,42 @@ class SubChannelLiveCollectionController extends LiveCollectionController {
31878
32156
  },
31879
32157
  {
31880
32158
  fn: callback => {
31881
- return onMessageCreated(async (message) => {
32159
+ return onMessageCreatedMqtt(async (message) => {
32160
+ var _a, _b;
32161
+ const cacheData = pullFromCache([
32162
+ 'subChannel',
32163
+ 'get',
32164
+ message.subChannelId,
32165
+ ]);
32166
+ if (!cacheData)
32167
+ return;
32168
+ const collection = (_a = pullFromCache(this.cacheKey)) === null || _a === void 0 ? void 0 : _a.data;
32169
+ if (!collection || !collection.data.includes(message.subChannelId))
32170
+ return;
32171
+ const client = getActiveClient();
32172
+ const messagePreviewSetting = await client.getMessagePreviewSetting(false);
32173
+ if (messagePreviewSetting === "no-message-preview" /* Amity.MessagePreviewSetting.NO_MESSAGE_PREVIEW */)
32174
+ return;
32175
+ handleMessageCreated(message);
32176
+ const subChannelCache = (_b = pullFromCache([
32177
+ 'subChannel',
32178
+ 'get',
32179
+ message.subChannelId,
32180
+ ])) === null || _b === void 0 ? void 0 : _b.data;
32181
+ if (!subChannelCache)
32182
+ return;
32183
+ updateSubChannelCache(message.subChannelId, subChannelCache, {
32184
+ lastActivity: message.createdAt,
32185
+ messagePreviewId: message.messageId,
32186
+ });
32187
+ callback(Object.assign(Object.assign({}, cacheData.data), { messagePreviewId: message.messageId, subChannelId: message.subChannelId, lastActivity: message.createdAt }));
32188
+ });
32189
+ },
32190
+ action: 'onUpdate',
32191
+ },
32192
+ {
32193
+ fn: callback => {
32194
+ return onMessageCreatedLocal(async (message) => {
31882
32195
  var _a, _b;
31883
32196
  const cacheData = pullFromCache([
31884
32197
  'subChannel',
@@ -32543,6 +32856,10 @@ const onCommunityUpdated = (callback) => createCommunityEventSubscriber('communi
32543
32856
  */
32544
32857
  const onCommunityDeleted = (callback) => createCommunityEventSubscriber('community.deleted', callback);
32545
32858
 
32859
+ function isNonNullable(value) {
32860
+ return value != null;
32861
+ }
32862
+
32546
32863
  function hasPermission(member, payload, permission) {
32547
32864
  if (member.permissions.some(x => x === permission)) {
32548
32865
  return true;
@@ -32553,21 +32870,21 @@ function hasPermission(member, payload, permission) {
32553
32870
  }
32554
32871
  function getEventRelatedMember(event, payload) {
32555
32872
  if (event === 'community.joined' || event === 'community.left') {
32556
- return payload.communityUsers[0];
32873
+ return payload.communityUsers;
32557
32874
  }
32558
32875
  // NOTE: backend returns the one who took the action and the one on whom
32559
32876
  // the action was taken. We need the 2nd one
32560
32877
  if (event === 'community.userRemoved') {
32561
- return payload.communityUsers.filter(x => x.communityMembership === 'none')[0];
32878
+ return payload.communityUsers.filter(x => x.communityMembership === 'none');
32562
32879
  }
32563
32880
  if (event === 'community.userBanned') {
32564
- return payload.communityUsers.filter(x => x.communityMembership === 'banned')[0];
32881
+ return payload.communityUsers.filter(x => x.communityMembership === 'banned');
32565
32882
  }
32566
32883
  // NOTE: it might be that in certain edge cases permission check won't be enough
32567
32884
  if (event === 'community.userUnbanned') {
32568
- return payload.communityUsers.filter(x => !hasPermission(x, payload, 'BAN_COMMUNITY_USER'))[0];
32885
+ return payload.communityUsers.filter(x => !hasPermission(x, payload, 'BAN_COMMUNITY_USER'));
32569
32886
  }
32570
- return payload.communityUsers.filter(x => !hasPermission(x, payload, 'ADD_COMMUNITY_USER'))[0];
32887
+ return payload.communityUsers.filter(x => !hasPermission(x, payload, 'ADD_COMMUNITY_USER'));
32571
32888
  }
32572
32889
  const createCommunityMemberEventSubscriber = (event, callback) => {
32573
32890
  const client = getActiveClient();
@@ -32591,12 +32908,17 @@ const createCommunityMemberEventSubscriber = (event, callback) => {
32591
32908
  'get',
32592
32909
  preparedPayload.communities[0].communityId,
32593
32910
  ]);
32594
- const member = pullFromCache([
32595
- 'communityUsers',
32596
- 'get',
32597
- getResolver('communityUsers')(getEventRelatedMember(event, preparedPayload)),
32598
- ]);
32599
- callback(community.data, member.data);
32911
+ const members = getEventRelatedMember(event, preparedPayload)
32912
+ .map(member => {
32913
+ const memberCache = pullFromCache([
32914
+ 'communityUsers',
32915
+ 'get',
32916
+ getResolver('communityUsers')(member),
32917
+ ]);
32918
+ return memberCache === null || memberCache === void 0 ? void 0 : memberCache.data;
32919
+ })
32920
+ .filter(isNonNullable);
32921
+ callback(community.data, members);
32600
32922
  }
32601
32923
  };
32602
32924
  return createEventSubscriber(client, event, event, filter);
@@ -33641,19 +33963,25 @@ const getMembers = (params, callback, config) => {
33641
33963
  error: data.error,
33642
33964
  });
33643
33965
  };
33644
- const realtimeRouter = (_) => (_, communityMember) => {
33966
+ const realtimeRouter = (_) => (_, communityMembers) => {
33645
33967
  var _a;
33646
- if (params.communityId !== communityMember.communityId) {
33647
- return;
33648
- }
33649
33968
  const collection = (_a = pullFromCache(cacheKey)) === null || _a === void 0 ? void 0 : _a.data;
33650
- if (!collection)
33969
+ if (!collection) {
33651
33970
  return;
33652
- const communityMemberCacheId = getResolver('communityUsers')({
33653
- communityId: params.communityId,
33654
- userId: communityMember.userId,
33655
- });
33656
- collection.data = [...new Set([communityMemberCacheId, ...collection.data])];
33971
+ }
33972
+ const communityMemberCacheIds = communityMembers
33973
+ .map(communityMember => {
33974
+ if (params.communityId !== communityMember.communityId) {
33975
+ return;
33976
+ }
33977
+ const communityMemberCacheId = getResolver('communityUsers')({
33978
+ communityId: params.communityId,
33979
+ userId: communityMember.userId,
33980
+ });
33981
+ return communityMemberCacheId;
33982
+ })
33983
+ .filter(isNonNullable);
33984
+ collection.data = [...new Set([...communityMemberCacheIds, ...collection.data])];
33657
33985
  pushToCache(cacheKey, collection);
33658
33986
  pushToCache(cacheByCommunityIdKey, collection);
33659
33987
  responder(collection, true);
@@ -36960,7 +37288,7 @@ const createStory = async (payload) => {
36960
37288
  if (client.cache)
36961
37289
  ingestInCache(convertedResponse);
36962
37290
  pushToCache(["story-sync-state" /* STORY_KEY_CACHE.SYNC_STATE */, payload.targetId], "synced" /* Amity.SyncState.Synced */);
36963
- fireEvent('story.created', convertedResponse);
37291
+ fireEvent('local.story.created', convertedResponse);
36964
37292
  const cachedAt = client.cache && Date.now();
36965
37293
  return {
36966
37294
  data: convertedResponse.stories.length > 0 ? convertedResponse.stories[0] : undefined,
@@ -37005,7 +37333,7 @@ const createImageStory = async (targetType, targetId, formData, metadata = {}, i
37005
37333
  pushToCache(["story-sync-state" /* STORY_KEY_CACHE.SYNC_STATE */, targetId], "syncing" /* Amity.SyncState.Syncing */);
37006
37334
  // Fire optimistic event
37007
37335
  createOptimisticEvent({ payload, formData }, optimisticData => {
37008
- fireEvent('story.created', optimisticData);
37336
+ fireEvent('local.story.created', optimisticData);
37009
37337
  });
37010
37338
  try {
37011
37339
  const { data } = await uploadImage(formData);
@@ -37016,7 +37344,7 @@ const createImageStory = async (targetType, targetId, formData, metadata = {}, i
37016
37344
  payload = Object.assign(Object.assign({}, payload), { data: Object.assign(Object.assign({}, payload.data), { fileId }) });
37017
37345
  // Fire optimistic event - update fileId
37018
37346
  createOptimisticEvent({ payload, formData }, optimisticData => {
37019
- fireEvent('story.created', optimisticData);
37347
+ fireEvent('local.story.created', optimisticData);
37020
37348
  });
37021
37349
  const result = await createStory(payload);
37022
37350
  if (!result.data)
@@ -37027,7 +37355,7 @@ const createImageStory = async (targetType, targetId, formData, metadata = {}, i
37027
37355
  pushToCache(["story-sync-state" /* STORY_KEY_CACHE.SYNC_STATE */, targetId], "error" /* Amity.SyncState.Error */);
37028
37356
  // Fire optimistic event - failed to upload image
37029
37357
  createOptimisticEvent({ payload: Object.assign(Object.assign({}, payload), { syncState: "error" /* Amity.SyncState.Error */ }), formData }, optimisticData => {
37030
- fireEvent('story.error', optimisticData);
37358
+ fireEvent('local.story.error', optimisticData);
37031
37359
  });
37032
37360
  throw error;
37033
37361
  }
@@ -37066,7 +37394,7 @@ const createVideoStory = async (targetType, targetId, formData, metadata = {}, i
37066
37394
  pushToCache(["story-sync-state" /* STORY_KEY_CACHE.SYNC_STATE */, targetId], "syncing" /* Amity.SyncState.Syncing */);
37067
37395
  // Fire optimistic event
37068
37396
  createOptimisticEvent({ payload, formData, isVideo: true }, optimisticData => {
37069
- fireEvent('story.created', optimisticData);
37397
+ fireEvent('local.story.created', optimisticData);
37070
37398
  });
37071
37399
  try {
37072
37400
  const { data } = await uploadVideo(formData, ContentFeedType.STORY);
@@ -37077,7 +37405,7 @@ const createVideoStory = async (targetType, targetId, formData, metadata = {}, i
37077
37405
  payload = Object.assign(Object.assign({}, payload), { data: Object.assign(Object.assign({}, payload.data), { fileId, videoFileId: { original: fileId } }) });
37078
37406
  // Fire optimistic event - update fileId
37079
37407
  createOptimisticEvent({ payload, formData, isVideo: true }, optimisticData => {
37080
- fireEvent('story.created', optimisticData);
37408
+ fireEvent('local.story.created', optimisticData);
37081
37409
  });
37082
37410
  const result = await createStory(payload);
37083
37411
  if (!result.data)
@@ -37088,7 +37416,7 @@ const createVideoStory = async (targetType, targetId, formData, metadata = {}, i
37088
37416
  pushToCache(["story-sync-state" /* STORY_KEY_CACHE.SYNC_STATE */, targetId], "error" /* Amity.SyncState.Error */);
37089
37417
  // Fire optimistic upload failed
37090
37418
  createOptimisticEvent({ payload: Object.assign(Object.assign({}, payload), { syncState: "error" /* Amity.SyncState.Error */ }), formData, isVideo: true }, optimisticData => {
37091
- fireEvent('story.error', optimisticData);
37419
+ fireEvent('local.story.error', optimisticData);
37092
37420
  });
37093
37421
  throw error;
37094
37422
  }
@@ -37136,12 +37464,86 @@ const softDeleteStory = async (storyId) => {
37136
37464
  };
37137
37465
 
37138
37466
  const onStoryUpdated = (callback) => {
37467
+ const client = getActiveClient();
37468
+ const filter = async (payload) => {
37469
+ // Apply the necessary field for story payload
37470
+ const convertPayload = convertStoryRawToInternal(payload);
37471
+ ingestInCache(convertPayload);
37472
+ callback(convertPayload.stories);
37473
+ };
37474
+ const disposers = [createEventSubscriber(client, 'onStoryUpdated', 'story.updated', filter)];
37475
+ return () => {
37476
+ disposers.forEach(fn => fn());
37477
+ };
37478
+ };
37479
+ const onStoryUpdatedLocal = (callback) => {
37139
37480
  const client = getActiveClient();
37140
37481
  const filter = async (payload) => {
37141
37482
  ingestInCache(payload);
37142
37483
  callback(payload.stories);
37143
37484
  };
37144
- return createEventSubscriber(client, 'onStoryUpdated', 'story.updated', filter);
37485
+ const disposers = [
37486
+ createEventSubscriber(client, 'onStoryUpdated', 'local.story.updated', filter),
37487
+ ];
37488
+ return () => {
37489
+ disposers.forEach(fn => fn());
37490
+ };
37491
+ };
37492
+
37493
+ const onStoryReactionAdded = (callback) => {
37494
+ const client = getActiveClient();
37495
+ const filter = async (payload) => {
37496
+ const convertPayload = convertStoryRawToInternal(payload);
37497
+ ingestInCache(convertPayload);
37498
+ callback(convertPayload.stories);
37499
+ };
37500
+ const disposers = [
37501
+ createEventSubscriber(client, 'onStoryReactionAdded', 'story.reactionAdded', filter),
37502
+ ];
37503
+ return () => {
37504
+ disposers.forEach(fn => fn());
37505
+ };
37506
+ };
37507
+ const onStoryReactionAddedLocal = (callback) => {
37508
+ const client = getActiveClient();
37509
+ const filter = async (payload) => {
37510
+ ingestInCache(payload);
37511
+ callback(payload.stories);
37512
+ };
37513
+ const disposers = [
37514
+ createEventSubscriber(client, 'onStoryReactionAdded', 'local.story.reactionAdded', filter),
37515
+ ];
37516
+ return () => {
37517
+ disposers.forEach(fn => fn());
37518
+ };
37519
+ };
37520
+
37521
+ const onStoryReactionRemoved = (callback) => {
37522
+ const client = getActiveClient();
37523
+ const filter = async (payload) => {
37524
+ const convertPayload = convertStoryRawToInternal(payload);
37525
+ ingestInCache(convertPayload);
37526
+ callback(convertPayload.stories);
37527
+ };
37528
+ const disposers = [
37529
+ createEventSubscriber(client, 'onStoryReactionRemoved', 'story.reactionRemoved', filter),
37530
+ ];
37531
+ return () => {
37532
+ disposers.forEach(fn => fn());
37533
+ };
37534
+ };
37535
+ const onStoryReactionRemovedLocal = (callback) => {
37536
+ const client = getActiveClient();
37537
+ const filter = async (payload) => {
37538
+ ingestInCache(payload);
37539
+ callback(payload.stories);
37540
+ };
37541
+ const disposers = [
37542
+ createEventSubscriber(client, 'onStoryReactionRemoved', 'local.story.reactionRemoved', filter),
37543
+ ];
37544
+ return () => {
37545
+ disposers.forEach(fn => fn());
37546
+ };
37145
37547
  };
37146
37548
 
37147
37549
  const updateLocalLastStoryExpires = (stories) => {
@@ -37191,21 +37593,54 @@ const getActiveStoriesByTarget$1 = async ({ targetType, targetId, options, }) =>
37191
37593
  };
37192
37594
 
37193
37595
  const onStoryCreated = (callback) => {
37596
+ const client = getActiveClient();
37597
+ const filter = async (payload) => {
37598
+ // Apply the necessary field for story payload
37599
+ const convertPayload = convertStoryRawToInternal(payload);
37600
+ ingestInCache(convertPayload);
37601
+ callback(convertPayload.stories);
37602
+ };
37603
+ const disposers = [createEventSubscriber(client, 'onStoryCreated', 'story.created', filter)];
37604
+ return () => {
37605
+ disposers.forEach(fn => fn());
37606
+ };
37607
+ };
37608
+ const onStoryCreatedLocal = (callback) => {
37194
37609
  const client = getActiveClient();
37195
37610
  const filter = async (payload) => {
37196
37611
  ingestInCache(payload);
37197
37612
  callback(payload.stories);
37198
37613
  };
37199
- return createEventSubscriber(client, 'onStoryCreated', 'story.created', filter);
37614
+ const disposers = [
37615
+ createEventSubscriber(client, 'onStoryCreated', 'local.story.created', filter),
37616
+ ];
37617
+ return () => {
37618
+ disposers.forEach(fn => fn());
37619
+ };
37200
37620
  };
37201
37621
 
37202
37622
  const onStoryDeleted = (callback) => {
37623
+ const client = getActiveClient();
37624
+ const filter = async (payload) => {
37625
+ const convertPayload = convertStoryRawToInternal(payload);
37626
+ ingestInCache(convertPayload);
37627
+ callback(convertPayload.stories);
37628
+ };
37629
+ const disposer = [createEventSubscriber(client, 'onStoryDeleted', 'story.deleted', filter)];
37630
+ return () => {
37631
+ disposer.forEach(fn => fn());
37632
+ };
37633
+ };
37634
+ const onStoryDeletedLocal = (callback) => {
37203
37635
  const client = getActiveClient();
37204
37636
  const filter = async (payload) => {
37205
37637
  ingestInCache(payload);
37206
37638
  callback(payload.stories);
37207
37639
  };
37208
- return createEventSubscriber(client, 'onStoryDeleted', 'story.deleted', filter);
37640
+ const disposer = [createEventSubscriber(client, 'onStoryDeleted', 'local.story.deleted', filter)];
37641
+ return () => {
37642
+ disposer.forEach(fn => fn());
37643
+ };
37209
37644
  };
37210
37645
 
37211
37646
  const onStoryError = (callback) => {
@@ -37214,7 +37649,7 @@ const onStoryError = (callback) => {
37214
37649
  ingestInCache(payload);
37215
37650
  callback(payload.stories);
37216
37651
  };
37217
- return createEventSubscriber(client, 'onStoryError', 'story.error', filter);
37652
+ return createEventSubscriber(client, 'onStoryError', 'local.story.error', filter);
37218
37653
  };
37219
37654
 
37220
37655
  const onStoryLocalDataUpdated = (callback) => {
@@ -37222,9 +37657,29 @@ const onStoryLocalDataUpdated = (callback) => {
37222
37657
  const filter = (payload) => {
37223
37658
  callback(payload);
37224
37659
  };
37225
- return createEventSubscriber(client, 'onStoryLocalDataUpdated', 'local.story.updated', filter);
37660
+ return createEventSubscriber(client, 'onStoryLocalDataUpdated', 'local.story.reload', filter);
37226
37661
  };
37227
37662
 
37663
+ /**
37664
+ * ```js
37665
+ * import { StoryRepository } from '@amityco/js-sdk';
37666
+ * let storiesData;
37667
+ *
37668
+ * const unsubscribe = StoryRepository.getActiveStoriesByTarget({ targetId, targetType }, response => {
37669
+ * storiesData = response.data;
37670
+ * });
37671
+ *
37672
+ * unsubscribe();
37673
+ * ```
37674
+ *
37675
+ * Observe all mutations on a given {@link Amity.Story}
37676
+ *
37677
+ * @param params for querying stories from a community
37678
+ * @param callback the function to call when new data are available
37679
+ * @returns An {@link Amity.Unsubscriber} function to run when willing to stop observing the story
37680
+ *
37681
+ * @category SubChannel Live Object
37682
+ */
37228
37683
  const getActiveStoriesByTarget = (params, callback) => {
37229
37684
  const { log, cache } = getActiveClient();
37230
37685
  const disposers = [];
@@ -37340,7 +37795,7 @@ const getActiveStoriesByTarget = (params, callback) => {
37340
37795
  });
37341
37796
  };
37342
37797
  onFetch(true);
37343
- disposers.push(onStoryCreated(realtimeRouter()), onStoryUpdated(realtimeRouter()), onStoryDeleted(realtimeRouter()), onStoryError(realtimeRouter()), onStoryLocalDataUpdated(reloadData()), () => dropFromCache(cacheKey));
37798
+ disposers.push(onStoryCreated(realtimeRouter()), onStoryUpdated(realtimeRouter()), onStoryDeleted(realtimeRouter()), onStoryReactionAdded(realtimeRouter()), onStoryReactionRemoved(realtimeRouter()), onStoryError(realtimeRouter()), onStoryCreatedLocal(realtimeRouter()), onStoryUpdatedLocal(realtimeRouter()), onStoryDeletedLocal(realtimeRouter()), onStoryReactionAddedLocal(realtimeRouter()), onStoryReactionRemovedLocal(realtimeRouter()), onStoryLocalDataUpdated(reloadData()), () => dropFromCache(cacheKey));
37344
37799
  return () => {
37345
37800
  log(`getActiveStoriesByTarget(tmpid: ${timestamp}) > dispose`);
37346
37801
  disposers.forEach(fn => fn());
@@ -37409,7 +37864,17 @@ const getStoryByStoryId = (storyId, callback) => {
37409
37864
  return;
37410
37865
  }
37411
37866
  callback(Object.assign(Object.assign({}, data), { data: LinkedObject.story(data.data) }));
37412
- }, 'storyId', getStoryByStoryId$1, [getSingleItemFromArray(onStoryDeleted), getSingleItemFromArray(onStoryError)]);
37867
+ }, 'storyId', getStoryByStoryId$1, [
37868
+ getSingleItemFromArray(onStoryUpdated),
37869
+ getSingleItemFromArray(onStoryDeleted),
37870
+ getSingleItemFromArray(onStoryReactionAdded),
37871
+ getSingleItemFromArray(onStoryReactionRemoved),
37872
+ getSingleItemFromArray(onStoryError),
37873
+ getSingleItemFromArray(onStoryUpdatedLocal),
37874
+ getSingleItemFromArray(onStoryDeletedLocal),
37875
+ getSingleItemFromArray(onStoryReactionAddedLocal),
37876
+ getSingleItemFromArray(onStoryReactionRemovedLocal),
37877
+ ]);
37413
37878
  };
37414
37879
 
37415
37880
  const getTargetsByTargetIds$1 = async (targets) => {
@@ -37502,6 +37967,157 @@ const getTargetsByTargetIds = (params, callback) => {
37502
37967
  };
37503
37968
  };
37504
37969
 
37970
+ class StoryQueryStreamController extends QueryStreamController {
37971
+ constructor(query, cacheKey, notifyChange, paginationController) {
37972
+ super(query, cacheKey);
37973
+ this.notifyChange = notifyChange;
37974
+ this.paginationController = paginationController;
37975
+ }
37976
+ // eslint-disable-next-line class-methods-use-this
37977
+ saveToMainDB(response) {
37978
+ const client = getActiveClient();
37979
+ const cachedAt = client.cache && Date.now();
37980
+ const convertedData = convertStoryRawToInternal(response);
37981
+ if (client.cache) {
37982
+ ingestInCache(convertedData, { cachedAt });
37983
+ // Update local last story expires
37984
+ updateLocalLastStoryExpires(convertedData.stories);
37985
+ // Map storyId to referenceId
37986
+ mappingStoryIdToReferenceId(convertedData.stories);
37987
+ }
37988
+ }
37989
+ // eslint-disable-next-line class-methods-use-this
37990
+ getStoryReferenceIds(story) {
37991
+ if (story === null || story === void 0 ? void 0 : story.referenceId) {
37992
+ return story.referenceId;
37993
+ }
37994
+ return story.storyId;
37995
+ }
37996
+ appendToQueryStream(response, direction, refresh = false) {
37997
+ var _a, _b;
37998
+ if (refresh) {
37999
+ pushToCache(this.cacheKey, {
38000
+ data: response.stories.map(this.getStoryReferenceIds),
38001
+ });
38002
+ }
38003
+ else {
38004
+ const collection = (_a = pullFromCache(this.cacheKey)) === null || _a === void 0 ? void 0 : _a.data;
38005
+ const stories = (_b = collection === null || collection === void 0 ? void 0 : collection.data) !== null && _b !== void 0 ? _b : [];
38006
+ pushToCache(this.cacheKey, Object.assign(Object.assign({}, collection), { data: [...new Set([...stories, ...response.stories.map(this.getStoryReferenceIds)])] }));
38007
+ }
38008
+ }
38009
+ reactor(action) {
38010
+ return (payload) => {
38011
+ var _a;
38012
+ const collection = (_a = pullFromCache(this.cacheKey)) === null || _a === void 0 ? void 0 : _a.data;
38013
+ if (!collection)
38014
+ return;
38015
+ const newReferenceIds = payload.map(({ referenceId }) => referenceId);
38016
+ collection.data = [...new Set([...newReferenceIds, ...collection.data])];
38017
+ pushToCache(this.cacheKey, collection);
38018
+ this.notifyChange({ origin: "event" /* Amity.LiveDataOrigin.EVENT */, loading: false });
38019
+ };
38020
+ }
38021
+ subscribeRTE(createSubscriber) {
38022
+ return createSubscriber.map(subscriber => subscriber.fn(this.reactor(subscriber.action)));
38023
+ }
38024
+ }
38025
+
38026
+ /* eslint-disable no-use-before-define */
38027
+ class StoryPaginationNoPageController extends PaginationNoPageController {
38028
+ async getRequest(queryParams) {
38029
+ const { data: queryResponse } = await this.http.get('/api/v4/stories-by-targets', {
38030
+ params: Object.assign({}, queryParams),
38031
+ });
38032
+ return queryResponse;
38033
+ }
38034
+ }
38035
+
38036
+ class StoryLiveCollectionController extends LiveCollectionController {
38037
+ constructor(query, callback) {
38038
+ const queryStreamId = hash(query);
38039
+ const cacheKey = ["story-target-ids" /* STORY_KEY_CACHE.STORY_TARGET_IDS */, 'collection', queryStreamId];
38040
+ const paginationController = new StoryPaginationNoPageController(query);
38041
+ super(paginationController, queryStreamId, cacheKey, callback);
38042
+ this.query = query;
38043
+ this.queryStreamController = new StoryQueryStreamController(this.query, this.cacheKey, this.notifyChange.bind(this), paginationController);
38044
+ this.paginationController = paginationController;
38045
+ this.callback = callback.bind(this);
38046
+ this.loadPage(true);
38047
+ }
38048
+ setup() {
38049
+ var _a;
38050
+ const collection = (_a = pullFromCache(this.cacheKey)) === null || _a === void 0 ? void 0 : _a.data;
38051
+ if (!collection) {
38052
+ pushToCache(this.cacheKey, {
38053
+ data: [],
38054
+ params: {},
38055
+ });
38056
+ }
38057
+ }
38058
+ persistModel(response) {
38059
+ this.queryStreamController.saveToMainDB(response);
38060
+ }
38061
+ persistQueryStream({ response, direction, refresh, }) {
38062
+ this.queryStreamController.appendToQueryStream(response, direction, refresh);
38063
+ }
38064
+ notifyChange({ origin, loading, error }) {
38065
+ var _a;
38066
+ const collection = (_a = pullFromCache(this.cacheKey)) === null || _a === void 0 ? void 0 : _a.data;
38067
+ if (!collection)
38068
+ return;
38069
+ let data = collection.data
38070
+ .map(referenceId => pullFromCache(["story" /* STORY_KEY_CACHE.STORY */, 'get', referenceId]))
38071
+ .filter(Boolean)
38072
+ .map(internStory => LinkedObject.story(internStory.data));
38073
+ if (!this.shouldNotify(data) && origin === 'event')
38074
+ return;
38075
+ data = this.applyFilter(data);
38076
+ this.callback({
38077
+ onNextPage: undefined,
38078
+ data,
38079
+ hasNextPage: false,
38080
+ loading,
38081
+ error,
38082
+ });
38083
+ }
38084
+ applyFilter(data) {
38085
+ var _a, _b;
38086
+ const internalStories = data;
38087
+ const orderBy = ((_b = (_a = this.query) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.orderBy) || 'desc';
38088
+ return orderBy === 'asc'
38089
+ ? internalStories.sort(sortByFirstCreated)
38090
+ : internalStories.sort(sortByLastCreated);
38091
+ }
38092
+ startSubscription() {
38093
+ return this.queryStreamController.subscribeRTE([
38094
+ { fn: onStoryCreated, action: "onCreate" /* Amity.StoryActionType.OnCreate */ },
38095
+ { fn: onStoryUpdated, action: "onUpdate" /* Amity.StoryActionType.OnUpdate */ },
38096
+ { fn: onStoryDeleted, action: "onDelete" /* Amity.StoryActionType.OnDelete */ },
38097
+ { fn: onStoryError, action: "onError" /* Amity.StoryActionType.OnError */ },
38098
+ ]);
38099
+ }
38100
+ }
38101
+
38102
+ const getStoriesByTargetIds = (params, callback, config) => {
38103
+ const { log, cache, userId } = getActiveClient();
38104
+ if (!cache) {
38105
+ console.log(ENABLE_CACHE_MESSAGE);
38106
+ }
38107
+ const timestamp = Date.now();
38108
+ log(`getStoriesByTargetIds(tmpid: ${timestamp}) > listen`);
38109
+ const storyLiveCollection = new StoryLiveCollectionController(params, callback);
38110
+ const disposers = storyLiveCollection.startSubscription();
38111
+ const cacheKey = storyLiveCollection.getCacheKey();
38112
+ disposers.push(() => {
38113
+ dropFromCache(cacheKey);
38114
+ });
38115
+ return () => {
38116
+ log(`getStoriesByTargetIds(tmpid: ${timestamp}) > dispose`);
38117
+ disposers.forEach(fn => fn());
38118
+ };
38119
+ };
38120
+
37505
38121
  var index = /*#__PURE__*/Object.freeze({
37506
38122
  __proto__: null,
37507
38123
  createImageStory: createImageStory,
@@ -37511,7 +38127,8 @@ var index = /*#__PURE__*/Object.freeze({
37511
38127
  getActiveStoriesByTarget: getActiveStoriesByTarget,
37512
38128
  getStoryByStoryId: getStoryByStoryId,
37513
38129
  getTargetById: getTargetById,
37514
- getTargetsByTargetIds: getTargetsByTargetIds
38130
+ getTargetsByTargetIds: getTargetsByTargetIds,
38131
+ getStoriesByTargetIds: getStoriesByTargetIds
37515
38132
  });
37516
38133
 
37517
38134
  /**
@@ -37536,4 +38153,4 @@ const createUserToken = async (apiKey, apiRegion, params) => {
37536
38153
  return { accessToken: data.accessToken };
37537
38154
  };
37538
38155
 
37539
- export { API_REGIONS, index$7 as CategoryRepository, index$d as ChannelRepository, index$k as Client, index$4 as CommentRepository, CommunityPostSettingMaps, CommunityPostSettings, index$8 as CommunityRepository, ContentFeedType, DefaultCommunityPostSetting, index$6 as FeedRepository, index$h as FileRepository, FileType, index$1 as LiveStreamPlayer, MessageContentType, index$c as MessageRepository, index$2 as PollRepository, PostContentType, index$5 as PostRepository, index$g as ReactionRepository, index as StoryRepository, index$3 as StreamRepository, index$b as SubChannelRepository, SubscriptionLevels, index$i as UserRepository, VERSION, VideoResolution, VideoSize, VideoTranscodingStatus, backupCache, createQuery, createReport, createUserToken, deleteReport, disableCache, dropFromCache, enableCache, filterByChannelMembership, filterByCommunityMembership, filterByFeedType, filterByPostDataTypes, filterByPropEquality, filterByPropInclusion, filterByPropIntersection, filterBySearchTerm, filterByStringComparePartially, getChannelTopic, getCommentTopic, getCommunityTopic, getMarkedMessageTopic, getMessageTopic, getMyFollowersTopic, getMyFollowingsTopic, getNetworkTopic, getPostTopic, getRole, getSmartFeedChannelTopic, getSmartFeedMessageTopic, getSmartFeedSubChannelTopic, getSubChannelTopic, getUserTopic, isAfterBefore, isAfterBeforeRaw, isCachable, isFetcher, isFresh, isLocal, isMutator, isOffline, isPaged, isReportedByMe, isSkip, mergeInCache, onChannelMarkerFetched, onFeedMarkerFetched, onFeedMarkerUpdated, onMessageMarked, onMessageMarkerFetched, onSubChannelMarkerFetched, onSubChannelMarkerUpdated, onUserMarkerFetched, pullFromCache, pushToCache, queryCache, queryOptions, queryRoles, restoreCache, runQuery, sortByChannelSegment, sortByDisplayName, sortByFirstCreated, sortByFirstUpdated, sortByLastActivity, sortByLastCreated, sortByLastUpdated, sortByName, sortBySegmentNumber, subscribeTopic, toPage, toPageRaw, toToken, upsertInCache, wipeCache };
38156
+ export { API_REGIONS, index$7 as CategoryRepository, index$d as ChannelRepository, index$k as Client, index$4 as CommentRepository, CommunityPostSettingMaps, CommunityPostSettings, index$8 as CommunityRepository, ContentFeedType, DefaultCommunityPostSetting, index$6 as FeedRepository, index$h as FileRepository, FileType, index$1 as LiveStreamPlayer, MessageContentType, index$c as MessageRepository, index$2 as PollRepository, PostContentType, index$5 as PostRepository, index$g as ReactionRepository, index as StoryRepository, index$3 as StreamRepository, index$b as SubChannelRepository, SubscriptionLevels, index$i as UserRepository, VERSION, VideoResolution, VideoSize, VideoTranscodingStatus, backupCache, createQuery, createReport, createUserToken, deleteReport, disableCache, dropFromCache, enableCache, filterByChannelMembership, filterByCommunityMembership, filterByFeedType, filterByPostDataTypes, filterByPropEquality, filterByPropInclusion, filterByPropIntersection, filterBySearchTerm, filterByStringComparePartially, getChannelTopic, getCommentTopic, getCommunityStoriesTopic, getCommunityTopic, getMarkedMessageTopic, getMessageTopic, getMyFollowersTopic, getMyFollowingsTopic, getNetworkTopic, getPostTopic, getRole, getSmartFeedChannelTopic, getSmartFeedMessageTopic, getSmartFeedSubChannelTopic, getStoryTopic, getSubChannelTopic, getUserTopic, isAfterBefore, isAfterBeforeRaw, isCachable, isFetcher, isFresh, isLocal, isMutator, isOffline, isPaged, isReportedByMe, isSkip, mergeInCache, onChannelMarkerFetched, onFeedMarkerFetched, onFeedMarkerUpdated, onMessageMarked, onMessageMarkerFetched, onSubChannelMarkerFetched, onSubChannelMarkerUpdated, onUserMarkerFetched, onUserMarkerFetchedLegacy, pullFromCache, pushToCache, queryCache, queryOptions, queryRoles, restoreCache, runQuery, sortByChannelSegment, sortByDisplayName, sortByFirstCreated, sortByFirstUpdated, sortByLastActivity, sortByLastCreated, sortByLastUpdated, sortByName, sortBySegmentNumber, subscribeTopic, toPage, toPageRaw, toToken, upsertInCache, wipeCache };