@amityco/ts-sdk 7.3.1-e2dead4.0 → 7.4.1-0e170b02.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 (305) hide show
  1. package/dist/@types/core/events.d.ts +7 -0
  2. package/dist/@types/core/events.d.ts.map +1 -1
  3. package/dist/@types/core/model.d.ts +5 -1
  4. package/dist/@types/core/model.d.ts.map +1 -1
  5. package/dist/@types/core/payload.d.ts +38 -5
  6. package/dist/@types/core/payload.d.ts.map +1 -1
  7. package/dist/@types/domains/client.d.ts +10 -0
  8. package/dist/@types/domains/client.d.ts.map +1 -1
  9. package/dist/@types/domains/community.d.ts +37 -1
  10. package/dist/@types/domains/community.d.ts.map +1 -1
  11. package/dist/@types/domains/invitation.d.ts +88 -0
  12. package/dist/@types/domains/invitation.d.ts.map +1 -0
  13. package/dist/@types/domains/joinRequest.d.ts +53 -0
  14. package/dist/@types/domains/joinRequest.d.ts.map +1 -0
  15. package/dist/@types/index.d.ts +3 -0
  16. package/dist/@types/index.d.ts.map +1 -1
  17. package/dist/commentRepository/api/flagComment.d.ts +3 -2
  18. package/dist/commentRepository/api/flagComment.d.ts.map +1 -1
  19. package/dist/communityRepository/api/createCommunity.d.ts +2 -2
  20. package/dist/communityRepository/api/createCommunity.d.ts.map +1 -1
  21. package/dist/communityRepository/api/getCommunities.d.ts +1 -1
  22. package/dist/communityRepository/api/getCommunities.d.ts.map +1 -1
  23. package/dist/communityRepository/api/getCommunity.d.ts +1 -1
  24. package/dist/communityRepository/api/getCommunity.d.ts.map +1 -1
  25. package/dist/communityRepository/api/getRecommendedCommunities.d.ts +3 -1
  26. package/dist/communityRepository/api/getRecommendedCommunities.d.ts.map +1 -1
  27. package/dist/communityRepository/api/getTrendingCommunities.d.ts +3 -1
  28. package/dist/communityRepository/api/getTrendingCommunities.d.ts.map +1 -1
  29. package/dist/communityRepository/api/joinCommunity.d.ts +3 -0
  30. package/dist/communityRepository/api/joinCommunity.d.ts.map +1 -1
  31. package/dist/communityRepository/api/queryCommunities.d.ts.map +1 -1
  32. package/dist/communityRepository/api/updateCommunity.d.ts +2 -2
  33. package/dist/communityRepository/api/updateCommunity.d.ts.map +1 -1
  34. package/dist/communityRepository/communityMembership/events/onCommunityJoined.d.ts +1 -1
  35. package/dist/communityRepository/communityMembership/events/onCommunityJoined.d.ts.map +1 -1
  36. package/dist/communityRepository/communityMembership/events/onCommunityLeft.d.ts +1 -1
  37. package/dist/communityRepository/communityMembership/events/onCommunityLeft.d.ts.map +1 -1
  38. package/dist/communityRepository/communityMembership/events/onCommunityUserAdded.d.ts +1 -1
  39. package/dist/communityRepository/communityMembership/events/onCommunityUserAdded.d.ts.map +1 -1
  40. package/dist/communityRepository/communityMembership/events/onCommunityUserBanned.d.ts +1 -1
  41. package/dist/communityRepository/communityMembership/events/onCommunityUserBanned.d.ts.map +1 -1
  42. package/dist/communityRepository/communityMembership/events/onCommunityUserChanged.d.ts +1 -1
  43. package/dist/communityRepository/communityMembership/events/onCommunityUserChanged.d.ts.map +1 -1
  44. package/dist/communityRepository/communityMembership/events/onCommunityUserRemoved.d.ts +1 -1
  45. package/dist/communityRepository/communityMembership/events/onCommunityUserRemoved.d.ts.map +1 -1
  46. package/dist/communityRepository/communityMembership/events/onCommunityUserRoleAdded.d.ts +1 -1
  47. package/dist/communityRepository/communityMembership/events/onCommunityUserRoleAdded.d.ts.map +1 -1
  48. package/dist/communityRepository/communityMembership/events/onCommunityUserRoleRemoved.d.ts +1 -1
  49. package/dist/communityRepository/communityMembership/events/onCommunityUserRoleRemoved.d.ts.map +1 -1
  50. package/dist/communityRepository/communityMembership/events/onCommunityUserUnbanned.d.ts +1 -1
  51. package/dist/communityRepository/communityMembership/events/onCommunityUserUnbanned.d.ts.map +1 -1
  52. package/dist/communityRepository/communityMembership/events/onLocalCommunityJoined.d.ts +1 -1
  53. package/dist/communityRepository/communityMembership/events/onLocalCommunityJoined.d.ts.map +1 -1
  54. package/dist/communityRepository/communityMembership/events/onLocalCommunityLeft.d.ts +1 -1
  55. package/dist/communityRepository/communityMembership/events/onLocalCommunityLeft.d.ts.map +1 -1
  56. package/dist/communityRepository/communityMembership/events/onLocalCommunityUserAdded.d.ts +1 -1
  57. package/dist/communityRepository/communityMembership/events/onLocalCommunityUserAdded.d.ts.map +1 -1
  58. package/dist/communityRepository/communityMembership/events/onLocalCommunityUserRemoved.d.ts +1 -1
  59. package/dist/communityRepository/communityMembership/events/onLocalCommunityUserRemoved.d.ts.map +1 -1
  60. package/dist/communityRepository/communityMembership/events/onUserDeleted.d.ts +1 -1
  61. package/dist/communityRepository/communityMembership/events/onUserDeleted.d.ts.map +1 -1
  62. package/dist/communityRepository/communityMembership/events/utils.d.ts +2 -2
  63. package/dist/communityRepository/communityMembership/events/utils.d.ts.map +1 -1
  64. package/dist/communityRepository/communityMembership/observers/getMembers/CommunityMembersQueryStreamController.d.ts +2 -2
  65. package/dist/communityRepository/communityMembership/observers/getMembers/CommunityMembersQueryStreamController.d.ts.map +1 -1
  66. package/dist/communityRepository/communityMembership/observers/searchMembers/SearchCommunityMembersQueryStreamController.d.ts +2 -2
  67. package/dist/communityRepository/communityMembership/observers/searchMembers/SearchCommunityMembersQueryStreamController.d.ts.map +1 -1
  68. package/dist/communityRepository/communityModeration/events/onLocalCommunityRoleAdded.d.ts +1 -1
  69. package/dist/communityRepository/communityModeration/events/onLocalCommunityRoleAdded.d.ts.map +1 -1
  70. package/dist/communityRepository/communityModeration/events/onLocalCommunityRoleRemoved.d.ts +1 -1
  71. package/dist/communityRepository/communityModeration/events/onLocalCommunityRoleRemoved.d.ts.map +1 -1
  72. package/dist/communityRepository/events/onCommunityCreated.d.ts +1 -1
  73. package/dist/communityRepository/events/onCommunityCreated.d.ts.map +1 -1
  74. package/dist/communityRepository/events/onCommunityDeleted.d.ts +1 -1
  75. package/dist/communityRepository/events/onCommunityDeleted.d.ts.map +1 -1
  76. package/dist/communityRepository/events/onCommunityUpdated.d.ts +1 -1
  77. package/dist/communityRepository/events/onCommunityUpdated.d.ts.map +1 -1
  78. package/dist/communityRepository/events/utils.d.ts +1 -1
  79. package/dist/communityRepository/events/utils.d.ts.map +1 -1
  80. package/dist/communityRepository/internalAPI/getMyJoinRequest.d.ts +16 -0
  81. package/dist/communityRepository/internalAPI/getMyJoinRequest.d.ts.map +1 -0
  82. package/dist/communityRepository/internalAPI/joinCommunity.d.ts +16 -0
  83. package/dist/communityRepository/internalAPI/joinCommunity.d.ts.map +1 -0
  84. package/dist/communityRepository/joinRequest/events/index.d.ts +4 -0
  85. package/dist/communityRepository/joinRequest/events/index.d.ts.map +1 -0
  86. package/dist/communityRepository/joinRequest/events/onJoinRequestCreated.d.ts +17 -0
  87. package/dist/communityRepository/joinRequest/events/onJoinRequestCreated.d.ts.map +1 -0
  88. package/dist/communityRepository/joinRequest/events/onJoinRequestDeleted.d.ts +17 -0
  89. package/dist/communityRepository/joinRequest/events/onJoinRequestDeleted.d.ts.map +1 -0
  90. package/dist/communityRepository/joinRequest/events/onJoinRequestUpdated.d.ts +17 -0
  91. package/dist/communityRepository/joinRequest/events/onJoinRequestUpdated.d.ts.map +1 -0
  92. package/dist/communityRepository/joinRequest/internalAPI/approveJoinRequest.d.ts +16 -0
  93. package/dist/communityRepository/joinRequest/internalAPI/approveJoinRequest.d.ts.map +1 -0
  94. package/dist/communityRepository/joinRequest/internalAPI/cancelJoinRequest.d.ts +16 -0
  95. package/dist/communityRepository/joinRequest/internalAPI/cancelJoinRequest.d.ts.map +1 -0
  96. package/dist/communityRepository/joinRequest/internalAPI/rejectJoinRequest.d.ts +16 -0
  97. package/dist/communityRepository/joinRequest/internalAPI/rejectJoinRequest.d.ts.map +1 -0
  98. package/dist/communityRepository/observers/getCommunities/CommunitiesQueryStreamController.d.ts +2 -2
  99. package/dist/communityRepository/observers/getCommunities/CommunitiesQueryStreamController.d.ts.map +1 -1
  100. package/dist/communityRepository/observers/getJoinRequests/JoinRequestsLiveCollectionController.d.ts +14 -0
  101. package/dist/communityRepository/observers/getJoinRequests/JoinRequestsLiveCollectionController.d.ts.map +1 -0
  102. package/dist/communityRepository/observers/getJoinRequests/JoinRequestsPaginationController.d.ts +9 -0
  103. package/dist/communityRepository/observers/getJoinRequests/JoinRequestsPaginationController.d.ts.map +1 -0
  104. package/dist/communityRepository/observers/getJoinRequests/JoinRequestsQueryStreamController.d.ts +15 -0
  105. package/dist/communityRepository/observers/getJoinRequests/JoinRequestsQueryStreamController.d.ts.map +1 -0
  106. package/dist/communityRepository/observers/getJoinRequests/enum.d.ts +6 -0
  107. package/dist/communityRepository/observers/getJoinRequests/enum.d.ts.map +1 -0
  108. package/dist/communityRepository/observers/getJoinRequests.d.ts +12 -0
  109. package/dist/communityRepository/observers/getJoinRequests.d.ts.map +1 -0
  110. package/dist/communityRepository/observers/getRecommendedCommunities/RecommendedCommunitiesLiveCollectionController.d.ts.map +1 -1
  111. package/dist/communityRepository/observers/getRecommendedCommunities/RecommendedCommunitiesQueryStreamController.d.ts +2 -2
  112. package/dist/communityRepository/observers/getRecommendedCommunities/RecommendedCommunitiesQueryStreamController.d.ts.map +1 -1
  113. package/dist/communityRepository/observers/getTrendingCommunities/TrendingCommunitiesLiveCollectionController.d.ts.map +1 -1
  114. package/dist/communityRepository/observers/getTrendingCommunities/TrendingCommunitiesQueryStreamController.d.ts +2 -2
  115. package/dist/communityRepository/observers/getTrendingCommunities/TrendingCommunitiesQueryStreamController.d.ts.map +1 -1
  116. package/dist/communityRepository/observers/searchCommunities/SearchCommunitiesPaginationController.d.ts.map +1 -1
  117. package/dist/communityRepository/observers/searchCommunities/SearchCommunitiesQueryStreamController.d.ts +2 -2
  118. package/dist/communityRepository/observers/searchCommunities/SearchCommunitiesQueryStreamController.d.ts.map +1 -1
  119. package/dist/communityRepository/observers/semanticSearch/SemanticSearchCommunityQueryStreamController.d.ts +2 -2
  120. package/dist/communityRepository/observers/semanticSearch/SemanticSearchCommunityQueryStreamController.d.ts.map +1 -1
  121. package/dist/communityRepository/utils/communityWithMembership.d.ts +1 -1
  122. package/dist/communityRepository/utils/communityWithMembership.d.ts.map +1 -1
  123. package/dist/communityRepository/utils/payload.d.ts +2 -1
  124. package/dist/communityRepository/utils/payload.d.ts.map +1 -1
  125. package/dist/core/events.d.ts +3 -3
  126. package/dist/core/events.d.ts.map +1 -1
  127. package/dist/core/model/idResolvers.d.ts.map +1 -1
  128. package/dist/core/model/index.d.ts.map +1 -1
  129. package/dist/index.cjs.js +2686 -1421
  130. package/dist/index.d.ts +1 -0
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.esm.js +2948 -1684
  133. package/dist/index.umd.js +4 -4
  134. package/dist/invitationRepository/events/index.d.ts +4 -0
  135. package/dist/invitationRepository/events/index.d.ts.map +1 -0
  136. package/dist/invitationRepository/events/onLocalInvitationCreated.d.ts +17 -0
  137. package/dist/invitationRepository/events/onLocalInvitationCreated.d.ts.map +1 -0
  138. package/dist/invitationRepository/events/onLocalInvitationDeleted.d.ts +17 -0
  139. package/dist/invitationRepository/events/onLocalInvitationDeleted.d.ts.map +1 -0
  140. package/dist/invitationRepository/events/onLocalInvitationUpdated.d.ts +17 -0
  141. package/dist/invitationRepository/events/onLocalInvitationUpdated.d.ts.map +1 -0
  142. package/dist/invitationRepository/index.d.ts +3 -0
  143. package/dist/invitationRepository/index.d.ts.map +1 -0
  144. package/dist/invitationRepository/internalApi/acceptInvitation.d.ts +16 -0
  145. package/dist/invitationRepository/internalApi/acceptInvitation.d.ts.map +1 -0
  146. package/dist/invitationRepository/internalApi/cancelInvitation.d.ts +16 -0
  147. package/dist/invitationRepository/internalApi/cancelInvitation.d.ts.map +1 -0
  148. package/dist/invitationRepository/internalApi/createInvitations.d.ts +21 -0
  149. package/dist/invitationRepository/internalApi/createInvitations.d.ts.map +1 -0
  150. package/dist/invitationRepository/internalApi/getInvitation.d.ts +17 -0
  151. package/dist/invitationRepository/internalApi/getInvitation.d.ts.map +1 -0
  152. package/dist/invitationRepository/internalApi/index.d.ts +5 -0
  153. package/dist/invitationRepository/internalApi/index.d.ts.map +1 -0
  154. package/dist/invitationRepository/internalApi/rejectInvitation.d.ts +16 -0
  155. package/dist/invitationRepository/internalApi/rejectInvitation.d.ts.map +1 -0
  156. package/dist/invitationRepository/observers/getInvitations/InvitationsLiveCollectionController.d.ts +14 -0
  157. package/dist/invitationRepository/observers/getInvitations/InvitationsLiveCollectionController.d.ts.map +1 -0
  158. package/dist/invitationRepository/observers/getInvitations/InvitationsPaginationController.d.ts +5 -0
  159. package/dist/invitationRepository/observers/getInvitations/InvitationsPaginationController.d.ts.map +1 -0
  160. package/dist/invitationRepository/observers/getInvitations/InvitationsQueryStreamController.d.ts +15 -0
  161. package/dist/invitationRepository/observers/getInvitations/InvitationsQueryStreamController.d.ts.map +1 -0
  162. package/dist/invitationRepository/observers/getInvitations/enums.d.ts +6 -0
  163. package/dist/invitationRepository/observers/getInvitations/enums.d.ts.map +1 -0
  164. package/dist/invitationRepository/observers/getInvitations.d.ts +12 -0
  165. package/dist/invitationRepository/observers/getInvitations.d.ts.map +1 -0
  166. package/dist/invitationRepository/observers/getMyCommunityInvitations.d.ts +12 -0
  167. package/dist/invitationRepository/observers/getMyCommunityInvitations.d.ts.map +1 -0
  168. package/dist/invitationRepository/observers/getMyInvitations/MyInvitationsLiveCollectionController.d.ts +14 -0
  169. package/dist/invitationRepository/observers/getMyInvitations/MyInvitationsLiveCollectionController.d.ts.map +1 -0
  170. package/dist/invitationRepository/observers/getMyInvitations/MyInvitationsPaginationController.d.ts +5 -0
  171. package/dist/invitationRepository/observers/getMyInvitations/MyInvitationsPaginationController.d.ts.map +1 -0
  172. package/dist/invitationRepository/observers/getMyInvitations/MyInvitationsQueryStreamController.d.ts +15 -0
  173. package/dist/invitationRepository/observers/getMyInvitations/MyInvitationsQueryStreamController.d.ts.map +1 -0
  174. package/dist/invitationRepository/observers/index.d.ts +2 -0
  175. package/dist/invitationRepository/observers/index.d.ts.map +1 -0
  176. package/dist/invitationRepository/utils/convertRawInvitationToInternalInvitation.d.ts +2 -0
  177. package/dist/invitationRepository/utils/convertRawInvitationToInternalInvitation.d.ts.map +1 -0
  178. package/dist/invitationRepository/utils/index.d.ts +2 -0
  179. package/dist/invitationRepository/utils/index.d.ts.map +1 -0
  180. package/dist/invitationRepository/utils/prepareInvitationPayload.d.ts +2 -0
  181. package/dist/invitationRepository/utils/prepareInvitationPayload.d.ts.map +1 -0
  182. package/dist/invitationRepository/utils/prepareMyInvitationsPayload.d.ts +2 -0
  183. package/dist/invitationRepository/utils/prepareMyInvitationsPayload.d.ts.map +1 -0
  184. package/dist/messageRepository/api/flagMessage.d.ts +1 -1
  185. package/dist/messageRepository/api/flagMessage.d.ts.map +1 -1
  186. package/dist/postRepository/api/flagPost.d.ts +3 -2
  187. package/dist/postRepository/api/flagPost.d.ts.map +1 -1
  188. package/dist/postRepository/observers/getGlobalPinnedPosts/GlobalPinnedPostQueryStreamController.d.ts.map +1 -1
  189. package/dist/postRepository/observers/getPinnedPosts/PinnedPostQueryStreamController.d.ts.map +1 -1
  190. package/dist/subChannelRepository/utils/prepareSubChannelPayload.d.ts.map +1 -1
  191. package/dist/utils/linkedObject/communityLinkedObject.d.ts +2 -0
  192. package/dist/utils/linkedObject/communityLinkedObject.d.ts.map +1 -0
  193. package/dist/utils/linkedObject/index.d.ts +3 -0
  194. package/dist/utils/linkedObject/index.d.ts.map +1 -1
  195. package/dist/utils/linkedObject/invitationLinkedObject.d.ts +2 -0
  196. package/dist/utils/linkedObject/invitationLinkedObject.d.ts.map +1 -0
  197. package/dist/utils/linkedObject/joinRequestLinkedObject.d.ts +2 -0
  198. package/dist/utils/linkedObject/joinRequestLinkedObject.d.ts.map +1 -0
  199. package/dist/utils/tests/dummy/comment.d.ts +1 -1
  200. package/dist/utils/tests/dummy/post.d.ts +3 -3
  201. package/package.json +1 -1
  202. package/src/@types/core/events.ts +11 -1
  203. package/src/@types/core/model.ts +8 -1
  204. package/src/@types/core/payload.ts +48 -5
  205. package/src/@types/domains/client.ts +12 -0
  206. package/src/@types/domains/community.ts +56 -1
  207. package/src/@types/domains/invitation.ts +116 -0
  208. package/src/@types/domains/joinRequest.ts +66 -0
  209. package/src/@types/index.ts +3 -0
  210. package/src/commentRepository/api/flagComment.ts +20 -3
  211. package/src/communityRepository/api/createCommunity.ts +5 -2
  212. package/src/communityRepository/api/getCommunities.ts +7 -2
  213. package/src/communityRepository/api/getCommunity.ts +13 -2
  214. package/src/communityRepository/api/getRecommendedCommunities.ts +11 -4
  215. package/src/communityRepository/api/getTrendingCommunities.ts +11 -4
  216. package/src/communityRepository/api/joinCommunity.ts +4 -1
  217. package/src/communityRepository/api/queryCommunities.ts +6 -1
  218. package/src/communityRepository/api/updateCommunity.ts +13 -3
  219. package/src/communityRepository/communityMembership/events/onCommunityJoined.ts +1 -1
  220. package/src/communityRepository/communityMembership/events/onCommunityLeft.ts +1 -1
  221. package/src/communityRepository/communityMembership/events/onCommunityUserAdded.ts +1 -1
  222. package/src/communityRepository/communityMembership/events/onCommunityUserBanned.ts +1 -1
  223. package/src/communityRepository/communityMembership/events/onCommunityUserChanged.ts +1 -1
  224. package/src/communityRepository/communityMembership/events/onCommunityUserRemoved.ts +1 -1
  225. package/src/communityRepository/communityMembership/events/onCommunityUserRoleAdded.ts +1 -1
  226. package/src/communityRepository/communityMembership/events/onCommunityUserRoleRemoved.ts +1 -1
  227. package/src/communityRepository/communityMembership/events/onCommunityUserUnbanned.ts +1 -1
  228. package/src/communityRepository/communityMembership/events/onLocalCommunityJoined.ts +1 -1
  229. package/src/communityRepository/communityMembership/events/onLocalCommunityLeft.ts +1 -1
  230. package/src/communityRepository/communityMembership/events/onLocalCommunityUserAdded.ts +1 -1
  231. package/src/communityRepository/communityMembership/events/onLocalCommunityUserRemoved.ts +1 -1
  232. package/src/communityRepository/communityMembership/events/onUserDeleted.ts +3 -1
  233. package/src/communityRepository/communityMembership/events/utils.ts +2 -2
  234. package/src/communityRepository/communityMembership/observers/getMembers/CommunityMembersQueryStreamController.ts +8 -2
  235. package/src/communityRepository/communityMembership/observers/searchMembers/SearchCommunityMembersQueryStreamController.ts +8 -2
  236. package/src/communityRepository/communityModeration/events/onLocalCommunityRoleAdded.ts +1 -1
  237. package/src/communityRepository/communityModeration/events/onLocalCommunityRoleRemoved.ts +1 -1
  238. package/src/communityRepository/events/onCommunityCreated.ts +1 -1
  239. package/src/communityRepository/events/onCommunityDeleted.ts +1 -1
  240. package/src/communityRepository/events/onCommunityUpdated.ts +1 -1
  241. package/src/communityRepository/events/utils.ts +1 -1
  242. package/src/communityRepository/internalAPI/getMyJoinRequest.ts +43 -0
  243. package/src/communityRepository/internalAPI/joinCommunity.ts +49 -0
  244. package/src/communityRepository/joinRequest/events/index.ts +3 -0
  245. package/src/communityRepository/joinRequest/events/onJoinRequestCreated.ts +33 -0
  246. package/src/communityRepository/joinRequest/events/onJoinRequestDeleted.ts +33 -0
  247. package/src/communityRepository/joinRequest/events/onJoinRequestUpdated.ts +33 -0
  248. package/src/communityRepository/joinRequest/internalAPI/approveJoinRequest.ts +56 -0
  249. package/src/communityRepository/joinRequest/internalAPI/cancelJoinRequest.ts +51 -0
  250. package/src/communityRepository/joinRequest/internalAPI/rejectJoinRequest.ts +49 -0
  251. package/src/communityRepository/observers/getCommunities/CommunitiesQueryStreamController.ts +2 -2
  252. package/src/communityRepository/observers/getJoinRequests/JoinRequestsLiveCollectionController.ts +126 -0
  253. package/src/communityRepository/observers/getJoinRequests/JoinRequestsPaginationController.ts +26 -0
  254. package/src/communityRepository/observers/getJoinRequests/JoinRequestsQueryStreamController.ts +108 -0
  255. package/src/communityRepository/observers/getJoinRequests/enum.ts +5 -0
  256. package/src/communityRepository/observers/getJoinRequests.ts +44 -0
  257. package/src/communityRepository/observers/getRecommendedCommunities/RecommendedCommunitiesLiveCollectionController.ts +2 -1
  258. package/src/communityRepository/observers/getRecommendedCommunities/RecommendedCommunitiesQueryStreamController.ts +2 -2
  259. package/src/communityRepository/observers/getTrendingCommunities/TrendingCommunitiesLiveCollectionController.ts +2 -1
  260. package/src/communityRepository/observers/getTrendingCommunities/TrendingCommunitiesQueryStreamController.ts +2 -2
  261. package/src/communityRepository/observers/searchCommunities/SearchCommunitiesPaginationController.ts +1 -0
  262. package/src/communityRepository/observers/searchCommunities/SearchCommunitiesQueryStreamController.ts +2 -2
  263. package/src/communityRepository/observers/semanticSearch/SemanticSearchCommunityQueryStreamController.ts +2 -2
  264. package/src/communityRepository/utils/communityWithMembership.ts +9 -5
  265. package/src/communityRepository/utils/payload.ts +28 -2
  266. package/src/core/liveCollection/PaginationController.ts +1 -1
  267. package/src/core/liveCollection/PaginationNoPageController.ts +1 -1
  268. package/src/core/model/idResolvers.ts +3 -0
  269. package/src/core/model/index.ts +2 -0
  270. package/src/index.ts +2 -0
  271. package/src/invitationRepository/events/index.ts +3 -0
  272. package/src/invitationRepository/events/onLocalInvitationCreated.ts +33 -0
  273. package/src/invitationRepository/events/onLocalInvitationDeleted.ts +33 -0
  274. package/src/invitationRepository/events/onLocalInvitationUpdated.ts +33 -0
  275. package/src/invitationRepository/index.ts +2 -0
  276. package/src/invitationRepository/internalApi/acceptInvitation.ts +45 -0
  277. package/src/invitationRepository/internalApi/cancelInvitation.ts +44 -0
  278. package/src/invitationRepository/internalApi/createInvitations.ts +52 -0
  279. package/src/invitationRepository/internalApi/getInvitation.ts +47 -0
  280. package/src/invitationRepository/internalApi/index.ts +4 -0
  281. package/src/invitationRepository/internalApi/rejectInvitation.ts +45 -0
  282. package/src/invitationRepository/observers/getInvitations/InvitationsLiveCollectionController.ts +148 -0
  283. package/src/invitationRepository/observers/getInvitations/InvitationsPaginationController.ts +19 -0
  284. package/src/invitationRepository/observers/getInvitations/InvitationsQueryStreamController.ts +97 -0
  285. package/src/invitationRepository/observers/getInvitations/enums.ts +5 -0
  286. package/src/invitationRepository/observers/getInvitations.ts +44 -0
  287. package/src/invitationRepository/observers/getMyCommunityInvitations.ts +48 -0
  288. package/src/invitationRepository/observers/getMyInvitations/MyInvitationsLiveCollectionController.ts +148 -0
  289. package/src/invitationRepository/observers/getMyInvitations/MyInvitationsPaginationController.ts +22 -0
  290. package/src/invitationRepository/observers/getMyInvitations/MyInvitationsQueryStreamController.ts +105 -0
  291. package/src/invitationRepository/observers/index.ts +1 -0
  292. package/src/invitationRepository/utils/convertRawInvitationToInternalInvitation.ts +8 -0
  293. package/src/invitationRepository/utils/index.ts +1 -0
  294. package/src/invitationRepository/utils/prepareInvitationPayload.ts +12 -0
  295. package/src/invitationRepository/utils/prepareMyInvitationsPayload.ts +12 -0
  296. package/src/messagePreview/utils/getChannelMessagePreviewWithUser.ts +3 -3
  297. package/src/messageRepository/api/flagMessage.ts +7 -5
  298. package/src/postRepository/api/flagPost.ts +19 -3
  299. package/src/postRepository/observers/getGlobalPinnedPosts/GlobalPinnedPostQueryStreamController.ts +7 -1
  300. package/src/postRepository/observers/getPinnedPosts/PinnedPostQueryStreamController.ts +7 -1
  301. package/src/subChannelRepository/utils/prepareSubChannelPayload.ts +4 -0
  302. package/src/utils/linkedObject/communityLinkedObject.ts +58 -0
  303. package/src/utils/linkedObject/index.ts +6 -0
  304. package/src/utils/linkedObject/invitationLinkedObject.ts +44 -0
  305. package/src/utils/linkedObject/joinRequestLinkedObject.ts +27 -0
package/dist/index.cjs.js CHANGED
@@ -23,6 +23,12 @@ var uuid__default = /*#__PURE__*/_interopDefaultLegacy(uuid$1);
23
23
  var hash__default = /*#__PURE__*/_interopDefaultLegacy(hash);
24
24
  var Hls__default = /*#__PURE__*/_interopDefaultLegacy(Hls);
25
25
 
26
+ exports.MembershipAcceptanceTypeEnum = void 0;
27
+ (function (MembershipAcceptanceTypeEnum) {
28
+ MembershipAcceptanceTypeEnum["AUTOMATIC"] = "automatic";
29
+ MembershipAcceptanceTypeEnum["INVITATION"] = "invitation";
30
+ })(exports.MembershipAcceptanceTypeEnum || (exports.MembershipAcceptanceTypeEnum = {}));
31
+
26
32
  const FileType = Object.freeze({
27
33
  FILE: 'file',
28
34
  IMAGE: 'image',
@@ -112,10 +118,41 @@ const PostContentType = Object.freeze({
112
118
  POLL: 'poll',
113
119
  });
114
120
 
121
+ exports.InvitationTypeEnum = void 0;
122
+ (function (InvitationTypeEnum) {
123
+ InvitationTypeEnum["CommunityMemberInvite"] = "communityMemberInvite";
124
+ InvitationTypeEnum["LivestreamInvite"] = "livestreamInvite";
125
+ })(exports.InvitationTypeEnum || (exports.InvitationTypeEnum = {}));
126
+ exports.InvitationStatusEnum = void 0;
127
+ (function (InvitationStatusEnum) {
128
+ InvitationStatusEnum["Pending"] = "pending";
129
+ InvitationStatusEnum["Approved"] = "approved";
130
+ InvitationStatusEnum["Rejected"] = "rejected";
131
+ InvitationStatusEnum["Cancelled"] = "cancelled";
132
+ })(exports.InvitationStatusEnum || (exports.InvitationStatusEnum = {}));
133
+ exports.InvitationSortByEnum = void 0;
134
+ (function (InvitationSortByEnum) {
135
+ InvitationSortByEnum["FirstCreated"] = "firstCreated";
136
+ InvitationSortByEnum["LastCreated"] = "lastCreated";
137
+ })(exports.InvitationSortByEnum || (exports.InvitationSortByEnum = {}));
138
+
139
+ exports.JoinRequestStatusEnum = void 0;
140
+ (function (JoinRequestStatusEnum) {
141
+ JoinRequestStatusEnum["Pending"] = "pending";
142
+ JoinRequestStatusEnum["Approved"] = "approved";
143
+ JoinRequestStatusEnum["Rejected"] = "rejected";
144
+ JoinRequestStatusEnum["Cancelled"] = "cancelled";
145
+ })(exports.JoinRequestStatusEnum || (exports.JoinRequestStatusEnum = {}));
146
+ exports.JoinResultStatusEnum = void 0;
147
+ (function (JoinResultStatusEnum) {
148
+ JoinResultStatusEnum["Success"] = "success";
149
+ JoinResultStatusEnum["Pending"] = "pending";
150
+ })(exports.JoinResultStatusEnum || (exports.JoinResultStatusEnum = {}));
151
+
115
152
  function getVersion() {
116
153
  try {
117
- // the string ''v7.3.0-cjs'' should be replaced by actual value by @rollup/plugin-replace
118
- return 'v7.3.0-cjs';
154
+ // the string ''v7.4.0-cjs'' should be replaced by actual value by @rollup/plugin-replace
155
+ return 'v7.4.0-cjs';
119
156
  }
120
157
  catch (error) {
121
158
  return '__dev__';
@@ -558,6 +595,8 @@ const idResolvers = {
558
595
  pinTarget: ({ targetId }) => targetId,
559
596
  notificationTrayItem: ({ _id }) => _id,
560
597
  notificationTraySeen: ({ userId }) => userId,
598
+ invitation: ({ _id }) => _id,
599
+ joinRequest: ({ joinRequestId }) => joinRequestId,
561
600
  };
562
601
  /**
563
602
  * Retrieve the id resolver matching a domain name
@@ -610,6 +649,7 @@ const PAYLOAD2MODEL = {
610
649
  pinTargets: 'pinTarget',
611
650
  pins: 'pin',
612
651
  notificationTrayItems: 'notificationTrayItem',
652
+ invitations: 'invitation',
613
653
  };
614
654
  /** hidden */
615
655
  const isOutdated = (prevData, nextData) => {
@@ -4877,122 +4917,1219 @@ const getChannelMessagePreview = (channelId) => {
4877
4917
  return ((_b = (_a = pullFromCache(['messagePreviewChannel', 'get', channelId])) === null || _a === void 0 ? void 0 : _a.data) !== null && _b !== void 0 ? _b : null);
4878
4918
  };
4879
4919
 
4880
- const ANALYTIC_CACHE_KEY = ['analytic', 'normal-priority'];
4881
- const HIGH_PRIORITY_ANALYTIC_CACHE_KEY = ['analytic', 'high-priority'];
4920
+ const userLinkedObject = (user) => {
4921
+ return Object.assign(Object.assign({}, user), { get avatar() {
4922
+ var _a;
4923
+ if (!user.avatarFileId)
4924
+ return undefined;
4925
+ const avatar = (_a = pullFromCache([
4926
+ 'file',
4927
+ 'get',
4928
+ `${user.avatarFileId}`,
4929
+ ])) === null || _a === void 0 ? void 0 : _a.data;
4930
+ return avatar;
4931
+ } });
4932
+ };
4882
4933
 
4883
- const syncEvent = async (events) => {
4884
- const client = getActiveClient();
4885
- const params = {
4886
- activities: events,
4934
+ const getChannelMessagePreviewWithUser = (channel) => {
4935
+ var _a;
4936
+ const messagePreview = channel.messagePreviewId
4937
+ ? getChannelMessagePreview(channel.channelId)
4938
+ : null;
4939
+ const internalUser = (_a = pullFromCache([
4940
+ 'user',
4941
+ 'get',
4942
+ messagePreview === null || messagePreview === void 0 ? void 0 : messagePreview.creatorId,
4943
+ ])) === null || _a === void 0 ? void 0 : _a.data;
4944
+ const messagePreviewWithUser = messagePreview
4945
+ ? Object.assign(Object.assign({}, messagePreview), { user: internalUser ? userLinkedObject(internalUser) : undefined }) : null;
4946
+ return Object.assign(Object.assign({}, channel), { messagePreview: messagePreviewWithUser });
4947
+ };
4948
+
4949
+ const updateChannelMessagePreviewCache = (rawPayload) => {
4950
+ var _a, _b;
4951
+ const withMessageFeedInfo = (messagePreview) => {
4952
+ var _a;
4953
+ const messageFeedInfo = (_a = rawPayload.messageFeedsInfo) === null || _a === void 0 ? void 0 : _a.find(messageFeed => {
4954
+ return messageFeed.messageFeedId === messagePreview.messageFeedId;
4955
+ });
4956
+ const { channelPublicId: channelId, messageFeedId: subChannelId, data, dataType, isDeleted, segment, creatorPublicId: creatorId, createdAt, updatedAt, } = messagePreview;
4957
+ return {
4958
+ channelId,
4959
+ subChannelId,
4960
+ data,
4961
+ dataType,
4962
+ isDeleted,
4963
+ segment,
4964
+ creatorId,
4965
+ createdAt,
4966
+ updatedAt,
4967
+ subChannelName: messageFeedInfo === null || messageFeedInfo === void 0 ? void 0 : messageFeedInfo.name,
4968
+ messagePreviewId: messageFeedInfo === null || messageFeedInfo === void 0 ? void 0 : messageFeedInfo.messagePreviewId,
4969
+ subChannelUpdatedAt: messageFeedInfo === null || messageFeedInfo === void 0 ? void 0 : messageFeedInfo.updatedAt,
4970
+ };
4887
4971
  };
4888
- await client.http.post('/api/v1/analytics/activities', params);
4972
+ const newData = {
4973
+ messagePreviewChannel: (_b = (_a = rawPayload.messagePreviews) === null || _a === void 0 ? void 0 : _a.map(messagePreview => withMessageFeedInfo(messagePreview))) !== null && _b !== void 0 ? _b : [],
4974
+ };
4975
+ ingestInCache(newData);
4889
4976
  };
4890
4977
 
4891
- class AnalyticsEventSyncer {
4892
- constructor() {
4893
- this._timer = undefined;
4894
- this._high_priority_timer = undefined;
4895
- }
4896
- start() {
4897
- this.syncCapturedEvent();
4898
- this._timer = setInterval(() => {
4899
- this.syncCapturedEvent();
4900
- }, 1 * MINUTE);
4901
- this._high_priority_timer = setInterval(() => {
4902
- this.syncHighPriorityCapturedEvent();
4903
- }, 10 * SECOND$1);
4904
- }
4905
- stop() {
4906
- if (this._timer) {
4907
- clearInterval(this._timer);
4908
- this._timer = undefined;
4909
- }
4910
- if (this._high_priority_timer) {
4911
- clearInterval(this._high_priority_timer);
4912
- this._high_priority_timer = undefined;
4913
- }
4914
- }
4915
- async syncCapturedEvent() {
4916
- try {
4917
- // Must query only objects that have same userId with current logged-in user.
4918
- // Query captured event with maximum of 1000
4919
- // Order by latest first
4920
- // e.g., If there are 2000 events we will query 1000-2000 first
4921
- const cache = pullFromCache(ANALYTIC_CACHE_KEY);
4922
- if (!(cache === null || cache === void 0 ? void 0 : cache.data))
4923
- return;
4924
- if (cache.data.event.length === 0)
4925
- return;
4926
- const capturedEvents = cache.data.event;
4927
- await syncEvent(capturedEvents);
4928
- dropFromCache(ANALYTIC_CACHE_KEY);
4929
- }
4930
- catch (error) {
4931
- // stop and destroy all events
4932
- this.stop();
4933
- dropFromCache(ANALYTIC_CACHE_KEY);
4934
- }
4935
- }
4936
- async syncHighPriorityCapturedEvent() {
4937
- try {
4938
- // Must query only objects that have same userId with current logged-in user.
4939
- // Query captured event with maximum of 1000
4940
- // Order by latest first
4941
- // e.g., If there are 2000 events we will query 1000-2000 first
4942
- const cache = pullFromCache(HIGH_PRIORITY_ANALYTIC_CACHE_KEY);
4943
- if (!(cache === null || cache === void 0 ? void 0 : cache.data))
4944
- return;
4945
- if (cache.data.event.length === 0)
4946
- return;
4947
- const capturedEvents = cache.data.event;
4948
- await syncEvent(capturedEvents);
4949
- dropFromCache(HIGH_PRIORITY_ANALYTIC_CACHE_KEY);
4950
- }
4951
- catch (error) {
4952
- // stop and destroy all events
4953
- this.stop();
4954
- dropFromCache(HIGH_PRIORITY_ANALYTIC_CACHE_KEY);
4955
- }
4956
- }
4978
+ const getSubChannelMessagePreview = (subChannelId) => {
4979
+ var _a, _b;
4980
+ return ((_b = (_a = pullFromCache(['messagePreviewSubChannel', 'get', subChannelId])) === null || _a === void 0 ? void 0 : _a.data) !== null && _b !== void 0 ? _b : null);
4981
+ };
4982
+
4983
+ const getSubChannelMessagePreviewWithUser = (subChannel) => {
4984
+ var _a;
4985
+ const messagePreview = subChannel.messagePreviewId
4986
+ ? getSubChannelMessagePreview(subChannel.subChannelId)
4987
+ : null;
4988
+ const messagePreviewWithUser = messagePreview
4989
+ ? Object.assign(Object.assign({}, messagePreview), { user: (_a = pullFromCache(['user', 'get', messagePreview === null || messagePreview === void 0 ? void 0 : messagePreview.creatorId])) === null || _a === void 0 ? void 0 : _a.data }) : null;
4990
+ return Object.assign(Object.assign({}, subChannel), { messagePreview: messagePreviewWithUser });
4991
+ };
4992
+
4993
+ const updateSubChannelMessagePreviewCache = (rawPayload) => {
4994
+ var _a, _b;
4995
+ const withMessageFeedInfo = (messagePreview) => {
4996
+ var _a;
4997
+ const messageFeedInfo = (_a = rawPayload.messageFeeds) === null || _a === void 0 ? void 0 : _a.find(messageFeed => {
4998
+ return messageFeed.messageFeedId === messagePreview.messageFeedId;
4999
+ });
5000
+ const { channelPublicId: channelId, messageFeedId: subChannelId, messageId: messagePreviewId, creatorPublicId: creatorId, data, dataType, isDeleted, segment, createdAt, updatedAt, } = messagePreview;
5001
+ return {
5002
+ messagePreviewId,
5003
+ channelId,
5004
+ subChannelId,
5005
+ data,
5006
+ dataType,
5007
+ isDeleted,
5008
+ segment,
5009
+ creatorId,
5010
+ createdAt,
5011
+ updatedAt,
5012
+ subChannelName: messageFeedInfo === null || messageFeedInfo === void 0 ? void 0 : messageFeedInfo.name,
5013
+ subChannelUpdatedAt: messageFeedInfo === null || messageFeedInfo === void 0 ? void 0 : messageFeedInfo.updatedAt,
5014
+ };
5015
+ };
5016
+ const newData = {
5017
+ messagePreviewSubChannel: (_b = (_a = rawPayload.messages) === null || _a === void 0 ? void 0 : _a.map(messagePreview => withMessageFeedInfo(messagePreview))) !== null && _b !== void 0 ? _b : [],
5018
+ };
5019
+ ingestInCache(newData);
5020
+ };
5021
+
5022
+ /**
5023
+ * ```js
5024
+ * import { shallowClone } from '~/utils/shallowClone'
5025
+ * const newObj = shallowClone(obj)
5026
+ * ```
5027
+ *
5028
+ * Clone an object with same prototype and properties
5029
+ *
5030
+ * @param obj the object to clone
5031
+ * @returns new object with same prototype and properties
5032
+ *
5033
+ * @category utility
5034
+ * @private
5035
+ */
5036
+ function shallowClone(source, target) {
5037
+ return Object.create(Object.getPrototypeOf(source), Object.assign(Object.assign({}, Object.getOwnPropertyDescriptors(source)), Object.getOwnPropertyDescriptors(target)));
4957
5038
  }
4958
5039
 
4959
- class AnalyticsEventCapturer {
4960
- constructor() {
4961
- this._expireTime = 5 * MINUTE;
4962
- this._poolLimit = 1000;
4963
- this._recentViewed = {};
4964
- this._recentHighPriorityViewed = {};
4965
- // Story
4966
- this._throttleStoryTimer = undefined;
4967
- this._bufferNewSeenStoryReferenceIds = [];
4968
- }
4969
- isAbleToEnqueue({ uniqueId, expireTime, isHighPriority = false, }) {
4970
- const now = new Date();
4971
- // Get the recent view date (if any)
4972
- const recentViewedDate = isHighPriority
4973
- ? this._recentHighPriorityViewed[uniqueId]
4974
- : this._recentViewed[uniqueId];
4975
- // If this is the first view, always allow it
4976
- if (!recentViewedDate) {
4977
- return true;
4978
- }
4979
- const timeDiff = now.getTime() - recentViewedDate.getTime();
4980
- if (timeDiff < expireTime) {
4981
- // just recently view this post, ignore the event.
4982
- return false;
4983
- }
4984
- return true;
5040
+ function updateSubChannelCache(subChannelId, subChannel, params) {
5041
+ pushToCache(['subChannel', 'get', subChannelId],
5042
+ // eslint-disable-next-line prefer-object-spread
5043
+ shallowClone(subChannel, params));
5044
+ }
5045
+
5046
+ /**
5047
+ * ```js
5048
+ * import { isInTombstone } from '@amityco/ts-sdk'
5049
+ * const user = isInTombstone(["message", "messageId"])
5050
+ * ```
5051
+ *
5052
+ * Checks if the {@link Amity.TombstoneCacheOptions} exists
5053
+ * in cache and it's not expired means it's in tombstone
5054
+ * and we throw an Error
5055
+ *
5056
+ * @param model the model to check
5057
+ * @param modelId the object id to check
5058
+ * @returns the matching cache entry, or undefined.
5059
+ *
5060
+ * @category Cache API
5061
+ */
5062
+ const isInTombstone = (model, modelId) => {
5063
+ const { log, cache } = getActiveClient();
5064
+ const key = [model, CACHE_KEY_TOMBSTONE, modelId];
5065
+ if (!cache)
5066
+ return;
5067
+ log('cache/api/isInTombstone', key);
5068
+ const isInTombstone = pullFromCache(key);
5069
+ const { lifeSpan } = queryOptions('cache_then_server', CACHE_LIFESPAN_TOMBSTONE);
5070
+ if (isInTombstone && isFresh(isInTombstone.data, lifeSpan)) {
5071
+ throw new ASCApiError('Item not found!', 400400 /* Amity.ServerError.ITEM_NOT_FOUND */, "error" /* Amity.ErrorLevel.ERROR */);
4985
5072
  }
4986
- markAs({ uniqueId, contentId, contentType, activityType, metadata, }) {
4987
- if (!this.isAbleToEnqueue({ uniqueId, expireTime: this._expireTime }))
4988
- return;
4989
- const now = new Date();
4990
- const currentData = { event: [] };
4991
- const cache = pullFromCache(ANALYTIC_CACHE_KEY);
4992
- if (cache === null || cache === void 0 ? void 0 : cache.data) {
4993
- currentData.event = cache.data.event;
4994
- }
4995
- // If the pool is full (Max 1000 items), remove the oldest data
5073
+ };
5074
+
5075
+ /**
5076
+ * ```js
5077
+ * import { getMessageMarkers } from '@amityco/ts-sdk'
5078
+ * const messageMarkers = await getMessageMarkers(['sch1', 'sch2'])
5079
+ * ```
5080
+ *
5081
+ * Fetches a list of {@link Amity.MessageMarker} by messageIds
5082
+ *
5083
+ * @param messageIds the feed IDs of the {@link Amity.RawMessage} marker to fetch
5084
+ * @returns A list of {@link Amity.MessageMarker} by messageIds
5085
+ *
5086
+ * @category Channel API
5087
+ * @async
5088
+ * @private
5089
+ */
5090
+ const getMessageMarkers = async (messageIds) => {
5091
+ const client = getActiveClient();
5092
+ client.log('channel/getMessageMarkers', messageIds);
5093
+ const { data: queryPayload } = await client.http.get(`/api/v1/markers/messages`, {
5094
+ params: {
5095
+ messageIds,
5096
+ },
5097
+ });
5098
+ const { contentMarkers, feedMarkers, userMarkers } = queryPayload;
5099
+ const cachedAt = client.cache && Date.now();
5100
+ if (client.cache)
5101
+ ingestInCache({ contentMarkers, feedMarkers, userMarkers }, { cachedAt });
5102
+ fireEvent('local.feedMarker.fetched', { feedMarkers });
5103
+ fireEvent('local.messageMarker.fetched', { contentMarkers });
5104
+ fireEvent('local.userMarker.fetched', { userMarkers });
5105
+ return { data: contentMarkers, cachedAt };
5106
+ };
5107
+
5108
+ const reCalculateChannelUnreadInfo = (channelId) => {
5109
+ var _a;
5110
+ const cacheKeyChannelUnread = ['channelUnreadInfo', 'get', channelId];
5111
+ const cacheChannelUnreadInfo = (_a = pullFromCache(cacheKeyChannelUnread)) === null || _a === void 0 ? void 0 : _a.data;
5112
+ const cacheKeySubChannelUnread = ['subChannelUnreadInfo', 'get'];
5113
+ const cachedSubChannelUnreadInfo = queryCache(cacheKeySubChannelUnread);
5114
+ let channelUnreads = 0;
5115
+ let isMentioned = false;
5116
+ if (cachedSubChannelUnreadInfo && (cachedSubChannelUnreadInfo === null || cachedSubChannelUnreadInfo === void 0 ? void 0 : cachedSubChannelUnreadInfo.length) > 0) {
5117
+ const subChannelUnreadsInfo = cachedSubChannelUnreadInfo === null || cachedSubChannelUnreadInfo === void 0 ? void 0 : cachedSubChannelUnreadInfo.filter(({ data }) => {
5118
+ return data.channelId === channelId && !data.isDeleted;
5119
+ });
5120
+ channelUnreads = subChannelUnreadsInfo
5121
+ .map(({ data }) => data.unreadCount)
5122
+ .reduce((acc, cur) => acc + cur, 0);
5123
+ isMentioned = subChannelUnreadsInfo.some(({ data }) => data.isMentioned);
5124
+ }
5125
+ const channelUnreadInfo = Object.assign(Object.assign({}, (cacheChannelUnreadInfo !== null && cacheChannelUnreadInfo !== void 0 ? cacheChannelUnreadInfo : {
5126
+ channelId,
5127
+ createdAt: new Date().toISOString(),
5128
+ })), { updatedAt: new Date().toISOString(), unreadCount: channelUnreads, isMentioned });
5129
+ pushToCache(cacheKeyChannelUnread, channelUnreadInfo);
5130
+ return channelUnreadInfo;
5131
+ };
5132
+
5133
+ const persistUnreadCountInfo = (payload) => {
5134
+ const { feedMarkers, userFeedMarkers } = payload;
5135
+ // calculate sub channel unread info and channel unread info
5136
+ if (feedMarkers.length > 0 && userFeedMarkers.length > 0) {
5137
+ const channelIds = [];
5138
+ const feedMarkerMap = new Map(feedMarkers.map(fm => [fm.feedId, fm]));
5139
+ userFeedMarkers.forEach(userFeedMarker => {
5140
+ const feedMarker = feedMarkerMap.get(userFeedMarker.feedId);
5141
+ if (!feedMarker)
5142
+ return;
5143
+ if (feedMarker.feedId === userFeedMarker.feedId) {
5144
+ const unreadCount = feedMarker.lastSegment - userFeedMarker.readToSegment;
5145
+ const subChannelUnreadInfo = {
5146
+ subChannelId: feedMarker.feedId,
5147
+ channelId: feedMarker.entityId,
5148
+ readToSegment: userFeedMarker.readToSegment,
5149
+ lastSegment: feedMarker.lastSegment,
5150
+ lastMentionSegment: userFeedMarker.lastMentionSegment,
5151
+ unreadCount: Math.max(0, unreadCount),
5152
+ isMentioned: userFeedMarker.isMentioned,
5153
+ isDeleted: feedMarker.isDeleted,
5154
+ createdAt: userFeedMarker.createdAt,
5155
+ updatedAt: userFeedMarker.updatedAt,
5156
+ };
5157
+ // update sub channel unread info in cache
5158
+ ingestInCache({ subChannelUnreadInfo: [subChannelUnreadInfo] });
5159
+ if (!channelIds.includes(feedMarker.entityId)) {
5160
+ channelIds.push(feedMarker.entityId);
5161
+ }
5162
+ }
5163
+ });
5164
+ // re-calculate channel unread info in cache
5165
+ channelIds.forEach(channelId => {
5166
+ reCalculateChannelUnreadInfo(channelId);
5167
+ });
5168
+ }
5169
+ };
5170
+
5171
+ /**
5172
+ * ```js
5173
+ * import { getSubChannelMarkers } from '@amityco/ts-sdk'
5174
+ * const subChannelMarkers = await getSubChannelMarkers(['sch1', 'sch2'])
5175
+ * ```
5176
+ *
5177
+ * Fetches a paginable list of {@link Amity.SubChannelMarker} objects
5178
+ *
5179
+ * @param messageFeedIds the feed IDs of the {@link Amity.RawSubChannel} marker to fetch
5180
+ * @param page
5181
+ * @returns A page of {@link Amity.SubChannelMarker} objects
5182
+ *
5183
+ * @category Channel API
5184
+ * @async
5185
+ * @private
5186
+ */
5187
+ const getSubChannelMarkers = async (messageFeedIds, page = { limit: 100 }) => {
5188
+ const client = getActiveClient();
5189
+ client.log('channel/getSubChannelMarkers', messageFeedIds, page);
5190
+ const { data: queryPayload } = await client.http.get(`/api/v1/markers/message-feeds`, {
5191
+ params: {
5192
+ messageFeedIds,
5193
+ options: {
5194
+ token: toToken(page, 'skiplimit'),
5195
+ },
5196
+ },
5197
+ });
5198
+ const { paging } = queryPayload, payload = __rest(queryPayload, ["paging"]);
5199
+ const { userEntityMarkers: userEntityMarkersPayload, userFeedMarkers: userFeedMarkersPayload, userMarkers, feedMarkers: feedMarkersPayload, } = payload;
5200
+ // if consistent mode is enabled, persist the unread count info to the cache
5201
+ if (client.isUnreadCountEnabled && client.getMarkerSyncConsistentMode()) {
5202
+ persistUnreadCountInfo({
5203
+ feedMarkers: feedMarkersPayload,
5204
+ userFeedMarkers: userFeedMarkersPayload,
5205
+ });
5206
+ }
5207
+ const userEntityMarkers = convertChannelMarkerResponse(userEntityMarkersPayload);
5208
+ const userFeedMarkers = convertSubChannelMarkerResponse(userFeedMarkersPayload);
5209
+ const cachedAt = client.cache && Date.now();
5210
+ if (client.cache)
5211
+ ingestInCache({ userEntityMarkers, userFeedMarkers, userMarkers }, { cachedAt });
5212
+ fireEvent('local.channelMarker.fetched', { userEntityMarkers });
5213
+ fireEvent('local.subChannelMarker.fetched', { userFeedMarkers });
5214
+ fireEvent('local.userMarker.fetched', { userMarkers });
5215
+ const nextPage = toPage(paging.next);
5216
+ const prevPage = toPage(paging.previous);
5217
+ return { data: userFeedMarkers, cachedAt, prevPage, nextPage };
5218
+ };
5219
+
5220
+ const getUserMarker = async () => {
5221
+ const client = getActiveClient();
5222
+ client.log('channel/getUserMarker');
5223
+ const { data: payload } = await client.http.get(`/api/v1/markers/userMarker`);
5224
+ const { userMarkers } = payload;
5225
+ const cachedAt = client.cache && Date.now();
5226
+ if (client.cache)
5227
+ ingestInCache({ userMarkers }, { cachedAt });
5228
+ fireEvent('local.userMarker.fetched', { userMarkers });
5229
+ const latestUserMarker = userMarkers.reduce((maxUserMarker, userMarker) => {
5230
+ if (maxUserMarker == null ||
5231
+ new Date(maxUserMarker.lastSyncAt).getTime() < new Date(userMarker.lastSyncAt).getTime()) {
5232
+ return userMarker;
5233
+ }
5234
+ return maxUserMarker;
5235
+ }, undefined);
5236
+ return { data: latestUserMarker, cachedAt };
5237
+ };
5238
+
5239
+ /** @hidden */
5240
+ /*
5241
+ * @param message payload from http request without myReactions
5242
+ * add myReactions to http response if the event was a reaction event
5243
+ */
5244
+ const prepareMessagePayloadForCache = (payload, reactors, event) => {
5245
+ const client = getActiveClient();
5246
+ const cached = pullFromCache(['message', 'get', payload.messageId]);
5247
+ // '[]' in cases where the new reaction is the first one
5248
+ const myReactions = (cached === null || cached === void 0 ? void 0 : cached.data.myReactions) || [];
5249
+ // add myReactions to the payload
5250
+ Object.assign(payload, { myReactions });
5251
+ // check if there are any updates to the reactions
5252
+ const latestReaction = reactors[0];
5253
+ const isLatestReactionMine = latestReaction && latestReaction.userId === client.userId;
5254
+ if (!isLatestReactionMine) {
5255
+ return;
5256
+ }
5257
+ // new reaction added
5258
+ if (event === 'message.reactionAdded' && !myReactions.includes(latestReaction.reactionName)) {
5259
+ Object.assign(payload, {
5260
+ myReactions: [...myReactions, latestReaction.reactionName],
5261
+ });
5262
+ }
5263
+ // existing reaction removed
5264
+ if (event === 'message.reactionRemoved' && myReactions.includes(latestReaction.reactionName)) {
5265
+ Object.assign(payload, {
5266
+ myReactions: myReactions.filter(x => x !== latestReaction.reactionName),
5267
+ });
5268
+ }
5269
+ };
5270
+
5271
+ /*
5272
+ * This is a simple utility that infers the value of isDeleted based on the
5273
+ * value of includeDeleted
5274
+ *
5275
+ * There are two important things to note here:
5276
+ * 1. `includeDeleted` is purely client side query param and not recognized by
5277
+ * the server
5278
+ * 2. The only values we wish to expose with regards to `isDeleted` (the server
5279
+ * param for queries) is false | undefined and want to disallow users to query
5280
+ * for deleted entities
5281
+ *
5282
+ * Although this is a very simple utility, it's only purpose is to keep things
5283
+ * DRY
5284
+ */
5285
+ const inferIsDeleted = (includeDeleted) => includeDeleted === true ? undefined : false;
5286
+
5287
+ function getSubChannelIsMentioned(channelId, subChannelId, marker) {
5288
+ var _a, _b;
5289
+ // Look for `unreadCount` in the marker param first
5290
+ if (marker) {
5291
+ return marker.hasMentioned;
5292
+ }
5293
+ const client = getActiveClient();
5294
+ // If consistent mode is enabled, look in the SubChannelUnreadCountInfo cache
5295
+ if (client.isUnreadCountEnabled && client.getMarkerSyncConsistentMode()) {
5296
+ const cachedUnreadCount = (_a = pullFromCache([
5297
+ 'subChannelUnreadInfo',
5298
+ 'get',
5299
+ subChannelId,
5300
+ ])) === null || _a === void 0 ? void 0 : _a.data;
5301
+ if (cachedUnreadCount) {
5302
+ return cachedUnreadCount.isMentioned;
5303
+ }
5304
+ return false;
5305
+ }
5306
+ const key = {
5307
+ entityId: channelId,
5308
+ feedId: subChannelId,
5309
+ userId: getActiveUser()._id,
5310
+ };
5311
+ // If the marker param is not set, look in the cache
5312
+ const cachedMarker = (_b = pullFromCache([
5313
+ 'subChannelMarker',
5314
+ 'get',
5315
+ getResolver('subChannelMarker')(key),
5316
+ ])) === null || _b === void 0 ? void 0 : _b.data;
5317
+ if (cachedMarker) {
5318
+ return cachedMarker.hasMentioned;
5319
+ }
5320
+ // and if not found in cache use default value `false`
5321
+ return false;
5322
+ }
5323
+
5324
+ function getSubChannelUnreadCount(channelId, subChannelId, marker) {
5325
+ var _a, _b;
5326
+ // Look for `unreadCount` in the marker param first
5327
+ if (marker) {
5328
+ return marker.unreadCount;
5329
+ }
5330
+ const client = getActiveClient();
5331
+ // If consistent mode is enabled, look in the SubChannelUnreadCountInfo cache
5332
+ if (client.isUnreadCountEnabled && client.getMarkerSyncConsistentMode()) {
5333
+ const cachedUnreadCount = (_a = pullFromCache([
5334
+ 'subChannelUnreadInfo',
5335
+ 'get',
5336
+ subChannelId,
5337
+ ])) === null || _a === void 0 ? void 0 : _a.data;
5338
+ if (cachedUnreadCount) {
5339
+ return cachedUnreadCount.isDeleted ? 0 : cachedUnreadCount.unreadCount;
5340
+ }
5341
+ return 0;
5342
+ }
5343
+ const key = {
5344
+ entityId: channelId,
5345
+ feedId: subChannelId,
5346
+ userId: getActiveUser()._id,
5347
+ };
5348
+ // If the marker param is not set, look in the cache
5349
+ const cachedMarker = (_b = pullFromCache([
5350
+ 'subChannelMarker',
5351
+ 'get',
5352
+ getResolver('subChannelMarker')(key),
5353
+ ])) === null || _b === void 0 ? void 0 : _b.data;
5354
+ if (cachedMarker) {
5355
+ return cachedMarker.unreadCount;
5356
+ }
5357
+ // and if not found in cache use default value `0`
5358
+ return 0;
5359
+ }
5360
+
5361
+ const MARKER_INCLUDED_SUB_CHANNEL_TYPE$1 = ['broadcast', 'conversation', 'community'];
5362
+ const isUnreadCountSupport$2 = ({ channelType }) => MARKER_INCLUDED_SUB_CHANNEL_TYPE$1.includes(channelType);
5363
+ function convertFromRaw$2(_a) {
5364
+ var { channelId, channelPublicId, channelType, childCount, creatorId, creatorPublicId, lastMessageId, lastMessageTimestamp, messageFeedId, name } = _a, rest = __rest(_a, ["channelId", "channelPublicId", "channelType", "childCount", "creatorId", "creatorPublicId", "lastMessageId", "lastMessageTimestamp", "messageFeedId", "name"]);
5365
+ return Object.assign(Object.assign({ get unreadCount() {
5366
+ return getSubChannelUnreadCount(channelId, messageFeedId);
5367
+ },
5368
+ get hasMentioned() {
5369
+ return getSubChannelIsMentioned(channelId, messageFeedId);
5370
+ },
5371
+ get isMentioned() {
5372
+ return getSubChannelIsMentioned(channelId, messageFeedId);
5373
+ } }, rest), { channelId: channelPublicId, creatorId: creatorPublicId, displayName: name, lastActivity: lastMessageTimestamp, latestMessageId: lastMessageId, messageCount: childCount, subChannelId: messageFeedId, isUnreadCountSupport: isUnreadCountSupport$2({ channelType }) });
5374
+ }
5375
+
5376
+ const mergePayloadWithLocal = (payload) => {
5377
+ var _a, _b, _c;
5378
+ const localMessage = (_b = (_a = queryCache(['message', 'get'])) === null || _a === void 0 ? void 0 : _a.find(({ data }) => data.messageId === payload.messageId)) === null || _b === void 0 ? void 0 : _b.data;
5379
+ if (localMessage) {
5380
+ return Object.assign(Object.assign(Object.assign({}, localMessage), payload), {
5381
+ // NOTE: referenceId is missing in the some payload event. If we have local message data with referenceId, use it instead.
5382
+ referenceId: (_c = localMessage.referenceId) !== null && _c !== void 0 ? _c : payload.referenceId });
5383
+ }
5384
+ return payload;
5385
+ };
5386
+ function convertFromRaw$1(message, reactors, event) {
5387
+ var _a;
5388
+ const mergeMessage = mergePayloadWithLocal(message);
5389
+ const { channelPublicId, childCount, creatorPublicId, mentionedUsers, messageFeedId, myReactions, reactionCount, reactions, referenceId, segment, messageId, creatorId } = mergeMessage, rest = __rest(mergeMessage, ["channelPublicId", "childCount", "creatorPublicId", "mentionedUsers", "messageFeedId", "myReactions", "reactionCount", "reactions", "referenceId", "segment", "messageId", "creatorId"]);
5390
+ let cache;
5391
+ if (referenceId) {
5392
+ cache = pullFromCache(['message', 'get', referenceId]);
5393
+ }
5394
+ if (!cache) {
5395
+ cache = pullFromCache(['message', 'get', messageId]);
5396
+ }
5397
+ const out = Object.assign(Object.assign({}, rest), { messageId, channelId: channelPublicId, channelSegment: segment, childrenNumber: childCount, creatorId: creatorPublicId, creatorPrivateId: message.creatorId, reactions: reactions !== null && reactions !== void 0 ? reactions : {},
5398
+ /*
5399
+ * Previously, myReactions were added only if it was part of the payload.
5400
+ * So empty myReactions were not present. So I've edited the payload to add
5401
+ * a default for those cases.
5402
+ *
5403
+ * Check git blame for previous iteration
5404
+ */
5405
+ myReactions: myReactions || ((_a = cache === null || cache === void 0 ? void 0 : cache.data.myReactions) !== null && _a !== void 0 ? _a : []), reactionsCount: reactionCount, subChannelId: messageFeedId, uniqueId: cache ? cache.data.uniqueId : messageId, referenceId, syncState: "synced" /* Amity.SyncState.Synced */ });
5406
+ if (mentionedUsers) {
5407
+ out.mentionees = mentionedUsers.map(mention => {
5408
+ if (mention.type === 'channel') {
5409
+ return mention;
5410
+ }
5411
+ return { type: 'user', userIds: mention.userPublicIds };
5412
+ });
5413
+ }
5414
+ if (reactors && reactors.length && event) {
5415
+ // mqtt event
5416
+ prepareMessagePayloadForCache(out, reactors, event);
5417
+ }
5418
+ return out;
5419
+ }
5420
+ const preUpdateMessageCache = (rawPayload) => {
5421
+ ingestInCache({
5422
+ messages: rawPayload.messages.map(message => convertFromRaw$1(message, rawPayload.reactions)),
5423
+ });
5424
+ };
5425
+ const DEBOUNCE_TIME = 2000;
5426
+ const currentDebounceMap = {};
5427
+ const prepareMessagePayload = async (payload, event) => {
5428
+ const markerIds = payload.messages.map(({ messageId }) => messageId);
5429
+ if (markerIds.length > 0) {
5430
+ // since the get markers method requires a channel cache to function with the reducer.
5431
+ preUpdateMessageCache(payload);
5432
+ const markerIdsKey = markerIds.join('');
5433
+ if (currentDebounceMap[markerIdsKey]) {
5434
+ clearTimeout(currentDebounceMap[markerIdsKey]);
5435
+ }
5436
+ currentDebounceMap[markerIdsKey] = setTimeout(() => {
5437
+ try {
5438
+ getMessageMarkers(markerIds);
5439
+ }
5440
+ catch (_error) {
5441
+ // do nothing
5442
+ }
5443
+ }, DEBOUNCE_TIME);
5444
+ }
5445
+ const { messageFeeds } = payload, restPayload = __rest(payload, ["messageFeeds"]);
5446
+ // upsert messageFeeds to subchannel cache because messageFeeds from event payload not include messagePreviewId
5447
+ if (messageFeeds && messageFeeds.length > 0) {
5448
+ messageFeeds === null || messageFeeds === void 0 ? void 0 : messageFeeds.forEach(messageFeed => {
5449
+ var _a, _b;
5450
+ const subChannelCache = (_b = (_a = pullFromCache(['subChannel', 'get', messageFeed.messageFeedId])) === null || _a === void 0 ? void 0 : _a.data) !== null && _b !== void 0 ? _b : {};
5451
+ // exclude getter properties from existing subChannel cache, update only other properties to existing subChannel cache
5452
+ const _c = convertFromRaw$2(messageFeed), restSubChannel = __rest(_c, ["unreadCount", "isMentioned"]);
5453
+ updateSubChannelCache(messageFeed.messageFeedId, subChannelCache, restSubChannel);
5454
+ });
5455
+ }
5456
+ return Object.assign(Object.assign({}, restPayload), { messages: payload.messages.map(m => convertFromRaw$1(m, payload.reactions, event)) });
5457
+ };
5458
+ function convertParams(_a) {
5459
+ var { subChannelId, mentionees, dataType, data } = _a, rest = __rest(_a, ["subChannelId", "mentionees", "dataType", "data"]);
5460
+ if (dataType === MessageContentType.IMAGE || dataType === MessageContentType.FILE) {
5461
+ return Object.assign({ messageFeedId: subChannelId, mentionedUsers: mentionees, dataType, data: Object.assign({ caption: '' }, data) }, rest);
5462
+ }
5463
+ return Object.assign({ messageFeedId: subChannelId, mentionedUsers: mentionees, dataType, data }, rest);
5464
+ }
5465
+ function convertQueryParams$1(_a) {
5466
+ var { sortBy, subChannelId, includingTags, excludingTags, includeDeleted, aroundMessageId, limit, type } = _a, rest = __rest(_a, ["sortBy", "subChannelId", "includingTags", "excludingTags", "includeDeleted", "aroundMessageId", "limit", "type"]);
5467
+ const out = Object.assign(Object.assign({}, rest), { messageFeedId: subChannelId, isDeleted: inferIsDeleted(includeDeleted), options: {
5468
+ sortBy,
5469
+ limit: limit || COLLECTION_DEFAULT_PAGINATION_LIMIT,
5470
+ around: aroundMessageId,
5471
+ } });
5472
+ if (includingTags) {
5473
+ out.includeTags = includingTags;
5474
+ }
5475
+ if (type) {
5476
+ out.dataType = type;
5477
+ }
5478
+ if (excludingTags) {
5479
+ out.excludeTags = excludingTags;
5480
+ }
5481
+ return out;
5482
+ }
5483
+
5484
+ function convertRawUserToInternalUser(rawUser) {
5485
+ return Object.assign(Object.assign({}, rawUser), { isGlobalBanned: (rawUser === null || rawUser === void 0 ? void 0 : rawUser.isGlobalBan) || false });
5486
+ }
5487
+
5488
+ const MARKER_INCLUDED_SUB_CHANNEL_TYPE = ['broadcast', 'conversation', 'community'];
5489
+ /**
5490
+ * Filter sub channel by type. Only conversation, community and broadcast type are included.
5491
+ */
5492
+ const isUnreadCountSupport$1 = ({ channelType }) => MARKER_INCLUDED_SUB_CHANNEL_TYPE.includes(channelType);
5493
+ const preUpdateSubChannelCache = (rawPayload) => {
5494
+ ingestInCache({
5495
+ messageFeeds: rawPayload.messageFeeds.map(messageFeed => convertFromRaw$2(messageFeed)),
5496
+ });
5497
+ };
5498
+ const prepareSubChannelPayload = async (rawPayload) => {
5499
+ const markerIds = rawPayload.messageFeeds
5500
+ .filter(isUnreadCountSupport$1)
5501
+ .map(({ messageFeedId }) => messageFeedId);
5502
+ if (markerIds.length > 0) {
5503
+ // since the get markers method requires a channel cache to function with the reducer.
5504
+ preUpdateSubChannelCache(rawPayload);
5505
+ try {
5506
+ await getSubChannelMarkers(markerIds);
5507
+ }
5508
+ catch (e) {
5509
+ // empty block (from the spec, allow marker fetch to fail without having to do anything)
5510
+ }
5511
+ }
5512
+ updateSubChannelMessagePreviewCache(rawPayload);
5513
+ // attach marker to sub channel
5514
+ const messageFeeds = rawPayload.messageFeeds.map(convertFromRaw$2);
5515
+ const messages = rawPayload.messages.map(m => convertFromRaw$1(m));
5516
+ const user = rawPayload.users.map(convertRawUserToInternalUser);
5517
+ return Object.assign(Object.assign({}, rawPayload), { messageFeeds,
5518
+ messages, users: user });
5519
+ };
5520
+ function convertQueryParams(_a) {
5521
+ var { excludeDefaultSubChannel } = _a, rest = __rest(_a, ["excludeDefaultSubChannel"]);
5522
+ const out = Object.assign({}, rest);
5523
+ if (excludeDefaultSubChannel !== undefined) {
5524
+ out.excludeDefaultMessageFeed = excludeDefaultSubChannel;
5525
+ }
5526
+ return out;
5527
+ }
5528
+
5529
+ /**
5530
+ * ```js
5531
+ * import { getSubChannel } from '@amityco/ts-sdk'
5532
+ * const subChannel = await getSubChannel('foobar')
5533
+ * ```
5534
+ *
5535
+ * Fetches a {@link Amity.SubChannel} object
5536
+ *
5537
+ * @param subChannelId the ID of the {@link Amity.SubChannel} to fetch
5538
+ * @returns the associated {@link Amity.SubChannel} object
5539
+ *
5540
+ * @category Channel API
5541
+ * @async
5542
+ */
5543
+ const getSubChannel$1 = async (subChannelId) => {
5544
+ const client = getActiveClient();
5545
+ client.log('channel/getSubChannel', subChannelId);
5546
+ isInTombstone('subChannel', subChannelId);
5547
+ try {
5548
+ const response = await client.http.get(`/api/v5/message-feeds/${encodeURIComponent(subChannelId)}`);
5549
+ const data = await prepareSubChannelPayload(response.data);
5550
+ const cachedAt = client.cache && Date.now();
5551
+ if (client.cache)
5552
+ ingestInCache(data, { cachedAt });
5553
+ fireEvent('local.message-feed.fetched', data);
5554
+ return {
5555
+ data: data.messageFeeds[0],
5556
+ cachedAt,
5557
+ };
5558
+ }
5559
+ catch (error) {
5560
+ if (checkIfShouldGoesToTombstone(error === null || error === void 0 ? void 0 : error.code)) {
5561
+ pushToTombstone('subChannel', subChannelId);
5562
+ }
5563
+ throw error;
5564
+ }
5565
+ };
5566
+ /**
5567
+ * ```js
5568
+ * import { getSubChannel } from '@amityco/ts-sdk'
5569
+ * const subChannel = getSubChannel.locally('foobar')
5570
+ * ```
5571
+ *
5572
+ * Fetches a {@link Amity.SubChannel} object from cache
5573
+ *
5574
+ * @param subChannelId the ID of the {@link Amity.SubChannel} to fetch
5575
+ * @returns the associated {@link Amity.SubChannel} object
5576
+ *
5577
+ * @category Channel API
5578
+ */
5579
+ getSubChannel$1.locally = (subChannelId) => {
5580
+ const client = getActiveClient();
5581
+ client.log('channel/getSubChannel.locally', subChannelId);
5582
+ if (!client.cache)
5583
+ return;
5584
+ const cached = pullFromCache(['subChannel', 'get', subChannelId]);
5585
+ if (!cached)
5586
+ return;
5587
+ return {
5588
+ data: cached.data,
5589
+ cachedAt: cached.cachedAt,
5590
+ };
5591
+ };
5592
+
5593
+ const convertDateStringToTimestamp = (dateString) => {
5594
+ return new Date(dateString).getTime();
5595
+ };
5596
+
5597
+ const getMessagePreviewSetting$1 = async () => {
5598
+ const client = getActiveClient();
5599
+ return client.getMessagePreviewSetting(false);
5600
+ };
5601
+ const getSubChannelCache = async (subChannelId) => {
5602
+ var _a;
5603
+ let subChannelCache = (_a = pullFromCache(['subChannel', 'get', subChannelId])) === null || _a === void 0 ? void 0 : _a.data;
5604
+ if (!subChannelCache) {
5605
+ subChannelCache = (await getSubChannel$1(subChannelId)).data;
5606
+ }
5607
+ return subChannelCache;
5608
+ };
5609
+ const isLastestMessageOnSubchannel = (message) => {
5610
+ var _a;
5611
+ const cache = (_a = pullFromCache([
5612
+ 'messagePreviewSubChannel',
5613
+ 'get',
5614
+ message.subChannelId,
5615
+ ])) === null || _a === void 0 ? void 0 : _a.data;
5616
+ // The message payload from optimistic created event has no segment, so we check createdAt instead.
5617
+ return (!cache ||
5618
+ cache.segment <= message.channelSegment ||
5619
+ convertDateStringToTimestamp(cache.createdAt) <= convertDateStringToTimestamp(message.createdAt));
5620
+ };
5621
+ const isLastestMessageOnChannel = (message) => {
5622
+ var _a;
5623
+ const cache = (_a = pullFromCache([
5624
+ 'messagePreviewChannel',
5625
+ 'get',
5626
+ message.channelId,
5627
+ ])) === null || _a === void 0 ? void 0 : _a.data;
5628
+ return (!cache ||
5629
+ convertDateStringToTimestamp(cache.createdAt) <= convertDateStringToTimestamp(message.createdAt));
5630
+ };
5631
+ const handleMessageCreatedOnSubChannel = async (message) => {
5632
+ const messagePreviewSetting = await getMessagePreviewSetting$1();
5633
+ const { channelId, messageId: messagePreviewId, creatorId, createdAt, updatedAt, data, dataType, subChannelId, channelSegment: segment, isDeleted, } = message;
5634
+ // 1. get subChannel from cache, if not exist fetch from server
5635
+ const subChannelCache = await getSubChannelCache(subChannelId);
5636
+ // 2. if messagePreviewSetting is NO_MESSAGE_PREVEIW, update only lastActiviy in subChannel cache
5637
+ if (messagePreviewSetting === "no-message-preview" /* Amity.MessagePreviewSetting.NO_MESSAGE_PREVIEW */) {
5638
+ // 2.1 if the message is the latest message, update lastActivity to be createdAt in subChannel cache
5639
+ if (convertDateStringToTimestamp(subChannelCache.lastActivity) <
5640
+ convertDateStringToTimestamp(createdAt))
5641
+ updateSubChannelCache(message.subChannelId, subChannelCache, {
5642
+ lastActivity: createdAt,
5643
+ });
5644
+ return;
5645
+ }
5646
+ // 3. if messagePreviewSetting is `NOT` NO_MESSAGE_PREVEIW, update messagePreviewSubChannel and subChannel cache
5647
+ // 3.1 check if the message is the latest message, if not ignore the message.
5648
+ if (!isLastestMessageOnSubchannel(message))
5649
+ return;
5650
+ // 3.2 if the message is the latest message, update messagePreviewSubChannel and subChannel cache
5651
+ pushToCache(['messagePreviewSubChannel', 'get', message.subChannelId], {
5652
+ channelId,
5653
+ creatorId,
5654
+ messagePreviewId,
5655
+ createdAt,
5656
+ updatedAt,
5657
+ subChannelId,
5658
+ data,
5659
+ dataType,
5660
+ segment,
5661
+ isDeleted,
5662
+ subChannelUpdatedAt: subChannelCache === null || subChannelCache === void 0 ? void 0 : subChannelCache.updatedAt,
5663
+ subChannelName: subChannelCache === null || subChannelCache === void 0 ? void 0 : subChannelCache.displayName,
5664
+ });
5665
+ updateSubChannelCache(message.subChannelId, subChannelCache, {
5666
+ lastActivity: createdAt,
5667
+ messagePreviewId,
5668
+ });
5669
+ };
5670
+ const handleMessageUpdatedOnSubChannel = async (message) => {
5671
+ var _a;
5672
+ const { channelId, messageId: messagePreviewId, creatorId, createdAt, updatedAt, data, dataType, subChannelId, channelSegment: segment, isDeleted, } = message;
5673
+ const messagePreviewSubChannelCache = (_a = pullFromCache([
5674
+ 'messagePreviewSubChannel',
5675
+ 'get',
5676
+ message.subChannelId,
5677
+ ])) === null || _a === void 0 ? void 0 : _a.data;
5678
+ // if messagePreviewSubChannel is not exist, ignore the message.
5679
+ if (messagePreviewSubChannelCache &&
5680
+ messagePreviewSubChannelCache.messagePreviewId === message.messageId) {
5681
+ const subChannelCache = await getSubChannelCache(subChannelId);
5682
+ pushToCache(['messagePreviewSubChannel', 'get', message.subChannelId], {
5683
+ channelId,
5684
+ creatorId,
5685
+ messagePreviewId,
5686
+ createdAt,
5687
+ updatedAt,
5688
+ subChannelId,
5689
+ data,
5690
+ dataType,
5691
+ segment,
5692
+ isDeleted,
5693
+ subChannelUpdatedAt: subChannelCache.updatedAt,
5694
+ subChannelName: messagePreviewSubChannelCache.subChannelName,
5695
+ });
5696
+ }
5697
+ };
5698
+ const handleMessageCreated = async (message) => {
5699
+ const { channelId, messageId: messagePreviewId, creatorId, createdAt, updatedAt, data, dataType, subChannelId, channelSegment: segment, isDeleted, } = message;
5700
+ if (isLastestMessageOnChannel(message)) {
5701
+ const subChannelCache = await getSubChannelCache(subChannelId);
5702
+ pushToCache(['messagePreviewChannel', 'get', message.channelId], {
5703
+ channelId,
5704
+ creatorId,
5705
+ messagePreviewId,
5706
+ createdAt,
5707
+ updatedAt,
5708
+ subChannelId,
5709
+ data,
5710
+ dataType,
5711
+ segment,
5712
+ isDeleted,
5713
+ subChannelUpdatedAt: subChannelCache === null || subChannelCache === void 0 ? void 0 : subChannelCache.updatedAt,
5714
+ subChannelName: subChannelCache === null || subChannelCache === void 0 ? void 0 : subChannelCache.displayName,
5715
+ });
5716
+ }
5717
+ };
5718
+ const handleMessageUpdated = async (message) => {
5719
+ /**
5720
+ * Channel Case
5721
+ */
5722
+ var _a;
5723
+ const { channelId, messageId: messagePreviewId, creatorId, createdAt, updatedAt, data, dataType, subChannelId, channelSegment: segment, isDeleted, } = message;
5724
+ const messagePreviewChannelCache = (_a = pullFromCache([
5725
+ 'messagePreviewChannel',
5726
+ 'get',
5727
+ message.channelId,
5728
+ ])) === null || _a === void 0 ? void 0 : _a.data;
5729
+ if (messagePreviewChannelCache &&
5730
+ messagePreviewChannelCache.messagePreviewId === message.messageId) {
5731
+ const subChannelCache = await getSubChannelCache(subChannelId);
5732
+ pushToCache(['messagePreviewChannel', 'get', message.channelId], {
5733
+ channelId,
5734
+ creatorId,
5735
+ messagePreviewId,
5736
+ createdAt,
5737
+ updatedAt,
5738
+ subChannelId,
5739
+ data,
5740
+ dataType,
5741
+ segment,
5742
+ isDeleted,
5743
+ subChannelUpdatedAt: subChannelCache.updatedAt,
5744
+ subChannelName: messagePreviewChannelCache.subChannelName,
5745
+ });
5746
+ }
5747
+ };
5748
+ const handleSubChannelUpdated = async (subChannel) => {
5749
+ var _a, _b, _c, _d;
5750
+ const { channelId, subChannelId } = subChannel;
5751
+ /** Channel Case */
5752
+ const messagePreviewChannelCache = (_a = pullFromCache([
5753
+ 'messagePreviewChannel',
5754
+ 'get',
5755
+ channelId,
5756
+ ])) === null || _a === void 0 ? void 0 : _a.data;
5757
+ if ((messagePreviewChannelCache === null || messagePreviewChannelCache === void 0 ? void 0 : messagePreviewChannelCache.subChannelId) === subChannelId) {
5758
+ const subChannelCache = (_b = pullFromCache([
5759
+ 'subChannel',
5760
+ 'get',
5761
+ subChannelId,
5762
+ ])) === null || _b === void 0 ? void 0 : _b.data;
5763
+ pushToCache(['messagePreviewChannel', 'get', channelId], Object.assign(Object.assign({}, messagePreviewChannelCache), { subChannelName: subChannelCache === null || subChannelCache === void 0 ? void 0 : subChannelCache.displayName, subChannelUpdatedAt: subChannelCache === null || subChannelCache === void 0 ? void 0 : subChannelCache.updatedAt }));
5764
+ }
5765
+ /** SubChannel Case */
5766
+ const messagePreviewSubChannelCache = (_c = pullFromCache([
5767
+ 'messagePreviewSubChannel',
5768
+ 'get',
5769
+ subChannelId,
5770
+ ])) === null || _c === void 0 ? void 0 : _c.data;
5771
+ if (messagePreviewSubChannelCache &&
5772
+ new Date(messagePreviewSubChannelCache.updatedAt).valueOf() >
5773
+ new Date(subChannel.updatedAt).valueOf()) {
5774
+ const subChannelCache = (_d = pullFromCache([
5775
+ 'subChannel',
5776
+ 'get',
5777
+ subChannelId,
5778
+ ])) === null || _d === void 0 ? void 0 : _d.data;
5779
+ pushToCache(['messagePreviewSubChannel', 'get', subChannelId], Object.assign(Object.assign({}, messagePreviewSubChannelCache), { subChannelName: subChannelCache === null || subChannelCache === void 0 ? void 0 : subChannelCache.displayName, subChannelUpdatedAt: subChannelCache === null || subChannelCache === void 0 ? void 0 : subChannelCache.updatedAt }));
5780
+ }
5781
+ };
5782
+
5783
+ const MARKER_INCLUDED_CHANNEL_TYPE = ['broadcast', 'conversation', 'community'];
5784
+ const isUnreadCountSupport = ({ type }) => MARKER_INCLUDED_CHANNEL_TYPE.includes(type);
5785
+ function convertFromRaw(channel, options = { isMessagePreviewUpdated: true }) {
5786
+ var _a;
5787
+ let { messagePreviewId } = channel;
5788
+ const messagePreviewChannelCache = (_a = pullFromCache([
5789
+ 'messagePreviewChannel',
5790
+ 'get',
5791
+ channel.channelId,
5792
+ ])) === null || _a === void 0 ? void 0 : _a.data;
5793
+ if ((messagePreviewChannelCache === null || messagePreviewChannelCache === void 0 ? void 0 : messagePreviewChannelCache.messagePreviewId) && !options.isMessagePreviewUpdated) {
5794
+ messagePreviewId = messagePreviewChannelCache.messagePreviewId;
5795
+ }
5796
+ return Object.assign(Object.assign({}, channel), { defaultSubChannelId: channel.channelInternalId, isUnreadCountSupport: isUnreadCountSupport(channel), messagePreviewId });
5797
+ }
5798
+ const preUpdateChannelCache = (rawPayload, options = { isMessagePreviewUpdated: true }) => {
5799
+ ingestInCache({
5800
+ channels: rawPayload.channels.map(channel => convertFromRaw(channel, { isMessagePreviewUpdated: options.isMessagePreviewUpdated })),
5801
+ });
5802
+ };
5803
+ const updateChannelUnread = ({ currentUserId, channels, channelUsers, }) => {
5804
+ for (let i = 0; i < channels.length; i += 1) {
5805
+ const cacheKey = ['channelUnread', 'get', channels[i].channelId];
5806
+ const channelUser = channelUsers.find(channelUser => channelUser.channelId === channels[i].channelId && channelUser.userId === currentUserId);
5807
+ let unreadCount = 0;
5808
+ let readToSegment = null;
5809
+ let lastMentionedSegment = null;
5810
+ let isMentioned = false;
5811
+ if (channelUser) {
5812
+ readToSegment = channelUser.readToSegment;
5813
+ lastMentionedSegment = channelUser.lastMentionedSegment;
5814
+ unreadCount = Math.max(channels[i].messageCount - readToSegment, 0);
5815
+ isMentioned = lastMentionedSegment > readToSegment;
5816
+ }
5817
+ const cacheChannelUnread = {
5818
+ channelId: channels[i].channelId,
5819
+ lastSegment: channels[i].messageCount,
5820
+ readToSegment,
5821
+ lastMentionedSegment,
5822
+ unreadCount,
5823
+ isMentioned,
5824
+ isDeleted: channels[i].isDeleted || false,
5825
+ };
5826
+ pushToCache(cacheKey, cacheChannelUnread);
5827
+ }
5828
+ };
5829
+ const prepareChannelPayload = async (rawPayload, options = { isMessagePreviewUpdated: true }) => {
5830
+ const client = getActiveClient();
5831
+ const networkPreviewSetting = await client.getMessagePreviewSetting(false);
5832
+ if (options.isMessagePreviewUpdated &&
5833
+ networkPreviewSetting !== "no-message-preview" /* Amity.MessagePreviewSetting.NO_MESSAGE_PREVIEW */ &&
5834
+ rawPayload.messagePreviews &&
5835
+ rawPayload.messagePreviews.length > 0) {
5836
+ updateChannelMessagePreviewCache(rawPayload);
5837
+ }
5838
+ if (client.useLegacyUnreadCount) {
5839
+ updateChannelUnread({
5840
+ channels: rawPayload.channels,
5841
+ channelUsers: rawPayload.channelUsers,
5842
+ currentUserId: client.userId,
5843
+ });
5844
+ }
5845
+ else {
5846
+ const markerIds = rawPayload.channels
5847
+ // filter channel by type. Only conversation, community and broadcast type are included.
5848
+ .filter(isUnreadCountSupport)
5849
+ .map(({ channelInternalId }) => channelInternalId);
5850
+ if (markerIds.length > 0) {
5851
+ // since the get markers method requires a channel cache to function with the reducer.
5852
+ preUpdateChannelCache(rawPayload, {
5853
+ isMessagePreviewUpdated: options.isMessagePreviewUpdated,
5854
+ });
5855
+ try {
5856
+ await getChannelMarkers(markerIds);
5857
+ }
5858
+ catch (e) {
5859
+ // empty block (from the spec, allow marker fetch to fail without having to do anything)
5860
+ }
5861
+ }
5862
+ }
5863
+ // convert raw channel to internal channel
5864
+ const channels = rawPayload.channels.map(payload => convertFromRaw(payload, { isMessagePreviewUpdated: options.isMessagePreviewUpdated }));
5865
+ // convert raw channel user to membership (add user object)
5866
+ const channelUsers = rawPayload.channelUsers.map(channelUser => {
5867
+ return convertRawMembershipToMembership(channelUser);
5868
+ });
5869
+ const users = rawPayload.users.map(convertRawUserToInternalUser);
5870
+ const restRawPayload = __rest(rawPayload, ["messageFeedsInfo", "messagePreviews"]);
5871
+ return Object.assign(Object.assign({}, restRawPayload), { users,
5872
+ channels,
5873
+ channelUsers });
5874
+ };
5875
+
5876
+ /**
5877
+ * ```js
5878
+ * import { getSubChannelMarkers } from '@amityco/ts-sdk'
5879
+ * const subChannelMarkers = await getSubChannelMarkers(['sch1', 'sch2'])
5880
+ * ```
5881
+ *
5882
+ * Fetches a paginable list of {@link Amity.SubChannelMarker} objects
5883
+ *
5884
+ * @param messageFeedIds the feed IDs of the {@link Amity.RawSubChannel} marker to fetch
5885
+ * @param page
5886
+ * @returns A page of {@link Amity.SubChannelMarker} objects
5887
+ *
5888
+ * @category Channel API
5889
+ * @async
5890
+ * @private
5891
+ */
5892
+ const getUserMessageFeedMakers = async (channelIds) => {
5893
+ const client = getActiveClient();
5894
+ client.log('channel/getUserMessageFeedMakers', channelIds);
5895
+ const { data } = await client.http.get(`/api/v1/markers/user-message-feed`, {
5896
+ params: {
5897
+ channelIds,
5898
+ },
5899
+ });
5900
+ fireEvent('local.userMessageFeedMarker.fetched', { userMessageFeedMarker: data });
5901
+ return data;
5902
+ };
5903
+
5904
+ const prepareUnreadCountInfo = async (rawPayload) => {
5905
+ const client = getActiveClient();
5906
+ // if consistent mode is enabled, persist the unread count info to the cache
5907
+ // Marker service API uses channelInternalId as channelId
5908
+ const queryPayload = await getUserMessageFeedMakers(rawPayload.channels.map(({ channelInternalId }) => channelInternalId));
5909
+ const { feedMarkers, userFeedMarkers } = queryPayload;
5910
+ persistUnreadCountInfo({
5911
+ feedMarkers,
5912
+ userFeedMarkers,
5913
+ });
5914
+ client.log('channel/prepareUnreadCountInfo', rawPayload.channels);
5915
+ };
5916
+
5917
+ const getCachedMarker$2 = (entityId) => {
5918
+ var _a;
5919
+ const key = {
5920
+ entityId,
5921
+ userId: getActiveUser()._id,
5922
+ };
5923
+ return (_a = pullFromCache([
5924
+ 'channelMarker',
5925
+ 'get',
5926
+ getResolver('channelMarker')(key),
5927
+ ])) === null || _a === void 0 ? void 0 : _a.data;
5928
+ };
5929
+ const getUnreadInfoCached$1 = (channelId) => {
5930
+ var _a;
5931
+ return (_a = pullFromCache(['channelUnreadInfo', 'get', channelId])) === null || _a === void 0 ? void 0 : _a.data;
5932
+ };
5933
+ /**
5934
+ * The function use to get value of hasMentioned or isMentioned field.
5935
+ * function will get the value from marker params first, if there is no hasMentioned field, will look in to the cache.
5936
+ *
5937
+ * If consistent mode is enabled, the function will return the value from the channelUnreadCountInfo cache.
5938
+ * If not, the function will return the value from the channelMarker cache.
5939
+ * If not found in the both cache, use `false` as defaul value.
5940
+ */
5941
+ const getChannelIsMentioned = (channel, marker) => {
5942
+ var _a, _b, _c, _d;
5943
+ const client = getActiveClient();
5944
+ if (client.isUnreadCountEnabled && client.getMarkerSyncConsistentMode()) {
5945
+ return (_b = (_a = getUnreadInfoCached$1(channel.channelPublicId)) === null || _a === void 0 ? void 0 : _a.isMentioned) !== null && _b !== void 0 ? _b : false;
5946
+ }
5947
+ return (marker === null || marker === void 0 ? void 0 : marker.hasMentioned) !== undefined
5948
+ ? marker === null || marker === void 0 ? void 0 : marker.hasMentioned
5949
+ : (_d = (_c = getCachedMarker$2(channel.channelPublicId)) === null || _c === void 0 ? void 0 : _c.hasMentioned) !== null && _d !== void 0 ? _d : false;
5950
+ };
5951
+
5952
+ const getCachedMarker$1 = (entityId) => {
5953
+ var _a;
5954
+ const key = {
5955
+ entityId,
5956
+ userId: getActiveUser()._id,
5957
+ };
5958
+ return (_a = pullFromCache([
5959
+ 'channelMarker',
5960
+ 'get',
5961
+ getResolver('channelMarker')(key),
5962
+ ])) === null || _a === void 0 ? void 0 : _a.data;
5963
+ };
5964
+ const getUnreadInfoCached = (channelId) => {
5965
+ var _a;
5966
+ return (_a = pullFromCache(['channelUnreadInfo', 'get', channelId])) === null || _a === void 0 ? void 0 : _a.data;
5967
+ };
5968
+ /**
5969
+ * The function use to get value of unreadCount field.
5970
+ * function will get the value from marker params first, if there is no hasMentioned field, will look in to the cache.
5971
+ *
5972
+ * If consistent mode is enabled, the function will return the value from the channelUnreadCountInfo cache.
5973
+ * If not, the function will return the value from the channelMarker cache.
5974
+ * If not found in the both cache, use `0` as defaul value.
5975
+ */
5976
+ const getSubChannelsUnreadCount = (channel, marker) => {
5977
+ var _a, _b, _c, _d, _e;
5978
+ const client = getActiveClient();
5979
+ if (client.isUnreadCountEnabled && client.getMarkerSyncConsistentMode()) {
5980
+ // Marker service API uses channelInternalId as channelId
5981
+ return (_b = (_a = getUnreadInfoCached(channel.channelInternalId)) === null || _a === void 0 ? void 0 : _a.unreadCount) !== null && _b !== void 0 ? _b : 0;
5982
+ }
5983
+ if (marker === null || marker === void 0 ? void 0 : marker.isDeleted) {
5984
+ // NOTE: This is a temporary solution to handle the channel marker when the user is forced to
5985
+ // leave the channel because currently backend can't handle this, so every time a user is banned
5986
+ // from a channel or the channel is deleted the channel's unread count will reset to zero
5987
+ return 0;
5988
+ }
5989
+ return (_e = (_c = marker === null || marker === void 0 ? void 0 : marker.unreadCount) !== null && _c !== void 0 ? _c : (_d = getCachedMarker$1(channel.channelInternalId)) === null || _d === void 0 ? void 0 : _d.unreadCount) !== null && _e !== void 0 ? _e : 0;
5990
+ };
5991
+
5992
+ const getLegacyChannelUnread = (channelId) => {
5993
+ var _a;
5994
+ return (_a = pullFromCache(['channelUnread', 'get', channelId])) === null || _a === void 0 ? void 0 : _a.data;
5995
+ };
5996
+
5997
+ const constructChannelDynamicValue = (channel) => {
5998
+ const client = getActiveClient();
5999
+ const rest = __rest(channel, ["messageCount"]);
6000
+ return shallowClone(rest, {
6001
+ get unreadCount() {
6002
+ var _a, _b;
6003
+ return (_b = (_a = getLegacyChannelUnread(rest.channelId)) === null || _a === void 0 ? void 0 : _a.unreadCount) !== null && _b !== void 0 ? _b : 0;
6004
+ },
6005
+ get subChannelsUnreadCount() {
6006
+ return getSubChannelsUnreadCount(rest);
6007
+ },
6008
+ get isMentioned() {
6009
+ var _a, _b;
6010
+ if (client.useLegacyUnreadCount)
6011
+ return (_b = (_a = getLegacyChannelUnread(rest.channelId)) === null || _a === void 0 ? void 0 : _a.isMentioned) !== null && _b !== void 0 ? _b : false;
6012
+ return getChannelIsMentioned(rest);
6013
+ },
6014
+ });
6015
+ };
6016
+
6017
+ const ANALYTIC_CACHE_KEY = ['analytic', 'normal-priority'];
6018
+ const HIGH_PRIORITY_ANALYTIC_CACHE_KEY = ['analytic', 'high-priority'];
6019
+
6020
+ const syncEvent = async (events) => {
6021
+ const client = getActiveClient();
6022
+ const params = {
6023
+ activities: events,
6024
+ };
6025
+ await client.http.post('/api/v1/analytics/activities', params);
6026
+ };
6027
+
6028
+ class AnalyticsEventSyncer {
6029
+ constructor() {
6030
+ this._timer = undefined;
6031
+ this._high_priority_timer = undefined;
6032
+ }
6033
+ start() {
6034
+ this.syncCapturedEvent();
6035
+ this._timer = setInterval(() => {
6036
+ this.syncCapturedEvent();
6037
+ }, 1 * MINUTE);
6038
+ this._high_priority_timer = setInterval(() => {
6039
+ this.syncHighPriorityCapturedEvent();
6040
+ }, 10 * SECOND$1);
6041
+ }
6042
+ stop() {
6043
+ if (this._timer) {
6044
+ clearInterval(this._timer);
6045
+ this._timer = undefined;
6046
+ }
6047
+ if (this._high_priority_timer) {
6048
+ clearInterval(this._high_priority_timer);
6049
+ this._high_priority_timer = undefined;
6050
+ }
6051
+ }
6052
+ async syncCapturedEvent() {
6053
+ try {
6054
+ // Must query only objects that have same userId with current logged-in user.
6055
+ // Query captured event with maximum of 1000
6056
+ // Order by latest first
6057
+ // e.g., If there are 2000 events we will query 1000-2000 first
6058
+ const cache = pullFromCache(ANALYTIC_CACHE_KEY);
6059
+ if (!(cache === null || cache === void 0 ? void 0 : cache.data))
6060
+ return;
6061
+ if (cache.data.event.length === 0)
6062
+ return;
6063
+ const capturedEvents = cache.data.event;
6064
+ await syncEvent(capturedEvents);
6065
+ dropFromCache(ANALYTIC_CACHE_KEY);
6066
+ }
6067
+ catch (error) {
6068
+ // stop and destroy all events
6069
+ this.stop();
6070
+ dropFromCache(ANALYTIC_CACHE_KEY);
6071
+ }
6072
+ }
6073
+ async syncHighPriorityCapturedEvent() {
6074
+ try {
6075
+ // Must query only objects that have same userId with current logged-in user.
6076
+ // Query captured event with maximum of 1000
6077
+ // Order by latest first
6078
+ // e.g., If there are 2000 events we will query 1000-2000 first
6079
+ const cache = pullFromCache(HIGH_PRIORITY_ANALYTIC_CACHE_KEY);
6080
+ if (!(cache === null || cache === void 0 ? void 0 : cache.data))
6081
+ return;
6082
+ if (cache.data.event.length === 0)
6083
+ return;
6084
+ const capturedEvents = cache.data.event;
6085
+ await syncEvent(capturedEvents);
6086
+ dropFromCache(HIGH_PRIORITY_ANALYTIC_CACHE_KEY);
6087
+ }
6088
+ catch (error) {
6089
+ // stop and destroy all events
6090
+ this.stop();
6091
+ dropFromCache(HIGH_PRIORITY_ANALYTIC_CACHE_KEY);
6092
+ }
6093
+ }
6094
+ }
6095
+
6096
+ class AnalyticsEventCapturer {
6097
+ constructor() {
6098
+ this._expireTime = 5 * MINUTE;
6099
+ this._poolLimit = 1000;
6100
+ this._recentViewed = {};
6101
+ this._recentHighPriorityViewed = {};
6102
+ // Story
6103
+ this._throttleStoryTimer = undefined;
6104
+ this._bufferNewSeenStoryReferenceIds = [];
6105
+ }
6106
+ isAbleToEnqueue({ uniqueId, expireTime, isHighPriority = false, }) {
6107
+ const now = new Date();
6108
+ // Get the recent view date (if any)
6109
+ const recentViewedDate = isHighPriority
6110
+ ? this._recentHighPriorityViewed[uniqueId]
6111
+ : this._recentViewed[uniqueId];
6112
+ // If this is the first view, always allow it
6113
+ if (!recentViewedDate) {
6114
+ return true;
6115
+ }
6116
+ const timeDiff = now.getTime() - recentViewedDate.getTime();
6117
+ if (timeDiff < expireTime) {
6118
+ // just recently view this post, ignore the event.
6119
+ return false;
6120
+ }
6121
+ return true;
6122
+ }
6123
+ markAs({ uniqueId, contentId, contentType, activityType, metadata, }) {
6124
+ if (!this.isAbleToEnqueue({ uniqueId, expireTime: this._expireTime }))
6125
+ return;
6126
+ const now = new Date();
6127
+ const currentData = { event: [] };
6128
+ const cache = pullFromCache(ANALYTIC_CACHE_KEY);
6129
+ if (cache === null || cache === void 0 ? void 0 : cache.data) {
6130
+ currentData.event = cache.data.event;
6131
+ }
6132
+ // If the pool is full (Max 1000 items), remove the oldest data
4996
6133
  if (currentData.event.length >= this._poolLimit) {
4997
6134
  // Remove oldest data
4998
6135
  currentData.event.shift();
@@ -5176,20 +6313,6 @@ var AnalyticsEngine$1 = {
5176
6313
  },
5177
6314
  };
5178
6315
 
5179
- const userLinkedObject = (user) => {
5180
- return Object.assign(Object.assign({}, user), { get avatar() {
5181
- var _a;
5182
- if (!user.avatarFileId)
5183
- return undefined;
5184
- const avatar = (_a = pullFromCache([
5185
- 'file',
5186
- 'get',
5187
- `${user.avatarFileId}`,
5188
- ])) === null || _a === void 0 ? void 0 : _a.data;
5189
- return avatar;
5190
- } });
5191
- };
5192
-
5193
6316
  class StoryComputedValue {
5194
6317
  constructor(targetId, lastStoryExpiresAt, lastStorySeenExpiresAt) {
5195
6318
  this._syncingStoriesCount = 0;
@@ -5621,7 +6744,7 @@ const postLinkedObject = (post) => {
5621
6744
  } });
5622
6745
  };
5623
6746
 
5624
- const getCachedMarker$2 = (message) => {
6747
+ const getCachedMarker = (message) => {
5625
6748
  var _a, _b;
5626
6749
  const key = {
5627
6750
  creatorId: 'creatorPrivateId' in message ? message.creatorPrivateId : message.creatorId,
@@ -5639,7 +6762,7 @@ const getMessageReadCount = (message, marker) => {
5639
6762
  // Look in the marker param first
5640
6763
  return (_a = marker !== null && marker !== void 0 ? marker :
5641
6764
  // If the marker param is not set, look in the cache
5642
- getCachedMarker$2(message)) !== null && _a !== void 0 ? _a : { readCount: 0, deliveredCount: 0 };
6765
+ getCachedMarker(message)) !== null && _a !== void 0 ? _a : { readCount: 0, deliveredCount: 0 };
5643
6766
  }; // and if not found in cache use default value `0`
5644
6767
 
5645
6768
  /**
@@ -5882,31 +7005,6 @@ const markAsReadBySegment = async ({ subChannelId, readToSegment, }) => {
5882
7005
  }
5883
7006
  };
5884
7007
 
5885
- const reCalculateChannelUnreadInfo = (channelId) => {
5886
- var _a;
5887
- const cacheKeyChannelUnread = ['channelUnreadInfo', 'get', channelId];
5888
- const cacheChannelUnreadInfo = (_a = pullFromCache(cacheKeyChannelUnread)) === null || _a === void 0 ? void 0 : _a.data;
5889
- const cacheKeySubChannelUnread = ['subChannelUnreadInfo', 'get'];
5890
- const cachedSubChannelUnreadInfo = queryCache(cacheKeySubChannelUnread);
5891
- let channelUnreads = 0;
5892
- let isMentioned = false;
5893
- if (cachedSubChannelUnreadInfo && (cachedSubChannelUnreadInfo === null || cachedSubChannelUnreadInfo === void 0 ? void 0 : cachedSubChannelUnreadInfo.length) > 0) {
5894
- const subChannelUnreadsInfo = cachedSubChannelUnreadInfo === null || cachedSubChannelUnreadInfo === void 0 ? void 0 : cachedSubChannelUnreadInfo.filter(({ data }) => {
5895
- return data.channelId === channelId && !data.isDeleted;
5896
- });
5897
- channelUnreads = subChannelUnreadsInfo
5898
- .map(({ data }) => data.unreadCount)
5899
- .reduce((acc, cur) => acc + cur, 0);
5900
- isMentioned = subChannelUnreadsInfo.some(({ data }) => data.isMentioned);
5901
- }
5902
- const channelUnreadInfo = Object.assign(Object.assign({}, (cacheChannelUnreadInfo !== null && cacheChannelUnreadInfo !== void 0 ? cacheChannelUnreadInfo : {
5903
- channelId,
5904
- createdAt: new Date().toISOString(),
5905
- })), { updatedAt: new Date().toISOString(), unreadCount: channelUnreads, isMentioned });
5906
- pushToCache(cacheKeyChannelUnread, channelUnreadInfo);
5907
- return channelUnreadInfo;
5908
- };
5909
-
5910
7008
  class LegacyMessageReadReceiptSyncEngine {
5911
7009
  constructor() {
5912
7010
  this.isActive = true;
@@ -6192,24 +7290,6 @@ const markAsRead = async (channelId) => {
6192
7290
  return true;
6193
7291
  };
6194
7292
 
6195
- /**
6196
- * ```js
6197
- * import { shallowClone } from '~/utils/shallowClone'
6198
- * const newObj = shallowClone(obj)
6199
- * ```
6200
- *
6201
- * Clone an object with same prototype and properties
6202
- *
6203
- * @param obj the object to clone
6204
- * @returns new object with same prototype and properties
6205
- *
6206
- * @category utility
6207
- * @private
6208
- */
6209
- function shallowClone(source, target) {
6210
- return Object.create(Object.getPrototypeOf(source), Object.assign(Object.assign({}, Object.getOwnPropertyDescriptors(source)), Object.getOwnPropertyDescriptors(target)));
6211
- }
6212
-
6213
7293
  const channelLinkedObject = (channel) => {
6214
7294
  return shallowClone(channel, {
6215
7295
  markAsRead: () => markAsRead(channel.channelInternalId),
@@ -6285,1063 +7365,1283 @@ const notificationTrayLinkedObject = (noti) => {
6285
7365
  return Object.assign(Object.assign({}, noti), { isSeen: noti.lastSeenAt > noti.lastOccurredAt, isRecent: new Date(noti.lastOccurredAt).getTime() >= Date.now() - WEEK, users: noti.actors
6286
7366
  .map(({ publicId }) => pullFromCache(['user', 'get', publicId]))
6287
7367
  .filter(isNonNullable)
6288
- .map(({ data }) => data)
6289
- .map(user => userLinkedObject(user)) });
6290
- };
6291
-
6292
- const LinkedObject = {
6293
- ad: adLinkedObject,
6294
- comment: commentLinkedObject,
6295
- post: postLinkedObject,
6296
- user: userLinkedObject,
6297
- category: categoryLinkedObject,
6298
- stream: streamLinkedObject,
6299
- story: storyLinkedObject,
6300
- storyTarget: storyTargetLinkedObject,
6301
- message: messageLinkedObject,
6302
- reactor: reactorLinkedObject,
6303
- channel: channelLinkedObject,
6304
- pinnedPost: pinnedPostLinkedObject,
6305
- notificationTray: notificationTrayLinkedObject,
6306
- };
6307
-
6308
- const getChannelMessagePreviewWithUser = (channel) => {
6309
- var _a;
6310
- const messagePreview = channel.messagePreviewId
6311
- ? getChannelMessagePreview(channel.channelId)
6312
- : null;
6313
- const internalUser = (_a = pullFromCache([
6314
- 'user',
6315
- 'get',
6316
- messagePreview === null || messagePreview === void 0 ? void 0 : messagePreview.creatorId,
6317
- ])) === null || _a === void 0 ? void 0 : _a.data;
6318
- const messagePreviewWithUser = messagePreview
6319
- ? Object.assign(Object.assign({}, messagePreview), { user: internalUser ? LinkedObject.user(internalUser) : undefined }) : null;
6320
- return Object.assign(Object.assign({}, channel), { messagePreview: messagePreviewWithUser });
6321
- };
6322
-
6323
- const updateChannelMessagePreviewCache = (rawPayload) => {
6324
- var _a, _b;
6325
- const withMessageFeedInfo = (messagePreview) => {
6326
- var _a;
6327
- const messageFeedInfo = (_a = rawPayload.messageFeedsInfo) === null || _a === void 0 ? void 0 : _a.find(messageFeed => {
6328
- return messageFeed.messageFeedId === messagePreview.messageFeedId;
6329
- });
6330
- const { channelPublicId: channelId, messageFeedId: subChannelId, data, dataType, isDeleted, segment, creatorPublicId: creatorId, createdAt, updatedAt, } = messagePreview;
6331
- return {
6332
- channelId,
6333
- subChannelId,
6334
- data,
6335
- dataType,
6336
- isDeleted,
6337
- segment,
6338
- creatorId,
6339
- createdAt,
6340
- updatedAt,
6341
- subChannelName: messageFeedInfo === null || messageFeedInfo === void 0 ? void 0 : messageFeedInfo.name,
6342
- messagePreviewId: messageFeedInfo === null || messageFeedInfo === void 0 ? void 0 : messageFeedInfo.messagePreviewId,
6343
- subChannelUpdatedAt: messageFeedInfo === null || messageFeedInfo === void 0 ? void 0 : messageFeedInfo.updatedAt,
6344
- };
6345
- };
6346
- const newData = {
6347
- messagePreviewChannel: (_b = (_a = rawPayload.messagePreviews) === null || _a === void 0 ? void 0 : _a.map(messagePreview => withMessageFeedInfo(messagePreview))) !== null && _b !== void 0 ? _b : [],
6348
- };
6349
- ingestInCache(newData);
6350
- };
6351
-
6352
- const getSubChannelMessagePreview = (subChannelId) => {
6353
- var _a, _b;
6354
- return ((_b = (_a = pullFromCache(['messagePreviewSubChannel', 'get', subChannelId])) === null || _a === void 0 ? void 0 : _a.data) !== null && _b !== void 0 ? _b : null);
6355
- };
6356
-
6357
- const getSubChannelMessagePreviewWithUser = (subChannel) => {
6358
- var _a;
6359
- const messagePreview = subChannel.messagePreviewId
6360
- ? getSubChannelMessagePreview(subChannel.subChannelId)
6361
- : null;
6362
- const messagePreviewWithUser = messagePreview
6363
- ? Object.assign(Object.assign({}, messagePreview), { user: (_a = pullFromCache(['user', 'get', messagePreview === null || messagePreview === void 0 ? void 0 : messagePreview.creatorId])) === null || _a === void 0 ? void 0 : _a.data }) : null;
6364
- return Object.assign(Object.assign({}, subChannel), { messagePreview: messagePreviewWithUser });
6365
- };
6366
-
6367
- const updateSubChannelMessagePreviewCache = (rawPayload) => {
6368
- var _a, _b;
6369
- const withMessageFeedInfo = (messagePreview) => {
6370
- var _a;
6371
- const messageFeedInfo = (_a = rawPayload.messageFeeds) === null || _a === void 0 ? void 0 : _a.find(messageFeed => {
6372
- return messageFeed.messageFeedId === messagePreview.messageFeedId;
6373
- });
6374
- const { channelPublicId: channelId, messageFeedId: subChannelId, messageId: messagePreviewId, creatorPublicId: creatorId, data, dataType, isDeleted, segment, createdAt, updatedAt, } = messagePreview;
6375
- return {
6376
- messagePreviewId,
6377
- channelId,
6378
- subChannelId,
6379
- data,
6380
- dataType,
6381
- isDeleted,
6382
- segment,
6383
- creatorId,
6384
- createdAt,
6385
- updatedAt,
6386
- subChannelName: messageFeedInfo === null || messageFeedInfo === void 0 ? void 0 : messageFeedInfo.name,
6387
- subChannelUpdatedAt: messageFeedInfo === null || messageFeedInfo === void 0 ? void 0 : messageFeedInfo.updatedAt,
6388
- };
6389
- };
6390
- const newData = {
6391
- messagePreviewSubChannel: (_b = (_a = rawPayload.messages) === null || _a === void 0 ? void 0 : _a.map(messagePreview => withMessageFeedInfo(messagePreview))) !== null && _b !== void 0 ? _b : [],
6392
- };
6393
- ingestInCache(newData);
7368
+ .map(({ data }) => data)
7369
+ .map(user => userLinkedObject(user)) });
6394
7370
  };
6395
7371
 
6396
- function updateSubChannelCache(subChannelId, subChannel, params) {
6397
- pushToCache(['subChannel', 'get', subChannelId],
6398
- // eslint-disable-next-line prefer-object-spread
6399
- shallowClone(subChannel, params));
6400
- }
6401
-
6402
- /**
6403
- * ```js
6404
- * import { isInTombstone } from '@amityco/ts-sdk'
6405
- * const user = isInTombstone(["message", "messageId"])
6406
- * ```
6407
- *
6408
- * Checks if the {@link Amity.TombstoneCacheOptions} exists
6409
- * in cache and it's not expired means it's in tombstone
6410
- * and we throw an Error
6411
- *
6412
- * @param model the model to check
6413
- * @param modelId the object id to check
6414
- * @returns the matching cache entry, or undefined.
7372
+ /*
7373
+ * verifies membership status
7374
+ */
7375
+ function isMember(membership) {
7376
+ return membership !== 'none';
7377
+ }
7378
+ /*
7379
+ * checks if currently logged in user is part of the community
7380
+ */
7381
+ function isCurrentUserPartOfCommunity(c, m) {
7382
+ const { userId } = getActiveUser();
7383
+ return c.communityId === m.communityId && m.userId === userId;
7384
+ }
7385
+ /*
7386
+ * For mqtt events server will not send user specific data as it's broadcasted
7387
+ * to multiple users and it also does not include communityUser
6415
7388
  *
6416
- * @category Cache API
7389
+ * Client SDK needs to check for the existing isJoined field in cache data before calculating.
7390
+ * Althought this can be calculated, it's not scalable.
6417
7391
  */
6418
- const isInTombstone = (model, modelId) => {
6419
- const { log, cache } = getActiveClient();
6420
- const key = [model, CACHE_KEY_TOMBSTONE, modelId];
6421
- if (!cache)
6422
- return;
6423
- log('cache/api/isInTombstone', key);
6424
- const isInTombstone = pullFromCache(key);
6425
- const { lifeSpan } = queryOptions('cache_then_server', CACHE_LIFESPAN_TOMBSTONE);
6426
- if (isInTombstone && isFresh(isInTombstone.data, lifeSpan)) {
6427
- throw new ASCApiError('Item not found!', 400400 /* Amity.ServerError.ITEM_NOT_FOUND */, "error" /* Amity.ErrorLevel.ERROR */);
6428
- }
7392
+ function updateMembershipStatus(communities, communityUsers) {
7393
+ return communities.map(c => {
7394
+ const cachedCommunity = pullFromCache([
7395
+ 'community',
7396
+ 'get',
7397
+ c.communityId,
7398
+ ]);
7399
+ if ((cachedCommunity === null || cachedCommunity === void 0 ? void 0 : cachedCommunity.data) && (cachedCommunity === null || cachedCommunity === void 0 ? void 0 : cachedCommunity.data.hasOwnProperty('isJoined'))) {
7400
+ return Object.assign(Object.assign({}, cachedCommunity.data), c);
7401
+ }
7402
+ const isJoined = communityUsers.some(m => isCurrentUserPartOfCommunity(c, m) && isMember(m.communityMembership));
7403
+ return Object.assign(Object.assign({}, c), { isJoined });
7404
+ });
7405
+ }
7406
+
7407
+ const getMatchPostSetting = (value) => {
7408
+ var _a;
7409
+ return (_a = Object.keys(CommunityPostSettingMaps).find(key => value.needApprovalOnPostCreation ===
7410
+ CommunityPostSettingMaps[key].needApprovalOnPostCreation &&
7411
+ value.onlyAdminCanPost === CommunityPostSettingMaps[key].onlyAdminCanPost)) !== null && _a !== void 0 ? _a : DefaultCommunityPostSetting;
7412
+ };
7413
+ function addPostSetting({ communities }) {
7414
+ return communities.map((_a) => {
7415
+ var { needApprovalOnPostCreation, onlyAdminCanPost } = _a, restCommunityPayload = __rest(_a, ["needApprovalOnPostCreation", "onlyAdminCanPost"]);
7416
+ return (Object.assign({ postSetting: getMatchPostSetting({
7417
+ needApprovalOnPostCreation,
7418
+ onlyAdminCanPost,
7419
+ }) }, restCommunityPayload));
7420
+ });
7421
+ }
7422
+ const prepareCommunityPayload = (rawPayload) => {
7423
+ const communitiesWithPostSetting = addPostSetting({ communities: rawPayload.communities });
7424
+ // Convert users to internal format
7425
+ const internalUsers = rawPayload.users.map(convertRawUserToInternalUser);
7426
+ // map users with community
7427
+ const mappedCommunityUsers = rawPayload.communityUsers.map(communityUser => {
7428
+ const user = internalUsers.find(user => user.userId === communityUser.userId);
7429
+ return Object.assign(Object.assign({}, communityUser), { user });
7430
+ });
7431
+ const communityWithMembershipStatus = updateMembershipStatus(communitiesWithPostSetting, mappedCommunityUsers);
7432
+ return Object.assign(Object.assign({}, rawPayload), { users: rawPayload.users.map(convertRawUserToInternalUser), communities: communityWithMembershipStatus, communityUsers: mappedCommunityUsers });
7433
+ };
7434
+ const prepareCommunityJoinRequestPayload = (rawPayload) => {
7435
+ const mappedJoinRequests = rawPayload.joinRequests.map(joinRequest => {
7436
+ return Object.assign(Object.assign({}, joinRequest), { joinRequestId: joinRequest._id });
7437
+ });
7438
+ const users = rawPayload.users.map(convertRawUserToInternalUser);
7439
+ return Object.assign(Object.assign({}, rawPayload), { joinRequests: mappedJoinRequests, users });
7440
+ };
7441
+ const prepareCommunityMembershipPayload = (rawPayload) => {
7442
+ const communitiesWithPostSetting = addPostSetting({ communities: rawPayload.communities });
7443
+ // map users with community
7444
+ const mappedCommunityUsers = rawPayload.communityUsers.map(communityUser => {
7445
+ const user = rawPayload.users.find(user => user.userId === communityUser.userId);
7446
+ return Object.assign(Object.assign({}, communityUser), { user });
7447
+ });
7448
+ const communityWithMembershipStatus = updateMembershipStatus(communitiesWithPostSetting, mappedCommunityUsers);
7449
+ return Object.assign(Object.assign({}, rawPayload), { communities: communityWithMembershipStatus, communityUsers: mappedCommunityUsers });
7450
+ };
7451
+ const prepareCommunityRequest = (params) => {
7452
+ const { postSetting = undefined, storySetting } = params, restParam = __rest(params, ["postSetting", "storySetting"]);
7453
+ return Object.assign(Object.assign(Object.assign({}, restParam), (postSetting ? CommunityPostSettingMaps[postSetting] : undefined)), {
7454
+ // Convert story setting to the actual value. (Allow by default)
7455
+ allowCommentInStory: typeof (storySetting === null || storySetting === void 0 ? void 0 : storySetting.enableComment) === 'boolean' ? storySetting.enableComment : true });
7456
+ };
7457
+ const prepareSemanticSearchCommunityPayload = (_a) => {
7458
+ var communityPayload = __rest(_a, ["searchResult"]);
7459
+ const processedCommunityPayload = prepareCommunityPayload(communityPayload);
7460
+ return Object.assign({}, processedCommunityPayload);
6429
7461
  };
6430
7462
 
7463
+ /* begin_public_function
7464
+ id: joinRequest.approve
7465
+ */
6431
7466
  /**
6432
7467
  * ```js
6433
- * import { getMessageMarkers } from '@amityco/ts-sdk'
6434
- * const messageMarkers = await getMessageMarkers(['sch1', 'sch2'])
7468
+ * import { joinRequest } from '@amityco/ts-sdk'
7469
+ * const isAccepted = await joinRequest.approve()
6435
7470
  * ```
6436
7471
  *
6437
- * Fetches a list of {@link Amity.MessageMarker} by messageIds
7472
+ * Accepts a {@link Amity.JoinRequest} object
6438
7473
  *
6439
- * @param messageIds the feed IDs of the {@link Amity.RawMessage} marker to fetch
6440
- * @returns A list of {@link Amity.MessageMarker} by messageIds
7474
+ * @param joinRequest the {@link Amity.JoinRequest} to accept
7475
+ * @returns A success boolean if the {@link Amity.JoinRequest} was accepted
6441
7476
  *
6442
- * @category Channel API
7477
+ * @category Join Request API
6443
7478
  * @async
6444
- * @private
6445
7479
  */
6446
- const getMessageMarkers = async (messageIds) => {
7480
+ const approveJoinRequest = async (joinRequest) => {
7481
+ var _a;
6447
7482
  const client = getActiveClient();
6448
- client.log('channel/getMessageMarkers', messageIds);
6449
- const { data: queryPayload } = await client.http.get(`/api/v1/markers/messages`, {
7483
+ client.log('joinRequest/approveJoinRequest', joinRequest.joinRequestId);
7484
+ const { data } = await client.http.post(`/api/v4/communities/${joinRequest.targetId}/join/approve`, {
6450
7485
  params: {
6451
- messageIds,
7486
+ userId: joinRequest.userId,
6452
7487
  },
6453
7488
  });
6454
- const { contentMarkers, feedMarkers, userMarkers } = queryPayload;
6455
- const cachedAt = client.cache && Date.now();
6456
- if (client.cache)
6457
- ingestInCache({ contentMarkers, feedMarkers, userMarkers }, { cachedAt });
6458
- fireEvent('local.feedMarker.fetched', { feedMarkers });
6459
- fireEvent('local.messageMarker.fetched', { contentMarkers });
6460
- fireEvent('local.userMarker.fetched', { userMarkers });
6461
- return { data: contentMarkers, cachedAt };
6462
- };
6463
-
6464
- const persistUnreadCountInfo = (payload) => {
6465
- const { feedMarkers, userFeedMarkers } = payload;
6466
- // calculate sub channel unread info and channel unread info
6467
- if (feedMarkers.length > 0 && userFeedMarkers.length > 0) {
6468
- const channelIds = [];
6469
- const feedMarkerMap = new Map(feedMarkers.map(fm => [fm.feedId, fm]));
6470
- userFeedMarkers.forEach(userFeedMarker => {
6471
- const feedMarker = feedMarkerMap.get(userFeedMarker.feedId);
6472
- if (!feedMarker)
6473
- return;
6474
- if (feedMarker.feedId === userFeedMarker.feedId) {
6475
- const unreadCount = feedMarker.lastSegment - userFeedMarker.readToSegment;
6476
- const subChannelUnreadInfo = {
6477
- subChannelId: feedMarker.feedId,
6478
- channelId: feedMarker.entityId,
6479
- readToSegment: userFeedMarker.readToSegment,
6480
- lastSegment: feedMarker.lastSegment,
6481
- lastMentionSegment: userFeedMarker.lastMentionSegment,
6482
- unreadCount: Math.max(0, unreadCount),
6483
- isMentioned: userFeedMarker.isMentioned,
6484
- isDeleted: feedMarker.isDeleted,
6485
- createdAt: userFeedMarker.createdAt,
6486
- updatedAt: userFeedMarker.updatedAt,
6487
- };
6488
- // update sub channel unread info in cache
6489
- ingestInCache({ subChannelUnreadInfo: [subChannelUnreadInfo] });
6490
- if (!channelIds.includes(feedMarker.entityId)) {
6491
- channelIds.push(feedMarker.entityId);
6492
- }
6493
- }
6494
- });
6495
- // re-calculate channel unread info in cache
6496
- channelIds.forEach(channelId => {
6497
- reCalculateChannelUnreadInfo(channelId);
7489
+ // TODO : Check cache id
7490
+ const joinRequestCache = (_a = pullFromCache([
7491
+ 'joinRequest',
7492
+ 'get',
7493
+ joinRequest.joinRequestId,
7494
+ ])) === null || _a === void 0 ? void 0 : _a.data;
7495
+ if (joinRequestCache) {
7496
+ upsertInCache(['joinRequest', 'get', joinRequest.joinRequestId], {
7497
+ status: "approved" /* JoinRequestStatusEnum.Approved */,
6498
7498
  });
7499
+ fireEvent('local.joinRequest.updated', [joinRequestCache]);
6499
7500
  }
6500
- };
7501
+ return data.success;
7502
+ };
7503
+ /* end_public_function */
6501
7504
 
7505
+ /* begin_public_function
7506
+ id: joinRequest.cancel
7507
+ */
6502
7508
  /**
6503
7509
  * ```js
6504
- * import { getSubChannelMarkers } from '@amityco/ts-sdk'
6505
- * const subChannelMarkers = await getSubChannelMarkers(['sch1', 'sch2'])
7510
+ * import { joinRequest } from '@amityco/ts-sdk'
7511
+ * const isCanceled = await joinRequest.cancel()
6506
7512
  * ```
6507
7513
  *
6508
- * Fetches a paginable list of {@link Amity.SubChannelMarker} objects
7514
+ * Cancels a {@link Amity.JoinRequest} object
6509
7515
  *
6510
- * @param messageFeedIds the feed IDs of the {@link Amity.RawSubChannel} marker to fetch
6511
- * @param page
6512
- * @returns A page of {@link Amity.SubChannelMarker} objects
7516
+ * @param joinRequest the {@link Amity.JoinRequest} to cancel
7517
+ * @returns A success boolean if the {@link Amity.JoinRequest} was canceled
6513
7518
  *
6514
- * @category Channel API
7519
+ * @category Join Request API
6515
7520
  * @async
6516
- * @private
6517
7521
  */
6518
- const getSubChannelMarkers = async (messageFeedIds, page = { limit: 100 }) => {
7522
+ const cancelJoinRequest = async (joinRequest) => {
7523
+ var _a;
6519
7524
  const client = getActiveClient();
6520
- client.log('channel/getSubChannelMarkers', messageFeedIds, page);
6521
- const { data: queryPayload } = await client.http.get(`/api/v1/markers/message-feeds`, {
7525
+ client.log('joinRequest/cancelJoinRequest', joinRequest.joinRequestId);
7526
+ const { data } = await client.http.delete(`/api/v4/communities/${joinRequest.targetId}/join`, {
6522
7527
  params: {
6523
- messageFeedIds,
6524
- options: {
6525
- token: toToken(page, 'skiplimit'),
6526
- },
7528
+ userId: joinRequest.userId,
6527
7529
  },
6528
7530
  });
6529
- const { paging } = queryPayload, payload = __rest(queryPayload, ["paging"]);
6530
- const { userEntityMarkers: userEntityMarkersPayload, userFeedMarkers: userFeedMarkersPayload, userMarkers, feedMarkers: feedMarkersPayload, } = payload;
6531
- // if consistent mode is enabled, persist the unread count info to the cache
6532
- if (client.isUnreadCountEnabled && client.getMarkerSyncConsistentMode()) {
6533
- persistUnreadCountInfo({
6534
- feedMarkers: feedMarkersPayload,
6535
- userFeedMarkers: userFeedMarkersPayload,
6536
- });
6537
- }
6538
- const userEntityMarkers = convertChannelMarkerResponse(userEntityMarkersPayload);
6539
- const userFeedMarkers = convertSubChannelMarkerResponse(userFeedMarkersPayload);
6540
- const cachedAt = client.cache && Date.now();
6541
- if (client.cache)
6542
- ingestInCache({ userEntityMarkers, userFeedMarkers, userMarkers }, { cachedAt });
6543
- fireEvent('local.channelMarker.fetched', { userEntityMarkers });
6544
- fireEvent('local.subChannelMarker.fetched', { userFeedMarkers });
6545
- fireEvent('local.userMarker.fetched', { userMarkers });
6546
- const nextPage = toPage(paging.next);
6547
- const prevPage = toPage(paging.previous);
6548
- return { data: userFeedMarkers, cachedAt, prevPage, nextPage };
6549
- };
6550
-
6551
- const getUserMarker = async () => {
6552
- const client = getActiveClient();
6553
- client.log('channel/getUserMarker');
6554
- const { data: payload } = await client.http.get(`/api/v1/markers/userMarker`);
6555
- const { userMarkers } = payload;
6556
- const cachedAt = client.cache && Date.now();
6557
- if (client.cache)
6558
- ingestInCache({ userMarkers }, { cachedAt });
6559
- fireEvent('local.userMarker.fetched', { userMarkers });
6560
- const latestUserMarker = userMarkers.reduce((maxUserMarker, userMarker) => {
6561
- if (maxUserMarker == null ||
6562
- new Date(maxUserMarker.lastSyncAt).getTime() < new Date(userMarker.lastSyncAt).getTime()) {
6563
- return userMarker;
6564
- }
6565
- return maxUserMarker;
6566
- }, undefined);
6567
- return { data: latestUserMarker, cachedAt };
6568
- };
6569
-
6570
- /** @hidden */
6571
- /*
6572
- * @param message payload from http request without myReactions
6573
- * add myReactions to http response if the event was a reaction event
6574
- */
6575
- const prepareMessagePayloadForCache = (payload, reactors, event) => {
6576
- const client = getActiveClient();
6577
- const cached = pullFromCache(['message', 'get', payload.messageId]);
6578
- // '[]' in cases where the new reaction is the first one
6579
- const myReactions = (cached === null || cached === void 0 ? void 0 : cached.data.myReactions) || [];
6580
- // add myReactions to the payload
6581
- Object.assign(payload, { myReactions });
6582
- // check if there are any updates to the reactions
6583
- const latestReaction = reactors[0];
6584
- const isLatestReactionMine = latestReaction && latestReaction.userId === client.userId;
6585
- if (!isLatestReactionMine) {
6586
- return;
6587
- }
6588
- // new reaction added
6589
- if (event === 'message.reactionAdded' && !myReactions.includes(latestReaction.reactionName)) {
6590
- Object.assign(payload, {
6591
- myReactions: [...myReactions, latestReaction.reactionName],
6592
- });
7531
+ const joinRequestCache = (_a = pullFromCache([
7532
+ 'joinRequest',
7533
+ 'get',
7534
+ joinRequest.joinRequestId,
7535
+ ])) === null || _a === void 0 ? void 0 : _a.data;
7536
+ if (joinRequestCache) {
7537
+ dropFromCache(['joinRequest', 'get', joinRequest.joinRequestId]);
7538
+ fireEvent('local.joinRequest.deleted', [joinRequestCache]);
6593
7539
  }
6594
- // existing reaction removed
6595
- if (event === 'message.reactionRemoved' && myReactions.includes(latestReaction.reactionName)) {
6596
- Object.assign(payload, {
6597
- myReactions: myReactions.filter(x => x !== latestReaction.reactionName),
7540
+ return data.success;
7541
+ };
7542
+ /* end_public_function */
7543
+
7544
+ /* begin_public_function
7545
+ id: joinRequest.reject
7546
+ */
7547
+ /**
7548
+ * ```js
7549
+ * import { joinRequest } from '@amityco/ts-sdk'
7550
+ * const isRejected = await joinRequest.reject()
7551
+ * ```
7552
+ *
7553
+ * Rejects a {@link Amity.JoinRequest} object
7554
+ *
7555
+ * @param joinRequest the {@link Amity.JoinRequest} to reject
7556
+ * @returns A success boolean if the {@link Amity.JoinRequest} was rejected
7557
+ *
7558
+ * @category Join Request API
7559
+ * @async
7560
+ */
7561
+ const rejectJoinRequest = async (joinRequest) => {
7562
+ var _a;
7563
+ const client = getActiveClient();
7564
+ client.log('joinRequest/rejectJoinRequest', joinRequest.joinRequestId);
7565
+ const { data } = await client.http.post(`/api/v4/communities/${joinRequest.targetId}/join/reject`);
7566
+ const joinRequestCache = (_a = pullFromCache([
7567
+ 'joinRequest',
7568
+ 'get',
7569
+ joinRequest.joinRequestId,
7570
+ ])) === null || _a === void 0 ? void 0 : _a.data;
7571
+ if (joinRequestCache) {
7572
+ upsertInCache(['joinRequest', 'get', joinRequest.joinRequestId], {
7573
+ status: "rejected" /* JoinRequestStatusEnum.Rejected */,
6598
7574
  });
7575
+ fireEvent('local.joinRequest.updated', [joinRequestCache]);
6599
7576
  }
7577
+ return data.success;
7578
+ };
7579
+ /* end_public_function */
7580
+
7581
+ const joinRequestLinkedObject = (joinRequest) => {
7582
+ return Object.assign(Object.assign({}, joinRequest), { get user() {
7583
+ const cacheData = pullFromCache(['user', 'get', joinRequest.userId]);
7584
+ if (cacheData === null || cacheData === void 0 ? void 0 : cacheData.data)
7585
+ return userLinkedObject(cacheData.data);
7586
+ return undefined;
7587
+ }, cancel: async () => {
7588
+ await cancelJoinRequest(joinRequest);
7589
+ }, approve: async () => {
7590
+ await approveJoinRequest(joinRequest);
7591
+ }, reject: async () => {
7592
+ await rejectJoinRequest(joinRequest);
7593
+ } });
6600
7594
  };
6601
7595
 
6602
- /*
6603
- * This is a simple utility that infers the value of isDeleted based on the
6604
- * value of includeDeleted
7596
+ /* begin_public_function
7597
+ id: community.getMyJoinRequest
7598
+ */
7599
+ /**
7600
+ * ```js
7601
+ * import { community } from '@amityco/ts-sdk'
7602
+ * const isJoined = await community.getMyJoinRequest('foobar')
7603
+ * ```
6605
7604
  *
6606
- * There are two important things to note here:
6607
- * 1. `includeDeleted` is purely client side query param and not recognized by
6608
- * the server
6609
- * 2. The only values we wish to expose with regards to `isDeleted` (the server
6610
- * param for queries) is false | undefined and want to disallow users to query
6611
- * for deleted entities
7605
+ * Joins a {@link Amity.Community} object
6612
7606
  *
6613
- * Although this is a very simple utility, it's only purpose is to keep things
6614
- * DRY
7607
+ * @param communityId the {@link Amity.Community} to join
7608
+ * @returns A success boolean if the {@link Amity.Community} was joined
7609
+ *
7610
+ * @category Community API
7611
+ * @async
6615
7612
  */
6616
- const inferIsDeleted = (includeDeleted) => includeDeleted === true ? undefined : false;
7613
+ const getMyJoinRequest = async (communityId) => {
7614
+ const client = getActiveClient();
7615
+ client.log('community/myJoinRequest', communityId);
7616
+ const { data: payload } = await client.http.get(`/api/v4/communities/${communityId}/join/me`);
7617
+ const data = prepareCommunityJoinRequestPayload(payload);
7618
+ const cachedAt = client.cache && Date.now();
7619
+ if (client.cache)
7620
+ ingestInCache(data, { cachedAt });
7621
+ return {
7622
+ data: data.joinRequests[0] ? joinRequestLinkedObject(data.joinRequests[0]) : undefined,
7623
+ cachedAt,
7624
+ };
7625
+ };
7626
+ /* end_public_function */
6617
7627
 
6618
- function getSubChannelIsMentioned(channelId, subChannelId, marker) {
6619
- var _a, _b;
6620
- // Look for `unreadCount` in the marker param first
6621
- if (marker) {
6622
- return marker.hasMentioned;
6623
- }
7628
+ /* begin_public_function
7629
+ id: community.join
7630
+ */
7631
+ /**
7632
+ * ```js
7633
+ * import { community } from '@amityco/ts-sdk'
7634
+ * const isJoined = await community.join('foobar')
7635
+ * ```
7636
+ *
7637
+ * Joins a {@link Amity.Community} object
7638
+ *
7639
+ * @param communityId the {@link Amity.Community} to join
7640
+ * @returns A status join result
7641
+ *
7642
+ * @category Community API
7643
+ * @async
7644
+ */
7645
+ const joinRequest = async (communityId) => {
6624
7646
  const client = getActiveClient();
6625
- // If consistent mode is enabled, look in the SubChannelUnreadCountInfo cache
6626
- if (client.isUnreadCountEnabled && client.getMarkerSyncConsistentMode()) {
6627
- const cachedUnreadCount = (_a = pullFromCache([
6628
- 'subChannelUnreadInfo',
6629
- 'get',
6630
- subChannelId,
6631
- ])) === null || _a === void 0 ? void 0 : _a.data;
6632
- if (cachedUnreadCount) {
6633
- return cachedUnreadCount.isMentioned;
6634
- }
6635
- return false;
7647
+ client.log('community/joinRequest', communityId);
7648
+ const { data: payload } = await client.http.post(`/api/v4/communities/${communityId}/join`);
7649
+ const data = prepareCommunityJoinRequestPayload(payload);
7650
+ const cachedAt = client.cache && Date.now();
7651
+ if (client.cache)
7652
+ ingestInCache(data, { cachedAt });
7653
+ fireEvent('local.community.join', data.joinRequests);
7654
+ const status = data.joinRequests.length === 0 ? "success" /* JoinResultStatusEnum.Success */ : "pending" /* JoinResultStatusEnum.Pending */;
7655
+ return status === "success" /* JoinResultStatusEnum.Success */
7656
+ ? { status }
7657
+ : { status, request: joinRequestLinkedObject(data.joinRequests[0]) };
7658
+ };
7659
+ /* end_public_function */
7660
+
7661
+ class PaginationController {
7662
+ constructor(queryParams) {
7663
+ const { http } = getActiveClient();
7664
+ this.queryParams = queryParams;
7665
+ this.http = http;
6636
7666
  }
6637
- const key = {
6638
- entityId: channelId,
6639
- feedId: subChannelId,
6640
- userId: getActiveUser()._id,
6641
- };
6642
- // If the marker param is not set, look in the cache
6643
- const cachedMarker = (_b = pullFromCache([
6644
- 'subChannelMarker',
6645
- 'get',
6646
- getResolver('subChannelMarker')(key),
6647
- ])) === null || _b === void 0 ? void 0 : _b.data;
6648
- if (cachedMarker) {
6649
- return cachedMarker.hasMentioned;
7667
+ loadFirstPage() {
7668
+ return this.onFetch("first" /* Amity.LiveCollectionPageDirection.FIRST */);
6650
7669
  }
6651
- // and if not found in cache use default value `false`
6652
- return false;
6653
- }
6654
-
6655
- function getSubChannelUnreadCount(channelId, subChannelId, marker) {
6656
- var _a, _b;
6657
- // Look for `unreadCount` in the marker param first
6658
- if (marker) {
6659
- return marker.unreadCount;
7670
+ loadNextPage() {
7671
+ return this.onFetch("next" /* Amity.LiveCollectionPageDirection.NEXT */);
6660
7672
  }
6661
- const client = getActiveClient();
6662
- // If consistent mode is enabled, look in the SubChannelUnreadCountInfo cache
6663
- if (client.isUnreadCountEnabled && client.getMarkerSyncConsistentMode()) {
6664
- const cachedUnreadCount = (_a = pullFromCache([
6665
- 'subChannelUnreadInfo',
6666
- 'get',
6667
- subChannelId,
6668
- ])) === null || _a === void 0 ? void 0 : _a.data;
6669
- if (cachedUnreadCount) {
6670
- return cachedUnreadCount.isDeleted ? 0 : cachedUnreadCount.unreadCount;
7673
+ loadPreviousPage() {
7674
+ return this.onFetch("prev" /* Amity.LiveCollectionPageDirection.PREV */);
7675
+ }
7676
+ async onFetch(direction = "first" /* Amity.LiveCollectionPageDirection.FIRST */) {
7677
+ var _a, _b, _c, _d;
7678
+ if (direction === 'prev' && !this.previousToken)
7679
+ return;
7680
+ if (direction === 'next' && !this.nextToken)
7681
+ return;
7682
+ let token;
7683
+ if (direction === 'prev')
7684
+ token = this.previousToken;
7685
+ if (direction === 'next')
7686
+ token = this.nextToken;
7687
+ const queryResponse = await this.getRequest(this.queryParams, token);
7688
+ if (direction === 'first') {
7689
+ this.nextToken = (_a = queryResponse.paging) === null || _a === void 0 ? void 0 : _a.next;
7690
+ this.previousToken = (_b = queryResponse.paging) === null || _b === void 0 ? void 0 : _b.previous;
6671
7691
  }
6672
- return 0;
7692
+ if (direction === 'prev')
7693
+ this.previousToken = (_c = queryResponse.paging) === null || _c === void 0 ? void 0 : _c.previous;
7694
+ if (direction === 'next')
7695
+ this.nextToken = (_d = queryResponse.paging) === null || _d === void 0 ? void 0 : _d.next;
7696
+ return queryResponse;
6673
7697
  }
6674
- const key = {
6675
- entityId: channelId,
6676
- feedId: subChannelId,
6677
- userId: getActiveUser()._id,
6678
- };
6679
- // If the marker param is not set, look in the cache
6680
- const cachedMarker = (_b = pullFromCache([
6681
- 'subChannelMarker',
6682
- 'get',
6683
- getResolver('subChannelMarker')(key),
6684
- ])) === null || _b === void 0 ? void 0 : _b.data;
6685
- if (cachedMarker) {
6686
- return cachedMarker.unreadCount;
7698
+ getNextToken() {
7699
+ return this.nextToken;
7700
+ }
7701
+ getPrevToken() {
7702
+ return this.previousToken;
6687
7703
  }
6688
- // and if not found in cache use default value `0`
6689
- return 0;
6690
7704
  }
6691
7705
 
6692
- const MARKER_INCLUDED_SUB_CHANNEL_TYPE$1 = ['broadcast', 'conversation', 'community'];
6693
- const isUnreadCountSupport$2 = ({ channelType }) => MARKER_INCLUDED_SUB_CHANNEL_TYPE$1.includes(channelType);
6694
- function convertFromRaw$2(_a) {
6695
- var { channelId, channelPublicId, channelType, childCount, creatorId, creatorPublicId, lastMessageId, lastMessageTimestamp, messageFeedId, name } = _a, rest = __rest(_a, ["channelId", "channelPublicId", "channelType", "childCount", "creatorId", "creatorPublicId", "lastMessageId", "lastMessageTimestamp", "messageFeedId", "name"]);
6696
- return Object.assign(Object.assign({ get unreadCount() {
6697
- return getSubChannelUnreadCount(channelId, messageFeedId);
6698
- },
6699
- get hasMentioned() {
6700
- return getSubChannelIsMentioned(channelId, messageFeedId);
6701
- },
6702
- get isMentioned() {
6703
- return getSubChannelIsMentioned(channelId, messageFeedId);
6704
- } }, rest), { channelId: channelPublicId, creatorId: creatorPublicId, displayName: name, lastActivity: lastMessageTimestamp, latestMessageId: lastMessageId, messageCount: childCount, subChannelId: messageFeedId, isUnreadCountSupport: isUnreadCountSupport$2({ channelType }) });
7706
+ /**
7707
+ * TODO: handle cache receive cache option, and cache policy
7708
+ * TODO: check if querybyIds is supported
7709
+ */
7710
+ class JoinRequestsPaginationController extends PaginationController {
7711
+ async getRequest(queryParams, token) {
7712
+ const { limit = COLLECTION_DEFAULT_PAGINATION_LIMIT, communityId } = queryParams, params = __rest(queryParams, ["limit", "communityId"]);
7713
+ const options = token ? { token } : { limit };
7714
+ const { data: queryResponse } = await this.http.get(`/api/v4/communities/${communityId}/join`, {
7715
+ params: Object.assign(Object.assign({}, params), { options }),
7716
+ });
7717
+ return queryResponse;
7718
+ }
6705
7719
  }
6706
7720
 
6707
- const mergePayloadWithLocal = (payload) => {
6708
- var _a, _b, _c;
6709
- const localMessage = (_b = (_a = queryCache(['message', 'get'])) === null || _a === void 0 ? void 0 : _a.find(({ data }) => data.messageId === payload.messageId)) === null || _b === void 0 ? void 0 : _b.data;
6710
- if (localMessage) {
6711
- return Object.assign(Object.assign(Object.assign({}, localMessage), payload), {
6712
- // NOTE: referenceId is missing in the some payload event. If we have local message data with referenceId, use it instead.
6713
- referenceId: (_c = localMessage.referenceId) !== null && _c !== void 0 ? _c : payload.referenceId });
7721
+ class QueryStreamController {
7722
+ constructor(query, cacheKey) {
7723
+ this.query = query;
7724
+ this.cacheKey = cacheKey;
6714
7725
  }
6715
- return payload;
6716
- };
6717
- function convertFromRaw$1(message, reactors, event) {
6718
- var _a;
6719
- const mergeMessage = mergePayloadWithLocal(message);
6720
- const { channelPublicId, childCount, creatorPublicId, mentionedUsers, messageFeedId, myReactions, reactionCount, reactions, referenceId, segment, messageId, creatorId } = mergeMessage, rest = __rest(mergeMessage, ["channelPublicId", "childCount", "creatorPublicId", "mentionedUsers", "messageFeedId", "myReactions", "reactionCount", "reactions", "referenceId", "segment", "messageId", "creatorId"]);
6721
- let cache;
6722
- if (referenceId) {
6723
- cache = pullFromCache(['message', 'get', referenceId]);
7726
+ }
7727
+
7728
+ var EnumJoinRequestAction;
7729
+ (function (EnumJoinRequestAction) {
7730
+ EnumJoinRequestAction["OnLocalJoinRequestCreated"] = "OnLocalJoinRequestCreated";
7731
+ EnumJoinRequestAction["OnLocalJoinRequestUpdated"] = "OnLocalJoinRequestUpdated";
7732
+ EnumJoinRequestAction["OnLocalJoinRequestDeleted"] = "OnLocalJoinRequestDeleted";
7733
+ })(EnumJoinRequestAction || (EnumJoinRequestAction = {}));
7734
+
7735
+ class JoinRequestsQueryStreamController extends QueryStreamController {
7736
+ constructor(query, cacheKey, notifyChange, preparePayload) {
7737
+ super(query, cacheKey);
7738
+ this.notifyChange = notifyChange;
7739
+ this.preparePayload = preparePayload;
6724
7740
  }
6725
- if (!cache) {
6726
- cache = pullFromCache(['message', 'get', messageId]);
7741
+ async saveToMainDB(response) {
7742
+ const processedPayload = await this.preparePayload(response);
7743
+ const client = getActiveClient();
7744
+ const cachedAt = client.cache && Date.now();
7745
+ if (client.cache) {
7746
+ ingestInCache(processedPayload, { cachedAt });
7747
+ }
6727
7748
  }
6728
- const out = Object.assign(Object.assign({}, rest), { messageId, channelId: channelPublicId, channelSegment: segment, childrenNumber: childCount, creatorId: creatorPublicId, creatorPrivateId: message.creatorId, reactions: reactions !== null && reactions !== void 0 ? reactions : {},
6729
- /*
6730
- * Previously, myReactions were added only if it was part of the payload.
6731
- * So empty myReactions were not present. So I've edited the payload to add
6732
- * a default for those cases.
6733
- *
6734
- * Check git blame for previous iteration
6735
- */
6736
- myReactions: myReactions || ((_a = cache === null || cache === void 0 ? void 0 : cache.data.myReactions) !== null && _a !== void 0 ? _a : []), reactionsCount: reactionCount, subChannelId: messageFeedId, uniqueId: cache ? cache.data.uniqueId : messageId, referenceId, syncState: "synced" /* Amity.SyncState.Synced */ });
6737
- if (mentionedUsers) {
6738
- out.mentionees = mentionedUsers.map(mention => {
6739
- if (mention.type === 'channel') {
6740
- return mention;
7749
+ appendToQueryStream(response, direction, refresh = false) {
7750
+ var _a, _b;
7751
+ if (refresh) {
7752
+ pushToCache(this.cacheKey, {
7753
+ data: response.joinRequests.map(joinRequest => getResolver('joinRequest')({ joinRequestId: joinRequest._id })),
7754
+ });
7755
+ }
7756
+ else {
7757
+ const collection = (_a = pullFromCache(this.cacheKey)) === null || _a === void 0 ? void 0 : _a.data;
7758
+ const joinRequests = (_b = collection === null || collection === void 0 ? void 0 : collection.data) !== null && _b !== void 0 ? _b : [];
7759
+ pushToCache(this.cacheKey, Object.assign(Object.assign({}, collection), { data: [
7760
+ ...new Set([
7761
+ ...joinRequests,
7762
+ ...response.joinRequests.map(joinRequest => getResolver('joinRequest')({ joinRequestId: joinRequest._id })),
7763
+ ]),
7764
+ ] }));
7765
+ }
7766
+ }
7767
+ reactor(action) {
7768
+ return (joinRequest) => {
7769
+ var _a;
7770
+ const collection = (_a = pullFromCache(this.cacheKey)) === null || _a === void 0 ? void 0 : _a.data;
7771
+ if (!collection)
7772
+ return;
7773
+ if (action === EnumJoinRequestAction.OnLocalJoinRequestUpdated) {
7774
+ const isExist = collection.data.find(id => id === joinRequest[0].joinRequestId);
7775
+ if (!isExist)
7776
+ return;
6741
7777
  }
6742
- return { type: 'user', userIds: mention.userPublicIds };
6743
- });
7778
+ if (action === EnumJoinRequestAction.OnLocalJoinRequestCreated) {
7779
+ collection.data = [
7780
+ ...new Set([
7781
+ ...joinRequest.map(joinRequest => joinRequest.joinRequestId),
7782
+ ...collection.data,
7783
+ ]),
7784
+ ];
7785
+ }
7786
+ if (action === EnumJoinRequestAction.OnLocalJoinRequestDeleted) {
7787
+ collection.data = collection.data.filter(id => id !== joinRequest[0].joinRequestId);
7788
+ }
7789
+ pushToCache(this.cacheKey, collection);
7790
+ this.notifyChange({ origin: "event" /* Amity.LiveDataOrigin.EVENT */, loading: false });
7791
+ };
6744
7792
  }
6745
- if (reactors && reactors.length && event) {
6746
- // mqtt event
6747
- prepareMessagePayloadForCache(out, reactors, event);
7793
+ subscribeRTE(createSubscriber) {
7794
+ return createSubscriber.map(subscriber => subscriber.fn(this.reactor(subscriber.action)));
6748
7795
  }
6749
- return out;
7796
+ }
7797
+
7798
+ function isObject(value) {
7799
+ return typeof value === 'object' && value !== null;
6750
7800
  }
6751
- const preUpdateMessageCache = (rawPayload) => {
6752
- ingestInCache({
6753
- messages: rawPayload.messages.map(message => convertFromRaw$1(message, rawPayload.reactions)),
7801
+ /**
7802
+ * convert all object getter property to static value
7803
+ */
7804
+ const convertGetterPropsToStatic = (obj) => {
7805
+ if (!isObject(obj)) {
7806
+ return obj;
7807
+ }
7808
+ const entries = Object.entries(obj).map(([key, value]) => {
7809
+ const descriptor = Object.getOwnPropertyDescriptor(obj, key);
7810
+ if (typeof (descriptor === null || descriptor === void 0 ? void 0 : descriptor.get) === 'function') {
7811
+ return [key, descriptor.get.call(obj)];
7812
+ }
7813
+ return [key, value];
6754
7814
  });
7815
+ return Object.fromEntries(entries);
6755
7816
  };
6756
- const DEBOUNCE_TIME = 2000;
6757
- const currentDebounceMap = {};
6758
- const prepareMessagePayload = async (payload, event) => {
6759
- const markerIds = payload.messages.map(({ messageId }) => messageId);
6760
- if (markerIds.length > 0) {
6761
- // since the get markers method requires a channel cache to function with the reducer.
6762
- preUpdateMessageCache(payload);
6763
- const markerIdsKey = markerIds.join('');
6764
- if (currentDebounceMap[markerIdsKey]) {
6765
- clearTimeout(currentDebounceMap[markerIdsKey]);
7817
+ const removeFunctionProperties = (obj) => {
7818
+ if (!isObject(obj)) {
7819
+ return obj;
7820
+ }
7821
+ const entries = Object.entries(obj).map(([key, value]) => {
7822
+ if (typeof value === 'function') {
7823
+ return [key, undefined];
6766
7824
  }
6767
- currentDebounceMap[markerIdsKey] = setTimeout(() => {
6768
- try {
6769
- getMessageMarkers(markerIds);
6770
- }
6771
- catch (_error) {
6772
- // do nothing
6773
- }
6774
- }, DEBOUNCE_TIME);
7825
+ return [key, value];
7826
+ });
7827
+ return Object.fromEntries(entries);
7828
+ };
7829
+
7830
+ class PaginationNoPageController {
7831
+ constructor(queryParams) {
7832
+ const { http } = getActiveClient();
7833
+ this.queryParams = queryParams;
7834
+ this.http = http;
6775
7835
  }
6776
- const { messageFeeds } = payload, restPayload = __rest(payload, ["messageFeeds"]);
6777
- // upsert messageFeeds to subchannel cache because messageFeeds from event payload not include messagePreviewId
6778
- if (messageFeeds && messageFeeds.length > 0) {
6779
- messageFeeds === null || messageFeeds === void 0 ? void 0 : messageFeeds.forEach(messageFeed => {
6780
- var _a, _b;
6781
- const subChannelCache = (_b = (_a = pullFromCache(['subChannel', 'get', messageFeed.messageFeedId])) === null || _a === void 0 ? void 0 : _a.data) !== null && _b !== void 0 ? _b : {};
6782
- // exclude getter properties from existing subChannel cache, update only other properties to existing subChannel cache
6783
- const _c = convertFromRaw$2(messageFeed), restSubChannel = __rest(_c, ["unreadCount", "isMentioned"]);
6784
- updateSubChannelCache(messageFeed.messageFeedId, subChannelCache, restSubChannel);
6785
- });
7836
+ async onFetch() {
7837
+ const queryResponse = await this.getRequest(this.queryParams);
7838
+ return queryResponse;
6786
7839
  }
6787
- return Object.assign(Object.assign({}, restPayload), { messages: payload.messages.map(m => convertFromRaw$1(m, payload.reactions, event)) });
6788
- };
6789
- function convertParams(_a) {
6790
- var { subChannelId, mentionees, dataType, data } = _a, rest = __rest(_a, ["subChannelId", "mentionees", "dataType", "data"]);
6791
- if (dataType === MessageContentType.IMAGE || dataType === MessageContentType.FILE) {
6792
- return Object.assign({ messageFeedId: subChannelId, mentionedUsers: mentionees, dataType, data: Object.assign({ caption: '' }, data) }, rest);
7840
+ }
7841
+
7842
+ class LiveCollectionController {
7843
+ constructor(paginationController, queryStreamId, cacheKey, callback) {
7844
+ this.paginationController = paginationController;
7845
+ this.queryStreamId = queryStreamId;
7846
+ this.cacheKey = cacheKey;
7847
+ this.callback = callback;
6793
7848
  }
6794
- return Object.assign({ messageFeedId: subChannelId, mentionedUsers: mentionees, dataType, data }, rest);
6795
- }
6796
- function convertQueryParams$1(_a) {
6797
- var { sortBy, subChannelId, includingTags, excludingTags, includeDeleted, aroundMessageId, limit, type } = _a, rest = __rest(_a, ["sortBy", "subChannelId", "includingTags", "excludingTags", "includeDeleted", "aroundMessageId", "limit", "type"]);
6798
- const out = Object.assign(Object.assign({}, rest), { messageFeedId: subChannelId, isDeleted: inferIsDeleted(includeDeleted), options: {
6799
- sortBy,
6800
- limit: limit || COLLECTION_DEFAULT_PAGINATION_LIMIT,
6801
- around: aroundMessageId,
6802
- } });
6803
- if (includingTags) {
6804
- out.includeTags = includingTags;
7849
+ async refresh() {
7850
+ try {
7851
+ let result;
7852
+ if (this.paginationController instanceof PaginationNoPageController) {
7853
+ result = await this.paginationController.onFetch();
7854
+ }
7855
+ else {
7856
+ result = await this.paginationController.loadFirstPage();
7857
+ }
7858
+ if (!result)
7859
+ return;
7860
+ await this.persistModel(result);
7861
+ this.persistQueryStream({
7862
+ response: result,
7863
+ direction: "next" /* Amity.LiveCollectionPageDirection.NEXT */,
7864
+ refresh: true,
7865
+ });
7866
+ this.notifyChange({ origin: "server" /* Amity.LiveDataOrigin.SERVER */, loading: false });
7867
+ }
7868
+ catch (e) {
7869
+ this.notifyChange({ origin: "server" /* Amity.LiveDataOrigin.SERVER */, loading: false, error: e });
7870
+ }
6805
7871
  }
6806
- if (type) {
6807
- out.dataType = type;
7872
+ loadPage({ initial = false, direction = "next" /* Amity.LiveCollectionPageDirection.NEXT */, }) {
7873
+ this.setup();
7874
+ this.notifyChange({ origin: "local" /* Amity.LiveDataOrigin.LOCAL */, loading: true });
7875
+ if (initial) {
7876
+ this.refresh();
7877
+ }
7878
+ else if (direction === "prev" /* Amity.LiveCollectionPageDirection.PREV */) {
7879
+ this.loadPrevPage();
7880
+ }
7881
+ else if (direction === "next" /* Amity.LiveCollectionPageDirection.NEXT */) {
7882
+ this.loadNextPage();
7883
+ }
6808
7884
  }
6809
- if (excludingTags) {
6810
- out.excludeTags = excludingTags;
7885
+ async loadNextPage() {
7886
+ try {
7887
+ if (this.paginationController instanceof PaginationNoPageController)
7888
+ return;
7889
+ const result = await this.paginationController.loadNextPage();
7890
+ if (!result)
7891
+ return;
7892
+ await this.persistModel(result);
7893
+ this.persistQueryStream({
7894
+ response: result,
7895
+ direction: "next" /* Amity.LiveCollectionPageDirection.NEXT */,
7896
+ });
7897
+ this.notifyChange({ origin: "server" /* Amity.LiveDataOrigin.SERVER */, loading: false });
7898
+ }
7899
+ catch (e) {
7900
+ this.notifyChange({ origin: "server" /* Amity.LiveDataOrigin.SERVER */, loading: false, error: e });
7901
+ }
6811
7902
  }
6812
- return out;
6813
- }
6814
-
6815
- const MARKER_INCLUDED_SUB_CHANNEL_TYPE = ['broadcast', 'conversation', 'community'];
6816
- /**
6817
- * Filter sub channel by type. Only conversation, community and broadcast type are included.
6818
- */
6819
- const isUnreadCountSupport$1 = ({ channelType }) => MARKER_INCLUDED_SUB_CHANNEL_TYPE.includes(channelType);
6820
- const preUpdateSubChannelCache = (rawPayload) => {
6821
- ingestInCache({
6822
- messageFeeds: rawPayload.messageFeeds.map(messageFeed => convertFromRaw$2(messageFeed)),
6823
- });
6824
- };
6825
- const prepareSubChannelPayload = async (rawPayload) => {
6826
- const markerIds = rawPayload.messageFeeds
6827
- .filter(isUnreadCountSupport$1)
6828
- .map(({ messageFeedId }) => messageFeedId);
6829
- if (markerIds.length > 0) {
6830
- // since the get markers method requires a channel cache to function with the reducer.
6831
- preUpdateSubChannelCache(rawPayload);
7903
+ async loadPrevPage() {
6832
7904
  try {
6833
- await getSubChannelMarkers(markerIds);
7905
+ if (this.paginationController instanceof PaginationNoPageController)
7906
+ return;
7907
+ const result = await this.paginationController.loadPreviousPage();
7908
+ if (!result)
7909
+ return;
7910
+ await this.persistModel(result);
7911
+ this.persistQueryStream({
7912
+ response: result,
7913
+ direction: "prev" /* Amity.LiveCollectionPageDirection.PREV */,
7914
+ });
7915
+ this.notifyChange({ origin: "server" /* Amity.LiveDataOrigin.SERVER */, loading: false });
6834
7916
  }
6835
7917
  catch (e) {
6836
- // empty block (from the spec, allow marker fetch to fail without having to do anything)
7918
+ this.notifyChange({ origin: "server" /* Amity.LiveDataOrigin.SERVER */, loading: false, error: e });
6837
7919
  }
6838
7920
  }
6839
- updateSubChannelMessagePreviewCache(rawPayload);
6840
- // attach marker to sub channel
6841
- const messageFeeds = rawPayload.messageFeeds.map(convertFromRaw$2);
6842
- const messages = rawPayload.messages.map(m => convertFromRaw$1(m));
6843
- return Object.assign(Object.assign({}, rawPayload), { messageFeeds,
6844
- messages });
6845
- };
6846
- function convertQueryParams(_a) {
6847
- var { excludeDefaultSubChannel } = _a, rest = __rest(_a, ["excludeDefaultSubChannel"]);
6848
- const out = Object.assign({}, rest);
6849
- if (excludeDefaultSubChannel !== undefined) {
6850
- out.excludeDefaultMessageFeed = excludeDefaultSubChannel;
7921
+ shouldNotify(data) {
7922
+ const newData = data.map(convertGetterPropsToStatic).map(removeFunctionProperties);
7923
+ if (isEqual(this.snapshot, newData))
7924
+ return false;
7925
+ this.snapshot = newData;
7926
+ return true;
7927
+ }
7928
+ getCacheKey() {
7929
+ return this.cacheKey;
6851
7930
  }
6852
- return out;
6853
7931
  }
6854
7932
 
6855
7933
  /**
6856
7934
  * ```js
6857
- * import { getSubChannel } from '@amityco/ts-sdk'
6858
- * const subChannel = await getSubChannel('foobar')
7935
+ * import { onJoinRequestCreated } from '@amityco/ts-sdk'
7936
+ * const dispose = onJoinRequestCreated(data => {
7937
+ * // ...
7938
+ * })
7939
+ * ```
7940
+ *
7941
+ * Fired when an {@link Amity.CommunityJoinRequestPayload} has been created
7942
+ *
7943
+ * @param callback The function to call when the event was fired
7944
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
7945
+ *
7946
+ * @category JoinRequest Events
7947
+ */
7948
+ const onJoinRequestCreated = (callback) => {
7949
+ const client = getActiveClient();
7950
+ const disposers = [
7951
+ createEventSubscriber(client, 'onJoinRequestCreated', 'local.joinRequest.created', payload => callback(payload)),
7952
+ ];
7953
+ return () => {
7954
+ disposers.forEach(fn => fn());
7955
+ };
7956
+ };
7957
+
7958
+ /**
7959
+ * ```js
7960
+ * import { onJoinRequestUpdated } from '@amityco/ts-sdk'
7961
+ * const dispose = onJoinRequestUpdated(data => {
7962
+ * // ...
7963
+ * })
6859
7964
  * ```
6860
7965
  *
6861
- * Fetches a {@link Amity.SubChannel} object
7966
+ * Fired when an {@link Amity.CommunityJoinRequestPayload} has been created
6862
7967
  *
6863
- * @param subChannelId the ID of the {@link Amity.SubChannel} to fetch
6864
- * @returns the associated {@link Amity.SubChannel} object
7968
+ * @param callback The function to call when the event was fired
7969
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
6865
7970
  *
6866
- * @category Channel API
6867
- * @async
7971
+ * @category JoinRequest Events
6868
7972
  */
6869
- const getSubChannel$1 = async (subChannelId) => {
7973
+ const onJoinRequestUpdated = (callback) => {
6870
7974
  const client = getActiveClient();
6871
- client.log('channel/getSubChannel', subChannelId);
6872
- isInTombstone('subChannel', subChannelId);
6873
- try {
6874
- const response = await client.http.get(`/api/v5/message-feeds/${encodeURIComponent(subChannelId)}`);
6875
- const data = await prepareSubChannelPayload(response.data);
6876
- const cachedAt = client.cache && Date.now();
6877
- if (client.cache)
6878
- ingestInCache(data, { cachedAt });
6879
- fireEvent('local.message-feed.fetched', data);
6880
- return {
6881
- data: data.messageFeeds[0],
6882
- cachedAt,
6883
- };
6884
- }
6885
- catch (error) {
6886
- if (checkIfShouldGoesToTombstone(error === null || error === void 0 ? void 0 : error.code)) {
6887
- pushToTombstone('subChannel', subChannelId);
6888
- }
6889
- throw error;
6890
- }
6891
- };
7975
+ const disposers = [
7976
+ createEventSubscriber(client, 'onJoinRequestUpdated', 'local.joinRequest.updated', payload => callback(payload)),
7977
+ ];
7978
+ return () => {
7979
+ disposers.forEach(fn => fn());
7980
+ };
7981
+ };
7982
+
6892
7983
  /**
6893
7984
  * ```js
6894
- * import { getSubChannel } from '@amityco/ts-sdk'
6895
- * const subChannel = getSubChannel.locally('foobar')
7985
+ * import { onJoinRequestDeleted } from '@amityco/ts-sdk'
7986
+ * const dispose = onJoinRequestDeleted(data => {
7987
+ * // ...
7988
+ * })
6896
7989
  * ```
6897
7990
  *
6898
- * Fetches a {@link Amity.SubChannel} object from cache
7991
+ * Fired when an {@link Amity.CommunityJoinRequestPayload} has been created
6899
7992
  *
6900
- * @param subChannelId the ID of the {@link Amity.SubChannel} to fetch
6901
- * @returns the associated {@link Amity.SubChannel} object
7993
+ * @param callback The function to call when the event was fired
7994
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
6902
7995
  *
6903
- * @category Channel API
7996
+ * @category JoinRequest Events
6904
7997
  */
6905
- getSubChannel$1.locally = (subChannelId) => {
7998
+ const onJoinRequestDeleted = (callback) => {
6906
7999
  const client = getActiveClient();
6907
- client.log('channel/getSubChannel.locally', subChannelId);
6908
- if (!client.cache)
6909
- return;
6910
- const cached = pullFromCache(['subChannel', 'get', subChannelId]);
6911
- if (!cached)
6912
- return;
6913
- return {
6914
- data: cached.data,
6915
- cachedAt: cached.cachedAt,
8000
+ const disposers = [
8001
+ createEventSubscriber(client, 'onJoinRequestDeleted', 'local.joinRequest.deleted', payload => callback(payload)),
8002
+ ];
8003
+ return () => {
8004
+ disposers.forEach(fn => fn());
6916
8005
  };
6917
8006
  };
6918
8007
 
6919
- const convertDateStringToTimestamp = (dateString) => {
6920
- return new Date(dateString).getTime();
6921
- };
6922
-
6923
- const getMessagePreviewSetting$1 = async () => {
6924
- const client = getActiveClient();
6925
- return client.getMessagePreviewSetting(false);
6926
- };
6927
- const getSubChannelCache = async (subChannelId) => {
6928
- var _a;
6929
- let subChannelCache = (_a = pullFromCache(['subChannel', 'get', subChannelId])) === null || _a === void 0 ? void 0 : _a.data;
6930
- if (!subChannelCache) {
6931
- subChannelCache = (await getSubChannel$1(subChannelId)).data;
8008
+ class JoinRequestsLiveCollectionController extends LiveCollectionController {
8009
+ constructor(query, callback) {
8010
+ const queryStreamId = hash__default["default"](query);
8011
+ const cacheKey = ['joinRequest', 'collection', queryStreamId];
8012
+ const paginationController = new JoinRequestsPaginationController(query);
8013
+ super(paginationController, queryStreamId, cacheKey, callback);
8014
+ this.query = query;
8015
+ this.queryStreamController = new JoinRequestsQueryStreamController(this.query, this.cacheKey, this.notifyChange.bind(this), prepareCommunityJoinRequestPayload);
8016
+ this.callback = callback.bind(this);
8017
+ this.loadPage({ initial: true });
6932
8018
  }
6933
- return subChannelCache;
6934
- };
6935
- const isLastestMessageOnSubchannel = (message) => {
6936
- var _a;
6937
- const cache = (_a = pullFromCache([
6938
- 'messagePreviewSubChannel',
6939
- 'get',
6940
- message.subChannelId,
6941
- ])) === null || _a === void 0 ? void 0 : _a.data;
6942
- // The message payload from optimistic created event has no segment, so we check createdAt instead.
6943
- return (!cache ||
6944
- cache.segment <= message.channelSegment ||
6945
- convertDateStringToTimestamp(cache.createdAt) <= convertDateStringToTimestamp(message.createdAt));
6946
- };
6947
- const isLastestMessageOnChannel = (message) => {
6948
- var _a;
6949
- const cache = (_a = pullFromCache([
6950
- 'messagePreviewChannel',
6951
- 'get',
6952
- message.channelId,
6953
- ])) === null || _a === void 0 ? void 0 : _a.data;
6954
- return (!cache ||
6955
- convertDateStringToTimestamp(cache.createdAt) <= convertDateStringToTimestamp(message.createdAt));
6956
- };
6957
- const handleMessageCreatedOnSubChannel = async (message) => {
6958
- const messagePreviewSetting = await getMessagePreviewSetting$1();
6959
- const { channelId, messageId: messagePreviewId, creatorId, createdAt, updatedAt, data, dataType, subChannelId, channelSegment: segment, isDeleted, } = message;
6960
- // 1. get subChannel from cache, if not exist fetch from server
6961
- const subChannelCache = await getSubChannelCache(subChannelId);
6962
- // 2. if messagePreviewSetting is NO_MESSAGE_PREVEIW, update only lastActiviy in subChannel cache
6963
- if (messagePreviewSetting === "no-message-preview" /* Amity.MessagePreviewSetting.NO_MESSAGE_PREVIEW */) {
6964
- // 2.1 if the message is the latest message, update lastActivity to be createdAt in subChannel cache
6965
- if (convertDateStringToTimestamp(subChannelCache.lastActivity) <
6966
- convertDateStringToTimestamp(createdAt))
6967
- updateSubChannelCache(message.subChannelId, subChannelCache, {
6968
- lastActivity: createdAt,
8019
+ setup() {
8020
+ var _a;
8021
+ const collection = (_a = pullFromCache(this.cacheKey)) === null || _a === void 0 ? void 0 : _a.data;
8022
+ if (!collection) {
8023
+ pushToCache(this.cacheKey, {
8024
+ data: [],
8025
+ params: this.query,
6969
8026
  });
6970
- return;
8027
+ }
6971
8028
  }
6972
- // 3. if messagePreviewSetting is `NOT` NO_MESSAGE_PREVEIW, update messagePreviewSubChannel and subChannel cache
6973
- // 3.1 check if the message is the latest message, if not ignore the message.
6974
- if (!isLastestMessageOnSubchannel(message))
6975
- return;
6976
- // 3.2 if the message is the latest message, update messagePreviewSubChannel and subChannel cache
6977
- pushToCache(['messagePreviewSubChannel', 'get', message.subChannelId], {
6978
- channelId,
6979
- creatorId,
6980
- messagePreviewId,
6981
- createdAt,
6982
- updatedAt,
6983
- subChannelId,
6984
- data,
6985
- dataType,
6986
- segment,
6987
- isDeleted,
6988
- subChannelUpdatedAt: subChannelCache === null || subChannelCache === void 0 ? void 0 : subChannelCache.updatedAt,
6989
- subChannelName: subChannelCache === null || subChannelCache === void 0 ? void 0 : subChannelCache.displayName,
6990
- });
6991
- updateSubChannelCache(message.subChannelId, subChannelCache, {
6992
- lastActivity: createdAt,
6993
- messagePreviewId,
6994
- });
6995
- };
6996
- const handleMessageUpdatedOnSubChannel = async (message) => {
6997
- var _a;
6998
- const { channelId, messageId: messagePreviewId, creatorId, createdAt, updatedAt, data, dataType, subChannelId, channelSegment: segment, isDeleted, } = message;
6999
- const messagePreviewSubChannelCache = (_a = pullFromCache([
7000
- 'messagePreviewSubChannel',
7001
- 'get',
7002
- message.subChannelId,
7003
- ])) === null || _a === void 0 ? void 0 : _a.data;
7004
- // if messagePreviewSubChannel is not exist, ignore the message.
7005
- if (messagePreviewSubChannelCache &&
7006
- messagePreviewSubChannelCache.messagePreviewId === message.messageId) {
7007
- const subChannelCache = await getSubChannelCache(subChannelId);
7008
- pushToCache(['messagePreviewSubChannel', 'get', message.subChannelId], {
7009
- channelId,
7010
- creatorId,
7011
- messagePreviewId,
7012
- createdAt,
7013
- updatedAt,
7014
- subChannelId,
7015
- data,
7016
- dataType,
7017
- segment,
7018
- isDeleted,
7019
- subChannelUpdatedAt: subChannelCache.updatedAt,
7020
- subChannelName: messagePreviewSubChannelCache.subChannelName,
7021
- });
8029
+ async persistModel(queryPayload) {
8030
+ await this.queryStreamController.saveToMainDB(queryPayload);
7022
8031
  }
7023
- };
7024
- const handleMessageCreated = async (message) => {
7025
- const { channelId, messageId: messagePreviewId, creatorId, createdAt, updatedAt, data, dataType, subChannelId, channelSegment: segment, isDeleted, } = message;
7026
- if (isLastestMessageOnChannel(message)) {
7027
- const subChannelCache = await getSubChannelCache(subChannelId);
7028
- pushToCache(['messagePreviewChannel', 'get', message.channelId], {
7029
- channelId,
7030
- creatorId,
7031
- messagePreviewId,
7032
- createdAt,
7033
- updatedAt,
7034
- subChannelId,
8032
+ persistQueryStream({ response, direction, refresh, }) {
8033
+ const joinRequestResponse = response;
8034
+ this.queryStreamController.appendToQueryStream(joinRequestResponse, direction, refresh);
8035
+ }
8036
+ startSubscription() {
8037
+ return this.queryStreamController.subscribeRTE([
8038
+ { fn: onJoinRequestCreated, action: EnumJoinRequestAction.OnLocalJoinRequestCreated },
8039
+ { fn: onJoinRequestUpdated, action: EnumJoinRequestAction.OnLocalJoinRequestUpdated },
8040
+ { fn: onJoinRequestDeleted, action: EnumJoinRequestAction.OnLocalJoinRequestDeleted },
8041
+ ]);
8042
+ }
8043
+ notifyChange({ origin, loading, error }) {
8044
+ var _a;
8045
+ const collection = (_a = pullFromCache(this.cacheKey)) === null || _a === void 0 ? void 0 : _a.data;
8046
+ if (!collection)
8047
+ return;
8048
+ const data = this.applyFilter(collection.data
8049
+ .map(id => pullFromCache(['joinRequest', 'get', id]))
8050
+ .filter(isNonNullable)
8051
+ .map(({ data }) => data)
8052
+ .map(joinRequestLinkedObject));
8053
+ if (!this.shouldNotify(data) && origin === 'event')
8054
+ return;
8055
+ this.callback({
8056
+ onNextPage: () => this.loadPage({ direction: "next" /* Amity.LiveCollectionPageDirection.NEXT */ }),
7035
8057
  data,
7036
- dataType,
7037
- segment,
7038
- isDeleted,
7039
- subChannelUpdatedAt: subChannelCache === null || subChannelCache === void 0 ? void 0 : subChannelCache.updatedAt,
7040
- subChannelName: subChannelCache === null || subChannelCache === void 0 ? void 0 : subChannelCache.displayName,
8058
+ hasNextPage: !!this.paginationController.getNextToken(),
8059
+ loading,
8060
+ error,
7041
8061
  });
7042
8062
  }
8063
+ applyFilter(data) {
8064
+ let joinRequest = data;
8065
+ if (this.query.status) {
8066
+ joinRequest = joinRequest.filter(joinRequest => joinRequest.status === this.query.status);
8067
+ }
8068
+ const sortFn = (() => {
8069
+ switch (this.query.sortBy) {
8070
+ case 'firstCreated':
8071
+ return sortByFirstCreated;
8072
+ case 'lastCreated':
8073
+ return sortByLastCreated;
8074
+ default:
8075
+ return sortByLastCreated;
8076
+ }
8077
+ })();
8078
+ joinRequest = joinRequest.sort(sortFn);
8079
+ return joinRequest;
8080
+ }
8081
+ }
8082
+
8083
+ /**
8084
+ * Get Join Requests
8085
+ *
8086
+ * @param params the query parameters
8087
+ * @param callback the callback to be called when the join request are updated
8088
+ * @returns joinRequests
8089
+ *
8090
+ * @category joinRequest Live Collection
8091
+ *
8092
+ */
8093
+ const getJoinRequests = (params, callback, config) => {
8094
+ const { log, cache } = getActiveClient();
8095
+ if (!cache) {
8096
+ console.log(ENABLE_CACHE_MESSAGE);
8097
+ }
8098
+ const timestamp = Date.now();
8099
+ log(`getJoinRequests: (tmpid: ${timestamp}) > listen`);
8100
+ const joinRequestLiveCollection = new JoinRequestsLiveCollectionController(params, callback);
8101
+ const disposers = joinRequestLiveCollection.startSubscription();
8102
+ const cacheKey = joinRequestLiveCollection.getCacheKey();
8103
+ disposers.push(() => {
8104
+ dropFromCache(cacheKey);
8105
+ });
8106
+ return () => {
8107
+ log(`getJoinRequests (tmpid: ${timestamp}) > dispose`);
8108
+ disposers.forEach(fn => fn());
8109
+ };
8110
+ };
8111
+
8112
+ const convertRawInvitationToInternalInvitation = (rawInvitation) => {
8113
+ return Object.assign(Object.assign({}, rawInvitation), { createdById: rawInvitation.createdBy });
8114
+ };
8115
+
8116
+ const prepareInvitationPayload = (rawPayload) => {
8117
+ return Object.assign(Object.assign({}, rawPayload), { invitations: rawPayload.invitations.map(convertRawInvitationToInternalInvitation), users: rawPayload.users.map(convertRawUserToInternalUser) });
8118
+ };
8119
+
8120
+ /* begin_public_function
8121
+ id: invitation.createInvitations
8122
+ */
8123
+ /**
8124
+ * ```js
8125
+ * import { createInvitations } from '@amityco/ts-sdk'
8126
+ * const created = await createInvitations({
8127
+ * type: string,
8128
+ * targetType: string,
8129
+ * targetId: string,
8130
+ * userIds: string[]
8131
+ * }))
8132
+ * ```
8133
+ *
8134
+ * Creates an {@link Amity.Invitation}
8135
+ *
8136
+ * @param bundle The data necessary to create a new {@link Amity.Invitation}
8137
+ * @returns The newly created {@link Amity.Invitation}
8138
+ *
8139
+ * @category Invitation API
8140
+ * @async
8141
+ */
8142
+ const createInvitations = async (bundle) => {
8143
+ const client = getActiveClient();
8144
+ client.log('invitation/createInvitations', bundle);
8145
+ const { data: payload } = await client.http.post('/api/v1/invitations', bundle);
8146
+ const data = prepareInvitationPayload(payload);
8147
+ const cachedAt = client.cache && Date.now();
8148
+ if (client.cache)
8149
+ ingestInCache(data, { cachedAt });
8150
+ fireEvent('local.invitation.created', data.invitations);
8151
+ return {
8152
+ data: data.invitations,
8153
+ cachedAt,
8154
+ };
7043
8155
  };
7044
- const handleMessageUpdated = async (message) => {
7045
- /**
7046
- * Channel Case
7047
- */
8156
+ /* end_public_function */
8157
+
8158
+ /* begin_public_function
8159
+ id: invitation.accept
8160
+ */
8161
+ /**
8162
+ * ```js
8163
+ * import { acceptInvitation } from '@amityco/ts-sdk'
8164
+ * const isAccepted = await acceptInvitation(invitationId)
8165
+ * ```
8166
+ *
8167
+ * Accepts a {@link Amity.Invitation} object
8168
+ *
8169
+ * @param invitationId the {@link Amity.Invitation} to accept
8170
+ * @returns A success boolean if the {@link Amity.Invitation} was accepted
8171
+ *
8172
+ * @category Invitation API
8173
+ * @async
8174
+ */
8175
+ const acceptInvitation = async (invitationId) => {
7048
8176
  var _a;
7049
- const { channelId, messageId: messagePreviewId, creatorId, createdAt, updatedAt, data, dataType, subChannelId, channelSegment: segment, isDeleted, } = message;
7050
- const messagePreviewChannelCache = (_a = pullFromCache([
7051
- 'messagePreviewChannel',
8177
+ const client = getActiveClient();
8178
+ client.log('invitation/acceptInvitation', invitationId);
8179
+ const { data } = await client.http.post(`/api/v1/invitations/${invitationId}/accept`);
8180
+ const invitation = (_a = pullFromCache([
8181
+ 'invitation',
7052
8182
  'get',
7053
- message.channelId,
8183
+ invitationId,
7054
8184
  ])) === null || _a === void 0 ? void 0 : _a.data;
7055
- if (messagePreviewChannelCache &&
7056
- messagePreviewChannelCache.messagePreviewId === message.messageId) {
7057
- const subChannelCache = await getSubChannelCache(subChannelId);
7058
- pushToCache(['messagePreviewChannel', 'get', message.channelId], {
7059
- channelId,
7060
- creatorId,
7061
- messagePreviewId,
7062
- createdAt,
7063
- updatedAt,
7064
- subChannelId,
7065
- data,
7066
- dataType,
7067
- segment,
7068
- isDeleted,
7069
- subChannelUpdatedAt: subChannelCache.updatedAt,
7070
- subChannelName: messagePreviewChannelCache.subChannelName,
7071
- });
8185
+ if (invitation) {
8186
+ upsertInCache(['invitation', 'get', invitationId], { status: "approved" /* InvitationStatusEnum.Approved */ });
8187
+ fireEvent('local.invitation.updated', [invitation]);
7072
8188
  }
8189
+ return data.success;
7073
8190
  };
7074
- const handleSubChannelUpdated = async (subChannel) => {
7075
- var _a, _b, _c, _d;
7076
- const { channelId, subChannelId } = subChannel;
7077
- /** Channel Case */
7078
- const messagePreviewChannelCache = (_a = pullFromCache([
7079
- 'messagePreviewChannel',
8191
+ /* end_public_function */
8192
+
8193
+ /* begin_public_function
8194
+ id: invitation.reject
8195
+ */
8196
+ /**
8197
+ * ```js
8198
+ * import { rejectInvitation } from '@amityco/ts-sdk'
8199
+ * const isRejected = await rejectInvitation(invitationId)
8200
+ * ```
8201
+ *
8202
+ * Rejects a {@link Amity.Invitation} object
8203
+ *
8204
+ * @param invitationId the {@link Amity.Invitation} to reject
8205
+ * @returns A success boolean if the {@link Amity.Invitation} was rejected
8206
+ *
8207
+ * @category Invitation API
8208
+ * @async
8209
+ */
8210
+ const rejectInvitation = async (invitationId) => {
8211
+ var _a;
8212
+ const client = getActiveClient();
8213
+ client.log('invitation/rejectInvitation', invitationId);
8214
+ const { data } = await client.http.post(`/api/v1/invitations/${invitationId}/reject`);
8215
+ const invitation = (_a = pullFromCache([
8216
+ 'invitation',
7080
8217
  'get',
7081
- channelId,
8218
+ invitationId,
7082
8219
  ])) === null || _a === void 0 ? void 0 : _a.data;
7083
- if ((messagePreviewChannelCache === null || messagePreviewChannelCache === void 0 ? void 0 : messagePreviewChannelCache.subChannelId) === subChannelId) {
7084
- const subChannelCache = (_b = pullFromCache([
7085
- 'subChannel',
7086
- 'get',
7087
- subChannelId,
7088
- ])) === null || _b === void 0 ? void 0 : _b.data;
7089
- pushToCache(['messagePreviewChannel', 'get', channelId], Object.assign(Object.assign({}, messagePreviewChannelCache), { subChannelName: subChannelCache === null || subChannelCache === void 0 ? void 0 : subChannelCache.displayName, subChannelUpdatedAt: subChannelCache === null || subChannelCache === void 0 ? void 0 : subChannelCache.updatedAt }));
7090
- }
7091
- /** SubChannel Case */
7092
- const messagePreviewSubChannelCache = (_c = pullFromCache([
7093
- 'messagePreviewSubChannel',
7094
- 'get',
7095
- subChannelId,
7096
- ])) === null || _c === void 0 ? void 0 : _c.data;
7097
- if (messagePreviewSubChannelCache &&
7098
- new Date(messagePreviewSubChannelCache.updatedAt).valueOf() >
7099
- new Date(subChannel.updatedAt).valueOf()) {
7100
- const subChannelCache = (_d = pullFromCache([
7101
- 'subChannel',
7102
- 'get',
7103
- subChannelId,
7104
- ])) === null || _d === void 0 ? void 0 : _d.data;
7105
- pushToCache(['messagePreviewSubChannel', 'get', subChannelId], Object.assign(Object.assign({}, messagePreviewSubChannelCache), { subChannelName: subChannelCache === null || subChannelCache === void 0 ? void 0 : subChannelCache.displayName, subChannelUpdatedAt: subChannelCache === null || subChannelCache === void 0 ? void 0 : subChannelCache.updatedAt }));
8220
+ if (invitation) {
8221
+ upsertInCache(['invitation', 'get', invitationId], { status: "rejected" /* InvitationStatusEnum.Rejected */ });
8222
+ fireEvent('local.invitation.updated', [invitation]);
7106
8223
  }
7107
- };
7108
-
7109
- function convertRawUserToInternalUser(rawUser) {
7110
- return Object.assign(Object.assign({}, rawUser), { isGlobalBanned: (rawUser === null || rawUser === void 0 ? void 0 : rawUser.isGlobalBan) || false });
7111
- }
8224
+ return data.success;
8225
+ };
8226
+ /* end_public_function */
7112
8227
 
7113
- const MARKER_INCLUDED_CHANNEL_TYPE = ['broadcast', 'conversation', 'community'];
7114
- const isUnreadCountSupport = ({ type }) => MARKER_INCLUDED_CHANNEL_TYPE.includes(type);
7115
- function convertFromRaw(channel, options = { isMessagePreviewUpdated: true }) {
8228
+ /* begin_public_function
8229
+ id: invitation.cancel
8230
+ */
8231
+ /**
8232
+ * ```js
8233
+ * import { cancelInvitation } from '@amityco/ts-sdk'
8234
+ * const isCanceled = await cancelInvitation(invitationId)
8235
+ * ```
8236
+ *
8237
+ * Cancels a {@link Amity.Invitation} object
8238
+ *
8239
+ * @param invitationId the {@link Amity.Invitation} to cancel
8240
+ * @returns A success boolean if the {@link Amity.Invitation} was canceled
8241
+ *
8242
+ * @category Invitation API
8243
+ * @async
8244
+ */
8245
+ const cancelInvitation = async (invitationId) => {
7116
8246
  var _a;
7117
- let { messagePreviewId } = channel;
7118
- const messagePreviewChannelCache = (_a = pullFromCache([
7119
- 'messagePreviewChannel',
8247
+ const client = getActiveClient();
8248
+ client.log('invitation/cancelInvitation', invitationId);
8249
+ const { data } = await client.http.delete(`/api/v1/invitations/${invitationId}`);
8250
+ const invitation = (_a = pullFromCache([
8251
+ 'invitation',
7120
8252
  'get',
7121
- channel.channelId,
8253
+ invitationId,
7122
8254
  ])) === null || _a === void 0 ? void 0 : _a.data;
7123
- if ((messagePreviewChannelCache === null || messagePreviewChannelCache === void 0 ? void 0 : messagePreviewChannelCache.messagePreviewId) && !options.isMessagePreviewUpdated) {
7124
- messagePreviewId = messagePreviewChannelCache.messagePreviewId;
7125
- }
7126
- return Object.assign(Object.assign({}, channel), { defaultSubChannelId: channel.channelInternalId, isUnreadCountSupport: isUnreadCountSupport(channel), messagePreviewId });
7127
- }
7128
- const preUpdateChannelCache = (rawPayload, options = { isMessagePreviewUpdated: true }) => {
7129
- ingestInCache({
7130
- channels: rawPayload.channels.map(channel => convertFromRaw(channel, { isMessagePreviewUpdated: options.isMessagePreviewUpdated })),
7131
- });
7132
- };
7133
- const updateChannelUnread = ({ currentUserId, channels, channelUsers, }) => {
7134
- for (let i = 0; i < channels.length; i += 1) {
7135
- const cacheKey = ['channelUnread', 'get', channels[i].channelId];
7136
- const channelUser = channelUsers.find(channelUser => channelUser.channelId === channels[i].channelId && channelUser.userId === currentUserId);
7137
- let unreadCount = 0;
7138
- let readToSegment = null;
7139
- let lastMentionedSegment = null;
7140
- let isMentioned = false;
7141
- if (channelUser) {
7142
- readToSegment = channelUser.readToSegment;
7143
- lastMentionedSegment = channelUser.lastMentionedSegment;
7144
- unreadCount = Math.max(channels[i].messageCount - readToSegment, 0);
7145
- isMentioned = lastMentionedSegment > readToSegment;
7146
- }
7147
- const cacheChannelUnread = {
7148
- channelId: channels[i].channelId,
7149
- lastSegment: channels[i].messageCount,
7150
- readToSegment,
7151
- lastMentionedSegment,
7152
- unreadCount,
7153
- isMentioned,
7154
- isDeleted: channels[i].isDeleted || false,
7155
- };
7156
- pushToCache(cacheKey, cacheChannelUnread);
8255
+ if (invitation) {
8256
+ dropFromCache(['invitation', 'get', invitationId]);
8257
+ fireEvent('local.invitation.deleted', [invitation]);
7157
8258
  }
8259
+ return data.success;
7158
8260
  };
7159
- const prepareChannelPayload = async (rawPayload, options = { isMessagePreviewUpdated: true }) => {
8261
+ /* end_public_function */
8262
+
8263
+ const prepareMyInvitationsPayload = (rawPayload) => {
8264
+ return Object.assign(Object.assign({}, rawPayload), { users: rawPayload.users.map(convertRawUserToInternalUser), invitations: rawPayload.invitations.map(convertRawInvitationToInternalInvitation) });
8265
+ };
8266
+
8267
+ const invitationLinkedObject = (invitation) => {
8268
+ return Object.assign(Object.assign({}, invitation), { get user() {
8269
+ const cacheData = pullFromCache(['user', 'get', invitation.invitedUserPublicId]);
8270
+ if (cacheData === null || cacheData === void 0 ? void 0 : cacheData.data)
8271
+ return userLinkedObject(cacheData.data);
8272
+ return undefined;
8273
+ },
8274
+ get createdBy() {
8275
+ const cacheData = pullFromCache(['user', 'get', invitation.inviterUserPublicId]);
8276
+ if (cacheData === null || cacheData === void 0 ? void 0 : cacheData.data)
8277
+ return userLinkedObject(cacheData.data);
8278
+ return undefined;
8279
+ },
8280
+ get target() {
8281
+ if (invitation.targetType === 'community') {
8282
+ const cacheData = pullFromCache([
8283
+ 'community',
8284
+ 'get',
8285
+ invitation.targetId,
8286
+ ]);
8287
+ if (cacheData === null || cacheData === void 0 ? void 0 : cacheData.data)
8288
+ return cacheData.data;
8289
+ return undefined;
8290
+ }
8291
+ return undefined;
8292
+ }, accept: async () => {
8293
+ await acceptInvitation(invitation._id);
8294
+ }, reject: async () => {
8295
+ await rejectInvitation(invitation._id);
8296
+ }, cancel: async () => {
8297
+ await cancelInvitation(invitation._id);
8298
+ } });
8299
+ };
8300
+
8301
+ /* begin_public_function
8302
+ id: invitation.get
8303
+ */
8304
+ /**
8305
+ * ```js
8306
+ * import { getInvitation } from '@amityco/ts-sdk'
8307
+ * const { invitation } = await getInvitation(targetType, targetId)
8308
+ * ```
8309
+ *
8310
+ * Get a {@link Amity.Invitation} object
8311
+ *
8312
+ * @param targetType The type of the target of the {@link Amity.Invitation}
8313
+ * @param targetId The ID of the target of the {@link Amity.Invitation}
8314
+ * @returns A {@link Amity.Invitation} object
8315
+ *
8316
+ * @category Invitation API
8317
+ * @async
8318
+ */
8319
+ const getInvitation = async (targetType, targetId) => {
7160
8320
  const client = getActiveClient();
7161
- const networkPreviewSetting = await client.getMessagePreviewSetting(false);
7162
- if (options.isMessagePreviewUpdated &&
7163
- networkPreviewSetting !== "no-message-preview" /* Amity.MessagePreviewSetting.NO_MESSAGE_PREVIEW */ &&
7164
- rawPayload.messagePreviews &&
7165
- rawPayload.messagePreviews.length > 0) {
7166
- updateChannelMessagePreviewCache(rawPayload);
8321
+ client.log('invitation/getInvitation', targetType, targetId);
8322
+ const { data: payload } = await client.http.get(`/api/v1/invitations/me`, { params: { targetType, targetId } });
8323
+ const data = prepareMyInvitationsPayload(payload);
8324
+ const cachedAt = client.cache && Date.now();
8325
+ if (client.cache)
8326
+ ingestInCache(data, { cachedAt });
8327
+ return {
8328
+ data: data.invitations[0] ? invitationLinkedObject(data.invitations[0]) : undefined,
8329
+ cachedAt,
8330
+ };
8331
+ };
8332
+ /* end_public_function */
8333
+
8334
+ var InvitationActionsEnum;
8335
+ (function (InvitationActionsEnum) {
8336
+ InvitationActionsEnum["OnLocalInvitationCreated"] = "onLocalInvitationCreated";
8337
+ InvitationActionsEnum["OnLocalInvitationUpdated"] = "onLocalInvitationUpdated";
8338
+ InvitationActionsEnum["OnLocalInvitationDeleted"] = "onLocalInvitationDeleted";
8339
+ })(InvitationActionsEnum || (InvitationActionsEnum = {}));
8340
+
8341
+ class InvitationsPaginationController extends PaginationController {
8342
+ async getRequest(queryParams, token) {
8343
+ const { limit = COLLECTION_DEFAULT_PAGINATION_LIMIT } = queryParams, params = __rest(queryParams, ["limit"]);
8344
+ const options = token ? { token } : { limit };
8345
+ const { data } = await this.http.get('/api/v1/invitations', { params: Object.assign(Object.assign({}, params), { options }) });
8346
+ return data;
7167
8347
  }
7168
- if (client.useLegacyUnreadCount) {
7169
- updateChannelUnread({
7170
- channels: rawPayload.channels,
7171
- channelUsers: rawPayload.channelUsers,
7172
- currentUserId: client.userId,
7173
- });
8348
+ }
8349
+
8350
+ class InvitationsQueryStreamController extends QueryStreamController {
8351
+ constructor(query, cacheKey, notifyChange, preparePayload) {
8352
+ super(query, cacheKey);
8353
+ this.notifyChange = notifyChange;
8354
+ this.preparePayload = preparePayload;
7174
8355
  }
7175
- else {
7176
- const markerIds = rawPayload.channels
7177
- // filter channel by type. Only conversation, community and broadcast type are included.
7178
- .filter(isUnreadCountSupport)
7179
- .map(({ channelInternalId }) => channelInternalId);
7180
- if (markerIds.length > 0) {
7181
- // since the get markers method requires a channel cache to function with the reducer.
7182
- preUpdateChannelCache(rawPayload, {
7183
- isMessagePreviewUpdated: options.isMessagePreviewUpdated,
8356
+ async saveToMainDB(response) {
8357
+ const processedPayload = await this.preparePayload(response);
8358
+ const client = getActiveClient();
8359
+ const cachedAt = client.cache && Date.now();
8360
+ if (client.cache) {
8361
+ ingestInCache(processedPayload, { cachedAt });
8362
+ }
8363
+ }
8364
+ appendToQueryStream(response, direction, refresh = false) {
8365
+ var _a, _b;
8366
+ if (refresh) {
8367
+ pushToCache(this.cacheKey, {
8368
+ data: response.invitations.map(getResolver('invitation')),
7184
8369
  });
7185
- try {
7186
- await getChannelMarkers(markerIds);
8370
+ }
8371
+ else {
8372
+ const collection = (_a = pullFromCache(this.cacheKey)) === null || _a === void 0 ? void 0 : _a.data;
8373
+ const invitations = (_b = collection === null || collection === void 0 ? void 0 : collection.data) !== null && _b !== void 0 ? _b : [];
8374
+ pushToCache(this.cacheKey, Object.assign(Object.assign({}, collection), { data: [
8375
+ ...new Set([...invitations, ...response.invitations.map(getResolver('invitation'))]),
8376
+ ] }));
8377
+ }
8378
+ }
8379
+ reactor(action) {
8380
+ return (invitations) => {
8381
+ var _a;
8382
+ const collection = (_a = pullFromCache(this.cacheKey)) === null || _a === void 0 ? void 0 : _a.data;
8383
+ if (!collection)
8384
+ return;
8385
+ if (action === InvitationActionsEnum.OnLocalInvitationUpdated) {
8386
+ const isExist = collection.data.find(id => id === invitations[0].invitationId);
8387
+ if (!isExist)
8388
+ return;
7187
8389
  }
7188
- catch (e) {
7189
- // empty block (from the spec, allow marker fetch to fail without having to do anything)
8390
+ if (action === InvitationActionsEnum.OnLocalInvitationCreated) {
8391
+ collection.data = [
8392
+ ...new Set([
8393
+ ...invitations.map(invitation => invitation.invitationId),
8394
+ ...collection.data,
8395
+ ]),
8396
+ ];
7190
8397
  }
7191
- }
8398
+ if (action === InvitationActionsEnum.OnLocalInvitationDeleted) {
8399
+ collection.data = collection.data.filter(id => id !== invitations[0].invitationId);
8400
+ }
8401
+ pushToCache(this.cacheKey, collection);
8402
+ this.notifyChange({ origin: "event" /* Amity.LiveDataOrigin.EVENT */, loading: false });
8403
+ };
7192
8404
  }
7193
- // convert raw channel to internal channel
7194
- const channels = rawPayload.channels.map(payload => convertFromRaw(payload, { isMessagePreviewUpdated: options.isMessagePreviewUpdated }));
7195
- // convert raw channel user to membership (add user object)
7196
- const channelUsers = rawPayload.channelUsers.map(channelUser => {
7197
- return convertRawMembershipToMembership(channelUser);
7198
- });
7199
- const users = rawPayload.users.map(convertRawUserToInternalUser);
7200
- const restRawPayload = __rest(rawPayload, ["messageFeedsInfo", "messagePreviews"]);
7201
- return Object.assign(Object.assign({}, restRawPayload), { users,
7202
- channels,
7203
- channelUsers });
7204
- };
8405
+ subscribeRTE(createSubscriber) {
8406
+ return createSubscriber.map(subscriber => subscriber.fn(this.reactor(subscriber.action)));
8407
+ }
8408
+ }
7205
8409
 
7206
8410
  /**
7207
8411
  * ```js
7208
- * import { getSubChannelMarkers } from '@amityco/ts-sdk'
7209
- * const subChannelMarkers = await getSubChannelMarkers(['sch1', 'sch2'])
8412
+ * import { onLocalInvitationCreated } from '@amityco/ts-sdk'
8413
+ * const dispose = onLocalInvitationCreated(data => {
8414
+ * // ...
8415
+ * })
7210
8416
  * ```
7211
8417
  *
7212
- * Fetches a paginable list of {@link Amity.SubChannelMarker} objects
8418
+ * Fired when an {@link Amity.InvitationPayload} has been created
7213
8419
  *
7214
- * @param messageFeedIds the feed IDs of the {@link Amity.RawSubChannel} marker to fetch
7215
- * @param page
7216
- * @returns A page of {@link Amity.SubChannelMarker} objects
8420
+ * @param callback The function to call when the event was fired
8421
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
7217
8422
  *
7218
- * @category Channel API
7219
- * @async
7220
- * @private
8423
+ * @category Invitation Events
7221
8424
  */
7222
- const getUserMessageFeedMakers = async (channelIds) => {
7223
- const client = getActiveClient();
7224
- client.log('channel/getUserMessageFeedMakers', channelIds);
7225
- const { data } = await client.http.get(`/api/v1/markers/user-message-feed`, {
7226
- params: {
7227
- channelIds,
7228
- },
7229
- });
7230
- fireEvent('local.userMessageFeedMarker.fetched', { userMessageFeedMarker: data });
7231
- return data;
7232
- };
7233
-
7234
- const prepareUnreadCountInfo = async (rawPayload) => {
8425
+ const onLocalInvitationCreated = (callback) => {
7235
8426
  const client = getActiveClient();
7236
- // if consistent mode is enabled, persist the unread count info to the cache
7237
- // Marker service API uses channelInternalId as channelId
7238
- const queryPayload = await getUserMessageFeedMakers(rawPayload.channels.map(({ channelInternalId }) => channelInternalId));
7239
- const { feedMarkers, userFeedMarkers } = queryPayload;
7240
- persistUnreadCountInfo({
7241
- feedMarkers,
7242
- userFeedMarkers,
7243
- });
7244
- client.log('channel/prepareUnreadCountInfo', rawPayload.channels);
8427
+ const disposers = [
8428
+ createEventSubscriber(client, 'onLocalInvitationCreated', 'local.invitation.created', payload => callback(payload)),
8429
+ ];
8430
+ return () => {
8431
+ disposers.forEach(fn => fn());
8432
+ };
7245
8433
  };
7246
8434
 
7247
- const getCachedMarker$1 = (entityId) => {
7248
- var _a;
7249
- const key = {
7250
- entityId,
7251
- userId: getActiveUser()._id,
7252
- };
7253
- return (_a = pullFromCache([
7254
- 'channelMarker',
7255
- 'get',
7256
- getResolver('channelMarker')(key),
7257
- ])) === null || _a === void 0 ? void 0 : _a.data;
7258
- };
7259
- const getUnreadInfoCached$1 = (channelId) => {
7260
- var _a;
7261
- return (_a = pullFromCache(['channelUnreadInfo', 'get', channelId])) === null || _a === void 0 ? void 0 : _a.data;
7262
- };
7263
8435
  /**
7264
- * The function use to get value of hasMentioned or isMentioned field.
7265
- * function will get the value from marker params first, if there is no hasMentioned field, will look in to the cache.
8436
+ * ```js
8437
+ * import { onLocalInvitationUpdated } from '@amityco/ts-sdk'
8438
+ * const dispose = onLocalInvitationUpdated(data => {
8439
+ * // ...
8440
+ * })
8441
+ * ```
7266
8442
  *
7267
- * If consistent mode is enabled, the function will return the value from the channelUnreadCountInfo cache.
7268
- * If not, the function will return the value from the channelMarker cache.
7269
- * If not found in the both cache, use `false` as defaul value.
8443
+ * Fired when an {@link Amity.InvitationPayload} has been updated
8444
+ *
8445
+ * @param callback The function to call when the event was fired
8446
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
8447
+ *
8448
+ * @category Invitation Events
7270
8449
  */
7271
- const getChannelIsMentioned = (channel, marker) => {
7272
- var _a, _b, _c, _d;
8450
+ const onLocalInvitationUpdated = (callback) => {
7273
8451
  const client = getActiveClient();
7274
- if (client.isUnreadCountEnabled && client.getMarkerSyncConsistentMode()) {
7275
- return (_b = (_a = getUnreadInfoCached$1(channel.channelPublicId)) === null || _a === void 0 ? void 0 : _a.isMentioned) !== null && _b !== void 0 ? _b : false;
7276
- }
7277
- return (marker === null || marker === void 0 ? void 0 : marker.hasMentioned) !== undefined
7278
- ? marker === null || marker === void 0 ? void 0 : marker.hasMentioned
7279
- : (_d = (_c = getCachedMarker$1(channel.channelPublicId)) === null || _c === void 0 ? void 0 : _c.hasMentioned) !== null && _d !== void 0 ? _d : false;
8452
+ const disposers = [
8453
+ createEventSubscriber(client, 'onLocalInvitationUpdated', 'local.invitation.updated', payload => callback(payload)),
8454
+ ];
8455
+ return () => {
8456
+ disposers.forEach(fn => fn());
8457
+ };
7280
8458
  };
7281
8459
 
7282
- const getCachedMarker = (entityId) => {
7283
- var _a;
7284
- const key = {
7285
- entityId,
7286
- userId: getActiveUser()._id,
7287
- };
7288
- return (_a = pullFromCache([
7289
- 'channelMarker',
7290
- 'get',
7291
- getResolver('channelMarker')(key),
7292
- ])) === null || _a === void 0 ? void 0 : _a.data;
7293
- };
7294
- const getUnreadInfoCached = (channelId) => {
7295
- var _a;
7296
- return (_a = pullFromCache(['channelUnreadInfo', 'get', channelId])) === null || _a === void 0 ? void 0 : _a.data;
7297
- };
7298
8460
  /**
7299
- * The function use to get value of unreadCount field.
7300
- * function will get the value from marker params first, if there is no hasMentioned field, will look in to the cache.
8461
+ * ```js
8462
+ * import { onLocalInvitationDeleted } from '@amityco/ts-sdk'
8463
+ * const dispose = onLocalInvitationDeleted(data => {
8464
+ * // ...
8465
+ * })
8466
+ * ```
7301
8467
  *
7302
- * If consistent mode is enabled, the function will return the value from the channelUnreadCountInfo cache.
7303
- * If not, the function will return the value from the channelMarker cache.
7304
- * If not found in the both cache, use `0` as defaul value.
8468
+ * Fired when an {@link Amity.InvitationPayload} has been deleted
8469
+ *
8470
+ * @param callback The function to call when the event was fired
8471
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
8472
+ *
8473
+ * @category Invitation Events
7305
8474
  */
7306
- const getSubChannelsUnreadCount = (channel, marker) => {
7307
- var _a, _b, _c, _d, _e;
8475
+ const onLocalInvitationDeleted = (callback) => {
7308
8476
  const client = getActiveClient();
7309
- if (client.isUnreadCountEnabled && client.getMarkerSyncConsistentMode()) {
7310
- // Marker service API uses channelInternalId as channelId
7311
- return (_b = (_a = getUnreadInfoCached(channel.channelInternalId)) === null || _a === void 0 ? void 0 : _a.unreadCount) !== null && _b !== void 0 ? _b : 0;
7312
- }
7313
- if (marker === null || marker === void 0 ? void 0 : marker.isDeleted) {
7314
- // NOTE: This is a temporary solution to handle the channel marker when the user is forced to
7315
- // leave the channel because currently backend can't handle this, so every time a user is banned
7316
- // from a channel or the channel is deleted the channel's unread count will reset to zero
7317
- return 0;
7318
- }
7319
- return (_e = (_c = marker === null || marker === void 0 ? void 0 : marker.unreadCount) !== null && _c !== void 0 ? _c : (_d = getCachedMarker(channel.channelInternalId)) === null || _d === void 0 ? void 0 : _d.unreadCount) !== null && _e !== void 0 ? _e : 0;
8477
+ const disposers = [
8478
+ createEventSubscriber(client, 'onLocalInvitationDeleted', 'local.invitation.deleted', payload => callback(payload)),
8479
+ ];
8480
+ return () => {
8481
+ disposers.forEach(fn => fn());
8482
+ };
7320
8483
  };
7321
8484
 
7322
- const getLegacyChannelUnread = (channelId) => {
7323
- var _a;
7324
- return (_a = pullFromCache(['channelUnread', 'get', channelId])) === null || _a === void 0 ? void 0 : _a.data;
7325
- };
8485
+ class InvitationsLiveCollectionController extends LiveCollectionController {
8486
+ constructor(query, callback) {
8487
+ const queryStreamId = hash__default["default"](query);
8488
+ const cacheKey = ['invitation', 'collection', queryStreamId];
8489
+ const paginationController = new InvitationsPaginationController(query);
8490
+ super(paginationController, queryStreamId, cacheKey, callback);
8491
+ this.query = query;
8492
+ this.queryStreamController = new InvitationsQueryStreamController(this.query, this.cacheKey, this.notifyChange.bind(this), prepareInvitationPayload);
8493
+ this.callback = callback.bind(this);
8494
+ this.loadPage({ initial: true });
8495
+ }
8496
+ setup() {
8497
+ var _a;
8498
+ const collection = (_a = pullFromCache(this.cacheKey)) === null || _a === void 0 ? void 0 : _a.data;
8499
+ if (!collection) {
8500
+ pushToCache(this.cacheKey, {
8501
+ data: [],
8502
+ params: this.query,
8503
+ });
8504
+ }
8505
+ }
8506
+ async persistModel(queryPayload) {
8507
+ await this.queryStreamController.saveToMainDB(queryPayload);
8508
+ }
8509
+ persistQueryStream({ response, direction, refresh, }) {
8510
+ this.queryStreamController.appendToQueryStream(response, direction, refresh);
8511
+ }
8512
+ startSubscription() {
8513
+ return this.queryStreamController.subscribeRTE([
8514
+ {
8515
+ fn: onLocalInvitationCreated,
8516
+ action: InvitationActionsEnum.OnLocalInvitationCreated,
8517
+ },
8518
+ {
8519
+ fn: onLocalInvitationUpdated,
8520
+ action: InvitationActionsEnum.OnLocalInvitationUpdated,
8521
+ },
8522
+ {
8523
+ fn: onLocalInvitationDeleted,
8524
+ action: InvitationActionsEnum.OnLocalInvitationDeleted,
8525
+ },
8526
+ ]);
8527
+ }
8528
+ notifyChange({ origin, loading, error }) {
8529
+ var _a, _b;
8530
+ const collection = (_a = pullFromCache(this.cacheKey)) === null || _a === void 0 ? void 0 : _a.data;
8531
+ if (!collection)
8532
+ return;
8533
+ const data = this.applyFilter((_b = collection.data
8534
+ .map(id => pullFromCache(['invitation', 'get', id]))
8535
+ .filter(isNonNullable)
8536
+ .map(({ data }) => invitationLinkedObject(data))) !== null && _b !== void 0 ? _b : []);
8537
+ if (!this.shouldNotify(data) && origin === 'event')
8538
+ return;
8539
+ this.callback({
8540
+ onNextPage: () => this.loadPage({ direction: "next" /* Amity.LiveCollectionPageDirection.NEXT */ }),
8541
+ data,
8542
+ hasNextPage: !!this.paginationController.getNextToken(),
8543
+ loading,
8544
+ error,
8545
+ });
8546
+ }
8547
+ applyFilter(data) {
8548
+ let invitations = data;
8549
+ if (this.query.targetId) {
8550
+ invitations = invitations.filter(invitation => invitation.targetId === this.query.targetId);
8551
+ }
8552
+ if (this.query.statuses) {
8553
+ invitations = invitations.filter(invitation => { var _a; return (_a = this.query.statuses) === null || _a === void 0 ? void 0 : _a.includes(invitation.status); });
8554
+ }
8555
+ if (this.query.targetType) {
8556
+ invitations = invitations.filter(invitation => invitation.targetType === this.query.targetType);
8557
+ }
8558
+ if (this.query.type) {
8559
+ invitations = invitations.filter(invitation => invitation.type === this.query.type);
8560
+ }
8561
+ const sortFn = (() => {
8562
+ switch (this.query.sortBy) {
8563
+ case 'firstCreated':
8564
+ return sortByFirstCreated;
8565
+ case 'lastCreated':
8566
+ return sortByLastCreated;
8567
+ default:
8568
+ return sortByLastCreated;
8569
+ }
8570
+ })();
8571
+ invitations = invitations.sort(sortFn);
8572
+ return invitations;
8573
+ }
8574
+ }
7326
8575
 
7327
- const constructChannelDynamicValue = (channel) => {
7328
- const client = getActiveClient();
7329
- const rest = __rest(channel, ["messageCount"]);
7330
- return shallowClone(rest, {
7331
- get unreadCount() {
7332
- var _a, _b;
7333
- return (_b = (_a = getLegacyChannelUnread(rest.channelId)) === null || _a === void 0 ? void 0 : _a.unreadCount) !== null && _b !== void 0 ? _b : 0;
7334
- },
7335
- get subChannelsUnreadCount() {
7336
- return getSubChannelsUnreadCount(rest);
7337
- },
7338
- get isMentioned() {
7339
- var _a, _b;
7340
- if (client.useLegacyUnreadCount)
7341
- return (_b = (_a = getLegacyChannelUnread(rest.channelId)) === null || _a === void 0 ? void 0 : _a.isMentioned) !== null && _b !== void 0 ? _b : false;
7342
- return getChannelIsMentioned(rest);
7343
- },
8576
+ /**
8577
+ * Get invitations
8578
+ *
8579
+ * @param params the query parameters
8580
+ * @param callback the callback to be called when the invitations are updated
8581
+ * @returns invitations
8582
+ *
8583
+ * @category Invitation Live Collection
8584
+ *
8585
+ */
8586
+ const getInvitations = (params, callback, config) => {
8587
+ const { log, cache } = getActiveClient();
8588
+ if (!cache) {
8589
+ console.log(ENABLE_CACHE_MESSAGE);
8590
+ }
8591
+ const timestamp = Date.now();
8592
+ log(`getInvitations: (tmpid: ${timestamp}) > listen`);
8593
+ const invitationsLiveCollection = new InvitationsLiveCollectionController(params, callback);
8594
+ const disposers = invitationsLiveCollection.startSubscription();
8595
+ const cacheKey = invitationsLiveCollection.getCacheKey();
8596
+ disposers.push(() => {
8597
+ dropFromCache(cacheKey);
7344
8598
  });
8599
+ return () => {
8600
+ log(`getInvitations (tmpid: ${timestamp}) > dispose`);
8601
+ disposers.forEach(fn => fn());
8602
+ };
8603
+ };
8604
+
8605
+ const communityLinkedObject = (community) => {
8606
+ return Object.assign(Object.assign({}, community), { createInvitations: async (userIds) => {
8607
+ await createInvitations({
8608
+ type: "communityMemberInvite" /* InvitationTypeEnum.CommunityMemberInvite */,
8609
+ targetType: 'community',
8610
+ targetId: community.communityId,
8611
+ userIds,
8612
+ });
8613
+ }, getMemberInvitations: (params, callback) => {
8614
+ return getInvitations(Object.assign(Object.assign({}, params), { targetId: community.communityId, targetType: 'community', type: "communityMemberInvite" /* InvitationTypeEnum.CommunityMemberInvite */ }), callback);
8615
+ }, getInvitation: async () => {
8616
+ const { data } = await getInvitation('community', community.communityId);
8617
+ return data;
8618
+ }, join: async () => {
8619
+ return joinRequest(community.communityId);
8620
+ }, getJoinRequests: (params, callback) => {
8621
+ return getJoinRequests(Object.assign(Object.assign({}, params), { communityId: community.communityId }), callback);
8622
+ }, getMyJoinRequest: async () => {
8623
+ const { data } = await getMyJoinRequest(community.communityId);
8624
+ return data;
8625
+ } });
8626
+ };
8627
+
8628
+ const LinkedObject = {
8629
+ ad: adLinkedObject,
8630
+ comment: commentLinkedObject,
8631
+ post: postLinkedObject,
8632
+ user: userLinkedObject,
8633
+ category: categoryLinkedObject,
8634
+ stream: streamLinkedObject,
8635
+ story: storyLinkedObject,
8636
+ storyTarget: storyTargetLinkedObject,
8637
+ message: messageLinkedObject,
8638
+ reactor: reactorLinkedObject,
8639
+ channel: channelLinkedObject,
8640
+ pinnedPost: pinnedPostLinkedObject,
8641
+ notificationTray: notificationTrayLinkedObject,
8642
+ community: communityLinkedObject,
8643
+ invitation: invitationLinkedObject,
8644
+ joinRequest: joinRequestLinkedObject,
7345
8645
  };
7346
8646
 
7347
8647
  const constructChannelObject = (channel) => {
@@ -10063,38 +11363,6 @@ const onMessageMarked = (callback) => {
10063
11363
  return createEventSubscriber(client, 'messageMarker/onMessageMarked', 'marker.marked-message', filter);
10064
11364
  };
10065
11365
 
10066
- function isObject(value) {
10067
- return typeof value === 'object' && value !== null;
10068
- }
10069
- /**
10070
- * convert all object getter property to static value
10071
- */
10072
- const convertGetterPropsToStatic = (obj) => {
10073
- if (!isObject(obj)) {
10074
- return obj;
10075
- }
10076
- const entries = Object.entries(obj).map(([key, value]) => {
10077
- const descriptor = Object.getOwnPropertyDescriptor(obj, key);
10078
- if (typeof (descriptor === null || descriptor === void 0 ? void 0 : descriptor.get) === 'function') {
10079
- return [key, descriptor.get.call(obj)];
10080
- }
10081
- return [key, value];
10082
- });
10083
- return Object.fromEntries(entries);
10084
- };
10085
- const removeFunctionProperties = (obj) => {
10086
- if (!isObject(obj)) {
10087
- return obj;
10088
- }
10089
- const entries = Object.entries(obj).map(([key, value]) => {
10090
- if (typeof value === 'function') {
10091
- return [key, undefined];
10092
- }
10093
- return [key, value];
10094
- });
10095
- return Object.fromEntries(entries);
10096
- };
10097
-
10098
11366
  /**
10099
11367
  *
10100
11368
  * ```js
@@ -10204,7 +11472,7 @@ const getUserUnread = (callback) => {
10204
11472
  };
10205
11473
  };
10206
11474
 
10207
- var index$m = /*#__PURE__*/Object.freeze({
11475
+ var index$n = /*#__PURE__*/Object.freeze({
10208
11476
  __proto__: null,
10209
11477
  getActiveClient: getActiveClient,
10210
11478
  getActiveUser: getActiveUser,
@@ -10708,51 +11976,6 @@ const onLocalFollowRequestAccepted = (callback) => createLocalFollowEventSubscri
10708
11976
 
10709
11977
  const onLocalFollowRequestDeclined = (callback) => createLocalFollowEventSubscriber('local.follow.requestDeclined', callback);
10710
11978
 
10711
- class PaginationController {
10712
- constructor(queryParams) {
10713
- const { http } = getActiveClient();
10714
- this.queryParams = queryParams;
10715
- this.http = http;
10716
- }
10717
- loadFirstPage() {
10718
- return this.onFetch("first" /* Amity.LiveCollectionPageDirection.FIRST */);
10719
- }
10720
- loadNextPage() {
10721
- return this.onFetch("next" /* Amity.LiveCollectionPageDirection.NEXT */);
10722
- }
10723
- loadPreviousPage() {
10724
- return this.onFetch("prev" /* Amity.LiveCollectionPageDirection.PREV */);
10725
- }
10726
- async onFetch(direction = "first" /* Amity.LiveCollectionPageDirection.FIRST */) {
10727
- var _a, _b, _c, _d;
10728
- if (direction === 'prev' && !this.previousToken)
10729
- return;
10730
- if (direction === 'next' && !this.nextToken)
10731
- return;
10732
- let token;
10733
- if (direction === 'prev')
10734
- token = this.previousToken;
10735
- if (direction === 'next')
10736
- token = this.nextToken;
10737
- const queryResponse = await this.getRequest(this.queryParams, token);
10738
- if (direction === 'first') {
10739
- this.nextToken = (_a = queryResponse.paging) === null || _a === void 0 ? void 0 : _a.next;
10740
- this.previousToken = (_b = queryResponse.paging) === null || _b === void 0 ? void 0 : _b.previous;
10741
- }
10742
- if (direction === 'prev')
10743
- this.previousToken = (_c = queryResponse.paging) === null || _c === void 0 ? void 0 : _c.previous;
10744
- if (direction === 'next')
10745
- this.nextToken = (_d = queryResponse.paging) === null || _d === void 0 ? void 0 : _d.next;
10746
- return queryResponse;
10747
- }
10748
- getNextToken() {
10749
- return this.nextToken;
10750
- }
10751
- getPrevToken() {
10752
- return this.previousToken;
10753
- }
10754
- }
10755
-
10756
11979
  class FollowerPaginationController extends PaginationController {
10757
11980
  async getRequest(queryParams, token) {
10758
11981
  const { limit = COLLECTION_DEFAULT_PAGINATION_LIMIT, userId } = queryParams, params = __rest(queryParams, ["limit", "userId"]);
@@ -10766,13 +11989,6 @@ class FollowerPaginationController extends PaginationController {
10766
11989
  }
10767
11990
  }
10768
11991
 
10769
- class QueryStreamController {
10770
- constructor(query, cacheKey) {
10771
- this.query = query;
10772
- this.cacheKey = cacheKey;
10773
- }
10774
- }
10775
-
10776
11992
  var EnumFollowActions;
10777
11993
  (function (EnumFollowActions) {
10778
11994
  EnumFollowActions["OnRequested"] = "onRequested";
@@ -10840,109 +12056,6 @@ class FollowerQueryStreamController extends QueryStreamController {
10840
12056
  }
10841
12057
  }
10842
12058
 
10843
- class PaginationNoPageController {
10844
- constructor(queryParams) {
10845
- const { http } = getActiveClient();
10846
- this.queryParams = queryParams;
10847
- this.http = http;
10848
- }
10849
- async onFetch() {
10850
- const queryResponse = await this.getRequest(this.queryParams);
10851
- return queryResponse;
10852
- }
10853
- }
10854
-
10855
- class LiveCollectionController {
10856
- constructor(paginationController, queryStreamId, cacheKey, callback) {
10857
- this.paginationController = paginationController;
10858
- this.queryStreamId = queryStreamId;
10859
- this.cacheKey = cacheKey;
10860
- this.callback = callback;
10861
- }
10862
- async refresh() {
10863
- try {
10864
- let result;
10865
- if (this.paginationController instanceof PaginationNoPageController) {
10866
- result = await this.paginationController.onFetch();
10867
- }
10868
- else {
10869
- result = await this.paginationController.loadFirstPage();
10870
- }
10871
- if (!result)
10872
- return;
10873
- await this.persistModel(result);
10874
- this.persistQueryStream({
10875
- response: result,
10876
- direction: "next" /* Amity.LiveCollectionPageDirection.NEXT */,
10877
- refresh: true,
10878
- });
10879
- this.notifyChange({ origin: "server" /* Amity.LiveDataOrigin.SERVER */, loading: false });
10880
- }
10881
- catch (e) {
10882
- this.notifyChange({ origin: "server" /* Amity.LiveDataOrigin.SERVER */, loading: false, error: e });
10883
- }
10884
- }
10885
- loadPage({ initial = false, direction = "next" /* Amity.LiveCollectionPageDirection.NEXT */, }) {
10886
- this.setup();
10887
- this.notifyChange({ origin: "local" /* Amity.LiveDataOrigin.LOCAL */, loading: true });
10888
- if (initial) {
10889
- this.refresh();
10890
- }
10891
- else if (direction === "prev" /* Amity.LiveCollectionPageDirection.PREV */) {
10892
- this.loadPrevPage();
10893
- }
10894
- else if (direction === "next" /* Amity.LiveCollectionPageDirection.NEXT */) {
10895
- this.loadNextPage();
10896
- }
10897
- }
10898
- async loadNextPage() {
10899
- try {
10900
- if (this.paginationController instanceof PaginationNoPageController)
10901
- return;
10902
- const result = await this.paginationController.loadNextPage();
10903
- if (!result)
10904
- return;
10905
- await this.persistModel(result);
10906
- this.persistQueryStream({
10907
- response: result,
10908
- direction: "next" /* Amity.LiveCollectionPageDirection.NEXT */,
10909
- });
10910
- this.notifyChange({ origin: "server" /* Amity.LiveDataOrigin.SERVER */, loading: false });
10911
- }
10912
- catch (e) {
10913
- this.notifyChange({ origin: "server" /* Amity.LiveDataOrigin.SERVER */, loading: false, error: e });
10914
- }
10915
- }
10916
- async loadPrevPage() {
10917
- try {
10918
- if (this.paginationController instanceof PaginationNoPageController)
10919
- return;
10920
- const result = await this.paginationController.loadPreviousPage();
10921
- if (!result)
10922
- return;
10923
- await this.persistModel(result);
10924
- this.persistQueryStream({
10925
- response: result,
10926
- direction: "prev" /* Amity.LiveCollectionPageDirection.PREV */,
10927
- });
10928
- this.notifyChange({ origin: "server" /* Amity.LiveDataOrigin.SERVER */, loading: false });
10929
- }
10930
- catch (e) {
10931
- this.notifyChange({ origin: "server" /* Amity.LiveDataOrigin.SERVER */, loading: false, error: e });
10932
- }
10933
- }
10934
- shouldNotify(data) {
10935
- const newData = data.map(convertGetterPropsToStatic).map(removeFunctionProperties);
10936
- if (isEqual(this.snapshot, newData))
10937
- return false;
10938
- this.snapshot = newData;
10939
- return true;
10940
- }
10941
- getCacheKey() {
10942
- return this.cacheKey;
10943
- }
10944
- }
10945
-
10946
12059
  const onFollowerUserDeleted = ({ userId }) => (callback) => {
10947
12060
  const client = getActiveClient();
10948
12061
  const filter = (data) => {
@@ -11411,7 +12524,7 @@ const getMyFollowInfo = (callback) => {
11411
12524
  };
11412
12525
  /* end_public_function */
11413
12526
 
11414
- var index$l = /*#__PURE__*/Object.freeze({
12527
+ var index$m = /*#__PURE__*/Object.freeze({
11415
12528
  __proto__: null,
11416
12529
  blockUser: blockUser,
11417
12530
  unBlockUser: unBlockUser,
@@ -12426,9 +13539,9 @@ var AmityUserSearchMatchType;
12426
13539
  AmityUserSearchMatchType["PARTIAL"] = "partial";
12427
13540
  })(AmityUserSearchMatchType || (AmityUserSearchMatchType = {}));
12428
13541
 
12429
- var index$k = /*#__PURE__*/Object.freeze({
13542
+ var index$l = /*#__PURE__*/Object.freeze({
12430
13543
  __proto__: null,
12431
- Relationship: index$l,
13544
+ Relationship: index$m,
12432
13545
  getUserByIds: getUserByIds,
12433
13546
  updateUser: updateUser,
12434
13547
  flagUser: flagUser,
@@ -12736,7 +13849,7 @@ const updateAltText = async (fileId, altText) => {
12736
13849
  };
12737
13850
  /* end_public_function */
12738
13851
 
12739
- var index$j = /*#__PURE__*/Object.freeze({
13852
+ var index$k = /*#__PURE__*/Object.freeze({
12740
13853
  __proto__: null,
12741
13854
  getFile: getFile,
12742
13855
  uploadFile: uploadFile,
@@ -13075,46 +14188,15 @@ getComment$2.locally = (commentId) => {
13075
14188
  const client = getActiveClient();
13076
14189
  client.log('comment/getComment.locally', commentId);
13077
14190
  if (!client.cache)
13078
- return;
13079
- const cached = pullFromCache(['comment', 'get', commentId]);
13080
- if (!cached)
13081
- return;
13082
- return {
13083
- data: LinkedObject.comment(cached.data),
13084
- cachedAt: cached.cachedAt,
13085
- };
13086
- };
13087
-
13088
- /*
13089
- * verifies membership status
13090
- */
13091
- function isMember(membership) {
13092
- return membership !== 'none';
13093
- }
13094
- /*
13095
- * checks if currently logged in user is part of the community
13096
- */
13097
- function isCurrentUserPartOfCommunity(c, m) {
13098
- const { userId } = getActiveUser();
13099
- return c.communityId === m.communityId && m.userId === userId;
13100
- }
13101
- /*
13102
- * For mqtt events server will not send user specific data as it's broadcasted
13103
- * to multiple users and it also does not include communityUser
13104
- *
13105
- * Client SDK needs to check for the existing isJoined field in cache data before calculating.
13106
- * Althought this can be calculated, it's not scalable.
13107
- */
13108
- function updateMembershipStatus(communities, communityUsers) {
13109
- return communities.map(c => {
13110
- const cachedCommunity = pullFromCache(['community', 'get', c.communityId]);
13111
- if ((cachedCommunity === null || cachedCommunity === void 0 ? void 0 : cachedCommunity.data) && (cachedCommunity === null || cachedCommunity === void 0 ? void 0 : cachedCommunity.data.hasOwnProperty('isJoined'))) {
13112
- return Object.assign(Object.assign({}, cachedCommunity.data), c);
13113
- }
13114
- const isJoined = communityUsers.some(m => isCurrentUserPartOfCommunity(c, m) && isMember(m.communityMembership));
13115
- return Object.assign(Object.assign({}, c), { isJoined });
13116
- });
13117
- }
14191
+ return;
14192
+ const cached = pullFromCache(['comment', 'get', commentId]);
14193
+ if (!cached)
14194
+ return;
14195
+ return {
14196
+ data: LinkedObject.comment(cached.data),
14197
+ cachedAt: cached.cachedAt,
14198
+ };
14199
+ };
13118
14200
 
13119
14201
  const getMyReactionsInCache = (payload, eventPrefix) => {
13120
14202
  var _a, _b;
@@ -13430,53 +14512,6 @@ removeReaction.optimistically = (referenceType, referenceId, reactionName) => {
13430
14512
  return !((_d = reaction === null || reaction === void 0 ? void 0 : reaction.myReactions) === null || _d === void 0 ? void 0 : _d.includes(reactionName));
13431
14513
  };
13432
14514
 
13433
- const getMatchPostSetting = (value) => {
13434
- var _a;
13435
- return (_a = Object.keys(CommunityPostSettingMaps).find(key => value.needApprovalOnPostCreation ===
13436
- CommunityPostSettingMaps[key].needApprovalOnPostCreation &&
13437
- value.onlyAdminCanPost === CommunityPostSettingMaps[key].onlyAdminCanPost)) !== null && _a !== void 0 ? _a : DefaultCommunityPostSetting;
13438
- };
13439
- function addPostSetting({ communities }) {
13440
- return communities.map((_a) => {
13441
- var { needApprovalOnPostCreation, onlyAdminCanPost } = _a, restCommunityPayload = __rest(_a, ["needApprovalOnPostCreation", "onlyAdminCanPost"]);
13442
- return (Object.assign({ postSetting: getMatchPostSetting({
13443
- needApprovalOnPostCreation,
13444
- onlyAdminCanPost,
13445
- }) }, restCommunityPayload));
13446
- });
13447
- }
13448
- const prepareCommunityPayload = (rawPayload) => {
13449
- const communitiesWithPostSetting = addPostSetting({ communities: rawPayload.communities });
13450
- // map users with community
13451
- const mappedCommunityUsers = rawPayload.communityUsers.map(communityUser => {
13452
- const user = rawPayload.users.find(user => user.userId === communityUser.userId);
13453
- return Object.assign(Object.assign({}, communityUser), { user });
13454
- });
13455
- const communityWithMembershipStatus = updateMembershipStatus(communitiesWithPostSetting, mappedCommunityUsers);
13456
- return Object.assign(Object.assign({}, rawPayload), { communities: communityWithMembershipStatus, communityUsers: mappedCommunityUsers });
13457
- };
13458
- const prepareCommunityMembershipPayload = (rawPayload) => {
13459
- const communitiesWithPostSetting = addPostSetting({ communities: rawPayload.communities });
13460
- // map users with community
13461
- const mappedCommunityUsers = rawPayload.communityUsers.map(communityUser => {
13462
- const user = rawPayload.users.find(user => user.userId === communityUser.userId);
13463
- return Object.assign(Object.assign({}, communityUser), { user });
13464
- });
13465
- const communityWithMembershipStatus = updateMembershipStatus(communitiesWithPostSetting, mappedCommunityUsers);
13466
- return Object.assign(Object.assign({}, rawPayload), { communities: communityWithMembershipStatus, communityUsers: mappedCommunityUsers });
13467
- };
13468
- const prepareCommunityRequest = (params) => {
13469
- const { postSetting = undefined, storySetting } = params, restParam = __rest(params, ["postSetting", "storySetting"]);
13470
- return Object.assign(Object.assign(Object.assign({}, restParam), (postSetting ? CommunityPostSettingMaps[postSetting] : undefined)), {
13471
- // Convert story setting to the actual value. (Allow by default)
13472
- allowCommentInStory: typeof (storySetting === null || storySetting === void 0 ? void 0 : storySetting.enableComment) === 'boolean' ? storySetting.enableComment : true });
13473
- };
13474
- const prepareSemanticSearchCommunityPayload = (_a) => {
13475
- var communityPayload = __rest(_a, ["searchResult"]);
13476
- const processedCommunityPayload = prepareCommunityPayload(communityPayload);
13477
- return Object.assign({}, processedCommunityPayload);
13478
- };
13479
-
13480
14515
  const preparePostPayload = (payload) => {
13481
14516
  const { posts: postsData } = payload, postPayload = __rest(payload, ["posts"]);
13482
14517
  // Unpack community payload by mapping payload field to postSetting value.
@@ -14604,7 +15639,7 @@ const getReactions = (params, callback, config) => {
14604
15639
  };
14605
15640
  /* end_public_function */
14606
15641
 
14607
- var index$i = /*#__PURE__*/Object.freeze({
15642
+ var index$j = /*#__PURE__*/Object.freeze({
14608
15643
  __proto__: null,
14609
15644
  addReaction: addReaction,
14610
15645
  removeReaction: removeReaction,
@@ -15934,10 +16969,11 @@ getDeliveredUsers.locally = (query) => {
15934
16969
  const flagMessage = async (messageId, reason) => {
15935
16970
  const client = getActiveClient();
15936
16971
  client.log('message/flag', messageId);
15937
- const isPredefinedReason = Object.entries(exports.ContentFlagReasonEnum).some(([key, value]) => key !== exports.ContentFlagReasonEnum.Others && value === reason);
16972
+ const isPredefinedReason = reason &&
16973
+ Object.entries(exports.ContentFlagReasonEnum).some(([key, value]) => key !== exports.ContentFlagReasonEnum.Others && value === reason);
15938
16974
  const body = {
15939
16975
  reason: isPredefinedReason ? reason : exports.ContentFlagReasonEnum.Others,
15940
- detail: isPredefinedReason ? '' : reason,
16976
+ detail: !isPredefinedReason ? reason : '',
15941
16977
  };
15942
16978
  const { data: payload } = await client.http.post(`/api/v5/messages/${encodeURIComponent(messageId)}/flags`, body);
15943
16979
  if (client.cache) {
@@ -16426,7 +17462,7 @@ const getMessages = (params, callback, config) => {
16426
17462
  };
16427
17463
  /* end_public_function */
16428
17464
 
16429
- var index$h = /*#__PURE__*/Object.freeze({
17465
+ var index$i = /*#__PURE__*/Object.freeze({
16430
17466
  __proto__: null,
16431
17467
  createMessage: createMessage,
16432
17468
  updateMessage: updateMessage,
@@ -16952,7 +17988,7 @@ const stopMessageReceiptSync = (subChannelId) => {
16952
17988
  };
16953
17989
  /* end_public_function */
16954
17990
 
16955
- var index$g = /*#__PURE__*/Object.freeze({
17991
+ var index$h = /*#__PURE__*/Object.freeze({
16956
17992
  __proto__: null,
16957
17993
  getSubChannelByIds: getSubChannels$1,
16958
17994
  createSubChannel: createSubChannel,
@@ -18266,7 +19302,7 @@ const searchMembers$1 = (params, callback, config) => {
18266
19302
  };
18267
19303
  /* end_public_function */
18268
19304
 
18269
- var index$f = /*#__PURE__*/Object.freeze({
19305
+ var index$g = /*#__PURE__*/Object.freeze({
18270
19306
  __proto__: null,
18271
19307
  addMembers: addMembers$1,
18272
19308
  removeMembers: removeMembers$1,
@@ -18469,7 +19505,7 @@ const unmuteMembers = async (channelId, userIds) => {
18469
19505
  };
18470
19506
  /* end_public_function */
18471
19507
 
18472
- var index$e = /*#__PURE__*/Object.freeze({
19508
+ var index$f = /*#__PURE__*/Object.freeze({
18473
19509
  __proto__: null,
18474
19510
  addRole: addRole,
18475
19511
  removeRole: removeRole,
@@ -18479,10 +19515,10 @@ var index$e = /*#__PURE__*/Object.freeze({
18479
19515
  unmuteMembers: unmuteMembers
18480
19516
  });
18481
19517
 
18482
- var index$d = /*#__PURE__*/Object.freeze({
19518
+ var index$e = /*#__PURE__*/Object.freeze({
18483
19519
  __proto__: null,
18484
- Membership: index$f,
18485
- Moderation: index$e,
19520
+ Membership: index$g,
19521
+ Moderation: index$f,
18486
19522
  getChannelByIds: getChannelByIds$1,
18487
19523
  createChannel: createChannel,
18488
19524
  updateChannel: updateChannel,
@@ -18536,12 +19572,15 @@ const saveCommunityUsers = (communities, communityUsers) => {
18536
19572
  * @category Community API
18537
19573
  * @async
18538
19574
  */
18539
- const getCommunities$1 = async (communityIds) => {
19575
+ const getCommunities$1 = async (communityIds, includeDiscoverablePrivateCommunity) => {
18540
19576
  const client = getActiveClient();
18541
19577
  client.log('community/getCommunities', communityIds);
18542
19578
  // API-FIX: endpoint should not be /list, parameters should be querystring.
18543
19579
  const { data: payload } = await client.http.get(`/api/v3/communities/list`, {
18544
- params: { communityIds },
19580
+ params: {
19581
+ communityIds,
19582
+ includeDiscoverablePrivateCommunity: includeDiscoverablePrivateCommunity !== null && includeDiscoverablePrivateCommunity !== void 0 ? includeDiscoverablePrivateCommunity : true,
19583
+ },
18545
19584
  });
18546
19585
  const data = prepareCommunityPayload(payload);
18547
19586
  const cachedAt = client.cache && Date.now();
@@ -18550,7 +19589,7 @@ const getCommunities$1 = async (communityIds) => {
18550
19589
  saveCommunityUsers(data.communities, data.communityUsers);
18551
19590
  }
18552
19591
  return {
18553
- data: data.communities,
19592
+ data: data.communities.map(community => LinkedObject.community(community)),
18554
19593
  cachedAt,
18555
19594
  };
18556
19595
  };
@@ -18592,7 +19631,7 @@ getCommunities$1.locally = (communityIds) => {
18592
19631
  /**
18593
19632
  * ```js
18594
19633
  * import { createCommunity } from '@amityco/ts-sdk'
18595
- * const created = await createCommunity({ communityId: 'foobar', displayName: 'foobar' })
19634
+ * const created = await createCommunity({ communityId: 'foobar', displayName: 'foobar', isDiscoverable: true, requiresJoinApproval: false })
18596
19635
  * ```
18597
19636
  *
18598
19637
  * Creates an {@link Amity.Community}
@@ -18616,7 +19655,7 @@ const createCommunity = async (bundle) => {
18616
19655
  }
18617
19656
  const { communities } = data;
18618
19657
  return {
18619
- data: communities[0],
19658
+ data: LinkedObject.community(communities[0]),
18620
19659
  cachedAt,
18621
19660
  };
18622
19661
  };
@@ -18628,7 +19667,7 @@ const createCommunity = async (bundle) => {
18628
19667
  /**
18629
19668
  * ```js
18630
19669
  * import { updateCommunity } from '@amityco/ts-sdk'
18631
- * const updated = await updateCommunity(communityId, { displayName: 'foobar' })
19670
+ * const updated = await updateCommunity(communityId, { displayName: 'foobar', isDiscoverable: true, requiresJoinApproval: false })
18632
19671
  * ```
18633
19672
  *
18634
19673
  * Updates an {@link Amity.Community}
@@ -18653,7 +19692,7 @@ const updateCommunity = async (communityId, patch) => {
18653
19692
  }
18654
19693
  const { communities } = data;
18655
19694
  return {
18656
- data: communities.find(community => community.communityId === communityId),
19695
+ data: LinkedObject.community(communities.find(community => community.communityId === communityId)),
18657
19696
  cachedAt,
18658
19697
  };
18659
19698
  };
@@ -18673,11 +19712,16 @@ const updateCommunity = async (communityId, patch) => {
18673
19712
  * @category Community API
18674
19713
  * @async
18675
19714
  */
18676
- const getCommunity$1 = async (communityId) => {
19715
+ const getCommunity$1 = async (communityId, type, includeDiscoverablePrivateCommunity) => {
18677
19716
  const client = getActiveClient();
18678
19717
  client.log('community/getCommunity', communityId);
18679
19718
  // API-FIX: endpoint should not be /list, parameters should be querystring.
18680
- const { data: payload } = await client.http.get(`/api/v3/communities/${communityId}`);
19719
+ const { data: payload } = await client.http.get(`/api/v3/communities/${communityId}`, {
19720
+ params: {
19721
+ type: 'communityJoinRequest',
19722
+ includeDiscoverablePrivateCommunity: includeDiscoverablePrivateCommunity !== null && includeDiscoverablePrivateCommunity !== void 0 ? includeDiscoverablePrivateCommunity : true,
19723
+ },
19724
+ });
18681
19725
  const data = prepareCommunityPayload(payload);
18682
19726
  const cachedAt = client.cache && Date.now();
18683
19727
  if (client.cache) {
@@ -18686,7 +19730,7 @@ const getCommunity$1 = async (communityId) => {
18686
19730
  }
18687
19731
  const { communities } = data;
18688
19732
  return {
18689
- data: communities.find(community => community.communityId === communityId),
19733
+ data: LinkedObject.community(communities.find(community => community.communityId === communityId)),
18690
19734
  cachedAt,
18691
19735
  };
18692
19736
  };
@@ -18712,7 +19756,7 @@ getCommunity$1.locally = (communityId) => {
18712
19756
  if (!cached)
18713
19757
  return;
18714
19758
  return {
18715
- data: cached.data,
19759
+ data: LinkedObject.community(cached.data),
18716
19760
  cachedAt: cached.cachedAt,
18717
19761
  };
18718
19762
  };
@@ -18752,6 +19796,9 @@ const deleteCommunity = async (communityId) => {
18752
19796
  };
18753
19797
  /* end_public_function */
18754
19798
 
19799
+ /**
19800
+ * @deprecated This function will to be deprecated and use the new community.join().
19801
+ */
18755
19802
  /* begin_public_function
18756
19803
  id: community.join
18757
19804
  */
@@ -18892,10 +19939,11 @@ const onCommunityDeleted = (callback) => createCommunityEventSubscriber('communi
18892
19939
  */
18893
19940
  class CommunitiesPaginationController$1 extends PaginationController {
18894
19941
  async getRequest(queryParams, token) {
19942
+ var _a;
18895
19943
  const { limit = COLLECTION_DEFAULT_PAGINATION_LIMIT } = queryParams, params = __rest(queryParams, ["limit"]);
18896
19944
  const options = token ? { token } : { limit };
18897
19945
  const { data: queryResponse } = await this.http.get(`/api/v3/communities`, {
18898
- params: Object.assign(Object.assign({}, params), { isDeleted: inferIsDeleted(params.includeDeleted), keyword: params.displayName, filter: params.membership, options }),
19946
+ params: Object.assign(Object.assign({}, params), { isDeleted: inferIsDeleted(params.includeDeleted), keyword: params.displayName, filter: params.membership, includeDiscoverablePrivateCommunity: (_a = params.includeDiscoverablePrivateCommunity) !== null && _a !== void 0 ? _a : true, options }),
18899
19947
  });
18900
19948
  return queryResponse;
18901
19949
  }
@@ -19862,7 +20910,7 @@ const searchMembers = (params, callback, config) => {
19862
20910
  };
19863
20911
  /* end_public_function */
19864
20912
 
19865
- var index$c = /*#__PURE__*/Object.freeze({
20913
+ var index$d = /*#__PURE__*/Object.freeze({
19866
20914
  __proto__: null,
19867
20915
  addMembers: addMembers,
19868
20916
  removeMembers: removeMembers,
@@ -20342,7 +21390,7 @@ class TrendingCommunityLiveCollectionController extends LiveCollectionController
20342
21390
  const data = (_b = collection.data
20343
21391
  .map(id => pullFromCache(['community', 'get', id]))
20344
21392
  .filter(isNonNullable)
20345
- .map(({ data }) => data)) !== null && _b !== void 0 ? _b : [];
21393
+ .map(({ data }) => communityLinkedObject(data))) !== null && _b !== void 0 ? _b : [];
20346
21394
  if (!this.shouldNotify(data) && origin === 'event')
20347
21395
  return;
20348
21396
  this.callback({
@@ -20504,7 +21552,7 @@ class RecommendedCommunityLiveCollectionController extends LiveCollectionControl
20504
21552
  const data = (_b = collection.data
20505
21553
  .map(id => pullFromCache(['community', 'get', id]))
20506
21554
  .filter(isNonNullable)
20507
- .map(({ data }) => data)) !== null && _b !== void 0 ? _b : [];
21555
+ .map(({ data }) => communityLinkedObject(data))) !== null && _b !== void 0 ? _b : [];
20508
21556
  if (!this.shouldNotify(data) && origin === 'event')
20509
21557
  return;
20510
21558
  this.callback({
@@ -20887,7 +21935,7 @@ const unbanMembers = async (communityId, userIds) => {
20887
21935
  };
20888
21936
  /* end_public_function */
20889
21937
 
20890
- var index$b = /*#__PURE__*/Object.freeze({
21938
+ var index$c = /*#__PURE__*/Object.freeze({
20891
21939
  __proto__: null,
20892
21940
  addRoles: addRoles,
20893
21941
  removeRoles: removeRoles,
@@ -20895,10 +21943,10 @@ var index$b = /*#__PURE__*/Object.freeze({
20895
21943
  unbanMembers: unbanMembers
20896
21944
  });
20897
21945
 
20898
- var index$a = /*#__PURE__*/Object.freeze({
21946
+ var index$b = /*#__PURE__*/Object.freeze({
20899
21947
  __proto__: null,
20900
- Moderation: index$b,
20901
- Membership: index$c,
21948
+ Moderation: index$c,
21949
+ Membership: index$d,
20902
21950
  getCommunityByIds: getCommunities$1,
20903
21951
  createCommunity: createCommunity,
20904
21952
  updateCommunity: updateCommunity,
@@ -21131,7 +22179,7 @@ const getCategories = (params, callback, config) => {
21131
22179
  };
21132
22180
  /* end_public_function */
21133
22181
 
21134
- var index$9 = /*#__PURE__*/Object.freeze({
22182
+ var index$a = /*#__PURE__*/Object.freeze({
21135
22183
  __proto__: null,
21136
22184
  getCategory: getCategory,
21137
22185
  getCategories: getCategories
@@ -21299,7 +22347,7 @@ getCustomRankingGlobalFeed.locally = (query) => {
21299
22347
  : undefined;
21300
22348
  };
21301
22349
 
21302
- var index$8 = /*#__PURE__*/Object.freeze({
22350
+ var index$9 = /*#__PURE__*/Object.freeze({
21303
22351
  __proto__: null,
21304
22352
  queryGlobalFeed: queryGlobalFeed,
21305
22353
  getCustomRankingGlobalFeed: getCustomRankingGlobalFeed
@@ -21672,19 +22720,26 @@ const declinePost = async (postId) => {
21672
22720
  /**
21673
22721
  * ```js
21674
22722
  * import { PostRepository } from '@amityco/ts-sdk'
21675
- * const flagged = await PostRepository.flagPost(postId)
22723
+ * const flagged = await PostRepository.flagPost(postId, reason)
21676
22724
  * ```
21677
22725
  *
21678
22726
  * @param postId of the post to flag
22727
+ * @param reason the reason to flag the post
21679
22728
  * @returns a boolean
21680
22729
  *
21681
22730
  * @category Post API
21682
22731
  * @async
21683
22732
  * */
21684
- const flagPost = async (postId) => {
22733
+ const flagPost = async (postId, reason) => {
21685
22734
  const client = getActiveClient();
21686
22735
  client.log('post/flagPost', postId);
21687
- const { data: payload } = await client.http.post(`/api/v3/posts/${encodeURIComponent(postId)}/flag`);
22736
+ const isPredefinedReason = reason &&
22737
+ Object.entries(exports.ContentFlagReasonEnum).some(([key, value]) => key !== exports.ContentFlagReasonEnum.Others && value === reason);
22738
+ const body = {
22739
+ reason: reason && isPredefinedReason ? reason : exports.ContentFlagReasonEnum.Others,
22740
+ detail: reason && !isPredefinedReason ? reason : '',
22741
+ };
22742
+ const { data: payload } = await client.http.post(`/api/v3/posts/${encodeURIComponent(postId)}/flag`, body);
21688
22743
  if (client.cache) {
21689
22744
  ingestInCache(prepareMembershipPayload(payload, 'communityUsers'));
21690
22745
  }
@@ -22147,19 +23202,26 @@ const hardDeleteComment = async (commentId) => {
22147
23202
  /**
22148
23203
  * ```js
22149
23204
  * import { CommentRepository } from '@amityco/ts-sdk'
22150
- * const flagged = await CommentRepository.flagComment('commentId')
23205
+ * const flagged = await CommentRepository.flagComment(commentId, reason)
22151
23206
  * ```
22152
23207
  *
22153
23208
  * @param commentId The ID of the comment to flag
23209
+ * @param reason the reason to flag the comment
22154
23210
  * @returns the created report result
22155
23211
  *
22156
23212
  * @category Comment API
22157
23213
  * @async
22158
23214
  * */
22159
- const flagComment = async (commentId) => {
23215
+ const flagComment = async (commentId, reason) => {
22160
23216
  const client = getActiveClient();
22161
23217
  client.log('comment/flagComment', commentId);
22162
- const { data: payload } = await client.http.post(`/api/v3/comments/${encodeURIComponent(commentId)}/flag`);
23218
+ const isPredefinedReason = reason &&
23219
+ Object.entries(exports.ContentFlagReasonEnum).some(([key, value]) => key !== exports.ContentFlagReasonEnum.Others && value === reason);
23220
+ const body = {
23221
+ reason: reason && isPredefinedReason ? reason : exports.ContentFlagReasonEnum.Others,
23222
+ detail: reason && !isPredefinedReason ? reason : '',
23223
+ };
23224
+ const { data: payload } = await client.http.post(`/api/v3/comments/${encodeURIComponent(commentId)}/flag`, body);
22163
23225
  if (client.cache) {
22164
23226
  ingestInCache(payload);
22165
23227
  }
@@ -22614,7 +23676,7 @@ const getComments = (params, callback, config) => {
22614
23676
  };
22615
23677
  /* end_public_function */
22616
23678
 
22617
- var index$7 = /*#__PURE__*/Object.freeze({
23679
+ var index$8 = /*#__PURE__*/Object.freeze({
22618
23680
  __proto__: null,
22619
23681
  getCommentByIds: getCommentByIds,
22620
23682
  createComment: createComment,
@@ -23140,7 +24202,8 @@ class PinnedPostQueryStreamController extends QueryStreamController {
23140
24202
  const client = getActiveClient();
23141
24203
  const cachedAt = client.cache && Date.now();
23142
24204
  if (client.cache) {
23143
- ingestInCache(response, { cachedAt });
24205
+ const processedPayload = Object.assign(Object.assign({}, response), { users: response.users ? response.users.map(convertRawUserToInternalUser) : [] });
24206
+ ingestInCache(processedPayload, { cachedAt });
23144
24207
  }
23145
24208
  }
23146
24209
  appendToQueryStream(response, direction, refresh = false) {
@@ -23269,7 +24332,8 @@ class GlobalPinnedPostQueryStreamController extends QueryStreamController {
23269
24332
  const client = getActiveClient();
23270
24333
  const cachedAt = client.cache && Date.now();
23271
24334
  if (client.cache) {
23272
- ingestInCache(response, { cachedAt });
24335
+ const processedPayload = Object.assign(Object.assign({}, response), { users: response.users.map(convertRawUserToInternalUser) });
24336
+ ingestInCache(processedPayload, { cachedAt });
23273
24337
  }
23274
24338
  }
23275
24339
  appendToQueryStream(response, direction, refresh = false) {
@@ -23621,7 +24685,7 @@ const semanticSearchPosts = (params, callback, config) => {
23621
24685
  };
23622
24686
  };
23623
24687
 
23624
- var index$6 = /*#__PURE__*/Object.freeze({
24688
+ var index$7 = /*#__PURE__*/Object.freeze({
23625
24689
  __proto__: null,
23626
24690
  getPostByIds: getPostByIds,
23627
24691
  createPost: createPost,
@@ -24155,7 +25219,7 @@ const getStreams = (params, callback, config) => {
24155
25219
  };
24156
25220
  };
24157
25221
 
24158
- var index$5 = /*#__PURE__*/Object.freeze({
25222
+ var index$6 = /*#__PURE__*/Object.freeze({
24159
25223
  __proto__: null,
24160
25224
  createStream: createStream,
24161
25225
  updateStream: updateStream,
@@ -24442,7 +25506,7 @@ const getPoll = (pollId, callback) => {
24442
25506
  };
24443
25507
  /* end_public_function */
24444
25508
 
24445
- var index$4 = /*#__PURE__*/Object.freeze({
25509
+ var index$5 = /*#__PURE__*/Object.freeze({
24446
25510
  __proto__: null,
24447
25511
  createPoll: createPoll,
24448
25512
  closePoll: closePoll,
@@ -24813,7 +25877,7 @@ const getPlayer = async (parameters) => {
24813
25877
  return video;
24814
25878
  };
24815
25879
 
24816
- var index$3 = /*#__PURE__*/Object.freeze({
25880
+ var index$4 = /*#__PURE__*/Object.freeze({
24817
25881
  __proto__: null,
24818
25882
  getPlayer: getPlayer
24819
25883
  });
@@ -25986,7 +27050,7 @@ const getGlobalStoryTargets = (params, callback, config) => {
25986
27050
  };
25987
27051
  };
25988
27052
 
25989
- var index$2 = /*#__PURE__*/Object.freeze({
27053
+ var index$3 = /*#__PURE__*/Object.freeze({
25990
27054
  __proto__: null,
25991
27055
  createImageStory: createImageStory,
25992
27056
  createVideoStory: createVideoStory,
@@ -26023,7 +27087,7 @@ const getNetworkAds = async () => {
26023
27087
  };
26024
27088
  };
26025
27089
 
26026
- var index$1 = /*#__PURE__*/Object.freeze({
27090
+ var index$2 = /*#__PURE__*/Object.freeze({
26027
27091
  __proto__: null,
26028
27092
  getNetworkAds: getNetworkAds
26029
27093
  });
@@ -26414,7 +27478,7 @@ const markTraySeen = async (lastSeenAt) => {
26414
27478
  };
26415
27479
  /* end_public_function */
26416
27480
 
26417
- var index = /*#__PURE__*/Object.freeze({
27481
+ var index$1 = /*#__PURE__*/Object.freeze({
26418
27482
  __proto__: null,
26419
27483
  getNotificationTraySeen: getNotificationTraySeen,
26420
27484
  getNotificationTrayItems: getNotificationTrayItems,
@@ -26423,31 +27487,232 @@ var index = /*#__PURE__*/Object.freeze({
26423
27487
  onNotificationTraySeenUpdated: onNotificationTraySeenUpdated
26424
27488
  });
26425
27489
 
27490
+ class MyInvitationsPaginationController extends PaginationController {
27491
+ async getRequest(queryParams, token) {
27492
+ const { limit = COLLECTION_DEFAULT_PAGINATION_LIMIT } = queryParams, params = __rest(queryParams, ["limit"]);
27493
+ const options = token ? { token } : { limit };
27494
+ const { data } = await this.http.get('/api/v1/invitations/me', { params: Object.assign(Object.assign({}, params), { options }) });
27495
+ await getCommunities$1(data.invitations.map(invitation => invitation.targetId));
27496
+ return data;
27497
+ }
27498
+ }
27499
+
27500
+ class MyInvitationsQueryStreamController extends QueryStreamController {
27501
+ constructor(query, cacheKey, notifyChange, preparePayload) {
27502
+ super(query, cacheKey);
27503
+ this.notifyChange = notifyChange;
27504
+ this.preparePayload = preparePayload;
27505
+ }
27506
+ async saveToMainDB(response) {
27507
+ const processedPayload = await this.preparePayload(response);
27508
+ const client = getActiveClient();
27509
+ const cachedAt = client.cache && Date.now();
27510
+ if (client.cache) {
27511
+ ingestInCache(processedPayload, { cachedAt });
27512
+ }
27513
+ }
27514
+ appendToQueryStream(response, direction, refresh = false) {
27515
+ var _a, _b;
27516
+ if (refresh) {
27517
+ pushToCache(this.cacheKey, {
27518
+ data: response.invitations.map(getResolver('invitation')),
27519
+ });
27520
+ }
27521
+ else {
27522
+ const collection = (_a = pullFromCache(this.cacheKey)) === null || _a === void 0 ? void 0 : _a.data;
27523
+ const invitations = (_b = collection === null || collection === void 0 ? void 0 : collection.data) !== null && _b !== void 0 ? _b : [];
27524
+ pushToCache(this.cacheKey, Object.assign(Object.assign({}, collection), { data: [
27525
+ ...new Set([...invitations, ...response.invitations.map(getResolver('invitation'))]),
27526
+ ] }));
27527
+ }
27528
+ }
27529
+ reactor(action) {
27530
+ return (invitations) => {
27531
+ var _a;
27532
+ const collection = (_a = pullFromCache(this.cacheKey)) === null || _a === void 0 ? void 0 : _a.data;
27533
+ if (!collection)
27534
+ return;
27535
+ if (action === InvitationActionsEnum.OnLocalInvitationUpdated) {
27536
+ const isExist = collection.data.find(id => id === invitations[0].invitationId);
27537
+ if (!isExist)
27538
+ return;
27539
+ }
27540
+ if (action === InvitationActionsEnum.OnLocalInvitationCreated) {
27541
+ const client = getActiveClient();
27542
+ const myInvitations = invitations.filter(invitation => invitation.invitedUserId === client.userId);
27543
+ collection.data = [
27544
+ ...new Set([
27545
+ ...myInvitations.map(invitation => invitation.invitationId),
27546
+ ...collection.data,
27547
+ ]),
27548
+ ];
27549
+ }
27550
+ if (action === InvitationActionsEnum.OnLocalInvitationDeleted) {
27551
+ collection.data = collection.data.filter(id => id !== invitations[0].invitationId);
27552
+ }
27553
+ pushToCache(this.cacheKey, collection);
27554
+ this.notifyChange({ origin: "event" /* Amity.LiveDataOrigin.EVENT */, loading: false });
27555
+ };
27556
+ }
27557
+ subscribeRTE(createSubscriber) {
27558
+ return createSubscriber.map(subscriber => subscriber.fn(this.reactor(subscriber.action)));
27559
+ }
27560
+ }
27561
+
27562
+ class MyInvitationsLiveCollectionController extends LiveCollectionController {
27563
+ constructor(query, callback) {
27564
+ const queryStreamId = hash__default["default"](query);
27565
+ const cacheKey = ['invitation', 'collection', queryStreamId];
27566
+ const paginationController = new MyInvitationsPaginationController(query);
27567
+ super(paginationController, queryStreamId, cacheKey, callback);
27568
+ this.query = query;
27569
+ this.queryStreamController = new MyInvitationsQueryStreamController(this.query, this.cacheKey, this.notifyChange.bind(this), prepareMyInvitationsPayload);
27570
+ this.callback = callback.bind(this);
27571
+ this.loadPage({ initial: true });
27572
+ }
27573
+ setup() {
27574
+ var _a;
27575
+ const collection = (_a = pullFromCache(this.cacheKey)) === null || _a === void 0 ? void 0 : _a.data;
27576
+ if (!collection) {
27577
+ pushToCache(this.cacheKey, {
27578
+ data: [],
27579
+ params: this.query,
27580
+ });
27581
+ }
27582
+ }
27583
+ async persistModel(queryPayload) {
27584
+ await this.queryStreamController.saveToMainDB(queryPayload);
27585
+ }
27586
+ persistQueryStream({ response, direction, refresh, }) {
27587
+ this.queryStreamController.appendToQueryStream(response, direction, refresh);
27588
+ }
27589
+ startSubscription() {
27590
+ return this.queryStreamController.subscribeRTE([
27591
+ {
27592
+ fn: onLocalInvitationCreated,
27593
+ action: InvitationActionsEnum.OnLocalInvitationCreated,
27594
+ },
27595
+ {
27596
+ fn: onLocalInvitationUpdated,
27597
+ action: InvitationActionsEnum.OnLocalInvitationUpdated,
27598
+ },
27599
+ {
27600
+ fn: onLocalInvitationDeleted,
27601
+ action: InvitationActionsEnum.OnLocalInvitationDeleted,
27602
+ },
27603
+ ]);
27604
+ }
27605
+ notifyChange({ origin, loading, error }) {
27606
+ var _a, _b;
27607
+ const collection = (_a = pullFromCache(this.cacheKey)) === null || _a === void 0 ? void 0 : _a.data;
27608
+ if (!collection)
27609
+ return;
27610
+ const data = this.applyFilter((_b = collection.data
27611
+ .map(id => pullFromCache(['invitation', 'get', id]))
27612
+ .filter(isNonNullable)
27613
+ .map(({ data }) => invitationLinkedObject(data))) !== null && _b !== void 0 ? _b : []);
27614
+ if (!this.shouldNotify(data) && origin === 'event')
27615
+ return;
27616
+ this.callback({
27617
+ onNextPage: () => this.loadPage({ direction: "next" /* Amity.LiveCollectionPageDirection.NEXT */ }),
27618
+ data,
27619
+ hasNextPage: !!this.paginationController.getNextToken(),
27620
+ loading,
27621
+ error,
27622
+ });
27623
+ }
27624
+ applyFilter(data) {
27625
+ let invitations = data;
27626
+ if (this.query.targetId) {
27627
+ invitations = invitations.filter(invitation => invitation.targetId === this.query.targetId);
27628
+ }
27629
+ if (this.query.statuses) {
27630
+ invitations = invitations.filter(invitation => { var _a; return (_a = this.query.statuses) === null || _a === void 0 ? void 0 : _a.includes(invitation.status); });
27631
+ }
27632
+ if (this.query.targetType) {
27633
+ invitations = invitations.filter(invitation => invitation.targetType === this.query.targetType);
27634
+ }
27635
+ if (this.query.type) {
27636
+ invitations = invitations.filter(invitation => invitation.type === this.query.type);
27637
+ }
27638
+ const sortFn = (() => {
27639
+ switch (this.query.sortBy) {
27640
+ case 'firstCreated':
27641
+ return sortByFirstCreated;
27642
+ case 'lastCreated':
27643
+ return sortByLastCreated;
27644
+ default:
27645
+ return sortByLastCreated;
27646
+ }
27647
+ })();
27648
+ invitations = invitations.sort(sortFn);
27649
+ return invitations;
27650
+ }
27651
+ }
27652
+
27653
+ /**
27654
+ * Get my community invitations
27655
+ *
27656
+ * @param params the query parameters
27657
+ * @param callback the callback to be called when the invitations are fetched
27658
+ * @returns invitations
27659
+ *
27660
+ * @category My Community Invitations Live Collection
27661
+ *
27662
+ */
27663
+ const getMyCommunityInvitations = (params, callback, config) => {
27664
+ const { log, cache } = getActiveClient();
27665
+ if (!cache) {
27666
+ console.log(ENABLE_CACHE_MESSAGE);
27667
+ }
27668
+ const timestamp = Date.now();
27669
+ log(`getMyCommunityInvitations: (tmpid: ${timestamp}) > listen`);
27670
+ const invitationsLiveCollection = new MyInvitationsLiveCollectionController(Object.assign(Object.assign({}, params), { targetType: 'community', statuses: ["pending" /* InvitationStatusEnum.Pending */] }), callback);
27671
+ const disposers = invitationsLiveCollection.startSubscription();
27672
+ const cacheKey = invitationsLiveCollection.getCacheKey();
27673
+ disposers.push(() => {
27674
+ dropFromCache(cacheKey);
27675
+ });
27676
+ return () => {
27677
+ log(`getInvitations (tmpid: ${timestamp}) > dispose`);
27678
+ disposers.forEach(fn => fn());
27679
+ };
27680
+ };
27681
+
27682
+ var index = /*#__PURE__*/Object.freeze({
27683
+ __proto__: null,
27684
+ onLocalInvitationCreated: onLocalInvitationCreated,
27685
+ onLocalInvitationUpdated: onLocalInvitationUpdated,
27686
+ onLocalInvitationDeleted: onLocalInvitationDeleted,
27687
+ getMyCommunityInvitations: getMyCommunityInvitations
27688
+ });
27689
+
26426
27690
  exports.API_REGIONS = API_REGIONS;
26427
- exports.AdRepository = index$1;
26428
- exports.CategoryRepository = index$9;
26429
- exports.ChannelRepository = index$d;
26430
- exports.Client = index$m;
26431
- exports.CommentRepository = index$7;
27691
+ exports.AdRepository = index$2;
27692
+ exports.CategoryRepository = index$a;
27693
+ exports.ChannelRepository = index$e;
27694
+ exports.Client = index$n;
27695
+ exports.CommentRepository = index$8;
26432
27696
  exports.CommunityPostSettingMaps = CommunityPostSettingMaps;
26433
27697
  exports.CommunityPostSettings = CommunityPostSettings;
26434
- exports.CommunityRepository = index$a;
27698
+ exports.CommunityRepository = index$b;
26435
27699
  exports.ContentFeedType = ContentFeedType;
26436
27700
  exports.DefaultCommunityPostSetting = DefaultCommunityPostSetting;
26437
- exports.FeedRepository = index$8;
26438
- exports.FileRepository = index$j;
27701
+ exports.FeedRepository = index$9;
27702
+ exports.FileRepository = index$k;
26439
27703
  exports.FileType = FileType;
26440
- exports.LiveStreamPlayer = index$3;
27704
+ exports.InvitationRepository = index;
27705
+ exports.LiveStreamPlayer = index$4;
26441
27706
  exports.MessageContentType = MessageContentType;
26442
- exports.MessageRepository = index$h;
26443
- exports.PollRepository = index$4;
27707
+ exports.MessageRepository = index$i;
27708
+ exports.PollRepository = index$5;
26444
27709
  exports.PostContentType = PostContentType;
26445
- exports.PostRepository = index$6;
26446
- exports.ReactionRepository = index$i;
26447
- exports.StoryRepository = index$2;
26448
- exports.StreamRepository = index$5;
26449
- exports.SubChannelRepository = index$g;
26450
- exports.UserRepository = index$k;
27710
+ exports.PostRepository = index$7;
27711
+ exports.ReactionRepository = index$j;
27712
+ exports.StoryRepository = index$3;
27713
+ exports.StreamRepository = index$6;
27714
+ exports.SubChannelRepository = index$h;
27715
+ exports.UserRepository = index$l;
26451
27716
  exports.VERSION = VERSION;
26452
27717
  exports.VideoResolution = VideoResolution;
26453
27718
  exports.VideoSize = VideoSize;
@@ -26500,7 +27765,7 @@ exports.isPaged = isPaged;
26500
27765
  exports.isReportedByMe = isReportedByMe;
26501
27766
  exports.isSkip = isSkip;
26502
27767
  exports.mergeInCache = mergeInCache;
26503
- exports.notificationTray = index;
27768
+ exports.notificationTray = index$1;
26504
27769
  exports.onChannelMarkerFetched = onChannelMarkerFetched;
26505
27770
  exports.onFeedMarkerFetched = onFeedMarkerFetched;
26506
27771
  exports.onFeedMarkerUpdated = onFeedMarkerUpdated;