@amityco/ts-sdk 7.7.1-3f344102.0 → 7.7.1-47be9e51.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 (66) hide show
  1. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/@types/core/payload.d.ts +1 -2
  2. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/@types/core/payload.d.ts.map +1 -1
  3. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/@types/core/payload.js.map +1 -1
  4. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/@types/domains/feed.d.ts +31 -0
  5. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/@types/domains/feed.d.ts.map +1 -1
  6. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/@types/domains/feed.js +21 -1
  7. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/@types/domains/feed.js.map +1 -1
  8. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/channelRepository/events/onChannelSetMuted.d.ts.map +1 -1
  9. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/channelRepository/events/onChannelSetMuted.js +8 -6
  10. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/channelRepository/events/onChannelSetMuted.js.map +1 -1
  11. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/index.d.ts +1 -0
  12. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/index.d.ts.map +1 -1
  13. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/index.js +1 -0
  14. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/index.js.map +1 -1
  15. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed/LiveCollectionController.d.ts +14 -0
  16. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed/LiveCollectionController.d.ts.map +1 -0
  17. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed/LiveCollectionController.js +129 -0
  18. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed/LiveCollectionController.js.map +1 -0
  19. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed/PaginationController.d.ts +5 -0
  20. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed/PaginationController.d.ts.map +1 -0
  21. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed/PaginationController.js +15 -0
  22. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed/PaginationController.js.map +1 -0
  23. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed/QueryStreamController.d.ts +15 -0
  24. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed/QueryStreamController.d.ts.map +1 -0
  25. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed/QueryStreamController.js +78 -0
  26. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed/QueryStreamController.js.map +1 -0
  27. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed.d.ts +23 -0
  28. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed.d.ts.map +1 -0
  29. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed.js +46 -0
  30. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed.js.map +1 -0
  31. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/index.d.ts +2 -0
  32. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/index.d.ts.map +1 -0
  33. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/index.js +2 -0
  34. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/index.js.map +1 -0
  35. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/tsconfig.tsbuildinfo +1 -1
  36. package/dist/@types/core/payload.d.ts +1 -2
  37. package/dist/@types/core/payload.d.ts.map +1 -1
  38. package/dist/@types/domains/feed.d.ts +31 -0
  39. package/dist/@types/domains/feed.d.ts.map +1 -1
  40. package/dist/channelRepository/events/onChannelSetMuted.d.ts.map +1 -1
  41. package/dist/feedRepository/index.d.ts +1 -0
  42. package/dist/feedRepository/index.d.ts.map +1 -1
  43. package/dist/feedRepository/observers/getUserFeed/LiveCollectionController.d.ts +14 -0
  44. package/dist/feedRepository/observers/getUserFeed/LiveCollectionController.d.ts.map +1 -0
  45. package/dist/feedRepository/observers/getUserFeed/PaginationController.d.ts +5 -0
  46. package/dist/feedRepository/observers/getUserFeed/PaginationController.d.ts.map +1 -0
  47. package/dist/feedRepository/observers/getUserFeed/QueryStreamController.d.ts +15 -0
  48. package/dist/feedRepository/observers/getUserFeed/QueryStreamController.d.ts.map +1 -0
  49. package/dist/feedRepository/observers/getUserFeed.d.ts +23 -0
  50. package/dist/feedRepository/observers/getUserFeed.d.ts.map +1 -0
  51. package/dist/feedRepository/observers/index.d.ts +2 -0
  52. package/dist/feedRepository/observers/index.d.ts.map +1 -0
  53. package/dist/index.cjs.js +1201 -962
  54. package/dist/index.esm.js +1200 -961
  55. package/dist/index.umd.js +1 -1
  56. package/package.json +1 -1
  57. package/src/@types/core/payload.ts +1 -2
  58. package/src/@types/domains/feed.ts +43 -0
  59. package/src/channelRepository/events/onChannelSetMuted.ts +8 -6
  60. package/src/feedRepository/index.ts +1 -0
  61. package/src/feedRepository/observers/getUserFeed/LiveCollectionController.ts +192 -0
  62. package/src/feedRepository/observers/getUserFeed/PaginationController.ts +37 -0
  63. package/src/feedRepository/observers/getUserFeed/QueryStreamController.ts +119 -0
  64. package/src/feedRepository/observers/getUserFeed.ts +56 -0
  65. package/src/feedRepository/observers/index.ts +1 -0
  66. package/tsconfig.tsbuildinfo +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amityco/ts-sdk",
3
- "version": "7.7.1-3f344102.0",
3
+ "version": "7.7.1-47be9e51.0",
4
4
  "license": "CC-BY-ND-4.0",
5
5
  "author": "amity.co <developers@amity.co> (https://amity.co)",
6
6
  "description": "Amity Social Cloud Typescript SDK",
@@ -597,10 +597,9 @@ declare global {
597
597
  channelId: string;
598
598
  muteTimeout: Amity.timestamp;
599
599
  actor: string;
600
- networkId: string;
601
600
  };
602
601
 
603
- type ChannelSetMutedPayload = RawChannelSetMuted;
602
+ type ChannelSetMutedPayload = RawChannelSetMuted[];
604
603
 
605
604
  type RawChannelSetUserMuted = {
606
605
  channelId: string;
@@ -1,7 +1,34 @@
1
1
  export {};
2
2
 
3
+ export const enum FeedDataTypeEnum {
4
+ Video = 'video',
5
+ Image = 'image',
6
+ File = 'file',
7
+ LiveStream = 'liveStream',
8
+ Clip = 'clip',
9
+ Poll = 'poll',
10
+ }
11
+
12
+ export const enum FeedSortByEnum {
13
+ LastCreated = 'lastCreated',
14
+ FirstCreated = 'firstCreated',
15
+ LastUpdated = 'lastUpdated',
16
+ FirstUpdated = 'firstUpdated',
17
+ }
18
+
19
+ export const enum FeedSourceEnum {
20
+ Community = 'community',
21
+ User = 'user',
22
+ }
23
+
3
24
  declare global {
4
25
  namespace Amity {
26
+ type FeedDataType = FeedDataTypeEnum;
27
+
28
+ type FeedSortBy = FeedSortByEnum;
29
+
30
+ type FeedSource = FeedSourceEnum;
31
+
5
32
  type Feed = {
6
33
  feedId: string;
7
34
  feedType: 'reviewing' | 'published';
@@ -15,5 +42,21 @@ declare global {
15
42
  queryToken?: string;
16
43
  resolveParent?: boolean;
17
44
  };
45
+
46
+ type QueryUserFeed = {
47
+ userId: string;
48
+ includeDeleted?: boolean;
49
+ sortBy?: Amity.FeedSortBy;
50
+ dataTypes?: Amity.FeedDataType[];
51
+ matchingOnlyParentPost?: boolean;
52
+ feedSources?: Amity.FeedSource[];
53
+ };
54
+
55
+ type UserFeedLiveCollection = Amity.LiveCollectionParams<QueryUserFeed>;
56
+
57
+ type UserFeedLiveCollectionCache = Amity.LiveCollectionCache<
58
+ Amity.InternalPost['postId'],
59
+ QueryUserFeed
60
+ >;
18
61
  }
19
62
  }
@@ -20,17 +20,19 @@ export const onChannelSetMuted = (callback: Amity.Listener<Amity.StaticInternalC
20
20
  if (callbacks.length === 0) {
21
21
  const client = getActiveClient();
22
22
 
23
- const filter = async (payload: Amity.ChannelSetMutedPayload) => {
24
- upsertInCache(['channel', 'get', payload.channelId], {
25
- // If muteTimeout > now => user is muted
26
- // Otherwise => user is unmuted
27
- isMuted: Date.parse(payload.muteTimeout) > Date.now(),
23
+ const filter = async (payloads: Amity.ChannelSetMutedPayload) => {
24
+ payloads.forEach(payload => {
25
+ upsertInCache(['channel', 'get', payload.channelId], {
26
+ // If muteTimeout > now => user is muted
27
+ // Otherwise => user is unmuted
28
+ isMuted: Date.parse(payload.muteTimeout) > Date.now(),
29
+ });
28
30
  });
29
31
 
30
32
  const channel = pullFromCache<Amity.StaticInternalChannel>([
31
33
  'channel',
32
34
  'get',
33
- payload.channelId,
35
+ payloads[0].channelId,
34
36
  ])?.data;
35
37
 
36
38
  if (channel) {
@@ -1 +1,2 @@
1
1
  export * from './api';
2
+ export * from './observers';
@@ -0,0 +1,192 @@
1
+ import hash from 'object-hash';
2
+ import { pullFromCache, pushToCache } from '~/cache/api';
3
+ import { UserFeedPaginationController } from './PaginationController';
4
+ import { UserFeedQueryStreamController } from './QueryStreamController';
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
+ import {
18
+ filterByPostDataTypes,
19
+ filterByPropEquality,
20
+ sortByFirstCreated,
21
+ sortByLastCreated,
22
+ } from '~/core/query';
23
+ import { isNonNullable } from '~/utils';
24
+ import { EnumPostActions } from '~/postRepository/observers/enums';
25
+ import { LinkedObject } from '~/utils/linkedObject';
26
+ import { preparePostPayload } from '~/postRepository/utils/payload';
27
+ import { convertEventPayload } from '~/utils/event';
28
+ import { onCommentCreated, onCommentDeleted } from '~/commentRepository';
29
+ import { getPost } from '~/postRepository/internalApi/getPost';
30
+ import { onPostUpdatedLocal } from '~/postRepository/events/onPostUpdatedLocal';
31
+ import { onLocalPostReactionAdded } from '~/postRepository/events/onLocalPostReactionAdded';
32
+ import { onLocalPostReactionRemoved } from '~/postRepository/events/onLocalPostReactionRemoved';
33
+ import { onLocalPostDeleted } from '~/postRepository/events/onLocalPostDeleted';
34
+
35
+ export class UserFeedLiveCollectionController extends LiveCollectionController<
36
+ 'post',
37
+ Amity.UserFeedLiveCollection,
38
+ Amity.Post,
39
+ UserFeedPaginationController
40
+ > {
41
+ private queryStreamController: UserFeedQueryStreamController;
42
+
43
+ private query: Amity.UserFeedLiveCollection;
44
+
45
+ constructor(
46
+ query: Amity.UserFeedLiveCollection,
47
+ callback: Amity.LiveCollectionCallback<Amity.Post>,
48
+ ) {
49
+ const queryStreamId = hash(query);
50
+ const cacheKey = ['userFeed', 'collection', queryStreamId];
51
+ const paginationController = new UserFeedPaginationController(query);
52
+
53
+ super(paginationController, queryStreamId, cacheKey, callback);
54
+
55
+ this.query = query;
56
+ this.queryStreamController = new UserFeedQueryStreamController(
57
+ this.query,
58
+ this.cacheKey,
59
+ this.notifyChange.bind(this),
60
+ preparePostPayload,
61
+ );
62
+
63
+ this.callback = callback.bind(this);
64
+ this.loadPage({ initial: true });
65
+ }
66
+
67
+ protected setup() {
68
+ const collection = pullFromCache<Amity.UserFeedLiveCollectionCache>(this.cacheKey)?.data;
69
+ if (!collection) {
70
+ pushToCache(this.cacheKey, {
71
+ data: [],
72
+ params: {},
73
+ });
74
+ }
75
+ }
76
+
77
+ protected async persistModel(queryPayload: Amity.PostPayload & Amity.Pagination) {
78
+ await this.queryStreamController.saveToMainDB(queryPayload);
79
+ }
80
+
81
+ protected persistQueryStream({
82
+ response,
83
+ direction,
84
+ refresh,
85
+ }: Amity.LiveCollectionPersistQueryStreamParams<'post'>) {
86
+ this.queryStreamController.appendToQueryStream(response, direction, refresh);
87
+ }
88
+
89
+ startSubscription() {
90
+ return this.queryStreamController.subscribeRTE([
91
+ { fn: onPostCreated, action: EnumPostActions.OnPostCreated },
92
+ { fn: onPostUpdated, action: EnumPostActions.OnPostUpdated },
93
+ { fn: onPostUpdatedLocal, action: EnumPostActions.OnPostUpdated },
94
+ { fn: onPostDeleted, action: EnumPostActions.OnPostDeleted },
95
+ { fn: onPostFlagged, action: EnumPostActions.OnPostFlagged },
96
+ { fn: onPostUnflagged, action: EnumPostActions.OnPostUnflagged },
97
+ { fn: onPostApproved, action: EnumPostActions.OnPostApproved },
98
+ { fn: onPostDeclined, action: EnumPostActions.OnPostDeclined },
99
+ { fn: onPostReactionAdded, action: EnumPostActions.OnPostReactionAdded },
100
+ { fn: onPostReactionRemoved, action: EnumPostActions.OnPostReactionRemoved },
101
+ { fn: onLocalPostReactionAdded, action: EnumPostActions.OnPostReactionAdded },
102
+ { fn: onLocalPostReactionRemoved, action: EnumPostActions.OnPostReactionRemoved },
103
+ { fn: onLocalPostDeleted, action: EnumPostActions.OnPostDeleted },
104
+ {
105
+ fn: convertEventPayload(
106
+ (callback: Amity.Listener<Amity.InternalComment>) => {
107
+ return onCommentCreated(async (comment: Amity.InternalComment) => {
108
+ const currentCollection = pullFromCache<Amity.UserFeedLiveCollectionCache>(
109
+ this.cacheKey,
110
+ )?.data;
111
+
112
+ if (!currentCollection || currentCollection.data.includes(comment.referenceId))
113
+ return;
114
+
115
+ await getPost(comment.referenceId);
116
+ callback(comment);
117
+ });
118
+ },
119
+ 'referenceId',
120
+ 'post',
121
+ ),
122
+ action: EnumPostActions.OnPostUpdated,
123
+ },
124
+ {
125
+ fn: convertEventPayload(
126
+ (callback: Amity.Listener<Amity.InternalComment>) => {
127
+ return onCommentDeleted(async (comment: Amity.InternalComment) => {
128
+ const currentCollection = pullFromCache<Amity.UserFeedLiveCollectionCache>(
129
+ this.cacheKey,
130
+ )?.data;
131
+
132
+ if (!currentCollection || currentCollection.data.includes(comment.referenceId))
133
+ return;
134
+
135
+ await getPost(comment.referenceId);
136
+ callback(comment);
137
+ });
138
+ },
139
+ 'referenceId',
140
+ 'post',
141
+ ),
142
+ action: EnumPostActions.OnPostUpdated,
143
+ },
144
+ ]);
145
+ }
146
+
147
+ notifyChange({ origin, loading, error }: Amity.LiveCollectionNotifyParams) {
148
+ const collection = pullFromCache<Amity.UserFeedLiveCollectionCache>(this.cacheKey)?.data;
149
+ if (!collection) return;
150
+
151
+ const data = this.applyFilter(
152
+ collection.data
153
+ .map(id => pullFromCache<Amity.InternalPost>(['post', 'get', id])!)
154
+ .filter(isNonNullable)
155
+ .map(({ data }) => data) ?? [],
156
+ ).map(LinkedObject.post);
157
+
158
+ if (!this.shouldNotify(data) && origin === 'event') return;
159
+
160
+ this.callback({
161
+ onNextPage: () => this.loadPage({ direction: Amity.LiveCollectionPageDirection.NEXT }),
162
+ data,
163
+ hasNextPage: !!this.paginationController.getNextToken(),
164
+ loading,
165
+ error,
166
+ });
167
+ }
168
+
169
+ applyFilter(data: Amity.InternalPost[]) {
170
+ let posts = data;
171
+
172
+ if (!this.query.includeDeleted) {
173
+ posts = filterByPropEquality(posts, 'isDeleted', false);
174
+ }
175
+
176
+ if (this.query.dataTypes?.length) {
177
+ posts = filterByPostDataTypes(posts, this.query.dataTypes);
178
+ }
179
+
180
+ switch (this.query.sortBy) {
181
+ case 'firstCreated':
182
+ posts = posts.sort(sortByFirstCreated);
183
+ break;
184
+ case 'lastCreated':
185
+ default:
186
+ posts = posts.sort(sortByLastCreated);
187
+ break;
188
+ }
189
+
190
+ return posts;
191
+ }
192
+ }
@@ -0,0 +1,37 @@
1
+ import { PaginationController } from '~/core/liveCollection/PaginationController';
2
+ import { COLLECTION_DEFAULT_PAGINATION_LIMIT } from '~/utils/constants';
3
+ import { inferIsDeleted } from '~/utils/inferIsDeleted';
4
+
5
+ export class UserFeedPaginationController extends PaginationController<
6
+ 'post',
7
+ Amity.UserFeedLiveCollection
8
+ > {
9
+ async getRequest(queryParams: Amity.UserFeedLiveCollection, token: string | undefined) {
10
+ const {
11
+ userId,
12
+ feedSources,
13
+ dataTypes,
14
+ includeDeleted,
15
+ matchingOnlyParentPost,
16
+ limit = COLLECTION_DEFAULT_PAGINATION_LIMIT,
17
+ ...params
18
+ } = queryParams;
19
+
20
+ const options = token ? { token } : { limit };
21
+
22
+ const { data: queryResponse } = await this.http.get<Amity.PostPayload & Amity.Pagination>(
23
+ `/api/v4/user-feeds/${userId}`,
24
+ {
25
+ params: {
26
+ ...params,
27
+ options,
28
+ dataTypes: dataTypes?.length ? dataTypes : undefined,
29
+ includePostedFeed: feedSources,
30
+ isDeleted: inferIsDeleted(includeDeleted),
31
+ matchingOnlyParentPost: matchingOnlyParentPost ?? !dataTypes?.length,
32
+ },
33
+ },
34
+ );
35
+ return queryResponse;
36
+ }
37
+ }
@@ -0,0 +1,119 @@
1
+ import { getResolver } from '~/core/model';
2
+ import { getActiveClient } from '~/client';
3
+ import { pullFromCache, pushToCache } from '~/cache/api';
4
+ import { ingestInCache } from '~/cache/api/ingestInCache';
5
+ import { EnumPostActions } from '~/postRepository/observers/enums';
6
+ import { QueryStreamController } from '~/core/liveCollection/QueryStreamController';
7
+
8
+ export class UserFeedQueryStreamController extends QueryStreamController<
9
+ Amity.PostPayload,
10
+ Amity.UserFeedLiveCollection
11
+ > {
12
+ private notifyChange: (params: Amity.LiveCollectionNotifyParams) => void;
13
+
14
+ private preparePayload: (response: Amity.PostPayload) => Amity.ProcessedPostPayload;
15
+
16
+ constructor(
17
+ query: Amity.UserFeedLiveCollection,
18
+ cacheKey: string[],
19
+ notifyChange: (params: Amity.LiveCollectionNotifyParams) => void,
20
+ preparePayload: (response: Amity.PostPayload) => Amity.ProcessedPostPayload,
21
+ ) {
22
+ super(query, cacheKey);
23
+ this.notifyChange = notifyChange;
24
+ this.preparePayload = preparePayload;
25
+ }
26
+
27
+ async saveToMainDB(response: Amity.PostPayload) {
28
+ const processedPayload = await this.preparePayload(response);
29
+
30
+ const client = getActiveClient();
31
+ const cachedAt = client.cache && Date.now();
32
+
33
+ if (client.cache) {
34
+ ingestInCache(processedPayload, { cachedAt });
35
+ }
36
+ }
37
+
38
+ appendToQueryStream(
39
+ response: Amity.PostPayload & Partial<Amity.Pagination>,
40
+ direction: Amity.LiveCollectionPageDirection,
41
+ refresh = false,
42
+ ) {
43
+ if (refresh) {
44
+ pushToCache(this.cacheKey, {
45
+ data: response.posts.map(getResolver('post')),
46
+ });
47
+ } else {
48
+ const collection = pullFromCache<Amity.UserFeedLiveCollectionCache>(this.cacheKey)?.data;
49
+
50
+ const posts = collection?.data ?? [];
51
+
52
+ pushToCache(this.cacheKey, {
53
+ ...collection,
54
+ data: [...new Set([...posts, ...response.posts.map(getResolver('post'))])],
55
+ });
56
+ }
57
+ }
58
+
59
+ reactor(action: EnumPostActions) {
60
+ return (post: Amity.InternalPost) => {
61
+ const collection = pullFromCache<Amity.UserFeedLiveCollectionCache>(this.cacheKey)?.data;
62
+
63
+ if (!collection) return;
64
+
65
+ // if the collection is parent post collection and
66
+ // post is not included in the collection or post is child post
67
+ if (
68
+ (!this.query.dataTypes || this.query.dataTypes.length === 0) &&
69
+ !collection.data.includes(post.parentPostId ? post.parentPostId : post.postId)
70
+ )
71
+ return;
72
+
73
+ if (action === EnumPostActions.OnPostDeleted) {
74
+ collection.data = collection.data.filter(postId => postId !== post.postId);
75
+ }
76
+
77
+ if (post.parentPostId && post.isDeleted) {
78
+ const parentPost = pullFromCache<Amity.InternalPost>([
79
+ 'post',
80
+ 'get',
81
+ post.parentPostId,
82
+ ])?.data;
83
+
84
+ if (!parentPost) return;
85
+
86
+ parentPost.children = parentPost.children.filter(childId => childId !== post.postId);
87
+ pushToCache(['post', 'get', parentPost.postId], parentPost);
88
+ }
89
+
90
+ if (action === EnumPostActions.OnPostDeclined) {
91
+ collection.data = collection.data.filter(postId => postId !== post.postId);
92
+ }
93
+
94
+ if (action === EnumPostActions.OnPostCreated || action === EnumPostActions.OnPostApproved) {
95
+ if (
96
+ this.query.dataTypes &&
97
+ this.query.dataTypes.length > 0 &&
98
+ !this.query.dataTypes.includes(post.dataType)
99
+ ) {
100
+ return;
101
+ }
102
+
103
+ collection.data = [...new Set([post.postId, ...collection.data])];
104
+ }
105
+
106
+ pushToCache(this.cacheKey, collection);
107
+ this.notifyChange({ origin: Amity.LiveDataOrigin.EVENT, loading: false });
108
+ };
109
+ }
110
+
111
+ subscribeRTE(
112
+ createSubscriber: {
113
+ fn: (reactor: (post: Amity.InternalPost) => void) => Amity.Unsubscriber;
114
+ action: EnumPostActions;
115
+ }[],
116
+ ) {
117
+ return createSubscriber.map(subscriber => subscriber.fn(this.reactor(subscriber.action)));
118
+ }
119
+ }
@@ -0,0 +1,56 @@
1
+ import { getActiveClient } from '~/client/api/activeClient';
2
+ import { dropFromCache } from '~/cache/api/dropFromCache';
3
+ import { ENABLE_CACHE_MESSAGE } from '~/utils/constants';
4
+ import { UserFeedLiveCollectionController } from './getUserFeed/LiveCollectionController';
5
+
6
+ /* begin_public_function
7
+ id: feed.query.user_feed
8
+ */
9
+ /**
10
+ * ```js
11
+ * import { FeedRepository } from '@amityco/ts-sdk'
12
+ *
13
+ * let posts = []
14
+ * const unsubscribe = FeedRepository.getUserFeed({
15
+ * userId: string,
16
+ * feedSources: ['user', 'community'],
17
+ * }, response => response => processResponse(response))
18
+ * ```
19
+ *
20
+ * Observe all mutations on a list of {@link Amity.Post} for a given user and feedSources
21
+ *
22
+ * @param params.userId the ID of the user
23
+ * @param params.feedSources the sources of the feed
24
+ * @param callback the function to call when new data are available
25
+ * @param config
26
+ * @returns An {@link Amity.Unsubscriber} function to run when willing to stop observing the messages
27
+ *
28
+ * @category Posts Live Collection
29
+ */
30
+ export const getUserFeed = (
31
+ params: Amity.UserFeedLiveCollection,
32
+ callback: Amity.LiveCollectionCallback<Amity.Post>,
33
+ config?: Amity.LiveCollectionConfig,
34
+ ): Amity.Unsubscriber => {
35
+ const { log, cache } = getActiveClient();
36
+
37
+ if (!cache) {
38
+ console.log(ENABLE_CACHE_MESSAGE);
39
+ }
40
+
41
+ const timestamp = Date.now();
42
+ log(`getUserFeed(tmpid: ${timestamp}) > listen`);
43
+
44
+ const userFeedLiveCollection = new UserFeedLiveCollectionController(params, callback);
45
+ const disposers = userFeedLiveCollection.startSubscription();
46
+
47
+ const cacheKey = userFeedLiveCollection.getCacheKey();
48
+
49
+ disposers.push(() => dropFromCache(cacheKey));
50
+
51
+ return () => {
52
+ log(`getUserFeed(tmpid: ${timestamp}) > dispose`);
53
+ disposers.forEach(fn => fn());
54
+ };
55
+ };
56
+ /* end_public_function */
@@ -0,0 +1 @@
1
+ export * from './getUserFeed';