@amityco/ts-sdk 6.17.3 → 6.18.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 (401) hide show
  1. package/dist/@types/core/events.d.ts +4 -2
  2. package/dist/@types/core/events.d.ts.map +1 -1
  3. package/dist/@types/core/marker.d.ts +12 -1
  4. package/dist/@types/core/marker.d.ts.map +1 -1
  5. package/dist/@types/core/model.d.ts +6 -2
  6. package/dist/@types/core/model.d.ts.map +1 -1
  7. package/dist/@types/core/payload.d.ts +20 -3
  8. package/dist/@types/core/payload.d.ts.map +1 -1
  9. package/dist/@types/core/readReceipt.d.ts +21 -0
  10. package/dist/@types/core/readReceipt.d.ts.map +1 -0
  11. package/dist/@types/domains/channel.d.ts +11 -1
  12. package/dist/@types/domains/channel.d.ts.map +1 -1
  13. package/dist/@types/domains/client.d.ts +12 -2
  14. package/dist/@types/domains/client.d.ts.map +1 -1
  15. package/dist/@types/domains/community.d.ts +1 -3
  16. package/dist/@types/domains/community.d.ts.map +1 -1
  17. package/dist/@types/domains/group.d.ts +2 -2
  18. package/dist/@types/domains/group.d.ts.map +1 -1
  19. package/dist/@types/domains/marker.d.ts +15 -0
  20. package/dist/@types/domains/marker.d.ts.map +1 -1
  21. package/dist/@types/domains/message.d.ts +4 -0
  22. package/dist/@types/domains/message.d.ts.map +1 -1
  23. package/dist/@types/domains/story.d.ts +20 -3
  24. package/dist/@types/domains/story.d.ts.map +1 -1
  25. package/dist/@types/domains/subChannel.d.ts +4 -0
  26. package/dist/@types/domains/subChannel.d.ts.map +1 -1
  27. package/dist/channelRepository/api/markAsRead.d.ts.map +1 -1
  28. package/dist/channelRepository/channelModeration/api/index.d.ts +2 -0
  29. package/dist/channelRepository/channelModeration/api/index.d.ts.map +1 -1
  30. package/dist/channelRepository/channelModeration/api/muteMembers.d.ts +17 -0
  31. package/dist/channelRepository/channelModeration/api/muteMembers.d.ts.map +1 -0
  32. package/dist/channelRepository/channelModeration/api/unmuteMembers.d.ts +16 -0
  33. package/dist/channelRepository/channelModeration/api/unmuteMembers.d.ts.map +1 -0
  34. package/dist/channelRepository/events/onChannelDeleted.d.ts.map +1 -1
  35. package/dist/channelRepository/events/onChannelLeft.d.ts.map +1 -1
  36. package/dist/channelRepository/events/onChannelMemberBanned.d.ts.map +1 -1
  37. package/dist/channelRepository/observers/getChannel.d.ts.map +1 -1
  38. package/dist/channelRepository/observers/getChannels/ChannelLiveCollectionController.d.ts.map +1 -1
  39. package/dist/channelRepository/observers/getChannels/ChannelQueryStreamController.d.ts.map +1 -1
  40. package/dist/channelRepository/utils/getChannelIsMentioned.d.ts +10 -0
  41. package/dist/channelRepository/utils/getChannelIsMentioned.d.ts.map +1 -0
  42. package/dist/channelRepository/utils/getSubChannelsUnreadCount.d.ts +10 -0
  43. package/dist/channelRepository/utils/getSubChannelsUnreadCount.d.ts.map +1 -0
  44. package/dist/channelRepository/utils/prepareChannelPayload.d.ts.map +1 -1
  45. package/dist/client/api/accessTokenExpiryWatcher.d.ts +1 -1
  46. package/dist/client/api/accessTokenExpiryWatcher.d.ts.map +1 -1
  47. package/dist/client/api/createClient.d.ts.map +1 -1
  48. package/dist/client/api/enableUnreadCount.d.ts +2 -0
  49. package/dist/client/api/enableUnreadCount.d.ts.map +1 -0
  50. package/dist/client/api/index.d.ts +1 -0
  51. package/dist/client/api/index.d.ts.map +1 -1
  52. package/dist/client/api/login.d.ts.map +1 -1
  53. package/dist/client/api/markerSync.d.ts.map +1 -1
  54. package/dist/client/api/renewal.d.ts.map +1 -1
  55. package/dist/client/api/validateTexts.d.ts +8 -0
  56. package/dist/client/api/validateTexts.d.ts.map +1 -0
  57. package/dist/client/api/validateUrls.d.ts +8 -0
  58. package/dist/client/api/validateUrls.d.ts.map +1 -0
  59. package/dist/client/observers/getUserUnread.d.ts +1 -1
  60. package/dist/client/observers/getUserUnread.d.ts.map +1 -1
  61. package/dist/client/utils/ReadReceiptSync/readReceiptSyncEngine.d.ts +33 -0
  62. package/dist/client/utils/ReadReceiptSync/readReceiptSyncEngine.d.ts.map +1 -0
  63. package/dist/client/utils/ReadReceiptSync/readReceiptSyncEngineOnLoginHandler.d.ts +3 -0
  64. package/dist/client/utils/ReadReceiptSync/readReceiptSyncEngineOnLoginHandler.d.ts.map +1 -0
  65. package/dist/client/utils/markerSyncEngine.d.ts +2 -0
  66. package/dist/client/utils/markerSyncEngine.d.ts.map +1 -1
  67. package/dist/client/utils/setClientToken.d.ts.map +1 -1
  68. package/dist/client/utils/subscribeGlobalTopic.d.ts.map +1 -1
  69. package/dist/commentRepository/api/deleteComment.d.ts.map +1 -1
  70. package/dist/commentRepository/api/queryComments.d.ts.map +1 -1
  71. package/dist/commentRepository/events/utils.d.ts.map +1 -1
  72. package/dist/commentRepository/internalApi/queryComments.d.ts.map +1 -1
  73. package/dist/commentRepository/utils/convertToInternalComment.d.ts +8 -0
  74. package/dist/commentRepository/utils/convertToInternalComment.d.ts.map +1 -0
  75. package/dist/core/events.d.ts +3 -3
  76. package/dist/core/events.d.ts.map +1 -1
  77. package/dist/core/model/idResolvers.d.ts.map +1 -1
  78. package/dist/core/model/index.d.ts.map +1 -1
  79. package/dist/core/query/sorting.d.ts +6 -0
  80. package/dist/core/query/sorting.d.ts.map +1 -1
  81. package/dist/core/subscription.d.ts +1 -0
  82. package/dist/core/subscription.d.ts.map +1 -1
  83. package/dist/index.cjs.js +5745 -4474
  84. package/dist/index.esm.js +5183 -3914
  85. package/dist/index.umd.js +4 -4
  86. package/dist/marker/api/getChannelMarkers.d.ts.map +1 -1
  87. package/dist/marker/api/getMessageMarkers.d.ts.map +1 -1
  88. package/dist/marker/api/getSubChannelMarkers.d.ts.map +1 -1
  89. package/dist/marker/api/getUserMarker.d.ts +1 -1
  90. package/dist/marker/api/getUserMarker.d.ts.map +1 -1
  91. package/dist/marker/api/getUserMessageFeedMarkers.d.ts +18 -0
  92. package/dist/marker/api/getUserMessageFeedMarkers.d.ts.map +1 -0
  93. package/dist/marker/events/onMessageMarked.d.ts.map +1 -1
  94. package/dist/marker/events/onUserFeedMarkerUpdated.d.ts +17 -0
  95. package/dist/marker/events/onUserFeedMarkerUpdated.d.ts.map +1 -0
  96. package/dist/marker/events/onUserMarkerSync.d.ts.map +1 -1
  97. package/dist/marker/utils/addFlagIsDeletedSubChannelUnreadByChannelId.d.ts +2 -0
  98. package/dist/marker/utils/addFlagIsDeletedSubChannelUnreadByChannelId.d.ts.map +1 -0
  99. package/dist/marker/utils/addFlagIsDeletedSubChannelUnreadBySubChannelId.d.ts +2 -0
  100. package/dist/marker/utils/addFlagIsDeletedSubChannelUnreadBySubChannelId.d.ts.map +1 -0
  101. package/dist/marker/utils/deleteChannelUnreadByChannelId.d.ts +2 -0
  102. package/dist/marker/utils/deleteChannelUnreadByChannelId.d.ts.map +1 -0
  103. package/dist/marker/utils/persistUnreadCountInfo.d.ts +2 -0
  104. package/dist/marker/utils/persistUnreadCountInfo.d.ts.map +1 -0
  105. package/dist/marker/utils/reCalculateChannelUnreadInfo.d.ts +2 -0
  106. package/dist/marker/utils/reCalculateChannelUnreadInfo.d.ts.map +1 -0
  107. package/dist/marker/utils/updateSubChannelUnreadFromMessage.d.ts +2 -0
  108. package/dist/marker/utils/updateSubChannelUnreadFromMessage.d.ts.map +1 -0
  109. package/dist/messagePreview/utils/getSubChannelMessagePreviewWithUser.d.ts +1 -0
  110. package/dist/messagePreview/utils/getSubChannelMessagePreviewWithUser.d.ts.map +1 -1
  111. package/dist/messagePreview/utils/updateMessagePreviewFromMessage.d.ts +2 -2
  112. package/dist/messagePreview/utils/updateMessagePreviewFromMessage.d.ts.map +1 -1
  113. package/dist/messageRepository/api/createMessage.d.ts.map +1 -1
  114. package/dist/messageRepository/api/deleteMessage.d.ts.map +1 -1
  115. package/dist/messageRepository/api/editMessage.d.ts.map +1 -1
  116. package/dist/messageRepository/api/getMessage.d.ts.map +1 -1
  117. package/dist/messageRepository/api/getMessages.d.ts.map +1 -1
  118. package/dist/messageRepository/api/markAsDelivered.d.ts.map +1 -1
  119. package/dist/messageRepository/api/queryMessages.d.ts.map +1 -1
  120. package/dist/messageRepository/api/softDeleteMessage.d.ts.map +1 -1
  121. package/dist/messageRepository/api/updateMessage.d.ts.map +1 -1
  122. package/dist/messageRepository/events/onMessageCreated.d.ts +2 -2
  123. package/dist/messageRepository/events/onMessageCreated.d.ts.map +1 -1
  124. package/dist/messageRepository/events/onMessageDeleted.d.ts +1 -1
  125. package/dist/messageRepository/events/onMessageDeleted.d.ts.map +1 -1
  126. package/dist/messageRepository/events/onMessageFetched.d.ts +1 -1
  127. package/dist/messageRepository/events/onMessageFetched.d.ts.map +1 -1
  128. package/dist/messageRepository/events/onMessageFlagCleared.d.ts +1 -1
  129. package/dist/messageRepository/events/onMessageFlagCleared.d.ts.map +1 -1
  130. package/dist/messageRepository/events/onMessageFlagged.d.ts +1 -1
  131. package/dist/messageRepository/events/onMessageFlagged.d.ts.map +1 -1
  132. package/dist/messageRepository/events/onMessageReactionAdded.d.ts +1 -1
  133. package/dist/messageRepository/events/onMessageReactionAdded.d.ts.map +1 -1
  134. package/dist/messageRepository/events/onMessageReactionRemoved.d.ts +1 -1
  135. package/dist/messageRepository/events/onMessageReactionRemoved.d.ts.map +1 -1
  136. package/dist/messageRepository/events/onMessageUnflagged.d.ts +1 -1
  137. package/dist/messageRepository/events/onMessageUnflagged.d.ts.map +1 -1
  138. package/dist/messageRepository/events/onMessageUpdated.d.ts +1 -1
  139. package/dist/messageRepository/events/onMessageUpdated.d.ts.map +1 -1
  140. package/dist/messageRepository/internalApi/getMessage.d.ts +32 -0
  141. package/dist/messageRepository/internalApi/getMessage.d.ts.map +1 -0
  142. package/dist/messageRepository/internalApi/getMessages.d.ts +32 -0
  143. package/dist/messageRepository/internalApi/getMessages.d.ts.map +1 -0
  144. package/dist/messageRepository/observers/getMessage.d.ts.map +1 -1
  145. package/dist/messageRepository/observers/getMessages/MessageLiveCollectionController.d.ts.map +1 -1
  146. package/dist/messageRepository/observers/getMessages/MessageQueryStreamController.d.ts +2 -2
  147. package/dist/messageRepository/observers/getMessages/MessageQueryStreamController.d.ts.map +1 -1
  148. package/dist/messageRepository/observers/observeMessage.d.ts.map +1 -1
  149. package/dist/messageRepository/observers/observeMessages.d.ts.map +1 -1
  150. package/dist/messageRepository/utils/getMessageReadCount.d.ts +1 -1
  151. package/dist/messageRepository/utils/getMessageReadCount.d.ts.map +1 -1
  152. package/dist/messageRepository/utils/prepareMessagePayload.d.ts +1 -1
  153. package/dist/messageRepository/utils/prepareMessagePayload.d.ts.map +1 -1
  154. package/dist/reactionRepository/events/onReactionAdded.d.ts +1 -1
  155. package/dist/reactionRepository/events/onReactionAdded.d.ts.map +1 -1
  156. package/dist/reactionRepository/events/onReactionRemoved.d.ts +1 -1
  157. package/dist/reactionRepository/events/onReactionRemoved.d.ts.map +1 -1
  158. package/dist/reactionRepository/events/onReactorAdded.d.ts.map +1 -1
  159. package/dist/reactionRepository/events/onReactorRemoved.d.ts.map +1 -1
  160. package/dist/reactionRepository/utils/fetchReference.d.ts +1 -1
  161. package/dist/reactionRepository/utils/fetchReference.d.ts.map +1 -1
  162. package/dist/reactionRepository/utils/prepareMessagePayloadForCache.d.ts +1 -1
  163. package/dist/reactionRepository/utils/prepareMessagePayloadForCache.d.ts.map +1 -1
  164. package/dist/reactionRepository/utils/prepareReactionPayloadFormEvent.d.ts +1 -0
  165. package/dist/reactionRepository/utils/prepareReactionPayloadFormEvent.d.ts.map +1 -1
  166. package/dist/storyRepository/api/createImageStory.d.ts.map +1 -1
  167. package/dist/storyRepository/api/createVideoStory.d.ts.map +1 -1
  168. package/dist/storyRepository/constants.d.ts +2 -0
  169. package/dist/storyRepository/constants.d.ts.map +1 -1
  170. package/dist/storyRepository/events/onStoryReactionAdded.d.ts.map +1 -1
  171. package/dist/storyRepository/events/onStoryReactionRemoved.d.ts.map +1 -1
  172. package/dist/storyRepository/internalApi/getStoryByStoryId.d.ts.map +1 -1
  173. package/dist/storyRepository/observers/getActiveStoriesByTarget.d.ts.map +1 -1
  174. package/dist/storyRepository/observers/getGlobalStoryTargets/GlobalStoryLiveCollectionController.d.ts +14 -0
  175. package/dist/storyRepository/observers/getGlobalStoryTargets/GlobalStoryLiveCollectionController.d.ts.map +1 -0
  176. package/dist/storyRepository/observers/getGlobalStoryTargets/GlobalStoryPageController.d.ts +13 -0
  177. package/dist/storyRepository/observers/getGlobalStoryTargets/GlobalStoryPageController.d.ts.map +1 -0
  178. package/dist/storyRepository/observers/getGlobalStoryTargets/GlobalStoryQueryStreamController.d.ts +16 -0
  179. package/dist/storyRepository/observers/getGlobalStoryTargets/GlobalStoryQueryStreamController.d.ts.map +1 -0
  180. package/dist/storyRepository/observers/getGlobalStoryTargets/getGlobalStoryTargets.d.ts +2 -0
  181. package/dist/storyRepository/observers/getGlobalStoryTargets/getGlobalStoryTargets.d.ts.map +1 -0
  182. package/dist/storyRepository/observers/getGlobalStoryTargets/index.d.ts +2 -0
  183. package/dist/storyRepository/observers/getGlobalStoryTargets/index.d.ts.map +1 -0
  184. package/dist/storyRepository/observers/getStoriesByTargetIds/StoryPaginationNoPageController.d.ts.map +1 -1
  185. package/dist/storyRepository/observers/index.d.ts +1 -0
  186. package/dist/storyRepository/observers/index.d.ts.map +1 -1
  187. package/dist/storyRepository/utils/StoryComputedValue.d.ts +21 -0
  188. package/dist/storyRepository/utils/StoryComputedValue.d.ts.map +1 -0
  189. package/dist/storyRepository/utils/convertRawToStory.d.ts +2 -2
  190. package/dist/storyRepository/utils/convertRawToStory.d.ts.map +1 -1
  191. package/dist/storyRepository/utils/convertStoryPayloadToRaw.d.ts.map +1 -1
  192. package/dist/subChannelRepository/api/markAsReadBySegment.d.ts +16 -0
  193. package/dist/subChannelRepository/api/markAsReadBySegment.d.ts.map +1 -0
  194. package/dist/subChannelRepository/api/readingAPI.d.ts.map +1 -1
  195. package/dist/subChannelRepository/api/startReadingAPI.d.ts.map +1 -1
  196. package/dist/subChannelRepository/api/stopReadingAPI.d.ts.map +1 -1
  197. package/dist/subChannelRepository/events/onSubChannelCreated.d.ts.map +1 -1
  198. package/dist/subChannelRepository/events/onSubChannelDeleted.d.ts.map +1 -1
  199. package/dist/subChannelRepository/index.d.ts +1 -0
  200. package/dist/subChannelRepository/index.d.ts.map +1 -1
  201. package/dist/subChannelRepository/observers/getSubChannel.d.ts.map +1 -1
  202. package/dist/subChannelRepository/observers/getSubChannels/SubChannelLiveCollectionController.d.ts.map +1 -1
  203. package/dist/subChannelRepository/utils/convertSubChannelFromRaw.d.ts.map +1 -1
  204. package/dist/subChannelRepository/utils/getSubChannelIsMentioned.d.ts +2 -0
  205. package/dist/subChannelRepository/utils/getSubChannelIsMentioned.d.ts.map +1 -0
  206. package/dist/subChannelRepository/utils/getSubChannelUnreadCount.d.ts.map +1 -1
  207. package/dist/subChannelRepository/utils/markReadEngine.d.ts +2 -0
  208. package/dist/subChannelRepository/utils/markReadEngine.d.ts.map +1 -1
  209. package/dist/subChannelRepository/utils/messageReceiptSync.d.ts +31 -0
  210. package/dist/subChannelRepository/utils/messageReceiptSync.d.ts.map +1 -0
  211. package/dist/subChannelRepository/utils/persistOptimisticUnreadInfo.d.ts +2 -0
  212. package/dist/subChannelRepository/utils/persistOptimisticUnreadInfo.d.ts.map +1 -0
  213. package/dist/utils/linkedObject/index.d.ts +1 -0
  214. package/dist/utils/linkedObject/index.d.ts.map +1 -1
  215. package/dist/utils/linkedObject/messageLinkedObject.d.ts +2 -0
  216. package/dist/utils/linkedObject/messageLinkedObject.d.ts.map +1 -0
  217. package/dist/utils/linkedObject/storyLinkedObject.d.ts.map +1 -1
  218. package/dist/utils/linkedObject/storyTargetLinkedObject.d.ts.map +1 -1
  219. package/dist/utils/marker.d.ts +0 -1
  220. package/dist/utils/marker.d.ts.map +1 -1
  221. package/dist/utils/tests/dummy/channel.d.ts.map +1 -1
  222. package/dist/utils/tests/dummy/community.d.ts +1 -1
  223. package/dist/utils/tests/dummy/marker.d.ts +1 -0
  224. package/dist/utils/tests/dummy/marker.d.ts.map +1 -1
  225. package/package.json +1 -1
  226. package/src/@types/core/events.ts +4 -2
  227. package/src/@types/core/marker.ts +13 -1
  228. package/src/@types/core/model.ts +8 -2
  229. package/src/@types/core/payload.ts +26 -3
  230. package/src/@types/core/readReceipt.ts +23 -0
  231. package/src/@types/domains/channel.ts +11 -1
  232. package/src/@types/domains/client.ts +14 -6
  233. package/src/@types/domains/community.ts +2 -3
  234. package/src/@types/domains/group.ts +2 -2
  235. package/src/@types/domains/marker.ts +17 -0
  236. package/src/@types/domains/message.ts +6 -0
  237. package/src/@types/domains/story.ts +26 -4
  238. package/src/@types/domains/subChannel.ts +4 -0
  239. package/src/channelRepository/api/markAsRead.ts +3 -7
  240. package/src/channelRepository/channelModeration/api/index.ts +3 -0
  241. package/src/channelRepository/channelModeration/api/muteMembers.ts +47 -0
  242. package/src/channelRepository/channelModeration/api/unmuteMembers.ts +43 -0
  243. package/src/channelRepository/events/onChannelCreated.ts +1 -1
  244. package/src/channelRepository/events/onChannelDeleted.ts +9 -0
  245. package/src/channelRepository/events/onChannelJoined.ts +1 -1
  246. package/src/channelRepository/events/onChannelLeft.ts +10 -1
  247. package/src/channelRepository/events/onChannelMemberAdded.ts +1 -1
  248. package/src/channelRepository/events/onChannelMemberBanned.ts +17 -0
  249. package/src/channelRepository/events/onChannelMemberRemoved.ts +1 -1
  250. package/src/channelRepository/events/onChannelMemberRoleAdded.ts +1 -1
  251. package/src/channelRepository/events/onChannelMemberRoleRemoved.ts +1 -1
  252. package/src/channelRepository/events/onChannelMemberUnbanned.ts +1 -1
  253. package/src/channelRepository/events/onChannelMuted.ts +1 -1
  254. package/src/channelRepository/events/onChannelUpdated.ts +1 -1
  255. package/src/channelRepository/observers/getChannel.ts +12 -8
  256. package/src/channelRepository/observers/getChannels/ChannelLiveCollectionController.ts +44 -11
  257. package/src/channelRepository/observers/getChannels/ChannelQueryStreamController.ts +4 -1
  258. package/src/channelRepository/utils/getChannelIsMentioned.ts +42 -0
  259. package/src/channelRepository/utils/getSubChannelsUnreadCount.ts +50 -0
  260. package/src/channelRepository/utils/prepareChannelPayload.ts +25 -4
  261. package/src/channelRepository/utils/tests/prepareChannelPayload.test.ts +6 -0
  262. package/src/client/api/accessTokenExpiryWatcher.ts +7 -2
  263. package/src/client/api/createClient.ts +11 -0
  264. package/src/client/api/enableUnreadCount.ts +24 -0
  265. package/src/client/api/index.ts +2 -0
  266. package/src/client/api/login.ts +7 -5
  267. package/src/client/api/markerSync.ts +2 -7
  268. package/src/client/api/renewal.ts +2 -5
  269. package/src/client/api/validateTexts.ts +23 -0
  270. package/src/client/api/validateUrls.ts +23 -0
  271. package/src/client/observers/getUserUnread.ts +38 -13
  272. package/src/client/utils/ReadReceiptSync/readReceiptSyncEngine.ts +259 -0
  273. package/src/client/utils/ReadReceiptSync/readReceiptSyncEngineOnLoginHandler.ts +21 -0
  274. package/src/client/utils/markerSyncEngine.ts +30 -5
  275. package/src/client/utils/setClientToken.ts +0 -2
  276. package/src/client/utils/subscribeGlobalTopic.ts +2 -0
  277. package/src/commentRepository/api/deleteComment.ts +29 -12
  278. package/src/commentRepository/api/queryComments.ts +4 -2
  279. package/src/commentRepository/events/utils.ts +1 -2
  280. package/src/commentRepository/internalApi/queryComments.ts +4 -3
  281. package/src/commentRepository/utils/convertToInternalComment.ts +17 -0
  282. package/src/core/model/idResolvers.ts +3 -0
  283. package/src/core/model/index.ts +3 -0
  284. package/src/core/query/sorting.ts +8 -0
  285. package/src/core/subscription.ts +6 -0
  286. package/src/marker/api/getChannelMarkers.ts +2 -4
  287. package/src/marker/api/getMessageMarkers.ts +1 -5
  288. package/src/marker/api/getSubChannelMarkers.ts +12 -7
  289. package/src/marker/api/getUserMarker.ts +3 -10
  290. package/src/marker/api/getUserMessageFeedMarkers.ts +35 -0
  291. package/src/marker/api/tests/getSubChannelMarkers.test.ts +7 -0
  292. package/src/marker/events/onChannelMarkerFetched.ts +1 -1
  293. package/src/marker/events/onChannelMarkerUpdated.ts +1 -1
  294. package/src/marker/events/onFeedlMarkerFetched.ts +1 -1
  295. package/src/marker/events/onFeedlMarkerUpdated.ts +1 -1
  296. package/src/marker/events/onMessageMarked.ts +28 -12
  297. package/src/marker/events/onMessageMarkerFetched.ts +1 -1
  298. package/src/marker/events/onSubChannelMarkerFetched.ts +1 -1
  299. package/src/marker/events/onSubChannelMarkerUpdated.ts +1 -1
  300. package/src/marker/events/onUserFeedMarkerUpdated.ts +38 -0
  301. package/src/marker/events/onUserMarkerFetched.ts +1 -1
  302. package/src/marker/events/onUserMarkerSync.ts +3 -8
  303. package/src/marker/utils/addFlagIsDeletedSubChannelUnreadByChannelId.ts +19 -0
  304. package/src/marker/utils/addFlagIsDeletedSubChannelUnreadBySubChannelId.ts +13 -0
  305. package/src/marker/utils/deleteChannelUnreadByChannelId.ts +11 -0
  306. package/src/marker/utils/persistUnreadCountInfo.ts +47 -0
  307. package/src/marker/utils/reCalculateChannelUnreadInfo.ts +37 -0
  308. package/src/marker/utils/updateSubChannelUnreadFromMessage.ts +40 -0
  309. package/src/messagePreview/utils/updateMessagePreviewFromMessage.ts +2 -2
  310. package/src/messageRepository/api/createMessage.ts +6 -4
  311. package/src/messageRepository/api/deleteMessage.ts +6 -5
  312. package/src/messageRepository/api/editMessage.ts +5 -4
  313. package/src/messageRepository/api/getMessage.ts +2 -1
  314. package/src/messageRepository/api/getMessages.ts +2 -1
  315. package/src/messageRepository/api/markAsDelivered.ts +2 -6
  316. package/src/messageRepository/api/queryMessages.ts +8 -1
  317. package/src/messageRepository/api/softDeleteMessage.ts +6 -5
  318. package/src/messageRepository/api/updateMessage.ts +5 -4
  319. package/src/messageRepository/events/onMessageCreated.ts +12 -2
  320. package/src/messageRepository/events/onMessageDeleted.ts +4 -2
  321. package/src/messageRepository/events/onMessageFetched.ts +3 -1
  322. package/src/messageRepository/events/onMessageFlagCleared.ts +1 -1
  323. package/src/messageRepository/events/onMessageFlagged.ts +4 -2
  324. package/src/messageRepository/events/onMessageReactionAdded.ts +1 -1
  325. package/src/messageRepository/events/onMessageReactionRemoved.ts +1 -1
  326. package/src/messageRepository/events/onMessageUnflagged.ts +3 -1
  327. package/src/messageRepository/events/onMessageUpdated.ts +4 -2
  328. package/src/messageRepository/events/tests/events.test.ts +4 -1
  329. package/src/messageRepository/internalApi/getMessage.ts +101 -0
  330. package/src/messageRepository/internalApi/getMessages.ts +82 -0
  331. package/src/messageRepository/observers/getMessage.ts +10 -2
  332. package/src/messageRepository/observers/getMessages/MessageLiveCollectionController.ts +4 -2
  333. package/src/messageRepository/observers/getMessages/MessageQueryStreamController.ts +2 -2
  334. package/src/messageRepository/observers/observeMessage.ts +13 -4
  335. package/src/messageRepository/observers/observeMessages.ts +19 -6
  336. package/src/messageRepository/utils/getMessageReadCount.ts +5 -4
  337. package/src/messageRepository/utils/prepareMessagePayload.ts +6 -10
  338. package/src/reactionRepository/events/onReactionAdded.ts +1 -0
  339. package/src/reactionRepository/events/onReactorAdded.ts +13 -0
  340. package/src/reactionRepository/events/onReactorRemoved.ts +13 -0
  341. package/src/reactionRepository/utils/fetchReference.ts +1 -1
  342. package/src/reactionRepository/utils/prepareMessagePayloadForCache.ts +1 -1
  343. package/src/reactionRepository/utils/prepareReactionPayloadFormEvent.ts +68 -15
  344. package/src/storyRepository/api/createImageStory.ts +7 -0
  345. package/src/storyRepository/api/createVideoStory.ts +7 -0
  346. package/src/storyRepository/constants.ts +2 -0
  347. package/src/storyRepository/events/onStoryCreated.ts +2 -2
  348. package/src/storyRepository/events/onStoryDeleted.ts +2 -2
  349. package/src/storyRepository/events/onStoryReactionAdded.ts +11 -5
  350. package/src/storyRepository/events/onStoryReactionRemoved.ts +11 -5
  351. package/src/storyRepository/events/onStoryUpdated.ts +2 -2
  352. package/src/storyRepository/internalApi/createStory.ts +2 -2
  353. package/src/storyRepository/internalApi/deleteStory.ts +1 -1
  354. package/src/storyRepository/internalApi/getActiveStoriesByTarget.ts +2 -2
  355. package/src/storyRepository/internalApi/getStoryByStoryId.ts +2 -1
  356. package/src/storyRepository/observers/getActiveStoriesByTarget.ts +11 -5
  357. package/src/storyRepository/observers/getGlobalStoryTargets/GlobalStoryLiveCollectionController.ts +152 -0
  358. package/src/storyRepository/observers/getGlobalStoryTargets/GlobalStoryPageController.ts +73 -0
  359. package/src/storyRepository/observers/getGlobalStoryTargets/GlobalStoryQueryStreamController.ts +94 -0
  360. package/src/storyRepository/observers/getGlobalStoryTargets/getGlobalStoryTargets.ts +32 -0
  361. package/src/storyRepository/observers/getGlobalStoryTargets/index.ts +1 -0
  362. package/src/storyRepository/observers/getStoriesByTargetIds/StoryPaginationNoPageController.ts +0 -2
  363. package/src/storyRepository/observers/getStoriesByTargetIds/StoryQueryStreamController.ts +2 -2
  364. package/src/storyRepository/observers/index.ts +1 -0
  365. package/src/storyRepository/utils/StoryComputedValue.ts +136 -0
  366. package/src/storyRepository/utils/convertRawToStory.ts +11 -4
  367. package/src/storyRepository/utils/convertStoryPayloadToRaw.ts +23 -0
  368. package/src/subChannelRepository/api/markAsReadBySegment.ts +35 -0
  369. package/src/subChannelRepository/api/readingAPI.ts +2 -7
  370. package/src/subChannelRepository/api/startReadingAPI.ts +2 -7
  371. package/src/subChannelRepository/api/stopReadingAPI.ts +2 -7
  372. package/src/subChannelRepository/events/onSubChannelCreated.ts +7 -1
  373. package/src/subChannelRepository/events/onSubChannelDeleted.ts +10 -1
  374. package/src/subChannelRepository/events/onSubChannelFetched.ts +1 -1
  375. package/src/subChannelRepository/index.ts +1 -0
  376. package/src/subChannelRepository/observers/getSubChannel.ts +10 -8
  377. package/src/subChannelRepository/observers/getSubChannels/SubChannelLiveCollectionController.ts +9 -4
  378. package/src/subChannelRepository/utils/convertSubChannelFromRaw.ts +5 -2
  379. package/src/subChannelRepository/utils/{getSubChannelHasMentioned.ts → getSubChannelIsMentioned.ts} +19 -1
  380. package/src/subChannelRepository/utils/getSubChannelUnreadCount.ts +18 -0
  381. package/src/subChannelRepository/utils/markReadEngine.ts +2 -0
  382. package/src/subChannelRepository/utils/messageReceiptSync.ts +73 -0
  383. package/src/subChannelRepository/utils/persistOptimisticUnreadInfo.ts +23 -0
  384. package/src/utils/linkedObject/index.ts +2 -0
  385. package/src/utils/linkedObject/messageLinkedObject.ts +21 -0
  386. package/src/utils/linkedObject/storyLinkedObject.ts +2 -1
  387. package/src/utils/linkedObject/storyTargetLinkedObject.ts +26 -4
  388. package/src/utils/marker.ts +0 -6
  389. package/src/utils/tests/dummy/channel.ts +8 -0
  390. package/src/utils/tests/dummy/marker.ts +15 -1
  391. package/dist/channelRepository/utils/getChannelHasMentioned.d.ts +0 -7
  392. package/dist/channelRepository/utils/getChannelHasMentioned.d.ts.map +0 -1
  393. package/dist/channelRepository/utils/getChannelUnreadCount.d.ts +0 -2
  394. package/dist/channelRepository/utils/getChannelUnreadCount.d.ts.map +0 -1
  395. package/dist/storyRepository/utils/calculateHasUnseenFlag.d.ts +0 -6
  396. package/dist/storyRepository/utils/calculateHasUnseenFlag.d.ts.map +0 -1
  397. package/dist/subChannelRepository/utils/getSubChannelHasMentioned.d.ts +0 -2
  398. package/dist/subChannelRepository/utils/getSubChannelHasMentioned.d.ts.map +0 -1
  399. package/src/channelRepository/utils/getChannelHasMentioned.ts +0 -28
  400. package/src/channelRepository/utils/getChannelUnreadCount.ts +0 -27
  401. package/src/storyRepository/utils/calculateHasUnseenFlag.ts +0 -47
@@ -9,6 +9,9 @@ import {
9
9
  UNSYNCED_OBJECT_CACHED_AT_VALUE,
10
10
  } from '~/utils/constants';
11
11
 
12
+ import { isEqual } from '~/utils/isEqual';
13
+ import { convertGetterPropsToStatic } from '~/utils/object';
14
+
12
15
  /**
13
16
  *
14
17
  * ```js
@@ -27,7 +30,7 @@ import {
27
30
  * @category Message Live Object
28
31
  */
29
32
  export const getUserUnread = (
30
- callback: Amity.LiveObjectCallback<Amity.UserUnread>,
33
+ callback: Amity.LiveObjectCallback<Amity.UserUnread | undefined>,
31
34
  ): Amity.Unsubscriber => {
32
35
  const { _id: userId } = getActiveUser();
33
36
 
@@ -51,14 +54,25 @@ export const getUserUnread = (
51
54
 
52
55
  let isUnsyncedModel = false; // for messages
53
56
 
54
- const dispatcher = (data: Amity.LiveObject<Amity.UserMarker>) => {
55
- const userUnread = data.data;
57
+ let model: Omit<Amity.UserUnread, 'hasMentioned'> | undefined;
58
+
59
+ const dispatcher = (data: Amity.LiveObject<Amity.UserMarker | undefined>) => {
60
+ const { data: userUnread } = data;
61
+
62
+ const callbackModel = userUnread
63
+ ? {
64
+ unreadCount: userUnread.unreadCount,
65
+ isMentioned: userUnread.isMentioned,
66
+ }
67
+ : undefined;
68
+
69
+ model = callbackModel ? convertGetterPropsToStatic(callbackModel) : callbackModel;
56
70
 
57
71
  callback({
58
- data: {
59
- hasMentioned: userUnread.hasMentioned,
60
- unreadCount: userUnread.unreadCount,
61
- },
72
+ data: callbackModel
73
+ ? { ...callbackModel, hasMentioned: callbackModel.isMentioned }
74
+ : callbackModel,
75
+
62
76
  loading: data.loading,
63
77
  error: data.error,
64
78
  });
@@ -78,25 +92,36 @@ export const getUserUnread = (
78
92
  return currentMaxUserMarker;
79
93
  }, null as Amity.UserMarker | null);
80
94
 
95
+ const eventModel = {
96
+ unreadCount: latestUserMarker?.unreadCount ?? 0,
97
+ isMentioned: filterUserMarkers.some(userMarker => !!userMarker.isMentioned),
98
+ } as Amity.UserMarker;
99
+
100
+ if (isEqual(model, eventModel)) return;
101
+
81
102
  dispatcher({
82
103
  loading: false,
83
- data: {
84
- unreadCount: latestUserMarker?.unreadCount ?? 0,
85
- hasMentioned: filterUserMarkers.some(userMarker => !!userMarker.hasMentioned),
86
- } as Amity.UserMarker,
104
+ data: eventModel,
87
105
  });
88
106
  };
89
107
 
90
108
  function isAmityUserMarkerData(data: unknown): data is Amity.UserMarker {
109
+ /**
110
+ * The `data` return from runQuery is Amity.UserMarker | undefined.
111
+ * It's not located inside data field
112
+ */
91
113
  if (data == null) return false;
92
- return (data as { data: Amity.UserMarker })?.data != null;
114
+ return (data as { data: Amity.UserMarker }) != null;
93
115
  }
94
116
 
95
117
  const onFetch = () => {
96
118
  const query = createQuery(getUserMarker);
97
119
 
98
120
  runQuery(query, ({ error, data, loading, origin, cachedAt }) => {
99
- if (!isAmityUserMarkerData(data)) return;
121
+ if (!isAmityUserMarkerData(data)) {
122
+ dispatcher({ loading, data: undefined, origin, error });
123
+ return;
124
+ }
100
125
  if (cachedAt === UNSYNCED_OBJECT_CACHED_AT_VALUE) {
101
126
  dispatcher({
102
127
  data,
@@ -0,0 +1,259 @@
1
+ import { pullFromCache, pushToCache, queryCache } from '~/cache/api';
2
+ import { getActiveClient } from '../../api/activeClient';
3
+ import { markAsReadBySegment } from '~/subChannelRepository/api/markAsReadBySegment';
4
+ import { reCalculateChannelUnreadInfo } from '~/marker/utils/reCalculateChannelUnreadInfo';
5
+
6
+ export class MessageReadReceiptSyncEngine {
7
+ private client: Amity.Client;
8
+
9
+ private isActive = true;
10
+
11
+ private MAX_RETRY = 3;
12
+
13
+ private JOB_QUEUE_SIZE = 120;
14
+
15
+ private jobQueue: Amity.ReadReceiptSyncJob[] = [];
16
+
17
+ private timer: NodeJS.Timer | undefined;
18
+
19
+ // Interval for message read receipt sync in seconds
20
+ private RECEIPT_SYNC_INTERVAL = 1;
21
+
22
+ constructor() {
23
+ this.client = getActiveClient();
24
+ // Get remaining unsync read receipts from cache
25
+ this.getUnsyncJobs();
26
+ }
27
+
28
+ // Call this when client call client.login
29
+ startSyncReadReceipt() {
30
+ // Start timer when start receipt sync
31
+ this.timer = setInterval(() => {
32
+ this.syncReadReceipts();
33
+ }, this.RECEIPT_SYNC_INTERVAL * 1000);
34
+ }
35
+
36
+ // Read receipt observer handling
37
+ syncReadReceipts(): void {
38
+ if (this.jobQueue.length === 0 || this.isActive === false) return;
39
+
40
+ const readReceipt = this.getReadReceipt();
41
+ if (readReceipt) {
42
+ this.markReadApi(readReceipt);
43
+ }
44
+ }
45
+
46
+ private getUnsyncJobs(): void {
47
+ // Get all read receipts that has latestSyncSegment < latestSegment
48
+ const readReceipts = queryCache<Amity.ReadReceipt>(['readReceipt'])?.filter(({ data }) => {
49
+ return data.latestSyncSegment < data.latestSegment;
50
+ });
51
+
52
+ // Enqueue unsync read receipts to the job queue
53
+ readReceipts?.forEach(({ data: readReceipt }) => {
54
+ this.enqueueReadReceipt(readReceipt.subChannelId, readReceipt.latestSegment);
55
+ });
56
+ }
57
+
58
+ private getReadReceipt(): Amity.ReadReceiptSyncJob | undefined {
59
+ // Get first read receipt in queue
60
+ const syncJob = this.jobQueue[0];
61
+
62
+ if (!syncJob) return;
63
+ // Skip when it's syncing
64
+ if (syncJob.syncState === Amity.ReadReceiptSyncState.SYNCING) return;
65
+
66
+ // Get readReceipt from cache by subChannelId
67
+ const readReceipt = pullFromCache<Amity.ReadReceipt>([
68
+ 'readReceipt',
69
+ syncJob.subChannelId,
70
+ ])?.data;
71
+
72
+ if (!readReceipt) return;
73
+
74
+ if (readReceipt?.latestSegment > readReceipt?.latestSyncSegment) {
75
+ syncJob.segment = readReceipt.latestSegment;
76
+ return syncJob;
77
+ }
78
+ // Clear all synced job in job queue
79
+ this.removeSynedReceipt(readReceipt.subChannelId, readReceipt.latestSegment);
80
+
81
+ // Recursion getReadReceipt() until get unsync read receipt or job queue is empty
82
+ return this.getReadReceipt();
83
+ }
84
+
85
+ private async markReadApi(syncJob: Amity.ReadReceiptSyncJob): Promise<void> {
86
+ const newSyncJob = syncJob;
87
+ newSyncJob.syncState = Amity.ReadReceiptSyncState.SYNCING;
88
+
89
+ const { subChannelId, segment } = newSyncJob;
90
+
91
+ const response = await markAsReadBySegment({ subChannelId, readToSegment: segment });
92
+
93
+ if (response) {
94
+ this.removeSynedReceipt(syncJob.subChannelId, syncJob.segment);
95
+
96
+ const readReceiptCache = pullFromCache<Amity.ReadReceipt>([
97
+ 'readReceipt',
98
+ subChannelId,
99
+ ])?.data;
100
+
101
+ pushToCache(['readReceipt', subChannelId], {
102
+ ...readReceiptCache,
103
+ latestSyncSegment: segment,
104
+ });
105
+ } else if (!response) {
106
+ if (newSyncJob.retryCount > this.MAX_RETRY) {
107
+ this.removeJobFromQueue(newSyncJob);
108
+ } else {
109
+ newSyncJob.retryCount += 1;
110
+ newSyncJob.syncState = Amity.ReadReceiptSyncState.CREATED;
111
+ }
112
+ }
113
+ }
114
+
115
+ private removeSynedReceipt(subChannelId: string, segment: number) {
116
+ const syncJobs = this.jobQueue;
117
+
118
+ syncJobs.forEach(job => {
119
+ if (job.subChannelId === subChannelId && job.segment <= segment) {
120
+ this.removeJobFromQueue(job);
121
+ }
122
+ });
123
+ }
124
+
125
+ private startObservingReadReceiptQueue(): void {
126
+ if (this.client.isUnreadCountEnabled) {
127
+ this.isActive = true;
128
+ this.startSyncReadReceipt();
129
+ }
130
+ }
131
+
132
+ private stopObservingReadReceiptQueue(): void {
133
+ this.isActive = false;
134
+
135
+ const syncJobs = this.jobQueue;
136
+ syncJobs.map(job => {
137
+ if (job.syncState === Amity.ReadReceiptSyncState.SYNCING) {
138
+ return { ...job, syncState: Amity.ReadReceiptSyncState.CREATED };
139
+ }
140
+
141
+ return job;
142
+ });
143
+
144
+ if (this.timer) clearInterval(this.timer);
145
+ }
146
+
147
+ // Session Management
148
+ onSessionEstablished(): void {
149
+ this.startObservingReadReceiptQueue();
150
+ }
151
+
152
+ onSessionDestroyed(): void {
153
+ this.stopObservingReadReceiptQueue();
154
+ this.jobQueue = [];
155
+ }
156
+
157
+ onTokenExpired(): void {
158
+ this.stopObservingReadReceiptQueue();
159
+ }
160
+
161
+ // Network Connection Management
162
+ onNetworkOffline(): void {
163
+ // Stop observing to the read receipt queue.
164
+ this.stopObservingReadReceiptQueue();
165
+ }
166
+
167
+ onNetworkOnline(): void {
168
+ // Resume observing to the read receipt queue.
169
+ this.startObservingReadReceiptQueue();
170
+ }
171
+
172
+ markRead(subChannelId: string, segment: number): void {
173
+ // Step 1: Optimistic update of subChannelUnreadInfo.readToSegment to message.segment
174
+ const cacheKey = ['subChannelUnreadInfo', 'get', subChannelId];
175
+ const subChannelUnreadInfo = pullFromCache<Amity.SubChannelUnreadInfo>(cacheKey)?.data;
176
+
177
+ if (subChannelUnreadInfo && segment > subChannelUnreadInfo.readToSegment) {
178
+ subChannelUnreadInfo.readToSegment = segment;
179
+ subChannelUnreadInfo.unreadCount = Math.max(subChannelUnreadInfo.lastSegment - segment, 0);
180
+
181
+ reCalculateChannelUnreadInfo(subChannelUnreadInfo.channelId);
182
+ }
183
+
184
+ pushToCache(cacheKey, subChannelUnreadInfo);
185
+
186
+ // Step 2: Enqueue the read receipt
187
+ this.enqueueReadReceipt(subChannelId, segment);
188
+ }
189
+
190
+ private enqueueReadReceipt(subChannelId: string, segment: number): void {
191
+ const readReceipt = pullFromCache<Amity.ReadReceipt>(['readReceipt', subChannelId])?.data;
192
+
193
+ // Create new read receipt if it's not exists and add job to queue
194
+ if (!readReceipt) {
195
+ const readReceiptSubChannel: Amity.ReadReceipt = {
196
+ subChannelId,
197
+ latestSegment: segment,
198
+ latestSyncSegment: 0,
199
+ };
200
+
201
+ pushToCache(['readReceipt', subChannelId], readReceiptSubChannel);
202
+ } else if (readReceipt.latestSegment < segment) {
203
+ pushToCache(['readReceipt', subChannelId], { ...readReceipt, latestSegment: segment });
204
+ } else if (readReceipt.latestSyncSegment >= segment) {
205
+ // Skip the job when lastSyncSegment > = segment
206
+ return;
207
+ }
208
+
209
+ let syncJob: Amity.ReadReceiptSyncJob | null = this.getSyncJob(subChannelId);
210
+
211
+ if (syncJob === null || syncJob.syncState === Amity.ReadReceiptSyncState.SYNCING) {
212
+ syncJob = {
213
+ subChannelId,
214
+ segment,
215
+ syncState: Amity.ReadReceiptSyncState.CREATED,
216
+ retryCount: 0,
217
+ };
218
+
219
+ this.enqueueJob(syncJob);
220
+ } else if (syncJob.segment < segment) {
221
+ syncJob.segment = segment;
222
+ }
223
+ }
224
+
225
+ private getSyncJob(subChannelId: string): Amity.ReadReceiptSyncJob | null {
226
+ const syncJobs = this.jobQueue;
227
+
228
+ const targetJob = syncJobs.find(job => job.subChannelId === subChannelId);
229
+
230
+ return targetJob || null;
231
+ }
232
+
233
+ private enqueueJob(syncJob: Amity.ReadReceiptSyncJob) {
234
+ if (this.jobQueue.length < this.JOB_QUEUE_SIZE) {
235
+ this.jobQueue.push(syncJob);
236
+ } else {
237
+ // Remove oldest job when queue reach maximum capacity
238
+ this.jobQueue.shift();
239
+ this.jobQueue.push(syncJob);
240
+ }
241
+ }
242
+
243
+ private removeJobFromQueue(item: Amity.ReadReceiptSyncJob) {
244
+ const index = this.jobQueue.indexOf(item);
245
+ if (index > -1) {
246
+ this.jobQueue.splice(index, 1);
247
+ }
248
+ }
249
+ }
250
+
251
+ let instance: MessageReadReceiptSyncEngine | null = null;
252
+
253
+ export default {
254
+ getInstance: () => {
255
+ if (!instance) instance = new MessageReadReceiptSyncEngine();
256
+
257
+ return instance;
258
+ },
259
+ };
@@ -0,0 +1,21 @@
1
+ import { onSessionStateChange } from '~/client/events/onSessionStateChange';
2
+ import ReadReceiptSyncEngine from '~/client/utils/ReadReceiptSync/readReceiptSyncEngine';
3
+
4
+ export default () => {
5
+ const readReceiptSyncEngine = ReadReceiptSyncEngine.getInstance();
6
+ readReceiptSyncEngine.startSyncReadReceipt();
7
+
8
+ onSessionStateChange(state => {
9
+ if (state === Amity.SessionStates.ESTABLISHED) {
10
+ readReceiptSyncEngine.onSessionEstablished();
11
+ } else if (state === Amity.SessionStates.TOKEN_EXPIRED) {
12
+ readReceiptSyncEngine.onTokenExpired();
13
+ } else {
14
+ readReceiptSyncEngine.onSessionDestroyed();
15
+ }
16
+ });
17
+
18
+ return () => {
19
+ readReceiptSyncEngine.onSessionDestroyed();
20
+ };
21
+ };
@@ -6,14 +6,18 @@ import {
6
6
  } from '~/channelRepository/events';
7
7
  import { onUserMarkerSync } from '~/marker/events/onUserMarkerSync';
8
8
  import { setIntervalTask } from '~/utils/timer';
9
- import { getUserMarker } from '~/marker/api';
10
- import { onFeedMarkerUpdated } from '~/marker/events';
11
- import { onMessageCreatedMqtt } from '~/messageRepository/events';
12
- import { onSubChannelCreated, onSubChannelDeleted } from '~/subChannelRepository/events';
9
+ import { getUserMarker } from '~/marker/api/getUserMarker';
10
+ import { onFeedMarkerUpdated } from '~/marker/events/onFeedlMarkerUpdated';
11
+ import { onMessageCreatedMqtt } from '~/messageRepository/events/onMessageCreated';
12
+ import { onSubChannelCreated } from '~/subChannelRepository/events/onSubChannelCreated';
13
+ import { onSubChannelDeleted } from '~/subChannelRepository/events/onSubChannelDeleted';
13
14
  import { isUnreadCountSupport } from '~/subChannelRepository/utils';
14
15
 
15
- import { markerSync } from '../api';
16
+ import { markerSync } from '../api/markerSync';
17
+ import { enableUnreadCount } from '../api/enableUnreadCount';
18
+
16
19
  import { onOnline } from './onOnline';
20
+ import { onUserFeedMarkerUpdated } from '~/marker/events/onUserFeedMarkerUpdated';
17
21
 
18
22
  const SYNC_TRIGGER_INTERVAL_TIME = 2000;
19
23
  const ON_SUB_CHANNEL_DELETE_SYNC_TRIGGER_DELAY = 2000;
@@ -22,6 +26,7 @@ let isSyncRunning = false;
22
26
  let disposers: (() => void)[] = [];
23
27
  let isWaitingForResponse = false;
24
28
 
29
+ let isConsistentMode = true;
25
30
  let deviceLastSyncAt: Date | null = null;
26
31
 
27
32
  const getDeviceLastSyncAt = () => {
@@ -161,6 +166,7 @@ const registerEventListeners = () => {
161
166
  ),
162
167
  onFeedMarkerUpdated(() => events.push(Amity.MarkerSyncEvent.MARKER_UPDATED)),
163
168
  onUserMarkerSync(() => events.push(Amity.MarkerSyncEvent.MARKER_UPDATED)),
169
+ onUserFeedMarkerUpdated(() => events.push(Amity.MarkerSyncEvent.MARKER_UPDATED)),
164
170
  );
165
171
  };
166
172
 
@@ -169,6 +175,18 @@ const unRegisterEventListeners = () => {
169
175
  disposers = [];
170
176
  };
171
177
 
178
+ export const startMarkerSync = async () => {
179
+ await fetchDeviceLastSyncAt();
180
+ pushMarkerSyncEvent(Amity.MarkerSyncEvent.START_SYNCING);
181
+
182
+ isConsistentMode = true;
183
+ isSyncRunning = true;
184
+
185
+ registerEventListeners();
186
+
187
+ return unRegisterEventListeners;
188
+ };
189
+
172
190
  /**
173
191
  ```js
174
192
  * import { startUnreadSync } from '@amityco/ts-sdk'
@@ -183,7 +201,12 @@ const unRegisterEventListeners = () => {
183
201
  export const startUnreadSync = async () => {
184
202
  await fetchDeviceLastSyncAt();
185
203
  pushMarkerSyncEvent(Amity.MarkerSyncEvent.START_SYNCING);
204
+
205
+ enableUnreadCount();
206
+
207
+ isConsistentMode = false;
186
208
  isSyncRunning = true;
209
+
187
210
  registerEventListeners();
188
211
  };
189
212
 
@@ -217,3 +240,5 @@ setIntervalTask(async () => {
217
240
 
218
241
  await markerSyncTrigger();
219
242
  }, SYNC_TRIGGER_INTERVAL_TIME);
243
+
244
+ export const getMarkerSyncConsistentMode = () => isConsistentMode;
@@ -19,8 +19,6 @@ export const setClientToken = async (params: Parameters<typeof getToken>[0]) =>
19
19
  // begin establishing session
20
20
  setSessionState(Amity.SessionStates.ESTABLISHING);
21
21
 
22
- // @ts-ignore: in that particular case, typing can be
23
- // ignored since we enforce default values just before.
24
22
  const { accessToken, users, expiresAt, issuedAt, refreshToken } = await getToken(params);
25
23
 
26
24
  // manually setup the token for http transport
@@ -1,5 +1,6 @@
1
1
  import { getActiveUser } from '~/client/api/activeUser';
2
2
  import {
3
+ getMarkerUserFeedTopic,
3
4
  getNetworkTopic,
4
5
  getSmartFeedChannelTopic,
5
6
  getSmartFeedMessageTopic,
@@ -17,6 +18,7 @@ export const subscribeGlobalTopic = () => {
17
18
 
18
19
  // subscribing to user topic is necessary to handle ban event
19
20
  subscribeTopic(getUserTopic(getActiveUser())),
21
+ subscribeTopic(getMarkerUserFeedTopic()),
20
22
  ];
21
23
 
22
24
  return () => disposers.forEach(fn => fn());
@@ -7,6 +7,7 @@ import { getPost } from '~/postRepository/api/getPost';
7
7
  import { pushToTombstone } from '~/cache/api/pushToTombstone';
8
8
  import { scheduleTask } from '~/core/microtasks';
9
9
 
10
+ import { getStoryByStoryId } from '~/storyRepository/internalApi/getStoryByStoryId';
10
11
  import { getComment } from './getComment';
11
12
 
12
13
  /* begin_public_function
@@ -48,20 +49,36 @@ export const deleteComment = async (
48
49
  // to support hard deletion
49
50
  const deleted = { ...comment.data, isDeleted: true };
50
51
 
51
- const post = await getPost(comment.data.referenceId);
52
+ if (comment.data.referenceType === 'story') {
53
+ const story = await getStoryByStoryId(comment.data.referenceId);
52
54
 
53
- fireEvent('post.updated', {
54
- posts: [post.data],
55
- categories: [],
56
- comments: [],
57
- communities: [],
58
- communityUsers: [],
59
- feeds: [],
60
- files: [],
61
- postChildren: [],
62
- users: [],
63
- });
55
+ fireEvent('local.story.updated', {
56
+ stories: [story.data],
57
+ categories: [],
58
+ comments: [],
59
+ communities: [],
60
+ communityUsers: [],
61
+ files: [],
62
+ users: [],
63
+ });
64
+ } else {
65
+ const post = await getPost(comment.data.referenceId);
66
+
67
+ // @TODO: Need to separate Local / MQTT later
68
+ fireEvent('post.updated', {
69
+ posts: [post.data],
70
+ categories: [],
71
+ comments: [],
72
+ communities: [],
73
+ communityUsers: [],
74
+ feeds: [],
75
+ files: [],
76
+ postChildren: [],
77
+ users: [],
78
+ });
79
+ }
64
80
 
81
+ // @TODO: Need to separate Local / MQTT later
65
82
  fireEvent('comment.deleted', {
66
83
  comments: [deleted],
67
84
  commentChildren: [],
@@ -4,6 +4,7 @@ import { ingestInCache } from '~/cache/api/ingestInCache';
4
4
  import { getResolver } from '~/core/model';
5
5
 
6
6
  import { inferIsDeleted } from '~/utils/inferIsDeleted';
7
+ import { convertToInternalComment } from '../utils/convertToInternalComment';
7
8
 
8
9
  /**
9
10
  * ```js
@@ -52,12 +53,13 @@ export const queryComments = async (
52
53
  // API-FIX: backend should answer Amity.Response (2)
53
54
  // const { paging, comments } = unwrapPayload(data)
54
55
  const { paging, ...payload } = data;
55
- const { comments } = payload;
56
+ const processedData = convertToInternalComment(payload);
57
+ const { comments } = processedData;
56
58
 
57
59
  const cachedAt = client.cache && Date.now();
58
60
 
59
61
  if (client.cache) {
60
- ingestInCache(payload as Amity.CommentPayload, { cachedAt });
62
+ ingestInCache(processedData as Amity.CommentPayload, { cachedAt });
61
63
 
62
64
  const cacheKey = ['comment', 'query', { ...params, options: { limit } } as Amity.Serializable];
63
65
 
@@ -44,8 +44,7 @@ export const createCommentEventSubscriber = (
44
44
  }
45
45
 
46
46
  const queries = queryCache<Amity.InternalComment[]>(['comment', 'query'])?.filter(
47
- ({ key }) =>
48
- (key[2] as Amity.QueryComments)?.referenceId === comment.data.referenceId,
47
+ ({ key }) => (key[2] as Amity.QueryComments)?.referenceId === comment.data.referenceId,
49
48
  );
50
49
 
51
50
  queries?.map(({ key, data }) => upsertInCache(key, data as any, { cachedAt: -1 }));
@@ -2,8 +2,8 @@ import { getActiveClient } from '~/client/api';
2
2
  import { pushToCache } from '~/cache/api';
3
3
  import { ingestInCache } from '~/cache/api/ingestInCache';
4
4
  import { getResolver } from '~/core/model';
5
-
6
5
  import { inferIsDeleted } from '~/utils/inferIsDeleted';
6
+ import { convertToInternalComment } from '../utils/convertToInternalComment';
7
7
 
8
8
  export const queryComments = async (
9
9
  query: Amity.QueryComments,
@@ -38,12 +38,13 @@ export const queryComments = async (
38
38
  // API-FIX: backend should answer Amity.Response (2)
39
39
  // const { paging, comments } = unwrapPayload(data)
40
40
  const { paging, ...payload } = data;
41
- const { comments } = payload;
41
+ const processedData = convertToInternalComment(payload);
42
+ const { comments } = processedData;
42
43
 
43
44
  const cachedAt = client.cache && Date.now();
44
45
 
45
46
  if (client.cache) {
46
- ingestInCache(payload as Amity.CommentPayload, { cachedAt });
47
+ ingestInCache(processedData as Amity.CommentPayload, { cachedAt });
47
48
 
48
49
  const cacheKey = ['comment', 'query', { ...params, options: { limit } } as Amity.Serializable];
49
50
  pushToCache(cacheKey, { comments: comments.map(getResolver('comment')), paging });
@@ -0,0 +1,17 @@
1
+ export const convertToInternalComment = (commentPayload: Amity.CommentPayload) => {
2
+ const { comments } = commentPayload;
3
+
4
+ return {
5
+ ...commentPayload,
6
+ comments: comments.map(comment => {
7
+ if (comment.hasOwnProperty('myReactions')) return comment;
8
+
9
+ // Sometimes `myReactions` field will not come with BE response because that field is empty
10
+ // We need to put it with an empty array manually to make it show up in client side
11
+ return {
12
+ myReactions: [],
13
+ ...comment,
14
+ };
15
+ }),
16
+ };
17
+ };
@@ -23,6 +23,9 @@ const idResolvers: Resolvers = {
23
23
  messagePreviewChannel: ({ channelId }) => `${channelId}`,
24
24
  messagePreviewSubChannel: ({ subChannelId }) => `${subChannelId}`,
25
25
 
26
+ channelUnreadInfo: ({ channelId }) => channelId,
27
+ subChannelUnreadInfo: ({ subChannelId }) => subChannelId,
28
+
26
29
  channelMarker: ({ entityId, userId }) => `${entityId}#${userId}`,
27
30
  subChannelMarker: ({ entityId, feedId, userId }) => `${entityId}#${feedId}#${userId}`,
28
31
  messageMarker: ({ feedId, contentId, creatorId }) => `${feedId}#${contentId}#${creatorId}`,
@@ -20,6 +20,9 @@ export const PAYLOAD2MODEL: Record<string, Amity.Domain> = {
20
20
  messagePreviewChannel: 'messagePreviewChannel',
21
21
  messagePreviewSubChannel: 'messagePreviewSubChannel',
22
22
 
23
+ channelUnreadInfo: 'channelUnreadInfo',
24
+ subChannelUnreadInfo: 'subChannelUnreadInfo',
25
+
23
26
  userEntityMarkers: 'channelMarker',
24
27
  userFeedMarkers: 'subChannelMarker',
25
28
  contentMarkers: 'messageMarker',
@@ -45,6 +45,14 @@ export const sortByFirstCreated: SortingFunc<{ createdAt: Date | number | string
45
45
  { createdAt: b },
46
46
  ) => new Date(a).valueOf() - new Date(b).valueOf();
47
47
 
48
+ /**
49
+ * Sorting a story-collection by its localSortingDate
50
+ */
51
+ export const sortByLocalSortingDate: SortingFunc<{
52
+ localSortingDate: Date | number | string;
53
+ }> = ({ localSortingDate: a }, { localSortingDate: b }) =>
54
+ new Date(b).getTime() - new Date(a).getTime();
55
+
48
56
  /**
49
57
  * Sorting a collection by its newest items
50
58
  */
@@ -106,6 +106,12 @@ export const getMarkedMessageTopic = ({
106
106
  return `${getNetworkId(user)}/marker/channel/${channelId}/message/${subChannelId}`;
107
107
  };
108
108
 
109
+ export const getMarkerUserFeedTopic = () => {
110
+ const user = getActiveUser();
111
+
112
+ return `${getNetworkId(user)}/marker/user/${user._id}`;
113
+ };
114
+
109
115
  /**
110
116
  * @hidden
111
117
  *