@amityco/ts-sdk-react-native 7.0.3-d7a9877.0 → 7.1.1-0e753e3.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 (95) hide show
  1. package/dist/@types/core/events.d.ts +2 -1
  2. package/dist/@types/core/events.d.ts.map +1 -1
  3. package/dist/@types/core/model.d.ts +2 -0
  4. package/dist/@types/core/model.d.ts.map +1 -1
  5. package/dist/@types/core/readReceipt.d.ts +12 -1
  6. package/dist/@types/core/readReceipt.d.ts.map +1 -1
  7. package/dist/@types/domains/channel.d.ts +10 -0
  8. package/dist/@types/domains/channel.d.ts.map +1 -1
  9. package/dist/@types/domains/client.d.ts +2 -0
  10. package/dist/@types/domains/client.d.ts.map +1 -1
  11. package/dist/channelRepository/api/markChannelsAsReadBySegment.d.ts +16 -0
  12. package/dist/channelRepository/api/markChannelsAsReadBySegment.d.ts.map +1 -0
  13. package/dist/channelRepository/events/onChannelDeleted.d.ts.map +1 -1
  14. package/dist/channelRepository/events/onChannelLeft.d.ts.map +1 -1
  15. package/dist/{marker → channelRepository}/events/onChannelUnreadUpdatedLocal.d.ts +2 -2
  16. package/dist/channelRepository/events/onChannelUnreadUpdatedLocal.d.ts.map +1 -0
  17. package/dist/channelRepository/internalApi/getTotalChannelsUnread.d.ts +11 -0
  18. package/dist/channelRepository/internalApi/getTotalChannelsUnread.d.ts.map +1 -0
  19. package/dist/channelRepository/observers/getChannel.d.ts.map +1 -1
  20. package/dist/channelRepository/observers/getChannels/ChannelLiveCollectionController.d.ts.map +1 -1
  21. package/dist/channelRepository/observers/getTotalChannelsUnread.d.ts +20 -0
  22. package/dist/channelRepository/observers/getTotalChannelsUnread.d.ts.map +1 -0
  23. package/dist/channelRepository/observers/index.d.ts +1 -0
  24. package/dist/channelRepository/observers/index.d.ts.map +1 -1
  25. package/dist/channelRepository/utils/constructChannelDynamicValue.d.ts.map +1 -1
  26. package/dist/channelRepository/utils/getLegacyChannelUnread.d.ts +2 -0
  27. package/dist/channelRepository/utils/getLegacyChannelUnread.d.ts.map +1 -0
  28. package/dist/channelRepository/utils/prepareChannelPayload.d.ts.map +1 -1
  29. package/dist/client/api/createClient.d.ts +1 -0
  30. package/dist/client/api/createClient.d.ts.map +1 -1
  31. package/dist/client/api/enableUnreadCount.d.ts.map +1 -1
  32. package/dist/client/api/login.d.ts.map +1 -1
  33. package/dist/client/utils/ReadReceiptSync/legacyReadReceiptSyncEngine.d.ts +33 -0
  34. package/dist/client/utils/ReadReceiptSync/legacyReadReceiptSyncEngine.d.ts.map +1 -0
  35. package/dist/client/utils/ReadReceiptSync/legacyReadReceiptSyncEngineOnLoginHandler.d.ts +3 -0
  36. package/dist/client/utils/ReadReceiptSync/legacyReadReceiptSyncEngineOnLoginHandler.d.ts.map +1 -0
  37. package/dist/client/utils/ReadReceiptSync/readReceiptSyncEngine.d.ts +2 -4
  38. package/dist/client/utils/ReadReceiptSync/readReceiptSyncEngine.d.ts.map +1 -1
  39. package/dist/client/utils/endpoints.d.ts +1 -0
  40. package/dist/client/utils/endpoints.d.ts.map +1 -1
  41. package/dist/client/utils/setClientToken.d.ts.map +1 -1
  42. package/dist/commentRepository/events/utils.d.ts.map +1 -1
  43. package/dist/core/events.d.ts +3 -3
  44. package/dist/core/events.d.ts.map +1 -1
  45. package/dist/core/model/idResolvers.d.ts.map +1 -1
  46. package/dist/index.cjs.js +616 -58
  47. package/dist/index.esm.js +616 -58
  48. package/dist/index.umd.js +3 -3
  49. package/dist/marker/events/onChannelUnreadInfoUpdatedLocal.d.ts +12 -0
  50. package/dist/marker/events/onChannelUnreadInfoUpdatedLocal.d.ts.map +1 -0
  51. package/dist/messageRepository/events/onMessageCreated.d.ts.map +1 -1
  52. package/dist/messageRepository/observers/getMessage.d.ts.map +1 -1
  53. package/dist/messageRepository/utils/markReadMessage.d.ts.map +1 -1
  54. package/dist/reactionRepository/api/addReaction.d.ts.map +1 -1
  55. package/dist/reactionRepository/api/removeReaction.d.ts.map +1 -1
  56. package/dist/reactionRepository/observers/getReactions/ReactionPaginationController.d.ts.map +1 -1
  57. package/package.json +1 -1
  58. package/src/@types/core/events.ts +2 -1
  59. package/src/@types/core/model.ts +4 -0
  60. package/src/@types/core/readReceipt.ts +14 -1
  61. package/src/@types/domains/channel.ts +13 -0
  62. package/src/@types/domains/client.ts +3 -0
  63. package/src/channelRepository/api/markChannelsAsReadBySegment.ts +29 -0
  64. package/src/channelRepository/events/onChannelDeleted.ts +17 -4
  65. package/src/channelRepository/events/onChannelLeft.ts +11 -3
  66. package/src/{marker → channelRepository}/events/onChannelUnreadUpdatedLocal.ts +3 -3
  67. package/src/channelRepository/internalApi/getTotalChannelsUnread.ts +38 -0
  68. package/src/channelRepository/observers/getChannel.ts +3 -1
  69. package/src/channelRepository/observers/getChannels/ChannelLiveCollectionController.ts +6 -1
  70. package/src/channelRepository/observers/getTotalChannelsUnread.ts +129 -0
  71. package/src/channelRepository/observers/index.ts +1 -0
  72. package/src/channelRepository/utils/constructChannelDynamicValue.ts +12 -2
  73. package/src/channelRepository/utils/getLegacyChannelUnread.ts +5 -0
  74. package/src/channelRepository/utils/prepareChannelPayload.ts +68 -17
  75. package/src/client/api/createClient.ts +7 -1
  76. package/src/client/api/enableUnreadCount.ts +1 -0
  77. package/src/client/api/login.ts +5 -1
  78. package/src/client/utils/ReadReceiptSync/legacyReadReceiptSyncEngine.ts +267 -0
  79. package/src/client/utils/ReadReceiptSync/legacyReadReceiptSyncEngineOnLoginHandler.ts +21 -0
  80. package/src/client/utils/ReadReceiptSync/readReceiptSyncEngine.ts +74 -99
  81. package/src/client/utils/endpoints.ts +1 -0
  82. package/src/client/utils/setClientToken.ts +8 -0
  83. package/src/commentRepository/events/utils.ts +73 -0
  84. package/src/core/model/idResolvers.ts +2 -0
  85. package/src/fileRepository/api/uploadFile.ts +1 -1
  86. package/src/fileRepository/api/uploadImage.ts +1 -1
  87. package/src/fileRepository/api/uploadVideo.ts +1 -1
  88. package/src/marker/events/onChannelUnreadInfoUpdatedLocal.ts +29 -0
  89. package/src/messageRepository/events/onMessageCreated.ts +45 -1
  90. package/src/messageRepository/observers/getMessage.ts +0 -1
  91. package/src/messageRepository/utils/markReadMessage.ts +10 -3
  92. package/src/reactionRepository/api/addReaction.ts +8 -0
  93. package/src/reactionRepository/api/removeReaction.ts +8 -0
  94. package/src/reactionRepository/observers/getReactions/ReactionPaginationController.ts +8 -0
  95. package/dist/marker/events/onChannelUnreadUpdatedLocal.d.ts.map +0 -1
@@ -53,6 +53,36 @@ export const createCommentEventSubscriber = (
53
53
  }
54
54
  }
55
55
  }
56
+ }
57
+
58
+ if (['comment.deleted'].includes(event)) {
59
+ // NOTE: skip deleting comment to parent comment children if it's the same user since we use the local event to update instead.
60
+ if (event === 'comment.deleted' && comment.data.userId === client.userId) return;
61
+
62
+ if (comments[0].parentId) {
63
+ const parentComment = pullFromCache<Amity.InternalComment>([
64
+ 'comment',
65
+ 'get',
66
+ comments[0].parentId,
67
+ ]);
68
+
69
+ if (parentComment?.data) {
70
+ // Remove deleted comment in parent childComment if still exists
71
+ if (parentComment.data.children.includes(comments[0].commentId)) {
72
+ const newParentComment = {
73
+ ...parentComment.data,
74
+ childrenNumber: parentComment.data.childrenNumber - 1,
75
+ children: [
76
+ ...new Set([
77
+ ...parentComment.data.children.filter(id => id !== comments[0].commentId),
78
+ ]),
79
+ ],
80
+ };
81
+
82
+ pushToCache(['comment', 'get', comments[0].parentId], newParentComment);
83
+ }
84
+ }
85
+ }
56
86
 
57
87
  const queries = queryCache<Amity.InternalComment[]>(['comment', 'query'])?.filter(
58
88
  ({ key }) => (key[2] as Amity.QueryComments)?.referenceId === comment.data.referenceId,
@@ -135,6 +165,49 @@ export const createLocalCommentEventSubscriber = (
135
165
  queries?.map(({ key, data }) => upsertInCache(key, data as any, { cachedAt: -1 }));
136
166
  }
137
167
 
168
+ if (['local.comment.deleted'].includes(event)) {
169
+ if (comments[0].parentId) {
170
+ const parentComment = pullFromCache<Amity.InternalComment>([
171
+ 'comment',
172
+ 'get',
173
+ comments[0].parentId,
174
+ ]);
175
+
176
+ if (parentComment?.data) {
177
+ // Remove deleted comment in parent childComment if still exists
178
+ if (parentComment.data.children.includes(comments[0].commentId)) {
179
+ const newParentComment = {
180
+ ...parentComment.data,
181
+ childrenNumber: parentComment.data.childrenNumber - 1,
182
+ children: [
183
+ ...new Set([
184
+ ...parentComment.data.children.filter(id => id !== comments[0].commentId),
185
+ ]),
186
+ ],
187
+ };
188
+ pushToCache(['comment', 'get', comments[0].parentId], newParentComment);
189
+
190
+ setTimeout(() => {
191
+ // NOTE: This is workaround solution for emitting event not work properly.
192
+ fireEvent('comment.updated', {
193
+ comments: [newParentComment],
194
+ commentChildren: [],
195
+ files: [],
196
+ users: [],
197
+ communityUsers: [],
198
+ });
199
+ }, 200);
200
+ }
201
+ }
202
+ }
203
+
204
+ const queries = queryCache<Amity.InternalComment[]>(['comment', 'query'])?.filter(
205
+ ({ key }) => (key[2] as Amity.QueryComments)?.referenceId === comment.data.referenceId,
206
+ );
207
+
208
+ queries?.map(({ key, data }) => upsertInCache(key, data as any, { cachedAt: -1 }));
209
+ }
210
+
138
211
  callback(LinkedObject.comment(comment.data));
139
212
  }
140
213
  }
@@ -26,6 +26,8 @@ const idResolvers: Resolvers = {
26
26
  channelUnreadInfo: ({ channelId }) => channelId,
27
27
  subChannelUnreadInfo: ({ subChannelId }) => subChannelId,
28
28
 
29
+ channelUnread: ({ channelId }) => channelId,
30
+
29
31
  channelMarker: ({ entityId, userId }) => `${entityId}#${userId}`,
30
32
  subChannelMarker: ({ entityId, feedId, userId }) => `${entityId}#${feedId}#${userId}`,
31
33
  messageMarker: ({ feedId, contentId, creatorId }) => `${feedId}#${contentId}#${creatorId}`,
@@ -42,7 +42,7 @@ export const uploadFile = async <T extends Amity.FileType = any>(
42
42
  ? (formData as any).getHeaders()
43
43
  : { 'content-type': 'multipart/form-data' };
44
44
 
45
- const { data } = await client.http.post<Amity.CreateFilePayload<T>>('/api/v4/files', formData, {
45
+ const { data } = await client.upload.post<Amity.CreateFilePayload<T>>('/api/v4/files', formData, {
46
46
  headers,
47
47
  onUploadProgress({ loaded, total = 100 }) {
48
48
  onProgress && onProgress(Math.round((loaded * 100) / total));
@@ -42,7 +42,7 @@ export const uploadImage = async (
42
42
  ? (formData as any).getHeaders()
43
43
  : { 'content-type': 'multipart/form-data' };
44
44
 
45
- const { data } = await client.http.post<Amity.CreateFilePayload<'image'>>(
45
+ const { data } = await client.upload.post<Amity.CreateFilePayload<'image'>>(
46
46
  '/api/v4/images',
47
47
  formData,
48
48
  {
@@ -48,7 +48,7 @@ export const uploadVideo = async (
48
48
  ? (formData as any).getHeaders()
49
49
  : { 'content-type': 'multipart/form-data' };
50
50
 
51
- const { data } = await client.http.post<Amity.CreateFilePayload<'video'>>(
51
+ const { data } = await client.upload.post<Amity.CreateFilePayload<'video'>>(
52
52
  '/api/v4/videos',
53
53
  formData,
54
54
  {
@@ -0,0 +1,29 @@
1
+ import { getActiveClient } from '~/client/api/activeClient';
2
+ import { createEventSubscriber } from '~/core/events';
3
+
4
+ /**
5
+ * Internal used only
6
+ *
7
+ * Fired when an {@link Amity.channelUnreadInfo} has been updated.
8
+ *
9
+ * @param callback The function to call when the event was fired
10
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
11
+ *
12
+ * @category ChannelMarker Events
13
+ */
14
+ export const onChannelUnreadInfoUpdatedLocal = (
15
+ callback: Amity.Listener<Amity.Events['local.channelUnreadInfo.updated']>,
16
+ ): Amity.Unsubscriber => {
17
+ const client = getActiveClient();
18
+
19
+ const filter = (payload: Amity.Events['local.channelUnreadInfo.updated']) => {
20
+ callback(payload);
21
+ };
22
+
23
+ return createEventSubscriber(
24
+ client,
25
+ 'channelMarker/onChannelUnreadInfoUpdatedLocal',
26
+ 'local.channelUnreadInfo.updated',
27
+ filter,
28
+ );
29
+ };
@@ -1,11 +1,12 @@
1
1
  import { getActiveClient } from '~/client/api/activeClient';
2
- import { createEventSubscriber } from '~/core/events';
2
+ import { createEventSubscriber, fireEvent } from '~/core/events';
3
3
  import { ingestInCache } from '~/cache/api/ingestInCache';
4
4
  import { updateSubChannelUnreadFromMessage } from '~/marker/utils/updateSubChannelUnreadFromMessage';
5
5
  import { reCalculateChannelUnreadInfo } from '~/marker/utils/reCalculateChannelUnreadInfo';
6
6
  import { getActiveUser } from '~/client/api/activeUser';
7
7
  import { markReadMessage } from '../utils/markReadMessage';
8
8
  import { prepareMessagePayload } from '../utils';
9
+ import { pullFromCache, pushToCache } from '~/cache/api';
9
10
 
10
11
  /**
11
12
  * ```js
@@ -40,6 +41,49 @@ export const onMessageCreatedMqtt = (
40
41
  });
41
42
  }
42
43
 
44
+ if (client.useLegacyUnreadCount) {
45
+ rawPayload.messages.forEach(message => {
46
+ const channelUnread = pullFromCache<Amity.ChannelUnread>([
47
+ 'channelUnread',
48
+ 'get',
49
+ message.channelId,
50
+ ])?.data;
51
+
52
+ if (
53
+ !channelUnread ||
54
+ channelUnread.lastSegment >= message.segment ||
55
+ typeof channelUnread.readToSegment !== 'number' ||
56
+ typeof channelUnread.lastMentionedSegment !== 'number'
57
+ )
58
+ return;
59
+
60
+ const lastSegment = message.segment;
61
+ const isMentionedInMessage = message.mentionedUsers?.some(mention => {
62
+ return (
63
+ mention.type === 'channel' ||
64
+ (mention.type === 'user' &&
65
+ client.userId &&
66
+ mention.userPublicIds.includes(client.userId))
67
+ );
68
+ });
69
+
70
+ const lastMentionedSegment = isMentionedInMessage
71
+ ? message.segment
72
+ : channelUnread.lastMentionedSegment;
73
+
74
+ const updatedChannelUnread: Amity.ChannelUnread = {
75
+ ...channelUnread,
76
+ lastSegment,
77
+ unreadCount: Math.max(lastSegment - channelUnread.readToSegment, 0),
78
+ lastMentionedSegment,
79
+ isMentioned: !(channelUnread.readToSegment >= lastMentionedSegment),
80
+ };
81
+
82
+ pushToCache(['channelUnread', 'get', message.channelId], updatedChannelUnread);
83
+ fireEvent('local.channelUnread.updated', updatedChannelUnread);
84
+ });
85
+ }
86
+
43
87
  // Update in cache
44
88
  ingestInCache(payload);
45
89
 
@@ -13,7 +13,6 @@ import {
13
13
  } from '../events';
14
14
  import { onMessageFetched } from '../events/onMessageFetched';
15
15
  import { LinkedObject } from '~/utils/linkedObject';
16
- import { date } from '~/utils/tests';
17
16
 
18
17
  /* begin_public_function
19
18
  id: message.get
@@ -1,8 +1,15 @@
1
+ import { getActiveClient } from '~/client/api/activeClient';
1
2
  import ReadReceiptSyncEngine from '~/client/utils/ReadReceiptSync/readReceiptSyncEngine';
3
+ import LegacyReadReceiptSyncEngine from '~/client/utils/ReadReceiptSync/legacyReadReceiptSyncEngine';
2
4
 
3
5
  export const markReadMessage = (message: Amity.InternalMessage) => {
4
- const { subChannelId, channelSegment } = message;
5
- const markReadReceiptEngine = ReadReceiptSyncEngine.getInstance();
6
+ const client = getActiveClient();
6
7
 
7
- markReadReceiptEngine.markRead(subChannelId, channelSegment);
8
+ if (client.useLegacyUnreadCount) {
9
+ const markReadReceiptEngine = ReadReceiptSyncEngine.getInstance();
10
+ markReadReceiptEngine.markRead(message.channelId, message.channelSegment);
11
+ } else {
12
+ const markReadReceiptEngine = LegacyReadReceiptSyncEngine.getInstance();
13
+ markReadReceiptEngine.markRead(message.subChannelId, message.channelSegment);
14
+ }
8
15
  };
@@ -5,6 +5,7 @@ import { upsertInCache, pullFromCache, pushToCache } from '~/cache/api';
5
5
  import { UNSYNCED_OBJECT_CACHED_AT_VALUE } from '~/utils/constants';
6
6
  import { dispatchReactable } from '../utils';
7
7
  import { fireEvent } from '~/core/events';
8
+ import { ASCApiError } from '~/core/errors';
8
9
 
9
10
  /* begin_public_function
10
11
  id: reaction.add
@@ -37,6 +38,13 @@ export const addReaction = async (
37
38
  reactionName,
38
39
  });
39
40
 
41
+ if (!['post', 'comment', 'story', 'message'].includes(referenceType))
42
+ throw new ASCApiError(
43
+ 'The reference type is not valid. It should be one of post, comment, story, or message',
44
+ Amity.ServerError.BAD_REQUEST,
45
+ Amity.ErrorLevel.ERROR,
46
+ );
47
+
40
48
  const { data } = await client.http.post<{ addedId: 'string' }>('/api/v2/reactions', {
41
49
  referenceId,
42
50
  referenceType,
@@ -6,6 +6,7 @@ import { UNSYNCED_OBJECT_CACHED_AT_VALUE } from '~/utils/constants';
6
6
 
7
7
  import { dispatchReactable } from '../utils';
8
8
  import { fireEvent } from '~/core/events';
9
+ import { ASCApiError } from '~/core/errors';
9
10
 
10
11
  /* begin_public_function
11
12
  id: reaction.remove
@@ -38,6 +39,13 @@ export const removeReaction = async (
38
39
  reactionName,
39
40
  });
40
41
 
42
+ if (!['post', 'comment', 'story', 'message'].includes(referenceType))
43
+ throw new ASCApiError(
44
+ 'The reference type is not valid. It should be one of post, comment, story, or message',
45
+ Amity.ServerError.BAD_REQUEST,
46
+ Amity.ErrorLevel.ERROR,
47
+ );
48
+
41
49
  const { data } = await client.http.delete<{ removedId: string }>(`/api/v2/reactions`, {
42
50
  data: {
43
51
  referenceId,
@@ -2,6 +2,7 @@ import { getActiveClient } from '~/client';
2
2
  import { PaginationController } from '~/core/liveCollection/PaginationController';
3
3
  import { COLLECTION_DEFAULT_PAGINATION_LIMIT } from '~/utils/constants';
4
4
  import { REFERENCE_API_V5 } from '~/reactionRepository/api/constants';
5
+ import { ASCApiError } from '~/core/errors';
5
6
 
6
7
  export class ReactionPaginationController extends PaginationController<
7
8
  'reaction',
@@ -15,6 +16,13 @@ export class ReactionPaginationController extends PaginationController<
15
16
 
16
17
  const path = '/api/v3/reactions';
17
18
 
19
+ if (!['post', 'comment', 'story', 'message'].includes(params.referenceType))
20
+ throw new ASCApiError(
21
+ 'The reference type is not valid. It should be one of post, comment, story, or message',
22
+ Amity.ServerError.BAD_REQUEST,
23
+ Amity.ErrorLevel.ERROR,
24
+ );
25
+
18
26
  const { data: queryResponse } = await this.http.get<Amity.ReactionPayload & Amity.Pagination>(
19
27
  path,
20
28
  {
@@ -1 +0,0 @@
1
- {"version":3,"file":"onChannelUnreadUpdatedLocal.d.ts","sourceRoot":"","sources":["../../../src/marker/events/onChannelUnreadUpdatedLocal.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AACH,eAAO,MAAM,2BAA2B,aAC5B,MAAM,QAAQ,CAAC,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC,KACpE,MAAM,YAaR,CAAC"}