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

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 (282) hide show
  1. package/README.md +3 -1
  2. package/dist/@types/core/model.d.ts +3 -1
  3. package/dist/@types/core/model.d.ts.map +1 -1
  4. package/dist/@types/domains/category.d.ts +1 -1
  5. package/dist/@types/domains/category.d.ts.map +1 -1
  6. package/dist/@types/domains/comment.d.ts +1 -1
  7. package/dist/@types/domains/comment.d.ts.map +1 -1
  8. package/dist/@types/domains/community.d.ts +1 -1
  9. package/dist/@types/domains/community.d.ts.map +1 -1
  10. package/dist/@types/domains/message.d.ts +1 -1
  11. package/dist/@types/domains/message.d.ts.map +1 -1
  12. package/dist/@types/domains/post.d.ts +1 -1
  13. package/dist/@types/domains/post.d.ts.map +1 -1
  14. package/dist/@types/domains/subChannel.d.ts +1 -1
  15. package/dist/@types/domains/subChannel.d.ts.map +1 -1
  16. package/dist/category/api/queryCategories.d.ts.map +1 -1
  17. package/dist/category/observers/liveCategories.d.ts.map +1 -1
  18. package/dist/channel/api/addChannelMembers.d.ts.map +1 -1
  19. package/dist/channel/api/addChannelMembersRole.d.ts.map +1 -1
  20. package/dist/channel/api/banChannelMembers.d.ts.map +1 -1
  21. package/dist/channel/api/createChannel.d.ts.map +1 -1
  22. package/dist/channel/api/getChannel.d.ts.map +1 -1
  23. package/dist/channel/api/joinChannel.d.ts.map +1 -1
  24. package/dist/channel/api/leaveChannel.d.ts.map +1 -1
  25. package/dist/channel/api/queryChannelMembers.d.ts.map +1 -1
  26. package/dist/channel/api/queryChannels.d.ts.map +1 -1
  27. package/dist/channel/api/removeChannelMembers.d.ts.map +1 -1
  28. package/dist/channel/api/removeChannelMembersRole.d.ts +1 -1
  29. package/dist/channel/api/removeChannelMembersRole.d.ts.map +1 -1
  30. package/dist/channel/api/startReading.d.ts +3 -3
  31. package/dist/channel/api/startReading.d.ts.map +1 -1
  32. package/dist/channel/api/stopReading.d.ts +2 -2
  33. package/dist/channel/api/stopReading.d.ts.map +1 -1
  34. package/dist/channel/api/unbanChannelMembers.d.ts.map +1 -1
  35. package/dist/channel/api/updateChannel.d.ts.map +1 -1
  36. package/dist/channel/observers/liveChannel.d.ts.map +1 -1
  37. package/dist/client/api/connectClient.d.ts.map +1 -1
  38. package/dist/client/api/disconnectClient.d.ts.map +1 -1
  39. package/dist/client/api/renewal.d.ts.map +1 -1
  40. package/dist/comment/api/createComment.d.ts.map +1 -1
  41. package/dist/comment/api/deleteComment.d.ts.map +1 -1
  42. package/dist/comment/api/getComment.d.ts.map +1 -1
  43. package/dist/comment/api/getComments.d.ts.map +1 -1
  44. package/dist/comment/api/queryComments.d.ts.map +1 -1
  45. package/dist/comment/api/tests/queryComments.test.d.ts +2 -0
  46. package/dist/comment/api/tests/queryComments.test.d.ts.map +1 -0
  47. package/dist/comment/api/updateComment.d.ts.map +1 -1
  48. package/dist/comment/observers/liveComments.d.ts.map +1 -1
  49. package/dist/community/api/addCommunityMembers.d.ts.map +1 -1
  50. package/dist/community/api/addCommunityMembersRoles.d.ts.map +1 -1
  51. package/dist/community/api/createCommunity.d.ts.map +1 -1
  52. package/dist/community/api/deleteCommunity.d.ts.map +1 -1
  53. package/dist/community/api/getCommunity.d.ts.map +1 -1
  54. package/dist/community/api/getRecommendedCommunities.d.ts.map +1 -1
  55. package/dist/community/api/getTopTrendingCommunities.d.ts.map +1 -1
  56. package/dist/community/api/joinCommunity.d.ts.map +1 -1
  57. package/dist/community/api/leaveCommunity.d.ts.map +1 -1
  58. package/dist/community/api/queryCommunities.d.ts.map +1 -1
  59. package/dist/community/api/queryCommunityMembers.d.ts.map +1 -1
  60. package/dist/community/api/removeCommunityMembers.d.ts.map +1 -1
  61. package/dist/community/api/removeCommunityMembersRoles.d.ts.map +1 -1
  62. package/dist/community/api/updateCommunity.d.ts.map +1 -1
  63. package/dist/community/observers/liveCommunities.d.ts.map +1 -1
  64. package/dist/core/model/idResolvers.d.ts.map +1 -1
  65. package/dist/core/model/identifyModel.d.ts.map +1 -1
  66. package/dist/core/model/index.d.ts +1 -1
  67. package/dist/core/model/index.d.ts.map +1 -1
  68. package/dist/core/transports/http.d.ts.map +1 -1
  69. package/dist/feed/api/queryGlobalFeed.d.ts.map +1 -1
  70. package/dist/file/api/createFile.d.ts.map +1 -1
  71. package/dist/file/api/createImage.d.ts.map +1 -1
  72. package/dist/file/api/createVideo.d.ts.map +1 -1
  73. package/dist/file/api/deleteFile.d.ts.map +1 -1
  74. package/dist/file/api/getFile.d.ts.map +1 -1
  75. package/dist/follow/api/acceptFollower.d.ts.map +1 -1
  76. package/dist/follow/api/declineFollower.d.ts.map +1 -1
  77. package/dist/follow/api/follow.d.ts.map +1 -1
  78. package/dist/follow/api/getFollowInfo.d.ts.map +1 -1
  79. package/dist/follow/api/queryFollowers.d.ts.map +1 -1
  80. package/dist/follow/api/queryFollowings.d.ts.map +1 -1
  81. package/dist/follow/api/unfollow.d.ts.map +1 -1
  82. package/dist/follow/observers/index.d.ts +1 -0
  83. package/dist/follow/observers/index.d.ts.map +1 -1
  84. package/dist/follow/observers/liveFollowInfo.d.ts +21 -0
  85. package/dist/follow/observers/liveFollowInfo.d.ts.map +1 -0
  86. package/dist/follow/observers/tests/liveFollowInfo.test.d.ts +2 -0
  87. package/dist/follow/observers/tests/liveFollowInfo.test.d.ts.map +1 -0
  88. package/dist/index.cjs.js +511 -109
  89. package/dist/index.esm.js +511 -110
  90. package/dist/index.umd.js +2 -2
  91. package/dist/message/api/createMessage.d.ts +2 -1
  92. package/dist/message/api/createMessage.d.ts.map +1 -1
  93. package/dist/message/api/deleteMessage.d.ts.map +1 -1
  94. package/dist/message/api/getMessage.d.ts.map +1 -1
  95. package/dist/message/api/queryMessages.d.ts.map +1 -1
  96. package/dist/message/api/updateMessage.d.ts.map +1 -1
  97. package/dist/message/observers/liveMessages.d.ts.map +1 -1
  98. package/dist/message/utils/index.d.ts +3 -2
  99. package/dist/message/utils/index.d.ts.map +1 -1
  100. package/dist/poll/api/closePoll.d.ts.map +1 -1
  101. package/dist/poll/api/createPoll.d.ts.map +1 -1
  102. package/dist/poll/api/deletePoll.d.ts.map +1 -1
  103. package/dist/poll/api/getPoll.d.ts.map +1 -1
  104. package/dist/poll/api/votePoll.d.ts.map +1 -1
  105. package/dist/post/api/approvePost.d.ts.map +1 -1
  106. package/dist/post/api/createPost.d.ts.map +1 -1
  107. package/dist/post/api/declinePost.d.ts.map +1 -1
  108. package/dist/post/api/deletePost.d.ts.map +1 -1
  109. package/dist/post/api/getPost.d.ts.map +1 -1
  110. package/dist/post/api/getPosts.d.ts.map +1 -1
  111. package/dist/post/api/queryPosts.d.ts.map +1 -1
  112. package/dist/post/api/updatePost.d.ts.map +1 -1
  113. package/dist/post/observers/livePosts.d.ts.map +1 -1
  114. package/dist/reaction/api/addReaction.d.ts.map +1 -1
  115. package/dist/reaction/api/queryReactions.d.ts.map +1 -1
  116. package/dist/reaction/api/removeReaction.d.ts.map +1 -1
  117. package/dist/report/api/createReport.d.ts.map +1 -1
  118. package/dist/report/api/deleteReport.d.ts.map +1 -1
  119. package/dist/report/api/isReportedByMe.d.ts.map +1 -1
  120. package/dist/stream/api/createStream.d.ts.map +1 -1
  121. package/dist/stream/api/deleteStream.d.ts.map +1 -1
  122. package/dist/stream/api/getStream.d.ts.map +1 -1
  123. package/dist/stream/api/queryStreams.d.ts.map +1 -1
  124. package/dist/stream/api/updateStream.d.ts.map +1 -1
  125. package/dist/subChannel/api/createSubChannel.d.ts.map +1 -1
  126. package/dist/subChannel/api/deleteSubChannel.d.ts.map +1 -1
  127. package/dist/subChannel/api/getSubChannel.d.ts.map +1 -1
  128. package/dist/subChannel/api/querySubChannels.d.ts.map +1 -1
  129. package/dist/subChannel/api/updateSubChannel.d.ts.map +1 -1
  130. package/dist/user/api/getUser.d.ts.map +1 -1
  131. package/dist/user/api/getUsers.d.ts.map +1 -1
  132. package/dist/user/api/queryUsers.d.ts.map +1 -1
  133. package/dist/user/api/updateUser.d.ts.map +1 -1
  134. package/dist/utils/liveObject.d.ts +1 -1
  135. package/dist/utils/liveObject.d.ts.map +1 -1
  136. package/dist/utils/tests/dummy/comment.d.ts +77 -0
  137. package/dist/utils/tests/dummy/comment.d.ts.map +1 -0
  138. package/dist/utils/tests/dummy/community.d.ts +1 -1
  139. package/dist/utils/tests/dummy/index.d.ts +1 -0
  140. package/dist/utils/tests/dummy/index.d.ts.map +1 -1
  141. package/dist/utils/tests/dummy/post.d.ts +0 -12
  142. package/dist/utils/tests/dummy/post.d.ts.map +1 -1
  143. package/package.json +1 -1
  144. package/src/@types/core/model.ts +3 -1
  145. package/src/@types/domains/category.ts +1 -1
  146. package/src/@types/domains/comment.ts +1 -1
  147. package/src/@types/domains/community.ts +1 -1
  148. package/src/@types/domains/message.ts +1 -1
  149. package/src/@types/domains/post.ts +1 -1
  150. package/src/@types/domains/subChannel.ts +1 -1
  151. package/src/category/api/queryCategories.ts +5 -1
  152. package/src/category/observers/liveCategories.ts +3 -1
  153. package/src/category/observers/tests/liveCategories.test.ts +1 -3
  154. package/src/channel/api/addChannelMembers.ts +4 -0
  155. package/src/channel/api/addChannelMembersRole.ts +4 -0
  156. package/src/channel/api/banChannelMembers.ts +4 -0
  157. package/src/channel/api/createChannel.ts +4 -0
  158. package/src/channel/api/getChannel.ts +4 -0
  159. package/src/channel/api/joinChannel.ts +4 -0
  160. package/src/channel/api/leaveChannel.ts +4 -0
  161. package/src/channel/api/queryChannelMembers.ts +4 -0
  162. package/src/channel/api/queryChannels.ts +4 -0
  163. package/src/channel/api/removeChannelMembers.ts +4 -0
  164. package/src/channel/api/removeChannelMembersRole.ts +5 -1
  165. package/src/channel/api/startReading.ts +7 -3
  166. package/src/channel/api/stopReading.ts +6 -2
  167. package/src/channel/api/unbanChannelMembers.ts +4 -0
  168. package/src/channel/api/updateChannel.ts +4 -0
  169. package/src/channel/observers/liveChannel.ts +16 -1
  170. package/src/client/api/connectClient.ts +4 -0
  171. package/src/client/api/disconnectClient.ts +4 -0
  172. package/src/client/api/getToken.ts +1 -1
  173. package/src/client/api/renewal.ts +4 -0
  174. package/src/client/api/tests/getToken.test.ts +2 -2
  175. package/src/comment/api/createComment.ts +4 -0
  176. package/src/comment/api/deleteComment.ts +4 -0
  177. package/src/comment/api/getComment.ts +4 -0
  178. package/src/comment/api/getComments.ts +4 -0
  179. package/src/comment/api/queryComments.ts +6 -1
  180. package/src/comment/api/tests/createComment.test.ts +17 -112
  181. package/src/comment/api/tests/queryComments.test.ts +147 -0
  182. package/src/comment/api/tests/updateComment.test.ts +14 -85
  183. package/src/comment/api/updateComment.ts +4 -0
  184. package/src/comment/observers/liveComments.ts +3 -1
  185. package/src/community/api/addCommunityMembers.ts +4 -0
  186. package/src/community/api/addCommunityMembersRoles.ts +4 -0
  187. package/src/community/api/createCommunity.ts +4 -0
  188. package/src/community/api/deleteCommunity.ts +4 -0
  189. package/src/community/api/getCommunity.ts +4 -0
  190. package/src/community/api/getRecommendedCommunities.ts +4 -0
  191. package/src/community/api/getTopTrendingCommunities.ts +4 -0
  192. package/src/community/api/joinCommunity.ts +4 -0
  193. package/src/community/api/leaveCommunity.ts +4 -0
  194. package/src/community/api/queryCommunities.ts +6 -1
  195. package/src/community/api/queryCommunityMembers.ts +4 -0
  196. package/src/community/api/removeCommunityMembers.ts +4 -0
  197. package/src/community/api/removeCommunityMembersRoles.ts +4 -0
  198. package/src/community/api/test/queryCommunity.test.ts +30 -0
  199. package/src/community/api/updateCommunity.ts +4 -0
  200. package/src/community/observers/liveCommunities.ts +4 -1
  201. package/src/community/observers/tests/liveCommunities.test.ts +2 -2
  202. package/src/core/model/idResolvers.ts +1 -0
  203. package/src/core/model/identifyModel.ts +2 -1
  204. package/src/core/model/index.ts +11 -2
  205. package/src/core/transports/http.ts +5 -0
  206. package/src/core/transports/test/http.test.ts +12 -0
  207. package/src/feed/api/queryGlobalFeed.ts +4 -0
  208. package/src/file/api/createFile.ts +4 -0
  209. package/src/file/api/createImage.ts +4 -0
  210. package/src/file/api/createVideo.ts +4 -0
  211. package/src/file/api/deleteFile.ts +4 -0
  212. package/src/file/api/getFile.ts +4 -0
  213. package/src/follow/api/acceptFollower.ts +4 -0
  214. package/src/follow/api/declineFollower.ts +4 -0
  215. package/src/follow/api/follow.ts +4 -0
  216. package/src/follow/api/getFollowInfo.ts +8 -8
  217. package/src/follow/api/queryFollowers.ts +4 -0
  218. package/src/follow/api/queryFollowings.ts +4 -0
  219. package/src/follow/api/unfollow.ts +4 -0
  220. package/src/follow/observers/index.ts +1 -0
  221. package/src/follow/observers/liveFollowInfo.ts +29 -0
  222. package/src/follow/observers/tests/liveFollowInfo.test.ts +198 -0
  223. package/src/message/api/createMessage.ts +24 -7
  224. package/src/message/api/deleteMessage.ts +4 -0
  225. package/src/message/api/getMessage.ts +4 -0
  226. package/src/message/api/queryMessages.ts +4 -0
  227. package/src/message/api/tests/createMessage.test.ts +42 -2
  228. package/src/message/api/tests/queryMessages.test.ts +30 -0
  229. package/src/message/api/updateMessage.ts +4 -0
  230. package/src/message/observers/liveMessages.ts +14 -15
  231. package/src/message/tests/observers/liveMessages.test.ts +2 -2
  232. package/src/message/utils/index.ts +10 -1
  233. package/src/poll/api/closePoll.ts +4 -0
  234. package/src/poll/api/createPoll.ts +4 -0
  235. package/src/poll/api/deletePoll.ts +4 -0
  236. package/src/poll/api/getPoll.ts +4 -0
  237. package/src/poll/api/votePoll.ts +4 -0
  238. package/src/post/api/approvePost.ts +4 -0
  239. package/src/post/api/createPost.ts +4 -0
  240. package/src/post/api/declinePost.ts +4 -0
  241. package/src/post/api/deletePost.ts +4 -0
  242. package/src/post/api/getPost.ts +4 -0
  243. package/src/post/api/getPosts.ts +3 -0
  244. package/src/post/api/queryPosts.ts +6 -1
  245. package/src/post/api/tests/queryPosts.test.ts +30 -0
  246. package/src/post/api/updatePost.ts +4 -0
  247. package/src/post/observers/livePosts.ts +4 -2
  248. package/src/post/observers/tests/livePosts.test.ts +4 -5
  249. package/src/reaction/api/addReaction.ts +4 -0
  250. package/src/reaction/api/queryReactions.ts +4 -0
  251. package/src/reaction/api/removeReaction.ts +4 -0
  252. package/src/reaction/api/tests/addReaction.test.ts +13 -0
  253. package/src/reaction/api/tests/removeReaction.test.ts +13 -0
  254. package/src/report/api/createReport.ts +4 -0
  255. package/src/report/api/deleteReport.ts +4 -0
  256. package/src/report/api/isReportedByMe.ts +4 -0
  257. package/src/stream/api/createStream.ts +4 -0
  258. package/src/stream/api/deleteStream.ts +3 -0
  259. package/src/stream/api/getStream.ts +4 -0
  260. package/src/stream/api/queryStreams.ts +4 -0
  261. package/src/stream/api/updateStream.ts +3 -0
  262. package/src/subChannel/api/createSubChannel.ts +4 -0
  263. package/src/subChannel/api/deleteSubChannel.ts +4 -0
  264. package/src/subChannel/api/getSubChannel.ts +4 -0
  265. package/src/subChannel/api/querySubChannels.ts +6 -1
  266. package/src/subChannel/api/updateSubChannel.ts +4 -0
  267. package/src/subChannel/observers/liveSubChannels.ts +2 -2
  268. package/src/subChannel/observers/tests/liveSubChannels.test.ts +5 -2
  269. package/src/user/api/getUser.ts +4 -0
  270. package/src/user/api/getUsers.ts +3 -0
  271. package/src/user/api/queryUsers.ts +4 -0
  272. package/src/user/api/updateUser.ts +4 -0
  273. package/src/utils/liveObject.ts +1 -4
  274. package/src/utils/tests/dummy/comment.ts +268 -0
  275. package/src/utils/tests/dummy/index.ts +1 -0
  276. package/src/utils/tests/dummy/post.ts +0 -114
  277. package/dist/post/tests/api/getPost.test.d.ts +0 -2
  278. package/dist/post/tests/api/getPost.test.d.ts.map +0 -1
  279. package/dist/post/tests/api/queryPosts.test.d.ts +0 -2
  280. package/dist/post/tests/api/queryPosts.test.d.ts.map +0 -1
  281. package/src/post/tests/api/getPost.test.ts +0 -98
  282. package/src/post/tests/api/queryPosts.test.ts +0 -123
@@ -33,8 +33,17 @@ export const PAYLOAD2MODEL: Record<string, Amity.Domain> = {
33
33
  };
34
34
 
35
35
  /** hidden */
36
- export const hasUpdates = (prevData: Amity.UpdatedAt, nextData: Amity.UpdatedAt): boolean => {
37
- return new Date(prevData.updatedAt!) < new Date(nextData.updatedAt!);
36
+ export const hasUpdates = <T extends Amity.Model>(prevData: T, nextData: T): boolean => {
37
+ if ('updatedAt' in prevData && 'updatedAt' in nextData) {
38
+ return new Date(prevData.updatedAt!) < new Date(nextData.updatedAt!);
39
+ }
40
+
41
+ /*
42
+ * hasUpdates is used to identify the latest object among many. If the object
43
+ * does not extend ${Amity.UpdatedAt}, then there is no way to differentiate.
44
+ * So it is considered by default that the object hasUpdates
45
+ */
46
+ return true;
38
47
  };
39
48
 
40
49
  /** hidden */
@@ -38,6 +38,11 @@ export const createHttpTransport = (endpoint: string) => {
38
38
  });
39
39
 
40
40
  instance.interceptors.request.use(config => {
41
+ // do not check expiration for token creation url
42
+ if (config.url === '/api/v4/sessions') {
43
+ return config;
44
+ }
45
+
41
46
  // check global.ts for the extension of AxiosRequestConfig
42
47
  const tokenExpiry = config.metadata?.tokenExpiry;
43
48
 
@@ -3,6 +3,7 @@ import nock from 'nock';
3
3
  import { ASCApiError, ASCUnknownError } from '~/core/errors';
4
4
  import { createFileFormData } from '~/utils/tests';
5
5
 
6
+ import { getPastDate } from '~/core/model';
6
7
  import { createHttpTransport } from '../http';
7
8
 
8
9
  const baseUrl = 'https://non-exist.domain';
@@ -68,5 +69,16 @@ describe('core/transports', () => {
68
69
 
69
70
  await expect(instance.post('/foo', formData)).resolves.not.toThrow();
70
71
  });
72
+
73
+ test('should not check token expiration for token creation url', async () => {
74
+ const expectedResolveValue = { foo: 'bar' };
75
+ nock(baseUrl).get('/api/v4/sessions').reply(200, expectedResolveValue);
76
+
77
+ const instance = createHttpTransport(baseUrl);
78
+ instance.defaults.metadata = { tokenExpiry: getPastDate() };
79
+
80
+ const expected = expect.objectContaining({ data: expectedResolveValue });
81
+ await expect(instance.get('/api/v4/sessions')).resolves.toEqual(expected);
82
+ });
71
83
  });
72
84
  });
@@ -6,6 +6,9 @@ import { pullFromCache, pushToCache } from '~/cache/api';
6
6
  import { getResolver } from '~/core/model';
7
7
  import { prepareMembershipPayload } from '~/group/utils';
8
8
 
9
+ /* begin_public_function
10
+ id: feed.query.global_feed
11
+ */
9
12
  /**
10
13
  * ```js
11
14
  * import { queryGlobalFeed } from '@amityco/ts-sdk'
@@ -66,6 +69,7 @@ export const queryGlobalFeed = async (query?: {
66
69
 
67
70
  return { data: posts, cachedAt, prevPage, nextPage };
68
71
  };
72
+ /* end_public_function */
69
73
 
70
74
  /**
71
75
  * ```js
@@ -2,6 +2,9 @@ import { getActiveClient } from '~/client/api';
2
2
 
3
3
  import { ingestInCache } from '~/cache/api/ingestInCache';
4
4
 
5
+ /* begin_public_function
6
+ id: file.upload.file
7
+ */
5
8
  /**
6
9
  * ```js
7
10
  * import { createFile } from '@amityco/ts-sdk'
@@ -50,5 +53,6 @@ export const createFile = async <T extends Amity.FileType = any>(
50
53
  cachedAt,
51
54
  };
52
55
  };
56
+ /* end_public_function */
53
57
 
54
58
  // TODO: consider doing local creation with URL.createObjectURL()
@@ -2,6 +2,9 @@ import { getActiveClient } from '~/client/api';
2
2
 
3
3
  import { ingestInCache } from '~/cache/api/ingestInCache';
4
4
 
5
+ /* begin_public_function
6
+ id: file.upload.image
7
+ */
5
8
  /**
6
9
  * ```js
7
10
  * import { createImage } from '@amityco/ts-sdk'
@@ -54,5 +57,6 @@ export const createImage = async (
54
57
  cachedAt,
55
58
  };
56
59
  };
60
+ /* end_public_function */
57
61
 
58
62
  // TODO: consider doing local creation with URL.createObjectURL()
@@ -2,6 +2,9 @@ import { getActiveClient } from '~/client/api';
2
2
 
3
3
  import { ingestInCache } from '~/cache/api/ingestInCache';
4
4
 
5
+ /* begin_public_function
6
+ id: file.upload.video
7
+ */
5
8
  /**
6
9
  * ```js
7
10
  * import { createVideo } from '@amityco/ts-sdk'
@@ -60,5 +63,6 @@ export const createVideo = async (
60
63
  cachedAt,
61
64
  };
62
65
  };
66
+ /* end_public_function */
63
67
 
64
68
  // TODO: consider doing local creation with URL.createObjectURL()
@@ -2,6 +2,9 @@ import { getActiveClient } from '~/client/api';
2
2
 
3
3
  import { dropFromCache } from '~/cache/api';
4
4
 
5
+ /* begin_public_function
6
+ id: file.delete
7
+ */
5
8
  /**
6
9
  * ```js
7
10
  * import { deleteFile } from '@amityco/ts-sdk'
@@ -29,3 +32,4 @@ export const deleteFile = async (
29
32
 
30
33
  return { success: true };
31
34
  };
35
+ /* end_public_function */
@@ -3,6 +3,9 @@ import { getActiveClient } from '~/client/api';
3
3
  import { pullFromCache } from '~/cache/api';
4
4
  import { ingestInCache } from '~/cache/api/ingestInCache';
5
5
 
6
+ /* begin_public_function
7
+ id: file.get
8
+ */
6
9
  /**
7
10
  * ```js
8
11
  * import { getFile } from '@amityco/ts-sdk'
@@ -36,6 +39,7 @@ export const getFile = async <T extends Amity.FileType = any>(
36
39
  cachedAt,
37
40
  };
38
41
  };
42
+ /* end_public_function */
39
43
 
40
44
  /**
41
45
  * ```js
@@ -2,6 +2,9 @@ import { getActiveClient } from '~/client/api';
2
2
  import { ingestInCache } from '~/cache/api/ingestInCache';
3
3
  import { fireEvent } from '~/core/events';
4
4
 
5
+ /* begin_public_function
6
+ id: user.relationship.accept_follow
7
+ */
5
8
  /**
6
9
  * ```js
7
10
  * import { acceptFollower } from '@amityco/ts-sdk'
@@ -32,3 +35,4 @@ export const acceptFollower = async (userId: Amity.User['userId']): Promise<bool
32
35
 
33
36
  return true;
34
37
  };
38
+ /* end_public_function */
@@ -2,6 +2,9 @@ import { getActiveClient } from '~/client/api';
2
2
  import { ingestInCache } from '~/cache/api/ingestInCache';
3
3
  import { fireEvent } from '~/core/events';
4
4
 
5
+ /* begin_public_function
6
+ id: user.relationship.decline_follow
7
+ */
5
8
  /**
6
9
  * ```js
7
10
  * import { declineFollower } from '@amityco/ts-sdk'
@@ -32,3 +35,4 @@ export const declineFollower = async (userId: Amity.User['userId']): Promise<boo
32
35
 
33
36
  return true;
34
37
  };
38
+ /* end_public_function */
@@ -2,6 +2,9 @@ import { getActiveClient } from '~/client/api';
2
2
  import { ingestInCache } from '~/cache/api/ingestInCache';
3
3
  import { fireEvent } from '~/core/events';
4
4
 
5
+ /* begin_public_function
6
+ id: user.relationship.follow
7
+ */
5
8
  /**
6
9
  * ```js
7
10
  * import { follow } from '@amityco/ts-sdk'
@@ -39,3 +42,4 @@ export const follow = async (
39
42
  cachedAt,
40
43
  };
41
44
  };
45
+ /* end_public_function */
@@ -1,12 +1,9 @@
1
1
  import { getActiveClient } from '~/client/api';
2
2
  import { pullFromCache, pushToCache } from '~/cache/api';
3
3
 
4
- const getCacheKey = (userId: Amity.User['userId']) => [
5
- 'followInfo',
6
- 'get',
7
- `${getActiveClient().userId}#${userId}`,
8
- ];
9
-
4
+ /* begin_public_function
5
+ id: user.relationship.get_follow_info, user.relationship.get_my_follow_info
6
+ */
10
7
  /**
11
8
  * ```js
12
9
  * import { getFollowInfo } from '@amityco/ts-sdk'
@@ -41,7 +38,9 @@ export const getFollowInfo = async (
41
38
  : data.followCounts[0];
42
39
 
43
40
  if (client.cache) {
44
- pushToCache(getCacheKey(userId), followInfo, { cachedAt });
41
+ pushToCache(['followInfo', 'get', userId], followInfo, {
42
+ cachedAt,
43
+ });
45
44
  }
46
45
 
47
46
  return {
@@ -49,6 +48,7 @@ export const getFollowInfo = async (
49
48
  cachedAt,
50
49
  };
51
50
  };
51
+ /* end_public_function */
52
52
 
53
53
  /**
54
54
  * ```js
@@ -73,7 +73,7 @@ getFollowInfo.locally = (
73
73
  return;
74
74
  }
75
75
 
76
- const cached = pullFromCache<Amity.FollowInfo>(getCacheKey(userId));
76
+ const cached = pullFromCache<Amity.FollowInfo>(['followInfo', 'get', userId]);
77
77
 
78
78
  if (!cached) {
79
79
  return;
@@ -1,5 +1,8 @@
1
1
  import { queryFollows } from './utils';
2
2
 
3
+ /* begin_public_function
4
+ id: user.relationship.query_my_followers, user.relationship.query_followers
5
+ */
3
6
  /**
4
7
  * ```js
5
8
  * import { queryFollowers } from '@amityco/ts-sdk'
@@ -18,6 +21,7 @@ export const queryFollowers = async (
18
21
  query: Amity.QueryFollowers,
19
22
  ): Promise<Amity.Cached<Amity.Paged<Amity.FollowStatus, Amity.PageRaw>>> =>
20
23
  queryFollows('followers', query);
24
+ /* end_public_function */
21
25
 
22
26
  /**
23
27
  * ```js
@@ -1,5 +1,8 @@
1
1
  import { queryFollows } from './utils';
2
2
 
3
+ /* begin_public_function
4
+ id: user.relationship.query_my_followings, user.relationship.query_followings
5
+ */
3
6
  /**
4
7
  * ```js
5
8
  * import { queryFollowings } from '@amityco/ts-sdk'
@@ -18,6 +21,7 @@ export const queryFollowings = async (
18
21
  query: Amity.QueryFollowings,
19
22
  ): Promise<Amity.Cached<Amity.Paged<Amity.FollowStatus, Amity.PageRaw>>> =>
20
23
  queryFollows('following', query);
24
+ /* end_public_function */
21
25
 
22
26
  /**
23
27
  * ```js
@@ -2,6 +2,9 @@ import { getActiveClient } from '~/client/api';
2
2
  import { ingestInCache } from '~/cache/api/ingestInCache';
3
3
  import { fireEvent } from '~/core/events';
4
4
 
5
+ /* begin_public_function
6
+ id: user.relationship.unfollow
7
+ */
5
8
  /**
6
9
  * ```js
7
10
  * import { unfollow } from '@amityco/ts-sdk'
@@ -32,3 +35,4 @@ export const unfollow = async (userId: Amity.User['userId']): Promise<boolean> =
32
35
 
33
36
  return true;
34
37
  };
38
+ /* end_public_function */
@@ -4,3 +4,4 @@ export * from './observeFollowings';
4
4
 
5
5
  export * from './liveFollowers';
6
6
  export * from './liveFollowings';
7
+ export * from './liveFollowInfo';
@@ -0,0 +1,29 @@
1
+ import { liveObject } from '~/utils/liveObject';
2
+ import { getFollowInfo } from '../api';
3
+ import { onFollowInfoUpdated } from '../events';
4
+
5
+ /**
6
+ * ```js
7
+ * import { liveFollowInfo } from '@amityco/ts-sdk';
8
+ *
9
+ * let followInfo;
10
+ *
11
+ * const unsubscribe = liveFollowInfo(userId, response => {
12
+ * followInfo = response.data;
13
+ * });
14
+ * ```
15
+ *
16
+ * Observe all mutation on a given {@link Amity.FollowCount} object
17
+ *
18
+ * @param userId the ID of the current user
19
+ * @param callback the function to call when new data are available
20
+ * @returns An {@link Amity.Unsubscriber} function to run when willing to stop observing
21
+ *
22
+ * @category FollowInfo Live Object
23
+ */
24
+ export const liveFollowInfo = (
25
+ userId: Amity.FollowInfo['userId'],
26
+ callback: Amity.LiveObjectCallback<Amity.FollowInfo>,
27
+ ): Amity.Unsubscriber => {
28
+ return liveObject(userId, callback, 'userId', getFollowInfo, [onFollowInfoUpdated]);
29
+ };
@@ -0,0 +1,198 @@
1
+ import { disableCache, enableCache } from '~/cache/api';
2
+ import {
3
+ client,
4
+ connectClient,
5
+ disconnectClient,
6
+ follow21,
7
+ follow11,
8
+ user11,
9
+ pause,
10
+ date,
11
+ } from '~/utils/tests';
12
+
13
+ import { liveFollowInfo } from '../liveFollowInfo';
14
+
15
+ const FOLLOWING_COUNT = 2;
16
+ const getFollowInfoMePayload = ({
17
+ userId = user11.userId,
18
+ followerCount = 0,
19
+ pendingCount = 0,
20
+ followingCount = FOLLOWING_COUNT,
21
+ } = {}): Amity.FollowInfoMePayload => {
22
+ return {
23
+ followCounts: [
24
+ {
25
+ userId,
26
+ followerCount,
27
+ pendingCount,
28
+ followingCount,
29
+ },
30
+ ],
31
+ };
32
+ };
33
+
34
+ const getFollowMeStatusPayload = (
35
+ status: Amity.FollowStatus['status'] = follow11.status,
36
+ ): Amity.FollowStatusPayload => {
37
+ return {
38
+ follows: [
39
+ {
40
+ from: follow11.from,
41
+ to: follow11.to,
42
+ status,
43
+ createdAt: date,
44
+ updatedAt: date,
45
+ },
46
+ ],
47
+ };
48
+ };
49
+
50
+ const getFollowStatusPayload = (
51
+ status: Amity.FollowStatus['status'] = follow21.status,
52
+ ): Amity.FollowStatusPayload => {
53
+ return {
54
+ follows: [
55
+ {
56
+ from: follow21.from,
57
+ to: follow21.to,
58
+ status,
59
+ createdAt: date,
60
+ updatedAt: date,
61
+ },
62
+ ],
63
+ };
64
+ };
65
+
66
+ describe('liveFollowInfo > me', () => {
67
+ beforeAll(connectClient);
68
+ afterAll(disconnectClient);
69
+
70
+ beforeEach(enableCache);
71
+ afterEach(disableCache);
72
+
73
+ const tests: [
74
+ string,
75
+ keyof Amity.MqttFollowEvents,
76
+ Amity.FollowStatusPayload,
77
+ Amity.FollowInfoMePayload,
78
+ ][] = [
79
+ [
80
+ 'it should update follow info collection on accepted',
81
+ 'follow.accepted',
82
+ getFollowMeStatusPayload('accepted'),
83
+ getFollowInfoMePayload({ userId: user11.userId, followingCount: FOLLOWING_COUNT + 1 }),
84
+ ],
85
+ [
86
+ 'it should update follow info collection on unfollowed',
87
+ 'follow.unfollowed',
88
+ getFollowMeStatusPayload('none'),
89
+ getFollowInfoMePayload({ userId: user11.userId, followingCount: FOLLOWING_COUNT - 1 }),
90
+ ],
91
+ [
92
+ 'it should update follow info collection on requestDeclined',
93
+ 'follow.requestDeclined',
94
+ getFollowMeStatusPayload('none'),
95
+ getFollowInfoMePayload({ userId: user11.userId, followingCount: FOLLOWING_COUNT }),
96
+ ],
97
+ [
98
+ 'it should update follow info collection on followerDeleted',
99
+ 'follow.followerDeleted',
100
+ getFollowMeStatusPayload('none'),
101
+ getFollowInfoMePayload({ userId: user11.userId, followingCount: FOLLOWING_COUNT - 1 }),
102
+ ],
103
+ ];
104
+
105
+ test.each(tests)('%s', async (description, event, payload, payloadFrom) => {
106
+ const callback = jest.fn();
107
+ client.http.get = jest
108
+ .fn()
109
+ .mockResolvedValue({ data: getFollowInfoMePayload() })
110
+ .mockResolvedValueOnce({ data: payloadFrom })
111
+ .mockResolvedValueOnce({ data: payloadFrom });
112
+
113
+ const unsub = liveFollowInfo(user11.userId, callback);
114
+ await pause();
115
+
116
+ client.emitter.emit(event, payload);
117
+ await pause();
118
+
119
+ expect(callback).toHaveBeenCalled();
120
+
121
+ expect(callback).toHaveBeenNthCalledWith(
122
+ 3,
123
+ expect.objectContaining({
124
+ data: payloadFrom.followCounts[0],
125
+ loading: false,
126
+ }),
127
+ );
128
+
129
+ unsub();
130
+ });
131
+ });
132
+
133
+ describe('liveFollowInfo > other', () => {
134
+ beforeAll(connectClient);
135
+ afterAll(disconnectClient);
136
+
137
+ beforeEach(enableCache);
138
+ afterEach(disableCache);
139
+
140
+ const tests: [
141
+ string,
142
+ keyof Amity.MqttFollowEvents,
143
+ Amity.FollowStatusPayload,
144
+ Amity.FollowInfoMePayload,
145
+ ][] = [
146
+ [
147
+ 'it should update follow info collection on accepted',
148
+ 'follow.accepted',
149
+ getFollowStatusPayload('accepted'),
150
+ getFollowInfoMePayload({ userId: follow21.from, followingCount: FOLLOWING_COUNT + 1 }),
151
+ ],
152
+ [
153
+ 'it should update follow info collection on unfollowed',
154
+ 'follow.unfollowed',
155
+ getFollowStatusPayload('none'),
156
+ getFollowInfoMePayload({ userId: follow21.from, followingCount: FOLLOWING_COUNT - 1 }),
157
+ ],
158
+ [
159
+ 'it should update follow info collection on requestDeclined',
160
+ 'follow.requestDeclined',
161
+ getFollowStatusPayload('none'),
162
+ getFollowInfoMePayload({ userId: follow21.from, followingCount: FOLLOWING_COUNT }),
163
+ ],
164
+ [
165
+ 'it should update follow info collection on followerDeleted',
166
+ 'follow.followerDeleted',
167
+ getFollowStatusPayload('none'),
168
+ getFollowInfoMePayload({ userId: follow21.from, followingCount: FOLLOWING_COUNT - 1 }),
169
+ ],
170
+ ];
171
+
172
+ test.each(tests)('%s', async (description, event, payload, payloadFrom) => {
173
+ const callback = jest.fn();
174
+ client.http.get = jest
175
+ .fn()
176
+ .mockResolvedValue({ data: getFollowInfoMePayload({ userId: follow21.from }) })
177
+ .mockResolvedValueOnce({ data: payloadFrom })
178
+ .mockResolvedValueOnce({ data: payloadFrom });
179
+
180
+ const unsub = liveFollowInfo(follow21.from, callback);
181
+ await pause();
182
+
183
+ client.emitter.emit(event, payload);
184
+ await pause();
185
+
186
+ expect(callback).toHaveBeenCalled();
187
+
188
+ expect(callback).toHaveBeenNthCalledWith(
189
+ 3,
190
+ expect.objectContaining({
191
+ data: payloadFrom.followCounts[0],
192
+ loading: false,
193
+ }),
194
+ );
195
+
196
+ unsub();
197
+ });
198
+ });
@@ -7,9 +7,14 @@ import { upsertInCache, pullFromCache, pushToCache, dropFromCache } from '~/cach
7
7
 
8
8
  import { convertParams, prepareMessagePayload } from '../utils';
9
9
 
10
+ const getLocalId = () => `LOCAL_${uuid()}`;
11
+
10
12
  // FIXME: temp solution
11
13
  let uniqueId: string | undefined;
12
14
 
15
+ /* begin_public_function
16
+ id: message.create.text_message, message.create.image_message, message.create.file_message, message.create.video_message, message.create.audio_message, message.create.custom_message
17
+ */
13
18
  /**
14
19
  * ```js
15
20
  * import { createMessage, createQuery, runQuery } from '@amityco/ts-sdk'
@@ -39,12 +44,23 @@ export const createMessage = async <T extends Amity.MessageContentType>(
39
44
  > & {
40
45
  data?: Amity.Message<T>['data'];
41
46
  fileId?: Amity.File['fileId'];
47
+ // Custom referenceId is a workaround for the case:
48
+ // User wants to create an image message. He should
49
+ // - create and show dummy message in ui
50
+ // - upload image to get fileId, while uploading show a spinner in dummy message in ui
51
+ // - call createMessage and pass fileId
52
+ // - replace dummy message with the actual message received from backend
53
+ // Custom referenceId is needed to make relation between dummy message and actual message.
54
+ // TODO: passing file src into createMessage so that sdk uploads files itself,
55
+ // returns the dummy message bound with the file to eliminate the need to create
56
+ // the dummy message on the user side,
57
+ referenceId?: string;
42
58
  },
43
59
  ): Promise<Amity.Cached<Amity.Message>> => {
44
60
  const client = getActiveClient();
45
61
  client.log('message/createMessage', bundle);
46
62
 
47
- const referenceId = uniqueId;
63
+ const referenceId = bundle.referenceId || uniqueId || getLocalId();
48
64
  uniqueId = undefined;
49
65
 
50
66
  const { data: payload } = await client.http.post<Amity.MessagePayload>('/api/v5/messages', {
@@ -86,9 +102,10 @@ export const createMessage = async <T extends Amity.MessageContentType>(
86
102
  *
87
103
  * @category Message API
88
104
  */
89
- createMessage.optimistically = (
90
- bundle: Parameters<typeof createMessage>[0],
91
- ): Amity.Cached<Amity.Message> | undefined => {
105
+ createMessage.optimistically = ({
106
+ referenceId,
107
+ ...bundle
108
+ }: Parameters<typeof createMessage>[0]): Amity.Cached<Amity.Message> | undefined => {
92
109
  const client = getActiveClient();
93
110
 
94
111
  if (!client.cache) return;
@@ -100,9 +117,8 @@ createMessage.optimistically = (
100
117
  * Updated to handle client requirement to add messageId while uploading
101
118
  * message with image. Temporary!
102
119
  */
103
- const localId = `LOCAL_${uuid()}`;
104
- uniqueId = localId;
105
- const bundleWithMessageId = { messageId: localId, uniqueId: localId, ...bundle };
120
+ uniqueId = referenceId || getLocalId();
121
+ const bundleWithMessageId = { messageId: uniqueId, uniqueId, ...bundle };
106
122
 
107
123
  client.log('message/createMessage.optimistically', bundleWithMessageId);
108
124
 
@@ -148,3 +164,4 @@ createMessage.optimistically = (
148
164
  data: message,
149
165
  };
150
166
  };
167
+ /* end_public_function */
@@ -4,6 +4,9 @@ import { fireEvent } from '~/core/events';
4
4
 
5
5
  import { getMessage } from './getMessage';
6
6
 
7
+ /* begin_public_function
8
+ id: message.soft_delete
9
+ */
7
10
  /**
8
11
  * ```js
9
12
  * import { deleteMessage } from '@amityco/ts-sdk'
@@ -74,3 +77,4 @@ deleteMessage.optimistically = (
74
77
  cachedAt,
75
78
  };
76
79
  };
80
+ /* end_public_function */
@@ -9,6 +9,9 @@ import { checkIfShouldGoesToTombstone } from '~/cache/utils';
9
9
  import { pushToTombstone } from '~/cache/api/pushToTombstone';
10
10
  import { convertResponseFromRaw } from '../utils';
11
11
 
12
+ /* begin_public_function
13
+ id: message.get
14
+ */
12
15
  /**
13
16
  * ```js
14
17
  * import { getMessage } from '@amityco/ts-sdk'
@@ -67,6 +70,7 @@ export const getMessage = async (
67
70
  cachedAt,
68
71
  };
69
72
  };
73
+ /* end_public_function */
70
74
 
71
75
  /**
72
76
  * ```js
@@ -7,6 +7,9 @@ import { ingestInCache } from '~/cache/api/ingestInCache';
7
7
  import { getResolver } from '~/core/model';
8
8
  import { convertQueryParams, convertResponseFromRaw } from '../utils';
9
9
 
10
+ /* begin_public_function
11
+ id: message.query
12
+ */
10
13
  /**
11
14
  * ```js
12
15
  * import { queryMessages } from '@amityco/ts-sdk'
@@ -58,6 +61,7 @@ export const queryMessages = async (
58
61
 
59
62
  return { data: messages, cachedAt, prevPage, nextPage };
60
63
  };
64
+ /* end_public_function */
61
65
 
62
66
  /**
63
67
  * ```js