@amityco/ts-sdk 6.2.0 → 6.2.1-0cf9bee.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 (236) hide show
  1. package/README.md +0 -4
  2. package/dist/@types/core/events.d.ts +1 -0
  3. package/dist/@types/core/events.d.ts.map +1 -1
  4. package/dist/@types/core/payload.d.ts +4 -0
  5. package/dist/@types/core/payload.d.ts.map +1 -1
  6. package/dist/@types/domains/channel.d.ts +5 -1
  7. package/dist/@types/domains/channel.d.ts.map +1 -1
  8. package/dist/@types/domains/marker.d.ts +2 -1
  9. package/dist/@types/domains/marker.d.ts.map +1 -1
  10. package/dist/channelRepsitory/api/createChannel.d.ts +1 -1
  11. package/dist/channelRepsitory/api/markAsRead.d.ts +1 -1
  12. package/dist/channelRepsitory/api/muteChannel.d.ts.map +1 -1
  13. package/dist/client/utils/markerSyncEngine.d.ts.map +1 -1
  14. package/dist/communityRepository/{communityModeration → communityMembership}/api/addMembers.d.ts.map +1 -1
  15. package/dist/communityRepository/communityMembership/api/index.d.ts +3 -0
  16. package/dist/communityRepository/communityMembership/api/index.d.ts.map +1 -0
  17. package/dist/communityRepository/{communityModeration → communityMembership}/api/removeMembers.d.ts.map +1 -1
  18. package/dist/communityRepository/communityMembership/api/tests/addMembers.test.d.ts.map +1 -0
  19. package/dist/communityRepository/communityMembership/api/tests/removeMembers.test.d.ts.map +1 -0
  20. package/dist/communityRepository/communityMembership/index.d.ts +1 -0
  21. package/dist/communityRepository/communityMembership/index.d.ts.map +1 -1
  22. package/dist/communityRepository/communityMembership/observers/getMembers.d.ts.map +1 -1
  23. package/dist/communityRepository/communityModeration/api/banMembers.d.ts +16 -0
  24. package/dist/communityRepository/communityModeration/api/banMembers.d.ts.map +1 -0
  25. package/dist/communityRepository/communityModeration/api/index.d.ts +2 -2
  26. package/dist/communityRepository/communityModeration/api/index.d.ts.map +1 -1
  27. package/dist/communityRepository/communityModeration/api/test/banMembers.test.d.ts +2 -0
  28. package/dist/communityRepository/communityModeration/api/test/banMembers.test.d.ts.map +1 -0
  29. package/dist/communityRepository/communityModeration/api/test/unbanMembers.test.d.ts +2 -0
  30. package/dist/communityRepository/communityModeration/api/test/unbanMembers.test.d.ts.map +1 -0
  31. package/dist/communityRepository/communityModeration/api/unbanMembers.d.ts +16 -0
  32. package/dist/communityRepository/communityModeration/api/unbanMembers.d.ts.map +1 -0
  33. package/dist/core/events.d.ts +3 -3
  34. package/dist/core/events.d.ts.map +1 -1
  35. package/dist/core/query/filtering.d.ts +1 -0
  36. package/dist/core/query/filtering.d.ts.map +1 -1
  37. package/dist/core/query/sorting.d.ts.map +1 -1
  38. package/dist/core/transports/mqtt.d.ts +1 -1
  39. package/dist/core/transports/mqtt.d.ts.map +1 -1
  40. package/dist/feedRepository/api/getCustomRankingGlobalFeed.d.ts +36 -0
  41. package/dist/feedRepository/api/getCustomRankingGlobalFeed.d.ts.map +1 -0
  42. package/dist/feedRepository/api/index.d.ts +1 -0
  43. package/dist/feedRepository/api/index.d.ts.map +1 -1
  44. package/dist/feedRepository/api/queryGlobalFeed.d.ts.map +1 -1
  45. package/dist/feedRepository/api/test/getCustomRankingGlobalFeed.test.d.ts +2 -0
  46. package/dist/feedRepository/api/test/getCustomRankingGlobalFeed.test.d.ts.map +1 -0
  47. package/dist/fileRepository/api/index.d.ts +3 -3
  48. package/dist/fileRepository/api/test/uploadFile.test.d.ts +2 -0
  49. package/dist/fileRepository/api/test/uploadFile.test.d.ts.map +1 -0
  50. package/dist/fileRepository/api/test/uploadImage.test.d.ts +2 -0
  51. package/dist/fileRepository/api/test/uploadImage.test.d.ts.map +1 -0
  52. package/dist/fileRepository/api/test/uploadVideo.test.d.ts +2 -0
  53. package/dist/fileRepository/api/test/uploadVideo.test.d.ts.map +1 -0
  54. package/dist/fileRepository/api/{createFile.d.ts → uploadFile.d.ts} +4 -4
  55. package/dist/fileRepository/api/uploadFile.d.ts.map +1 -0
  56. package/dist/fileRepository/api/{createImage.d.ts → uploadImage.d.ts} +4 -4
  57. package/dist/fileRepository/api/uploadImage.d.ts.map +1 -0
  58. package/dist/fileRepository/api/{createVideo.d.ts → uploadVideo.d.ts} +5 -5
  59. package/dist/fileRepository/api/uploadVideo.d.ts.map +1 -0
  60. package/dist/index.cjs.js +795 -193
  61. package/dist/index.esm.js +794 -194
  62. package/dist/index.umd.js +4 -4
  63. package/dist/marker/events/index.d.ts +1 -0
  64. package/dist/marker/events/index.d.ts.map +1 -1
  65. package/dist/marker/events/onFeedlMarkerUpdated.d.ts +17 -0
  66. package/dist/marker/events/onFeedlMarkerUpdated.d.ts.map +1 -0
  67. package/dist/messageRepository/api/createMessage.d.ts +1 -1
  68. package/dist/messageRepository/api/editMessage.d.ts +38 -0
  69. package/dist/messageRepository/api/editMessage.d.ts.map +1 -0
  70. package/dist/messageRepository/api/flagMessage.d.ts +14 -0
  71. package/dist/messageRepository/api/flagMessage.d.ts.map +1 -0
  72. package/dist/messageRepository/api/index.d.ts +5 -1
  73. package/dist/messageRepository/api/index.d.ts.map +1 -1
  74. package/dist/messageRepository/api/isMessageFlaggedByMe.d.ts +14 -0
  75. package/dist/messageRepository/api/isMessageFlaggedByMe.d.ts.map +1 -0
  76. package/dist/messageRepository/api/markAsDelivered.d.ts +2 -2
  77. package/dist/messageRepository/api/{deleteMessage.d.ts → softDeleteMessage.d.ts} +6 -6
  78. package/dist/messageRepository/api/softDeleteMessage.d.ts.map +1 -0
  79. package/dist/messageRepository/api/tests/editMessage.test.d.ts +2 -0
  80. package/dist/messageRepository/api/tests/editMessage.test.d.ts.map +1 -0
  81. package/dist/messageRepository/api/tests/flagMessage.test.d.ts +2 -0
  82. package/dist/messageRepository/api/tests/flagMessage.test.d.ts.map +1 -0
  83. package/dist/messageRepository/api/tests/unflagMessage.test.d.ts +2 -0
  84. package/dist/messageRepository/api/tests/unflagMessage.test.d.ts.map +1 -0
  85. package/dist/messageRepository/api/unflagMessage.d.ts +14 -0
  86. package/dist/messageRepository/api/unflagMessage.d.ts.map +1 -0
  87. package/dist/messageRepository/api/updateMessage.d.ts.map +1 -1
  88. package/dist/postRepository/api/deletePost.d.ts +1 -1
  89. package/dist/postRepository/api/deletePost.d.ts.map +1 -1
  90. package/dist/postRepository/api/editPost.d.ts +24 -0
  91. package/dist/postRepository/api/editPost.d.ts.map +1 -0
  92. package/dist/postRepository/api/flagPost.d.ts +14 -0
  93. package/dist/postRepository/api/flagPost.d.ts.map +1 -0
  94. package/dist/postRepository/api/hardDeletePost.d.ts +16 -0
  95. package/dist/postRepository/api/hardDeletePost.d.ts.map +1 -0
  96. package/dist/postRepository/api/index.d.ts +6 -0
  97. package/dist/postRepository/api/index.d.ts.map +1 -1
  98. package/dist/postRepository/api/isPostFlaggedByMe.d.ts +14 -0
  99. package/dist/postRepository/api/isPostFlaggedByMe.d.ts.map +1 -0
  100. package/dist/postRepository/api/softDeletePost.d.ts +16 -0
  101. package/dist/postRepository/api/softDeletePost.d.ts.map +1 -0
  102. package/dist/postRepository/api/unflagPost.d.ts +14 -0
  103. package/dist/postRepository/api/unflagPost.d.ts.map +1 -0
  104. package/dist/postRepository/api/updatePost.d.ts.map +1 -1
  105. package/dist/subChannelRepository/api/startReadingAPI.d.ts.map +1 -1
  106. package/dist/subChannelRepository/api/stopReadingAPI.d.ts.map +1 -1
  107. package/dist/userRepository/api/flagUser.d.ts +14 -0
  108. package/dist/userRepository/api/flagUser.d.ts.map +1 -0
  109. package/dist/userRepository/api/index.d.ts +3 -0
  110. package/dist/userRepository/api/index.d.ts.map +1 -1
  111. package/dist/userRepository/api/isUserFlaggedByMe.d.ts +14 -0
  112. package/dist/userRepository/api/isUserFlaggedByMe.d.ts.map +1 -0
  113. package/dist/userRepository/{relationship/block/api → api}/queryBlockedUsers.d.ts +2 -2
  114. package/dist/userRepository/api/queryBlockedUsers.d.ts.map +1 -0
  115. package/dist/userRepository/api/tests/flagUser.test.d.ts +2 -0
  116. package/dist/userRepository/api/tests/flagUser.test.d.ts.map +1 -0
  117. package/dist/userRepository/api/tests/queryBlockedUsers.test.d.ts.map +1 -0
  118. package/dist/userRepository/api/tests/unflagUser.test.d.ts +2 -0
  119. package/dist/userRepository/api/tests/unflagUser.test.d.ts.map +1 -0
  120. package/dist/userRepository/api/unflagUser.d.ts +14 -0
  121. package/dist/userRepository/api/unflagUser.d.ts.map +1 -0
  122. package/dist/userRepository/observers/getBlockedUsers.d.ts +2 -0
  123. package/dist/userRepository/observers/getBlockedUsers.d.ts.map +1 -0
  124. package/dist/userRepository/observers/index.d.ts +1 -0
  125. package/dist/userRepository/observers/index.d.ts.map +1 -1
  126. package/dist/userRepository/relationship/block/observers/getBlockedUsers.d.ts.map +1 -1
  127. package/package.json +1 -1
  128. package/src/@types/core/events.ts +1 -0
  129. package/src/@types/core/payload.ts +5 -0
  130. package/src/@types/domains/channel.ts +7 -2
  131. package/src/@types/domains/marker.ts +1 -0
  132. package/src/categoryRepository/observers/getCategories.ts +4 -4
  133. package/src/channelRepsitory/api/markAsRead.ts +1 -1
  134. package/src/channelRepsitory/api/muteChannel.ts +8 -0
  135. package/src/channelRepsitory/api/tests/muteChannel.test.ts +12 -0
  136. package/src/channelRepsitory/channelMembership/observers/getMembers.ts +6 -6
  137. package/src/channelRepsitory/observers/getChannels.ts +5 -5
  138. package/src/channelRepsitory/observers/tests/getChannels.test.ts +3 -9
  139. package/src/client/utils/markerSyncEngine.ts +2 -14
  140. package/src/commentRepository/observers/getComments.ts +5 -5
  141. package/src/communityRepository/communityMembership/api/index.ts +2 -0
  142. package/src/communityRepository/{communityModeration/api/test → communityMembership/api/tests}/addMembers.test.ts +1 -1
  143. package/src/communityRepository/{communityModeration/api/test → communityMembership/api/tests}/removeMembers.test.ts +1 -1
  144. package/src/communityRepository/communityMembership/index.ts +1 -0
  145. package/src/communityRepository/communityMembership/observers/getMembers.ts +6 -8
  146. package/src/communityRepository/communityModeration/api/banMembers.ts +50 -0
  147. package/src/communityRepository/communityModeration/api/index.ts +3 -2
  148. package/src/communityRepository/communityModeration/api/test/banMembers.test.ts +70 -0
  149. package/src/communityRepository/communityModeration/api/test/unbanMembers.test.ts +70 -0
  150. package/src/communityRepository/communityModeration/api/unbanMembers.ts +50 -0
  151. package/src/communityRepository/observers/getCommunities.ts +5 -5
  152. package/src/core/query/filtering.ts +22 -2
  153. package/src/core/query/sorting.ts +2 -4
  154. package/src/core/query/tests/filtering.test.ts +6 -0
  155. package/src/core/query/tests/runQuery.test.ts +3 -3
  156. package/src/core/transports/mqtt.ts +3 -2
  157. package/src/feedRepository/api/getCustomRankingGlobalFeed.ts +117 -0
  158. package/src/feedRepository/api/index.ts +1 -0
  159. package/src/feedRepository/api/queryGlobalFeed.ts +12 -4
  160. package/src/feedRepository/api/test/getCustomRankingGlobalFeed.test.ts +130 -0
  161. package/src/feedRepository/api/test/queryGlobalFeed.test.ts +1 -15
  162. package/src/fileRepository/api/index.ts +3 -3
  163. package/src/fileRepository/api/test/uploadFile.test.ts +69 -0
  164. package/src/fileRepository/api/test/{createImage.test.ts → uploadImage.test.ts} +7 -7
  165. package/src/fileRepository/api/test/{createVideo.test.ts → uploadVideo.test.ts} +8 -8
  166. package/src/fileRepository/api/{createFile.ts → uploadFile.ts} +4 -6
  167. package/src/fileRepository/api/{createImage.ts → uploadImage.ts} +4 -6
  168. package/src/fileRepository/api/{createVideo.ts → uploadVideo.ts} +5 -7
  169. package/src/marker/events/index.ts +1 -0
  170. package/src/marker/events/onFeedlMarkerUpdated.ts +34 -0
  171. package/src/messageRepository/api/editMessage.ts +100 -0
  172. package/src/messageRepository/api/flagMessage.ts +40 -0
  173. package/src/messageRepository/api/index.ts +7 -1
  174. package/src/messageRepository/api/isMessageFlaggedByMe.ts +30 -0
  175. package/src/messageRepository/api/markAsDelivered.ts +2 -2
  176. package/src/messageRepository/api/{deleteMessage.ts → softDeleteMessage.ts} +8 -8
  177. package/src/messageRepository/api/tests/deleteMessage.test.ts +11 -11
  178. package/src/messageRepository/api/tests/{updateMessage.test.ts → editMessage.test.ts} +10 -10
  179. package/src/messageRepository/api/tests/flagMessage.test.ts +87 -0
  180. package/src/messageRepository/api/tests/unflagMessage.test.ts +87 -0
  181. package/src/messageRepository/api/unflagMessage.ts +40 -0
  182. package/src/messageRepository/api/updateMessage.ts +4 -0
  183. package/src/messageRepository/events/onMessageDeleted.ts +1 -1
  184. package/src/messageRepository/observers/getMessages.ts +5 -5
  185. package/src/postRepository/api/deletePost.ts +1 -7
  186. package/src/postRepository/api/editPost.ts +58 -0
  187. package/src/postRepository/api/flagPost.ts +38 -0
  188. package/src/postRepository/api/hardDeletePost.ts +30 -0
  189. package/src/postRepository/api/index.ts +8 -0
  190. package/src/postRepository/api/isPostFlaggedByMe.ts +33 -0
  191. package/src/postRepository/api/softDeletePost.ts +30 -0
  192. package/src/postRepository/api/unflagPost.ts +39 -0
  193. package/src/postRepository/api/updatePost.ts +4 -0
  194. package/src/postRepository/observers/getPosts.ts +5 -5
  195. package/src/reactionRepository/observers/getReactions.ts +4 -4
  196. package/src/report/api/createReport.ts +1 -1
  197. package/src/report/api/tests/createReport.test.ts +2 -62
  198. package/src/report/api/tests/deleteReport.test.ts +2 -62
  199. package/src/subChannelRepository/api/startReadingAPI.ts +13 -0
  200. package/src/subChannelRepository/api/stopReadingAPI.ts +13 -0
  201. package/src/userRepository/api/flagUser.ts +37 -0
  202. package/src/userRepository/api/index.ts +4 -0
  203. package/src/userRepository/api/isUserFlaggedByMe.ts +33 -0
  204. package/src/userRepository/{relationship/block/api → api}/queryBlockedUsers.ts +3 -2
  205. package/src/userRepository/api/tests/flagUser.test.ts +81 -0
  206. package/src/userRepository/{relationship/block/api → api}/tests/queryBlockedUsers.test.ts +1 -1
  207. package/src/userRepository/api/tests/unflagUser.test.ts +80 -0
  208. package/src/userRepository/api/unflagUser.ts +37 -0
  209. package/src/userRepository/observers/getBlockedUsers.ts +104 -0
  210. package/src/userRepository/observers/getUsers.ts +4 -4
  211. package/src/userRepository/observers/index.ts +1 -0
  212. package/src/userRepository/observers/tests/getUsers.test.ts +3 -9
  213. package/src/userRepository/relationship/block/observers/getBlockedUsers.ts +5 -96
  214. package/src/userRepository/relationship/follow/observers/getFollowers.ts +4 -4
  215. package/src/userRepository/relationship/follow/observers/getFollowings.ts +4 -4
  216. package/dist/communityRepository/communityModeration/api/test/addMembers.test.d.ts.map +0 -1
  217. package/dist/communityRepository/communityModeration/api/test/removeMembers.test.d.ts.map +0 -1
  218. package/dist/fileRepository/api/createFile.d.ts.map +0 -1
  219. package/dist/fileRepository/api/createImage.d.ts.map +0 -1
  220. package/dist/fileRepository/api/createVideo.d.ts.map +0 -1
  221. package/dist/fileRepository/api/test/createImage.test.d.ts +0 -2
  222. package/dist/fileRepository/api/test/createImage.test.d.ts.map +0 -1
  223. package/dist/fileRepository/api/test/createVideo.test.d.ts +0 -2
  224. package/dist/fileRepository/api/test/createVideo.test.d.ts.map +0 -1
  225. package/dist/messageRepository/api/deleteMessage.d.ts.map +0 -1
  226. package/dist/messageRepository/api/tests/updateMessage.test.d.ts +0 -2
  227. package/dist/messageRepository/api/tests/updateMessage.test.d.ts.map +0 -1
  228. package/dist/userRepository/relationship/block/api/queryBlockedUsers.d.ts.map +0 -1
  229. package/dist/userRepository/relationship/block/api/tests/queryBlockedUsers.test.d.ts.map +0 -1
  230. /package/dist/communityRepository/{communityModeration → communityMembership}/api/addMembers.d.ts +0 -0
  231. /package/dist/communityRepository/{communityModeration → communityMembership}/api/removeMembers.d.ts +0 -0
  232. /package/dist/communityRepository/{communityModeration/api/test → communityMembership/api/tests}/addMembers.test.d.ts +0 -0
  233. /package/dist/communityRepository/{communityModeration/api/test → communityMembership/api/tests}/removeMembers.test.d.ts +0 -0
  234. /package/dist/userRepository/{relationship/block/api → api}/tests/queryBlockedUsers.test.d.ts +0 -0
  235. /package/src/communityRepository/{communityModeration → communityMembership}/api/addMembers.ts +0 -0
  236. /package/src/communityRepository/{communityModeration → communityMembership}/api/removeMembers.ts +0 -0
@@ -45,7 +45,7 @@ declare global {
45
45
  autoDeleteMessageByFlagLimit?: number;
46
46
 
47
47
  memberCount?: number;
48
- messageCount: number; // TODO remove from public interface
48
+ messageCount: number;
49
49
  moderatorMemberCount?: number;
50
50
 
51
51
  lastActivity: Amity.timestamp;
@@ -55,10 +55,15 @@ declare global {
55
55
  Amity.SoftDelete &
56
56
  Amity.Subscribable;
57
57
 
58
- type Channel<T extends ChannelType = any> = RawChannel<T> & {
58
+ type Channel<T extends ChannelType = any> = Omit<RawChannel<T>, 'messageCount'> & {
59
59
  defaultSubChannelId: string;
60
60
  isUnreadCountSupport: boolean;
61
61
  unreadCount: number;
62
+
63
+ /**
64
+ * @deprecated Please use the default sub channel `messageCount` instead.
65
+ */
66
+ messageCount: RawChannel['messageCount'];
62
67
  };
63
68
 
64
69
  type QueryChannels = {
@@ -10,6 +10,7 @@ declare global {
10
10
  SUB_CHANNEL_CREATED = 'subchannel is created',
11
11
  SUBCHANNEL_IS_DELETED = 'subchannel is deleted',
12
12
  FORCE_SYNC = 'force sync',
13
+ MARKER_UPDATED = 'feed marker updated',
13
14
  }
14
15
  }
15
16
  }
@@ -99,16 +99,16 @@ export const getCategories = (
99
99
  *};
100
100
  */
101
101
 
102
- const onFetch = () => {
102
+ const onFetch = (initial = false) => {
103
103
  const collection = pullFromCache<Amity.CategoryLiveCollectionCache>(cacheKey)?.data;
104
104
 
105
105
  const categories = collection?.data ?? [];
106
106
 
107
- if (categories.length > 0 && !collection?.params.page) return;
107
+ if (!initial && categories.length > 0 && !collection?.params.page) return;
108
108
 
109
109
  const query = createQuery(queryCategories, {
110
110
  ...queryParams,
111
- page: collection?.params.page ?? { limit },
111
+ page: (!initial ? collection?.params.page : undefined) ?? { limit },
112
112
  });
113
113
 
114
114
  runQuery(
@@ -137,7 +137,7 @@ export const getCategories = (
137
137
  // @TODO -> update once observers added
138
138
  });
139
139
 
140
- onFetch();
140
+ onFetch(true);
141
141
 
142
142
  return () => {
143
143
  log(`getCategories(tmpid: ${timestamp}) > dispose`);
@@ -3,7 +3,7 @@ import { ingestInCache } from '~/cache/api/ingestInCache';
3
3
 
4
4
  /**
5
5
  * ```js
6
- * import { markAsRead } from '@amityco/ts-sdk'
6
+ * import { ChannelRepository } from '@amityco/ts-sdk'
7
7
  * const success = await ChannelRepository.markAsRead('channelId')
8
8
  * ```
9
9
  *
@@ -1,4 +1,5 @@
1
1
  import { getActiveClient } from '~/client/api';
2
+ import { ASCError } from '~/core/errors';
2
3
 
3
4
  /* begin_public_function
4
5
  id: channel.mute
@@ -26,6 +27,13 @@ export const muteChannel = async (
26
27
  const client = getActiveClient();
27
28
  client.log('channel/muteChannel', channelId);
28
29
 
30
+ if (mutePeriod !== MUTE_FOREVER && mutePeriod < 0)
31
+ throw new ASCError(
32
+ `Mute Period can only be positive numbers or ${MUTE_FOREVER}(mute forever)`,
33
+ Amity.ClientError.INVALID_PARAMETERS,
34
+ Amity.ErrorLevel.ERROR,
35
+ );
36
+
29
37
  const { data } = await client.http.put<{ success: boolean }>(
30
38
  `/api/v2/channel/${encodeURIComponent(channelId)}/mute`,
31
39
  { mutePeriod },
@@ -26,4 +26,16 @@ describe('muteChannel', () => {
26
26
 
27
27
  await expect(muteChannel('channel-id', 100)).rejects.toBe(err);
28
28
  });
29
+
30
+ test('it should throw error if mute period less than 0 and not -1', async () => {
31
+ const err = new ASCError(
32
+ 'Mute Period can only be positive numbers or -1(mute forever)',
33
+ Amity.ClientError.INVALID_PARAMETERS,
34
+ Amity.ErrorLevel.ERROR,
35
+ );
36
+
37
+ client.http.put = jest.fn().mockRejectedValue(err);
38
+
39
+ await expect(muteChannel('channel-id', 100)).rejects.toBe(err);
40
+ });
29
41
  });
@@ -4,7 +4,7 @@ import { pullFromCache, pushToCache } from '~/cache/api';
4
4
  import { getActiveClient } from '~/client/api';
5
5
  import {
6
6
  createQuery,
7
- filterByPropEquality,
7
+ filterByPropIntersection,
8
8
  filterBySearchTerm,
9
9
  queryOptions,
10
10
  runQuery,
@@ -76,7 +76,7 @@ export const getMembers = (
76
76
  .filter(Boolean)
77
77
  .map(({ data }) => data) ?? [];
78
78
 
79
- channelMembers = filterByPropEquality(channelMembers, 'roles', params.roles);
79
+ channelMembers = filterByPropIntersection(channelMembers, 'roles', params.roles);
80
80
 
81
81
  if (params.memberships) {
82
82
  /*
@@ -140,16 +140,16 @@ export const getMembers = (
140
140
  responder(collection);
141
141
  };
142
142
 
143
- const onFetch = () => {
143
+ const onFetch = (initial = false) => {
144
144
  const collection = pullFromCache<Amity.ChannelMembersLiveCollectionCache>(cacheKey)?.data;
145
145
 
146
146
  const channelMembers = collection?.data ?? [];
147
147
 
148
- if (channelMembers.length > 0 && !collection?.params.page) return;
148
+ if (!initial && channelMembers.length > 0 && !collection?.params.page) return;
149
149
 
150
150
  const query = createQuery(queryChannelMembers, {
151
151
  ...queryParams,
152
- page: collection?.params.page ?? { limit },
152
+ page: (!initial ? collection?.params.page : undefined) ?? { limit },
153
153
  });
154
154
 
155
155
  runQuery(
@@ -183,7 +183,7 @@ export const getMembers = (
183
183
  onChannelMemberUnbanned(realtimeRouter('onChannelMemberUnbanned')),
184
184
  );
185
185
 
186
- onFetch();
186
+ onFetch(true);
187
187
 
188
188
  return () => {
189
189
  log(`getMembers(tmpid: ${timestamp}) > dispose`);
@@ -149,16 +149,16 @@ export const getChannels = (
149
149
  responder(collection);
150
150
  };
151
151
 
152
- const onFetch = () => {
152
+ const onFetch = (initial = false) => {
153
153
  const collection = pullFromCache<Amity.ChannelLiveCollectionCache>(cacheKey)?.data;
154
154
 
155
155
  const channels = collection?.data ?? [];
156
156
 
157
- if (channels.length > 0 && !collection?.params.page) return;
157
+ if (!initial && channels.length > 0 && !collection?.params.page) return;
158
158
 
159
159
  const query = createQuery(queryChannels, {
160
160
  ...queryParams,
161
- page: collection?.params.page ?? { limit },
161
+ page: (!initial ? collection?.params.page : undefined) ?? { limit },
162
162
  });
163
163
 
164
164
  runQuery(
@@ -195,12 +195,12 @@ export const getChannels = (
195
195
  onMessageCreated(() => null), // watch unread count
196
196
  );
197
197
 
198
- onFetch();
198
+ onFetch(true);
199
+ dropFromCache(cacheKey);
199
200
 
200
201
  return () => {
201
202
  log(`getChannels(tmpid: ${timestamp}) > dispose`);
202
203
  disposers.forEach(fn => fn());
203
- dropFromCache(cacheKey);
204
204
  };
205
205
  };
206
206
  /* end_public_function */
@@ -79,17 +79,11 @@ describe('getChannels', () => {
79
79
  getChannels({}, callback);
80
80
  await pause();
81
81
 
82
- expect(callback).toHaveBeenCalledTimes(2);
82
+ // The second `getChannels` call fetches data from the cache,
83
+ // so there is no loading state and the callback only fires once.
84
+ expect(callback).toHaveBeenCalledTimes(1);
83
85
  expect(callback).toHaveBeenNthCalledWith(
84
86
  1,
85
- expect.objectContaining(
86
- getSnapshot({
87
- data: convertRawChannelPayload(channelQueryResponse.data).channels,
88
- }),
89
- ),
90
- );
91
- expect(callback).toHaveBeenNthCalledWith(
92
- 2,
93
87
  expect.objectContaining(
94
88
  getSnapshot({
95
89
  data: convertRawChannelPayload(channelQueryResponse.data).channels,
@@ -1,10 +1,10 @@
1
+ import { onFeedMarkerUpdated } from '~/marker/events';
1
2
  import { onMessageCreated } from '~/messageRepository/events';
2
3
  import { onSubChannelCreated, onSubChannelDeleted } from '~/subChannelRepository/events';
3
4
  import { isUnreadCountSupport } from '~/subChannelRepository/utils';
4
5
 
5
6
  import { markerSync } from '../api';
6
7
 
7
- const FORCE_SYNC_INTERVAL_TIME = 8000;
8
8
  const SYNC_TRIGGER_INTERVAL_TIME = 2000;
9
9
 
10
10
  let clearSyncTrigger: Amity.Unsubscriber | undefined;
@@ -108,19 +108,7 @@ const registerEventListeners = () => {
108
108
 
109
109
  onSubChannelCreated(() => events.push(Amity.MarkerSyncEvent.SUB_CHANNEL_CREATED)),
110
110
  onSubChannelDeleted(() => events.push(Amity.MarkerSyncEvent.SUBCHANNEL_IS_DELETED)),
111
-
112
- // In real-world use, we've encountered some cases where BE returns empty result
113
- // even if a marker changes in the database, causing the SDK to mistakenly believe that
114
- // no changes have been made in the database and end the sync prematurely.
115
- // Did miss update the unread count
116
- //
117
- // We found that some time BE loads were too high, causing the calculation
118
- // marker not to finish within the sync time, so it returned an empty value.
119
- //
120
- // Therefore, solve this problem by creating a second interval loop that
121
- // runs every 8 seconds regardless of whether an event occurs or not so that
122
- // the unread count is always updated in case of an error like the above.
123
- setIntervalTask(() => events.push(Amity.MarkerSyncEvent.FORCE_SYNC), FORCE_SYNC_INTERVAL_TIME),
111
+ onFeedMarkerUpdated(() => events.push(Amity.MarkerSyncEvent.MARKER_UPDATED)),
124
112
  );
125
113
  };
126
114
 
@@ -123,16 +123,16 @@ export const getComments = (
123
123
  responder(collection);
124
124
  };
125
125
 
126
- const onFetch = () => {
126
+ const onFetch = (initial = false) => {
127
127
  const collection = pullFromCache<Amity.CommentLiveCollectionCache>(cacheKey)?.data;
128
128
 
129
129
  const comments = collection?.data ?? [];
130
130
 
131
- if (comments.length > 0 && !collection?.params?.page) return;
131
+ if (!initial && comments.length > 0 && !collection?.params?.page) return;
132
132
 
133
133
  const query = createQuery(queryComments, {
134
134
  ...queryParams,
135
- page: collection?.params?.page ?? { limit },
135
+ page: (!initial ? collection?.params.page : undefined) ?? { limit },
136
136
  });
137
137
 
138
138
  runQuery(
@@ -170,12 +170,12 @@ export const getComments = (
170
170
  onCommentReactionRemoved(realtimeRouter('onReactionRemoved')),
171
171
  );
172
172
 
173
- onFetch();
173
+ onFetch(true);
174
+ disposers.push(() => dropFromCache(cacheKey));
174
175
 
175
176
  return () => {
176
177
  log(`getComments(tmpid: ${timestamp}) > dispose`);
177
178
  disposers.forEach(fn => fn());
178
- dropFromCache(cacheKey);
179
179
  };
180
180
  };
181
181
  /* end_public_function */
@@ -0,0 +1,2 @@
1
+ export * from './addMembers';
2
+ export * from './removeMembers';
@@ -10,7 +10,7 @@ import {
10
10
  user11,
11
11
  } from '~/utils/tests';
12
12
 
13
- import { onCommunityUserAdded } from '../../../communityMembership/events';
13
+ import { onCommunityUserAdded } from '../../events';
14
14
  import { addMembers } from '../addMembers';
15
15
 
16
16
  const communityToAddUserTo = community11;
@@ -10,7 +10,7 @@ import {
10
10
  disconnectClient,
11
11
  } from '~/utils/tests';
12
12
 
13
- import { onCommunityUserRemoved } from '../../../communityMembership/events';
13
+ import { onCommunityUserRemoved } from '../../events';
14
14
  import { removeMembers } from '../removeMembers';
15
15
 
16
16
  const communityToRemoveUser = community11;
@@ -1,2 +1,3 @@
1
+ export * from './api';
1
2
  export * from './observers';
2
3
  export * from './events';
@@ -9,6 +9,7 @@ import {
9
9
  sortByFirstCreated,
10
10
  sortByLastCreated,
11
11
  filterBySearchTerm,
12
+ filterByPropIntersection,
12
13
  } from '~/core/query';
13
14
  import {
14
15
  COLLECTION_DEFAULT_CACHING_POLICY,
@@ -76,10 +77,7 @@ export const getMembers = (
76
77
  .filter(Boolean)
77
78
  .map(({ data }) => data) ?? [];
78
79
 
79
- if (params.roles)
80
- communityMembers = communityMembers.filter(c =>
81
- c.roles?.some(t => params.roles?.includes(t)),
82
- );
80
+ communityMembers = filterByPropIntersection(communityMembers, 'roles', params.roles);
83
81
 
84
82
  if (params.membership) {
85
83
  communityMembers = communityMembers.filter(({ communityMembership }) =>
@@ -127,16 +125,16 @@ export const getMembers = (
127
125
  responder(collection);
128
126
  };
129
127
 
130
- const onFetch = () => {
128
+ const onFetch = (initial = false) => {
131
129
  const collection = pullFromCache<Amity.CommunityMemberLiveCollectionCache>(cacheKey)?.data;
132
130
 
133
131
  const communityMembers = collection?.data ?? [];
134
132
 
135
- if (communityMembers.length > 0 && !collection?.params.page) return;
133
+ if (!initial && communityMembers.length > 0 && !collection?.params.page) return;
136
134
 
137
135
  const query = createQuery(queryCommunityMembers, {
138
136
  ...queryParams,
139
- page: collection?.params.page ?? { limit },
137
+ page: (!initial ? collection?.params.page : undefined) ?? { limit },
140
138
  });
141
139
 
142
140
  runQuery(
@@ -173,7 +171,7 @@ export const getMembers = (
173
171
  onCommunityUserRoleRemoved(realtimeRouter('onMemberCountChanged')),
174
172
  );
175
173
 
176
- onFetch();
174
+ onFetch(true);
177
175
 
178
176
  return () => {
179
177
  log(`getMembers(tmpid: ${timestamp}) > dispose`);
@@ -0,0 +1,50 @@
1
+ import { getActiveClient } from '~/client/api/activeClient';
2
+
3
+ import { ingestInCache } from '~/cache/api/ingestInCache';
4
+
5
+ import { prepareMembershipPayload } from '~/group/utils';
6
+
7
+ /* begin_public_function
8
+ id: community.moderation.ban_members
9
+ */
10
+ /**
11
+ * ```js
12
+ * import { CommunityRepository } from '@amityco/ts-sdk'
13
+ *
14
+ * await CommunityRepository.Moderation.banMembers('communityId', ['userId1', 'userId2'])
15
+ * ```
16
+ *
17
+ * @param communityId of {@link Amity.Community} from which the users should be banned
18
+ * @param userIds of the {@link Amity.User}'s to be banned
19
+ * @returns the updated {@link Amity.Membership}'s object
20
+ *
21
+ * @category Community API
22
+ * @async
23
+ * */
24
+ export const banMembers = async (
25
+ communityId: Amity.Community['communityId'],
26
+ userIds: Amity.User['userId'][],
27
+ ): Promise<Amity.Cached<Amity.Membership<'community'>[]>> => {
28
+ const client = getActiveClient();
29
+ client.log('community/banMembers', { userIds, communityId });
30
+
31
+ const { data: payload } = await client.http.put<Amity.CommunityMembershipPayload>(
32
+ `/api/v3/communities/${communityId}/users/ban`,
33
+ {
34
+ userIds,
35
+ },
36
+ );
37
+
38
+ const data = prepareMembershipPayload(payload, 'communityUsers');
39
+
40
+ const cachedAt = client.cache && Date.now();
41
+ if (client.cache) ingestInCache(data, { cachedAt });
42
+
43
+ const { communityUsers } = data;
44
+
45
+ return {
46
+ data: communityUsers.filter(u => userIds.includes(u.userId)),
47
+ cachedAt,
48
+ };
49
+ };
50
+ /* end_public_function */
@@ -1,4 +1,5 @@
1
- export * from './addMembers';
2
- export * from './removeMembers';
3
1
  export * from './addRoles';
4
2
  export * from './removeRoles';
3
+
4
+ export * from './banMembers';
5
+ export * from './unbanMembers';
@@ -0,0 +1,70 @@
1
+ import { disableCache, enableCache, pullFromCache } from '~/cache/api';
2
+ import { prepareMembershipPayload } from '~/group/utils';
3
+ import { getResolver } from '~/core/model';
4
+ import { ASCError } from '~/core/errors';
5
+
6
+ import { client, community11, communityUser11, user11 } from '~/utils/tests';
7
+
8
+ import { banMembers } from '../banMembers';
9
+
10
+ const userCommunity = community11;
11
+ const user = {
12
+ ...communityUser11,
13
+ communityMebership: 'banned',
14
+ };
15
+ const resolvedCommunityValue = {
16
+ data: {
17
+ communities: [userCommunity],
18
+ communityUsers: [user],
19
+ files: [],
20
+ users: [user11],
21
+ categories: [],
22
+ feeds: [],
23
+ },
24
+ };
25
+
26
+ describe('community/ moderation/ banMembers', () => {
27
+ beforeEach(enableCache);
28
+ afterEach(disableCache);
29
+
30
+ const { communityId } = communityUser11;
31
+ const { userId } = communityUser11;
32
+
33
+ const preparedPayload = prepareMembershipPayload(resolvedCommunityValue.data, 'communityUsers');
34
+ const { communityUsers: expectedUser } = preparedPayload;
35
+
36
+ // integration_test_id: d344e314-4a49-4947-b4d5-8fa2d55f8ecd
37
+ test('it should return banned members', async () => {
38
+ client.http.put = jest.fn().mockResolvedValue(resolvedCommunityValue);
39
+
40
+ const { data: recieved } = await banMembers(communityId, [userId]);
41
+
42
+ expect(recieved).toStrictEqual(expectedUser);
43
+ });
44
+
45
+ test('it should update cache', async () => {
46
+ client.http.put = jest.fn().mockResolvedValue(resolvedCommunityValue);
47
+
48
+ await banMembers(communityId, [userId]);
49
+ const recieved = pullFromCache([
50
+ 'communityUsers',
51
+ 'get',
52
+ getResolver('communityUsers')({ communityId, userId }),
53
+ ])?.data;
54
+
55
+ expect([recieved]).toStrictEqual(expectedUser);
56
+ });
57
+
58
+ // integration_test_id: 59b58ec8-8380-49b2-aa39-6da361692c2e
59
+ test('it should throw valid error', async () => {
60
+ const err = new ASCError(
61
+ 'Permission Denied',
62
+ Amity.ServerError.UNAUTHORIZED,
63
+ Amity.ErrorLevel.ERROR,
64
+ );
65
+
66
+ client.http.put = jest.fn().mockRejectedValue(err);
67
+
68
+ await expect(banMembers(communityId, [userId])).rejects.toThrow(err);
69
+ });
70
+ });
@@ -0,0 +1,70 @@
1
+ import { disableCache, enableCache, pullFromCache } from '~/cache/api';
2
+ import { prepareMembershipPayload } from '~/group/utils';
3
+ import { getResolver } from '~/core/model';
4
+ import { ASCError } from '~/core/errors';
5
+
6
+ import { client, community11, communityUser11, user11 } from '~/utils/tests';
7
+
8
+ import { unbanMembers } from '../unbanMembers';
9
+
10
+ const userCommunity = community11;
11
+ const user = {
12
+ ...communityUser11,
13
+ communityMebership: 'none',
14
+ };
15
+ const resolvedCommunityValue = {
16
+ data: {
17
+ communities: [userCommunity],
18
+ communityUsers: [user],
19
+ files: [],
20
+ users: [user11],
21
+ categories: [],
22
+ feeds: [],
23
+ },
24
+ };
25
+
26
+ describe('community/ moderation/ unbanMembers', () => {
27
+ beforeEach(enableCache);
28
+ afterEach(disableCache);
29
+
30
+ const { communityId } = communityUser11;
31
+ const { userId } = communityUser11;
32
+
33
+ const preparedPayload = prepareMembershipPayload(resolvedCommunityValue.data, 'communityUsers');
34
+ const { communityUsers: expectedUser } = preparedPayload;
35
+
36
+ // integration_test_id: bee19fd4-63f4-403f-9771-6424d94cf144
37
+ test('it should return banned members', async () => {
38
+ client.http.put = jest.fn().mockResolvedValue(resolvedCommunityValue);
39
+
40
+ const { data: recieved } = await unbanMembers(communityId, [userId]);
41
+
42
+ expect(recieved).toStrictEqual(expectedUser);
43
+ });
44
+
45
+ test('it should update cache', async () => {
46
+ client.http.put = jest.fn().mockResolvedValue(resolvedCommunityValue);
47
+
48
+ await unbanMembers(communityId, [userId]);
49
+ const recieved = pullFromCache([
50
+ 'communityUsers',
51
+ 'get',
52
+ getResolver('communityUsers')({ communityId, userId }),
53
+ ])?.data;
54
+
55
+ expect([recieved]).toStrictEqual(expectedUser);
56
+ });
57
+
58
+ // integration_test_id: 22ce5ced-641a-48e2-9a89-d3f51119d8ac
59
+ test('it should throw valid error', async () => {
60
+ const err = new ASCError(
61
+ 'Permission Denied',
62
+ Amity.ServerError.UNAUTHORIZED,
63
+ Amity.ErrorLevel.ERROR,
64
+ );
65
+
66
+ client.http.put = jest.fn().mockRejectedValue(err);
67
+
68
+ await expect(unbanMembers(communityId, [userId])).rejects.toThrow(err);
69
+ });
70
+ });
@@ -0,0 +1,50 @@
1
+ import { getActiveClient } from '~/client/api/activeClient';
2
+
3
+ import { ingestInCache } from '~/cache/api/ingestInCache';
4
+
5
+ import { prepareMembershipPayload } from '~/group/utils';
6
+
7
+ /* begin_public_function
8
+ id: community.moderation.unban_members
9
+ */
10
+ /**
11
+ * ```js
12
+ * import { CommunityRepository } from '@amityco/ts-sdk'
13
+ *
14
+ * await CommunityRepository.Moderation.unbanMembers('communityId', ['userId1', 'userId2'])
15
+ * ```
16
+ *
17
+ * @param communityId of {@link Amity.Community} from which the users should be unbanned
18
+ * @param userIds of the {@link Amity.User}'s to be unbanned
19
+ * @returns the updated {@link Amity.Membership}'s object
20
+ *
21
+ * @category Community API
22
+ * @async
23
+ * */
24
+ export const unbanMembers = async (
25
+ communityId: Amity.Community['communityId'],
26
+ userIds: Amity.User['userId'][],
27
+ ): Promise<Amity.Cached<Amity.Membership<'community'>[]>> => {
28
+ const client = getActiveClient();
29
+ client.log('community/unbanMembers', { userIds, communityId });
30
+
31
+ const { data: payload } = await client.http.put<Amity.CommunityMembershipPayload>(
32
+ `/api/v3/communities/${communityId}/users/unban`,
33
+ {
34
+ userIds,
35
+ },
36
+ );
37
+
38
+ const data = prepareMembershipPayload(payload, 'communityUsers');
39
+
40
+ const cachedAt = client.cache && Date.now();
41
+ if (client.cache) ingestInCache(data, { cachedAt });
42
+
43
+ const { communityUsers } = data;
44
+
45
+ return {
46
+ data: communityUsers.filter(u => userIds.includes(u.userId)),
47
+ cachedAt,
48
+ };
49
+ };
50
+ /* end_public_function */
@@ -138,16 +138,16 @@ export const getCommunities = (
138
138
  responder(collection);
139
139
  };
140
140
 
141
- const onFetch = () => {
141
+ const onFetch = (initial = false) => {
142
142
  const collection = pullFromCache<Amity.CommunityLiveCollectionCache>(cacheKey)?.data;
143
143
 
144
144
  const communities = collection?.data ?? [];
145
145
 
146
- if (communities.length > 0 && !collection?.params.page) return;
146
+ if (!initial && communities.length > 0 && !collection?.params.page) return;
147
147
 
148
148
  const query = createQuery(queryCommunities, {
149
149
  ...queryParams,
150
- page: collection?.params.page ?? { limit },
150
+ page: (!initial ? collection?.params.page : undefined) ?? { limit },
151
151
  });
152
152
 
153
153
  runQuery(
@@ -181,12 +181,12 @@ export const getCommunities = (
181
181
  onCommunityUserChanged(realtimeRouter('onMemberCountChanged')),
182
182
  );
183
183
 
184
- onFetch();
184
+ onFetch(true);
185
+ disposers.push(() => dropFromCache(cacheKey));
185
186
 
186
187
  return () => {
187
188
  log(`getCommunities(tmpid: ${timestamp}) > dispose`);
188
189
  disposers.forEach(fn => fn());
189
- dropFromCache(cacheKey);
190
190
  };
191
191
  };
192
192
  /* end_public_function */