@amityco/ts-sdk 0.0.1-e26de88.0 → 0.0.1-e556efe.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 (340) hide show
  1. package/.eslintrc.json +13 -10
  2. package/dist/@types/core/events.d.ts +15 -10
  3. package/dist/@types/core/events.d.ts.map +1 -1
  4. package/dist/@types/core/live.d.ts +23 -0
  5. package/dist/@types/core/live.d.ts.map +1 -0
  6. package/dist/@types/core/model.d.ts +6 -0
  7. package/dist/@types/core/model.d.ts.map +1 -1
  8. package/dist/@types/core/paging.d.ts +1 -1
  9. package/dist/@types/core/paging.d.ts.map +1 -1
  10. package/dist/@types/core/payload.d.ts +15 -6
  11. package/dist/@types/core/payload.d.ts.map +1 -1
  12. package/dist/@types/domains/channel.d.ts +1 -2
  13. package/dist/@types/domains/channel.d.ts.map +1 -1
  14. package/dist/@types/domains/comment.d.ts +15 -0
  15. package/dist/@types/domains/comment.d.ts.map +1 -1
  16. package/dist/@types/domains/content.d.ts +5 -2
  17. package/dist/@types/domains/content.d.ts.map +1 -1
  18. package/dist/@types/domains/follow.d.ts +2 -1
  19. package/dist/@types/domains/follow.d.ts.map +1 -1
  20. package/dist/@types/domains/message.d.ts +5 -2
  21. package/dist/@types/domains/message.d.ts.map +1 -1
  22. package/dist/@types/domains/poll.d.ts +27 -0
  23. package/dist/@types/domains/poll.d.ts.map +1 -0
  24. package/dist/@types/domains/post.d.ts +18 -1
  25. package/dist/@types/domains/post.d.ts.map +1 -1
  26. package/dist/@types/domains/reaction.d.ts +18 -8
  27. package/dist/@types/domains/reaction.d.ts.map +1 -1
  28. package/dist/@types/domains/user.d.ts +2 -1
  29. package/dist/@types/domains/user.d.ts.map +1 -1
  30. package/dist/@types/index.d.ts +2 -0
  31. package/dist/@types/index.d.ts.map +1 -1
  32. package/dist/cache/api/ingestInCache.d.ts +1 -1
  33. package/dist/cache/api/ingestInCache.d.ts.map +1 -1
  34. package/dist/cache/api/mergeInCache.d.ts +1 -1
  35. package/dist/cache/api/mergeInCache.d.ts.map +1 -1
  36. package/dist/category/api/getCategory.d.ts +18 -2
  37. package/dist/category/api/getCategory.d.ts.map +1 -1
  38. package/dist/category/api/queryCategories.d.ts +23 -11
  39. package/dist/category/api/queryCategories.d.ts.map +1 -1
  40. package/dist/channel/api/addChannelMembers.d.ts.map +1 -1
  41. package/dist/channel/api/banChannelMembers.d.ts +16 -0
  42. package/dist/channel/api/banChannelMembers.d.ts.map +1 -0
  43. package/dist/channel/api/deleteChannel.d.ts.map +1 -1
  44. package/dist/channel/api/index.d.ts +2 -0
  45. package/dist/channel/api/index.d.ts.map +1 -1
  46. package/dist/channel/api/queryChannelMembers.d.ts +2 -1
  47. package/dist/channel/api/queryChannelMembers.d.ts.map +1 -1
  48. package/dist/channel/api/queryChannels.d.ts +9 -6
  49. package/dist/channel/api/queryChannels.d.ts.map +1 -1
  50. package/dist/channel/api/removeChannelMembers.d.ts.map +1 -1
  51. package/dist/channel/api/unbanChannelMembers.d.ts +16 -0
  52. package/dist/channel/api/unbanChannelMembers.d.ts.map +1 -0
  53. package/dist/channel/api/updateChannel.d.ts +1 -1
  54. package/dist/channel/api/updateChannel.d.ts.map +1 -1
  55. package/dist/channel/events/index.d.ts +2 -2
  56. package/dist/channel/events/index.d.ts.map +1 -1
  57. package/dist/channel/events/onChannelMemberAdded.d.ts +17 -0
  58. package/dist/channel/events/onChannelMemberAdded.d.ts.map +1 -0
  59. package/dist/channel/events/onChannelMemberRemoved.d.ts +17 -0
  60. package/dist/channel/events/onChannelMemberRemoved.d.ts.map +1 -0
  61. package/dist/channel/observers/observeChannel.d.ts.map +1 -1
  62. package/dist/client/api/connectClient.d.ts +7 -4
  63. package/dist/client/api/connectClient.d.ts.map +1 -1
  64. package/dist/client/api/createClient.d.ts +1 -1
  65. package/dist/client/api/createClient.d.ts.map +1 -1
  66. package/dist/comment/api/queryComments.d.ts +1 -8
  67. package/dist/comment/api/queryComments.d.ts.map +1 -1
  68. package/dist/comment/observers/index.d.ts +1 -0
  69. package/dist/comment/observers/index.d.ts.map +1 -1
  70. package/dist/comment/observers/liveComments.d.ts +22 -0
  71. package/dist/comment/observers/liveComments.d.ts.map +1 -0
  72. package/dist/comment/observers/observeComments.d.ts.map +1 -1
  73. package/dist/community/api/addCommunityMembersRoles.d.ts +18 -0
  74. package/dist/community/api/addCommunityMembersRoles.d.ts.map +1 -0
  75. package/dist/community/api/getRecommendedCommunities.d.ts +1 -1
  76. package/dist/community/api/getRecommendedCommunities.d.ts.map +1 -1
  77. package/dist/community/api/getTopTrendingCommunities.d.ts +1 -1
  78. package/dist/community/api/getTopTrendingCommunities.d.ts.map +1 -1
  79. package/dist/community/api/index.d.ts +2 -2
  80. package/dist/community/api/index.d.ts.map +1 -1
  81. package/dist/community/api/queryCommunities.d.ts +7 -7
  82. package/dist/community/api/queryCommunities.d.ts.map +1 -1
  83. package/dist/community/api/removeCommunityMembersRoles.d.ts +18 -0
  84. package/dist/community/api/removeCommunityMembersRoles.d.ts.map +1 -0
  85. package/dist/core/debug.d.ts +1 -1
  86. package/dist/core/debug.d.ts.map +1 -1
  87. package/dist/core/events.d.ts +3 -3
  88. package/dist/core/events.d.ts.map +1 -1
  89. package/dist/core/model/idResolvers.d.ts.map +1 -1
  90. package/dist/core/model/identifyModel.d.ts +1 -0
  91. package/dist/core/model/identifyModel.d.ts.map +1 -1
  92. package/dist/core/model/index.d.ts.map +1 -1
  93. package/dist/core/query/paging.d.ts +2 -2
  94. package/dist/core/query/paging.d.ts.map +1 -1
  95. package/dist/core/query/query.d.ts +1 -1
  96. package/dist/core/query/query.d.ts.map +1 -1
  97. package/dist/core/subscription.d.ts +2 -0
  98. package/dist/core/subscription.d.ts.map +1 -1
  99. package/dist/core/tests/query/filtering.test.d.ts +2 -0
  100. package/dist/core/tests/query/filtering.test.d.ts.map +1 -0
  101. package/dist/core/tests/query/query.test.d.ts +2 -0
  102. package/dist/core/tests/query/query.test.d.ts.map +1 -0
  103. package/dist/core/transports/ws.d.ts +1 -1
  104. package/dist/core/transports/ws.d.ts.map +1 -1
  105. package/dist/external/api/createUserToken.d.ts +23 -0
  106. package/dist/external/api/createUserToken.d.ts.map +1 -0
  107. package/dist/external/api/index.d.ts +2 -0
  108. package/dist/external/api/index.d.ts.map +1 -0
  109. package/dist/feed/api/queryGlobalFeed.d.ts +4 -4
  110. package/dist/feed/api/queryGlobalFeed.d.ts.map +1 -1
  111. package/dist/file/api/createFile.d.ts +2 -1
  112. package/dist/file/api/createFile.d.ts.map +1 -1
  113. package/dist/file/api/createImage.d.ts +17 -0
  114. package/dist/file/api/createImage.d.ts.map +1 -0
  115. package/dist/file/api/createVideo.d.ts +1 -0
  116. package/dist/file/api/createVideo.d.ts.map +1 -1
  117. package/dist/file/api/getFile.d.ts +1 -1
  118. package/dist/file/api/index.d.ts +1 -0
  119. package/dist/file/api/index.d.ts.map +1 -1
  120. package/dist/follow/api/follow.d.ts.map +1 -1
  121. package/dist/follow/api/getFollowInfo.d.ts.map +1 -1
  122. package/dist/follow/api/queryFollowers.d.ts +4 -4
  123. package/dist/follow/api/queryFollowers.d.ts.map +1 -1
  124. package/dist/follow/api/queryFollowings.d.ts +4 -4
  125. package/dist/follow/api/queryFollowings.d.ts.map +1 -1
  126. package/dist/follow/api/utils.d.ts +4 -4
  127. package/dist/follow/api/utils.d.ts.map +1 -1
  128. package/dist/follow/events/utils.d.ts.map +1 -1
  129. package/dist/index.cjs.js +20229 -14222
  130. package/dist/index.d.ts +6 -0
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.esm.js +20194 -14213
  133. package/dist/index.umd.js +4 -19
  134. package/dist/message/api/createMessage.d.ts +2 -2
  135. package/dist/message/api/createMessage.d.ts.map +1 -1
  136. package/dist/message/api/updateMessage.d.ts +2 -2
  137. package/dist/message/api/updateMessage.d.ts.map +1 -1
  138. package/dist/message/events/onMessageUpdated.d.ts.map +1 -1
  139. package/dist/poll/api/closePoll.d.ts +16 -0
  140. package/dist/poll/api/closePoll.d.ts.map +1 -0
  141. package/dist/poll/api/createPoll.d.ts +25 -0
  142. package/dist/poll/api/createPoll.d.ts.map +1 -0
  143. package/dist/poll/api/deletePoll.d.ts +16 -0
  144. package/dist/poll/api/deletePoll.d.ts.map +1 -0
  145. package/dist/poll/api/getPoll.d.ts +32 -0
  146. package/dist/poll/api/getPoll.d.ts.map +1 -0
  147. package/dist/poll/api/index.d.ts +6 -0
  148. package/dist/poll/api/index.d.ts.map +1 -0
  149. package/dist/poll/api/votePoll.d.ts +17 -0
  150. package/dist/poll/api/votePoll.d.ts.map +1 -0
  151. package/dist/poll/events/index.d.ts +3 -0
  152. package/dist/poll/events/index.d.ts.map +1 -0
  153. package/dist/poll/events/onPollDeleted.d.ts +17 -0
  154. package/dist/poll/events/onPollDeleted.d.ts.map +1 -0
  155. package/dist/poll/events/onPollUpdated.d.ts +17 -0
  156. package/dist/poll/events/onPollUpdated.d.ts.map +1 -0
  157. package/dist/poll/observers/index.d.ts +2 -0
  158. package/dist/poll/observers/index.d.ts.map +1 -0
  159. package/dist/poll/observers/observePoll.d.ts +18 -0
  160. package/dist/poll/observers/observePoll.d.ts.map +1 -0
  161. package/dist/post/api/approvePost.d.ts +17 -0
  162. package/dist/post/api/approvePost.d.ts.map +1 -0
  163. package/dist/post/api/declinePost.d.ts +17 -0
  164. package/dist/post/api/declinePost.d.ts.map +1 -0
  165. package/dist/post/api/getPost.d.ts +1 -1
  166. package/dist/post/api/index.d.ts +2 -0
  167. package/dist/post/api/index.d.ts.map +1 -1
  168. package/dist/post/api/queryPosts.d.ts +1 -12
  169. package/dist/post/api/queryPosts.d.ts.map +1 -1
  170. package/dist/post/observers/index.d.ts +1 -0
  171. package/dist/post/observers/index.d.ts.map +1 -1
  172. package/dist/post/observers/livePosts.d.ts +22 -0
  173. package/dist/post/observers/livePosts.d.ts.map +1 -0
  174. package/dist/post/observers/observePosts.d.ts.map +1 -1
  175. package/dist/post/tests/api/getPost.test.d.ts +2 -0
  176. package/dist/post/tests/api/getPost.test.d.ts.map +1 -0
  177. package/dist/post/tests/api/queryPosts.test.d.ts +2 -0
  178. package/dist/post/tests/api/queryPosts.test.d.ts.map +1 -0
  179. package/dist/reaction/api/index.d.ts +1 -0
  180. package/dist/reaction/api/index.d.ts.map +1 -1
  181. package/dist/reaction/api/queryReactions.d.ts +19 -0
  182. package/dist/reaction/api/queryReactions.d.ts.map +1 -0
  183. package/dist/reaction/events/index.d.ts +3 -0
  184. package/dist/reaction/events/index.d.ts.map +1 -1
  185. package/dist/reaction/events/onReactionAdded.d.ts.map +1 -1
  186. package/dist/reaction/events/onReactorAdded.d.ts +19 -0
  187. package/dist/reaction/events/onReactorAdded.d.ts.map +1 -0
  188. package/dist/reaction/events/onReactorRemoved.d.ts +19 -0
  189. package/dist/reaction/events/onReactorRemoved.d.ts.map +1 -0
  190. package/dist/reaction/observers/index.d.ts +2 -0
  191. package/dist/reaction/observers/index.d.ts.map +1 -0
  192. package/dist/reaction/observers/liveReactions.d.ts +22 -0
  193. package/dist/reaction/observers/liveReactions.d.ts.map +1 -0
  194. package/dist/reaction/utils/index.d.ts +1 -0
  195. package/dist/reaction/utils/index.d.ts.map +1 -1
  196. package/dist/reaction/utils/prepareMessagePayloadForCache.d.ts +3 -0
  197. package/dist/reaction/utils/prepareMessagePayloadForCache.d.ts.map +1 -0
  198. package/dist/report/api/createReport.d.ts.map +1 -1
  199. package/dist/report/api/deleteReport.d.ts.map +1 -1
  200. package/dist/role/api/queryRoles.d.ts +4 -4
  201. package/dist/role/api/queryRoles.d.ts.map +1 -1
  202. package/dist/stream/api/queryStreams.d.ts +6 -6
  203. package/dist/stream/api/queryStreams.d.ts.map +1 -1
  204. package/dist/user/api/updateUser.d.ts +1 -1
  205. package/dist/user/api/updateUser.d.ts.map +1 -1
  206. package/dist/user/events/index.d.ts +1 -0
  207. package/dist/user/events/index.d.ts.map +1 -1
  208. package/dist/user/events/onUserDeleted.d.ts +17 -0
  209. package/dist/user/events/onUserDeleted.d.ts.map +1 -0
  210. package/dist/user/observers/observeUser.d.ts +1 -1
  211. package/dist/user/observers/observeUser.d.ts.map +1 -1
  212. package/dist/utils/constants.d.ts +3 -0
  213. package/dist/utils/constants.d.ts.map +1 -0
  214. package/dist/utils/env.d.ts.map +1 -1
  215. package/dist/utils/tests/client.d.ts +3 -0
  216. package/dist/utils/tests/client.d.ts.map +1 -0
  217. package/dist/utils/tests/dummy.d.ts +8 -0
  218. package/dist/utils/tests/dummy.d.ts.map +1 -0
  219. package/dist/utils/tests/index.d.ts +3 -0
  220. package/dist/utils/tests/index.d.ts.map +1 -0
  221. package/jest.config.ts +15 -0
  222. package/package.json +22 -17
  223. package/src/@types/core/events.ts +16 -10
  224. package/src/@types/core/live.ts +28 -0
  225. package/src/@types/core/model.ts +6 -0
  226. package/src/@types/core/paging.ts +1 -1
  227. package/src/@types/core/payload.ts +19 -7
  228. package/src/@types/domains/channel.ts +1 -2
  229. package/src/@types/domains/comment.ts +32 -0
  230. package/src/@types/domains/content.ts +7 -1
  231. package/src/@types/domains/follow.ts +3 -1
  232. package/src/@types/domains/message.ts +11 -1
  233. package/src/@types/domains/poll.ts +32 -0
  234. package/src/@types/domains/post.ts +38 -1
  235. package/src/@types/domains/reaction.ts +26 -9
  236. package/src/@types/domains/user.ts +2 -0
  237. package/src/@types/index.ts +3 -0
  238. package/src/category/api/getCategory.ts +45 -7
  239. package/src/category/api/queryCategories.ts +70 -13
  240. package/src/channel/api/addChannelMembers.ts +2 -1
  241. package/src/channel/api/banChannelMembers.ts +41 -0
  242. package/src/channel/api/deleteChannel.ts +0 -1
  243. package/src/channel/api/index.ts +3 -0
  244. package/src/channel/api/queryChannelMembers.ts +4 -4
  245. package/src/channel/api/queryChannels.ts +3 -0
  246. package/src/channel/api/removeChannelMembers.ts +2 -1
  247. package/src/channel/api/unbanChannelMembers.ts +41 -0
  248. package/src/channel/api/updateChannel.ts +1 -1
  249. package/src/channel/events/index.ts +2 -2
  250. package/src/channel/events/{onMemberAdded.ts → onChannelMemberAdded.ts} +8 -6
  251. package/src/channel/events/{onMemberRemoved.ts → onChannelMemberRemoved.ts} +13 -6
  252. package/src/channel/observers/observeChannel.ts +8 -4
  253. package/src/client/api/connectClient.ts +28 -16
  254. package/src/comment/api/queryComments.ts +8 -11
  255. package/src/comment/observers/index.ts +1 -0
  256. package/src/comment/observers/liveComments.ts +172 -0
  257. package/src/comment/observers/observeComments.ts +1 -11
  258. package/src/community/api/{addCommunityMembersRole.ts → addCommunityMembersRoles.ts} +11 -10
  259. package/src/community/api/index.ts +2 -3
  260. package/src/community/api/{removeCommunityMembersRole.ts → removeCommunityMembersRoles.ts} +11 -10
  261. package/src/core/model/idResolvers.ts +3 -0
  262. package/src/core/model/identifyModel.ts +21 -0
  263. package/src/core/model/index.ts +3 -0
  264. package/src/core/query/paging.ts +3 -3
  265. package/src/core/query/query.ts +32 -1
  266. package/src/core/subscription.ts +17 -4
  267. package/src/core/tests/query/filtering.test.ts +11 -0
  268. package/src/core/tests/query/query.test.ts +19 -0
  269. package/src/external/api/createUserToken.ts +43 -0
  270. package/src/external/api/index.ts +1 -0
  271. package/src/file/api/createFile.ts +6 -5
  272. package/src/file/api/createImage.ts +58 -0
  273. package/src/file/api/createVideo.ts +23 -18
  274. package/src/file/api/getFile.ts +1 -1
  275. package/src/file/api/index.ts +1 -0
  276. package/src/follow/api/acceptFollower.ts +1 -1
  277. package/src/follow/api/declineFollower.ts +1 -1
  278. package/src/follow/api/follow.ts +1 -4
  279. package/src/follow/api/getFollowInfo.ts +8 -5
  280. package/src/follow/api/queryFollowers.ts +5 -4
  281. package/src/follow/api/queryFollowings.ts +5 -4
  282. package/src/follow/api/unfollow.ts +1 -1
  283. package/src/follow/api/utils.ts +10 -10
  284. package/src/follow/events/utils.ts +9 -6
  285. package/src/index.ts +10 -0
  286. package/src/message/api/createMessage.ts +30 -8
  287. package/src/message/api/updateMessage.ts +2 -2
  288. package/src/message/events/onMessageUpdated.ts +9 -1
  289. package/src/poll/api/closePoll.ts +42 -0
  290. package/src/poll/api/createPoll.ts +45 -0
  291. package/src/poll/api/deletePoll.ts +39 -0
  292. package/src/poll/api/getPoll.ts +64 -0
  293. package/src/poll/api/index.ts +7 -0
  294. package/src/poll/api/votePoll.ts +44 -0
  295. package/src/poll/events/index.ts +2 -0
  296. package/src/poll/events/onPollDeleted.ts +31 -0
  297. package/src/poll/events/onPollUpdated.ts +31 -0
  298. package/src/poll/observers/index.ts +1 -0
  299. package/src/poll/observers/observePoll.ts +67 -0
  300. package/src/post/api/approvePost.ts +48 -0
  301. package/src/post/api/declinePost.ts +48 -0
  302. package/src/post/api/getPost.ts +1 -1
  303. package/src/post/api/index.ts +3 -0
  304. package/src/post/api/queryPosts.ts +3 -12
  305. package/src/post/observers/index.ts +1 -0
  306. package/src/post/observers/livePosts.ts +170 -0
  307. package/src/post/observers/observePosts.ts +1 -13
  308. package/src/post/tests/api/getPost.test.ts +88 -0
  309. package/src/post/tests/api/queryPosts.test.ts +23 -0
  310. package/src/reaction/api/index.ts +1 -0
  311. package/src/reaction/api/queryReactions.ts +52 -0
  312. package/src/reaction/events/index.ts +4 -0
  313. package/src/reaction/events/onReactionAdded.ts +4 -0
  314. package/src/reaction/events/onReactorAdded.ts +80 -0
  315. package/src/reaction/events/onReactorRemoved.ts +85 -0
  316. package/src/reaction/observers/index.ts +1 -0
  317. package/src/reaction/observers/liveReactions.ts +142 -0
  318. package/src/reaction/utils/index.ts +1 -0
  319. package/src/reaction/utils/prepareMessagePayloadForCache.ts +40 -0
  320. package/src/report/api/createReport.ts +7 -1
  321. package/src/report/api/deleteReport.ts +7 -1
  322. package/src/user/api/updateUser.ts +4 -1
  323. package/src/user/events/index.ts +1 -0
  324. package/src/user/events/onUserDeleted.ts +19 -0
  325. package/src/user/events/utils.ts +1 -1
  326. package/src/user/observers/observeUser.ts +9 -2
  327. package/src/utils/constants.ts +2 -0
  328. package/src/utils/env.ts +3 -1
  329. package/src/utils/tests/client.ts +5 -0
  330. package/src/utils/tests/dummy.ts +7 -0
  331. package/src/utils/tests/index.ts +2 -0
  332. package/tsconfig.json +23 -22
  333. package/dist/channel/events/onMemberAdded.d.ts +0 -17
  334. package/dist/channel/events/onMemberAdded.d.ts.map +0 -1
  335. package/dist/channel/events/onMemberRemoved.d.ts +0 -17
  336. package/dist/channel/events/onMemberRemoved.d.ts.map +0 -1
  337. package/dist/community/api/addCommunityMembersRole.d.ts +0 -18
  338. package/dist/community/api/addCommunityMembersRole.d.ts.map +0 -1
  339. package/dist/community/api/removeCommunityMembersRole.d.ts +0 -18
  340. package/dist/community/api/removeCommunityMembersRole.d.ts.map +0 -1
@@ -0,0 +1,44 @@
1
+ import { fireEvent } from '~/core/events';
2
+ import { getActiveClient } from '~/client/api';
3
+
4
+ import { ingestInCache } from '~/cache/api/ingestInCache';
5
+
6
+ /**
7
+ * ```js
8
+ * import { votePoll } from '@amityco/ts-sdk'
9
+ * const voted = await votePoll(pollId)
10
+ * ```
11
+ *
12
+ * Votes for an {@link Amity.Poll}
13
+ *
14
+ * @param pollId The ID of the {@link Amity.Poll} to vote
15
+ * @param answerIds The IDs of the {@link Amity.Poll} answers to vote {@link Amity.Poll}
16
+ * @returns the updated {@link Amity.Poll} object
17
+ *
18
+ * @category Poll API
19
+ * @async
20
+ */
21
+ export const votePoll = async (
22
+ pollId: Amity.Poll['pollId'],
23
+ answerIds: string[],
24
+ ): Promise<Amity.Cached<Amity.Poll>> => {
25
+ const client = getActiveClient();
26
+ client.log('user/votePoll', pollId);
27
+
28
+ const { data } = await client.http.post<Amity.PollPayload>(
29
+ `/api/v3/polls/${encodeURIComponent(pollId)}/votes`,
30
+ { pollId, answerIds },
31
+ );
32
+
33
+ const cachedAt = client.cache && Date.now();
34
+ if (client.cache) ingestInCache(data, { cachedAt });
35
+
36
+ const { polls } = data;
37
+
38
+ fireEvent('poll.updated', data);
39
+
40
+ return {
41
+ data: polls.find(poll => poll.pollId === pollId)!,
42
+ cachedAt,
43
+ };
44
+ };
@@ -0,0 +1,2 @@
1
+ export * from './onPollUpdated';
2
+ export * from './onPollDeleted';
@@ -0,0 +1,31 @@
1
+ import { getActiveClient } from '~/client/api';
2
+ import { createEventSubscriber } from '~/core/events';
3
+
4
+ import { ingestInCache } from '~/cache/api/ingestInCache';
5
+
6
+ /**
7
+ * ```js
8
+ * import { onPollDeleted } from '@amityco/ts-sdk'
9
+ * const dispose = onPollDeleted(poll => {
10
+ * // ...
11
+ * })
12
+ * ```
13
+ *
14
+ * Fired when an {@link Amity.Poll} has been deleted
15
+ *
16
+ * @param callback The function to call when the event was fired
17
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
18
+ *
19
+ * @category Poll Events
20
+ */
21
+ export const onPollDeleted = (callback: Amity.Listener<Amity.Poll>): Amity.Unsubscriber => {
22
+ const client = getActiveClient();
23
+
24
+ const filter = (payload: Amity.PollPayload) => {
25
+ if (client.cache) ingestInCache(payload);
26
+
27
+ callback(payload.polls[0]);
28
+ };
29
+
30
+ return createEventSubscriber(client, 'poll/onPollDeleted', 'poll.deleted', filter);
31
+ };
@@ -0,0 +1,31 @@
1
+ import { getActiveClient } from '~/client/api';
2
+ import { createEventSubscriber } from '~/core/events';
3
+
4
+ import { ingestInCache } from '~/cache/api/ingestInCache';
5
+
6
+ /**
7
+ * ```js
8
+ * import { onPollUpdated } from '@amityco/ts-sdk'
9
+ * const dispose = onPollUpdated(poll => {
10
+ * // ...
11
+ * })
12
+ * ```
13
+ *
14
+ * Fired when an {@link Amity.Poll} has been updated
15
+ *
16
+ * @param callback The function to call when the event was fired
17
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
18
+ *
19
+ * @category Poll Events
20
+ */
21
+ export const onPollUpdated = (callback: Amity.Listener<Amity.Poll>): Amity.Unsubscriber => {
22
+ const client = getActiveClient();
23
+
24
+ const filter = (payload: Amity.PollPayload) => {
25
+ if (client.cache) ingestInCache(payload);
26
+
27
+ callback(payload.polls[0]);
28
+ };
29
+
30
+ return createEventSubscriber(client, 'poll/onPollUpdated', 'poll.updated', filter);
31
+ };
@@ -0,0 +1 @@
1
+ export * from './observePoll';
@@ -0,0 +1,67 @@
1
+ import { getActiveClient } from '~/client/api';
2
+
3
+ import { createQuery, runQuery, queryOptions } from '~/core/query';
4
+
5
+ import { getPoll } from '../api';
6
+
7
+ import { onPollUpdated, onPollDeleted } from '../events';
8
+
9
+ /**
10
+ * ```js
11
+ * import { observePoll } from '@amityco/ts-sdk'
12
+ *
13
+ * let poll = {}
14
+ * const dispose = observePoll(pollId, updated => poll = updated)
15
+ * ```
16
+ *
17
+ * Observe all mutation on a given {@link Amity.Poll}
18
+ *
19
+ * @param pollId the ID of the poll to observe
20
+ * @param callback the function to call when new data are available
21
+ * @returns An {@link Amity.Unsubscriber} function to run when willing to stop observing the poll
22
+ *
23
+ * @category Poll Observer
24
+ */
25
+ export const observePoll = <Events extends ['onFetch', 'onUpdate', 'onDelete']>(
26
+ pollId: string,
27
+ callback: Amity.ObjectListener<Amity.Snapshot<Amity.Poll | undefined>, Events>,
28
+ policy: Amity.QueryPolicy = 'cache_then_server',
29
+ ): Amity.Unsubscriber => {
30
+ const { log } = getActiveClient();
31
+
32
+ const timestamp = Date.now();
33
+ log(`observePoll(tmpid: ${timestamp}) > listen`);
34
+
35
+ // wrapper function to make sure
36
+ const router = (result: Amity.Snapshot<Amity.Poll | undefined>, action: Events[number]) => {
37
+ if (callback instanceof Function) return callback(result);
38
+
39
+ if (action !== 'onFetch') callback.onEvent?.(action, result);
40
+
41
+ callback[action]?.(result);
42
+ };
43
+
44
+ const realtimeRouter = (result: Amity.Snapshot<Amity.Poll>, action: Events[number]) => {
45
+ if (result.data?.pollId !== pollId) return;
46
+
47
+ router(result, action);
48
+ };
49
+
50
+ const disposers: Amity.Unsubscriber[] = [];
51
+
52
+ disposers.push(
53
+ onPollUpdated(data => realtimeRouter({ data, loading: false, origin: 'event' }, 'onUpdate')),
54
+ onPollDeleted(data => realtimeRouter({ data, loading: false, origin: 'event' }, 'onDelete')),
55
+ );
56
+
57
+ runQuery(
58
+ createQuery(getPoll, pollId),
59
+ result => (result.data || result.error) && router(result, 'onFetch'),
60
+ queryOptions(policy),
61
+ );
62
+
63
+ return () => {
64
+ log(`observePoll(tmpid: ${timestamp}) > dispose`);
65
+ disposers.forEach(fn => fn());
66
+ };
67
+ };
@@ -0,0 +1,48 @@
1
+ import { getActiveClient } from '~/client/api';
2
+
3
+ import { ingestInCache } from '~/cache/api/ingestInCache';
4
+ import { fireEvent } from '~/core/events';
5
+
6
+ /**
7
+ * ```js
8
+ * import { approvePost } from '@amityco/ts-sdk'
9
+ *
10
+ * const { data: post } = await approvePost('postId')
11
+ * ```
12
+ *
13
+ * Approves a {@link Amity.Post}
14
+ *
15
+ * @param postId The {@link Amity.Post} ID to be approved
16
+ * @return A {@link Amity.Post} that was approved
17
+ *
18
+ * @category Post API
19
+ * @async
20
+ */
21
+ export const approvePost = async (
22
+ postId: Amity.Post['postId'],
23
+ ): Promise<Amity.Cached<Amity.Post>> => {
24
+ const client = getActiveClient();
25
+ client.log('post/approvePost', postId);
26
+
27
+ const { data: approved } = await client.http.post<Amity.PostPayload>(
28
+ `/api/v3/posts/${encodeURIComponent(postId)}/approve`,
29
+ );
30
+
31
+ const cachedAt = client.cache && Date.now();
32
+ if (client.cache) ingestInCache(approved, { cachedAt });
33
+
34
+ // fire virtual event for community update
35
+ if (approved.posts[0].targetType === 'community') {
36
+ const community = approved.communities?.[0];
37
+
38
+ // @ts-ignore as communities is optional currently in PostPayload
39
+ fireEvent('community.updated', { communities: [community] });
40
+ }
41
+
42
+ fireEvent('post.approved', { posts: [approved.posts[0]] });
43
+
44
+ return {
45
+ data: approved.posts.find(post => post.postId === postId)!,
46
+ cachedAt,
47
+ };
48
+ };
@@ -0,0 +1,48 @@
1
+ import { getActiveClient } from '~/client/api';
2
+
3
+ import { ingestInCache } from '~/cache/api/ingestInCache';
4
+ import { fireEvent } from '~/core/events';
5
+
6
+ /**
7
+ * ```js
8
+ * import { declinePost } from '@amityco/ts-sdk'
9
+ *
10
+ * const {data: post} = await declinePost('postId')
11
+ * ```
12
+ *
13
+ * Declines a {@link Amity.Post}
14
+ *
15
+ * @param postId The {@link Amity.Post} ID to be declined
16
+ * @return A {@link Amity.Post} that was declined
17
+ *
18
+ * @category Post API
19
+ * @async
20
+ */
21
+ export const declinePost = async (
22
+ postId: Amity.Post['postId'],
23
+ ): Promise<Amity.Cached<Amity.Post>> => {
24
+ const client = getActiveClient();
25
+ client.log('post/declinePost', postId);
26
+
27
+ const { data: declined } = await client.http.post<Amity.PostPayload>(
28
+ `/api/v3/posts/${encodeURIComponent(postId)}/decline`,
29
+ );
30
+
31
+ const cachedAt = client.cache && Date.now();
32
+ if (client.cache) ingestInCache(declined, { cachedAt });
33
+
34
+ // fire virtual event
35
+ if (declined.posts[0].targetType === 'community') {
36
+ const community = declined.communities?.[0];
37
+
38
+ // @ts-ignore as communities is optional currently in PostPayload
39
+ fireEvent('community.updated', { communities: [community] });
40
+ }
41
+
42
+ fireEvent('post.declined', { posts: [declined.posts[0]] });
43
+
44
+ return {
45
+ data: declined.posts.find(post => post.postId === postId)!,
46
+ cachedAt,
47
+ };
48
+ };
@@ -52,7 +52,7 @@ export const getPost = async (postId: Amity.Post['postId']): Promise<Amity.Cache
52
52
  /**
53
53
  * ```js
54
54
  * import { getPost } from '@amityco/ts-sdk'
55
- * const { data. post } = getPost.locally('foobar')
55
+ * const { data: post } = getPost.locally('foobar')
56
56
  * ```
57
57
  *
58
58
  * Fetches a {@link Amity.Post} object from cache
@@ -5,3 +5,6 @@ export * from './getPost';
5
5
  export * from './createPost';
6
6
  export * from './updatePost';
7
7
  export * from './deletePost';
8
+
9
+ export * from './approvePost';
10
+ export * from './declinePost';
@@ -20,18 +20,9 @@ import { getResolver } from '~/core/model';
20
20
  * @category Post API
21
21
  * @async
22
22
  */
23
- export const queryPosts = async (query: {
24
- targetId: string;
25
- targetType: Amity.Post['targetType'];
26
- sortBy?: 'lastCreated' | 'firstCreated' | 'lastUpdated' | 'firstUpdated';
27
- dataType?: string;
28
- isDeleted?: Amity.Post['isDeleted'];
29
- hasFlag?: boolean;
30
- feedType?: 'reviewing' | 'published';
31
- tags?: Amity.Taggable['tags'];
32
- matchingOnlyParentPost?: boolean;
33
- page?: Amity.PageRaw;
34
- }): Promise<Amity.Cached<Amity.Paged<Amity.Post, Amity.PageRaw>>> => {
23
+ export const queryPosts = async (
24
+ query: Amity.QueryPosts,
25
+ ): Promise<Amity.Cached<Amity.Paged<Amity.Post, Amity.PageRaw>>> => {
35
26
  const client = getActiveClient();
36
27
  client.log('post/queryPosts', query);
37
28
 
@@ -1,2 +1,3 @@
1
1
  export * from './observePosts';
2
2
  export * from './observePost';
3
+ export * from './livePosts';
@@ -0,0 +1,170 @@
1
+ /* eslint-disable no-use-before-define */
2
+ import { getResolver } from '~/core/model';
3
+ import { getActiveClient } from '~/client/api';
4
+ import { pushToCache, pullFromCache } from '~/cache/api';
5
+ import {
6
+ createQuery,
7
+ runQuery,
8
+ queryOptions,
9
+ filterByPropEquality,
10
+ sortByFirstCreated,
11
+ sortByLastCreated,
12
+ } from '~/core/query';
13
+
14
+ import {
15
+ COLLECTION_DEFAULT_CACHING_POLICY,
16
+ COLLECTION_DEFAULT_PAGINATION_LIMIT,
17
+ } from '~/utils/constants';
18
+
19
+ import {
20
+ onPostCreated,
21
+ onPostUpdated,
22
+ onPostDeleted,
23
+ onPostApproved,
24
+ onPostDeclined,
25
+ onPostFlagged,
26
+ onPostUnflagged,
27
+ onPostReactionAdded,
28
+ onPostReactionRemoved,
29
+ } from '../events';
30
+ import { queryPosts } from '../api';
31
+
32
+ /**
33
+ * ```js
34
+ * import { livePosts } from '@amityco/ts-sdk'
35
+ *
36
+ * let posts = []
37
+ * const unsub = livePosts({
38
+ * targetType: Amity.PostTargetType,
39
+ * targetId: Amity.Post['targetId'],
40
+ * }, response => merge(posts, response.data))
41
+ * ```
42
+ *
43
+ * Observe all mutations on a list of {@link Amity.Post} for a given target object
44
+ *
45
+ * @param targetType the type of the target
46
+ * @param targetId the ID of the target
47
+ * @param callback the function to call when new data are available
48
+ * @returns An {@link Amity.Unsubscriber} function to run when willing to stop observing the messages
49
+ *
50
+ * @category Posts Live Collection
51
+ */
52
+ export const livePosts = (
53
+ params: Amity.PostLiveCollection,
54
+ callback: Amity.LiveCollectionCallback<Amity.Post>,
55
+ config?: Amity.LiveCollectionConfig,
56
+ ): Amity.Unsubscriber => {
57
+ const { log, cache } = getActiveClient();
58
+
59
+ if (!cache) {
60
+ console.log('For using Live Collection feature you need to enable Cache!');
61
+ }
62
+
63
+ const timestamp = Date.now();
64
+ log(`livePosts(tmpid: ${timestamp}) > listen`);
65
+
66
+ const { limit: queryLimit, ...queryParams } = params;
67
+
68
+ const limit = queryLimit ?? COLLECTION_DEFAULT_PAGINATION_LIMIT;
69
+ const { policy = COLLECTION_DEFAULT_CACHING_POLICY } = config ?? {};
70
+
71
+ const disposers: Amity.Unsubscriber[] = [];
72
+ const cacheKey = [
73
+ 'post',
74
+ 'collection',
75
+ { targetId: params.targetId, targetType: params.targetType },
76
+ ];
77
+
78
+ const responder = (data: Amity.PostLiveCollectionCache) => {
79
+ let posts: Amity.Post[] =
80
+ data.data
81
+ .map(postId => pullFromCache<Amity.Post>(['post', 'get', postId])!)
82
+ .filter(Boolean)
83
+ .map(({ data }) => data) ?? [];
84
+
85
+ posts = filterByPropEquality(posts, 'isDeleted', params.isDeleted);
86
+
87
+ const sortBy = params.sortBy ? params.sortBy : 'lastCreated';
88
+
89
+ posts = posts.sort(sortBy === 'lastCreated' ? sortByLastCreated : sortByFirstCreated);
90
+
91
+ callback({
92
+ onNextPage: onFetch,
93
+ data: posts,
94
+ hasNextPage: !!data.params?.page,
95
+ loading: data.loading,
96
+ error: data.error,
97
+ });
98
+ };
99
+
100
+ const realtimeRouter = (post: Amity.Post, action: Amity.PostActionType) => {
101
+ const collection = pullFromCache<Amity.PostLiveCollectionCache>(cacheKey)?.data;
102
+
103
+ if (params.targetId !== post.targetId || params.targetType !== post.targetType || !collection)
104
+ return;
105
+
106
+ if (action === 'onCreate') {
107
+ collection.data = [...new Set([post.postId, ...collection.data])];
108
+ } else if (['onDelete', 'onDeclined'].includes(action)) {
109
+ collection.data = collection.data.filter(p => p !== post.postId);
110
+ }
111
+
112
+ pushToCache(cacheKey, collection);
113
+
114
+ responder(collection);
115
+ };
116
+
117
+ const onFetch = () => {
118
+ const collection = pullFromCache<Amity.PostLiveCollectionCache>(cacheKey)?.data;
119
+
120
+ const posts = collection?.data ?? [];
121
+
122
+ if (posts.length > 0 && !collection?.params?.page) return;
123
+
124
+ const query = createQuery(queryPosts, {
125
+ ...queryParams,
126
+ page: collection?.params?.page ?? { limit },
127
+ });
128
+
129
+ runQuery(
130
+ query,
131
+ ({ data: result, error, loading, nextPage: page }) => {
132
+ const data = {
133
+ loading,
134
+ error,
135
+ params: { page },
136
+ data: posts,
137
+ };
138
+
139
+ if (result) {
140
+ data.data = [...new Set([...posts, ...result.map(getResolver('post'))])];
141
+ }
142
+
143
+ pushToCache(cacheKey, data);
144
+
145
+ responder(data);
146
+ },
147
+ queryOptions(policy),
148
+ );
149
+ };
150
+
151
+ disposers.push(
152
+ onPostCreated(post => realtimeRouter(post, 'onCreate')),
153
+ onPostApproved(post => realtimeRouter(post, 'onApproved')),
154
+ onPostDeclined(post => realtimeRouter(post, 'onDeclined')),
155
+ onPostDeleted(post => realtimeRouter(post, 'onDelete')),
156
+
157
+ onPostUpdated(post => realtimeRouter(post, 'onUpdate')),
158
+ onPostFlagged(post => realtimeRouter(post, 'onFlagged')),
159
+ onPostUnflagged(post => realtimeRouter(post, 'onUnflagged')),
160
+ onPostReactionAdded(post => realtimeRouter(post, 'onReactionAdded')),
161
+ onPostReactionRemoved(post => realtimeRouter(post, 'onReactionRemoved')),
162
+ );
163
+
164
+ onFetch();
165
+
166
+ return () => {
167
+ log(`livePosts(tmpid: ${timestamp}) > dispose`);
168
+ disposers.forEach(fn => fn());
169
+ };
170
+ };
@@ -59,19 +59,7 @@ export const observePosts = (
59
59
 
60
60
  const disposers: Amity.Unsubscriber[] = [];
61
61
 
62
- const router = (
63
- post: Amity.Post,
64
- action:
65
- | 'onCreate'
66
- | 'onUpdate'
67
- | 'onDelete'
68
- | 'onApproved'
69
- | 'onDeclined'
70
- | 'onFlagged'
71
- | 'onUnflagged'
72
- | 'onReactionAdded'
73
- | 'onReactionRemoved',
74
- ) => {
62
+ const router = (post: Amity.Post, action: Exclude<Amity.PostActionType, 'onFetch'>) => {
75
63
  if (params.targetId !== post.targetId || params.targetType !== post.targetType) return;
76
64
 
77
65
  if (callback instanceof Function) return callback(post);
@@ -0,0 +1,88 @@
1
+ import { ASCApiError } from '~/core/errors';
2
+ import { client, userPosts } from '~/utils/tests';
3
+ import { pushToCache, enableCache, disableCache } from '~/cache/api';
4
+
5
+ import { getPost } from '~/post/api';
6
+
7
+ describe('post/api', () => {
8
+ const post = { postId: userPosts.page1[0] };
9
+ const post2 = { postId: userPosts.page1[1] };
10
+
11
+ describe('getPost.locally', () => {
12
+ test('should return undefined if cache is turned off', () => {
13
+ expect(getPost.locally(post.postId)).toBeUndefined();
14
+ });
15
+
16
+ test('should return undefined if post not in cache', () => {
17
+ enableCache();
18
+
19
+ const cachedAt = Date.now();
20
+
21
+ pushToCache(['post', 'get', post.postId], post, { cachedAt });
22
+
23
+ expect(getPost.locally(post2.postId)).toBeUndefined();
24
+
25
+ disableCache();
26
+ });
27
+
28
+ test('should return post if post in cache', () => {
29
+ enableCache();
30
+
31
+ const cachedAt = Date.now();
32
+
33
+ pushToCache(['post', 'get', post.postId], post, { cachedAt });
34
+
35
+ const data = getPost.locally(post.postId);
36
+
37
+ expect(data).toBeDefined();
38
+ expect(data?.data).toEqual(post);
39
+ expect(data?.cachedAt).toEqual(cachedAt);
40
+
41
+ disableCache();
42
+ });
43
+ });
44
+
45
+ describe('getPost', () => {
46
+ test('should return a post', async () => {
47
+ client.http.get = jest.fn().mockReturnValueOnce({ data: { posts: [post] } });
48
+
49
+ const data = await getPost(post.postId);
50
+
51
+ expect(data).toBeDefined();
52
+ expect(data?.data).toEqual(post);
53
+ });
54
+
55
+ test('should put post into the cache after fetch', async () => {
56
+ enableCache();
57
+ client.http.get = jest.fn().mockReturnValueOnce({ data: { posts: [post] } });
58
+
59
+ await getPost(post.postId);
60
+
61
+ expect(getPost.locally(post.postId)?.data).toEqual(post);
62
+
63
+ disableCache();
64
+ });
65
+
66
+ test('should return an error', async () => {
67
+ client.http.get = jest.fn().mockRejectedValueOnce(new Error('error'));
68
+
69
+ await expect(getPost(post.postId)).rejects.toThrow('error');
70
+ });
71
+
72
+ test('should return an error if post in cache but api throws not found', async () => {
73
+ enableCache();
74
+ pushToCache(['post', 'get', post.postId], post, { cachedAt: Date.now() });
75
+
76
+ client.http.get = jest
77
+ .fn()
78
+ .mockRejectedValueOnce(
79
+ new ASCApiError('not found!', Amity.ServerError.ITEM_NOT_FOUND, Amity.ErrorLevel.ERROR),
80
+ );
81
+
82
+ await expect(getPost(post.postId)).rejects.toThrow();
83
+
84
+ expect(getPost.locally(post.postId)).toBeUndefined();
85
+ disableCache();
86
+ });
87
+ });
88
+ });
@@ -0,0 +1,23 @@
1
+ import { queryPosts } from '~/post/api';
2
+ import { client, userPosts } from '~/utils/tests';
3
+
4
+ describe('post/api', () => {
5
+ test('should return a post query', async () => {
6
+ const returnValue = [{ postId: userPosts.page1[0] }];
7
+
8
+ client.http.get = jest.fn().mockResolvedValue({
9
+ data: {
10
+ posts: returnValue,
11
+ paging: {},
12
+ },
13
+ });
14
+
15
+ const data = await queryPosts({
16
+ targetId: userPosts.targetId,
17
+ targetType: userPosts.targetType,
18
+ });
19
+
20
+ expect(data).toBeDefined();
21
+ expect(data?.data).toEqual(returnValue);
22
+ });
23
+ });
@@ -1,2 +1,3 @@
1
1
  export * from './addReaction';
2
2
  export * from './removeReaction';
3
+ export * from './queryReactions';
@@ -0,0 +1,52 @@
1
+ import { getActiveClient } from '~/client/api/activeClient';
2
+
3
+ import { toToken, toPageRaw } from '~/core/query';
4
+ import { ingestInCache } from '~/cache/api/ingestInCache';
5
+
6
+ /**
7
+ * ```js
8
+ * import { queryReactions } from '@amityco/ts-sdk'
9
+ * const { data: reactions, prevPage, nextPage } = await queryReactions({
10
+ * referenceId: 'postId',
11
+ * referenceType: 'post',
12
+ * })
13
+ * ```
14
+ *
15
+ * Queries a paginable list of {@link Amity.ReactionQuery} objects
16
+ *
17
+ * @param query The query parameters
18
+ * @returns A page of {@link Amity.Reaction} objects
19
+ *
20
+ * @reaction Reaction API
21
+ * @async
22
+ * */
23
+ export const queryReactions = async (
24
+ query: Amity.QueryReactions,
25
+ ): Promise<Amity.Paged<Amity.ReactionQuery, Amity.Page<string>>> => {
26
+ const client = getActiveClient();
27
+ client.log('reaction/queryReactions', query);
28
+
29
+ const { page = { limit: 10 }, ...params } = query ?? {};
30
+
31
+ const { data } = await client.http.get<Amity.ReactionPayload & Amity.Pagination>(
32
+ `/api/v3/reactions`,
33
+ {
34
+ params: {
35
+ ...params,
36
+ options: {
37
+ token: toToken(page, 'afterbeforeraw'),
38
+ },
39
+ },
40
+ },
41
+ );
42
+
43
+ const { paging, ...payload } = data;
44
+ const { reactions } = payload;
45
+
46
+ ingestInCache({ ...payload, reactions: reactions[0].reactors });
47
+
48
+ const nextPage = toPageRaw(paging.next);
49
+ const prevPage = toPageRaw(paging.previous);
50
+
51
+ return { data: reactions, prevPage, nextPage };
52
+ };