@amityco/ts-sdk 0.0.1-beta.42.3 → 0.0.1-beta.43

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 (296) hide show
  1. package/dist/@types/core/events.d.ts +11 -1
  2. package/dist/@types/core/events.d.ts.map +1 -1
  3. package/dist/@types/core/marker.d.ts +37 -0
  4. package/dist/@types/core/marker.d.ts.map +1 -0
  5. package/dist/@types/core/model.d.ts +10 -0
  6. package/dist/@types/core/model.d.ts.map +1 -1
  7. package/dist/@types/core/payload.d.ts +44 -0
  8. package/dist/@types/core/payload.d.ts.map +1 -1
  9. package/dist/@types/domains/channel.d.ts +5 -8
  10. package/dist/@types/domains/channel.d.ts.map +1 -1
  11. package/dist/@types/domains/client.d.ts +1 -0
  12. package/dist/@types/domains/client.d.ts.map +1 -1
  13. package/dist/@types/domains/marker.d.ts +15 -0
  14. package/dist/@types/domains/marker.d.ts.map +1 -0
  15. package/dist/@types/domains/message.d.ts +3 -0
  16. package/dist/@types/domains/message.d.ts.map +1 -1
  17. package/dist/@types/domains/partials.d.ts +3 -0
  18. package/dist/@types/domains/partials.d.ts.map +1 -1
  19. package/dist/@types/domains/subChannel.d.ts +2 -0
  20. package/dist/@types/domains/subChannel.d.ts.map +1 -1
  21. package/dist/channel/api/index.d.ts +0 -2
  22. package/dist/channel/api/index.d.ts.map +1 -1
  23. package/dist/channel/events/onChannelUpdated.d.ts.map +1 -1
  24. package/dist/channel/utils/index.d.ts +1 -2
  25. package/dist/channel/utils/index.d.ts.map +1 -1
  26. package/dist/channel/utils/prepareChannelPayload.d.ts +6 -0
  27. package/dist/channel/utils/prepareChannelPayload.d.ts.map +1 -0
  28. package/dist/channel/utils/tests/prepareChannelPayload.test.d.ts +5 -1
  29. package/dist/channel/utils/tests/prepareChannelPayload.test.d.ts.map +1 -1
  30. package/dist/client/api/activeUser.d.ts +2 -2
  31. package/dist/client/api/activeUser.d.ts.map +1 -1
  32. package/dist/client/api/connectClient.d.ts.map +1 -1
  33. package/dist/client/api/index.d.ts +2 -0
  34. package/dist/client/api/index.d.ts.map +1 -1
  35. package/dist/client/api/markerSync.d.ts +21 -0
  36. package/dist/client/api/markerSync.d.ts.map +1 -0
  37. package/dist/client/observers/getTotalUnreadCount.d.ts +18 -0
  38. package/dist/client/observers/getTotalUnreadCount.d.ts.map +1 -0
  39. package/dist/client/observers/index.d.ts +2 -0
  40. package/dist/client/observers/index.d.ts.map +1 -0
  41. package/dist/client/observers/tests/getTotalUnreadCount.test.d.ts +2 -0
  42. package/dist/client/observers/tests/getTotalUnreadCount.test.d.ts.map +1 -0
  43. package/dist/client/utils/index.d.ts +2 -0
  44. package/dist/client/utils/index.d.ts.map +1 -0
  45. package/dist/client/utils/markerSyncEngine.d.ts +46 -0
  46. package/dist/client/utils/markerSyncEngine.d.ts.map +1 -0
  47. package/dist/core/events.d.ts +3 -3
  48. package/dist/core/events.d.ts.map +1 -1
  49. package/dist/core/model/idResolvers.d.ts.map +1 -1
  50. package/dist/core/model/index.d.ts.map +1 -1
  51. package/dist/index.cjs.js +1921 -1185
  52. package/dist/index.d.ts +5 -0
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.esm.js +1891 -1186
  55. package/dist/index.umd.js +4 -4
  56. package/dist/marker/api/getChannelMarkers.d.ts +18 -0
  57. package/dist/marker/api/getChannelMarkers.d.ts.map +1 -0
  58. package/dist/marker/api/getMessageMarkers.d.ts +18 -0
  59. package/dist/marker/api/getMessageMarkers.d.ts.map +1 -0
  60. package/dist/marker/api/getSubChannelMarkers.d.ts +18 -0
  61. package/dist/marker/api/getSubChannelMarkers.d.ts.map +1 -0
  62. package/dist/marker/api/getUserMarker.d.ts +8 -0
  63. package/dist/marker/api/getUserMarker.d.ts.map +1 -0
  64. package/dist/marker/api/index.d.ts +5 -0
  65. package/dist/marker/api/index.d.ts.map +1 -0
  66. package/dist/marker/api/tests/getChannelMarkers.test.d.ts +2 -0
  67. package/dist/marker/api/tests/getChannelMarkers.test.d.ts.map +1 -0
  68. package/dist/marker/api/tests/getMessageMarkers.test.d.ts +2 -0
  69. package/dist/marker/api/tests/getMessageMarkers.test.d.ts.map +1 -0
  70. package/dist/marker/api/tests/getSubChannelMarkers.test.d.ts +2 -0
  71. package/dist/marker/api/tests/getSubChannelMarkers.test.d.ts.map +1 -0
  72. package/dist/marker/events/index.d.ts +7 -0
  73. package/dist/marker/events/index.d.ts.map +1 -0
  74. package/dist/marker/events/onChannelMarkerFetched.d.ts +17 -0
  75. package/dist/marker/events/onChannelMarkerFetched.d.ts.map +1 -0
  76. package/dist/marker/events/onFeedlMarkerFetched.d.ts +17 -0
  77. package/dist/marker/events/onFeedlMarkerFetched.d.ts.map +1 -0
  78. package/dist/marker/events/onMessageMarkerFetched.d.ts +17 -0
  79. package/dist/marker/events/onMessageMarkerFetched.d.ts.map +1 -0
  80. package/dist/marker/events/onSubChannelMarkerFetched.d.ts +17 -0
  81. package/dist/marker/events/onSubChannelMarkerFetched.d.ts.map +1 -0
  82. package/dist/marker/events/onSubChannelMarkerUpdated.d.ts +17 -0
  83. package/dist/marker/events/onSubChannelMarkerUpdated.d.ts.map +1 -0
  84. package/dist/marker/events/onUserMarkerFetched.d.ts +17 -0
  85. package/dist/marker/events/onUserMarkerFetched.d.ts.map +1 -0
  86. package/dist/message/api/getMessage.d.ts.map +1 -1
  87. package/dist/message/api/getMessages.d.ts.map +1 -1
  88. package/dist/message/api/index.d.ts +1 -0
  89. package/dist/message/api/index.d.ts.map +1 -1
  90. package/dist/message/api/markAsDelivered.d.ts +17 -0
  91. package/dist/message/api/markAsDelivered.d.ts.map +1 -0
  92. package/dist/message/api/queryMessages.d.ts.map +1 -1
  93. package/dist/message/api/tests/markAsDelivered.test.d.ts +2 -0
  94. package/dist/message/api/tests/markAsDelivered.test.d.ts.map +1 -0
  95. package/dist/message/api/updateMessage.d.ts.map +1 -1
  96. package/dist/message/events/index.d.ts +1 -0
  97. package/dist/message/events/index.d.ts.map +1 -1
  98. package/dist/message/events/onMessageCreated.d.ts +2 -1
  99. package/dist/message/events/onMessageCreated.d.ts.map +1 -1
  100. package/dist/message/events/onMessageUpdated.d.ts.map +1 -1
  101. package/dist/message/utils/index.d.ts +1 -18
  102. package/dist/message/utils/index.d.ts.map +1 -1
  103. package/dist/message/utils/prepareMessagePayload.d.ts +16 -0
  104. package/dist/message/utils/prepareMessagePayload.d.ts.map +1 -0
  105. package/dist/report/api/createReport.d.ts.map +1 -1
  106. package/dist/report/api/deleteReport.d.ts.map +1 -1
  107. package/dist/subChannel/api/getSubChannels.d.ts.map +1 -1
  108. package/dist/subChannel/api/index.d.ts +2 -0
  109. package/dist/subChannel/api/index.d.ts.map +1 -1
  110. package/dist/subChannel/api/startReadingAPI.d.ts +17 -0
  111. package/dist/subChannel/api/startReadingAPI.d.ts.map +1 -0
  112. package/dist/subChannel/api/stopReadingAPI.d.ts +17 -0
  113. package/dist/subChannel/api/stopReadingAPI.d.ts.map +1 -0
  114. package/dist/subChannel/events/onSubChannelUpdated.d.ts +1 -1
  115. package/dist/subChannel/events/onSubChannelUpdated.d.ts.map +1 -1
  116. package/dist/subChannel/observers/liveSubChannel.d.ts.map +1 -1
  117. package/dist/subChannel/utils/index.d.ts +2 -7
  118. package/dist/subChannel/utils/index.d.ts.map +1 -1
  119. package/dist/subChannel/utils/markReadEngine.d.ts +33 -0
  120. package/dist/subChannel/utils/markReadEngine.d.ts.map +1 -0
  121. package/dist/subChannel/utils/prepareSubChannelPayload.d.ts +15 -0
  122. package/dist/subChannel/utils/prepareSubChannelPayload.d.ts.map +1 -0
  123. package/dist/utils/liveObject.d.ts +1 -1
  124. package/dist/utils/liveObject.d.ts.map +1 -1
  125. package/dist/utils/tests/client.d.ts +1 -0
  126. package/dist/utils/tests/client.d.ts.map +1 -1
  127. package/dist/utils/tests/dummy/channel.d.ts +4 -0
  128. package/dist/utils/tests/dummy/channel.d.ts.map +1 -1
  129. package/dist/utils/tests/dummy/index.d.ts +1 -0
  130. package/dist/utils/tests/dummy/index.d.ts.map +1 -1
  131. package/dist/utils/tests/dummy/marker.d.ts +6 -0
  132. package/dist/utils/tests/dummy/marker.d.ts.map +1 -0
  133. package/dist/utils/tests/dummy/message.d.ts +2 -0
  134. package/dist/utils/tests/dummy/message.d.ts.map +1 -1
  135. package/dist/utils/tests/dummy/subChannel.d.ts +1 -0
  136. package/dist/utils/tests/dummy/subChannel.d.ts.map +1 -1
  137. package/dist/utils/tests/utils.d.ts.map +1 -1
  138. package/package.json +1 -1
  139. package/src/@types/core/events.ts +13 -1
  140. package/src/@types/core/marker.ts +42 -0
  141. package/src/@types/core/model.ts +12 -0
  142. package/src/@types/core/payload.ts +52 -0
  143. package/src/@types/domains/channel.ts +5 -16
  144. package/src/@types/domains/client.ts +2 -0
  145. package/src/@types/domains/marker.ts +15 -0
  146. package/src/@types/domains/message.ts +3 -0
  147. package/src/@types/domains/partials.ts +4 -0
  148. package/src/@types/domains/subChannel.ts +2 -0
  149. package/src/channel/api/addChannelMembers.ts +1 -1
  150. package/src/channel/api/addChannelMembersRole.ts +1 -1
  151. package/src/channel/api/banChannelMembers.ts +1 -1
  152. package/src/channel/api/createChannel.ts +1 -1
  153. package/src/channel/api/getChannel.ts +1 -1
  154. package/src/channel/api/getChannels.ts +1 -1
  155. package/src/channel/api/index.ts +0 -3
  156. package/src/channel/api/joinChannel.ts +1 -1
  157. package/src/channel/api/leaveChannel.ts +1 -1
  158. package/src/channel/api/queryChannelMembers.ts +1 -1
  159. package/src/channel/api/queryChannels.ts +1 -1
  160. package/src/channel/api/removeChannelMembers.ts +1 -1
  161. package/src/channel/api/removeChannelMembersRole.ts +1 -1
  162. package/src/channel/api/tests/addChannelMembers.test.ts +16 -0
  163. package/src/channel/api/tests/createChannel.test.ts +29 -8
  164. package/src/channel/api/tests/getChannel.test.ts +11 -4
  165. package/src/channel/api/tests/getChannels.test.ts +20 -12
  166. package/src/channel/api/tests/queryChannelMembers.test.ts +13 -4
  167. package/src/channel/api/tests/queryChannels.test.ts +19 -9
  168. package/src/channel/api/unbanChannelMembers.ts +1 -1
  169. package/src/channel/api/updateChannel.ts +1 -1
  170. package/src/channel/events/onChannelCreated.ts +2 -2
  171. package/src/channel/events/onChannelDeleted.ts +4 -4
  172. package/src/channel/events/onChannelJoined.ts +2 -2
  173. package/src/channel/events/onChannelLeft.ts +2 -2
  174. package/src/channel/events/onChannelMemberAdded.ts +2 -2
  175. package/src/channel/events/onChannelMemberBanned.ts +3 -3
  176. package/src/channel/events/onChannelMemberRemoved.ts +2 -2
  177. package/src/channel/events/onChannelMemberUnbanned.ts +2 -2
  178. package/src/channel/events/onChannelMuted.ts +2 -2
  179. package/src/channel/events/onChannelUpdated.ts +25 -4
  180. package/src/channel/events/tests/onChannelCreated.test.ts +4 -1
  181. package/src/channel/events/tests/onChannelJoined.test.ts +5 -1
  182. package/src/channel/events/tests/onChannelMemberAdded.test.ts +5 -1
  183. package/src/channel/events/tests/onChannelMemberBanned.test.ts +4 -1
  184. package/src/channel/events/tests/onChannelMemberRemoved.test.ts +5 -1
  185. package/src/channel/events/tests/onChannelMemberUnbanned.test.ts +10 -10
  186. package/src/channel/events/tests/onChannelUpdated.test.ts +5 -1
  187. package/src/channel/observers/tests/liveChannelMembers.test.ts +5 -11
  188. package/src/channel/observers/tests/liveChannels.test.ts +21 -24
  189. package/src/channel/utils/index.ts +1 -57
  190. package/src/channel/utils/prepareChannelPayload.ts +91 -0
  191. package/src/channel/utils/tests/prepareChannelPayload.test.ts +102 -104
  192. package/src/client/api/activeUser.ts +2 -2
  193. package/src/client/api/connectClient.ts +2 -1
  194. package/src/client/api/index.ts +3 -0
  195. package/src/client/api/markerSync.ts +42 -0
  196. package/src/client/observers/getTotalUnreadCount.ts +52 -0
  197. package/src/client/observers/index.ts +1 -0
  198. package/src/client/observers/tests/getTotalUnreadCount.test.ts +126 -0
  199. package/src/client/utils/index.ts +1 -0
  200. package/src/client/utils/markerSyncEngine.ts +179 -0
  201. package/src/comment/api/tests/queryComments.test.ts +2 -2
  202. package/src/core/model/idResolvers.ts +7 -0
  203. package/src/core/model/identifyModel.ts +1 -1
  204. package/src/core/model/index.ts +6 -0
  205. package/src/core/tests/query/query/runQuery.test.ts +3 -1
  206. package/src/group/utils/withUser.ts +2 -2
  207. package/src/index.ts +6 -0
  208. package/src/marker/api/getChannelMarkers.ts +53 -0
  209. package/src/marker/api/getMessageMarkers.ts +54 -0
  210. package/src/marker/api/getSubChannelMarkers.ts +54 -0
  211. package/src/marker/api/getUserMarker.ts +47 -0
  212. package/src/marker/api/index.ts +4 -0
  213. package/src/marker/api/tests/getChannelMarkers.test.ts +109 -0
  214. package/src/marker/api/tests/getMessageMarkers.test.ts +114 -0
  215. package/src/marker/api/tests/getSubChannelMarkers.test.ts +116 -0
  216. package/src/marker/events/index.ts +10 -0
  217. package/src/marker/events/onChannelMarkerFetched.ts +34 -0
  218. package/src/marker/events/onFeedlMarkerFetched.ts +34 -0
  219. package/src/marker/events/onMessageMarkerFetched.ts +34 -0
  220. package/src/marker/events/onSubChannelMarkerFetched.ts +34 -0
  221. package/src/marker/events/onSubChannelMarkerUpdated.ts +34 -0
  222. package/src/marker/events/onUserMarkerFetched.ts +34 -0
  223. package/src/message/api/createMessage.ts +1 -1
  224. package/src/message/api/getMessage.ts +6 -5
  225. package/src/message/api/getMessages.ts +7 -6
  226. package/src/message/api/index.ts +1 -0
  227. package/src/message/api/markAsDelivered.ts +36 -0
  228. package/src/message/api/queryMessages.ts +8 -6
  229. package/src/message/api/tests/createMessage.test.ts +13 -4
  230. package/src/message/api/tests/getMessage.test.ts +12 -3
  231. package/src/message/api/tests/getMessages.test.ts +14 -5
  232. package/src/message/api/tests/markAsDelivered.test.ts +83 -0
  233. package/src/message/api/tests/queryMessages.test.ts +14 -3
  234. package/src/message/api/updateMessage.ts +8 -7
  235. package/src/message/events/index.ts +2 -0
  236. package/src/message/events/onMessageCreated.ts +14 -41
  237. package/src/message/events/onMessageDeleted.ts +2 -2
  238. package/src/message/events/onMessageFlagCleared.ts +2 -2
  239. package/src/message/events/onMessageFlagged.ts +2 -2
  240. package/src/message/events/onMessageReactionAdded.ts +2 -2
  241. package/src/message/events/onMessageReactionRemoved.ts +2 -2
  242. package/src/message/events/onMessageUnflagged.ts +2 -2
  243. package/src/message/events/onMessageUpdated.ts +27 -5
  244. package/src/message/tests/events.test.ts +4 -2
  245. package/src/message/tests/observers/liveMessage.test.ts +22 -10
  246. package/src/message/tests/observers/liveMessages.test.ts +25 -18
  247. package/src/message/utils/index.ts +1 -140
  248. package/src/message/utils/prepareMessagePayload.ts +182 -0
  249. package/src/reaction/events/onReactionAdded.ts +2 -2
  250. package/src/reaction/events/onReactionRemoved.ts +2 -2
  251. package/src/reaction/events/onReactorAdded.ts +2 -2
  252. package/src/reaction/events/onReactorRemoved.ts +2 -2
  253. package/src/report/api/createReport.ts +2 -1
  254. package/src/report/api/deleteReport.ts +2 -1
  255. package/src/subChannel/api/createSubChannel.ts +1 -1
  256. package/src/subChannel/api/getSubChannel.ts +1 -1
  257. package/src/subChannel/api/getSubChannels.ts +2 -1
  258. package/src/subChannel/api/index.ts +3 -0
  259. package/src/subChannel/api/querySubChannels.ts +1 -1
  260. package/src/subChannel/api/startReadingAPI.ts +33 -0
  261. package/src/subChannel/api/stopReadingAPI.ts +33 -0
  262. package/src/subChannel/api/tests/createSubChannel.test.ts +6 -3
  263. package/src/subChannel/api/tests/deleteSubChannel.test.ts +7 -5
  264. package/src/subChannel/api/tests/getSubChannel.test.ts +6 -4
  265. package/src/subChannel/api/tests/getSubChannels.test.ts +6 -3
  266. package/src/subChannel/api/tests/updateSubChannel.test.ts +6 -3
  267. package/src/subChannel/api/updateSubChannel.ts +1 -1
  268. package/src/subChannel/events/onSubChannelCreated.ts +2 -2
  269. package/src/subChannel/events/onSubChannelDeleted.ts +2 -2
  270. package/src/subChannel/events/onSubChannelUpdated.ts +43 -4
  271. package/src/subChannel/observers/liveSubChannel.ts +2 -0
  272. package/src/subChannel/observers/tests/liveSubChannel.test.ts +15 -10
  273. package/src/subChannel/observers/tests/liveSubChannels.test.ts +21 -14
  274. package/src/subChannel/utils/index.ts +2 -50
  275. package/src/subChannel/utils/markReadEngine.ts +117 -0
  276. package/src/subChannel/utils/prepareSubChannelPayload.ts +132 -0
  277. package/src/utils/liveObject.ts +15 -4
  278. package/src/utils/tests/client.ts +3 -1
  279. package/src/utils/tests/dummy/channel.ts +38 -21
  280. package/src/utils/tests/dummy/index.ts +1 -0
  281. package/src/utils/tests/dummy/marker.ts +68 -0
  282. package/src/utils/tests/dummy/message.ts +43 -3
  283. package/src/utils/tests/dummy/subChannel.ts +16 -5
  284. package/src/utils/tests/utils.ts +4 -1
  285. package/dist/channel/api/startReading.d.ts +0 -17
  286. package/dist/channel/api/startReading.d.ts.map +0 -1
  287. package/dist/channel/api/stopReading.d.ts +0 -16
  288. package/dist/channel/api/stopReading.d.ts.map +0 -1
  289. package/dist/channel/api/tests/startReading.test.d.ts +0 -2
  290. package/dist/channel/api/tests/startReading.test.d.ts.map +0 -1
  291. package/dist/channel/api/tests/stopReading.test.d.ts +0 -2
  292. package/dist/channel/api/tests/stopReading.test.d.ts.map +0 -1
  293. package/src/channel/api/startReading.ts +0 -57
  294. package/src/channel/api/stopReading.ts +0 -53
  295. package/src/channel/api/tests/startReading.test.ts +0 -25
  296. package/src/channel/api/tests/stopReading.test.ts +0 -25
@@ -0,0 +1,109 @@
1
+ import { disableCache, enableCache, pullFromCache } from '~/cache/api';
2
+ import { ASCApiError } from '~/core/errors';
3
+ import { getResolver } from '~/core/model';
4
+ import { onUserMarkerFetched } from '~/marker/events';
5
+ import { onChannelMarkerFetched } from '~/marker/events/onChannelMarkerFetched';
6
+ import { client, generateChannelMarker, generateUserMarker } from '~/utils/tests';
7
+
8
+ import { getChannelMarkers } from '../getChannelMarkers';
9
+
10
+ const pagingToken = {
11
+ previous: 'eyJiZWZvcmUiOjU1LCJsYXN0IjoxMH0=',
12
+ next: 'eyJiZWZvcmUiOjU1LCJsYXN0IjoxMH0=',
13
+ };
14
+
15
+ const pagingCriteria = { limit: 10 };
16
+
17
+ const userId = 'user1';
18
+
19
+ const expectedChannelMarkers = [
20
+ generateChannelMarker({ entityId: 'ch1', userId }),
21
+ generateChannelMarker({ entityId: 'ch2', userId }),
22
+ ];
23
+
24
+ const expectedUserMarkers = [generateUserMarker({ userId: 'currentUser1' })];
25
+
26
+ const channelIds = expectedChannelMarkers.map(({ entityId }) => entityId);
27
+
28
+ const resolvedGetValue = {
29
+ data: {
30
+ userEntityMarkers: expectedChannelMarkers,
31
+ userMarkers: expectedUserMarkers,
32
+ paging: pagingToken,
33
+ },
34
+ };
35
+
36
+ describe('getChannelMarkers', () => {
37
+ it('should return channel markers', async () => {
38
+ client.http.get = jest.fn().mockResolvedValue(resolvedGetValue);
39
+
40
+ const { data } = await getChannelMarkers(channelIds);
41
+
42
+ expect(data).toEqual(expectedChannelMarkers);
43
+ });
44
+
45
+ test('should return fetched channel markers with correct paging', async () => {
46
+ client.http.get = jest.fn().mockResolvedValueOnce(resolvedGetValue);
47
+
48
+ await expect(getChannelMarkers(channelIds, pagingCriteria)).resolves.toEqual(
49
+ expect.objectContaining({
50
+ data: expectedChannelMarkers,
51
+ prevPage: { before: 55, limit: 10 },
52
+ nextPage: { before: 55, limit: 10 },
53
+ }),
54
+ );
55
+ });
56
+
57
+ test('should update cache after fetching channelMarkers ', async () => {
58
+ enableCache();
59
+ client.http.get = jest.fn().mockResolvedValue(resolvedGetValue);
60
+
61
+ await getChannelMarkers(channelIds);
62
+ const cacheKeyResolver = getResolver('channelMarker');
63
+
64
+ const received = channelIds.map(
65
+ entityId =>
66
+ pullFromCache(['channelMarker', 'get', cacheKeyResolver({ entityId, userId })])?.data,
67
+ );
68
+
69
+ expect(received).toEqual(expectedChannelMarkers);
70
+
71
+ disableCache();
72
+ });
73
+
74
+ test('should throw an error if request fails', async () => {
75
+ client.http.get = jest
76
+ .fn()
77
+ .mockRejectedValueOnce(
78
+ new ASCApiError('Not Found', Amity.ServerError.ITEM_NOT_FOUND, Amity.ErrorLevel.ERROR),
79
+ );
80
+
81
+ await expect(getChannelMarkers(channelIds)).rejects.toThrow('Amity SDK (400400): Not Found');
82
+ });
83
+
84
+ test('should fire event `onChannelMarkerFetched`', async () => {
85
+ let dispose;
86
+ client.http.get = jest.fn().mockResolvedValue(resolvedGetValue);
87
+
88
+ const callbackPromise = new Promise(resolve => {
89
+ dispose = onChannelMarkerFetched(resolve);
90
+ }).finally(dispose);
91
+
92
+ await getChannelMarkers(channelIds);
93
+
94
+ await expect(callbackPromise).resolves.toMatchObject(expectedChannelMarkers[0]);
95
+ });
96
+
97
+ test('should fire event `onUserMarkerFetched`', async () => {
98
+ let dispose;
99
+ client.http.get = jest.fn().mockResolvedValue(resolvedGetValue);
100
+
101
+ const callbackPromise = new Promise(resolve => {
102
+ dispose = onUserMarkerFetched(resolve);
103
+ }).finally(dispose);
104
+
105
+ await getChannelMarkers(channelIds);
106
+
107
+ await expect(callbackPromise).resolves.toMatchObject(expectedUserMarkers[0]);
108
+ });
109
+ });
@@ -0,0 +1,114 @@
1
+ import { disableCache, enableCache, pullFromCache } from '~/cache/api';
2
+ import { ASCApiError } from '~/core/errors';
3
+ import { getResolver } from '~/core/model';
4
+ import { onMessageMarkerFetched, onUserMarkerFetched } from '~/marker/events';
5
+ import {
6
+ client,
7
+ generateFeedMarker,
8
+ generateMessageMarker,
9
+ generateUserMarker,
10
+ } from '~/utils/tests';
11
+
12
+ import { getMessageMarkers } from '../getMessageMarkers';
13
+
14
+ const pagingToken = {
15
+ previous: 'eyJiZWZvcmUiOjU1LCJsYXN0IjoxMH0=',
16
+ next: 'eyJiZWZvcmUiOjU1LCJsYXN0IjoxMH0=',
17
+ };
18
+
19
+ const pagingCriteria = { limit: 10 };
20
+
21
+ const expectedMessageMarkers = [
22
+ generateMessageMarker({ feedId: 'sub-ch1', contentId: 'message1' }),
23
+ generateMessageMarker({ feedId: 'sub-ch1', contentId: 'message2' }),
24
+ ];
25
+
26
+ const expectedFeedMarkers = [generateFeedMarker({ feedId: 'sub-ch1', entityId: 'feed1' })];
27
+
28
+ const expectedUserMarkers = [generateUserMarker({ userId: 'currentUser1' })];
29
+
30
+ const messageIds = expectedMessageMarkers.map(({ contentId }) => contentId);
31
+ const messageMarkerResolver = getResolver('messageMarker');
32
+ const messageMarkerCacheIds = expectedMessageMarkers.map(messageMarkerResolver);
33
+
34
+ const resolvedGetValue = {
35
+ data: {
36
+ contentMarkers: expectedMessageMarkers,
37
+ feedMarkers: expectedFeedMarkers,
38
+ userMarkers: expectedUserMarkers,
39
+ paging: pagingToken,
40
+ } as Amity.MessageMarkerPayload,
41
+ };
42
+
43
+ describe('getMessageMarkers', () => {
44
+ it('should return message markers', async () => {
45
+ client.http.get = jest.fn().mockResolvedValue(resolvedGetValue);
46
+
47
+ const { data } = await getMessageMarkers(messageIds);
48
+
49
+ expect(data).toEqual(expectedMessageMarkers);
50
+ });
51
+
52
+ test('should return fetched message markers with correct paging', async () => {
53
+ client.http.get = jest.fn().mockResolvedValueOnce(resolvedGetValue);
54
+
55
+ await expect(getMessageMarkers(messageIds, pagingCriteria)).resolves.toEqual(
56
+ expect.objectContaining({
57
+ data: expectedMessageMarkers,
58
+ prevPage: { before: 55, limit: 10 },
59
+ nextPage: { before: 55, limit: 10 },
60
+ }),
61
+ );
62
+ });
63
+
64
+ test('should update cache after fetching message markers ', async () => {
65
+ enableCache();
66
+
67
+ client.http.get = jest.fn().mockResolvedValue(resolvedGetValue);
68
+
69
+ await getMessageMarkers(messageIds);
70
+ const received = messageMarkerCacheIds.map(
71
+ id => pullFromCache(['messageMarker', 'get', id])?.data,
72
+ );
73
+
74
+ expect(received).toEqual(expectedMessageMarkers);
75
+
76
+ disableCache();
77
+ });
78
+
79
+ test('should throw an error if request fails', async () => {
80
+ client.http.get = jest
81
+ .fn()
82
+ .mockRejectedValueOnce(
83
+ new ASCApiError('Not Found', Amity.ServerError.ITEM_NOT_FOUND, Amity.ErrorLevel.ERROR),
84
+ );
85
+
86
+ await expect(getMessageMarkers(messageIds)).rejects.toThrow('Amity SDK (400400): Not Found');
87
+ });
88
+
89
+ test('should fire event `onMessageMarkerFetched`', async () => {
90
+ let dispose;
91
+ client.http.get = jest.fn().mockResolvedValue(resolvedGetValue);
92
+
93
+ const callbackPromise = new Promise(resolve => {
94
+ dispose = onMessageMarkerFetched(resolve);
95
+ }).finally(dispose);
96
+
97
+ await getMessageMarkers(messageIds);
98
+
99
+ await expect(callbackPromise).resolves.toMatchObject(expectedMessageMarkers[0]);
100
+ });
101
+
102
+ test('should fire event `onUserMarkerFetched`', async () => {
103
+ let dispose;
104
+ client.http.get = jest.fn().mockResolvedValue(resolvedGetValue);
105
+
106
+ const callbackPromise = new Promise(resolve => {
107
+ dispose = onUserMarkerFetched(resolve);
108
+ }).finally(dispose);
109
+
110
+ await getMessageMarkers(messageIds);
111
+
112
+ await expect(callbackPromise).resolves.toMatchObject(expectedUserMarkers[0]);
113
+ });
114
+ });
@@ -0,0 +1,116 @@
1
+ import { disableCache, enableCache, pullFromCache } from '~/cache/api';
2
+ import { ASCApiError } from '~/core/errors';
3
+ import { getResolver } from '~/core/model';
4
+ import { onSubChannelMarkerFetched, onUserMarkerFetched } from '~/marker/events';
5
+ import {
6
+ client,
7
+ generateChannelMarker,
8
+ generateSubChannelMarker,
9
+ generateUserMarker,
10
+ } from '~/utils/tests';
11
+
12
+ import { getSubChannelMarkers } from '../getSubChannelMarkers';
13
+
14
+ const pagingToken = {
15
+ previous: 'eyJiZWZvcmUiOjU1LCJsYXN0IjoxMH0=',
16
+ next: 'eyJiZWZvcmUiOjU1LCJsYXN0IjoxMH0=',
17
+ };
18
+
19
+ const pagingCriteria = { limit: 10 };
20
+
21
+ const expectedSubChannelMarkers = [
22
+ generateSubChannelMarker({ feedId: 'sub-ch1', entityId: 'ch1' }),
23
+ generateSubChannelMarker({ feedId: 'sub-ch2', entityId: 'ch1' }),
24
+ ];
25
+
26
+ const expectedChannelMarkers = [generateChannelMarker({ entityId: 'ch1', userId: 'user1' })];
27
+
28
+ const expectedUserMarkers = [generateUserMarker({ userId: 'currentUser1' })];
29
+
30
+ const subChannelIds = expectedSubChannelMarkers.map(({ feedId }) => feedId);
31
+ const subChannelMarkerResolver = getResolver('subChannelMarker');
32
+ const subChannelMarkerCacheIds = expectedSubChannelMarkers.map(subChannelMarkerResolver);
33
+
34
+ const resolvedGetValue = {
35
+ data: {
36
+ userFeedMarkers: expectedSubChannelMarkers,
37
+ userEntityMarkers: expectedChannelMarkers,
38
+ userMarkers: expectedUserMarkers,
39
+ paging: pagingToken,
40
+ } as Amity.SubChannelMarkerPayload,
41
+ };
42
+
43
+ describe('getSubChannelMarkers', () => {
44
+ it('should return sub channel markers', async () => {
45
+ client.http.get = jest.fn().mockResolvedValue(resolvedGetValue);
46
+
47
+ const { data } = await getSubChannelMarkers(subChannelIds);
48
+
49
+ expect(data).toEqual(expectedSubChannelMarkers);
50
+ });
51
+
52
+ test('should return fetched sub channel markers with correct paging', async () => {
53
+ client.http.get = jest.fn().mockResolvedValueOnce(resolvedGetValue);
54
+
55
+ await expect(getSubChannelMarkers(subChannelIds, pagingCriteria)).resolves.toEqual(
56
+ expect.objectContaining({
57
+ data: expectedSubChannelMarkers,
58
+ prevPage: { before: 55, limit: 10 },
59
+ nextPage: { before: 55, limit: 10 },
60
+ }),
61
+ );
62
+ });
63
+
64
+ test('should update cache after fetching sub channel markers ', async () => {
65
+ enableCache();
66
+
67
+ client.http.get = jest.fn().mockResolvedValue(resolvedGetValue);
68
+
69
+ await getSubChannelMarkers(subChannelIds);
70
+ const received = subChannelMarkerCacheIds.map(
71
+ id => pullFromCache(['subChannelMarker', 'get', id])?.data,
72
+ );
73
+
74
+ expect(received).toEqual(expectedSubChannelMarkers);
75
+
76
+ disableCache();
77
+ });
78
+
79
+ test('should throw an error if request fails', async () => {
80
+ client.http.get = jest
81
+ .fn()
82
+ .mockRejectedValueOnce(
83
+ new ASCApiError('Not Found', Amity.ServerError.ITEM_NOT_FOUND, Amity.ErrorLevel.ERROR),
84
+ );
85
+
86
+ await expect(getSubChannelMarkers(subChannelIds)).rejects.toThrow(
87
+ 'Amity SDK (400400): Not Found',
88
+ );
89
+ });
90
+
91
+ test('should fire event `onSubChannelMarkerFetched`', async () => {
92
+ let dispose;
93
+ client.http.get = jest.fn().mockResolvedValue(resolvedGetValue);
94
+
95
+ const callbackPromise = new Promise(resolve => {
96
+ dispose = onSubChannelMarkerFetched(resolve);
97
+ }).finally(dispose);
98
+
99
+ await getSubChannelMarkers(subChannelIds);
100
+
101
+ await expect(callbackPromise).resolves.toMatchObject(expectedSubChannelMarkers[0]);
102
+ });
103
+
104
+ test('should fire event `onUserMarkerFetched`', async () => {
105
+ let dispose;
106
+ client.http.get = jest.fn().mockResolvedValue(resolvedGetValue);
107
+
108
+ const callbackPromise = new Promise(resolve => {
109
+ dispose = onUserMarkerFetched(resolve);
110
+ }).finally(dispose);
111
+
112
+ await getSubChannelMarkers(subChannelIds);
113
+
114
+ await expect(callbackPromise).resolves.toMatchObject(expectedUserMarkers[0]);
115
+ });
116
+ });
@@ -0,0 +1,10 @@
1
+ export * from './onChannelMarkerFetched';
2
+
3
+ export * from './onSubChannelMarkerFetched';
4
+ export * from './onSubChannelMarkerUpdated';
5
+
6
+ export * from './onFeedlMarkerFetched';
7
+
8
+ export * from './onUserMarkerFetched';
9
+
10
+ export * from './onMessageMarkerFetched';
@@ -0,0 +1,34 @@
1
+ import { getActiveClient } from '~/client/api';
2
+ import { createEventSubscriber } from '~/core/events';
3
+
4
+ /**
5
+ * ```js
6
+ * import { onChannelMarkerFetched } from '@amityco/ts-sdk'
7
+ * const dispose = onChannelMarkerFetched(channelMarker => {
8
+ * // ...
9
+ * })
10
+ * ```
11
+ *
12
+ * Fired when an {@link Amity.ChannelMarker} has been fetched
13
+ *
14
+ * @param callback The function to call when the event was fired
15
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
16
+ *
17
+ * @category ChannelMarker Events
18
+ */
19
+ export const onChannelMarkerFetched = (
20
+ callback: Amity.Listener<Amity.ChannelMarker>,
21
+ ): Amity.Unsubscriber => {
22
+ const client = getActiveClient();
23
+
24
+ const filter = (payload: Amity.Events['local.channelMarker.fetched']) => {
25
+ callback(payload.userEntityMarkers[0]);
26
+ };
27
+
28
+ return createEventSubscriber(
29
+ client,
30
+ 'channelMarker/onChannelMarkerFetched',
31
+ 'local.channelMarker.fetched',
32
+ filter,
33
+ );
34
+ };
@@ -0,0 +1,34 @@
1
+ import { getActiveClient } from '~/client/api';
2
+ import { createEventSubscriber } from '~/core/events';
3
+
4
+ /**
5
+ * ```js
6
+ * import { onFeedMarkerFetched } from '@amityco/ts-sdk'
7
+ * const dispose = onFeedMarkerFetched(feedMarker => {
8
+ * // ...
9
+ * })
10
+ * ```
11
+ *
12
+ * Fired when an {@link Amity.FeedMarker} has been fetched
13
+ *
14
+ * @param callback The function to call when the event was fired
15
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
16
+ *
17
+ * @category FeedMarker Events
18
+ */
19
+ export const onFeedMarkerFetched = (
20
+ callback: Amity.Listener<Amity.FeedMarker>,
21
+ ): Amity.Unsubscriber => {
22
+ const client = getActiveClient();
23
+
24
+ const filter = (payload: Amity.Events['local.feedMarker.fetched']) => {
25
+ callback(payload.feedMarkers[0]);
26
+ };
27
+
28
+ return createEventSubscriber(
29
+ client,
30
+ 'feedMarker/onFeedMarkerFetched',
31
+ 'local.feedMarker.fetched',
32
+ filter,
33
+ );
34
+ };
@@ -0,0 +1,34 @@
1
+ import { getActiveClient } from '~/client/api';
2
+ import { createEventSubscriber } from '~/core/events';
3
+
4
+ /**
5
+ * ```js
6
+ * import { onMessageMarkerFetched } from '@amityco/ts-sdk'
7
+ * const dispose = onMessageMarkerFetched(messageMarker => {
8
+ * // ...
9
+ * })
10
+ * ```
11
+ *
12
+ * Fired when an {@link Amity.MessageMarker} has been fetched
13
+ *
14
+ * @param callback The function to call when the event was fired
15
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
16
+ *
17
+ * @category MessageMarker Events
18
+ */
19
+ export const onMessageMarkerFetched = (
20
+ callback: Amity.Listener<Amity.MessageMarker>,
21
+ ): Amity.Unsubscriber => {
22
+ const client = getActiveClient();
23
+
24
+ const filter = (payload: Amity.Events['local.messageMarker.fetched']) => {
25
+ callback(payload.contentMarkers[0]);
26
+ };
27
+
28
+ return createEventSubscriber(
29
+ client,
30
+ 'messageMarker/onMessageMarkerFetched',
31
+ 'local.messageMarker.fetched',
32
+ filter,
33
+ );
34
+ };
@@ -0,0 +1,34 @@
1
+ import { getActiveClient } from '~/client/api';
2
+ import { createEventSubscriber } from '~/core/events';
3
+
4
+ /**
5
+ * ```js
6
+ * import { onSubChannelMarkerFetched } from '@amityco/ts-sdk'
7
+ * const dispose = onSubChannelMarkerFetched(subChannelMarker => {
8
+ * // ...
9
+ * })
10
+ * ```
11
+ *
12
+ * Fired when an {@link Amity.SubChannelMarker} has been fetched
13
+ *
14
+ * @param callback The function to call when the event was fired
15
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
16
+ *
17
+ * @category SubChannelMarker Events
18
+ */
19
+ export const onSubChannelMarkerFetched = (
20
+ callback: Amity.Listener<Amity.SubChannelMarker>,
21
+ ): Amity.Unsubscriber => {
22
+ const client = getActiveClient();
23
+
24
+ const filter = (payload: Amity.Events['local.subChannelMarker.fetched']) => {
25
+ callback(payload.userFeedMarkers[0]);
26
+ };
27
+
28
+ return createEventSubscriber(
29
+ client,
30
+ 'subChannelMarker/onSubChannelMarkerFetched',
31
+ 'local.subChannelMarker.fetched',
32
+ filter,
33
+ );
34
+ };
@@ -0,0 +1,34 @@
1
+ import { getActiveClient } from '~/client/api';
2
+ import { createEventSubscriber } from '~/core/events';
3
+
4
+ /**
5
+ * ```js
6
+ * import { onSubChannelMarkerUpdated } from '@amityco/ts-sdk'
7
+ * const dispose = onSubChannelMarkerUpdated(subChannelMarker => {
8
+ * // ...
9
+ * })
10
+ * ```
11
+ *
12
+ * Fired when an {@link Amity.SubChannelMarker} has been updated
13
+ *
14
+ * @param callback The function to call when the event was fired
15
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
16
+ *
17
+ * @category SubChannelMarker Events
18
+ */
19
+ export const onSubChannelMarkerUpdated = (
20
+ callback: Amity.Listener<Amity.SubChannelMarker>,
21
+ ): Amity.Unsubscriber => {
22
+ const client = getActiveClient();
23
+
24
+ const filter = (payload: Amity.Events['local.subChannelMarker.updated']) => {
25
+ callback(payload.userFeedMarkers[0]);
26
+ };
27
+
28
+ return createEventSubscriber(
29
+ client,
30
+ 'subChannelMarker/onSubChannelMarkerUpdated',
31
+ 'local.subChannelMarker.updated',
32
+ filter,
33
+ );
34
+ };
@@ -0,0 +1,34 @@
1
+ import { getActiveClient } from '~/client/api';
2
+ import { createEventSubscriber } from '~/core/events';
3
+
4
+ /**
5
+ * ```js
6
+ * import { onUserMarkerFetched } from '@amityco/ts-sdk'
7
+ * const dispose = onUserMarkerFetched(userMarker => {
8
+ * // ...
9
+ * })
10
+ * ```
11
+ *
12
+ * Fired when an {@link Amity.UserMarker} has been fetched
13
+ *
14
+ * @param callback The function to call when the event was fired
15
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
16
+ *
17
+ * @category UserMarker Events
18
+ */
19
+ export const onUserMarkerFetched = (
20
+ callback: Amity.Listener<Amity.UserMarker>,
21
+ ): Amity.Unsubscriber => {
22
+ const client = getActiveClient();
23
+
24
+ const filter = (payload: Amity.Events['local.userMarker.fetched']) => {
25
+ callback(payload.userMarkers[0]);
26
+ };
27
+
28
+ return createEventSubscriber(
29
+ client,
30
+ 'userMarker/onUserMarkerFetched',
31
+ 'local.userMarker.fetched',
32
+ filter,
33
+ );
34
+ };
@@ -68,7 +68,7 @@ export const createMessage = async <T extends Amity.MessageContentType>(
68
68
  referenceId,
69
69
  });
70
70
 
71
- const data = prepareMessagePayload(payload);
71
+ const data = await prepareMessagePayload(payload);
72
72
  const { messages } = data;
73
73
 
74
74
  const cachedAt = client.cache && Date.now();
@@ -7,7 +7,8 @@ import { ingestInCache } from '~/cache/api/ingestInCache';
7
7
  import { isInTombstone } from '~/cache/api/isInTombstone';
8
8
  import { checkIfShouldGoesToTombstone } from '~/cache/utils';
9
9
  import { pushToTombstone } from '~/cache/api/pushToTombstone';
10
- import { convertResponseFromRaw } from '../utils';
10
+
11
+ import { prepareMessagePayload } from '../utils';
11
12
 
12
13
  /* begin_public_function
13
14
  id: message.get
@@ -45,11 +46,11 @@ export const getMessage = async (
45
46
 
46
47
  try {
47
48
  // API-FIX: endpoint should not be /list, parameters should be querystring.
48
- const response = await client.http
49
- .get<Amity.MessagePayload>(`/api/v5/messages/${encodeURIComponent(messageId)}`)
50
- .then(convertResponseFromRaw);
49
+ const { data: payload } = await client.http.get<Amity.MessagePayload>(
50
+ `/api/v5/messages/${encodeURIComponent(messageId)}`,
51
+ );
51
52
 
52
- data = response.data;
53
+ data = await prepareMessagePayload(payload);
53
54
  } catch (error) {
54
55
  if (checkIfShouldGoesToTombstone((error as Amity.ErrorResponse)?.code)) {
55
56
  pushToTombstone('message', messageId);
@@ -3,7 +3,8 @@ import { getActiveClient } from '~/client/api';
3
3
  import { fireEvent } from '~/core/events';
4
4
  import { pullFromCache } from '~/cache/api';
5
5
  import { ingestInCache } from '~/cache/api/ingestInCache';
6
- import { convertResponseFromRaw } from '../utils';
6
+
7
+ import { prepareMessagePayload } from '../utils';
7
8
 
8
9
  /**
9
10
  * ```js
@@ -25,11 +26,11 @@ export const getMessages = async (
25
26
  const client = getActiveClient();
26
27
  client.log('message/getMessages', messageIds);
27
28
 
28
- const { data } = await client.http
29
- .get<Amity.MessagePayload>(`/api/v5/messages/list`, {
30
- params: { messageIds: messageIds.map(encodeURIComponent) },
31
- })
32
- .then(convertResponseFromRaw);
29
+ const { data: payload } = await client.http.get<Amity.MessagePayload>(`/api/v5/messages/list`, {
30
+ params: { messageIds: messageIds.map(encodeURIComponent) },
31
+ });
32
+
33
+ const data = await prepareMessagePayload(payload);
33
34
 
34
35
  const cachedAt = client.cache && Date.now();
35
36
  if (client.cache) ingestInCache(data, { cachedAt });
@@ -4,3 +4,4 @@ export * from './queryMessages';
4
4
  export * from './createMessage';
5
5
  export * from './updateMessage';
6
6
  export * from './deleteMessage';
7
+ export * from './markAsDelivered';
@@ -0,0 +1,36 @@
1
+ import { getActiveClient } from '~/client/api';
2
+ import { ingestInCache } from '~/cache/api/ingestInCache';
3
+
4
+ /**
5
+ * ```js
6
+ * import { markAsDelivered } from '@amityco/ts-sdk'
7
+ * const success = await markAsDelivered('subChannelId', 'messageId')
8
+ * ```
9
+ *
10
+ * Update `deliveredToSegment` in {@link Amity.SubChannelMarker}
11
+ *
12
+ * @param subChannelId the ID of the {@link Amity.SubChannel} of message
13
+ * @param messageId the ID of the {@link Amity.Message} to mark delivered
14
+ * @returns A success boolean if the {@link Amity.SubChannel} was updated
15
+ *
16
+ * @category Message API
17
+ * @async
18
+ */
19
+ export const markAsDelivered = async (
20
+ subChannelId: Amity.Message['subChannelId'],
21
+ messageId: Amity.Message['messageId'],
22
+ ): Promise<boolean> => {
23
+ const client = getActiveClient();
24
+ client.log('message/markAsDelivered', subChannelId, messageId);
25
+
26
+ const { data } = await client.http.put<Amity.MarkDeliveredPayload>(
27
+ `/api/v1/markers/message-feeds/${subChannelId}/mark-delivering`,
28
+ { messageId },
29
+ );
30
+
31
+ const cachedAt = client.cache && Date.now();
32
+
33
+ if (client.cache) ingestInCache(data, { cachedAt });
34
+
35
+ return true;
36
+ };