@amityco/ts-sdk 0.0.1-beta.39 → 0.0.1-beta.40

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 (285) hide show
  1. package/.eslintrc.json +2 -0
  2. package/dist/@types/core/events.d.ts +22 -22
  3. package/dist/@types/core/events.d.ts.map +1 -1
  4. package/dist/@types/core/model.d.ts +3 -2
  5. package/dist/@types/core/model.d.ts.map +1 -1
  6. package/dist/@types/core/payload.d.ts +87 -34
  7. package/dist/@types/core/payload.d.ts.map +1 -1
  8. package/dist/@types/domains/channel.d.ts +1 -1
  9. package/dist/@types/domains/client.d.ts +1 -1
  10. package/dist/@types/domains/client.d.ts.map +1 -1
  11. package/dist/@types/domains/comment.d.ts +5 -0
  12. package/dist/@types/domains/comment.d.ts.map +1 -1
  13. package/dist/@types/domains/community.d.ts +11 -0
  14. package/dist/@types/domains/community.d.ts.map +1 -1
  15. package/dist/@types/domains/content.d.ts +7 -1
  16. package/dist/@types/domains/content.d.ts.map +1 -1
  17. package/dist/@types/domains/group.d.ts +2 -2
  18. package/dist/@types/global.d.ts +8 -0
  19. package/dist/@types/global.d.ts.map +1 -1
  20. package/dist/cache/api/ingestInCache.d.ts +2 -1
  21. package/dist/cache/api/ingestInCache.d.ts.map +1 -1
  22. package/dist/channel/api/banChannelMembers.d.ts.map +1 -1
  23. package/dist/channel/api/queryChannelMembers.d.ts.map +1 -1
  24. package/dist/channel/api/unbanChannelMembers.d.ts.map +1 -1
  25. package/dist/channel/events/onChannelJoined.d.ts.map +1 -1
  26. package/dist/channel/events/onChannelLeft.d.ts.map +1 -1
  27. package/dist/channel/events/onChannelMemberAdded.d.ts.map +1 -1
  28. package/dist/channel/events/onChannelMemberBanned.d.ts.map +1 -1
  29. package/dist/channel/events/onChannelMemberRemoved.d.ts.map +1 -1
  30. package/dist/channel/events/onChannelMemberUnbanned.d.ts.map +1 -1
  31. package/dist/channel/utils/index.d.ts +2 -2
  32. package/dist/channel/utils/index.d.ts.map +1 -1
  33. package/dist/comment/api/createComment.d.ts +1 -1
  34. package/dist/comment/api/createComment.d.ts.map +1 -1
  35. package/dist/comment/api/deleteComment.d.ts.map +1 -1
  36. package/dist/comment/api/tests/updateComment.test.d.ts +2 -0
  37. package/dist/comment/api/tests/updateComment.test.d.ts.map +1 -0
  38. package/dist/community/api/addCommunityMembers.d.ts.map +1 -1
  39. package/dist/community/api/addCommunityMembersRoles.d.ts +1 -1
  40. package/dist/community/api/addCommunityMembersRoles.d.ts.map +1 -1
  41. package/dist/community/api/deleteCommunity.d.ts.map +1 -1
  42. package/dist/community/api/joinCommunity.d.ts.map +1 -1
  43. package/dist/community/api/leaveCommunity.d.ts.map +1 -1
  44. package/dist/community/api/queryCommunityMembers.d.ts +1 -7
  45. package/dist/community/api/queryCommunityMembers.d.ts.map +1 -1
  46. package/dist/community/api/removeCommunityMembers.d.ts.map +1 -1
  47. package/dist/community/api/removeCommunityMembersRoles.d.ts +1 -1
  48. package/dist/community/api/removeCommunityMembersRoles.d.ts.map +1 -1
  49. package/dist/community/events/index.d.ts +2 -0
  50. package/dist/community/events/index.d.ts.map +1 -1
  51. package/dist/community/events/onCommunityUserRoleAdded.d.ts +17 -0
  52. package/dist/community/events/onCommunityUserRoleAdded.d.ts.map +1 -0
  53. package/dist/community/events/onCommunityUserRoleRemoved.d.ts +17 -0
  54. package/dist/community/events/onCommunityUserRoleRemoved.d.ts.map +1 -0
  55. package/dist/community/events/test/onCommunityUserRoleAdded.test.d.ts +2 -0
  56. package/dist/community/events/test/onCommunityUserRoleAdded.test.d.ts.map +1 -0
  57. package/dist/community/events/test/onCommunityUserRoleRemoved.test.d.ts +2 -0
  58. package/dist/community/events/test/onCommunityUserRoleRemoved.test.d.ts.map +1 -0
  59. package/dist/community/events/utils.d.ts.map +1 -1
  60. package/dist/community/observers/index.d.ts +2 -0
  61. package/dist/community/observers/index.d.ts.map +1 -1
  62. package/dist/community/observers/liveCommunity.d.ts +21 -0
  63. package/dist/community/observers/liveCommunity.d.ts.map +1 -0
  64. package/dist/community/observers/liveCommunityMembers.d.ts +20 -0
  65. package/dist/community/observers/liveCommunityMembers.d.ts.map +1 -0
  66. package/dist/community/observers/tests/liveCommunity.test.d.ts +2 -0
  67. package/dist/community/observers/tests/liveCommunity.test.d.ts.map +1 -0
  68. package/dist/community/observers/tests/liveCommunityMembers.test.d.ts +2 -0
  69. package/dist/community/observers/tests/liveCommunityMembers.test.d.ts.map +1 -0
  70. package/dist/community/utils/payload.d.ts +3 -5
  71. package/dist/community/utils/payload.d.ts.map +1 -1
  72. package/dist/core/device.d.ts.map +1 -1
  73. package/dist/core/events.d.ts +3 -3
  74. package/dist/core/events.d.ts.map +1 -1
  75. package/dist/core/model/idResolvers.d.ts +2 -4
  76. package/dist/core/model/idResolvers.d.ts.map +1 -1
  77. package/dist/core/model/identifyModel.d.ts +2 -2
  78. package/dist/core/model/identifyModel.d.ts.map +1 -1
  79. package/dist/core/model/index.d.ts.map +1 -1
  80. package/dist/core/query/query.d.ts.map +1 -1
  81. package/dist/external/api/tests/createUserToken.test.d.ts +2 -0
  82. package/dist/external/api/tests/createUserToken.test.d.ts.map +1 -0
  83. package/dist/feed/api/queryGlobalFeed.d.ts.map +1 -1
  84. package/dist/group/utils/withUser.d.ts.map +1 -1
  85. package/dist/index.cjs.js +481 -200
  86. package/dist/index.esm.js +477 -200
  87. package/dist/index.umd.js +4 -4
  88. package/dist/message/api/createMessage.d.ts.map +1 -1
  89. package/dist/message/utils/index.d.ts +3 -3
  90. package/dist/message/utils/index.d.ts.map +1 -1
  91. package/dist/poll/api/tests/closePoll.test.d.ts +2 -0
  92. package/dist/poll/api/tests/closePoll.test.d.ts.map +1 -0
  93. package/dist/poll/api/tests/createPoll.test.d.ts +2 -0
  94. package/dist/poll/api/tests/createPoll.test.d.ts.map +1 -0
  95. package/dist/poll/api/tests/getPoll.test.d.ts +2 -0
  96. package/dist/poll/api/tests/getPoll.test.d.ts.map +1 -0
  97. package/dist/poll/api/tests/votePoll.test.d.ts +2 -0
  98. package/dist/poll/api/tests/votePoll.test.d.ts.map +1 -0
  99. package/dist/post/api/approvePost.d.ts.map +1 -1
  100. package/dist/post/api/createPost.d.ts.map +1 -1
  101. package/dist/post/api/declinePost.d.ts.map +1 -1
  102. package/dist/post/api/deletePost.d.ts.map +1 -1
  103. package/dist/post/api/getPost.d.ts.map +1 -1
  104. package/dist/post/api/getPosts.d.ts.map +1 -1
  105. package/dist/post/api/queryPosts.d.ts.map +1 -1
  106. package/dist/post/api/updatePost.d.ts.map +1 -1
  107. package/dist/post/events/utils.d.ts.map +1 -1
  108. package/dist/reaction/api/queryReactions.d.ts.map +1 -1
  109. package/dist/reaction/api/removeReaction.d.ts.map +1 -1
  110. package/dist/reaction/events/onReactorAdded.d.ts.map +1 -1
  111. package/dist/reaction/events/onReactorRemoved.d.ts.map +1 -1
  112. package/dist/reaction/utils/dispatchReactable.d.ts +1 -1
  113. package/dist/reaction/utils/dispatchReactable.d.ts.map +1 -1
  114. package/dist/report/api/createReport.d.ts.map +1 -1
  115. package/dist/report/api/deleteReport.d.ts.map +1 -1
  116. package/dist/subChannel/utils/index.d.ts +1 -1
  117. package/dist/subChannel/utils/index.d.ts.map +1 -1
  118. package/dist/utils/index.d.ts +2 -2
  119. package/dist/utils/index.d.ts.map +1 -1
  120. package/dist/utils/tests/dummy/channel.d.ts +31 -35
  121. package/dist/utils/tests/dummy/channel.d.ts.map +1 -1
  122. package/dist/utils/tests/dummy/community.d.ts +35 -84
  123. package/dist/utils/tests/dummy/community.d.ts.map +1 -1
  124. package/dist/utils/tests/dummy/feed.d.ts +2 -18
  125. package/dist/utils/tests/dummy/feed.d.ts.map +1 -1
  126. package/dist/utils/tests/dummy/member.d.ts +1 -1
  127. package/dist/utils/tests/dummy/post.d.ts +30 -29
  128. package/dist/utils/tests/dummy/post.d.ts.map +1 -1
  129. package/dist/version.d.ts.map +1 -1
  130. package/package.json +1 -1
  131. package/src/@types/core/events.ts +22 -20
  132. package/src/@types/core/model.ts +3 -2
  133. package/src/@types/core/payload.ts +102 -38
  134. package/src/@types/domains/channel.ts +1 -1
  135. package/src/@types/domains/client.ts +1 -1
  136. package/src/@types/domains/comment.ts +7 -0
  137. package/src/@types/domains/community.ts +25 -0
  138. package/src/@types/domains/content.ts +9 -1
  139. package/src/@types/domains/group.ts +2 -2
  140. package/src/@types/global.ts +10 -0
  141. package/src/cache/api/ingestInCache.ts +3 -6
  142. package/src/cache/api/tests/ingestInCache.test.ts +12 -9
  143. package/src/channel/api/addChannelMembers.ts +5 -5
  144. package/src/channel/api/banChannelMembers.ts +1 -3
  145. package/src/channel/api/getChannel.ts +1 -1
  146. package/src/channel/api/queryChannelMembers.ts +1 -3
  147. package/src/channel/api/removeChannelMembers.ts +5 -5
  148. package/src/channel/api/tests/addChannelMembers.test.ts +4 -3
  149. package/src/channel/api/tests/createChannel.test.ts +5 -3
  150. package/src/channel/api/tests/getChannel.test.ts +2 -1
  151. package/src/channel/api/tests/joinChannel.test.ts +2 -2
  152. package/src/channel/api/tests/leaveChannel.test.ts +2 -2
  153. package/src/channel/api/tests/queryChannelMembers.test.ts +2 -5
  154. package/src/channel/api/tests/queryChannels.test.ts +4 -3
  155. package/src/channel/api/tests/removeChannelMembers.test.ts +16 -5
  156. package/src/channel/api/unbanChannelMembers.ts +1 -3
  157. package/src/channel/events/onChannelJoined.ts +1 -3
  158. package/src/channel/events/onChannelLeft.ts +1 -3
  159. package/src/channel/events/onChannelMemberAdded.ts +1 -3
  160. package/src/channel/events/onChannelMemberBanned.ts +1 -3
  161. package/src/channel/events/onChannelMemberRemoved.ts +1 -3
  162. package/src/channel/events/onChannelMemberUnbanned.ts +1 -3
  163. package/src/channel/observers/tests/liveChannelMembers.test.ts +5 -12
  164. package/src/channel/observers/tests/liveChannels.test.ts +3 -1
  165. package/src/channel/utils/index.ts +9 -6
  166. package/src/comment/api/createComment.ts +18 -2
  167. package/src/comment/api/deleteComment.ts +19 -2
  168. package/src/comment/api/tests/createComment.test.ts +169 -9
  169. package/src/comment/api/tests/updateComment.test.ts +189 -0
  170. package/src/comment/events/tests/onCommentCreated.test.ts +3 -3
  171. package/src/comment/events/tests/onCommentDeleted.test.ts +3 -3
  172. package/src/comment/observers/tests/liveComment.test.ts +18 -2
  173. package/src/community/api/addCommunityMembers.ts +6 -3
  174. package/src/community/api/addCommunityMembersRoles.ts +5 -2
  175. package/src/community/api/createCommunity.ts +5 -5
  176. package/src/community/api/deleteCommunity.ts +9 -1
  177. package/src/community/api/getCommunities.ts +2 -2
  178. package/src/community/api/getCommunity.ts +2 -2
  179. package/src/community/api/getRecommendedCommunities.ts +2 -2
  180. package/src/community/api/getTopTrendingCommunities.ts +2 -2
  181. package/src/community/api/joinCommunity.ts +6 -3
  182. package/src/community/api/leaveCommunity.ts +6 -3
  183. package/src/community/api/queryCommunities.ts +3 -3
  184. package/src/community/api/queryCommunityMembers.ts +3 -7
  185. package/src/community/api/removeCommunityMembers.ts +7 -3
  186. package/src/community/api/removeCommunityMembersRoles.ts +5 -2
  187. package/src/community/api/test/queryCommunityMembers.test.ts +2 -1
  188. package/src/community/api/test/removeCommunityMemberRole.test.ts +4 -1
  189. package/src/community/api/updateCommunity.ts +5 -5
  190. package/src/community/events/index.ts +2 -0
  191. package/src/community/events/onCommunityUserRoleAdded.ts +20 -0
  192. package/src/community/events/onCommunityUserRoleRemoved.ts +20 -0
  193. package/src/community/events/test/onCommunityDeleted.test.ts +8 -1
  194. package/src/community/events/test/onCommunityUserRoleAdded.test.ts +50 -0
  195. package/src/community/events/test/onCommunityUserRoleRemoved.test.ts +50 -0
  196. package/src/community/events/utils.ts +4 -8
  197. package/src/community/observers/index.ts +4 -0
  198. package/src/community/observers/liveCommunity.ts +45 -0
  199. package/src/community/observers/liveCommunityMembers.ts +187 -0
  200. package/src/community/observers/tests/liveCommunities.test.ts +38 -18
  201. package/src/community/observers/tests/liveCommunity.test.ts +147 -0
  202. package/src/community/observers/tests/liveCommunityMembers.test.ts +195 -0
  203. package/src/community/utils/payload.ts +28 -22
  204. package/src/core/device.ts +2 -4
  205. package/src/core/model/idResolvers.ts +4 -3
  206. package/src/core/model/identifyModel.ts +3 -3
  207. package/src/core/model/index.ts +1 -0
  208. package/src/core/query/query.ts +7 -0
  209. package/src/core/tests/query/query/runQuery.test.ts +8 -3
  210. package/src/core/tests/subscription.test.ts +80 -2
  211. package/src/external/api/tests/createUserToken.test.ts +29 -0
  212. package/src/feed/api/queryGlobalFeed.ts +8 -4
  213. package/src/group/utils/test/withUsers.test.ts +5 -5
  214. package/src/group/utils/withUser.ts +20 -14
  215. package/src/message/api/createMessage.ts +10 -9
  216. package/src/message/api/getMessage.ts +2 -2
  217. package/src/message/api/getMessages.ts +1 -1
  218. package/src/message/api/queryMessages.ts +2 -2
  219. package/src/message/api/tests/createMessage.test.ts +5 -1
  220. package/src/message/api/updateMessage.ts +1 -1
  221. package/src/message/events/onMessageCreated.ts +1 -1
  222. package/src/message/events/onMessageDeleted.ts +1 -1
  223. package/src/message/events/onMessageFetched.ts +1 -1
  224. package/src/message/events/onMessageFlagCleared.ts +1 -1
  225. package/src/message/events/onMessageFlagged.ts +1 -1
  226. package/src/message/events/onMessageReactionAdded.ts +1 -1
  227. package/src/message/events/onMessageReactionRemoved.ts +1 -1
  228. package/src/message/events/onMessageUnflagged.ts +1 -1
  229. package/src/message/events/onMessageUpdated.ts +1 -1
  230. package/src/message/tests/events.test.ts +10 -2
  231. package/src/message/tests/observers/liveMessage.test.ts +6 -1
  232. package/src/message/tests/observers/liveMessages.test.ts +16 -3
  233. package/src/message/utils/index.ts +5 -3
  234. package/src/poll/api/tests/closePoll.test.ts +50 -0
  235. package/src/poll/api/tests/createPoll.test.ts +70 -0
  236. package/src/poll/api/tests/getPoll.test.ts +31 -0
  237. package/src/poll/api/tests/votePoll.test.ts +41 -0
  238. package/src/poll/events/onPollDeleted.ts +1 -1
  239. package/src/poll/events/onPollUpdated.ts +1 -1
  240. package/src/post/api/approvePost.ts +10 -10
  241. package/src/post/api/createPost.ts +6 -3
  242. package/src/post/api/declinePost.ts +11 -11
  243. package/src/post/api/deletePost.ts +19 -2
  244. package/src/post/api/getPost.ts +5 -2
  245. package/src/post/api/getPosts.ts +4 -1
  246. package/src/post/api/queryPosts.ts +3 -1
  247. package/src/post/api/tests/queryPosts.test.ts +5 -4
  248. package/src/post/api/updatePost.ts +4 -1
  249. package/src/post/events/onPostReactionAdded.ts +1 -1
  250. package/src/post/events/onPostReactionRemoved.ts +1 -1
  251. package/src/post/events/utils.ts +12 -2
  252. package/src/post/observers/tests/livePost.test.ts +10 -3
  253. package/src/post/observers/tests/livePosts.test.ts +12 -4
  254. package/src/post/tests/api/getPost.test.ts +13 -3
  255. package/src/post/tests/api/queryPosts.test.ts +5 -4
  256. package/src/reaction/api/addReaction.ts +3 -3
  257. package/src/reaction/api/queryReactions.ts +2 -0
  258. package/src/reaction/api/removeReaction.ts +4 -3
  259. package/src/reaction/events/onReactionAdded.ts +3 -3
  260. package/src/reaction/events/onReactionRemoved.ts +3 -3
  261. package/src/reaction/events/onReactorAdded.ts +8 -2
  262. package/src/reaction/events/onReactorRemoved.ts +8 -2
  263. package/src/reaction/utils/dispatchReactable.ts +1 -1
  264. package/src/reaction/utils/fetchReference.ts +1 -1
  265. package/src/report/api/createReport.ts +14 -8
  266. package/src/report/api/deleteReport.ts +14 -8
  267. package/src/subChannel/api/createSubChannel.ts +1 -1
  268. package/src/subChannel/api/getSubChannel.ts +1 -1
  269. package/src/subChannel/api/getSubChannels.ts +1 -1
  270. package/src/subChannel/api/querySubChannels.ts +2 -2
  271. package/src/subChannel/api/updateSubChannel.ts +1 -1
  272. package/src/subChannel/events/onSubChannelCreated.ts +1 -1
  273. package/src/subChannel/events/onSubChannelDeleted.ts +1 -1
  274. package/src/subChannel/events/onSubChannelUpdated.ts +1 -1
  275. package/src/subChannel/utils/index.ts +2 -2
  276. package/src/user/observers/tests/liveUsers.test.ts +2 -0
  277. package/src/user/tests/api/getUser.test.ts +17 -3
  278. package/src/utils/index.ts +2 -2
  279. package/src/utils/liveObject.ts +1 -1
  280. package/src/utils/tests/dummy/channel.ts +18 -11
  281. package/src/utils/tests/dummy/community.ts +68 -6
  282. package/src/utils/tests/dummy/feed.ts +1 -1
  283. package/src/utils/tests/dummy/member.ts +1 -1
  284. package/src/utils/tests/dummy/post.ts +93 -9
  285. package/src/version.ts +9 -3
@@ -1,6 +1,7 @@
1
1
  import { getActiveClient } from '~/client/api';
2
2
 
3
3
  import { ingestInCache } from '~/cache/api/ingestInCache';
4
+ import { prepareCommunityPayload } from '~/community/utils';
4
5
  import { fireEvent } from '~/core/events';
5
6
 
6
7
  /**
@@ -23,15 +24,17 @@ export const joinCommunity = async (
23
24
  const client = getActiveClient();
24
25
  client.log('community/joinCommunity', communityId);
25
26
 
26
- const { data } = await client.http.post<Amity.CommunityMembershipPayload>(
27
+ const { data: payload } = await client.http.post<Amity.CommunityMembershipPayload>(
27
28
  `/api/v3/communities/${communityId}/join`,
28
29
  );
29
30
 
31
+ fireEvent('community.joined', payload);
32
+
33
+ const data = prepareCommunityPayload(payload);
34
+
30
35
  const cachedAt = client.cache && Date.now();
31
36
  if (client.cache) ingestInCache(data, { cachedAt });
32
37
 
33
- fireEvent('community.joined', data);
34
-
35
38
  const { communityUsers } = data;
36
39
 
37
40
  return !!communityUsers.find(
@@ -1,6 +1,7 @@
1
1
  import { getActiveClient } from '~/client/api';
2
2
 
3
3
  import { ingestInCache } from '~/cache/api/ingestInCache';
4
+ import { prepareCommunityPayload } from '~/community/utils';
4
5
  import { fireEvent } from '~/core/events';
5
6
 
6
7
  /**
@@ -23,15 +24,17 @@ export const leaveCommunity = async (
23
24
  const client = getActiveClient();
24
25
  client.log('community/leaveCommunity', communityId);
25
26
 
26
- const { data } = await client.http.delete<Amity.CommunityMembershipPayload>(
27
+ const { data: payload } = await client.http.delete<Amity.CommunityMembershipPayload>(
27
28
  `/api/v3/communities/${communityId}/leave`,
28
29
  );
29
30
 
31
+ fireEvent('community.left', payload);
32
+
33
+ const data = prepareCommunityPayload(payload);
34
+
30
35
  const cachedAt = client.cache && Date.now();
31
36
  if (client.cache) ingestInCache(data, { cachedAt });
32
37
 
33
- fireEvent('community.left', data);
34
-
35
38
  const { communityUsers } = data;
36
39
 
37
40
  return !!communityUsers.find(
@@ -5,7 +5,7 @@ import { pushToCache } from '~/cache/api';
5
5
  import { ingestInCache } from '~/cache/api/ingestInCache';
6
6
  import { getResolver } from '~/core/model';
7
7
 
8
- import { unpackCommunityPayload } from '../utils';
8
+ import { prepareCommunityPayload } from '../utils';
9
9
 
10
10
  /**
11
11
  * ```js
@@ -50,13 +50,13 @@ export const queryCommunities = async (
50
50
  );
51
51
 
52
52
  const { paging, ...payload } = data;
53
- const unpackedPayload = unpackCommunityPayload(payload);
53
+ const unpackedPayload = prepareCommunityPayload(payload);
54
54
  const { communities } = unpackedPayload;
55
55
 
56
56
  const cachedAt = client.cache && Date.now();
57
57
 
58
58
  if (client.cache) {
59
- ingestInCache(unpackedPayload as Amity.CommunityPayload, { cachedAt });
59
+ ingestInCache(unpackedPayload, { cachedAt });
60
60
 
61
61
  const cacheKey = [
62
62
  'community',
@@ -20,13 +20,9 @@ import { prepareMembershipPayload } from '~/group/utils';
20
20
  * @category Community API
21
21
  * @async
22
22
  * */
23
- export const queryCommunityMembers = async (query: {
24
- communityId: string;
25
- membership?: ('banned' | 'member')[];
26
- roles?: string[];
27
- sortBy?: 'firstCreated' | 'lastCreated';
28
- page?: Amity.Page;
29
- }): Promise<Amity.Cached<Amity.Paged<Amity.Membership<'community'>>>> => {
23
+ export const queryCommunityMembers = async (
24
+ query: Amity.QueryCommunityMembers,
25
+ ): Promise<Amity.Cached<Amity.Paged<Amity.Membership<'community'>>>> => {
30
26
  const client = getActiveClient();
31
27
  client.log('community/queryCommunityMembers', query);
32
28
 
@@ -2,6 +2,7 @@ import { getActiveClient } from '~/client/api';
2
2
 
3
3
  import { ingestInCache } from '~/cache/api/ingestInCache';
4
4
  import { fireEvent } from '~/core/events';
5
+ import { prepareMembershipPayload } from '~/group/utils';
5
6
 
6
7
  /**
7
8
  * ```js
@@ -25,16 +26,19 @@ export const removeCommunityMembers = async (
25
26
  const client = getActiveClient();
26
27
  client.log('community/removeCommunityMembers', communityId, userIds);
27
28
 
28
- const { data } = await client.http.delete<Amity.CommunityMembershipPayload>(
29
+ const { data: payload } = await client.http.delete<Amity.CommunityMembershipPayload>(
29
30
  `/api/v3/communities/${communityId}/users`,
30
31
  { data: { communityId, userIds } },
31
32
  );
32
33
 
33
- if (client.cache) ingestInCache(data);
34
+ fireEvent('community.userRemoved', payload);
35
+
36
+ const data = prepareMembershipPayload(payload, 'communityUsers');
34
37
 
35
- fireEvent('community.userRemoved', data);
38
+ if (client.cache) ingestInCache(data);
36
39
 
37
40
  const { communityUsers } = data;
41
+
38
42
  return !!communityUsers.find(
39
43
  communityUser =>
40
44
  communityUser.communityId === communityId && communityUser.communityMembership !== 'member',
@@ -1,6 +1,7 @@
1
1
  import { getActiveClient } from '~/client/api';
2
2
 
3
3
  import { ingestInCache } from '~/cache/api/ingestInCache';
4
+ import { prepareMembershipPayload } from '~/group/utils';
4
5
 
5
6
  /**
6
7
  * ```js
@@ -12,7 +13,7 @@ import { ingestInCache } from '~/cache/api/ingestInCache';
12
13
  *
13
14
  * @param communityId The ID of the {@link Amity.Community} to perform
14
15
  * @param roleIds Array of IDs of the {@link Amity.Role} to apply
15
- * @param userId Array of IDs of the {@link Amity.User} to perform
16
+ * @param userIds Array of IDs of the {@link Amity.User} to perform
16
17
  * @returns A success boolean if the {@link Amity.Role} were removed from list of {@link Amity.User} in the {@link Amity.Community}
17
18
  *
18
19
  * @category Community API
@@ -26,11 +27,13 @@ export const removeCommunityMembersRoles = async (
26
27
  const client = getActiveClient();
27
28
  client.log('community/removeCommunityMembersRoles', communityId, roleIds, userIds);
28
29
 
29
- const { data } = await client.http.delete<Amity.CommunityMembershipPayload>(
30
+ const { data: payload } = await client.http.delete<Amity.CommunityMembershipPayload>(
30
31
  `/api/v4/communities/${communityId}/users/roles`,
31
32
  { data: { communityId, roles: roleIds, userIds } },
32
33
  );
33
34
 
35
+ const data = prepareMembershipPayload(payload, 'communityUsers');
36
+
34
37
  if (client.cache) ingestInCache(data);
35
38
 
36
39
  const { communityUsers } = data;
@@ -87,10 +87,11 @@ describe('queryCommunityMembers.locally', () => {
87
87
  const { communityUsers } = preparedPayload;
88
88
 
89
89
  // ingest incomplete data
90
+ // @ts-ignore
90
91
  ingestInCache({
91
92
  ...preparedPayload,
92
93
  communityUsers: [payload.communityUsers[0]],
93
- } as Amity.CommunityMembershipPayload);
94
+ } as Amity.ProcessedCommunityMembershipPayload);
94
95
 
95
96
  pushToCache(cacheKey, {
96
97
  communityUsers: communityUsers.map(({ communityId, userId }) =>
@@ -7,7 +7,10 @@ import { removeCommunityMembersRoles } from '../removeCommunityMembersRoles';
7
7
 
8
8
  const community = community11;
9
9
  const roleToRemove = 'some-exist-role';
10
- const userToRemoveRole = { ...communityUser11, roles: [...communityUser11.roles, roleToRemove] };
10
+ const userToRemoveRole = {
11
+ ...communityUser11,
12
+ roles: [...communityUser11.roles, roleToRemove],
13
+ };
11
14
  const removedRoleUser = { ...communityUser11 };
12
15
 
13
16
  const resolvedDeleteValue = {
@@ -3,7 +3,7 @@ import { getActiveClient } from '~/client/api';
3
3
  import { ingestInCache } from '~/cache/api/ingestInCache';
4
4
  import { fireEvent } from '~/core/events';
5
5
 
6
- import { packCommunityPayload, unpackCommunityPayload } from '../utils';
6
+ import { prepareCommunityRequest, prepareCommunityPayload } from '../utils';
7
7
 
8
8
  /**
9
9
  * ```js
@@ -32,16 +32,16 @@ export const updateCommunity = async (
32
32
 
33
33
  const { data: payload } = await client.http.put<Amity.CommunityPayload>(
34
34
  `/api/v3/communities/${communityId}`,
35
- packCommunityPayload(patch),
35
+ prepareCommunityRequest(patch),
36
36
  );
37
37
 
38
- const data = unpackCommunityPayload(payload);
38
+ fireEvent('community.updated', payload);
39
+
40
+ const data = prepareCommunityPayload(payload);
39
41
 
40
42
  const cachedAt = client.cache && Date.now();
41
43
  if (client.cache) ingestInCache(data, { cachedAt });
42
44
 
43
- fireEvent('community.updated', data);
44
-
45
45
  const { communities } = data;
46
46
 
47
47
  return {
@@ -10,3 +10,5 @@ export * from './onCommunityUserRemoved';
10
10
  export * from './onCommunityUserChanged';
11
11
  export * from './onCommunityUserBanned';
12
12
  export * from './onCommunityUserUnbanned';
13
+ export * from './onCommunityUserRoleAdded';
14
+ export * from './onCommunityUserRoleRemoved';
@@ -0,0 +1,20 @@
1
+ import { createCommunityMemberEventSubscriber } from './utils';
2
+
3
+ /**
4
+ * ```js
5
+ * import { onCommunityUserRoleAdded } from '@amityco/ts-sdk'
6
+ * const dispose = onCommunityUserRoleAdded((community, member) => {
7
+ * // ...
8
+ * })
9
+ * ```
10
+ *
11
+ * Fired when a role has been added to {@link Amity.CommunityUser}
12
+ *
13
+ * @param callback The function to call when the event was fired
14
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
15
+ *
16
+ * @category Community Events
17
+ */
18
+ export const onCommunityUserRoleAdded = (
19
+ callback: (community: Amity.Community, member: Amity.Membership<'community'>) => void,
20
+ ) => createCommunityMemberEventSubscriber('community.roleAdded', callback);
@@ -0,0 +1,20 @@
1
+ import { createCommunityMemberEventSubscriber } from './utils';
2
+
3
+ /**
4
+ * ```js
5
+ * import { onCommunityUserRoleRemoved } from '@amityco/ts-sdk'
6
+ * const dispose = onCommunityUserRoleRemoved((community, member) => {
7
+ * // ...
8
+ * })
9
+ * ```
10
+ *
11
+ * Fired when a role has been removed from {@link Amity.CommunityUser}
12
+ *
13
+ * @param callback The function to call when the event was fired
14
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
15
+ *
16
+ * @category Community Events
17
+ */
18
+ export const onCommunityUserRoleRemoved = (
19
+ callback: (community: Amity.Community, member: Amity.Membership<'community'>) => void,
20
+ ) => createCommunityMemberEventSubscriber('community.roleRemoved', callback);
@@ -1,10 +1,17 @@
1
- import { client, connectClient, disconnectClient, community11 } from '~/utils/tests';
1
+ import {
2
+ client,
3
+ connectClient,
4
+ disconnectClient,
5
+ community11,
6
+ emptyCommunityPayload,
7
+ } from '~/utils/tests';
2
8
 
3
9
  import { onCommunityDeleted } from '../onCommunityDeleted';
4
10
 
5
11
  const deletedCommunity = { ...community11, isDeleted: true };
6
12
 
7
13
  const eventPayload: Amity.CommunityPayload = {
14
+ ...emptyCommunityPayload,
8
15
  communities: [deletedCommunity],
9
16
  };
10
17
 
@@ -0,0 +1,50 @@
1
+ import { withUser } from '~/group/utils';
2
+ import {
3
+ client,
4
+ connectClient,
5
+ disconnectClient,
6
+ community11,
7
+ communityUser11,
8
+ user11,
9
+ } from '~/utils/tests';
10
+
11
+ import { onCommunityUserRoleAdded } from '../onCommunityUserRoleAdded';
12
+
13
+ const community = community11;
14
+ const userWithRoleRaw = { ...communityUser11, role: ['new-role'] };
15
+ const userWithRole = withUser(userWithRoleRaw);
16
+
17
+ const eventPayload: Amity.CommunityMembershipPayload = {
18
+ communities: [community],
19
+ communityUsers: [userWithRoleRaw],
20
+ files: [],
21
+ users: [user11],
22
+ categories: [],
23
+ feeds: [],
24
+ };
25
+
26
+ describe('onCommunityUserRoleAdded', () => {
27
+ beforeAll(connectClient);
28
+ afterAll(disconnectClient);
29
+
30
+ test('it should got event after role added to community user', () => {
31
+ const callback = jest.fn();
32
+ const unsub = onCommunityUserRoleAdded(callback);
33
+ client.emitter.emit('community.roleAdded', eventPayload);
34
+
35
+ unsub();
36
+
37
+ expect(callback).toHaveBeenCalled();
38
+ expect(callback).toHaveBeenCalledWith({ ...community, isJoined: true }, userWithRole);
39
+ });
40
+
41
+ test('it should got nothing if we did unsubscribe before event', () => {
42
+ const callback = jest.fn();
43
+ const unsub = onCommunityUserRoleAdded(callback);
44
+
45
+ unsub();
46
+
47
+ client.emitter.emit('community.roleAdded', eventPayload);
48
+ expect(callback).not.toHaveBeenCalled();
49
+ });
50
+ });
@@ -0,0 +1,50 @@
1
+ import { withUser } from '~/group/utils';
2
+ import {
3
+ client,
4
+ connectClient,
5
+ disconnectClient,
6
+ community11,
7
+ communityUser11,
8
+ user11,
9
+ } from '~/utils/tests';
10
+
11
+ import { onCommunityUserRoleRemoved } from '../onCommunityUserRoleRemoved';
12
+
13
+ const community = community11;
14
+ const userWithoutRoleRaw = { ...communityUser11, role: [''] };
15
+ const userWithoutRole = withUser(userWithoutRoleRaw);
16
+
17
+ const eventPayload: Amity.CommunityMembershipPayload = {
18
+ communities: [community],
19
+ communityUsers: [userWithoutRoleRaw],
20
+ files: [],
21
+ users: [user11],
22
+ categories: [],
23
+ feeds: [],
24
+ };
25
+
26
+ describe('onCommunityUserRoleAdded', () => {
27
+ beforeAll(connectClient);
28
+ afterAll(disconnectClient);
29
+
30
+ test('it should got event after role added to community user', () => {
31
+ const callback = jest.fn();
32
+ const unsub = onCommunityUserRoleRemoved(callback);
33
+ client.emitter.emit('community.roleRemoved', eventPayload);
34
+
35
+ unsub();
36
+
37
+ expect(callback).toHaveBeenCalled();
38
+ expect(callback).toHaveBeenCalledWith({ ...community, isJoined: true }, userWithoutRole);
39
+ });
40
+
41
+ test('it should got nothing if we did unsubscribe before event', () => {
42
+ const callback = jest.fn();
43
+ const unsub = onCommunityUserRoleRemoved(callback);
44
+
45
+ unsub();
46
+
47
+ client.emitter.emit('community.roleRemoved', eventPayload);
48
+ expect(callback).not.toHaveBeenCalled();
49
+ });
50
+ });
@@ -4,9 +4,8 @@ import { ingestInCache } from '~/cache/api/ingestInCache';
4
4
  import { createEventSubscriber } from '~/core/events';
5
5
  import { pullFromCache } from '~/cache/api';
6
6
  import { getResolver } from '~/core/model';
7
- import { prepareMembershipPayload } from '~/group/utils';
8
7
 
9
- import { unpackCommunityPayload } from '../utils';
8
+ import { prepareCommunityPayload } from '../utils';
10
9
 
11
10
  export const createCommunityEventSubscriber = (
12
11
  event: keyof Amity.MqttCommunityEvents,
@@ -15,7 +14,7 @@ export const createCommunityEventSubscriber = (
15
14
  const client = getActiveClient();
16
15
 
17
16
  const filter = (payload: Amity.CommunityPayload) => {
18
- const unpackedPayload = unpackCommunityPayload(payload);
17
+ const unpackedPayload = prepareCommunityPayload(payload);
19
18
 
20
19
  if (!client.cache) {
21
20
  // TODO: here we are missing specific properties here!
@@ -125,11 +124,8 @@ export const createCommunityMemberEventSubscriber = (
125
124
  const client = getActiveClient();
126
125
 
127
126
  const filter = (payload: Amity.CommunityMembershipPayload) => {
128
- const communityPayload = unpackCommunityPayload(payload);
129
- const { communities } = communityPayload;
130
-
131
- const preparedPayload = prepareMembershipPayload(communityPayload, 'communityUsers');
132
- const { communityUsers } = preparedPayload;
127
+ const preparedPayload = prepareCommunityPayload(payload);
128
+ const { communities, communityUsers } = preparedPayload;
133
129
 
134
130
  /*
135
131
  * community.isJoined is not part of the communityMembership payload, and needs
@@ -1,2 +1,6 @@
1
1
  export * from './observeCommunity';
2
+
2
3
  export * from './liveCommunities';
4
+ export * from './liveCommunity';
5
+
6
+ export * from './liveCommunityMembers';
@@ -0,0 +1,45 @@
1
+ import { liveObject } from '~/utils/liveObject';
2
+ import { getCommunity } from '../api';
3
+ import {
4
+ onCommunityUpdated,
5
+ onCommunityDeleted,
6
+ onCommunityJoined,
7
+ onCommunityLeft,
8
+ onCommunityUserBanned,
9
+ onCommunityUserUnbanned,
10
+ onCommunityUserChanged,
11
+ } from '../events';
12
+
13
+ /**
14
+ * ```js
15
+ * import { liveCommunity } from '@amityco/ts-sdk';
16
+ *
17
+ * let community;
18
+ *
19
+ * const unsubscribe = liveCommunity(communityId, response => {
20
+ * community = response.data;
21
+ * });
22
+ * ```
23
+ *
24
+ * Observe all mutation on a given {@link Amity.Community}
25
+ *
26
+ * @param communityId the ID of the message to observe
27
+ * @param callback the function to call when new data are available
28
+ * @returns An {@link Amity.Unsubscriber} function to run when willing to stop observing the community
29
+ *
30
+ * @category Community Live Object
31
+ */
32
+ export const liveCommunity = (
33
+ communityId: Amity.Community['communityId'],
34
+ callback: Amity.LiveObjectCallback<Amity.Community>,
35
+ ): Amity.Unsubscriber => {
36
+ return liveObject(communityId, callback, 'communityId', getCommunity, [
37
+ onCommunityUpdated,
38
+ onCommunityDeleted,
39
+ onCommunityJoined,
40
+ onCommunityLeft,
41
+ onCommunityUserBanned,
42
+ onCommunityUserUnbanned,
43
+ onCommunityUserChanged,
44
+ ]);
45
+ };
@@ -0,0 +1,187 @@
1
+ /* eslint-disable no-use-before-define */
2
+ import { getResolver } from '~/core/model';
3
+ import { pullFromCache, pushToCache } from '~/cache/api';
4
+ import { getActiveClient } from '~/client/api';
5
+ import {
6
+ createQuery,
7
+ queryOptions,
8
+ runQuery,
9
+ sortByFirstCreated,
10
+ sortByLastCreated,
11
+ } from '~/core/query';
12
+ import {
13
+ COLLECTION_DEFAULT_CACHING_POLICY,
14
+ COLLECTION_DEFAULT_PAGINATION_LIMIT,
15
+ ENABLE_CACHE_MESSAGE,
16
+ } from '~/utils/constants';
17
+ import {
18
+ onCommunityLeft,
19
+ onCommunityJoined,
20
+ onCommunityUserBanned,
21
+ onCommunityUserChanged,
22
+ onCommunityUserUnbanned,
23
+ onCommunityUserRoleAdded,
24
+ onCommunityUserRoleRemoved,
25
+ } from '../events';
26
+ import { queryCommunityMembers } from '../api';
27
+
28
+ /**
29
+ * ```js
30
+ * import { liveCommunityMembers } from '@amityco/ts-sdk'
31
+ *
32
+ * let communityMembers = []
33
+ * const unsub = liveCommunityMembers({
34
+ * communityId: Amity.Community['communityId'],
35
+ * }, response => merge(communityMembers, response.data))
36
+ * ```
37
+ *
38
+ * Observe all mutations on a list of {@link Amity.CommunityUser}s
39
+ *
40
+ * @param params for querying community users
41
+ * @param callback the function to call when new data are available
42
+ * @returns An {@link Amity.Unsubscriber} function to run when willing to stop observing the community users
43
+ *
44
+ * @category Community Live Collection
45
+ */
46
+ export const liveCommunityMembers = (
47
+ params: Amity.CommunityMemberLiveCollection,
48
+ callback: Amity.LiveCollectionCallback<Amity.Membership<'community'>>,
49
+ config?: Amity.LiveCollectionConfig,
50
+ ) => {
51
+ const { log, cache } = getActiveClient();
52
+
53
+ if (!cache) {
54
+ console.log(ENABLE_CACHE_MESSAGE);
55
+ }
56
+
57
+ const timestamp = Date.now();
58
+ log(`liveCommunityMembers(tmpid: ${timestamp}) > listen`);
59
+
60
+ const { limit: queryLimit, ...queryParams } = params;
61
+
62
+ const limit = queryLimit ?? COLLECTION_DEFAULT_PAGINATION_LIMIT;
63
+ const { policy = COLLECTION_DEFAULT_CACHING_POLICY } = config ?? {};
64
+
65
+ const disposers: Amity.Unsubscriber[] = [];
66
+ const cacheKey = ['communityUsers', 'collection', { communityId: params.communityId }];
67
+
68
+ const responder = (data: Amity.CommunityMemberLiveCollectionCache) => {
69
+ let communityMembers: Amity.Membership<'community'>[] =
70
+ data.data
71
+ .map(id => pullFromCache<Amity.Membership<'community'>>(['communityUsers', 'get', id])!)
72
+ .filter(Boolean)
73
+ .map(({ data }) => data) ?? [];
74
+
75
+ if (params.roles)
76
+ communityMembers = communityMembers.filter(c =>
77
+ c.roles?.some(t => params.roles?.includes(t)),
78
+ );
79
+
80
+ if (params.membership) {
81
+ communityMembers = communityMembers.filter(({ communityMembership }) =>
82
+ // @ts-ignore
83
+ params.membership.includes(communityMembership),
84
+ );
85
+ }
86
+
87
+ if (params.search) {
88
+ /*
89
+ * Search by userId | displayName
90
+ */
91
+ const containsMatcher = new RegExp(params.search);
92
+
93
+ communityMembers = communityMembers.filter(m => {
94
+ if (m.userId.match(containsMatcher)) return true;
95
+
96
+ return m.user && m.user.displayName?.match(containsMatcher);
97
+ });
98
+ }
99
+
100
+ const sortBy = params.sortBy ? params.sortBy : 'lastCreated';
101
+ communityMembers = communityMembers.sort(
102
+ sortBy === 'lastCreated' ? sortByLastCreated : sortByFirstCreated,
103
+ );
104
+
105
+ callback({
106
+ onNextPage: onFetch,
107
+ data: communityMembers,
108
+ hasNextPage: !!data.params?.page,
109
+ loading: data.loading,
110
+ error: data.error,
111
+ });
112
+ };
113
+
114
+ const realtimeRouter =
115
+ (_: Amity.CommunityMemberActionType) =>
116
+ (_: Amity.Community, communityMember: Amity.Membership<'community'>) => {
117
+ if (params.communityId !== communityMember.communityId) {
118
+ return;
119
+ }
120
+
121
+ const collection = pullFromCache<Amity.CommunityMemberLiveCollectionCache>(cacheKey)?.data;
122
+ if (!collection) return;
123
+
124
+ const communityMemberCacheId = getResolver('communityUsers')({
125
+ communityId: params.communityId,
126
+ userId: communityMember.userId,
127
+ });
128
+
129
+ collection.data = [...new Set([communityMemberCacheId, ...collection.data])];
130
+
131
+ pushToCache(cacheKey, collection);
132
+ responder(collection);
133
+ };
134
+
135
+ const onFetch = () => {
136
+ const collection = pullFromCache<Amity.CommunityMemberLiveCollectionCache>(cacheKey)?.data;
137
+
138
+ const communityMembers = collection?.data ?? [];
139
+
140
+ if (communityMembers.length > 0 && !collection?.params.page) return;
141
+
142
+ const query = createQuery(queryCommunityMembers, {
143
+ ...queryParams,
144
+ page: collection?.params.page ?? { limit },
145
+ });
146
+
147
+ runQuery(
148
+ query,
149
+ ({ data: result, error, loading, nextPage: page }) => {
150
+ const data = {
151
+ loading,
152
+ error,
153
+ params: { page },
154
+ data: communityMembers,
155
+ };
156
+
157
+ if (result) {
158
+ data.data = [
159
+ ...new Set([...communityMembers, ...result.map(getResolver('communityUsers'))]),
160
+ ];
161
+ }
162
+
163
+ pushToCache(cacheKey, data);
164
+
165
+ responder(data);
166
+ },
167
+ queryOptions(policy),
168
+ );
169
+ };
170
+
171
+ disposers.push(
172
+ onCommunityLeft(realtimeRouter('onLeft')),
173
+ onCommunityJoined(realtimeRouter('onJoin')),
174
+ onCommunityUserBanned(realtimeRouter('onBan')),
175
+ onCommunityUserUnbanned(realtimeRouter('onUnban')),
176
+ onCommunityUserChanged(realtimeRouter('onMemberCountChanged')),
177
+ onCommunityUserRoleAdded(realtimeRouter('onMemberCountChanged')),
178
+ onCommunityUserRoleRemoved(realtimeRouter('onMemberCountChanged')),
179
+ );
180
+
181
+ onFetch();
182
+
183
+ return () => {
184
+ log(`liveCommunityMembers(tmpid: ${timestamp}) > dispose`);
185
+ disposers.forEach(fn => fn());
186
+ };
187
+ };