@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
@@ -1,8 +1,8 @@
1
- import { getSubChannel } from '../getSubChannel';
2
- import { client, generateRawSubChannel } from '~/utils/tests';
3
-
1
+ import { client, connectClient, disconnectClient, generateRawSubChannel } from '~/utils/tests';
4
2
  import { disableCache, enableCache, pullFromCache } from '~/cache/api';
5
3
  import { ASCApiError } from '~/core/errors';
4
+
5
+ import { getSubChannel } from '../getSubChannel';
6
6
  import { onSubChannelFetched } from '../../events/onSubChannelFetched';
7
7
 
8
8
  const subChannelId = 'channelId11--sub-channel-id';
@@ -13,8 +13,10 @@ const subChannelPayload = {
13
13
  };
14
14
 
15
15
  describe('createSubChannel', () => {
16
- beforeEach(enableCache);
16
+ beforeAll(connectClient);
17
+ afterAll(disconnectClient);
17
18
 
19
+ beforeEach(enableCache);
18
20
  afterEach(disableCache);
19
21
 
20
22
  // integration_test_id: 6f019056-921e-43e2-a426-dd5a96f2fdcf
@@ -1,8 +1,9 @@
1
- import { getSubChannels } from '../getSubChannels';
2
- import { client, generateRawSubChannel } from '~/utils/tests';
1
+ import { client, connectClient, disconnectClient, generateRawSubChannel } from '~/utils/tests';
3
2
 
4
3
  import { disableCache, enableCache, pullFromCache } from '~/cache/api';
5
4
  import { ASCApiError } from '~/core/errors';
5
+
6
+ import { getSubChannels } from '../getSubChannels';
6
7
  import { onSubChannelFetched } from '../../events/onSubChannelFetched';
7
8
 
8
9
  const subChannelId = 'channelId11--sub-channel-id';
@@ -13,8 +14,10 @@ const subChannelPayload = {
13
14
  };
14
15
 
15
16
  describe('createSubChannel', () => {
16
- beforeEach(enableCache);
17
+ beforeAll(connectClient);
18
+ afterAll(disconnectClient);
17
19
 
20
+ beforeEach(enableCache);
18
21
  afterEach(disableCache);
19
22
 
20
23
  // integration_test_id: dc771f42-14b9-420e-999d-858151e8ce41
@@ -1,11 +1,12 @@
1
- import { updateSubChannel } from '../updateSubChannel';
2
- import { client, generateRawSubChannel } from '~/utils/tests';
1
+ import { client, connectClient, disconnectClient, generateRawSubChannel } from '~/utils/tests';
3
2
 
4
3
  import { onSubChannelUpdated } from '~/subChannel/events';
5
4
 
6
5
  import { disableCache, enableCache, pullFromCache } from '~/cache/api';
7
6
  import { ASCApiError } from '~/core/errors';
8
7
 
8
+ import { updateSubChannel } from '../updateSubChannel';
9
+
9
10
  const subChannelId = 'channelId11--sub-channel-id';
10
11
 
11
12
  const subChannelPayload = {
@@ -14,8 +15,10 @@ const subChannelPayload = {
14
15
  };
15
16
 
16
17
  describe('createSubChannel', () => {
17
- beforeEach(enableCache);
18
+ beforeAll(connectClient);
19
+ afterAll(disconnectClient);
18
20
 
21
+ beforeEach(enableCache);
19
22
  afterEach(disableCache);
20
23
 
21
24
  // integration_test_id: 9f50fa02-c26c-4666-8e8b-2d9076a3edd3
@@ -32,7 +32,7 @@ export const updateSubChannel = async (
32
32
  `/api/v5/message-feeds/${encodeURIComponent(subChannelId)}`,
33
33
  { name: patch.displayName },
34
34
  );
35
- const data = prepareSubChannelPayload(response.data);
35
+ const data = await prepareSubChannelPayload(response.data);
36
36
 
37
37
  const cachedAt = client.cache && Date.now();
38
38
  if (client.cache) ingestInCache(data, { cachedAt });
@@ -21,8 +21,8 @@ import { prepareSubChannelPayload } from '../utils';
21
21
  export const onSubChannelCreated = (callback: Amity.Listener<Amity.SubChannel>) => {
22
22
  const client = getActiveClient();
23
23
 
24
- const filter = (rawPayload: Amity.SubChannelPayload) => {
25
- const payload = prepareSubChannelPayload(rawPayload);
24
+ const filter = async (rawPayload: Amity.SubChannelPayload) => {
25
+ const payload = await prepareSubChannelPayload(rawPayload);
26
26
 
27
27
  ingestInCache(payload);
28
28
  callback(payload.messageFeeds[0]);
@@ -21,8 +21,8 @@ import { prepareSubChannelPayload } from '../utils';
21
21
  export const onSubChannelDeleted = (callback: Amity.Listener<Amity.SubChannel>) => {
22
22
  const client = getActiveClient();
23
23
 
24
- const filter = (rawPayload: Amity.SubChannelPayload) => {
25
- const payload = prepareSubChannelPayload(rawPayload);
24
+ const filter = async (rawPayload: Amity.SubChannelPayload) => {
25
+ const payload = await prepareSubChannelPayload(rawPayload);
26
26
 
27
27
  ingestInCache(payload);
28
28
  callback(payload.messageFeeds[0]);
@@ -1,7 +1,9 @@
1
+ import { pullFromCache, upsertInCache } from '~/cache/api';
1
2
  import { ingestInCache } from '~/cache/api/ingestInCache';
2
3
  import { getActiveClient } from '~/client/api';
3
4
  import { createEventSubscriber } from '~/core/events';
4
- import { prepareSubChannelPayload } from '../utils';
5
+
6
+ import { prepareSubChannelPayload, updateSubChannelMarker } from '../utils';
5
7
 
6
8
  /**
7
9
  * ```js
@@ -21,12 +23,49 @@ import { prepareSubChannelPayload } from '../utils';
21
23
  export const onSubChannelUpdated = (callback: Amity.Listener<Amity.SubChannel>) => {
22
24
  const client = getActiveClient();
23
25
 
24
- const filter = (rawPayload: Amity.SubChannelPayload) => {
25
- const payload = prepareSubChannelPayload(rawPayload);
26
+ const subChannelChangeHandler = async (rawPayload: Amity.SubChannelPayload) => {
27
+ const payload = await prepareSubChannelPayload(rawPayload);
26
28
 
27
29
  ingestInCache(payload);
28
30
  callback(payload.messageFeeds[0]);
29
31
  };
30
32
 
31
- return createEventSubscriber(client, 'onSubChannelUpdated', 'message-feed.updated', filter);
33
+ const subChannelMarkerChangeHandler = async (
34
+ rawPayload: MakeRequired<Amity.SubChannelMarkerPayload, 'userFeedMarkers'>,
35
+ ) => {
36
+ const marker = rawPayload.userFeedMarkers[0];
37
+ const cacheKey = ['subChannel', 'get', marker.feedId];
38
+ const subChannel = pullFromCache<Amity.SubChannel>(cacheKey)?.data;
39
+
40
+ if (!subChannel) return;
41
+
42
+ const updated = updateSubChannelMarker(subChannel, marker);
43
+ upsertInCache(cacheKey, updated);
44
+ callback(updated);
45
+ };
46
+
47
+ const disposers = [
48
+ createEventSubscriber(
49
+ client,
50
+ 'onSubChannelUpdated',
51
+ 'message-feed.updated',
52
+ subChannelChangeHandler,
53
+ ),
54
+ createEventSubscriber(
55
+ client,
56
+ 'onSubChannelUpdated',
57
+ 'local.subChannelMarker.fetched',
58
+ subChannelMarkerChangeHandler,
59
+ ),
60
+ createEventSubscriber(
61
+ client,
62
+ 'onSubChannelUpdated',
63
+ 'local.subChannelMarker.updated',
64
+ subChannelMarkerChangeHandler,
65
+ ),
66
+ ];
67
+
68
+ return () => {
69
+ disposers.forEach(fn => fn());
70
+ };
32
71
  };
@@ -1,4 +1,6 @@
1
+ import {onSubChannelMarkerFetched, onSubChannelMarkerUpdated} from '~/marker/events';
1
2
  import { liveObject } from '~/utils/liveObject';
3
+
2
4
  import { getSubChannel } from '../api';
3
5
  import { onSubChannelDeleted, onSubChannelUpdated } from '../events';
4
6
  import { onSubChannelFetched } from '../events/onSubChannelFetched';
@@ -5,28 +5,33 @@ import {
5
5
  connectClient,
6
6
  disconnectClient,
7
7
  generateRawSubChannel,
8
+ convertSubChannelFromRaw,
8
9
  } from '~/utils/tests';
9
10
  import { createQuery, runQuery } from '~/core/query';
10
11
  import { deleteSubChannel, getSubChannel, updateSubChannel } from '~/subChannel/api';
11
12
  import { getFutureDate } from '~/core/model';
13
+
12
14
  import { liveSubChannel } from '../liveSubChannel';
13
- import { convertFromRaw } from '../../utils';
15
+ import * as getSubChannelMarkers from '../../../marker/api/getSubChannelMarkers';
14
16
 
15
17
  describe('liveSubChannel', () => {
18
+ beforeAll(connectClient);
19
+ afterAll(disconnectClient);
20
+
16
21
  const rawSubChannel = generateRawSubChannel();
17
- const subChannel = convertFromRaw(rawSubChannel);
22
+ const subChannel = convertSubChannelFromRaw(rawSubChannel);
18
23
  const response = { data: { messageFeeds: [rawSubChannel] } };
19
24
 
20
25
  beforeAll(async () => {
21
- await connectClient();
22
- });
26
+ await connectClient;
23
27
 
24
- afterAll(async () => {
25
- await disconnectClient();
28
+ jest
29
+ .spyOn(getSubChannelMarkers, 'getSubChannelMarkers')
30
+ .mockResolvedValue({ data: [], cachedAt: undefined });
26
31
  });
27
32
 
33
+ afterAll(disconnectClient);
28
34
  beforeEach(enableCache);
29
-
30
35
  afterEach(disableCache);
31
36
 
32
37
  const events: [string, keyof Amity.Events][] = [
@@ -52,7 +57,7 @@ describe('liveSubChannel', () => {
52
57
  expect(callback).toHaveBeenNthCalledWith(
53
58
  3,
54
59
  expect.objectContaining({
55
- data: convertFromRaw(update),
60
+ data: convertSubChannelFromRaw(update),
56
61
  loading: false,
57
62
  }),
58
63
  );
@@ -81,7 +86,7 @@ describe('liveSubChannel', () => {
81
86
  expect(callback).toHaveBeenNthCalledWith(
82
87
  3,
83
88
  expect.objectContaining({
84
- data: convertFromRaw(update),
89
+ data: convertSubChannelFromRaw(update),
85
90
  loading: false,
86
91
  }),
87
92
  );
@@ -101,7 +106,7 @@ describe('liveSubChannel', () => {
101
106
  expect(callback).toHaveBeenNthCalledWith(
102
107
  3,
103
108
  expect.objectContaining({
104
- data: convertFromRaw(update),
109
+ data: convertSubChannelFromRaw(update),
105
110
  loading: false,
106
111
  }),
107
112
  );
@@ -5,12 +5,17 @@ import {
5
5
  disconnectClient,
6
6
  pause,
7
7
  generateRawSubChannel,
8
+ convertSubChannelFromRaw,
8
9
  } from '~/utils/tests';
9
- import { convertFromRaw } from '~/subChannel/utils';
10
10
  import { getFutureDate, getPastDate } from '~/core/model';
11
+
11
12
  import { liveSubChannels } from '../liveSubChannels';
13
+ import * as getSubChannelMarkers from '../../../marker/api/getSubChannelMarkers';
12
14
 
13
15
  describe('liveSubChannels', () => {
16
+ beforeAll(connectClient);
17
+ afterAll(disconnectClient);
18
+
14
19
  const rawSubChannel = generateRawSubChannel();
15
20
  const response = {
16
21
  data: {
@@ -20,15 +25,15 @@ describe('liveSubChannels', () => {
20
25
  };
21
26
 
22
27
  beforeAll(async () => {
23
- await connectClient();
24
- });
28
+ await connectClient;
25
29
 
26
- afterAll(async () => {
27
- await disconnectClient();
30
+ jest
31
+ .spyOn(getSubChannelMarkers, 'getSubChannelMarkers')
32
+ .mockResolvedValue({ data: [], cachedAt: undefined });
28
33
  });
29
34
 
35
+ afterAll(disconnectClient);
30
36
  beforeEach(enableCache);
31
-
32
37
  afterEach(disableCache);
33
38
 
34
39
  test('should get sub channels', async () => {
@@ -49,7 +54,7 @@ describe('liveSubChannels', () => {
49
54
  expect(callback).toHaveBeenNthCalledWith(
50
55
  2,
51
56
  expect.objectContaining({
52
- data: [convertFromRaw(rawSubChannel)],
57
+ data: [convertSubChannelFromRaw(rawSubChannel)],
53
58
  loading: false,
54
59
  }),
55
60
  );
@@ -75,7 +80,7 @@ describe('liveSubChannels', () => {
75
80
  expect(callback).toHaveBeenNthCalledWith(
76
81
  2,
77
82
  expect.objectContaining({
78
- data: [convertFromRaw(rawSubChannels[1])],
83
+ data: [convertSubChannelFromRaw(rawSubChannels[1])],
79
84
  loading: false,
80
85
  }),
81
86
  );
@@ -124,7 +129,7 @@ describe('liveSubChannels', () => {
124
129
  expect(callback).toHaveBeenNthCalledWith(
125
130
  4,
126
131
  expect.objectContaining({
127
- data: [rawSubChannel, rawSubChannel2].map(convertFromRaw),
132
+ data: [rawSubChannel, rawSubChannel2].map(data => convertSubChannelFromRaw(data)),
128
133
  loading: false,
129
134
  }),
130
135
  );
@@ -151,7 +156,7 @@ describe('liveSubChannels', () => {
151
156
  'should add new sub channel to collection onCreate',
152
157
  'message-feed.created',
153
158
  newRawSubChannel,
154
- [newRawSubChannel, rawSubChannel].map(convertFromRaw),
159
+ [newRawSubChannel, rawSubChannel].map(data => convertSubChannelFromRaw(data)),
155
160
  ],
156
161
  [
157
162
  'should remove sub channel from collection onDelete',
@@ -163,13 +168,13 @@ describe('liveSubChannels', () => {
163
168
  'should update sub channel in collection onUpdate',
164
169
  'message-feed.updated',
165
170
  updatedRawSubChannel,
166
- [updatedRawSubChannel].map(convertFromRaw),
171
+ [updatedRawSubChannel].map(data => convertSubChannelFromRaw(data)),
167
172
  ],
168
173
  [
169
174
  'should update sub channel in collection onFetch',
170
175
  'local.message-feed.fetched',
171
176
  updatedRawSubChannel,
172
- [updatedRawSubChannel].map(convertFromRaw),
177
+ [updatedRawSubChannel].map(data => convertSubChannelFromRaw(data)),
173
178
  ],
174
179
  ];
175
180
 
@@ -186,9 +191,11 @@ describe('liveSubChannels', () => {
186
191
  if (event === 'local.message-feed.fetched') {
187
192
  pushToCache(
188
193
  ['subChannel', 'get', rawEventSubChannel.messageFeedId],
189
- convertFromRaw(rawEventSubChannel),
194
+ convertSubChannelFromRaw(rawEventSubChannel),
190
195
  );
191
- client.emitter.emit(event, { messageFeeds: [convertFromRaw(rawEventSubChannel)] });
196
+ client.emitter.emit(event, {
197
+ messageFeeds: [convertSubChannelFromRaw(rawEventSubChannel)],
198
+ });
192
199
  } else {
193
200
  client.emitter.emit(event, { messageFeeds: [rawEventSubChannel] });
194
201
  }
@@ -1,50 +1,2 @@
1
- export function convertFromRaw({
2
- channelId,
3
- channelPublicId,
4
- channelType,
5
- childCount,
6
- creatorId,
7
- creatorPublicId,
8
- lastMessageId,
9
- lastMessageTimestamp,
10
- messageFeedId,
11
- name,
12
- ...rest
13
- }: Amity.RawSubChannel): Amity.SubChannel {
14
- return {
15
- ...rest,
16
- channelId: channelPublicId,
17
- creatorId: creatorPublicId,
18
- displayName: name,
19
- lastActivity: lastMessageTimestamp,
20
- latestMessageId: lastMessageId,
21
- messageCount: childCount,
22
- subChannelId: messageFeedId,
23
- };
24
- }
25
-
26
- export const prepareSubChannelPayload = (
27
- payload: Amity.SubChannelPayload,
28
- ): Amity.ProcessedSubChannelPayload => {
29
- return {
30
- ...payload,
31
- messageFeeds: payload.messageFeeds.map(convertFromRaw),
32
- };
33
- };
34
-
35
- type RawQuerySubChannels = Omit<Amity.QuerySubChannels, 'excludeDefaultSubChannel'> & {
36
- excludeDefaultMessageFeed?: Amity.QuerySubChannels['excludeDefaultSubChannel'];
37
- };
38
-
39
- export function convertQueryParams({
40
- excludeDefaultSubChannel,
41
- ...rest
42
- }: Amity.QuerySubChannels): RawQuerySubChannels {
43
- const out: RawQuerySubChannels = { ...rest };
44
-
45
- if (excludeDefaultSubChannel !== undefined) {
46
- out.excludeDefaultMessageFeed = excludeDefaultSubChannel;
47
- }
48
-
49
- return out;
50
- }
1
+ export * from './prepareSubChannelPayload';
2
+ export * from './markReadEngine';
@@ -0,0 +1,117 @@
1
+ import { pullFromCache } from '~/cache/api';
2
+ import { getActiveClient, getActiveUser } from '~/client/api';
3
+ import { fireEvent } from '~/core/events';
4
+ import { getResolver } from '~/core/model';
5
+ import { onMessageCreated } from '~/message/events';
6
+
7
+ import { startReadingAPI } from '../api/startReadingAPI';
8
+ import { stopReadingAPI } from '../api/stopReadingAPI';
9
+
10
+ let disposers: (() => void)[] = [];
11
+ const isReadingMap: Record<string, boolean> = {};
12
+
13
+ const updateReadToSegment = (message: Amity.Message) => {
14
+ if (!isReadingMap[message.subChannelId]) return;
15
+
16
+ const client = getActiveClient();
17
+
18
+ if (!client.cache) return;
19
+
20
+ const key = {
21
+ entityId: message.channelId,
22
+ feedId: message.subChannelId,
23
+ userId: getActiveUser()._id,
24
+ };
25
+
26
+ const currentValue = pullFromCache<Amity.SubChannelMarker>([
27
+ 'subChannelMarker',
28
+ 'get',
29
+ getResolver('subChannelMarker')(key),
30
+ ])?.data;
31
+
32
+ if (!currentValue) return;
33
+
34
+ const userFeedMarkers = [{ ...currentValue, readToSegment: message.channelSegment }];
35
+ fireEvent('local.subChannelMarker.updated', { userFeedMarkers });
36
+ };
37
+
38
+ /**
39
+ * the event callback when app is back to online
40
+ */
41
+ const onOnline = () => {
42
+ const callback = () => {
43
+ // Start reading the reading subChannel again when resume from offline state
44
+ Object.entries(isReadingMap).forEach(([subChannelId, isReading]) => {
45
+ if (isReading) startReadingAPI(subChannelId);
46
+ });
47
+ };
48
+
49
+ window.addEventListener('online', callback);
50
+
51
+ return () => window.removeEventListener('online', callback);
52
+ };
53
+
54
+ const registerEventListeners = () => {
55
+ disposers.push(onOnline(), onMessageCreated(updateReadToSegment));
56
+ };
57
+
58
+ const unRegisterEventListeners = () => {
59
+ disposers.forEach(fn => fn());
60
+ disposers = [];
61
+ };
62
+
63
+ /* begin_public_function
64
+ id: channel.start_reading
65
+ */
66
+
67
+ /**
68
+ * ```js
69
+ * import { startReading } from '@amityco/ts-sdk'
70
+ * const success = await startReading('foo')
71
+ * ```
72
+ *
73
+ * Set local reading state of channel to `true` and then call mark all
74
+ * messages as read API.
75
+ *
76
+ * @param subChannelId - The sub channel ID to start reading.
77
+ * @return A success boolean if reading of the sub channel had begun.
78
+ *
79
+ * @category Channel API
80
+ * @async
81
+ */
82
+ export const startReading = (subChannelId: Amity.SubChannel['subChannelId']) => {
83
+ isReadingMap[subChannelId] = true;
84
+
85
+ if (disposers.length === 0) {
86
+ registerEventListeners();
87
+ }
88
+
89
+ return startReadingAPI(subChannelId);
90
+ };
91
+ /* end_public_function */
92
+
93
+ /* begin_public_function
94
+ id: channel.stop_reading
95
+ */
96
+
97
+ /**
98
+ * ```js
99
+ * import { stopReading } from '@amityco/ts-sdk'
100
+ * const success = await stopReading('foo')
101
+ * ```
102
+ *
103
+ * Set local reading state of channel to `false` and then call mark all
104
+ * messages as unread API.
105
+ *
106
+ * @param subChannelId - The sub channel ID to stop reading.
107
+ * @return A success boolean if reading of the sub channel had begun.
108
+ *
109
+ * @category Channel API
110
+ * @async
111
+ */
112
+ export const stopReading = (subChannelId: Amity.SubChannel['subChannelId']) => {
113
+ isReadingMap[subChannelId] = false;
114
+ unRegisterEventListeners();
115
+ return stopReadingAPI(subChannelId);
116
+ };
117
+ /* end_public_function */
@@ -0,0 +1,132 @@
1
+ import { pullFromCache } from '~/cache/api';
2
+ import { getActiveUser } from '~/client/api';
3
+ import { getResolver } from '~/core/model';
4
+ import { getSubChannelMarkers } from '~/marker/api';
5
+
6
+ export const MARKER_INCLUDED_SUB_CHANNEL_TYPE = ['broadcast', 'conversation', 'community'];
7
+
8
+ /**
9
+ * Filter sub channel by type. Only conversation, community and broadcast type are included.
10
+ */
11
+ export const isUnreadCountSupport = ({ channelType }: Pick<Amity.RawSubChannel, 'channelType'>) =>
12
+ MARKER_INCLUDED_SUB_CHANNEL_TYPE.includes(channelType);
13
+
14
+ export function getUnreadCount(
15
+ channelId: string,
16
+ subChannelId: string,
17
+ marker?: Amity.SubChannelMarker,
18
+ ) {
19
+ // Look for `unreadCount` in the marker param first
20
+ if (marker) {
21
+ return marker.unreadCount;
22
+ }
23
+
24
+ const key = {
25
+ entityId: channelId,
26
+ feedId: subChannelId,
27
+ userId: getActiveUser()._id,
28
+ };
29
+
30
+ // If the marker param is not set, look in the cache
31
+ const cachedMarker = pullFromCache<Amity.SubChannelMarker>([
32
+ 'subChannelMarker',
33
+ 'get',
34
+ getResolver('subChannelMarker')(key),
35
+ ])?.data;
36
+
37
+ if (cachedMarker) {
38
+ return cachedMarker.unreadCount;
39
+ }
40
+
41
+ // and if not found in cache use default value `0`
42
+ return 0;
43
+ }
44
+
45
+ export function convertFromRaw(
46
+ {
47
+ channelId,
48
+ channelPublicId,
49
+ channelType,
50
+ childCount,
51
+ creatorId,
52
+ creatorPublicId,
53
+ lastMessageId,
54
+ lastMessageTimestamp,
55
+ messageFeedId,
56
+ name,
57
+ ...rest
58
+ }: Amity.RawSubChannel,
59
+ marker?: Amity.SubChannelMarker,
60
+ ): Amity.SubChannel {
61
+ return {
62
+ ...rest,
63
+ channelId: channelPublicId,
64
+ creatorId: creatorPublicId,
65
+ displayName: name,
66
+ lastActivity: lastMessageTimestamp,
67
+ latestMessageId: lastMessageId,
68
+ messageCount: childCount,
69
+ subChannelId: messageFeedId,
70
+ isUnreadCountSupport: isUnreadCountSupport({ channelType }),
71
+ unreadCount: getUnreadCount(channelId, messageFeedId, marker),
72
+ };
73
+ }
74
+
75
+ export function updateSubChannelMarker(
76
+ subChannel: Amity.SubChannel,
77
+ marker?: Amity.SubChannelMarker,
78
+ ): Amity.SubChannel {
79
+ return {
80
+ ...subChannel,
81
+ unreadCount: getUnreadCount(subChannel.channelId, subChannel.subChannelId, marker),
82
+ updatedAt: new Date().toISOString(),
83
+ };
84
+ }
85
+
86
+ export const prepareSubChannelPayload = async (
87
+ rawPayload: Amity.SubChannelPayload,
88
+ ): Promise<Amity.ProcessedSubChannelPayload> => {
89
+ // make a fetch marker to prepare it for merging with the raw channel payload.
90
+ let markers: Amity.SubChannelMarker[] = [];
91
+
92
+ const markerIds = rawPayload.messageFeeds
93
+ .filter(isUnreadCountSupport)
94
+ .map(({ messageFeedId }) => messageFeedId);
95
+
96
+ if (markerIds.length > 0)
97
+ // from the spec, allow marker fetch to fail
98
+ try {
99
+ ({ data: markers } = await getSubChannelMarkers(markerIds));
100
+ } catch (e) {
101
+ // empty block
102
+ }
103
+
104
+ // attach marker to sub channel
105
+ const messageFeeds = rawPayload.messageFeeds.map(messageFeed => {
106
+ const marker = markers?.find(({ feedId }) => feedId === messageFeed.messageFeedId);
107
+
108
+ return convertFromRaw(messageFeed, marker);
109
+ });
110
+
111
+ return {
112
+ ...rawPayload,
113
+ messageFeeds,
114
+ };
115
+ };
116
+
117
+ type RawQuerySubChannels = Omit<Amity.QuerySubChannels, 'excludeDefaultSubChannel'> & {
118
+ excludeDefaultMessageFeed?: Amity.QuerySubChannels['excludeDefaultSubChannel'];
119
+ };
120
+
121
+ export function convertQueryParams({
122
+ excludeDefaultSubChannel,
123
+ ...rest
124
+ }: Amity.QuerySubChannels): RawQuerySubChannels {
125
+ const out: RawQuerySubChannels = { ...rest };
126
+
127
+ if (excludeDefaultSubChannel !== undefined) {
128
+ out.excludeDefaultMessageFeed = excludeDefaultSubChannel;
129
+ }
130
+
131
+ return out;
132
+ }