@amityco/ts-sdk 0.0.1-beta.25 → 0.0.1-beta.28

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 (295) hide show
  1. package/.eslintrc.json +5 -1
  2. package/dist/@types/core/events.d.ts +7 -7
  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/paging.d.ts +1 -1
  7. package/dist/@types/core/paging.d.ts.map +1 -1
  8. package/dist/@types/core/payload.d.ts +15 -15
  9. package/dist/@types/core/payload.d.ts.map +1 -1
  10. package/dist/@types/domains/channel.d.ts +5 -1
  11. package/dist/@types/domains/channel.d.ts.map +1 -1
  12. package/dist/@types/domains/client.d.ts +13 -0
  13. package/dist/@types/domains/client.d.ts.map +1 -1
  14. package/dist/@types/domains/comment.d.ts +14 -0
  15. package/dist/@types/domains/comment.d.ts.map +1 -1
  16. package/dist/@types/domains/content.d.ts +26 -3
  17. package/dist/@types/domains/content.d.ts.map +1 -1
  18. package/dist/@types/domains/file.d.ts +36 -3
  19. package/dist/@types/domains/file.d.ts.map +1 -1
  20. package/dist/@types/domains/follow.d.ts +13 -1
  21. package/dist/@types/domains/follow.d.ts.map +1 -1
  22. package/dist/@types/domains/group.d.ts +1 -0
  23. package/dist/@types/domains/group.d.ts.map +1 -1
  24. package/dist/@types/domains/message.d.ts +13 -0
  25. package/dist/@types/domains/message.d.ts.map +1 -1
  26. package/dist/@types/domains/post.d.ts +17 -0
  27. package/dist/@types/domains/post.d.ts.map +1 -1
  28. package/dist/@types/domains/reaction.d.ts +10 -0
  29. package/dist/@types/domains/reaction.d.ts.map +1 -1
  30. package/dist/@types/global.d.ts +1 -0
  31. package/dist/@types/global.d.ts.map +1 -1
  32. package/dist/@types/index.d.ts +3 -2
  33. package/dist/@types/index.d.ts.map +1 -1
  34. package/dist/cache/api/ingestInCache.d.ts +1 -1
  35. package/dist/cache/api/ingestInCache.d.ts.map +1 -1
  36. package/dist/cache/api/mergeInCache.d.ts +1 -1
  37. package/dist/cache/api/mergeInCache.d.ts.map +1 -1
  38. package/dist/category/api/queryCategories.d.ts +3 -3
  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/addChannelMembersRole.d.ts.map +1 -1
  42. package/dist/channel/api/banChannelMembers.d.ts +16 -0
  43. package/dist/channel/api/banChannelMembers.d.ts.map +1 -0
  44. package/dist/channel/api/createChannel.d.ts.map +1 -1
  45. package/dist/channel/api/getChannel.d.ts.map +1 -1
  46. package/dist/channel/api/getChannels.d.ts.map +1 -1
  47. package/dist/channel/api/index.d.ts +2 -0
  48. package/dist/channel/api/index.d.ts.map +1 -1
  49. package/dist/channel/api/joinChannel.d.ts.map +1 -1
  50. package/dist/channel/api/leaveChannel.d.ts.map +1 -1
  51. package/dist/channel/api/queryChannelMembers.d.ts.map +1 -1
  52. package/dist/channel/api/queryChannels.d.ts +6 -6
  53. package/dist/channel/api/queryChannels.d.ts.map +1 -1
  54. package/dist/channel/api/removeChannelMembers.d.ts.map +1 -1
  55. package/dist/channel/api/removeChannelMembersRole.d.ts.map +1 -1
  56. package/dist/channel/api/unbanChannelMembers.d.ts +16 -0
  57. package/dist/channel/api/unbanChannelMembers.d.ts.map +1 -0
  58. package/dist/channel/api/updateChannel.d.ts.map +1 -1
  59. package/dist/channel/events/index.d.ts +1 -0
  60. package/dist/channel/events/index.d.ts.map +1 -1
  61. package/dist/channel/events/onChannelCreated.d.ts.map +1 -1
  62. package/dist/channel/events/onChannelDeleted.d.ts.map +1 -1
  63. package/dist/channel/events/onChannelJoined.d.ts.map +1 -1
  64. package/dist/channel/events/onChannelLeft.d.ts.map +1 -1
  65. package/dist/channel/events/onChannelMemberAdded.d.ts.map +1 -1
  66. package/dist/channel/events/onChannelMemberRemoved.d.ts.map +1 -1
  67. package/dist/channel/events/onChannelUpdated.d.ts.map +1 -1
  68. package/dist/channel/observers/index.d.ts +1 -0
  69. package/dist/channel/observers/index.d.ts.map +1 -1
  70. package/dist/channel/observers/observeChannel.d.ts +1 -1
  71. package/dist/channel/observers/observeChannel.d.ts.map +1 -1
  72. package/dist/channel/observers/observeChannels.d.ts +17 -0
  73. package/dist/channel/observers/observeChannels.d.ts.map +1 -0
  74. package/dist/channel/tests/utils/prepareChannelPayload.test.d.ts +2 -0
  75. package/dist/channel/tests/utils/prepareChannelPayload.test.d.ts.map +1 -0
  76. package/dist/channel/utils/index.d.ts +2 -0
  77. package/dist/channel/utils/index.d.ts.map +1 -0
  78. package/dist/channel/utils/prepareChannelPayload.d.ts +3 -0
  79. package/dist/channel/utils/prepareChannelPayload.d.ts.map +1 -0
  80. package/dist/client/api/connectClient.d.ts +1 -8
  81. package/dist/client/api/connectClient.d.ts.map +1 -1
  82. package/dist/client/api/createClient.d.ts +8 -1
  83. package/dist/client/api/createClient.d.ts.map +1 -1
  84. package/dist/client/api/getFeedSettings.d.ts +16 -0
  85. package/dist/client/api/getFeedSettings.d.ts.map +1 -0
  86. package/dist/client/api/index.d.ts +1 -0
  87. package/dist/client/api/index.d.ts.map +1 -1
  88. package/dist/comment/api/queryComments.d.ts +1 -9
  89. package/dist/comment/api/queryComments.d.ts.map +1 -1
  90. package/dist/comment/observers/index.d.ts +1 -0
  91. package/dist/comment/observers/index.d.ts.map +1 -1
  92. package/dist/comment/observers/liveComments.d.ts +22 -0
  93. package/dist/comment/observers/liveComments.d.ts.map +1 -0
  94. package/dist/comment/observers/observeComments.d.ts.map +1 -1
  95. package/dist/community/api/getRecommendedCommunities.d.ts +1 -1
  96. package/dist/community/api/getRecommendedCommunities.d.ts.map +1 -1
  97. package/dist/community/api/getTopTrendingCommunities.d.ts +1 -1
  98. package/dist/community/api/getTopTrendingCommunities.d.ts.map +1 -1
  99. package/dist/community/api/queryCommunities.d.ts +7 -7
  100. package/dist/community/api/queryCommunities.d.ts.map +1 -1
  101. package/dist/core/debug.d.ts +1 -1
  102. package/dist/core/debug.d.ts.map +1 -1
  103. package/dist/core/events.d.ts +3 -3
  104. package/dist/core/events.d.ts.map +1 -1
  105. package/dist/core/query/paging.d.ts +2 -2
  106. package/dist/core/query/paging.d.ts.map +1 -1
  107. package/dist/core/query/query.d.ts +2 -2
  108. package/dist/core/query/query.d.ts.map +1 -1
  109. package/dist/core/tests/query/filtering.test.d.ts +2 -0
  110. package/dist/core/tests/query/filtering.test.d.ts.map +1 -0
  111. package/dist/core/tests/query/query/runQuery.test.d.ts +2 -0
  112. package/dist/core/tests/query/query/runQuery.test.d.ts.map +1 -0
  113. package/dist/core/tests/query/query.test.d.ts +2 -0
  114. package/dist/core/tests/query/query.test.d.ts.map +1 -0
  115. package/dist/core/transports/ws.d.ts +1 -1
  116. package/dist/core/transports/ws.d.ts.map +1 -1
  117. package/dist/external/api/createUserToken.d.ts +1 -1
  118. package/dist/external/api/createUserToken.d.ts.map +1 -1
  119. package/dist/feed/api/queryGlobalFeed.d.ts +4 -4
  120. package/dist/feed/api/queryGlobalFeed.d.ts.map +1 -1
  121. package/dist/file/api/createVideo.d.ts +2 -1
  122. package/dist/file/api/createVideo.d.ts.map +1 -1
  123. package/dist/follow/api/follow.d.ts.map +1 -1
  124. package/dist/follow/api/getFollowInfo.d.ts.map +1 -1
  125. package/dist/follow/api/queryFollowers.d.ts +2 -6
  126. package/dist/follow/api/queryFollowers.d.ts.map +1 -1
  127. package/dist/follow/api/queryFollowings.d.ts +2 -6
  128. package/dist/follow/api/queryFollowings.d.ts.map +1 -1
  129. package/dist/follow/api/utils.d.ts +4 -4
  130. package/dist/follow/api/utils.d.ts.map +1 -1
  131. package/dist/follow/events/utils.d.ts.map +1 -1
  132. package/dist/follow/observers/index.d.ts +2 -0
  133. package/dist/follow/observers/index.d.ts.map +1 -1
  134. package/dist/follow/observers/liveFollowers.d.ts +20 -0
  135. package/dist/follow/observers/liveFollowers.d.ts.map +1 -0
  136. package/dist/follow/observers/liveFollowings.d.ts +20 -0
  137. package/dist/follow/observers/liveFollowings.d.ts.map +1 -0
  138. package/dist/index.cjs.js +18706 -17726
  139. package/dist/index.d.ts +2 -1
  140. package/dist/index.d.ts.map +1 -1
  141. package/dist/index.esm.js +18688 -17727
  142. package/dist/index.umd.js +4 -19
  143. package/dist/message/api/queryMessages.d.ts +1 -10
  144. package/dist/message/api/queryMessages.d.ts.map +1 -1
  145. package/dist/message/observers/index.d.ts +1 -0
  146. package/dist/message/observers/index.d.ts.map +1 -1
  147. package/dist/message/observers/liveMessages.d.ts +20 -0
  148. package/dist/message/observers/liveMessages.d.ts.map +1 -0
  149. package/dist/message/observers/observeMessages.d.ts +0 -1
  150. package/dist/message/observers/observeMessages.d.ts.map +1 -1
  151. package/dist/message/observers/tests/liveMessages.test.d.ts +2 -0
  152. package/dist/message/observers/tests/liveMessages.test.d.ts.map +1 -0
  153. package/dist/post/api/queryPosts.d.ts +1 -12
  154. package/dist/post/api/queryPosts.d.ts.map +1 -1
  155. package/dist/post/observers/index.d.ts +1 -0
  156. package/dist/post/observers/index.d.ts.map +1 -1
  157. package/dist/post/observers/livePosts.d.ts +22 -0
  158. package/dist/post/observers/livePosts.d.ts.map +1 -0
  159. package/dist/post/observers/observePosts.d.ts.map +1 -1
  160. package/dist/post/tests/api/getPost.test.d.ts +2 -0
  161. package/dist/post/tests/api/getPost.test.d.ts.map +1 -0
  162. package/dist/post/tests/api/queryPosts.test.d.ts +2 -0
  163. package/dist/post/tests/api/queryPosts.test.d.ts.map +1 -0
  164. package/dist/reaction/api/queryReactions.d.ts +1 -6
  165. package/dist/reaction/api/queryReactions.d.ts.map +1 -1
  166. package/dist/reaction/events/index.d.ts +3 -0
  167. package/dist/reaction/events/index.d.ts.map +1 -1
  168. package/dist/reaction/events/onReactorAdded.d.ts +19 -0
  169. package/dist/reaction/events/onReactorAdded.d.ts.map +1 -0
  170. package/dist/reaction/events/onReactorRemoved.d.ts +19 -0
  171. package/dist/reaction/events/onReactorRemoved.d.ts.map +1 -0
  172. package/dist/reaction/observers/index.d.ts +2 -0
  173. package/dist/reaction/observers/index.d.ts.map +1 -0
  174. package/dist/reaction/observers/liveReactions.d.ts +22 -0
  175. package/dist/reaction/observers/liveReactions.d.ts.map +1 -0
  176. package/dist/role/api/queryRoles.d.ts +4 -4
  177. package/dist/role/api/queryRoles.d.ts.map +1 -1
  178. package/dist/stream/api/queryStreams.d.ts +6 -6
  179. package/dist/stream/api/queryStreams.d.ts.map +1 -1
  180. package/dist/utils/constants.d.ts +4 -0
  181. package/dist/utils/constants.d.ts.map +1 -0
  182. package/dist/utils/tests/client.d.ts +6 -0
  183. package/dist/utils/tests/client.d.ts.map +1 -0
  184. package/dist/utils/tests/dummy/channel.d.ts +10 -0
  185. package/dist/utils/tests/dummy/channel.d.ts.map +1 -0
  186. package/dist/utils/tests/dummy/index.d.ts +10 -0
  187. package/dist/utils/tests/dummy/index.d.ts.map +1 -0
  188. package/dist/utils/tests/dummy/message.d.ts +8 -0
  189. package/dist/utils/tests/dummy/message.d.ts.map +1 -0
  190. package/dist/utils/tests/dummy/post.d.ts +9 -0
  191. package/dist/utils/tests/dummy/post.d.ts.map +1 -0
  192. package/dist/utils/tests/dummy/user.d.ts +2 -0
  193. package/dist/utils/tests/dummy/user.d.ts.map +1 -0
  194. package/dist/utils/tests/index.d.ts +3 -0
  195. package/dist/utils/tests/index.d.ts.map +1 -0
  196. package/jest.config.ts +15 -0
  197. package/package.json +21 -16
  198. package/src/@types/core/events.ts +7 -7
  199. package/src/@types/core/live.ts +28 -0
  200. package/src/@types/core/paging.ts +1 -1
  201. package/src/@types/core/payload.ts +21 -16
  202. package/src/@types/domains/channel.ts +16 -1
  203. package/src/@types/domains/client.ts +17 -0
  204. package/src/@types/domains/comment.ts +31 -0
  205. package/src/@types/domains/content.ts +34 -3
  206. package/src/@types/domains/file.ts +42 -3
  207. package/src/@types/domains/follow.ts +31 -1
  208. package/src/@types/domains/group.ts +1 -0
  209. package/src/@types/domains/message.ts +20 -0
  210. package/src/@types/domains/post.ts +37 -0
  211. package/src/@types/domains/reaction.ts +17 -0
  212. package/src/@types/global.ts +2 -0
  213. package/src/@types/index.ts +4 -2
  214. package/src/channel/api/addChannelMembers.ts +6 -5
  215. package/src/channel/api/addChannelMembersRole.ts +5 -1
  216. package/src/channel/api/banChannelMembers.ts +45 -0
  217. package/src/channel/api/createChannel.ts +6 -2
  218. package/src/channel/api/getChannel.ts +5 -1
  219. package/src/channel/api/getChannels.ts +5 -1
  220. package/src/channel/api/index.ts +3 -0
  221. package/src/channel/api/joinChannel.ts +5 -1
  222. package/src/channel/api/leaveChannel.ts +5 -1
  223. package/src/channel/api/queryChannelMembers.ts +16 -12
  224. package/src/channel/api/queryChannels.ts +9 -4
  225. package/src/channel/api/removeChannelMembers.ts +6 -5
  226. package/src/channel/api/removeChannelMembersRole.ts +5 -1
  227. package/src/channel/api/unbanChannelMembers.ts +45 -0
  228. package/src/channel/api/updateChannel.ts +5 -1
  229. package/src/channel/events/index.ts +1 -0
  230. package/src/channel/events/onChannelCreated.ts +6 -2
  231. package/src/channel/events/onChannelDeleted.ts +6 -2
  232. package/src/channel/events/onChannelJoined.ts +6 -2
  233. package/src/channel/events/onChannelLeft.ts +6 -2
  234. package/src/channel/events/onChannelMemberAdded.ts +6 -2
  235. package/src/channel/events/onChannelMemberRemoved.ts +6 -2
  236. package/src/channel/events/onChannelUpdated.ts +6 -2
  237. package/src/channel/observers/index.ts +1 -0
  238. package/src/channel/observers/observeChannel.ts +1 -11
  239. package/src/channel/observers/observeChannels.ts +59 -0
  240. package/src/channel/tests/utils/prepareChannelPayload.test.ts +120 -0
  241. package/src/channel/utils/index.ts +1 -0
  242. package/src/channel/utils/prepareChannelPayload.ts +31 -0
  243. package/src/client/api/connectClient.ts +4 -9
  244. package/src/client/api/createClient.ts +19 -4
  245. package/src/client/api/getFeedSettings.ts +29 -0
  246. package/src/client/api/index.ts +2 -0
  247. package/src/comment/api/queryComments.ts +3 -9
  248. package/src/comment/observers/index.ts +1 -0
  249. package/src/comment/observers/liveComments.ts +172 -0
  250. package/src/comment/observers/observeComments.ts +1 -11
  251. package/src/core/events.ts +2 -1
  252. package/src/core/query/query.ts +16 -3
  253. package/src/core/tests/query/filtering.test.ts +11 -0
  254. package/src/core/tests/query/query/runQuery.test.ts +182 -0
  255. package/src/core/tests/query/query.test.ts +19 -0
  256. package/src/file/api/createVideo.ts +6 -0
  257. package/src/follow/api/acceptFollower.ts +1 -1
  258. package/src/follow/api/declineFollower.ts +1 -1
  259. package/src/follow/api/follow.ts +1 -4
  260. package/src/follow/api/getFollowInfo.ts +8 -5
  261. package/src/follow/api/queryFollowers.ts +5 -6
  262. package/src/follow/api/queryFollowings.ts +5 -6
  263. package/src/follow/api/unfollow.ts +1 -1
  264. package/src/follow/api/utils.ts +17 -13
  265. package/src/follow/events/utils.ts +9 -6
  266. package/src/follow/observers/index.ts +3 -0
  267. package/src/follow/observers/liveFollowers.ts +149 -0
  268. package/src/follow/observers/liveFollowings.ts +149 -0
  269. package/src/index.ts +2 -1
  270. package/src/message/api/queryMessages.ts +3 -10
  271. package/src/message/observers/index.ts +1 -0
  272. package/src/message/observers/liveMessages.ts +141 -0
  273. package/src/message/observers/observeMessages.ts +0 -1
  274. package/src/message/observers/tests/liveMessages.test.ts +133 -0
  275. package/src/post/api/queryPosts.ts +3 -12
  276. package/src/post/observers/index.ts +1 -0
  277. package/src/post/observers/livePosts.ts +171 -0
  278. package/src/post/observers/observePosts.ts +1 -13
  279. package/src/post/tests/api/getPost.test.ts +88 -0
  280. package/src/post/tests/api/queryPosts.test.ts +23 -0
  281. package/src/reaction/api/queryReactions.ts +14 -14
  282. package/src/reaction/events/index.ts +4 -0
  283. package/src/reaction/events/onReactorAdded.ts +80 -0
  284. package/src/reaction/events/onReactorRemoved.ts +85 -0
  285. package/src/reaction/observers/index.ts +1 -0
  286. package/src/reaction/observers/liveReactions.ts +142 -0
  287. package/src/utils/constants.ts +3 -0
  288. package/src/utils/tests/client.ts +33 -0
  289. package/src/utils/tests/dummy/channel.ts +52 -0
  290. package/src/utils/tests/dummy/index.ts +7 -0
  291. package/src/utils/tests/dummy/message.ts +21 -0
  292. package/src/utils/tests/dummy/post.ts +31 -0
  293. package/src/utils/tests/dummy/user.ts +11 -0
  294. package/src/utils/tests/index.ts +2 -0
  295. package/tsconfig.json +23 -22
@@ -0,0 +1,80 @@
1
+ import { getActiveClient } from '~/client/api';
2
+ import { ingestInCache } from '~/cache/api/ingestInCache';
3
+ import { createEventSubscriber } from '~/core/events';
4
+
5
+ /**
6
+ * ```js
7
+ * import { onReactorAdded } from '@amityco/ts-sdk'
8
+ * const dispose = onReactorAdded('post', postId, reactor => {
9
+ * // ...
10
+ * })
11
+ * ```
12
+ *
13
+ * Fired when an {@link Amity.Reactor} has been added
14
+ *
15
+ * @param {@link Amity.ReactableType} referenceType
16
+ * @param {string} referenceId
17
+ * @param callback The function to call when the event was fired
18
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
19
+ *
20
+ * @category Events
21
+ * */
22
+ export const onReactorAdded = (
23
+ referenceType: Amity.ReactableType,
24
+ referenceId: Amity.Reaction['referenceId'],
25
+ callback: Amity.Listener<Amity.Reactor>,
26
+ ): Amity.Unsubscriber => {
27
+ const client = getActiveClient();
28
+
29
+ const callbackWrapper = (
30
+ referenceType_: Amity.ReactableType,
31
+ referenceId_: Amity.Reaction['referenceId'],
32
+ reaction: Amity.Reactor,
33
+ ) => {
34
+ if (referenceType_ === referenceType && referenceId_ === referenceId) {
35
+ callback(reaction);
36
+ }
37
+ };
38
+
39
+ if (referenceType === 'message') {
40
+ const filter = (payload: Amity.MessagePayload) => {
41
+ if (!payload.messages[0].latestReaction) return;
42
+
43
+ const { eventName, referenceId, referenceType, userDisplayName, ...reactor } =
44
+ payload.messages[0].latestReaction;
45
+
46
+ if (eventName !== 'add') return;
47
+
48
+ ingestInCache(payload);
49
+ ingestInCache({ reactions: [reactor as Amity.Reactor] });
50
+
51
+ callbackWrapper('message', payload.messages[0].messageId, reactor);
52
+ };
53
+
54
+ return createEventSubscriber(client, 'reaction/onReactorAdded', 'v3.message.didUpdate', filter);
55
+ }
56
+
57
+ if (referenceType === 'post') {
58
+ const filter = (payload: Amity.PostPayload & { reactor: Amity.Reactor }) => {
59
+ const { reactor, ...rest } = payload;
60
+
61
+ ingestInCache(rest as Amity.PostPayload);
62
+ ingestInCache({ reactions: [reactor] });
63
+
64
+ callbackWrapper('post', payload.posts[0].postId, reactor);
65
+ };
66
+
67
+ return createEventSubscriber(client, 'post.addReaction', 'post.addReaction', filter);
68
+ }
69
+
70
+ const filter = (payload: Amity.CommentPayload & { reactor: Amity.Reactor }) => {
71
+ const { reactor, ...rest } = payload;
72
+
73
+ ingestInCache(rest as Amity.CommentPayload);
74
+ ingestInCache({ reactions: [reactor] });
75
+
76
+ callbackWrapper('comment', payload.comments[0].commentId, reactor);
77
+ };
78
+
79
+ return createEventSubscriber(client, 'comment.addReaction', 'comment.addReaction', filter);
80
+ };
@@ -0,0 +1,85 @@
1
+ import { getActiveClient } from '~/client/api';
2
+ import { ingestInCache } from '~/cache/api/ingestInCache';
3
+ import { createEventSubscriber } from '~/core/events';
4
+
5
+ /**
6
+ * ```js
7
+ * import { onReactorRemoved } from '@amityco/ts-sdk'
8
+ * const dispose = onReactorRemoved('post', postId, reactor => {
9
+ * // ...
10
+ * })
11
+ * ```
12
+ *
13
+ * Fired when an {@link Amity.Reactor} has been removed
14
+ *
15
+ * @param {@link Amity.ReactableType} referenceType
16
+ * @param {string} referenceId
17
+ * @param callback The function to call when the event was fired
18
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
19
+ *
20
+ * @category Events
21
+ * */
22
+ export const onReactorRemoved = (
23
+ referenceType: Amity.ReactableType,
24
+ referenceId: Amity.Reaction['referenceId'],
25
+ callback: Amity.Listener<Amity.Reactor>,
26
+ ): Amity.Unsubscriber => {
27
+ const client = getActiveClient();
28
+
29
+ const callbackWrapper = (
30
+ referenceType_: Amity.ReactableType,
31
+ referenceId_: Amity.Reaction['referenceId'],
32
+ reaction: Amity.Reactor,
33
+ ) => {
34
+ if (referenceType_ === referenceType && referenceId_ === referenceId) {
35
+ callback(reaction);
36
+ }
37
+ };
38
+
39
+ if (referenceType === 'message') {
40
+ const filter = (payload: Amity.MessagePayload) => {
41
+ if (!payload.messages[0].latestReaction) return;
42
+
43
+ const { eventName, referenceId, referenceType, ...reactor } =
44
+ payload.messages[0].latestReaction;
45
+
46
+ if (eventName !== 'remove') return;
47
+
48
+ ingestInCache(payload);
49
+ ingestInCache({ reactions: [reactor as Amity.Reactor] });
50
+
51
+ callbackWrapper('message', payload.messages[0].messageId, reactor);
52
+ };
53
+
54
+ return createEventSubscriber(
55
+ client,
56
+ 'reaction/onReactorRemoved',
57
+ 'v3.message.didUpdate',
58
+ filter,
59
+ );
60
+ }
61
+
62
+ if (referenceType === 'post') {
63
+ const filter = (payload: Amity.PostPayload & { reactor: Amity.Reactor }) => {
64
+ const { reactor, ...rest } = payload;
65
+
66
+ ingestInCache(rest as Amity.PostPayload);
67
+ ingestInCache({ reactions: [reactor] });
68
+
69
+ callbackWrapper('post', payload.posts[0].postId, reactor);
70
+ };
71
+
72
+ return createEventSubscriber(client, 'post.removeReaction', 'post.removeReaction', filter);
73
+ }
74
+
75
+ const filter = (payload: Amity.CommentPayload & { reactor: Amity.Reactor }) => {
76
+ const { reactor, ...rest } = payload;
77
+
78
+ ingestInCache(rest as Amity.CommentPayload);
79
+ ingestInCache({ reactions: [reactor] });
80
+
81
+ callbackWrapper('comment', payload.comments[0].commentId, reactor);
82
+ };
83
+
84
+ return createEventSubscriber(client, 'comment.removeReaction', 'comment.removeReaction', filter);
85
+ };
@@ -0,0 +1 @@
1
+ export * from './liveReactions';
@@ -0,0 +1,142 @@
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 { createQuery, runQuery, queryOptions } from '~/core/query';
6
+
7
+ import {
8
+ COLLECTION_DEFAULT_CACHING_POLICY,
9
+ COLLECTION_DEFAULT_PAGINATION_LIMIT,
10
+ } from '~/utils/constants';
11
+
12
+ import { onReactorAdded, onReactorRemoved } from '../events';
13
+ import { queryReactions } from '../api';
14
+
15
+ /**
16
+ * ```js
17
+ * import { liveReactions } from '@amityco/ts-sdk'
18
+ *
19
+ * let reactions = []
20
+ * const unsub = liveReactions({
21
+ * referenceId: Amity.Reaction['referenceId'],
22
+ * referenceType: Amity.Reaction['referenceType'],
23
+ * }, response => merge(reactions, response.data))
24
+ * ```
25
+ *
26
+ * Observe all mutations on a list of {@link Amity.Reaction} for a given target object
27
+ *
28
+ * @param referenceType the type of the target
29
+ * @param referenceId the ID of the target
30
+ * @param callback the function to call when new data are available
31
+ * @returns An {@link Amity.Unsubscriber} function to run when willing to stop observing the messages
32
+ *
33
+ * @category Reactions Live Collection
34
+ */
35
+ export const liveReactions = (
36
+ params: Amity.ReactionLiveCollection,
37
+ callback: Amity.LiveCollectionCallback<Amity.Reactor>,
38
+ config?: Amity.LiveCollectionConfig,
39
+ ): Amity.Unsubscriber => {
40
+ const { log, cache } = getActiveClient();
41
+
42
+ if (!cache) {
43
+ console.log('For using Live Collection feature you need to enable Cache!');
44
+ }
45
+
46
+ const timestamp = Date.now();
47
+ log(`liveReactions(tmpid: ${timestamp}) > listen`);
48
+
49
+ const { limit: queryLimit, ...queryParams } = params;
50
+
51
+ const limit = queryLimit ?? COLLECTION_DEFAULT_PAGINATION_LIMIT;
52
+ const { policy = COLLECTION_DEFAULT_CACHING_POLICY } = config ?? {};
53
+
54
+ const disposers: Amity.Unsubscriber[] = [];
55
+ const cacheKey = [
56
+ 'reaction',
57
+ 'collection',
58
+ { referenceId: params.referenceId, referenceType: params.referenceType },
59
+ ];
60
+
61
+ const responder = (data: Amity.ReactionLiveCollectionCache) => {
62
+ const reactions: Amity.Reactor[] =
63
+ data.data
64
+ .map(reactorId => pullFromCache<Amity.Reactor>(['reaction', 'get', reactorId])!)
65
+ .filter(Boolean)
66
+ .map(({ data }) => data) ?? [];
67
+
68
+ callback({
69
+ onNextPage: onFetch,
70
+ data: reactions,
71
+ hasNextPage: !!data.params?.page,
72
+ loading: data.loading,
73
+ error: data.error,
74
+ });
75
+ };
76
+
77
+ const realtimeRouter = (reaction: Amity.Reactor, action: Amity.ReactionActionType) => {
78
+ const collection = pullFromCache<Amity.ReactionLiveCollectionCache>(cacheKey)?.data;
79
+ if (!collection) return;
80
+
81
+ if (action === 'onAdded') {
82
+ collection.data = [...new Set([reaction.reactionId, ...collection.data])];
83
+ } else if (action === 'onRemoved') {
84
+ collection.data = collection.data.filter(p => p !== reaction.reactionId);
85
+ }
86
+
87
+ pushToCache(cacheKey, collection);
88
+ responder(collection);
89
+ };
90
+
91
+ const onFetch = () => {
92
+ const collection = pullFromCache<Amity.ReactionLiveCollectionCache>(cacheKey)?.data;
93
+
94
+ const reactions = collection?.data ?? [];
95
+
96
+ if (reactions.length > 0 && !collection?.params?.page) return;
97
+
98
+ const query = createQuery(queryReactions, {
99
+ ...queryParams,
100
+ page: collection?.params?.page ?? { limit },
101
+ });
102
+
103
+ runQuery(
104
+ query,
105
+ ({ data: result, error, loading, nextPage: page }) => {
106
+ const data = {
107
+ loading,
108
+ error,
109
+ params: { page },
110
+ data: reactions,
111
+ };
112
+
113
+ if (result) {
114
+ data.data = [
115
+ ...new Set([...reactions, ...result[0].reactors.map(getResolver('reaction'))]),
116
+ ];
117
+ }
118
+
119
+ pushToCache(cacheKey, data);
120
+
121
+ responder(data);
122
+ },
123
+ queryOptions(policy),
124
+ );
125
+ };
126
+
127
+ disposers.push(
128
+ onReactorAdded(queryParams.referenceType, queryParams.referenceId, reaction =>
129
+ realtimeRouter(reaction, 'onAdded'),
130
+ ),
131
+ onReactorRemoved(queryParams.referenceType, queryParams.referenceId, reaction =>
132
+ realtimeRouter(reaction, 'onRemoved'),
133
+ ),
134
+ );
135
+
136
+ onFetch();
137
+
138
+ return () => {
139
+ log(`liveReactions(tmpid: ${timestamp}) > dispose`);
140
+ disposers.forEach(fn => fn());
141
+ };
142
+ };
@@ -0,0 +1,3 @@
1
+ export const COLLECTION_DEFAULT_PAGINATION_LIMIT = 5;
2
+ export const COLLECTION_DEFAULT_CACHING_POLICY: Amity.QueryPolicy = 'cache_then_server';
3
+ export const ENABLE_CACHE_MESSAGE = 'For using Live Collection feature you need to enable Cache!';
@@ -0,0 +1,33 @@
1
+ import {
2
+ createClient,
3
+ connectClient as sdkConnectClient,
4
+ disconnectClient as sdkDisconnectClient,
5
+ } from '~/client/api';
6
+
7
+ import { user11 } from './dummy';
8
+
9
+ export const client = createClient('key', 'sg');
10
+
11
+ export const connectClient = async () => {
12
+ client.mqtt.connect = jest.fn();
13
+ client.mqtt.subscribe = jest.fn();
14
+ client.http.post = jest.fn().mockReturnValueOnce({
15
+ data: {
16
+ accessToken: 'accessToken',
17
+ refreshToken: 'refreshToken',
18
+ users: [user11],
19
+ },
20
+ });
21
+
22
+ setTimeout(() => {
23
+ client.ws.emit('connect');
24
+ }, 500);
25
+
26
+ await sdkConnectClient({ userId: 'test' });
27
+ };
28
+
29
+ export const disconnectClient = async () => {
30
+ sdkDisconnectClient().then(() => client.ws.emit('disconnect'));
31
+ };
32
+
33
+ export default {};
@@ -0,0 +1,52 @@
1
+ import { date, rolesAndPermissions, user11 } from '.';
2
+
3
+ export const channelRaw1: Amity.ChannelRaw = {
4
+ messageCount: 1,
5
+ createdAt: date,
6
+ type: 'community',
7
+ channelId: 'channelId11',
8
+ };
9
+
10
+ export const channelRaw2: Amity.ChannelRaw = {
11
+ messageCount: 3,
12
+ createdAt: date,
13
+ type: 'community',
14
+ channelId: 'channelId12',
15
+ };
16
+
17
+ export const channel11: Amity.Channel = {
18
+ ...channelRaw1,
19
+ hasMention: false,
20
+ unreadCount: 0,
21
+ };
22
+
23
+ export const channel12: Amity.Channel = {
24
+ ...channelRaw2,
25
+ hasMention: true,
26
+ unreadCount: 2,
27
+ };
28
+
29
+ export const channelUser1: Amity.Membership<'channel'> = {
30
+ isMuted: false,
31
+ createdAt: date,
32
+ muteTimeout: '',
33
+ isBanned: false,
34
+ readToSegment: 1,
35
+ lastActivity: date,
36
+ membership: 'member',
37
+ userId: user11.userId,
38
+ ...rolesAndPermissions,
39
+ lastMentionedSegment: 0,
40
+ channelId: channel11.channelId,
41
+ };
42
+
43
+ export const channelUser2: Amity.Membership<'channel'> = {
44
+ ...channelUser1,
45
+ readToSegment: 1,
46
+ lastMentionedSegment: 2,
47
+ channelId: channel12.channelId,
48
+ };
49
+
50
+ export const channels = {
51
+ page1: [channel11.channelId, channel12.channelId],
52
+ };
@@ -0,0 +1,7 @@
1
+ export const date = new Date().toISOString();
2
+ export const rolesAndPermissions = { roles: [], permissions: [] };
3
+
4
+ export * from './user';
5
+ export * from './post';
6
+ export * from './channel';
7
+ export * from './message';
@@ -0,0 +1,21 @@
1
+ import { date, channel11, user11 } from '.';
2
+
3
+ export const message: Amity.Message = {
4
+ reactions: {},
5
+ editedAt: date,
6
+ createdAt: date,
7
+ reactionsCount: 0,
8
+ channelSegment: 1,
9
+ childrenNumber: 0,
10
+ userId: user11.userId,
11
+ messageId: 'message11',
12
+ channelId: channel11.channelId,
13
+ data: { text: 'message1' },
14
+ };
15
+
16
+ export const messages = {
17
+ channelId: 'channelId',
18
+ page1: ['messageId11', 'messageId12', 'messageId13'],
19
+ page2: ['messageId21', 'messageId22', 'messageId23'],
20
+ page3: ['messageId31', 'messageId32', 'messageId33'],
21
+ };
@@ -0,0 +1,31 @@
1
+ import { user11, date } from '.';
2
+
3
+ export const post1: Amity.Post = {
4
+ path: '',
5
+ feedId: '',
6
+ children: [],
7
+ comments: [],
8
+ flagCount: 0,
9
+ reactions: {},
10
+ hashFlag: null,
11
+ editedAt: date,
12
+ createdAt: date,
13
+ commentsCount: 0,
14
+ reactionsCount: 0,
15
+ postId: 'postId11',
16
+ targetType: 'user',
17
+ parentId: 'postId12',
18
+ data: { text: 'post1' },
19
+ targetId: user11.userId,
20
+ hasFlaggedComment: false,
21
+ hasFlaggedChildren: false,
22
+ postedUserId: user11.userId,
23
+ };
24
+
25
+ export const posts = {
26
+ targetId: user11.userId,
27
+ targetType: 'user' as Amity.PostTargetType,
28
+ page1: [post1.postId, 'postId12', 'postId13'],
29
+ page2: ['postId21', 'postId22', 'postId23'],
30
+ page3: ['postId31', 'postId32', 'postId33'],
31
+ };
@@ -0,0 +1,11 @@
1
+ import { date, rolesAndPermissions } from '.';
2
+
3
+ export const user11: Amity.User = {
4
+ _id: '',
5
+ path: '',
6
+ flagCount: 0,
7
+ userId: 'test',
8
+ hashFlag: null,
9
+ createdAt: date,
10
+ ...rolesAndPermissions,
11
+ };
@@ -0,0 +1,2 @@
1
+ export * from './dummy';
2
+ export * from './client';
package/tsconfig.json CHANGED
@@ -1,29 +1,30 @@
1
1
  {
2
- "extends": "../../tsconfig.json",
2
+ "extends": "../../tsconfig.json",
3
3
 
4
- "include": ["./src"],
5
- "exclude": ["node_modules"],
4
+ "include": ["./src"],
5
+ "exclude": ["node_modules", "**/*.spec.ts"],
6
6
 
7
- "compilerOptions": {
8
- "baseUrl": "./src",
9
- "paths": {
10
- "~/*": ["./*"],
11
- },
7
+ "compilerOptions": {
8
+ "baseUrl": "./src",
9
+ "paths": {
10
+ "~/*": ["./*"]
11
+ },
12
12
 
13
- "rootDir": "./src",
14
- "outDir": "./dist",
15
- "declaration": true,
16
- "declarationDir": "./dist",
17
- "noEmit": true, // by rollup
13
+ "rootDir": "./src",
14
+ "outDir": "./dist",
15
+ "declaration": true,
16
+ "declarationDir": "./dist",
17
+ "noEmit": true,
18
18
 
19
- "module": "es2020",
20
- "target": "es2017",
19
+ "module": "es2020",
20
+ "target": "es2017",
21
21
 
22
- "lib": [
23
- "esnext",
24
- "es7",
25
- "es6",
26
- "dom",
27
- ],
28
- }
22
+ "lib": [
23
+ "esnext",
24
+ "es7",
25
+ "es6",
26
+ "dom"
27
+ ],
28
+ "resolveJsonModule": true
29
+ }
29
30
  }