@amityco/ts-sdk 0.0.1-beta.42.2 → 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 (308) 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/getChannels.d.ts.map +1 -1
  22. package/dist/channel/api/index.d.ts +0 -2
  23. package/dist/channel/api/index.d.ts.map +1 -1
  24. package/dist/channel/events/onChannelUpdated.d.ts.map +1 -1
  25. package/dist/channel/utils/index.d.ts +1 -2
  26. package/dist/channel/utils/index.d.ts.map +1 -1
  27. package/dist/channel/utils/prepareChannelPayload.d.ts +6 -0
  28. package/dist/channel/utils/prepareChannelPayload.d.ts.map +1 -0
  29. package/dist/channel/utils/tests/prepareChannelPayload.test.d.ts +5 -1
  30. package/dist/channel/utils/tests/prepareChannelPayload.test.d.ts.map +1 -1
  31. package/dist/client/api/activeUser.d.ts +2 -2
  32. package/dist/client/api/activeUser.d.ts.map +1 -1
  33. package/dist/client/api/connectClient.d.ts.map +1 -1
  34. package/dist/client/api/index.d.ts +2 -0
  35. package/dist/client/api/index.d.ts.map +1 -1
  36. package/dist/client/api/markerSync.d.ts +21 -0
  37. package/dist/client/api/markerSync.d.ts.map +1 -0
  38. package/dist/client/observers/getTotalUnreadCount.d.ts +18 -0
  39. package/dist/client/observers/getTotalUnreadCount.d.ts.map +1 -0
  40. package/dist/client/observers/index.d.ts +2 -0
  41. package/dist/client/observers/index.d.ts.map +1 -0
  42. package/dist/client/observers/tests/getTotalUnreadCount.test.d.ts +2 -0
  43. package/dist/client/observers/tests/getTotalUnreadCount.test.d.ts.map +1 -0
  44. package/dist/client/utils/index.d.ts +2 -0
  45. package/dist/client/utils/index.d.ts.map +1 -0
  46. package/dist/client/utils/markerSyncEngine.d.ts +46 -0
  47. package/dist/client/utils/markerSyncEngine.d.ts.map +1 -0
  48. package/dist/comment/api/getComments.d.ts.map +1 -1
  49. package/dist/core/events.d.ts +3 -3
  50. package/dist/core/events.d.ts.map +1 -1
  51. package/dist/core/model/idResolvers.d.ts.map +1 -1
  52. package/dist/core/model/index.d.ts.map +1 -1
  53. package/dist/index.cjs.js +1931 -1159
  54. package/dist/index.d.ts +5 -0
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.esm.js +1901 -1160
  57. package/dist/index.umd.js +4 -4
  58. package/dist/marker/api/getChannelMarkers.d.ts +18 -0
  59. package/dist/marker/api/getChannelMarkers.d.ts.map +1 -0
  60. package/dist/marker/api/getMessageMarkers.d.ts +18 -0
  61. package/dist/marker/api/getMessageMarkers.d.ts.map +1 -0
  62. package/dist/marker/api/getSubChannelMarkers.d.ts +18 -0
  63. package/dist/marker/api/getSubChannelMarkers.d.ts.map +1 -0
  64. package/dist/marker/api/getUserMarker.d.ts +8 -0
  65. package/dist/marker/api/getUserMarker.d.ts.map +1 -0
  66. package/dist/marker/api/index.d.ts +5 -0
  67. package/dist/marker/api/index.d.ts.map +1 -0
  68. package/dist/marker/api/tests/getChannelMarkers.test.d.ts +2 -0
  69. package/dist/marker/api/tests/getChannelMarkers.test.d.ts.map +1 -0
  70. package/dist/marker/api/tests/getMessageMarkers.test.d.ts +2 -0
  71. package/dist/marker/api/tests/getMessageMarkers.test.d.ts.map +1 -0
  72. package/dist/marker/api/tests/getSubChannelMarkers.test.d.ts +2 -0
  73. package/dist/marker/api/tests/getSubChannelMarkers.test.d.ts.map +1 -0
  74. package/dist/marker/events/index.d.ts +7 -0
  75. package/dist/marker/events/index.d.ts.map +1 -0
  76. package/dist/marker/events/onChannelMarkerFetched.d.ts +17 -0
  77. package/dist/marker/events/onChannelMarkerFetched.d.ts.map +1 -0
  78. package/dist/marker/events/onFeedlMarkerFetched.d.ts +17 -0
  79. package/dist/marker/events/onFeedlMarkerFetched.d.ts.map +1 -0
  80. package/dist/marker/events/onMessageMarkerFetched.d.ts +17 -0
  81. package/dist/marker/events/onMessageMarkerFetched.d.ts.map +1 -0
  82. package/dist/marker/events/onSubChannelMarkerFetched.d.ts +17 -0
  83. package/dist/marker/events/onSubChannelMarkerFetched.d.ts.map +1 -0
  84. package/dist/marker/events/onSubChannelMarkerUpdated.d.ts +17 -0
  85. package/dist/marker/events/onSubChannelMarkerUpdated.d.ts.map +1 -0
  86. package/dist/marker/events/onUserMarkerFetched.d.ts +17 -0
  87. package/dist/marker/events/onUserMarkerFetched.d.ts.map +1 -0
  88. package/dist/message/api/getMessage.d.ts.map +1 -1
  89. package/dist/message/api/getMessages.d.ts.map +1 -1
  90. package/dist/message/api/index.d.ts +1 -0
  91. package/dist/message/api/index.d.ts.map +1 -1
  92. package/dist/message/api/markAsDelivered.d.ts +17 -0
  93. package/dist/message/api/markAsDelivered.d.ts.map +1 -0
  94. package/dist/message/api/queryMessages.d.ts.map +1 -1
  95. package/dist/message/api/tests/markAsDelivered.test.d.ts +2 -0
  96. package/dist/message/api/tests/markAsDelivered.test.d.ts.map +1 -0
  97. package/dist/message/api/updateMessage.d.ts.map +1 -1
  98. package/dist/message/events/index.d.ts +1 -0
  99. package/dist/message/events/index.d.ts.map +1 -1
  100. package/dist/message/events/onMessageCreated.d.ts +2 -1
  101. package/dist/message/events/onMessageCreated.d.ts.map +1 -1
  102. package/dist/message/events/onMessageUpdated.d.ts.map +1 -1
  103. package/dist/message/utils/index.d.ts +1 -18
  104. package/dist/message/utils/index.d.ts.map +1 -1
  105. package/dist/message/utils/prepareMessagePayload.d.ts +16 -0
  106. package/dist/message/utils/prepareMessagePayload.d.ts.map +1 -0
  107. package/dist/post/api/getPosts.d.ts.map +1 -1
  108. package/dist/post/api/tests/getPosts.test.d.ts +2 -0
  109. package/dist/post/api/tests/getPosts.test.d.ts.map +1 -0
  110. package/dist/report/api/createReport.d.ts.map +1 -1
  111. package/dist/report/api/deleteReport.d.ts.map +1 -1
  112. package/dist/subChannel/api/getSubChannels.d.ts.map +1 -1
  113. package/dist/subChannel/api/index.d.ts +2 -0
  114. package/dist/subChannel/api/index.d.ts.map +1 -1
  115. package/dist/subChannel/api/startReadingAPI.d.ts +17 -0
  116. package/dist/subChannel/api/startReadingAPI.d.ts.map +1 -0
  117. package/dist/subChannel/api/stopReadingAPI.d.ts +17 -0
  118. package/dist/subChannel/api/stopReadingAPI.d.ts.map +1 -0
  119. package/dist/subChannel/events/onSubChannelUpdated.d.ts +1 -1
  120. package/dist/subChannel/events/onSubChannelUpdated.d.ts.map +1 -1
  121. package/dist/subChannel/observers/liveSubChannel.d.ts.map +1 -1
  122. package/dist/subChannel/utils/index.d.ts +2 -7
  123. package/dist/subChannel/utils/index.d.ts.map +1 -1
  124. package/dist/subChannel/utils/markReadEngine.d.ts +33 -0
  125. package/dist/subChannel/utils/markReadEngine.d.ts.map +1 -0
  126. package/dist/subChannel/utils/prepareSubChannelPayload.d.ts +15 -0
  127. package/dist/subChannel/utils/prepareSubChannelPayload.d.ts.map +1 -0
  128. package/dist/utils/liveObject.d.ts +1 -1
  129. package/dist/utils/liveObject.d.ts.map +1 -1
  130. package/dist/utils/tests/client.d.ts +1 -0
  131. package/dist/utils/tests/client.d.ts.map +1 -1
  132. package/dist/utils/tests/dummy/channel.d.ts +4 -0
  133. package/dist/utils/tests/dummy/channel.d.ts.map +1 -1
  134. package/dist/utils/tests/dummy/comment.d.ts.map +1 -1
  135. package/dist/utils/tests/dummy/index.d.ts +1 -0
  136. package/dist/utils/tests/dummy/index.d.ts.map +1 -1
  137. package/dist/utils/tests/dummy/marker.d.ts +6 -0
  138. package/dist/utils/tests/dummy/marker.d.ts.map +1 -0
  139. package/dist/utils/tests/dummy/message.d.ts +2 -0
  140. package/dist/utils/tests/dummy/message.d.ts.map +1 -1
  141. package/dist/utils/tests/dummy/subChannel.d.ts +1 -0
  142. package/dist/utils/tests/dummy/subChannel.d.ts.map +1 -1
  143. package/dist/utils/tests/utils.d.ts.map +1 -1
  144. package/package.json +1 -1
  145. package/src/@types/core/events.ts +13 -1
  146. package/src/@types/core/marker.ts +42 -0
  147. package/src/@types/core/model.ts +12 -0
  148. package/src/@types/core/payload.ts +52 -0
  149. package/src/@types/domains/channel.ts +5 -16
  150. package/src/@types/domains/client.ts +2 -0
  151. package/src/@types/domains/marker.ts +15 -0
  152. package/src/@types/domains/message.ts +3 -0
  153. package/src/@types/domains/partials.ts +4 -0
  154. package/src/@types/domains/subChannel.ts +2 -0
  155. package/src/channel/api/addChannelMembers.ts +1 -1
  156. package/src/channel/api/addChannelMembersRole.ts +1 -1
  157. package/src/channel/api/banChannelMembers.ts +1 -1
  158. package/src/channel/api/createChannel.ts +1 -1
  159. package/src/channel/api/getChannel.ts +1 -1
  160. package/src/channel/api/getChannels.ts +21 -5
  161. package/src/channel/api/index.ts +0 -3
  162. package/src/channel/api/joinChannel.ts +1 -1
  163. package/src/channel/api/leaveChannel.ts +1 -1
  164. package/src/channel/api/queryChannelMembers.ts +1 -1
  165. package/src/channel/api/queryChannels.ts +3 -3
  166. package/src/channel/api/removeChannelMembers.ts +1 -1
  167. package/src/channel/api/removeChannelMembersRole.ts +1 -1
  168. package/src/channel/api/tests/addChannelMembers.test.ts +16 -0
  169. package/src/channel/api/tests/createChannel.test.ts +29 -8
  170. package/src/channel/api/tests/getChannel.test.ts +11 -4
  171. package/src/channel/api/tests/getChannels.test.ts +22 -14
  172. package/src/channel/api/tests/queryChannelMembers.test.ts +13 -4
  173. package/src/channel/api/tests/queryChannels.test.ts +19 -9
  174. package/src/channel/api/unbanChannelMembers.ts +1 -1
  175. package/src/channel/api/updateChannel.ts +1 -1
  176. package/src/channel/events/onChannelCreated.ts +2 -2
  177. package/src/channel/events/onChannelDeleted.ts +4 -4
  178. package/src/channel/events/onChannelJoined.ts +2 -2
  179. package/src/channel/events/onChannelLeft.ts +2 -2
  180. package/src/channel/events/onChannelMemberAdded.ts +2 -2
  181. package/src/channel/events/onChannelMemberBanned.ts +3 -3
  182. package/src/channel/events/onChannelMemberRemoved.ts +2 -2
  183. package/src/channel/events/onChannelMemberUnbanned.ts +2 -2
  184. package/src/channel/events/onChannelMuted.ts +2 -2
  185. package/src/channel/events/onChannelUpdated.ts +25 -4
  186. package/src/channel/events/tests/onChannelCreated.test.ts +4 -1
  187. package/src/channel/events/tests/onChannelJoined.test.ts +5 -1
  188. package/src/channel/events/tests/onChannelMemberAdded.test.ts +5 -1
  189. package/src/channel/events/tests/onChannelMemberBanned.test.ts +4 -1
  190. package/src/channel/events/tests/onChannelMemberRemoved.test.ts +5 -1
  191. package/src/channel/events/tests/onChannelMemberUnbanned.test.ts +10 -10
  192. package/src/channel/events/tests/onChannelUpdated.test.ts +5 -1
  193. package/src/channel/observers/tests/liveChannelMembers.test.ts +5 -11
  194. package/src/channel/observers/tests/liveChannels.test.ts +21 -24
  195. package/src/channel/utils/index.ts +1 -57
  196. package/src/channel/utils/prepareChannelPayload.ts +91 -0
  197. package/src/channel/utils/tests/prepareChannelPayload.test.ts +102 -104
  198. package/src/client/api/activeUser.ts +2 -2
  199. package/src/client/api/connectClient.ts +2 -1
  200. package/src/client/api/index.ts +3 -0
  201. package/src/client/api/markerSync.ts +42 -0
  202. package/src/client/observers/getTotalUnreadCount.ts +52 -0
  203. package/src/client/observers/index.ts +1 -0
  204. package/src/client/observers/tests/getTotalUnreadCount.test.ts +126 -0
  205. package/src/client/utils/index.ts +1 -0
  206. package/src/client/utils/markerSyncEngine.ts +179 -0
  207. package/src/comment/api/getComments.ts +20 -4
  208. package/src/comment/api/tests/getComments.test.ts +12 -1
  209. package/src/comment/api/tests/queryComments.test.ts +2 -2
  210. package/src/core/model/idResolvers.ts +7 -0
  211. package/src/core/model/identifyModel.ts +1 -1
  212. package/src/core/model/index.ts +6 -0
  213. package/src/core/tests/query/query/runQuery.test.ts +3 -1
  214. package/src/group/utils/withUser.ts +2 -2
  215. package/src/index.ts +6 -0
  216. package/src/marker/api/getChannelMarkers.ts +53 -0
  217. package/src/marker/api/getMessageMarkers.ts +54 -0
  218. package/src/marker/api/getSubChannelMarkers.ts +54 -0
  219. package/src/marker/api/getUserMarker.ts +47 -0
  220. package/src/marker/api/index.ts +4 -0
  221. package/src/marker/api/tests/getChannelMarkers.test.ts +109 -0
  222. package/src/marker/api/tests/getMessageMarkers.test.ts +114 -0
  223. package/src/marker/api/tests/getSubChannelMarkers.test.ts +116 -0
  224. package/src/marker/events/index.ts +10 -0
  225. package/src/marker/events/onChannelMarkerFetched.ts +34 -0
  226. package/src/marker/events/onFeedlMarkerFetched.ts +34 -0
  227. package/src/marker/events/onMessageMarkerFetched.ts +34 -0
  228. package/src/marker/events/onSubChannelMarkerFetched.ts +34 -0
  229. package/src/marker/events/onSubChannelMarkerUpdated.ts +34 -0
  230. package/src/marker/events/onUserMarkerFetched.ts +34 -0
  231. package/src/message/api/createMessage.ts +1 -1
  232. package/src/message/api/getMessage.ts +6 -5
  233. package/src/message/api/getMessages.ts +7 -6
  234. package/src/message/api/index.ts +1 -0
  235. package/src/message/api/markAsDelivered.ts +36 -0
  236. package/src/message/api/queryMessages.ts +8 -6
  237. package/src/message/api/tests/createMessage.test.ts +13 -4
  238. package/src/message/api/tests/getMessage.test.ts +12 -3
  239. package/src/message/api/tests/getMessages.test.ts +14 -5
  240. package/src/message/api/tests/markAsDelivered.test.ts +83 -0
  241. package/src/message/api/tests/queryMessages.test.ts +14 -3
  242. package/src/message/api/updateMessage.ts +8 -7
  243. package/src/message/events/index.ts +2 -0
  244. package/src/message/events/onMessageCreated.ts +14 -41
  245. package/src/message/events/onMessageDeleted.ts +2 -2
  246. package/src/message/events/onMessageFlagCleared.ts +2 -2
  247. package/src/message/events/onMessageFlagged.ts +2 -2
  248. package/src/message/events/onMessageReactionAdded.ts +2 -2
  249. package/src/message/events/onMessageReactionRemoved.ts +2 -2
  250. package/src/message/events/onMessageUnflagged.ts +2 -2
  251. package/src/message/events/onMessageUpdated.ts +27 -5
  252. package/src/message/tests/events.test.ts +4 -2
  253. package/src/message/tests/observers/liveMessage.test.ts +22 -10
  254. package/src/message/tests/observers/liveMessages.test.ts +25 -18
  255. package/src/message/utils/index.ts +1 -140
  256. package/src/message/utils/prepareMessagePayload.ts +182 -0
  257. package/src/post/api/getPosts.ts +20 -4
  258. package/src/post/api/tests/getPosts.test.ts +18 -0
  259. package/src/reaction/events/onReactionAdded.ts +2 -2
  260. package/src/reaction/events/onReactionRemoved.ts +2 -2
  261. package/src/reaction/events/onReactorAdded.ts +2 -2
  262. package/src/reaction/events/onReactorRemoved.ts +2 -2
  263. package/src/report/api/createReport.ts +2 -1
  264. package/src/report/api/deleteReport.ts +2 -1
  265. package/src/subChannel/api/createSubChannel.ts +1 -1
  266. package/src/subChannel/api/getSubChannel.ts +1 -1
  267. package/src/subChannel/api/getSubChannels.ts +2 -1
  268. package/src/subChannel/api/index.ts +3 -0
  269. package/src/subChannel/api/querySubChannels.ts +1 -1
  270. package/src/subChannel/api/startReadingAPI.ts +33 -0
  271. package/src/subChannel/api/stopReadingAPI.ts +33 -0
  272. package/src/subChannel/api/tests/createSubChannel.test.ts +6 -3
  273. package/src/subChannel/api/tests/deleteSubChannel.test.ts +7 -5
  274. package/src/subChannel/api/tests/getSubChannel.test.ts +6 -4
  275. package/src/subChannel/api/tests/getSubChannels.test.ts +6 -3
  276. package/src/subChannel/api/tests/updateSubChannel.test.ts +6 -3
  277. package/src/subChannel/api/updateSubChannel.ts +1 -1
  278. package/src/subChannel/events/onSubChannelCreated.ts +2 -2
  279. package/src/subChannel/events/onSubChannelDeleted.ts +2 -2
  280. package/src/subChannel/events/onSubChannelUpdated.ts +43 -4
  281. package/src/subChannel/observers/liveSubChannel.ts +2 -0
  282. package/src/subChannel/observers/tests/liveSubChannel.test.ts +15 -10
  283. package/src/subChannel/observers/tests/liveSubChannels.test.ts +21 -14
  284. package/src/subChannel/utils/index.ts +2 -50
  285. package/src/subChannel/utils/markReadEngine.ts +117 -0
  286. package/src/subChannel/utils/prepareSubChannelPayload.ts +132 -0
  287. package/src/utils/liveObject.ts +15 -4
  288. package/src/utils/tests/client.ts +3 -1
  289. package/src/utils/tests/dummy/channel.ts +38 -21
  290. package/src/utils/tests/dummy/comment.ts +2 -2
  291. package/src/utils/tests/dummy/index.ts +1 -0
  292. package/src/utils/tests/dummy/marker.ts +68 -0
  293. package/src/utils/tests/dummy/message.ts +42 -2
  294. package/src/utils/tests/dummy/post.ts +1 -1
  295. package/src/utils/tests/dummy/subChannel.ts +16 -5
  296. package/src/utils/tests/utils.ts +4 -1
  297. package/dist/channel/api/startReading.d.ts +0 -17
  298. package/dist/channel/api/startReading.d.ts.map +0 -1
  299. package/dist/channel/api/stopReading.d.ts +0 -16
  300. package/dist/channel/api/stopReading.d.ts.map +0 -1
  301. package/dist/channel/api/tests/startReading.test.d.ts +0 -2
  302. package/dist/channel/api/tests/startReading.test.d.ts.map +0 -1
  303. package/dist/channel/api/tests/stopReading.test.d.ts +0 -2
  304. package/dist/channel/api/tests/stopReading.test.d.ts.map +0 -1
  305. package/src/channel/api/startReading.ts +0 -57
  306. package/src/channel/api/stopReading.ts +0 -53
  307. package/src/channel/api/tests/startReading.test.ts +0 -25
  308. package/src/channel/api/tests/stopReading.test.ts +0 -25
@@ -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
+ }
@@ -8,12 +8,18 @@ import { hasUpdates } from '~/core/model';
8
8
  import { createQuery, runQuery } from '~/core/query';
9
9
  import { ASCApiError } from '~/core/errors';
10
10
 
11
- export const liveObject = <T extends Amity.Models[Amity.Domain], K extends keyof T>(
11
+ export const liveObject = <
12
+ T extends Amity.Models[Amity.Domain],
13
+ K extends keyof T,
14
+ CallbackData extends any = any,
15
+ >(
12
16
  id: T[K],
13
- callback: Amity.LiveObjectCallback<T>,
17
+ callback: Amity.LiveObjectCallback<CallbackData>,
14
18
  key: K,
15
19
  fetcher: (id: T[K]) => Promise<Amity.Cached<T>>,
16
20
  eventHandlers: Array<(callback: Amity.Listener<T>) => Amity.Unsubscriber>,
21
+ callbackDataSelector: (data: T) => CallbackData = data => <CallbackData>data,
22
+ callbackFilter?: (currentModel: T, previousModel: T) => boolean,
17
23
  ): Amity.Unsubscriber => {
18
24
  const { cache } = getActiveClient();
19
25
 
@@ -26,8 +32,13 @@ export const liveObject = <T extends Amity.Models[Amity.Domain], K extends keyof
26
32
  const disposers: Amity.Unsubscriber[] = [];
27
33
 
28
34
  const dispatcher = (data: Amity.LiveObject<T>) => {
29
- model = data.data;
30
- callback(data);
35
+ const { data: newModel, ...rest } = data;
36
+
37
+ if (!callbackFilter || callbackFilter(newModel, model)) {
38
+ callback({ data: callbackDataSelector(newModel), ...rest });
39
+ }
40
+
41
+ model = newModel;
31
42
  };
32
43
 
33
44
  const realtimeRouter = (eventModel: T) => {
@@ -6,6 +6,8 @@ import {
6
6
 
7
7
  import { user11 } from './dummy';
8
8
 
9
+ export const activeUser = user11;
10
+
9
11
  const sessionHandler: Amity.SessionHandler = {
10
12
  sessionWillRenewAccessToken(_) {
11
13
  // do nothing
@@ -28,7 +30,7 @@ export const connectClient = async () => {
28
30
  data: {
29
31
  accessToken: 'accessToken',
30
32
  refreshToken: 'refreshToken',
31
- users: [user11],
33
+ users: [activeUser],
32
34
  expiresAt: nextMonth.toISOString(),
33
35
  issuedAt: now.toISOString(),
34
36
  },
@@ -1,6 +1,26 @@
1
+ import { withUsers } from '~/group/utils';
1
2
  import { convertFromRaw } from '~/channel/utils';
3
+ import { activeUser } from '~/utils/tests';
4
+ import * as activeUserModule from '~/client/api/activeUser';
5
+
2
6
  import { date, user11, user12, user13, user14, file11 } from '.';
3
7
 
8
+ export const convertChannelFromRaw = (
9
+ channel: Amity.RawChannel,
10
+ marker?: Amity.ChannelMarker,
11
+ ): Amity.Channel => {
12
+ jest.spyOn(activeUserModule, 'getActiveUser').mockReturnValue(activeUser);
13
+ return convertFromRaw(channel, marker);
14
+ };
15
+
16
+ export const convertRawChannelPayload = (
17
+ rawPayload: Amity.ChannelPayload,
18
+ ): Amity.ProcessedChannelPayload => ({
19
+ ...rawPayload,
20
+ channels: rawPayload.channels.map(channel => convertChannelFromRaw(channel)),
21
+ channelUsers: withUsers(rawPayload.channelUsers),
22
+ });
23
+
4
24
  export function generateRawChannel(params?: Partial<Amity.RawChannel>): Amity.RawChannel {
5
25
  const channelId = params?.channelId ?? 'channelId11';
6
26
 
@@ -19,7 +39,7 @@ export function generateRawChannel(params?: Partial<Amity.RawChannel>): Amity.Ra
19
39
  };
20
40
  }
21
41
 
22
- function generateRawChannelUser(
42
+ export function generateRawChannelUser(
23
43
  params?: Partial<Amity.RawMembership<'channel'>>,
24
44
  ): Amity.RawMembership<'channel'> {
25
45
  return {
@@ -38,15 +58,14 @@ function generateRawChannelUser(
38
58
  ...params,
39
59
  };
40
60
  }
41
- function convertChannelUserFromRaw(
61
+
62
+ export const convertChannelUserFromRaw = (
42
63
  member: Amity.RawMembership<'channel'>,
43
- user: Amity.User,
44
- ): Amity.Membership<'channel'> {
45
- return {
46
- ...member,
47
- user,
48
- };
49
- }
64
+ user: Amity.User | undefined,
65
+ ): Amity.Membership<'channel'> => ({
66
+ ...member,
67
+ user,
68
+ });
50
69
 
51
70
  export const mockPage = {
52
71
  paging: {
@@ -73,19 +92,17 @@ export const channelRaw3: Amity.RawChannel = generateRawChannel({
73
92
  channelId: 'channelId21',
74
93
  });
75
94
 
76
- export const channel1: Amity.Channel = convertFromRaw(channelRaw1, {
77
- defaultSubChannelHasUnreadMention: false,
78
- defaultSubChannelUnreadCount: 0,
79
- localLastMentionSegment: 0,
80
- localReadToSegment: 0,
81
- });
95
+ export const channel1: Amity.Channel = {
96
+ ...channelRaw1,
97
+ isUnreadCountSupport: true,
98
+ unreadCount: 0,
99
+ };
82
100
 
83
- export const channel2: Amity.Channel = convertFromRaw(channelRaw2, {
84
- defaultSubChannelHasUnreadMention: false,
85
- defaultSubChannelUnreadCount: 0,
86
- localLastMentionSegment: 0,
87
- localReadToSegment: 0,
88
- });
101
+ export const channel2: Amity.Channel = {
102
+ ...channelRaw2,
103
+ isUnreadCountSupport: true,
104
+ unreadCount: 0,
105
+ };
89
106
 
90
107
  export const rawChannelUser = generateRawChannelUser();
91
108
  export const channelUser = convertChannelUserFromRaw(rawChannelUser, user11);
@@ -1,6 +1,6 @@
1
- import { createComment, queryComments } from '~/comment/api';
1
+ import { createComment } from '~/comment/api';
2
2
  import { file11 } from './file';
3
- import { post11, post12 } from './post';
3
+ import { post11 } from './post';
4
4
  import { user11, user12 } from './user';
5
5
 
6
6
  export function generateComment(params?: Partial<Amity.Comment>): Amity.Comment {
@@ -14,6 +14,7 @@ export * from './reaction';
14
14
 
15
15
  export * from './channel';
16
16
  export * from './subChannel';
17
+ export * from './marker';
17
18
 
18
19
  export * from './message';
19
20
  export * from './token';
@@ -0,0 +1,68 @@
1
+ import { activeUser } from '../client';
2
+ import { date } from '.';
3
+
4
+ export const generateChannelMarker = ({
5
+ entityId,
6
+ ...params
7
+ }: MakeRequired<Amity.ChannelMarker, 'entityId'>): Amity.ChannelMarker => ({
8
+ entityId,
9
+ userId: activeUser.userId,
10
+ unreadCount: 0,
11
+ isDeleted: false,
12
+ createdAt: date,
13
+ updatedAt: date,
14
+ ...params,
15
+ });
16
+
17
+ export const generateSubChannelMarker = ({
18
+ feedId,
19
+ entityId,
20
+ ...params
21
+ }: MakeRequired<Amity.SubChannelMarker, 'feedId' | 'entityId'>): Amity.SubChannelMarker => ({
22
+ feedId,
23
+ entityId,
24
+ userId: activeUser.userId,
25
+ readToSegment: 0,
26
+ deliveredToSegment: 0,
27
+ unreadCount: 0,
28
+ createdAt: date,
29
+ updatedAt: date,
30
+ ...params,
31
+ });
32
+
33
+ export const generateMessageMarker = ({
34
+ feedId,
35
+ contentId,
36
+ ...params
37
+ }: MakeRequired<Amity.MessageMarker, 'feedId' | 'contentId'>): Amity.MessageMarker => ({
38
+ feedId,
39
+ contentId,
40
+ creatorId: activeUser.userId,
41
+ readCount: 0,
42
+ deliveredCount: 0,
43
+ createdAt: date,
44
+ updatedAt: date,
45
+ ...params,
46
+ });
47
+ export const generateFeedMarker = ({
48
+ feedId,
49
+ entityId,
50
+ ...params
51
+ }: MakeRequired<Amity.FeedMarker, 'feedId' | 'entityId'>): Amity.FeedMarker => ({
52
+ feedId,
53
+ entityId,
54
+ lastSegment: 0,
55
+ isDeleted: false,
56
+ createdAt: date,
57
+ updatedAt: date,
58
+ ...params,
59
+ });
60
+
61
+ export const generateUserMarker = (params?: Partial<Amity.UserMarker>): Amity.UserMarker => ({
62
+ lastSyncAt: date,
63
+ userId: activeUser.userId,
64
+ unreadCount: 0,
65
+ createdAt: date,
66
+ updatedAt: date,
67
+ ...params,
68
+ });
@@ -1,4 +1,3 @@
1
- import { convertFromRaw } from '~/message/utils';
2
1
  import { channel1, user11, file11 } from '.';
3
2
 
4
3
  export function generateRawMessage(params?: Partial<Amity.RawMessage>): Amity.RawMessage {
@@ -28,7 +27,48 @@ export function generateRawMessage(params?: Partial<Amity.RawMessage>): Amity.Ra
28
27
  };
29
28
  }
30
29
 
31
- export const message11: Amity.Message = convertFromRaw(
30
+ export const convertRawMessage = ({
31
+ channelPublicId,
32
+ childCount,
33
+ creatorPublicId,
34
+ mentionedUsers,
35
+ messageFeedId,
36
+ reactionCount,
37
+ reactions,
38
+ referenceId,
39
+ segment,
40
+ messageId,
41
+ myReactions,
42
+ ...rest
43
+ }: Amity.RawMessage): Amity.Message => ({
44
+ ...rest,
45
+ messageId,
46
+ channelId: channelPublicId,
47
+ channelSegment: segment,
48
+ childrenNumber: childCount,
49
+ creatorId: creatorPublicId,
50
+ mentionees: mentionedUsers?.map(mention => {
51
+ if (mention.type === 'channel') return mention;
52
+
53
+ return { type: 'user', userIds: mention.userPublicIds };
54
+ }),
55
+ reactions: reactions ?? {},
56
+ reactionsCount: reactionCount,
57
+ subChannelId: messageFeedId,
58
+ uniqueId: messageId,
59
+ myReactions: [],
60
+ readCount: 0,
61
+ deliveredCount: 0,
62
+ });
63
+
64
+ export const convertRawMessagePayload = (
65
+ rawPayload: Amity.MessagePayload,
66
+ ): Amity.ProcessedMessagePayload => ({
67
+ ...rawPayload,
68
+ messages: rawPayload.messages.map(convertRawMessage),
69
+ });
70
+
71
+ export const message11: Amity.Message = convertRawMessage(
32
72
  generateRawMessage({
33
73
  channelPublicId: channel1.channelId,
34
74
  creatorPublicId: user11.userId,
@@ -1,4 +1,4 @@
1
- import { user11, user12, file11, communityUser11, date, feed11 } from '.';
1
+ import { date, feed11, user11 } from '.';
2
2
 
3
3
  import { encodeJson } from '..';
4
4
 
@@ -1,11 +1,14 @@
1
+ import * as activeUserModule from '~/client/api/activeUser';
1
2
  import { convertFromRaw } from '~/subChannel/utils';
2
- import { channel1, date, user11 } from '.';
3
+ import { activeUser } from '~/utils/tests';
4
+
5
+ import { channelRaw1, date, user11 } from '.';
3
6
 
4
7
  export function generateRawSubChannel(params?: Partial<Amity.RawSubChannel>): Amity.RawSubChannel {
5
8
  return {
6
9
  channelId: 'private-channel-id',
7
- channelPublicId: channel1.channelId,
8
- channelType: channel1.type,
10
+ channelPublicId: channelRaw1.channelId,
11
+ channelType: channelRaw1.type,
9
12
  childCount: 0,
10
13
  createdAt: date,
11
14
  creatorId: 'private-user-id',
@@ -13,7 +16,7 @@ export function generateRawSubChannel(params?: Partial<Amity.RawSubChannel>): Am
13
16
  isDeleted: false,
14
17
  lastMessageId: 'xxx',
15
18
  lastMessageTimestamp: date,
16
- messageFeedId: `${channel1.channelId}--sub-channel-id`,
19
+ messageFeedId: `${channelRaw1.channelId}--sub-channel-id`,
17
20
  name: 'sub channel name',
18
21
  path: 'sub-channel-path',
19
22
  updatedAt: date,
@@ -21,9 +24,17 @@ export function generateRawSubChannel(params?: Partial<Amity.RawSubChannel>): Am
21
24
  };
22
25
  }
23
26
 
27
+ export const convertSubChannelFromRaw = (
28
+ subChannel: Amity.RawSubChannel,
29
+ marker?: Amity.SubChannelMarker,
30
+ ): Amity.SubChannel => {
31
+ jest.spyOn(activeUserModule, 'getActiveUser').mockReturnValue(activeUser);
32
+ return convertFromRaw(subChannel, marker);
33
+ };
34
+
24
35
  export function generateSubChannel(params?: Record<string, any>): Amity.SubChannel {
25
36
  return {
26
- ...convertFromRaw(generateRawSubChannel()),
37
+ ...convertSubChannelFromRaw(generateRawSubChannel()),
27
38
  ...params,
28
39
  };
29
40
  }
@@ -6,8 +6,11 @@ export const encodeJson = (value: Record<string, any>) => encode(JSON.stringify(
6
6
  * Used instead of asserting an async request is completed, when the async
7
7
  * request is not the API being tested. This util makes tests readable by moving
8
8
  * all assertions to the end of the test
9
+ *
10
+ * Use 500ms by default on MacBook Pro Core-i5 2020. Lower than this is not enough
11
+ * to wait for async task before assertions.
9
12
  */
10
- export const pause = (ms = 50) =>
13
+ export const pause = (ms = 500) =>
11
14
  new Promise(resolve => {
12
15
  setTimeout(resolve, ms);
13
16
  });
@@ -1,17 +0,0 @@
1
- /**
2
- * ```js
3
- * import { startReading } from '@amityco/ts-sdk'
4
- * const success = await startReading('foo')
5
- * ```
6
- *
7
- * Mark all messages as read and start reading message inside channel
8
- *
9
- * @param subChannelId - The channel ID to start reading.
10
- * @param userId - The user ID of channel member.
11
- * @return A success boolean if the channel reading of the sub channel had begun.
12
- *
13
- * @category Message API
14
- * @async
15
- */
16
- export declare const startReading: (subChannelId: string, userId?: string | undefined) => Promise<boolean | undefined>;
17
- //# sourceMappingURL=startReading.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"startReading.d.ts","sourceRoot":"","sources":["../../../src/channel/api/startReading.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,YAAY,iBAAwB,MAAM,8DAiCtD,CAAC"}
@@ -1,16 +0,0 @@
1
- /**
2
- * ```js
3
- * import { stopReading } from '@amityco/ts-sdk'
4
- * const success = await stopReading('foo')
5
- * ```
6
- *
7
- * Stop reading message inside channel
8
- *
9
- * @param subChannelId - The channel ID to stop reading.
10
- * @return A success boolean if the sub channel reading was halted.
11
- *
12
- * @category Message API
13
- * @async
14
- */
15
- export declare const stopReading: (subChannelId: string) => Promise<boolean | undefined>;
16
- //# sourceMappingURL=stopReading.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stopReading.d.ts","sourceRoot":"","sources":["../../../src/channel/api/stopReading.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,WAAW,iBAAwB,MAAM,iCA8BrD,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=startReading.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"startReading.test.d.ts","sourceRoot":"","sources":["../../../../src/channel/api/tests/startReading.test.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=stopReading.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stopReading.test.d.ts","sourceRoot":"","sources":["../../../../src/channel/api/tests/stopReading.test.ts"],"names":[],"mappings":""}