@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
@@ -5,7 +5,7 @@ import { toPageRaw } from '~/core/query';
5
5
  import { pullFromCache, pushToCache } from '~/cache/api';
6
6
  import { ingestInCache } from '~/cache/api/ingestInCache';
7
7
  import { getResolver } from '~/core/model';
8
- import { convertQueryParams, convertResponseFromRaw } from '../utils';
8
+ import { convertQueryParams, prepareMessagePayload } from '../utils';
9
9
 
10
10
  /* begin_public_function
11
11
  id: message.query
@@ -36,19 +36,21 @@ export const queryMessages = async (
36
36
  // API-FIX: backend should answer Amity.Response (2)
37
37
  // API-FIX: pagination should not be indexed on channelSegment (3)
38
38
  // const { data } = await client.http.get<Amity.Response<Amity.Paged<Amity.MessagePayload>>>(
39
- const response = await client.http
40
- .get<Amity.MessagePayload & Amity.Pagination>(`/api/v5/messages`, { params })
41
- .then(convertResponseFromRaw);
39
+ const { data: queryPayload } = await client.http.get<Amity.MessagePayload & Amity.Pagination>(
40
+ `/api/v5/messages`,
41
+ { params },
42
+ );
42
43
 
43
44
  // API-FIX: backend should answer Amity.Response (2)
44
45
  // const { paging, messages } = unwrapPayload(data)
45
- const { paging, ...data } = response.data;
46
+ const { paging, ...payload } = queryPayload;
47
+ const data = await prepareMessagePayload(payload);
46
48
  const { messages } = data;
47
49
 
48
50
  const cachedAt = client.cache && Date.now();
49
51
 
50
52
  if (client.cache) {
51
- ingestInCache(data as Amity.ProcessedMessagePayload, { cachedAt });
53
+ ingestInCache(data, { cachedAt });
52
54
 
53
55
  const cacheKey = ['message', 'query', params as Amity.Serializable];
54
56
  pushToCache(cacheKey, { messages: messages.map(getResolver('message')), paging });
@@ -2,18 +2,28 @@ import { ASCApiError } from '~/core/errors';
2
2
  import { UNSYNCED_OBJECT_CACHED_AT_VALUE } from '~/utils/constants';
3
3
  import { disableCache, enableCache, pullFromCache, pushToCache } from '~/cache/api';
4
4
 
5
- import { client, generateRawMessage, pause } from '~/utils/tests';
6
-
5
+ import { client, convertRawMessage, generateRawMessage, pause } from '~/utils/tests';
7
6
  import { createQuery, runQuery } from '~/core/query';
7
+
8
8
  import { convertFromRaw } from '../../utils';
9
9
  import { onMessageCreated } from '../../events';
10
10
  import { createMessage } from '../createMessage';
11
+ import * as getMessageMarkers from '../../../marker/api/getMessageMarkers';
11
12
 
12
13
  const rawMessageToCreate = generateRawMessage();
13
- const messageToCreate = convertFromRaw(rawMessageToCreate);
14
+ const messageToCreate = convertRawMessage(rawMessageToCreate);
14
15
  const { messageId, uniqueId, ...messageWithoutId } = messageToCreate;
15
16
 
16
17
  describe('createMessage', () => {
18
+ beforeAll(() => {
19
+ jest.spyOn(getMessageMarkers, 'getMessageMarkers').mockImplementation(() =>
20
+ Promise.resolve({
21
+ data: [],
22
+ cachedAt: undefined,
23
+ }),
24
+ );
25
+ });
26
+
17
27
  const bundle = {
18
28
  data: messageToCreate.data,
19
29
  dataType: messageToCreate.dataType,
@@ -26,7 +36,6 @@ describe('createMessage', () => {
26
36
  };
27
37
 
28
38
  beforeEach(enableCache);
29
-
30
39
  afterEach(disableCache);
31
40
 
32
41
  // integration_test_id: 9691969d-6ba8-4af6-93d6-dfe9134e9796
@@ -2,14 +2,14 @@ import { disableCache, enableCache, pullFromCache, pushToCache } from '~/cache/a
2
2
  import { isInTombstone } from '~/cache/api/isInTombstone';
3
3
  import { pushToTombstone } from '~/cache/api/pushToTombstone';
4
4
  import { ASCApiError } from '~/core/errors';
5
- import { client, generateRawMessage } from '~/utils/tests';
5
+ import { client, convertRawMessage, generateRawMessage } from '~/utils/tests';
6
6
 
7
7
  import { getMessage } from '../getMessage';
8
8
  import { onMessageFetched } from '../../events/onMessageFetched';
9
- import { convertFromRaw } from '../../utils';
9
+ import * as getMessageMarkers from '../../../marker/api/getMessageMarkers';
10
10
 
11
11
  const rawMessageToGet = generateRawMessage();
12
- const messageToGet = convertFromRaw(rawMessageToGet);
12
+ const messageToGet = convertRawMessage(rawMessageToGet);
13
13
  const { messageId } = messageToGet;
14
14
 
15
15
  const getResolvedMessageValue = () => ({
@@ -21,6 +21,15 @@ const getResolvedMessageValue = () => ({
21
21
  });
22
22
 
23
23
  describe('getMessage', () => {
24
+ beforeAll(() => {
25
+ jest.spyOn(getMessageMarkers, 'getMessageMarkers').mockImplementation(() =>
26
+ Promise.resolve({
27
+ data: [],
28
+ cachedAt: undefined,
29
+ }),
30
+ );
31
+ });
32
+
24
33
  // integration_test_id: bc048747-17ea-43fe-9f97-7b2bf008c476
25
34
  test('should return fetched message', async () => {
26
35
  client.http.get = jest.fn().mockResolvedValueOnce(getResolvedMessageValue());
@@ -1,13 +1,13 @@
1
1
  import { disableCache, enableCache, pullFromCache, pushToCache } from '~/cache/api';
2
2
  import { ASCApiError } from '~/core/errors';
3
- import { client, generateRawMessage } from '~/utils/tests';
3
+ import { client, convertRawMessage, generateRawMessage } from '~/utils/tests';
4
4
 
5
5
  import { getMessages } from '../getMessages';
6
6
  import { onMessageFetched } from '../../events/onMessageFetched';
7
- import { convertFromRaw } from '../../utils';
7
+ import * as getMessageMarkers from '../../../marker/api/getMessageMarkers';
8
8
 
9
9
  const rawMessagesToGet = [generateRawMessage(), generateRawMessage({ messageId: 'message-id-2' })];
10
- const messagesToGet = rawMessagesToGet.map(convertFromRaw);
10
+ const messagesToGet = rawMessagesToGet.map(convertRawMessage);
11
11
  const messageIds = messagesToGet.map(x => x.messageId);
12
12
 
13
13
  const getResolvedMessageValue = () => ({
@@ -19,6 +19,15 @@ const getResolvedMessageValue = () => ({
19
19
  });
20
20
 
21
21
  describe('getMessages', () => {
22
+ beforeAll(() => {
23
+ jest.spyOn(getMessageMarkers, 'getMessageMarkers').mockImplementation(() =>
24
+ Promise.resolve({
25
+ data: [],
26
+ cachedAt: undefined,
27
+ }),
28
+ );
29
+ });
30
+
22
31
  test('should return fetched messages', async () => {
23
32
  client.http.get = jest.fn().mockResolvedValueOnce(getResolvedMessageValue());
24
33
 
@@ -67,8 +76,8 @@ describe('getMessages tombostone', () => {
67
76
  });
68
77
 
69
78
  describe('getMessages.locally', () => {
70
- beforeEach(() => enableCache());
71
- afterEach(() => disableCache());
79
+ beforeEach(enableCache);
80
+ afterEach(enableCache);
72
81
 
73
82
  test('should return cached messages', () => {
74
83
  messagesToGet.forEach(message => pushToCache(['message', 'get', message.messageId], message));
@@ -0,0 +1,83 @@
1
+ import { pullFromCache, enableCache, disableCache } from '~/cache/api';
2
+ import { getResolver } from '~/core/model';
3
+
4
+ import {
5
+ client,
6
+ connectClient,
7
+ disconnectClient,
8
+ generateFeedMarker,
9
+ generateUserMarker,
10
+ generateChannelMarker,
11
+ generateSubChannelMarker,
12
+ activeUser,
13
+ } from '~/utils/tests';
14
+
15
+ import { markAsDelivered } from '../markAsDelivered';
16
+
17
+ const { userId } = activeUser;
18
+ const entityId = 'feed1';
19
+ const feedId = 'sub-ch1';
20
+ const messageId = 'message1';
21
+
22
+ const expectedUserMarker = generateUserMarker({ userId });
23
+ const expectedChannelMarker = generateChannelMarker({ userId, entityId });
24
+ const expectedSubChannelMarker = generateSubChannelMarker({ userId, feedId, entityId });
25
+ const expectedFeedMarker = generateFeedMarker({ feedId, entityId });
26
+
27
+ const resolvedPutValue = {
28
+ data: {
29
+ userMarkers: [expectedUserMarker],
30
+ userEntityMarkers: [expectedChannelMarker],
31
+ userFeedMarkers: [expectedSubChannelMarker],
32
+ feedMarkers: [expectedFeedMarker],
33
+ } as Amity.MarkDeliveredPayload,
34
+ };
35
+
36
+ describe('markAsDelivered', () => {
37
+ beforeAll(connectClient);
38
+ afterAll(disconnectClient);
39
+
40
+ test('it should return `true`', async () => {
41
+ client.http.put = jest.fn().mockResolvedValueOnce(resolvedPutValue);
42
+
43
+ const recieved = await markAsDelivered(feedId, messageId);
44
+
45
+ expect(recieved).toBe(true);
46
+ });
47
+
48
+ test('it should update cache', async () => {
49
+ expect.assertions(4);
50
+ enableCache();
51
+
52
+ client.http.put = jest.fn().mockResolvedValueOnce(resolvedPutValue);
53
+
54
+ await markAsDelivered(feedId, messageId);
55
+
56
+ const recievedUserMarkerCache = pullFromCache(['userMarker', 'get', userId]);
57
+
58
+ const recievedChannelMarkerCache = pullFromCache([
59
+ 'channelMarker',
60
+ 'get',
61
+ getResolver('channelMarker')({ entityId, userId }),
62
+ ]);
63
+
64
+ const recievedSubChannelMarkerCache = pullFromCache([
65
+ 'subChannelMarker',
66
+ 'get',
67
+ getResolver('subChannelMarker')({ entityId, feedId, userId }),
68
+ ]);
69
+
70
+ const recievedFeedMarkerCache = pullFromCache([
71
+ 'feedMarker',
72
+ 'get',
73
+ getResolver('feedMarker')({ entityId, feedId }),
74
+ ]);
75
+
76
+ expect(recievedUserMarkerCache?.data).toStrictEqual(expectedUserMarker);
77
+ expect(recievedChannelMarkerCache?.data).toStrictEqual(expectedChannelMarker);
78
+ expect(recievedSubChannelMarkerCache?.data).toStrictEqual(expectedSubChannelMarker);
79
+ expect(recievedFeedMarkerCache?.data).toStrictEqual(expectedFeedMarker);
80
+
81
+ disableCache();
82
+ });
83
+ });
@@ -1,15 +1,17 @@
1
1
  import { disableCache, enableCache, pullFromCache, pushToCache } from '~/cache/api';
2
- import { client, generateRawMessage } from '~/utils/tests';
2
+ import { client, convertRawMessage, generateRawMessage } from '~/utils/tests';
3
3
 
4
- import { convertFromRaw, convertQueryParams } from '../../utils';
4
+ import { convertQueryParams } from '../../utils';
5
5
  import { queryMessages } from '../queryMessages';
6
6
  import { onMessageFetched } from '../../events/onMessageFetched';
7
+ import * as getMessageMarkers from '../../../marker/api/getMessageMarkers';
7
8
 
8
9
  const rawMessagesToQuery = [
9
10
  generateRawMessage(),
10
11
  generateRawMessage({ messageId: 'message-id-2' }),
11
12
  ];
12
- const messagesToQuery = rawMessagesToQuery.map(convertFromRaw);
13
+
14
+ const messagesToQuery = rawMessagesToQuery.map(convertRawMessage);
13
15
  const messageIds = messagesToQuery.map(x => x.messageId);
14
16
  const queryCriteriaWithoutPage = { subChannelId: messagesToQuery[0].subChannelId };
15
17
  const queryCriteria = { ...queryCriteriaWithoutPage, page: { limit: 10 } };
@@ -28,6 +30,15 @@ const getResolvedMessageValue = () => ({
28
30
  });
29
31
 
30
32
  describe('queryMessages', () => {
33
+ beforeAll(() => {
34
+ jest.spyOn(getMessageMarkers, 'getMessageMarkers').mockImplementation(() =>
35
+ Promise.resolve({
36
+ data: [],
37
+ cachedAt: undefined,
38
+ }),
39
+ );
40
+ });
41
+
31
42
  test('should return fetched messages with correct paging', async () => {
32
43
  client.http.get = jest.fn().mockResolvedValueOnce(getResolvedMessageValue());
33
44
 
@@ -3,7 +3,8 @@ import { getActiveClient } from '~/client/api';
3
3
  import { ingestInCache } from '~/cache/api/ingestInCache';
4
4
  import { pullFromCache, upsertInCache } from '~/cache/api';
5
5
  import { fireEvent } from '~/core/events';
6
- import { convertParams, convertResponseFromRaw } from '../utils';
6
+
7
+ import { convertParams, prepareMessagePayload } from '../utils';
7
8
 
8
9
  /* begin_public_function
9
10
  id: message.edit
@@ -32,12 +33,12 @@ export const updateMessage = async (
32
33
  const client = getActiveClient();
33
34
  client.log('message/updateMessage', patch);
34
35
 
35
- const { data } = await client.http
36
- .put<Amity.MessagePayload>(
37
- `/api/v5/messages/${encodeURIComponent(messageId)}`,
38
- convertParams(patch),
39
- )
40
- .then(convertResponseFromRaw);
36
+ const { data: payload } = await client.http.put<Amity.MessagePayload>(
37
+ `/api/v5/messages/${encodeURIComponent(messageId)}`,
38
+ convertParams(patch),
39
+ );
40
+
41
+ const data = await prepareMessagePayload(payload);
41
42
 
42
43
  const cachedAt = client.cache && Date.now();
43
44
  if (client.cache) ingestInCache(data, { cachedAt });
@@ -8,3 +8,5 @@ export * from './onMessageFlagCleared';
8
8
 
9
9
  export * from './onMessageReactionAdded';
10
10
  export * from './onMessageReactionRemoved';
11
+
12
+ export * from './onMessageFetched';
@@ -1,9 +1,7 @@
1
1
  import { getActiveClient } from '~/client/api';
2
2
  import { createEventSubscriber } from '~/core/events';
3
-
4
3
  import { ingestInCache } from '~/cache/api/ingestInCache';
5
- import { pullFromCache, pushToCache } from '~/cache/api';
6
- import { hasMention } from '~/utils';
4
+
7
5
  import { prepareMessagePayload } from '../utils';
8
6
 
9
7
  /**
@@ -17,48 +15,20 @@ import { prepareMessagePayload } from '../utils';
17
15
  * Fired when an {@link Amity.Message} has been created
18
16
  *
19
17
  * @param callback The function to call when the event was fired
18
+ * @param local Trigger when an event occurs from a local event or not
20
19
  * @returns an {@link Amity.Unsubscriber} function to stop listening
21
20
  *
22
21
  * @category Message Events
23
22
  */
24
- export const onMessageCreated = (callback: Amity.Listener<Amity.Message>): Amity.Unsubscriber => {
23
+ export const onMessageCreated = (
24
+ callback: Amity.Listener<Amity.Message>,
25
+ local = true,
26
+ ): Amity.Unsubscriber => {
25
27
  const client = getActiveClient();
26
28
 
27
- const filter = (rawPayload: Amity.MessagePayload) => {
28
- const payload = prepareMessagePayload(rawPayload);
29
+ const filter = async (rawPayload: Amity.MessagePayload) => {
30
+ const payload = await prepareMessagePayload(rawPayload);
29
31
  const message = payload.messages[0];
30
- const cached = pullFromCache<Amity.Channel>(['channel', 'get', message.channelId]);
31
-
32
- if (cached && cached.data.defaultSubChannelId === message.subChannelId) {
33
- let update: Amity.Channel;
34
-
35
- // @ts-ignore
36
- if (cached.data.localReading) {
37
- update = {
38
- ...cached.data,
39
- localReadToSegment: message.channelSegment,
40
- localLastMentionSegment: hasMention(message, client.userId!)
41
- ? message.channelSegment
42
- : cached.data.localLastMentionSegment,
43
- messageCount: message.channelSegment,
44
- lastActivity: message.createdAt,
45
- updatedAt: message.createdAt,
46
- };
47
- } else {
48
- update = {
49
- ...cached.data,
50
- defaultSubChannelHasUnreadMention:
51
- hasMention(message, client.userId!) || cached.data.defaultSubChannelHasUnreadMention,
52
- defaultSubChannelUnreadCount: message.channelSegment - cached.data.localReadToSegment,
53
- lastActivity: message.createdAt,
54
- messageCount: message.channelSegment,
55
- updatedAt: message.createdAt,
56
- };
57
- }
58
-
59
- pushToCache(['channel', 'get', message.channelId], update);
60
- client.emitter.emit('local.channel.updated', { channels: [update] });
61
- }
62
32
 
63
33
  ingestInCache(payload);
64
34
  callback(message);
@@ -66,11 +36,14 @@ export const onMessageCreated = (callback: Amity.Listener<Amity.Message>): Amity
66
36
 
67
37
  const disposers = [
68
38
  createEventSubscriber(client, 'message/onMessageCreated', 'message.created', filter),
69
- createEventSubscriber(client, 'local.message.created', 'local.message.created', payload =>
70
- callback(payload.messages[0]),
71
- ),
72
39
  ];
73
40
 
41
+ if (local) {
42
+ createEventSubscriber(client, 'message/onMessageCreated', 'local.message.created', payload =>
43
+ callback(payload.messages[0]),
44
+ );
45
+ }
46
+
74
47
  return () => {
75
48
  disposers.forEach(fn => fn());
76
49
  };
@@ -22,8 +22,8 @@ import { prepareMessagePayload } from '../utils';
22
22
  export const onMessageDeleted = (callback: Amity.Listener<Amity.Message>): Amity.Unsubscriber => {
23
23
  const client = getActiveClient();
24
24
 
25
- const filter = (rawPayload: Amity.MessagePayload) => {
26
- const payload = prepareMessagePayload(rawPayload);
25
+ const filter = async (rawPayload: Amity.MessagePayload) => {
26
+ const payload = await prepareMessagePayload(rawPayload);
27
27
 
28
28
  ingestInCache(payload);
29
29
  callback(payload.messages[0]);
@@ -23,8 +23,8 @@ export const onMessageFlagCleared = (
23
23
  ): Amity.Unsubscriber => {
24
24
  const client = getActiveClient();
25
25
 
26
- const filter = (rawPayload: Amity.MessagePayload) => {
27
- const payload = prepareMessagePayload(rawPayload);
26
+ const filter = async (rawPayload: Amity.MessagePayload) => {
27
+ const payload = await prepareMessagePayload(rawPayload);
28
28
 
29
29
  ingestInCache(payload);
30
30
  callback(payload.messages[0]);
@@ -22,8 +22,8 @@ import { prepareMessagePayload } from '../utils';
22
22
  export const onMessageFlagged = (callback: Amity.Listener<Amity.Message>): Amity.Unsubscriber => {
23
23
  const client = getActiveClient();
24
24
 
25
- const filter = (rawPayload: Amity.MessagePayload) => {
26
- const payload = prepareMessagePayload(rawPayload);
25
+ const filter = async (rawPayload: Amity.MessagePayload) => {
26
+ const payload = await prepareMessagePayload(rawPayload);
27
27
 
28
28
  ingestInCache(payload);
29
29
  callback(payload.messages[0]);
@@ -24,8 +24,8 @@ export const onMessageReactionAdded = (
24
24
  ): Amity.Unsubscriber => {
25
25
  const client = getActiveClient();
26
26
 
27
- const filter = (rawPayload: Amity.MessagePayload) => {
28
- const payload = prepareMessagePayload(rawPayload);
27
+ const filter = async (rawPayload: Amity.MessagePayload) => {
28
+ const payload = await prepareMessagePayload(rawPayload);
29
29
 
30
30
  ingestInCache(payload);
31
31
  callback(payload.messages[0]);
@@ -24,8 +24,8 @@ export const onMessageReactionRemoved = (
24
24
  ): Amity.Unsubscriber => {
25
25
  const client = getActiveClient();
26
26
 
27
- const filter = (rawPayload: Amity.MessagePayload) => {
28
- const payload = prepareMessagePayload(rawPayload);
27
+ const filter = async (rawPayload: Amity.MessagePayload) => {
28
+ const payload = await prepareMessagePayload(rawPayload);
29
29
 
30
30
  ingestInCache(payload);
31
31
  callback(payload.messages[0]);
@@ -21,8 +21,8 @@ import { prepareMessagePayload } from '../utils';
21
21
  export const onMessageUnflagged = (callback: Amity.Listener<Amity.Message>): Amity.Unsubscriber => {
22
22
  const client = getActiveClient();
23
23
 
24
- const filter = (rawPayload: Amity.MessagePayload) => {
25
- const payload = prepareMessagePayload(rawPayload);
24
+ const filter = async (rawPayload: Amity.MessagePayload) => {
25
+ const payload = await prepareMessagePayload(rawPayload);
26
26
 
27
27
  ingestInCache(payload);
28
28
  callback(payload.messages[0]);
@@ -1,8 +1,10 @@
1
+ import { pullFromCache, upsertInCache } from '~/cache/api';
1
2
  import { getActiveClient } from '~/client/api';
2
3
  import { createEventSubscriber } from '~/core/events';
3
4
 
4
5
  import { ingestInCache } from '~/cache/api/ingestInCache';
5
- import { prepareMessagePayload } from '../utils';
6
+
7
+ import { prepareMessagePayload, updateMessageMarker } from '../utils';
6
8
 
7
9
  /**
8
10
  * ```js
@@ -22,18 +24,38 @@ import { prepareMessagePayload } from '../utils';
22
24
  export const onMessageUpdated = (callback: Amity.Listener<Amity.Message>): Amity.Unsubscriber => {
23
25
  const client = getActiveClient();
24
26
 
25
- const filter = (rawPayload: Amity.MessagePayload) => {
26
- const payload = prepareMessagePayload(rawPayload);
27
+ const filter = async (rawPayload: Amity.MessagePayload) => {
28
+ const payload = await prepareMessagePayload(rawPayload);
27
29
 
28
30
  ingestInCache(payload);
29
31
  callback(payload.messages[0]);
30
32
  };
31
33
 
34
+ const messageMarkerChangeHandler = async (
35
+ rawPayload: MakeRequired<Amity.MessageMarkerPayload, 'contentMarkers'>,
36
+ ) => {
37
+ const marker = rawPayload.contentMarkers[0];
38
+ const cacheKey = ['message', 'get', marker.contentId];
39
+ const message = pullFromCache<Amity.Message>(cacheKey)?.data;
40
+
41
+ if (!message) return;
42
+
43
+ const updated = updateMessageMarker(message, marker);
44
+ upsertInCache(cacheKey, updated);
45
+ callback(updated);
46
+ };
47
+
32
48
  const disposers = [
33
- createEventSubscriber(client, 'message/onMessageUpdated', 'message.updated', filter),
34
- createEventSubscriber(client, 'local.message.updated', 'local.message.updated', payload =>
49
+ createEventSubscriber(client, 'onMessageUpdated', 'message.updated', filter),
50
+ createEventSubscriber(client, 'onMessageUpdated', 'local.message.updated', payload =>
35
51
  callback(payload.messages[0]),
36
52
  ),
53
+ createEventSubscriber(
54
+ client,
55
+ 'onMessageUpdated',
56
+ 'local.messageMarker.fetched',
57
+ messageMarkerChangeHandler,
58
+ ),
37
59
  ];
38
60
 
39
61
  return () => {
@@ -1,4 +1,4 @@
1
- import { client, generateRawMessage } from '~/utils/tests';
1
+ import { client, generateRawMessage, pause } from '~/utils/tests';
2
2
  import { convertFromRaw } from '~/message/utils';
3
3
  import {
4
4
  onMessageCreated,
@@ -29,7 +29,7 @@ describe('Message Events', () => {
29
29
  ];
30
30
 
31
31
  cases.forEach(([onEvent, event]) => {
32
- test(`should call '${onEvent.name}' callback if '${event}' event is dispatched`, () => {
32
+ test(`should call '${onEvent.name}' callback if '${event}' event is dispatched`, async () => {
33
33
  const callback = jest.fn();
34
34
  const unsubscribe = onEvent(callback);
35
35
  client.emitter.emit(event, {
@@ -38,6 +38,8 @@ describe('Message Events', () => {
38
38
  users: [],
39
39
  });
40
40
 
41
+ await pause();
42
+
41
43
  unsubscribe();
42
44
 
43
45
  expect(callback).toHaveBeenCalled();
@@ -1,15 +1,22 @@
1
1
  import { ASCApiError } from '~/core/errors';
2
2
  import { disableCache, enableCache } from '~/cache/api';
3
3
  import { UNSYNCED_OBJECT_CACHED_AT_MESSAGE } from '~/utils/constants';
4
- import { pause, client, connectClient, disconnectClient, generateRawMessage } from '~/utils/tests';
4
+ import {
5
+ pause,
6
+ client,
7
+ connectClient,
8
+ disconnectClient,
9
+ generateRawMessage,
10
+ convertRawMessage,
11
+ } from '~/utils/tests';
5
12
  import { getFutureDate } from '~/core/model';
6
13
 
7
- import { convertFromRaw } from '../../utils';
8
14
  import { liveMessage } from '../../observers/liveMessage';
9
15
  import { createMessage } from '../../api';
16
+ import * as getMessageMarkers from '../../../marker/api/getMessageMarkers';
10
17
 
11
18
  const rawMessage = generateRawMessage();
12
- const message = convertFromRaw(rawMessage);
19
+ const message = convertRawMessage(rawMessage);
13
20
  const messageQueryResponseRaw = {
14
21
  data: { messages: [rawMessage] },
15
22
  };
@@ -23,16 +30,20 @@ const getSnapshot = () => {
23
30
  };
24
31
 
25
32
  describe('liveMessage', () => {
26
- beforeAll(async () => {
27
- await connectClient();
33
+ beforeAll(() => {
34
+ connectClient();
35
+
36
+ jest.spyOn(getMessageMarkers, 'getMessageMarkers').mockImplementation(() =>
37
+ Promise.resolve({
38
+ data: [],
39
+ cachedAt: undefined,
40
+ }),
41
+ );
28
42
  });
29
43
 
30
- afterAll(async () => {
31
- await disconnectClient();
32
- });
44
+ afterAll(disconnectClient);
33
45
 
34
46
  beforeEach(enableCache);
35
-
36
47
  afterEach(disableCache);
37
48
 
38
49
  const events: [string, keyof Amity.Events][] = [
@@ -47,6 +58,7 @@ describe('liveMessage', () => {
47
58
  ];
48
59
 
49
60
  test.each(events)('%s', async (test, event) => {
61
+ await disableCache();
50
62
  const snapshot = getSnapshot();
51
63
 
52
64
  // mock response of queryMessages and validate
@@ -64,7 +76,7 @@ describe('liveMessage', () => {
64
76
  data: { text: event },
65
77
  updatedAt: getFutureDate(rawMessage.updatedAt),
66
78
  };
67
- const updatedMessage = convertFromRaw(rawUpdatedMessage);
79
+ const updatedMessage = convertRawMessage(rawUpdatedMessage);
68
80
  if (event === 'local.message.fetched') {
69
81
  client.emitter.emit('local.message.fetched', { messages: [updatedMessage] });
70
82
  } else {