@amityco/ts-sdk 7.6.1-c97e594b.0 → 7.6.1-ce05a481.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 (145) hide show
  1. package/dist/@types/core/payload.d.ts +1 -1
  2. package/dist/@types/core/payload.d.ts.map +1 -1
  3. package/dist/@types/domains/channel.d.ts +0 -2
  4. package/dist/@types/domains/channel.d.ts.map +1 -1
  5. package/dist/@types/domains/content.d.ts +8 -2
  6. package/dist/@types/domains/content.d.ts.map +1 -1
  7. package/dist/@types/domains/feed.d.ts +6 -1
  8. package/dist/@types/domains/feed.d.ts.map +1 -1
  9. package/dist/@types/domains/file.d.ts +3 -1
  10. package/dist/@types/domains/file.d.ts.map +1 -1
  11. package/dist/@types/domains/post.d.ts +3 -3
  12. package/dist/@types/domains/post.d.ts.map +1 -1
  13. package/dist/@types/domains/stream.d.ts +0 -4
  14. package/dist/@types/domains/stream.d.ts.map +1 -1
  15. package/dist/channelRepository/api/createChannel.d.ts +1 -3
  16. package/dist/channelRepository/api/createChannel.d.ts.map +1 -1
  17. package/dist/channelRepository/internalApi/getChannel.d.ts.map +1 -1
  18. package/dist/communityRepository/api/getCommunity.d.ts +1 -1
  19. package/dist/communityRepository/api/getCommunity.d.ts.map +1 -1
  20. package/dist/core/model/index.d.ts.map +1 -1
  21. package/dist/feedRepository/api/getCustomRankingGlobalFeed.d.ts +1 -1
  22. package/dist/feedRepository/api/getCustomRankingGlobalFeed.d.ts.map +1 -1
  23. package/dist/feedRepository/api/queryGlobalFeed.d.ts.map +1 -1
  24. package/dist/feedRepository/index.d.ts +1 -1
  25. package/dist/feedRepository/index.d.ts.map +1 -1
  26. package/dist/feedRepository/observers/getCustomRankingGlobalFeed/LiveCollectionController.d.ts +13 -0
  27. package/dist/feedRepository/observers/getCustomRankingGlobalFeed/LiveCollectionController.d.ts.map +1 -0
  28. package/dist/feedRepository/observers/getCustomRankingGlobalFeed/PaginationController.d.ts +5 -0
  29. package/dist/feedRepository/observers/getCustomRankingGlobalFeed/PaginationController.d.ts.map +1 -0
  30. package/dist/feedRepository/observers/getCustomRankingGlobalFeed/QueryStreamController.d.ts +15 -0
  31. package/dist/feedRepository/observers/getCustomRankingGlobalFeed/QueryStreamController.d.ts.map +1 -0
  32. package/dist/feedRepository/observers/getCustomRankingGlobalFeed.d.ts +23 -0
  33. package/dist/feedRepository/observers/getCustomRankingGlobalFeed.d.ts.map +1 -0
  34. package/dist/feedRepository/observers/getGlobalFeed/LiveCollectionController.d.ts +13 -0
  35. package/dist/feedRepository/observers/getGlobalFeed/LiveCollectionController.d.ts.map +1 -0
  36. package/dist/feedRepository/observers/getGlobalFeed/PaginationController.d.ts +5 -0
  37. package/dist/feedRepository/observers/getGlobalFeed/PaginationController.d.ts.map +1 -0
  38. package/dist/feedRepository/observers/getGlobalFeed/QueryStreamController.d.ts +15 -0
  39. package/dist/feedRepository/observers/getGlobalFeed/QueryStreamController.d.ts.map +1 -0
  40. package/dist/feedRepository/observers/getGlobalFeed.d.ts +22 -0
  41. package/dist/feedRepository/observers/getGlobalFeed.d.ts.map +1 -0
  42. package/dist/feedRepository/observers/index.d.ts +3 -0
  43. package/dist/feedRepository/observers/index.d.ts.map +1 -0
  44. package/dist/feedRepository/observers/utils.d.ts +6 -0
  45. package/dist/feedRepository/observers/utils.d.ts.map +1 -0
  46. package/dist/fileRepository/api/index.d.ts +1 -0
  47. package/dist/fileRepository/api/index.d.ts.map +1 -1
  48. package/dist/fileRepository/api/uploadClip.d.ts +17 -0
  49. package/dist/fileRepository/api/uploadClip.d.ts.map +1 -0
  50. package/dist/index.cjs.js +7384 -7173
  51. package/dist/index.esm.js +9384 -9173
  52. package/dist/index.umd.js +3 -3
  53. package/dist/messagePreview/utils/getChannelMessagePreviewWithUser.d.ts +0 -2
  54. package/dist/messagePreview/utils/getChannelMessagePreviewWithUser.d.ts.map +1 -1
  55. package/dist/messagePreview/utils/getSubChannelMessagePreviewWithUser.d.ts +1 -1
  56. package/dist/messageRepository/api/deleteMessage.d.ts.map +1 -1
  57. package/dist/messageRepository/observers/getMessages/MessageQueryStreamController.d.ts.map +1 -1
  58. package/dist/postRepository/api/createClipPost.d.ts +32 -0
  59. package/dist/postRepository/api/createClipPost.d.ts.map +1 -0
  60. package/dist/postRepository/api/createPost.d.ts.map +1 -1
  61. package/dist/postRepository/api/index.d.ts +1 -0
  62. package/dist/postRepository/api/index.d.ts.map +1 -1
  63. package/dist/postRepository/events/utils.d.ts.map +1 -1
  64. package/dist/postRepository/observers/getGlobalPinnedPosts/GlobalPinnedPostLiveCollectionController.d.ts.map +1 -1
  65. package/dist/postRepository/observers/getPinnedPosts/PinnedPostLiveCollectionController.d.ts.map +1 -1
  66. package/dist/postRepository/observers/getPinnedPosts/PinnedPostQueryStreamController.d.ts +6 -0
  67. package/dist/postRepository/observers/getPinnedPosts/PinnedPostQueryStreamController.d.ts.map +1 -1
  68. package/dist/postRepository/observers/getPosts/PostLiveCollectionController.d.ts.map +1 -1
  69. package/dist/postRepository/observers/utils.d.ts +13 -0
  70. package/dist/postRepository/observers/utils.d.ts.map +1 -0
  71. package/dist/postRepository/utils/payload.d.ts.map +1 -1
  72. package/dist/reactionRepository/api/addReaction.d.ts.map +1 -1
  73. package/dist/reactionRepository/api/removeReaction.d.ts.map +1 -1
  74. package/dist/streamRepository/api/createStream.d.ts +1 -1
  75. package/dist/streamRepository/api/createStream.d.ts.map +1 -1
  76. package/dist/streamRepository/api/index.d.ts +0 -1
  77. package/dist/streamRepository/api/index.d.ts.map +1 -1
  78. package/dist/streamRepository/api/updateStream.d.ts +1 -4
  79. package/dist/streamRepository/api/updateStream.d.ts.map +1 -1
  80. package/dist/streamRepository/internalApi/getStream.d.ts +2 -2
  81. package/dist/streamRepository/internalApi/getStream.d.ts.map +1 -1
  82. package/dist/utils/linkedObject/postLinkedObject.d.ts.map +1 -1
  83. package/dist/utils/linkedObject/streamLinkedObject.d.ts.map +1 -1
  84. package/dist/utils/postTypePredicate.d.ts +4 -5
  85. package/dist/utils/postTypePredicate.d.ts.map +1 -1
  86. package/dist/utils/tests/dummy/comment.d.ts +1 -1
  87. package/package.json +1 -1
  88. package/src/@types/core/payload.ts +1 -1
  89. package/src/@types/domains/channel.ts +0 -3
  90. package/src/@types/domains/content.ts +10 -0
  91. package/src/@types/domains/feed.ts +18 -1
  92. package/src/@types/domains/file.ts +5 -0
  93. package/src/@types/domains/post.ts +4 -4
  94. package/src/@types/domains/stream.ts +0 -4
  95. package/src/channelRepository/api/createChannel.ts +9 -12
  96. package/src/channelRepository/internalApi/getChannel.ts +1 -0
  97. package/src/channelRepository/utils/constructChannelObject.ts +2 -2
  98. package/src/commentRepository/api/deleteComment.ts +6 -6
  99. package/src/communityRepository/api/getCommunity.ts +0 -9
  100. package/src/core/model/index.ts +2 -1
  101. package/src/feedRepository/api/getCustomRankingGlobalFeed.ts +1 -1
  102. package/src/feedRepository/api/queryGlobalFeed.ts +3 -1
  103. package/src/feedRepository/index.ts +1 -1
  104. package/src/feedRepository/observers/getCustomRankingGlobalFeed/LiveCollectionController.ts +95 -0
  105. package/src/feedRepository/observers/getCustomRankingGlobalFeed/PaginationController.ts +25 -0
  106. package/src/feedRepository/observers/getCustomRankingGlobalFeed/QueryStreamController.ts +101 -0
  107. package/src/feedRepository/observers/getCustomRankingGlobalFeed.ts +57 -0
  108. package/src/feedRepository/observers/getGlobalFeed/LiveCollectionController.ts +91 -0
  109. package/src/feedRepository/observers/getGlobalFeed/PaginationController.ts +23 -0
  110. package/src/feedRepository/observers/getGlobalFeed/QueryStreamController.ts +99 -0
  111. package/src/feedRepository/observers/getGlobalFeed.ts +56 -0
  112. package/src/feedRepository/observers/index.ts +2 -0
  113. package/src/feedRepository/observers/utils.ts +85 -0
  114. package/src/fileRepository/api/index.ts +1 -0
  115. package/src/fileRepository/api/uploadClip.ts +71 -0
  116. package/src/messageRepository/api/deleteMessage.ts +0 -16
  117. package/src/messageRepository/observers/getMessages/MessageQueryStreamController.ts +0 -13
  118. package/src/postRepository/api/createClipPost.ts +62 -0
  119. package/src/postRepository/api/createPost.ts +2 -3
  120. package/src/postRepository/api/index.ts +2 -0
  121. package/src/postRepository/api/queryPosts.ts +1 -1
  122. package/src/postRepository/events/utils.ts +35 -1
  123. package/src/postRepository/observers/getGlobalPinnedPosts/GlobalPinnedPostLiveCollectionController.ts +5 -0
  124. package/src/postRepository/observers/getPinnedPosts/PinnedPostLiveCollectionController.ts +7 -1
  125. package/src/postRepository/observers/getPinnedPosts/PinnedPostQueryStreamController.ts +27 -0
  126. package/src/postRepository/observers/getPosts/PostLiveCollectionController.ts +2 -74
  127. package/src/postRepository/observers/getPosts/PostPaginationController.ts +1 -1
  128. package/src/postRepository/observers/utils.ts +97 -0
  129. package/src/postRepository/utils/payload.ts +1 -37
  130. package/src/reactionRepository/api/addReaction.ts +1 -0
  131. package/src/reactionRepository/api/removeReaction.ts +1 -0
  132. package/src/streamRepository/api/createStream.ts +1 -4
  133. package/src/streamRepository/api/index.ts +0 -1
  134. package/src/streamRepository/api/updateStream.ts +1 -8
  135. package/src/streamRepository/internalApi/getStream.ts +3 -3
  136. package/src/streamRepository/observers/getStreams/GetStreamsLiveCollectionController.ts +1 -1
  137. package/src/utils/linkedObject/postLinkedObject.ts +8 -28
  138. package/src/utils/linkedObject/streamLinkedObject.ts +0 -2
  139. package/src/utils/postTypePredicate.ts +6 -20
  140. package/dist/streamRepository/api/editStream.d.ts +0 -18
  141. package/dist/streamRepository/api/editStream.d.ts.map +0 -1
  142. package/dist/streamRepository/internalApi/getLiveChat.d.ts +0 -16
  143. package/dist/streamRepository/internalApi/getLiveChat.d.ts.map +0 -1
  144. package/src/streamRepository/api/editStream.ts +0 -51
  145. package/src/streamRepository/internalApi/getLiveChat.ts +0 -59
@@ -0,0 +1,71 @@
1
+ import { getActiveClient } from '~/client/api/activeClient';
2
+ import { ingestInCache } from '~/cache/api/ingestInCache';
3
+ import GlobalFileAccessType from '~/client/utils/GlobalFileAccessType';
4
+
5
+ /* begin_public_function
6
+ id: file.upload.clip
7
+ */
8
+ /**
9
+ * ```js
10
+ * import { FileRepository } from '@amityco/ts-sdk'
11
+ * const created = await FileRepository.uploadClip(formData)
12
+ * ```
13
+ *
14
+ * Creates an {@link Amity.File}
15
+ *
16
+ * @param formData The data necessary to create a new {@link Amity.File}
17
+ * @param onProgress The callback to track the upload progress
18
+ * @returns The newly created {@link Amity.File}
19
+ *
20
+ * @category File API
21
+ * @async
22
+ */
23
+ export const uploadClip = async (
24
+ formData: FormData,
25
+ feedType?: Amity.ContentFeedType,
26
+ onProgress?: (percent: number) => void,
27
+ ): Promise<Amity.Cached<Amity.File<'clip'>[]>> => {
28
+ const client = getActiveClient();
29
+ client.log('file/uploadClip', formData);
30
+
31
+ const file = formData.get('files');
32
+
33
+ if (!file) throw new Error('The formData object must have a `files` key.');
34
+
35
+ const accessType = GlobalFileAccessType.getInstance().getFileAccessType();
36
+ formData.append('accessType', accessType);
37
+
38
+ formData.append('preferredFilename', (file as File).name);
39
+
40
+ if (feedType) {
41
+ formData.append('feedType', feedType);
42
+ }
43
+
44
+ const headers =
45
+ 'getHeaders' in formData
46
+ ? (formData as any).getHeaders()
47
+ : { 'content-type': 'multipart/form-data' };
48
+
49
+ const { data } = await client.upload.post<Amity.CreateFilePayload<'clip'>>(
50
+ '/api/v4/clips',
51
+ formData,
52
+ {
53
+ headers,
54
+ onUploadProgress({ loaded, total = 100 }) {
55
+ onProgress && onProgress(Math.round((loaded * 100) / total));
56
+ },
57
+ },
58
+ );
59
+
60
+ // API-FIX: payload should be serialized properly
61
+ // const { files } = data
62
+
63
+ const cachedAt = client.cache && Date.now();
64
+ if (client.cache) ingestInCache({ files: data }, { cachedAt });
65
+
66
+ return {
67
+ data,
68
+ cachedAt,
69
+ };
70
+ };
71
+ /* end_public_function */
@@ -23,22 +23,6 @@ export const deleteMessage = async (
23
23
  const client = getActiveClient();
24
24
  client.log('message/deleteMessage', messageId);
25
25
 
26
- if (messageId.includes('LOCAL_')) {
27
- const message = pullFromCache<Amity.InternalMessage>(['message', 'get', messageId])?.data;
28
- if (!message) throw Error('messageId not found');
29
-
30
- const deletedMessage = {
31
- ...message,
32
- isDeleted: true,
33
- };
34
-
35
- fireEvent('local.message.deleted', {
36
- messages: [deletedMessage],
37
- });
38
-
39
- return LinkedObject.message(deletedMessage);
40
- }
41
-
42
26
  // API-FIX: This endpoint has not been implemented yet.
43
27
  const { data: deleted } = await client.http.delete<Amity.MessagePayload>(
44
28
  `/api/v5/messages/${encodeURIComponent(messageId)}`,
@@ -116,19 +116,6 @@ export class MessageQueryStreamController extends QueryStreamController<
116
116
  pushToCache(this.cacheKey, collection);
117
117
  }
118
118
 
119
- if (action === 'onDelete' && payload.syncState === Amity.SyncState.Error) {
120
- const collection = pullFromCache<Amity.MessageLiveCollectionCache>(this.cacheKey)?.data;
121
- if (!collection) return;
122
-
123
- if (collection.data.includes(payload.messageId)) {
124
- const newCollectionData = collection.data.filter(
125
- messageId => messageId !== payload.messageId,
126
- );
127
-
128
- pushToCache(this.cacheKey, { ...collection, data: newCollectionData });
129
- }
130
- }
131
-
132
119
  this.notifyChange({ origin: Amity.LiveDataOrigin.EVENT, loading: false });
133
120
  };
134
121
  }
@@ -0,0 +1,62 @@
1
+ import { getActiveClient } from '~/client/api/activeClient';
2
+
3
+ import { ingestInCache } from '~/cache/api/ingestInCache';
4
+ import { fireEvent } from '~/core/events';
5
+ import { prepareMembershipPayload } from '~/group/utils';
6
+ import { LinkedObject } from '~/utils/linkedObject';
7
+
8
+ /* begin_public_function
9
+ id: post.create.clip_post
10
+ */
11
+ /**
12
+ * ```js
13
+ * import { PostRepository } from '@amityco/ts-sdk'
14
+ * const created = await PostRepository.createClipPost({
15
+ * targetType: 'user',
16
+ * targetId: 'foobar',
17
+ * dataType: 'clip',
18
+ * data: { text: 'hello world' },
19
+ * attachments: [{ type: 'clip', fileId: 'fileId123', displayMode: 'fill', isMuted: false }]
20
+ * }))
21
+ * ```
22
+ *
23
+ * Creates an {@link Amity.Post}
24
+ *
25
+ * @param bundle The data necessary to create a new {@link Amity.Post}
26
+ * @returns The newly created {@link Amity.Post}
27
+ *
28
+ * @category Post API
29
+ * @async
30
+ */
31
+ export const createClipPost = async <T extends Amity.PostContentType | string>(
32
+ bundle: Pick<Amity.Post<T>, 'targetType' | 'targetId'> &
33
+ Partial<Pick<Amity.Post<T>, 'metadata' | 'mentionees' | 'tags'>> & {
34
+ data: { [k: string]: any };
35
+ attachments: {
36
+ type: T;
37
+ fileId: Amity.File['fileId'];
38
+ displayMode?: Amity.ClipDisplayMode;
39
+ isMuted?: boolean;
40
+ }[];
41
+ },
42
+ ): Promise<Amity.Cached<Amity.Post>> => {
43
+ const client = getActiveClient();
44
+ client.log('post/createPost', bundle);
45
+
46
+ const { data: payload } = await client.http.post<Amity.PostPayload>('/api/v4/posts', bundle);
47
+
48
+ fireEvent('post.created', payload);
49
+
50
+ const data = prepareMembershipPayload(payload, 'communityUsers');
51
+ const cachedAt = client.cache && Date.now();
52
+
53
+ if (client.cache) ingestInCache(data, { cachedAt });
54
+
55
+ const { posts } = data;
56
+
57
+ return {
58
+ data: LinkedObject.post(posts[0]),
59
+ cachedAt,
60
+ };
61
+ };
62
+ /* end_public_function */
@@ -2,8 +2,8 @@ import { getActiveClient } from '~/client/api';
2
2
 
3
3
  import { ingestInCache } from '~/cache/api/ingestInCache';
4
4
  import { fireEvent } from '~/core/events';
5
+ import { prepareMembershipPayload } from '~/group/utils';
5
6
  import { LinkedObject } from '~/utils/linkedObject';
6
- import { preparePostPayload } from '../utils/payload';
7
7
 
8
8
  /* begin_public_function
9
9
  id: post.create.text_post, post.create.image_post, post.create.file_post, post.create.video_post, post.create.poll_post, post.create.livestream_post, post.create.custom_post
@@ -46,8 +46,7 @@ export const createPost = async <T extends Amity.PostContentType | string>(
46
46
 
47
47
  fireEvent('post.created', payload);
48
48
 
49
- const data = preparePostPayload(payload);
50
-
49
+ const data = prepareMembershipPayload(payload, 'communityUsers');
51
50
  const cachedAt = client.cache && Date.now();
52
51
 
53
52
  if (client.cache) ingestInCache(data, { cachedAt });
@@ -13,3 +13,5 @@ export * from './declinePost';
13
13
  export * from './flagPost';
14
14
  export * from './unflagPost';
15
15
  export * from './isPostFlaggedByMe';
16
+
17
+ export * from './createClipPost';
@@ -43,7 +43,7 @@ export const queryPosts = async (
43
43
  // API-FIX: parameters should be querystring. (1)
44
44
  // API-FIX: backend should answer Amity.Response (2)
45
45
  // const { data } = await client.http.get<Amity.Response<Amity.PagedResponse<Amity.PostPayload>>>(
46
- const { data } = await client.http.get<Amity.PostPayload & Amity.Pagination>(`/api/v4/posts`, {
46
+ const { data } = await client.http.get<Amity.PostPayload & Amity.Pagination>(`/api/v5/posts`, {
47
47
  params: {
48
48
  ...params,
49
49
  isDeleted: inferIsDeleted(includeDeleted),
@@ -1,10 +1,38 @@
1
1
  import { getActiveClient } from '~/client/api';
2
2
  import { ingestInCache } from '~/cache/api/ingestInCache';
3
3
  import { createEventSubscriber, fireEvent } from '~/core/events';
4
- import { dropFromCache, pullFromCache, queryCache, upsertInCache } from '~/cache/api';
4
+ import { dropFromCache, pullFromCache, pushToCache, queryCache, upsertInCache } from '~/cache/api';
5
5
  import { isInTombstone } from '~/cache/api/isInTombstone';
6
6
  import { preparePostPayload } from '~/postRepository/utils/payload';
7
7
 
8
+ const processDeleteChildPost = (payload: Amity.PostPayload) => {
9
+ const post = payload.posts[0];
10
+ if (!post.parentId) return;
11
+
12
+ const parentPost = pullFromCache<Amity.InternalPost>(['post', 'get', post.parentPostId])?.data;
13
+
14
+ if (!parentPost) return;
15
+
16
+ pushToCache(['post', 'get', parentPost.postId], {
17
+ ...parentPost,
18
+ children: parentPost.children.filter(childId => childId !== post.postId),
19
+ });
20
+ };
21
+
22
+ const processCreateChildPost = (payload: Amity.PostPayload) => {
23
+ const post = payload.posts[0];
24
+ if (!post.parentId) return;
25
+
26
+ const parentPost = pullFromCache<Amity.InternalPost>(['post', 'get', post.parentPostId])?.data;
27
+
28
+ if (!parentPost) return;
29
+
30
+ pushToCache(['post', 'get', parentPost.postId], {
31
+ ...parentPost,
32
+ children: [...new Set([post.postId, ...parentPost.children])],
33
+ });
34
+ };
35
+
8
36
  export const createPostEventSubscriber = (
9
37
  event: keyof Amity.MqttPostEvents,
10
38
  callback: Amity.Listener<Amity.InternalPost>,
@@ -36,6 +64,8 @@ export const createPostEventSubscriber = (
36
64
  if (event === 'post.deleted') {
37
65
  const { postId, postedUserId } = payload.posts[0];
38
66
 
67
+ processDeleteChildPost(payload);
68
+
39
69
  try {
40
70
  isInTombstone('post', postId);
41
71
  } catch (e) {
@@ -70,6 +100,8 @@ export const createPostEventSubscriber = (
70
100
  queries?.map(({ key, data }) => upsertInCache(key, data as any, { cachedAt: -1 }));
71
101
  }
72
102
 
103
+ if (event === 'post.created') processCreateChildPost(payload);
104
+
73
105
  callback(post.data);
74
106
  }
75
107
  };
@@ -106,6 +138,8 @@ export const createLocalPostEventSubscriber = (
106
138
 
107
139
  const post = pullFromCache<Amity.InternalPost>(['post', 'get', payload.posts[0].postId])!;
108
140
 
141
+ if (event === 'local.post.deleted') processDeleteChildPost(payload);
142
+
109
143
  callback(post.data);
110
144
  }
111
145
  };
@@ -8,6 +8,7 @@ import { LinkedObject } from '~/utils/linkedObject';
8
8
  import { onPostDeleted } from '~/postRepository/events';
9
9
  import { EnumPostActions } from '../enums';
10
10
  import { onLocalPostDeleted } from '~/postRepository/events/onLocalPostDeleted';
11
+ import { generateCommentSubscriptions } from '../utils';
11
12
 
12
13
  export class GlobalPinnedPostLiveCollectionController extends LiveCollectionController<
13
14
  'pinnedPost',
@@ -71,6 +72,10 @@ export class GlobalPinnedPostLiveCollectionController extends LiveCollectionCont
71
72
  fn: onPostDeleted,
72
73
  action: EnumPostActions.OnPostDeleted,
73
74
  },
75
+ ...generateCommentSubscriptions({
76
+ cacheKey: this.cacheKey,
77
+ resolveId: id => `global#${id}`,
78
+ }),
74
79
  ]);
75
80
  }
76
81
 
@@ -6,6 +6,7 @@ import { LiveCollectionController } from '~/core/liveCollection/LiveCollectionCo
6
6
  import { isNonNullable } from '~/utils';
7
7
  import { LinkedObject } from '~/utils/linkedObject';
8
8
  import { sortByLastCreated } from '~/core/query';
9
+ import { generateCommentSubscriptions } from '../utils';
9
10
 
10
11
  export class PinnedPostLiveCollectionController extends LiveCollectionController<
11
12
  'pinnedPost',
@@ -63,7 +64,12 @@ export class PinnedPostLiveCollectionController extends LiveCollectionController
63
64
 
64
65
  // eslint-disable-next-line class-methods-use-this
65
66
  startSubscription() {
66
- return [] as Amity.Unsubscriber[];
67
+ return this.queryStreamController.subscribeRTE(
68
+ generateCommentSubscriptions({
69
+ cacheKey: this.cacheKey,
70
+ resolveId: id => `${this.query.placement}#${id}`,
71
+ }),
72
+ );
67
73
  }
68
74
 
69
75
  notifyChange({ origin, loading, error }: Amity.LiveCollectionNotifyParams) {
@@ -4,6 +4,7 @@ import { ingestInCache } from '~/cache/api/ingestInCache';
4
4
  import { getResolver } from '~/core/model';
5
5
  import { getActiveClient } from '~/client';
6
6
  import { convertRawUserToInternalUser } from '~/userRepository/utils/convertRawUserToInternalUser';
7
+ import { EnumPostActions } from '../enums';
7
8
 
8
9
  export class PinnedPostQueryStreamController extends QueryStreamController<
9
10
  Amity.PinnedPostPayload,
@@ -64,4 +65,30 @@ export class PinnedPostQueryStreamController extends QueryStreamController<
64
65
  });
65
66
  }
66
67
  }
68
+
69
+ reactor(action: EnumPostActions) {
70
+ return (post: Amity.InternalPost) => {
71
+ const collection = pullFromCache<Amity.PostLiveCollectionCache>(this.cacheKey)?.data;
72
+
73
+ if (!collection) return;
74
+
75
+ if (action === EnumPostActions.OnPostDeleted) {
76
+ collection.data = collection.data.filter(
77
+ referenceId => referenceId !== `global#${post.postId}`,
78
+ );
79
+ }
80
+
81
+ pushToCache(this.cacheKey, collection);
82
+ this.notifyChange({ origin: Amity.LiveDataOrigin.EVENT, loading: false });
83
+ };
84
+ }
85
+
86
+ subscribeRTE(
87
+ createSubscriber: {
88
+ fn: (reactor: (post: Amity.InternalPost) => void) => Amity.Unsubscriber;
89
+ action: EnumPostActions;
90
+ }[],
91
+ ) {
92
+ return createSubscriber.map(subscriber => subscriber.fn(this.reactor(subscriber.action)));
93
+ }
67
94
  }
@@ -3,17 +3,6 @@ import { pullFromCache, pushToCache } from '~/cache/api';
3
3
  import { PostPaginationController } from './PostPaginationController';
4
4
  import { PostQueryStreamController } from './PostQueryStreamController';
5
5
  import { LiveCollectionController } from '~/core/liveCollection/LiveCollectionController';
6
- import {
7
- onPostCreated,
8
- onPostUpdated,
9
- onPostDeleted,
10
- onPostFlagged,
11
- onPostUnflagged,
12
- onPostReactionAdded,
13
- onPostReactionRemoved,
14
- onPostApproved,
15
- onPostDeclined,
16
- } from '~/postRepository/events';
17
6
  import {
18
7
  filterByFeedType,
19
8
  filterByPostDataTypes,
@@ -22,16 +11,9 @@ import {
22
11
  sortByLastCreated,
23
12
  } from '~/core/query';
24
13
  import { isNonNullable } from '~/utils';
25
- import { EnumPostActions } from '../enums';
26
14
  import { LinkedObject } from '~/utils/linkedObject';
27
15
  import { preparePostPayload } from '~/postRepository/utils/payload';
28
- import { convertEventPayload } from '~/utils/event';
29
- import { onCommentCreated, onCommentDeleted } from '~/commentRepository';
30
- import { getPost } from '~/postRepository/internalApi/getPost';
31
- import { onPostUpdatedLocal } from '~/postRepository/events/onPostUpdatedLocal';
32
- import { onLocalPostReactionAdded } from '~/postRepository/events/onLocalPostReactionAdded';
33
- import { onLocalPostReactionRemoved } from '~/postRepository/events/onLocalPostReactionRemoved';
34
- import { onLocalPostDeleted } from '~/postRepository/events/onLocalPostDeleted';
16
+ import { getPostSubscription } from '../utils';
35
17
 
36
18
  export class PostLiveCollectionController extends LiveCollectionController<
37
19
  'post',
@@ -85,61 +67,7 @@ export class PostLiveCollectionController extends LiveCollectionController<
85
67
  }
86
68
 
87
69
  startSubscription() {
88
- return this.queryStreamController.subscribeRTE([
89
- { fn: onPostCreated, action: EnumPostActions.OnPostCreated },
90
- { fn: onPostUpdated, action: EnumPostActions.OnPostUpdated },
91
- { fn: onPostUpdatedLocal, action: EnumPostActions.OnPostUpdated },
92
- { fn: onPostDeleted, action: EnumPostActions.OnPostDeleted },
93
- { fn: onPostFlagged, action: EnumPostActions.OnPostFlagged },
94
- { fn: onPostUnflagged, action: EnumPostActions.OnPostUnflagged },
95
- { fn: onPostApproved, action: EnumPostActions.OnPostApproved },
96
- { fn: onPostDeclined, action: EnumPostActions.OnPostDeclined },
97
- { fn: onPostReactionAdded, action: EnumPostActions.OnPostReactionAdded },
98
- { fn: onPostReactionRemoved, action: EnumPostActions.OnPostReactionRemoved },
99
- { fn: onLocalPostReactionAdded, action: EnumPostActions.OnPostReactionAdded },
100
- { fn: onLocalPostReactionRemoved, action: EnumPostActions.OnPostReactionRemoved },
101
- { fn: onLocalPostDeleted, action: EnumPostActions.OnPostDeleted },
102
- {
103
- fn: convertEventPayload(
104
- (callback: Amity.Listener<Amity.InternalComment>) => {
105
- return onCommentCreated(async (comment: Amity.InternalComment) => {
106
- const currentCollection = pullFromCache<Amity.PostLiveCollectionCache>(
107
- this.cacheKey,
108
- )?.data;
109
-
110
- if (!currentCollection || currentCollection.data.includes(comment.referenceId))
111
- return;
112
-
113
- await getPost(comment.referenceId);
114
- callback(comment);
115
- });
116
- },
117
- 'referenceId',
118
- 'post',
119
- ),
120
- action: EnumPostActions.OnPostUpdated,
121
- },
122
- {
123
- fn: convertEventPayload(
124
- (callback: Amity.Listener<Amity.InternalComment>) => {
125
- return onCommentDeleted(async (comment: Amity.InternalComment) => {
126
- const currentCollection = pullFromCache<Amity.PostLiveCollectionCache>(
127
- this.cacheKey,
128
- )?.data;
129
-
130
- if (!currentCollection || currentCollection.data.includes(comment.referenceId))
131
- return;
132
-
133
- await getPost(comment.referenceId);
134
- callback(comment);
135
- });
136
- },
137
- 'referenceId',
138
- 'post',
139
- ),
140
- action: EnumPostActions.OnPostUpdated,
141
- },
142
- ]);
70
+ return this.queryStreamController.subscribeRTE(getPostSubscription(this.cacheKey));
143
71
  }
144
72
 
145
73
  notifyChange({ origin, loading, error }: Amity.LiveCollectionNotifyParams) {
@@ -23,7 +23,7 @@ export class PostPaginationController extends PaginationController<
23
23
  const options = token ? { ...baseOptions, token } : { ...baseOptions, limit };
24
24
 
25
25
  const { data: queryResponse } = await this.http.get<Amity.PostPayload & Amity.Pagination>(
26
- `/api/v4/posts`,
26
+ `/api/v5/posts`,
27
27
  {
28
28
  params: {
29
29
  ...params,
@@ -0,0 +1,97 @@
1
+ import { pullFromCache } from '~/cache/api';
2
+ import { onCommentCreated, onCommentDeleted } from '~/commentRepository';
3
+ import { getPost } from '~/postRepository/internalApi';
4
+ import {
5
+ onPostCreated,
6
+ onPostUpdated,
7
+ onPostDeleted,
8
+ onPostFlagged,
9
+ onPostUnflagged,
10
+ onPostReactionAdded,
11
+ onPostReactionRemoved,
12
+ onPostApproved,
13
+ onPostDeclined,
14
+ } from '~/postRepository/events';
15
+ import { onLocalPostDeleted } from '~/postRepository/events/onLocalPostDeleted';
16
+ import { onLocalPostReactionAdded } from '~/postRepository/events/onLocalPostReactionAdded';
17
+ import { onLocalPostReactionRemoved } from '~/postRepository/events/onLocalPostReactionRemoved';
18
+ import { onPostUpdatedLocal } from '~/postRepository/events/onPostUpdatedLocal';
19
+ import { EnumPostActions } from '~/postRepository/observers/enums';
20
+ import { convertEventPayload } from '~/utils/event';
21
+ import { onCommentCreatedLocal } from '~/commentRepository/events/onCommentCreatedLocal';
22
+ import { onCommentDeleteLocal } from '~/commentRepository/events/onCommentDeletedLocal';
23
+ import { onCommentReactionAdded, onCommentReactionRemoved } from '~/commentRepository/events';
24
+ import { onLocalCommentReactionAdded } from '~/commentRepository/events/onLocalCommentReactionAdded';
25
+ import { onLocalCommentReactionRemoved } from '~/commentRepository/events/onLocalCommentReactionRemoved';
26
+
27
+ type CommentEventHandler = (callback: Amity.Listener<Amity.InternalComment>) => Amity.Unsubscriber;
28
+
29
+ const commentEventHanlder = (
30
+ callback: Amity.Listener<Amity.InternalComment>,
31
+ eventHandler: CommentEventHandler,
32
+ cacheKey: Amity.CacheKey,
33
+ resolveId?: (id: string) => string,
34
+ ) => {
35
+ return eventHandler(async (comment: Amity.InternalComment) => {
36
+ const currentCollection = pullFromCache<Amity.PinnedPostLiveCollectionCache>(cacheKey)?.data;
37
+
38
+ if (
39
+ !currentCollection ||
40
+ !currentCollection.data.includes(
41
+ resolveId ? resolveId(comment.referenceId) : comment.referenceId,
42
+ )
43
+ )
44
+ return;
45
+
46
+ await getPost(comment.referenceId);
47
+ callback(comment);
48
+ });
49
+ };
50
+
51
+ export const generateCommentSubscriptions = ({
52
+ cacheKey,
53
+ resolveId,
54
+ }: {
55
+ cacheKey: Amity.CacheKey;
56
+ resolveId?: (id: string) => string;
57
+ }) => {
58
+ const eventHandlers = [
59
+ onCommentCreated,
60
+ onCommentDeleted,
61
+ onCommentReactionAdded,
62
+ onCommentReactionRemoved,
63
+ onCommentCreatedLocal,
64
+ onCommentDeleteLocal,
65
+ onLocalCommentReactionAdded,
66
+ onLocalCommentReactionRemoved,
67
+ ];
68
+
69
+ return eventHandlers.map(handler => ({
70
+ fn: convertEventPayload(
71
+ (callback: Amity.Listener<Amity.InternalComment>) =>
72
+ commentEventHanlder(callback, handler, cacheKey, resolveId),
73
+ 'referenceId',
74
+ 'post',
75
+ ),
76
+ action: EnumPostActions.OnPostUpdated,
77
+ }));
78
+ };
79
+
80
+ export const getPostSubscription = (cacheKey: Amity.CacheKey) => {
81
+ return [
82
+ { fn: onPostCreated, action: EnumPostActions.OnPostCreated },
83
+ { fn: onPostUpdated, action: EnumPostActions.OnPostUpdated },
84
+ { fn: onPostUpdatedLocal, action: EnumPostActions.OnPostUpdated },
85
+ { fn: onPostDeleted, action: EnumPostActions.OnPostDeleted },
86
+ { fn: onPostFlagged, action: EnumPostActions.OnPostFlagged },
87
+ { fn: onPostUnflagged, action: EnumPostActions.OnPostUnflagged },
88
+ { fn: onPostApproved, action: EnumPostActions.OnPostApproved },
89
+ { fn: onPostDeclined, action: EnumPostActions.OnPostDeclined },
90
+ { fn: onPostReactionAdded, action: EnumPostActions.OnPostReactionAdded },
91
+ { fn: onPostReactionRemoved, action: EnumPostActions.OnPostReactionRemoved },
92
+ { fn: onLocalPostReactionAdded, action: EnumPostActions.OnPostReactionAdded },
93
+ { fn: onLocalPostReactionRemoved, action: EnumPostActions.OnPostReactionRemoved },
94
+ { fn: onLocalPostDeleted, action: EnumPostActions.OnPostDeleted },
95
+ ...generateCommentSubscriptions({ cacheKey }),
96
+ ];
97
+ };
@@ -1,28 +1,8 @@
1
1
  import { addPostSetting } from '~/communityRepository/utils';
2
2
  import { updateMembershipStatus } from '~/communityRepository/utils/communityWithMembership';
3
- import { isAmityLivestreamPost } from '~/utils/postTypePredicate';
4
-
5
- const updateStreamReferences = (
6
- streams: Amity.RawStream[],
7
- streamId: string | undefined,
8
- postId: string,
9
- ) => {
10
- if (!streamId) return streams;
11
-
12
- return streams.map(stream =>
13
- stream.streamId === streamId
14
- ? {
15
- ...stream,
16
- referenceType: 'post',
17
- referenceId: postId,
18
- postId,
19
- }
20
- : stream,
21
- );
22
- };
23
3
 
24
4
  export const preparePostPayload = (payload: Amity.PostPayload): Amity.ProcessedPostPayload => {
25
- const { posts: postsData, postChildren, videoStreamings, ...postPayload } = payload;
5
+ const { posts: postsData, ...postPayload } = payload;
26
6
 
27
7
  // Unpack community payload by mapping payload field to postSetting value.
28
8
  const communitiesWithPostSetting = addPostSetting({ communities: postPayload.communities });
@@ -44,34 +24,18 @@ export const preparePostPayload = (payload: Amity.PostPayload): Amity.ProcessedP
44
24
  mappedCommunityUsers,
45
25
  );
46
26
 
47
- let mappedNewStream: Amity.RawStream[] = [];
48
-
49
27
  // feed type
50
28
  const posts = postsData.map(post => {
51
29
  const feedType = postPayload.feeds.find(feed => feed.feedId === post.feedId)?.feedType;
52
- const childPosts = payload.postChildren.filter(
53
- children => children.parentPostId === post.postId,
54
- );
55
-
56
- if (childPosts.length > 0 && isAmityLivestreamPost(childPosts[0])) {
57
- mappedNewStream = updateStreamReferences(
58
- videoStreamings,
59
- childPosts[0].data?.streamId,
60
- post.postId,
61
- );
62
- }
63
30
 
64
31
  return {
65
32
  ...post,
66
- childPosts,
67
33
  feedType,
68
34
  };
69
35
  });
70
36
 
71
37
  return {
72
38
  ...postPayload,
73
- postChildren,
74
- videoStreamings: mappedNewStream,
75
39
  posts,
76
40
  communities: communityWithMembershipStatus,
77
41
  communityUsers: mappedCommunityUsers,
@@ -69,6 +69,7 @@ export const addReaction = async (
69
69
  ...model.data.reactions,
70
70
  [reactionName]: (model.data.reactions[reactionName] ?? 0) + 1,
71
71
  },
72
+ updatedAt: new Date().toISOString(),
72
73
  } as Amity.Models[Amity.ReactableType];
73
74
 
74
75
  if (referenceType === 'comment') {
@@ -72,6 +72,7 @@ export const removeReaction = async (
72
72
  ...model.data.reactions,
73
73
  [reactionName]: Math.max(0, (model.data.reactions[reactionName] ?? 0) - 1),
74
74
  },
75
+ updatedAt: new Date().toISOString(),
75
76
  } as Amity.Models[Amity.ReactableType];
76
77
 
77
78
  if (referenceType === 'comment') {
@@ -21,10 +21,7 @@ import { LinkedObject } from '~/utils/linkedObject';
21
21
  * @async
22
22
  */
23
23
  export const createStream = async (
24
- bundle: Pick<
25
- Amity.InternalStream,
26
- 'title' | 'thumbnailFileId' | 'description' | 'channelEnabled'
27
- > & {
24
+ bundle: Pick<Amity.InternalStream, 'title' | 'thumbnailFileId' | 'description'> & {
28
25
  isSecure?: boolean;
29
26
  },
30
27
  ): Promise<Amity.Cached<Amity.Stream>> => {
@@ -2,4 +2,3 @@ export * from './createStream';
2
2
  export * from './updateStream';
3
3
  export * from './deleteStream';
4
4
  export * from './disposeStream';
5
- export * from './editStream';