@amityco/ts-sdk 6.7.2 → 6.7.3-cbeeb97.0

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 (189) hide show
  1. package/dist/@types/core/events.d.ts +9 -3
  2. package/dist/@types/core/events.d.ts.map +1 -1
  3. package/dist/@types/core/marker.d.ts +3 -0
  4. package/dist/@types/core/marker.d.ts.map +1 -1
  5. package/dist/@types/core/model.d.ts +2 -2
  6. package/dist/@types/core/model.d.ts.map +1 -1
  7. package/dist/@types/core/payload.d.ts +40 -36
  8. package/dist/@types/core/payload.d.ts.map +1 -1
  9. package/dist/@types/domains/channel.d.ts +1 -0
  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/comment.d.ts +20 -8
  14. package/dist/@types/domains/comment.d.ts.map +1 -1
  15. package/dist/@types/domains/partials.d.ts +3 -0
  16. package/dist/@types/domains/partials.d.ts.map +1 -1
  17. package/dist/@types/domains/post.d.ts +1 -1
  18. package/dist/@types/domains/post.d.ts.map +1 -1
  19. package/dist/@types/domains/subChannel.d.ts +1 -0
  20. package/dist/@types/domains/subChannel.d.ts.map +1 -1
  21. package/dist/channelRepsitory/api/markAsRead.d.ts.map +1 -1
  22. package/dist/channelRepsitory/observers/getChannels.d.ts.map +1 -1
  23. package/dist/channelRepsitory/utils/getChannelHasMentioned.d.ts +7 -0
  24. package/dist/channelRepsitory/utils/getChannelHasMentioned.d.ts.map +1 -0
  25. package/dist/channelRepsitory/utils/prepareChannelPayload.d.ts.map +1 -1
  26. package/dist/client/api/markerSync.d.ts.map +1 -1
  27. package/dist/client/observers/getTotalUnreadCount.d.ts +2 -0
  28. package/dist/client/observers/getTotalUnreadCount.d.ts.map +1 -1
  29. package/dist/client/observers/getUserUnread.d.ts +19 -0
  30. package/dist/client/observers/getUserUnread.d.ts.map +1 -0
  31. package/dist/client/observers/index.d.ts +1 -0
  32. package/dist/client/observers/index.d.ts.map +1 -1
  33. package/dist/client/utils/markerSyncEngine.d.ts.map +1 -1
  34. package/dist/client/utils/onOnline.d.ts +2 -0
  35. package/dist/client/utils/onOnline.d.ts.map +1 -0
  36. package/dist/commentRepository/api/createComment.d.ts +4 -4
  37. package/dist/commentRepository/api/createComment.d.ts.map +1 -1
  38. package/dist/commentRepository/api/deleteComment.d.ts +4 -4
  39. package/dist/commentRepository/api/deleteComment.d.ts.map +1 -1
  40. package/dist/commentRepository/api/flagComment.d.ts +1 -1
  41. package/dist/commentRepository/api/flagComment.d.ts.map +1 -1
  42. package/dist/commentRepository/api/getComment.d.ts +8 -8
  43. package/dist/commentRepository/api/getComment.d.ts.map +1 -1
  44. package/dist/commentRepository/api/getCommentByIds.d.ts +8 -8
  45. package/dist/commentRepository/api/getCommentByIds.d.ts.map +1 -1
  46. package/dist/commentRepository/api/hardDeleteComment.d.ts +4 -4
  47. package/dist/commentRepository/api/hardDeleteComment.d.ts.map +1 -1
  48. package/dist/commentRepository/api/isCommentFlaggedByMe.d.ts +1 -1
  49. package/dist/commentRepository/api/isCommentFlaggedByMe.d.ts.map +1 -1
  50. package/dist/commentRepository/api/queryComments.d.ts +3 -3
  51. package/dist/commentRepository/api/queryComments.d.ts.map +1 -1
  52. package/dist/commentRepository/api/softDeleteComment.d.ts +4 -4
  53. package/dist/commentRepository/api/softDeleteComment.d.ts.map +1 -1
  54. package/dist/commentRepository/api/unflagComment.d.ts +1 -1
  55. package/dist/commentRepository/api/unflagComment.d.ts.map +1 -1
  56. package/dist/commentRepository/api/updateComment.d.ts +4 -4
  57. package/dist/commentRepository/api/updateComment.d.ts.map +1 -1
  58. package/dist/commentRepository/events/onCommentCreated.d.ts +3 -3
  59. package/dist/commentRepository/events/onCommentCreated.d.ts.map +1 -1
  60. package/dist/commentRepository/events/onCommentDeleted.d.ts +3 -3
  61. package/dist/commentRepository/events/onCommentDeleted.d.ts.map +1 -1
  62. package/dist/commentRepository/events/onCommentFlagged.d.ts +3 -3
  63. package/dist/commentRepository/events/onCommentFlagged.d.ts.map +1 -1
  64. package/dist/commentRepository/events/onCommentReactionAdded.d.ts +3 -3
  65. package/dist/commentRepository/events/onCommentReactionAdded.d.ts.map +1 -1
  66. package/dist/commentRepository/events/onCommentReactionRemoved.d.ts +3 -3
  67. package/dist/commentRepository/events/onCommentReactionRemoved.d.ts.map +1 -1
  68. package/dist/commentRepository/events/onCommentUnflagged.d.ts +3 -3
  69. package/dist/commentRepository/events/onCommentUnflagged.d.ts.map +1 -1
  70. package/dist/commentRepository/events/onCommentUpdated.d.ts +3 -3
  71. package/dist/commentRepository/events/onCommentUpdated.d.ts.map +1 -1
  72. package/dist/commentRepository/events/utils.d.ts +1 -1
  73. package/dist/commentRepository/events/utils.d.ts.map +1 -1
  74. package/dist/commentRepository/observers/getComment.d.ts +3 -3
  75. package/dist/commentRepository/observers/getComment.d.ts.map +1 -1
  76. package/dist/commentRepository/observers/getComments.d.ts +4 -4
  77. package/dist/commentRepository/observers/getComments.d.ts.map +1 -1
  78. package/dist/commentRepository/observers/observeComment.d.ts +3 -3
  79. package/dist/commentRepository/observers/observeComment.d.ts.map +1 -1
  80. package/dist/commentRepository/observers/observeComments.d.ts +3 -3
  81. package/dist/commentRepository/observers/observeComments.d.ts.map +1 -1
  82. package/dist/index.cjs.js +2253 -18192
  83. package/dist/index.esm.js +273 -107
  84. package/dist/index.umd.js +4 -4
  85. package/dist/marker/api/getChannelMarkers.d.ts.map +1 -1
  86. package/dist/marker/api/getMessageMarkers.d.ts.map +1 -1
  87. package/dist/marker/api/getSubChannelMarkers.d.ts.map +1 -1
  88. package/dist/marker/api/getUserMarker.d.ts.map +1 -1
  89. package/dist/marker/events/onUserMarkerSync.d.ts.map +1 -1
  90. package/dist/messageRepository/api/getDeliveredUsers.d.ts.map +1 -1
  91. package/dist/messageRepository/api/getReadUsers.d.ts.map +1 -1
  92. package/dist/messageRepository/api/markAsDelivered.d.ts.map +1 -1
  93. package/dist/reactionRepository/events/onReactionAdded.d.ts +1 -1
  94. package/dist/reactionRepository/events/onReactionAdded.d.ts.map +1 -1
  95. package/dist/reactionRepository/events/onReactionRemoved.d.ts +1 -1
  96. package/dist/reactionRepository/events/onReactionRemoved.d.ts.map +1 -1
  97. package/dist/reactionRepository/utils/fetchReference.d.ts +1 -1
  98. package/dist/reactionRepository/utils/fetchReference.d.ts.map +1 -1
  99. package/dist/subChannelRepository/api/readingAPI.d.ts.map +1 -1
  100. package/dist/subChannelRepository/api/startReadingAPI.d.ts.map +1 -1
  101. package/dist/subChannelRepository/api/stopReadingAPI.d.ts.map +1 -1
  102. package/dist/subChannelRepository/utils/getSubChannelHasMentioned.d.ts +2 -0
  103. package/dist/subChannelRepository/utils/getSubChannelHasMentioned.d.ts.map +1 -0
  104. package/dist/subChannelRepository/utils/markReadEngine.d.ts.map +1 -1
  105. package/dist/subChannelRepository/utils/prepareSubChannelPayload.d.ts.map +1 -1
  106. package/dist/utils/linkedObject/commentLinkedObject.d.ts +2 -0
  107. package/dist/utils/linkedObject/commentLinkedObject.d.ts.map +1 -0
  108. package/dist/utils/linkedObject/index.d.ts +4 -0
  109. package/dist/utils/linkedObject/index.d.ts.map +1 -0
  110. package/dist/utils/marker.d.ts +4 -0
  111. package/dist/utils/marker.d.ts.map +1 -0
  112. package/dist/utils/tests/dummy/channel.d.ts.map +1 -1
  113. package/dist/utils/tests/dummy/comment.d.ts +20 -14
  114. package/dist/utils/tests/dummy/comment.d.ts.map +1 -1
  115. package/dist/utils/tests/dummy/marker.d.ts +3 -0
  116. package/dist/utils/tests/dummy/marker.d.ts.map +1 -1
  117. package/package.json +3 -1
  118. package/rollup.config.js +2 -0
  119. package/src/@types/core/events.ts +3 -9
  120. package/src/@types/core/marker.ts +3 -0
  121. package/src/@types/core/model.ts +2 -2
  122. package/src/@types/core/payload.ts +41 -36
  123. package/src/@types/domains/channel.ts +1 -0
  124. package/src/@types/domains/client.ts +2 -0
  125. package/src/@types/domains/comment.ts +20 -8
  126. package/src/@types/domains/partials.ts +4 -0
  127. package/src/@types/domains/post.ts +1 -1
  128. package/src/@types/domains/subChannel.ts +1 -0
  129. package/src/channelRepsitory/api/markAsRead.ts +22 -1
  130. package/src/channelRepsitory/observers/getChannels.ts +3 -2
  131. package/src/channelRepsitory/observers/tests/getChannels.test.ts +6 -2
  132. package/src/channelRepsitory/utils/getChannelHasMentioned.ts +28 -0
  133. package/src/channelRepsitory/utils/prepareChannelPayload.ts +4 -0
  134. package/src/channelRepsitory/utils/tests/prepareChannelPayload.test.ts +3 -0
  135. package/src/client/api/markerSync.ts +17 -2
  136. package/src/client/observers/getTotalUnreadCount.ts +2 -0
  137. package/src/client/observers/getUserUnread.ts +47 -0
  138. package/src/client/observers/index.ts +1 -0
  139. package/src/client/utils/markerSyncEngine.ts +5 -13
  140. package/src/client/utils/onOnline.ts +15 -0
  141. package/src/commentRepository/api/createComment.ts +5 -5
  142. package/src/commentRepository/api/deleteComment.ts +6 -5
  143. package/src/commentRepository/api/flagComment.ts +3 -1
  144. package/src/commentRepository/api/getComment.ts +13 -12
  145. package/src/commentRepository/api/getCommentByIds.ts +11 -11
  146. package/src/commentRepository/api/hardDeleteComment.ts +5 -5
  147. package/src/commentRepository/api/isCommentFlaggedByMe.ts +1 -1
  148. package/src/commentRepository/api/queryComments.ts +4 -4
  149. package/src/commentRepository/api/softDeleteComment.ts +5 -5
  150. package/src/commentRepository/api/tests/queryComments.test.ts +9 -9
  151. package/src/commentRepository/api/unflagComment.ts +3 -1
  152. package/src/commentRepository/api/updateComment.ts +6 -6
  153. package/src/commentRepository/events/onCommentCreated.ts +5 -4
  154. package/src/commentRepository/events/onCommentDeleted.ts +5 -4
  155. package/src/commentRepository/events/onCommentFlagged.ts +5 -4
  156. package/src/commentRepository/events/onCommentReactionAdded.ts +4 -4
  157. package/src/commentRepository/events/onCommentReactionRemoved.ts +4 -4
  158. package/src/commentRepository/events/onCommentUnflagged.ts +5 -4
  159. package/src/commentRepository/events/onCommentUpdated.ts +5 -4
  160. package/src/commentRepository/events/utils.ts +3 -3
  161. package/src/commentRepository/observers/getComment.ts +4 -4
  162. package/src/commentRepository/observers/getComments.ts +9 -8
  163. package/src/commentRepository/observers/observeComment.ts +14 -8
  164. package/src/commentRepository/observers/observeComments.ts +9 -6
  165. package/src/commentRepository/observers/tests/getComment.test.ts +3 -1
  166. package/src/marker/api/getChannelMarkers.ts +9 -3
  167. package/src/marker/api/getMessageMarkers.ts +5 -2
  168. package/src/marker/api/getSubChannelMarkers.ts +16 -2
  169. package/src/marker/api/getUserMarker.ts +9 -2
  170. package/src/marker/api/tests/getMessageMarkers.test.ts +3 -1
  171. package/src/marker/api/tests/getSubChannelMarkers.test.ts +16 -8
  172. package/src/marker/events/onUserMarkerSync.ts +18 -2
  173. package/src/messageRepository/api/getDeliveredUsers.ts +9 -2
  174. package/src/messageRepository/api/getReadUsers.ts +6 -2
  175. package/src/messageRepository/api/markAsDelivered.ts +17 -1
  176. package/src/messageRepository/api/tests/markAsDelivered.test.ts +11 -4
  177. package/src/reactionRepository/utils/prepareReactionPayloadFormEvent.ts +1 -1
  178. package/src/subChannelRepository/api/readingAPI.ts +17 -2
  179. package/src/subChannelRepository/api/startReadingAPI.ts +17 -2
  180. package/src/subChannelRepository/api/stopReadingAPI.ts +17 -2
  181. package/src/subChannelRepository/utils/getSubChannelHasMentioned.ts +34 -0
  182. package/src/subChannelRepository/utils/markReadEngine.ts +7 -15
  183. package/src/subChannelRepository/utils/prepareSubChannelPayload.ts +4 -0
  184. package/src/utils/linkedObject/commentLinkedObject.ts +44 -0
  185. package/src/utils/linkedObject/index.ts +5 -0
  186. package/src/utils/marker.ts +29 -0
  187. package/src/utils/tests/dummy/channel.ts +2 -0
  188. package/src/utils/tests/dummy/comment.ts +25 -8
  189. package/src/utils/tests/dummy/marker.ts +46 -0
@@ -1,6 +1,11 @@
1
1
  import { ingestInCache } from '~/cache/api/ingestInCache';
2
2
  import { getActiveClient } from '~/client/api';
3
3
  import { createEventSubscriber } from '~/core/events';
4
+ import {
5
+ convertChannelMarkerResponse,
6
+ convertSubChannelMarkerResponse,
7
+ convertUserMarkerResponse,
8
+ } from '~/utils/marker';
4
9
 
5
10
  /**
6
11
  * ```js
@@ -23,8 +28,19 @@ export const onUserMarkerSync = (
23
28
  const client = getActiveClient();
24
29
 
25
30
  const filter = (payload: Amity.Events['marker.user-sync']) => {
26
- ingestInCache(payload);
27
- callback(payload.userMarkers[0]);
31
+ const {
32
+ userMarkers: userMarkersPayload,
33
+ userEntityMarkers: userEntityMarkersPayload,
34
+ userFeedMarkers: userFeedMarkersPayload,
35
+ ...rest
36
+ } = payload;
37
+
38
+ const userMarkers = convertUserMarkerResponse(userMarkersPayload);
39
+ const userEntityMarkers = convertChannelMarkerResponse(userEntityMarkersPayload);
40
+ const userFeedMarker = convertSubChannelMarkerResponse(userFeedMarkersPayload);
41
+
42
+ ingestInCache({ userMarkers, userEntityMarkers, userFeedMarker, ...rest });
43
+ callback(userMarkers[0]);
28
44
  };
29
45
 
30
46
  return createEventSubscriber(client, 'UserMarker/onUserMarkerSync', 'marker.user-sync', filter);
@@ -3,6 +3,7 @@ import { getActiveClient } from '~/client/api';
3
3
  import { toPage, toToken } from '~/core/query';
4
4
  import { pullFromCache, pushToCache } from '~/cache/api';
5
5
  import { getUserByIds } from '~/userRepository';
6
+ import { convertSubChannelMarkerResponse } from '~/utils/marker';
6
7
 
7
8
  /**
8
9
  * ```js
@@ -40,11 +41,17 @@ export const getDeliveredUsers = async (
40
41
  },
41
42
  );
42
43
 
43
- const { paging, publicUserIds: deliveredUsers, ...payload } = data;
44
+ const { paging, publicUserIds: deliveredUsers, userFeedMarkers, ...payload } = data;
44
45
  const cachedAt = client.cache && Date.now();
45
46
 
46
47
  if (client.cache) {
47
- ingestInCache(payload as Omit<Amity.DeliveredUserPayload, 'publicUserIds'>, { cachedAt });
48
+ ingestInCache(
49
+ {
50
+ ...payload,
51
+ userFeedMarkers: convertSubChannelMarkerResponse(userFeedMarkers),
52
+ },
53
+ { cachedAt },
54
+ );
48
55
 
49
56
  const cacheKey = [
50
57
  'delivered-user',
@@ -3,6 +3,7 @@ import { getActiveClient } from '~/client/api';
3
3
  import { toPage, toToken } from '~/core/query';
4
4
  import { pullFromCache, pushToCache } from '~/cache/api';
5
5
  import { getUserByIds } from '~/userRepository';
6
+ import { convertSubChannelMarkerResponse } from '~/utils/marker';
6
7
 
7
8
  /**
8
9
  * ```js
@@ -41,11 +42,14 @@ export const getReadUsers = async (
41
42
  },
42
43
  );
43
44
 
44
- const { paging, publicUserIds: readUsers, ...payload } = data;
45
+ const { paging, publicUserIds: readUsers, userFeedMarkers, ...payload } = data;
45
46
  const cachedAt = client.cache && Date.now();
46
47
 
47
48
  if (client.cache) {
48
- ingestInCache(payload as Omit<Amity.ReadUserPayload, 'publicUserIds'>, { cachedAt });
49
+ ingestInCache(
50
+ { ...payload, userFeedMarkers: convertSubChannelMarkerResponse(userFeedMarkers) },
51
+ { cachedAt },
52
+ );
49
53
 
50
54
  const cacheKey = [
51
55
  'read-user',
@@ -1,5 +1,10 @@
1
1
  import { getActiveClient } from '~/client/api';
2
2
  import { ingestInCache } from '~/cache/api/ingestInCache';
3
+ import {
4
+ convertChannelMarkerResponse,
5
+ convertSubChannelMarkerResponse,
6
+ convertUserMarkerResponse,
7
+ } from '~/utils/marker';
3
8
 
4
9
  /**
5
10
  * ```js
@@ -28,9 +33,20 @@ export const markAsDelivered = async (
28
33
  { messageId },
29
34
  );
30
35
 
36
+ const { userMarkers, userEntityMarkers, userFeedMarkers, ...rest } = data;
37
+
31
38
  const cachedAt = client.cache && Date.now();
32
39
 
33
- if (client.cache) ingestInCache(data, { cachedAt });
40
+ if (client.cache)
41
+ ingestInCache(
42
+ {
43
+ userMarkers: convertUserMarkerResponse(userMarkers),
44
+ userEntityMarkers: convertChannelMarkerResponse(userEntityMarkers),
45
+ userFeedMarkers: convertSubChannelMarkerResponse(userFeedMarkers),
46
+ ...rest,
47
+ },
48
+ { cachedAt },
49
+ );
34
50
 
35
51
  return true;
36
52
  };
@@ -6,10 +6,13 @@ import {
6
6
  connectClient,
7
7
  disconnectClient,
8
8
  generateFeedMarker,
9
- generateUserMarker,
9
+ generateUserMarkerResponse,
10
10
  generateChannelMarker,
11
11
  generateSubChannelMarker,
12
12
  activeUser,
13
+ generateUserMarker,
14
+ generateChannelMarkerResponse,
15
+ generateSubChannelMarkerResponse,
13
16
  } from '~/utils/tests';
14
17
 
15
18
  import { markAsDelivered } from '../markAsDelivered';
@@ -19,6 +22,10 @@ const entityId = 'feed1';
19
22
  const feedId = 'sub-ch1';
20
23
  const messageId = 'message1';
21
24
 
25
+ const userMarkersResponse = generateUserMarkerResponse({ userId });
26
+ const channelMarkersResponse = generateChannelMarkerResponse({ userId, entityId });
27
+ const subChannelMarkerResponse = generateSubChannelMarkerResponse({ userId, feedId, entityId });
28
+
22
29
  const expectedUserMarker = generateUserMarker({ userId });
23
30
  const expectedChannelMarker = generateChannelMarker({ userId, entityId });
24
31
  const expectedSubChannelMarker = generateSubChannelMarker({ userId, feedId, entityId });
@@ -26,9 +33,9 @@ const expectedFeedMarker = generateFeedMarker({ feedId, entityId });
26
33
 
27
34
  const resolvedPutValue = {
28
35
  data: {
29
- userMarkers: [expectedUserMarker],
30
- userEntityMarkers: [expectedChannelMarker],
31
- userFeedMarkers: [expectedSubChannelMarker],
36
+ userMarkers: [userMarkersResponse],
37
+ userEntityMarkers: [channelMarkersResponse],
38
+ userFeedMarkers: [subChannelMarkerResponse],
32
39
  feedMarkers: [expectedFeedMarker],
33
40
  } as Amity.MarkDeliveredPayload,
34
41
  };
@@ -18,7 +18,7 @@ const getMyReactionsInCache = <T extends Amity.PostPayload | Amity.CommentPayloa
18
18
  throw new Error(`Unknown event type`);
19
19
  }
20
20
 
21
- return pullFromCache<Amity.Comment>([domain, 'get', id])?.data?.myReactions || [];
21
+ return pullFromCache<Amity.InternalComment>([domain, 'get', id])?.data?.myReactions || [];
22
22
  };
23
23
 
24
24
  const rebuildPayload = <T extends Amity.PostPayload | Amity.CommentPayload, K extends keyof T>(
@@ -1,6 +1,11 @@
1
1
  import { ingestInCache } from '~/cache/api/ingestInCache';
2
2
  import { getActiveClient } from '~/client/api/activeClient';
3
3
  import { fireEvent } from '~/core/events';
4
+ import {
5
+ convertChannelMarkerResponse,
6
+ convertSubChannelMarkerResponse,
7
+ convertUserMarkerResponse,
8
+ } from '~/utils/marker';
4
9
 
5
10
  /**
6
11
  * ```js
@@ -28,10 +33,20 @@ export const readingAPI = async (
28
33
  { messageFeedIds },
29
34
  );
30
35
 
31
- const { userEntityMarkers, userFeedMarkers, feedMarkers, userMarkers } = payload;
36
+ const {
37
+ userEntityMarkers: userEntityMarkersPayload,
38
+ userFeedMarkers: userFeedMarkersPayload,
39
+ feedMarkers,
40
+ userMarkers: userMarkersPayload,
41
+ } = payload;
42
+
43
+ const userMarkers = convertUserMarkerResponse(userMarkersPayload);
44
+ const userEntityMarkers = convertChannelMarkerResponse(userEntityMarkersPayload);
45
+ const userFeedMarkers = convertSubChannelMarkerResponse(userFeedMarkersPayload);
32
46
 
33
47
  const cachedAt = client.cache && Date.now();
34
- if (client.cache) ingestInCache(payload as Amity.ReadingPayload, { cachedAt });
48
+ if (client.cache)
49
+ ingestInCache({ userEntityMarkers, userFeedMarkers, feedMarkers, userMarkers }, { cachedAt });
35
50
 
36
51
  fireEvent('local.feedMarker.fetched', { feedMarkers });
37
52
  fireEvent('local.channelMarker.fetched', { userEntityMarkers });
@@ -1,6 +1,11 @@
1
1
  import { ingestInCache } from '~/cache/api/ingestInCache';
2
2
  import { getActiveClient } from '~/client/api/activeClient';
3
3
  import { fireEvent } from '~/core/events';
4
+ import {
5
+ convertChannelMarkerResponse,
6
+ convertSubChannelMarkerResponse,
7
+ convertUserMarkerResponse,
8
+ } from '~/utils/marker';
4
9
 
5
10
  /**
6
11
  * ```js
@@ -27,10 +32,20 @@ export const startReadingAPI = async (
27
32
  `/api/v1/markers/message-feeds/${messageFeedId}/start-reading`,
28
33
  );
29
34
 
30
- const { userEntityMarkers, userFeedMarkers, feedMarkers, userMarkers } = payload;
35
+ const {
36
+ userEntityMarkers: userEntityMarkersPayload,
37
+ userFeedMarkers: userFeedMarkersPayload,
38
+ feedMarkers,
39
+ userMarkers: userMarkersPayload,
40
+ } = payload;
41
+
42
+ const userMarkers = convertUserMarkerResponse(userMarkersPayload);
43
+ const userEntityMarkers = convertChannelMarkerResponse(userEntityMarkersPayload);
44
+ const userFeedMarkers = convertSubChannelMarkerResponse(userFeedMarkersPayload);
31
45
 
32
46
  const cachedAt = client.cache && Date.now();
33
- if (client.cache) ingestInCache(payload as Amity.StartReadingPayload, { cachedAt });
47
+ if (client.cache)
48
+ ingestInCache({ userEntityMarkers, userFeedMarkers, feedMarkers, userMarkers }, { cachedAt });
34
49
 
35
50
  fireEvent('local.feedMarker.fetched', { feedMarkers });
36
51
  fireEvent('local.channelMarker.fetched', { userEntityMarkers });
@@ -1,6 +1,11 @@
1
1
  import { ingestInCache } from '~/cache/api/ingestInCache';
2
2
  import { getActiveClient } from '~/client/api/activeClient';
3
3
  import { fireEvent } from '~/core/events';
4
+ import {
5
+ convertChannelMarkerResponse,
6
+ convertSubChannelMarkerResponse,
7
+ convertUserMarkerResponse,
8
+ } from '~/utils/marker';
4
9
 
5
10
  /**
6
11
  * ```js
@@ -27,10 +32,20 @@ export const stopReadingAPI = async (
27
32
  `/api/v1/markers/message-feeds/${messageFeedId}/stop-reading`,
28
33
  );
29
34
 
30
- const { userEntityMarkers, userFeedMarkers, feedMarkers, userMarkers } = payload;
35
+ const {
36
+ userEntityMarkers: userEntityMarkersPayload,
37
+ userFeedMarkers: userFeedMarkersPayload,
38
+ feedMarkers,
39
+ userMarkers: userMarkersPayload,
40
+ } = payload;
41
+
42
+ const userMarkers = convertUserMarkerResponse(userMarkersPayload);
43
+ const userEntityMarkers = convertChannelMarkerResponse(userEntityMarkersPayload);
44
+ const userFeedMarkers = convertSubChannelMarkerResponse(userFeedMarkersPayload);
31
45
 
32
46
  const cachedAt = client.cache && Date.now();
33
- if (client.cache) ingestInCache(payload as Amity.StopReadingPayload, { cachedAt });
47
+ if (client.cache)
48
+ ingestInCache({ userEntityMarkers, userFeedMarkers, feedMarkers, userMarkers }, { cachedAt });
34
49
 
35
50
  fireEvent('local.feedMarker.fetched', { feedMarkers });
36
51
  fireEvent('local.channelMarker.fetched', { userEntityMarkers });
@@ -0,0 +1,34 @@
1
+ import { pullFromCache } from '~/cache/api/pullFromCache';
2
+ import { getActiveUser } from '~/client/api/activeUser';
3
+ import { getResolver } from '~/core/model';
4
+
5
+ export function getSubChannelHasMentioned(
6
+ channelId: string,
7
+ subChannelId: string,
8
+ marker?: Amity.SubChannelMarker,
9
+ ) {
10
+ // Look for `unreadCount` in the marker param first
11
+ if (marker) {
12
+ return marker.hasMentioned;
13
+ }
14
+
15
+ const key = {
16
+ entityId: channelId,
17
+ feedId: subChannelId,
18
+ userId: getActiveUser()._id,
19
+ };
20
+
21
+ // If the marker param is not set, look in the cache
22
+ const cachedMarker = pullFromCache<Amity.SubChannelMarker>([
23
+ 'subChannelMarker',
24
+ 'get',
25
+ getResolver('subChannelMarker')(key),
26
+ ])?.data;
27
+
28
+ if (cachedMarker) {
29
+ return cachedMarker.hasMentioned;
30
+ }
31
+
32
+ // and if not found in cache use default value `false`
33
+ return false;
34
+ }
@@ -2,6 +2,7 @@ import { onSessionStateChange } from '~/client/events/onSessionStateChange';
2
2
  import { getMarkedMessageTopic, subscribeTopic } from '~/core/subscription';
3
3
  import { setIntervalTask } from '~/utils/timer';
4
4
 
5
+ import { onOnline } from '~/client/utils/onOnline';
5
6
  import { getSubChannel } from '../api/getSubChannel';
6
7
  import { readingAPI } from '../api/readingAPI';
7
8
  import { startReadingAPI } from '../api/startReadingAPI';
@@ -68,20 +69,6 @@ export const markReadEngineOnLoginHandler = () => {
68
69
  };
69
70
  };
70
71
 
71
- /**
72
- * the event callback when app is back to online
73
- */
74
- const onOnline = () => {
75
- const callback = () => {
76
- // Start reading the reading subChannel again when resume from offline state
77
- startReadingFromReadingList();
78
- };
79
-
80
- window.addEventListener('online', callback);
81
-
82
- return () => window.removeEventListener('online', callback);
83
- };
84
-
85
72
  const getParentChannelId = async (
86
73
  subChannelId: Amity.SubChannel['subChannelId'],
87
74
  ): Promise<Amity.SubChannel['channelId']> => {
@@ -96,7 +83,12 @@ const getParentChannelId = async (
96
83
  };
97
84
 
98
85
  const registerEventListeners = () => {
99
- disposers.push(onOnline());
86
+ disposers.push(
87
+ onOnline(() => {
88
+ // Start reading the reading subChannel again when resume from offline state
89
+ startReadingFromReadingList();
90
+ }),
91
+ );
100
92
  };
101
93
 
102
94
  const registerTopicSubscribers = async (subChannelId: Amity.SubChannel['subChannelId']) => {
@@ -3,6 +3,7 @@ import { getSubChannelMarkers } from '~/marker/api';
3
3
  import { convertFromRaw as convertMessageFromRaw } from '~/messageRepository/utils/prepareMessagePayload';
4
4
 
5
5
  import { getSubChannelUnreadCount } from './getSubChannelUnreadCount';
6
+ import { getSubChannelHasMentioned } from './getSubChannelHasMentioned';
6
7
 
7
8
  export const MARKER_INCLUDED_SUB_CHANNEL_TYPE = ['broadcast', 'conversation', 'community'];
8
9
 
@@ -29,6 +30,9 @@ export function convertFromRaw({
29
30
  get unreadCount() {
30
31
  return getSubChannelUnreadCount(channelId, messageFeedId);
31
32
  },
33
+ get hasMentioned() {
34
+ return getSubChannelHasMentioned(channelId, messageFeedId);
35
+ },
32
36
  ...rest,
33
37
  channelId: channelPublicId,
34
38
  creatorId: creatorPublicId,
@@ -0,0 +1,44 @@
1
+ import { pullFromCache } from '~/cache/api/pullFromCache';
2
+
3
+ export const commentLinkedObject = (comment: Amity.InternalComment): Amity.Comment => {
4
+ return {
5
+ ...comment,
6
+ get target(): Amity.CommentTarget {
7
+ const commentTypes: Amity.CommentTarget = {
8
+ type: comment.targetType,
9
+ };
10
+
11
+ if (comment.targetType === 'user') {
12
+ return {
13
+ ...commentTypes,
14
+ userId: comment.targetId,
15
+ };
16
+ }
17
+
18
+ if (commentTypes.type === 'content') {
19
+ return {
20
+ ...commentTypes,
21
+ contentId: comment.targetId,
22
+ };
23
+ }
24
+
25
+ if (commentTypes.type === 'community') {
26
+ const cacheData = pullFromCache<Amity.Membership<'community'>>([
27
+ 'communityUsers',
28
+ 'get',
29
+ `${comment.targetId}#${comment.userId}`,
30
+ ]);
31
+
32
+ return {
33
+ ...commentTypes,
34
+ communityId: comment.targetId,
35
+ creatorMember: cacheData?.data,
36
+ };
37
+ }
38
+
39
+ return {
40
+ type: 'unknown',
41
+ };
42
+ },
43
+ };
44
+ };
@@ -0,0 +1,5 @@
1
+ import { commentLinkedObject } from './commentLinkedObject';
2
+
3
+ export const LinkedObject = {
4
+ comment: commentLinkedObject,
5
+ };
@@ -0,0 +1,29 @@
1
+ function doConvert<
2
+ T extends
3
+ | Amity.UserEntityMarkerResponse
4
+ | Amity.UserMarkerResponse
5
+ | Amity.UserFeedMarkerResponse,
6
+ >(markerResponses: T[]): (Omit<T, 'isMentioned'> & { hasMentioned: boolean })[] {
7
+ return markerResponses.map(({ isMentioned, ...rest }) => ({
8
+ hasMentioned: isMentioned,
9
+ ...rest,
10
+ }));
11
+ }
12
+
13
+ export function convertUserMarkerResponse(
14
+ userMarkerResponse: Amity.UserMarkerResponse[],
15
+ ): Amity.UserMarker[] {
16
+ return doConvert(userMarkerResponse);
17
+ }
18
+
19
+ export function convertChannelMarkerResponse(
20
+ channelMarkerResponse: Amity.UserEntityMarkerResponse[],
21
+ ): Amity.ChannelMarker[] {
22
+ return doConvert(channelMarkerResponse);
23
+ }
24
+
25
+ export function convertSubChannelMarkerResponse(
26
+ subChannelMarkerResponse: Amity.UserFeedMarkerResponse[],
27
+ ): Amity.SubChannelMarker[] {
28
+ return doConvert(subChannelMarkerResponse);
29
+ }
@@ -94,6 +94,7 @@ export const channel1: Amity.Channel = {
94
94
  defaultSubChannelId: channelRaw1._id,
95
95
  isUnreadCountSupport: true,
96
96
  unreadCount: 0,
97
+ hasMentioned: false,
97
98
  };
98
99
 
99
100
  export const channel2: Amity.Channel = {
@@ -101,6 +102,7 @@ export const channel2: Amity.Channel = {
101
102
  defaultSubChannelId: channelRaw2._id,
102
103
  isUnreadCountSupport: true,
103
104
  unreadCount: 0,
105
+ hasMentioned: false,
104
106
  };
105
107
 
106
108
  export const rawChannelUser = generateRawChannelUser();
@@ -1,9 +1,10 @@
1
1
  import { createComment } from '~/commentRepository/api';
2
+ import { communityUser11 } from '~/utils/tests';
2
3
  import { file11 } from './file';
3
4
  import { post11 } from './post';
4
5
  import { user11, user12 } from './user';
5
6
 
6
- export function generateComment(params?: Partial<Amity.Comment>): Amity.Comment {
7
+ export function generateComment(params?: Partial<Amity.InternalComment>): Amity.Comment {
7
8
  return {
8
9
  path: '',
9
10
  referenceType: 'post',
@@ -30,13 +31,22 @@ export function generateComment(params?: Partial<Amity.Comment>): Amity.Comment
30
31
  myReactions: [],
31
32
  reactionsCount: 0,
32
33
  attachments: [],
34
+ targetId: 'test',
35
+ targetType: 'community',
33
36
  ...params,
37
+
38
+ // Link Object Section
39
+ target: {
40
+ type: 'community',
41
+ communityId: 'test',
42
+ creatorMember: communityUser11 as Amity.Membership<'community'>,
43
+ },
34
44
  };
35
45
  }
36
46
 
37
- export const comment11: Amity.Comment = generateComment();
47
+ export const comment11: Amity.InternalComment = generateComment();
38
48
 
39
- export const imageComment11: Amity.Comment = generateComment({
49
+ export const imageComment11: Amity.InternalComment = generateComment({
40
50
  dataTypes: ['image'],
41
51
  data: { text: '' },
42
52
  attachments: [
@@ -47,7 +57,7 @@ export const imageComment11: Amity.Comment = generateComment({
47
57
  ],
48
58
  });
49
59
 
50
- export const textImageComment11: Amity.Comment = generateComment({
60
+ export const textImageComment11: Amity.InternalComment = generateComment({
51
61
  dataTypes: ['image', 'text'],
52
62
  data: { text: 'test' },
53
63
  attachments: [
@@ -58,7 +68,7 @@ export const textImageComment11: Amity.Comment = generateComment({
58
68
  ],
59
69
  });
60
70
 
61
- export const textMentionComment11: Amity.Comment = generateComment({
71
+ export const textMentionComment11: Amity.InternalComment = generateComment({
62
72
  mentionees: [
63
73
  {
64
74
  type: 'user',
@@ -67,17 +77,17 @@ export const textMentionComment11: Amity.Comment = generateComment({
67
77
  ],
68
78
  });
69
79
 
70
- export const comment12: Amity.Comment = generateComment({
80
+ export const comment12: Amity.InternalComment = generateComment({
71
81
  commentId: 'comment12',
72
82
  parentId: comment11.commentId,
73
83
  });
74
84
 
75
- export const imageComment12: Amity.Comment = generateComment({
85
+ export const imageComment12: Amity.InternalComment = generateComment({
76
86
  ...imageComment11,
77
87
  commentId: comment12.commentId,
78
88
  });
79
89
 
80
- export const textImageComment12: Amity.Comment = generateComment({
90
+ export const textImageComment12: Amity.InternalComment = generateComment({
81
91
  ...textImageComment11,
82
92
  commentId: comment12.commentId,
83
93
  });
@@ -87,6 +97,7 @@ export const textCommentPayload: Amity.CommentPayload = {
87
97
  users: [user11],
88
98
  commentChildren: [],
89
99
  files: [],
100
+ communityUsers: [],
90
101
  };
91
102
 
92
103
  export const comment12Payload: Amity.CommentPayload = {
@@ -94,6 +105,7 @@ export const comment12Payload: Amity.CommentPayload = {
94
105
  users: [user11],
95
106
  commentChildren: [],
96
107
  files: [file11],
108
+ communityUsers: [],
97
109
  };
98
110
 
99
111
  export const imageCommentPayload: Amity.CommentPayload = {
@@ -101,6 +113,7 @@ export const imageCommentPayload: Amity.CommentPayload = {
101
113
  users: [user11],
102
114
  commentChildren: [],
103
115
  files: [file11],
116
+ communityUsers: [],
104
117
  };
105
118
 
106
119
  export const textImageCommentPayload: Amity.CommentPayload = {
@@ -108,6 +121,7 @@ export const textImageCommentPayload: Amity.CommentPayload = {
108
121
  users: [user11, user12],
109
122
  commentChildren: [],
110
123
  files: [file11],
124
+ communityUsers: [],
111
125
  };
112
126
 
113
127
  export const textCommentMentionPayload: Amity.CommentPayload = {
@@ -115,6 +129,7 @@ export const textCommentMentionPayload: Amity.CommentPayload = {
115
129
  commentChildren: [],
116
130
  users: [user11],
117
131
  files: [],
132
+ communityUsers: [],
118
133
  };
119
134
 
120
135
  export const postPayload: Amity.ProcessedPostPayload = {
@@ -134,6 +149,7 @@ export const textAndImageCommentMixedPayload: Amity.CommentPayload = {
134
149
  users: [user11],
135
150
  commentChildren: [],
136
151
  files: [file11],
152
+ communityUsers: [],
137
153
  };
138
154
 
139
155
  export const deletedCommentPayload: Amity.CommentPayload = {
@@ -154,6 +170,7 @@ export const deletedCommentPayload: Amity.CommentPayload = {
154
170
  users: [user11],
155
171
  commentChildren: [],
156
172
  files: [file11],
173
+ communityUsers: [],
157
174
  };
158
175
 
159
176
  // Response - BE
@@ -11,6 +11,21 @@ export const generateChannelMarker = ({
11
11
  isDeleted: false,
12
12
  createdAt: date,
13
13
  updatedAt: date,
14
+ hasMentioned: false,
15
+ ...params,
16
+ });
17
+
18
+ export const generateChannelMarkerResponse = ({
19
+ entityId,
20
+ ...params
21
+ }: MakeRequired<Amity.ChannelMarker, 'entityId'>): Amity.UserEntityMarkerResponse => ({
22
+ entityId,
23
+ userId: activeUser.userId,
24
+ unreadCount: 0,
25
+ isDeleted: false,
26
+ createdAt: date,
27
+ updatedAt: date,
28
+ isMentioned: false,
14
29
  ...params,
15
30
  });
16
31
 
@@ -27,6 +42,24 @@ export const generateSubChannelMarker = ({
27
42
  unreadCount: 0,
28
43
  createdAt: date,
29
44
  updatedAt: date,
45
+ hasMentioned: false,
46
+ ...params,
47
+ });
48
+
49
+ export const generateSubChannelMarkerResponse = ({
50
+ feedId,
51
+ entityId,
52
+ ...params
53
+ }: MakeRequired<Amity.SubChannelMarker, 'feedId' | 'entityId'>): Amity.UserFeedMarkerResponse => ({
54
+ feedId,
55
+ entityId,
56
+ userId: activeUser.userId,
57
+ readToSegment: 0,
58
+ deliveredToSegment: 0,
59
+ unreadCount: 0,
60
+ createdAt: date,
61
+ updatedAt: date,
62
+ isMentioned: false,
30
63
  ...params,
31
64
  });
32
65
 
@@ -61,6 +94,19 @@ export const generateFeedMarker = ({
61
94
  export const generateUserMarker = (params?: Partial<Amity.UserMarker>): Amity.UserMarker => ({
62
95
  lastSyncAt: date,
63
96
  userId: activeUser.userId,
97
+ hasMentioned: false,
98
+ unreadCount: 0,
99
+ createdAt: date,
100
+ updatedAt: date,
101
+ ...params,
102
+ });
103
+
104
+ export const generateUserMarkerResponse = (
105
+ params?: Partial<Amity.UserMarker>,
106
+ ): Amity.UserMarkerResponse => ({
107
+ lastSyncAt: date,
108
+ userId: activeUser.userId,
109
+ isMentioned: false,
64
110
  unreadCount: 0,
65
111
  createdAt: date,
66
112
  updatedAt: date,