@amityco/ts-sdk 7.8.1-b470fee3.0 → 7.8.1-e2ad782.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 (90) hide show
  1. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/@types/domains/community.d.ts +2 -1
  2. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/@types/domains/community.d.ts.map +1 -1
  3. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/@types/domains/community.js.map +1 -1
  4. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/@types/domains/feed.d.ts +32 -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 +22 -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/@types/domains/pinnedPost.d.ts +1 -4
  9. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/@types/domains/pinnedPost.d.ts.map +1 -1
  10. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/@types/domains/pinnedPost.js.map +1 -1
  11. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/@types/index.d.ts +1 -0
  12. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/@types/index.d.ts.map +1 -1
  13. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/@types/index.js +1 -0
  14. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/@types/index.js.map +1 -1
  15. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/client/api/index.d.ts +1 -0
  16. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/client/api/index.d.ts.map +1 -1
  17. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/client/api/index.js +1 -0
  18. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/client/api/index.js.map +1 -1
  19. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/communityRepository/observers/getCommunities/CommunitiesLiveCollectionController.d.ts.map +1 -1
  20. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/communityRepository/observers/getCommunities/CommunitiesLiveCollectionController.js +3 -2
  21. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/communityRepository/observers/getCommunities/CommunitiesLiveCollectionController.js.map +1 -1
  22. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/index.d.ts +1 -1
  23. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/index.d.ts.map +1 -1
  24. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/index.js +1 -1
  25. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/index.js.map +1 -1
  26. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed/LiveCollectionController.d.ts +13 -0
  27. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed/LiveCollectionController.d.ts.map +1 -0
  28. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed/LiveCollectionController.js +108 -0
  29. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed/LiveCollectionController.js.map +1 -0
  30. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed/PaginationController.d.ts +5 -0
  31. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed/PaginationController.d.ts.map +1 -0
  32. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed/PaginationController.js +15 -0
  33. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed/PaginationController.js.map +1 -0
  34. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed/QueryStreamController.d.ts +15 -0
  35. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed/QueryStreamController.d.ts.map +1 -0
  36. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed/QueryStreamController.js +78 -0
  37. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed/QueryStreamController.js.map +1 -0
  38. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed.d.ts +23 -0
  39. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed.d.ts.map +1 -0
  40. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed.js +46 -0
  41. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/getUserFeed.js.map +1 -0
  42. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/index.d.ts +1 -0
  43. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/index.d.ts.map +1 -1
  44. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/index.js +1 -0
  45. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/feedRepository/observers/index.js.map +1 -1
  46. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/liveReactionRepository/api/createReaction.d.ts.map +1 -1
  47. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/dist/liveReactionRepository/api/createReaction.js.map +1 -1
  48. package/.rollup.cache/home/runner/work/AmityTypescriptSDK/AmityTypescriptSDK/packages/sdk/tsconfig.tsbuildinfo +1 -1
  49. package/dist/@types/domains/community.d.ts +2 -1
  50. package/dist/@types/domains/community.d.ts.map +1 -1
  51. package/dist/@types/domains/feed.d.ts +32 -0
  52. package/dist/@types/domains/feed.d.ts.map +1 -1
  53. package/dist/@types/domains/pinnedPost.d.ts +1 -4
  54. package/dist/@types/domains/pinnedPost.d.ts.map +1 -1
  55. package/dist/@types/index.d.ts +1 -0
  56. package/dist/@types/index.d.ts.map +1 -1
  57. package/dist/client/api/index.d.ts +1 -0
  58. package/dist/client/api/index.d.ts.map +1 -1
  59. package/dist/communityRepository/observers/getCommunities/CommunitiesLiveCollectionController.d.ts.map +1 -1
  60. package/dist/feedRepository/index.d.ts +1 -1
  61. package/dist/feedRepository/index.d.ts.map +1 -1
  62. package/dist/feedRepository/observers/getUserFeed/LiveCollectionController.d.ts +13 -0
  63. package/dist/feedRepository/observers/getUserFeed/LiveCollectionController.d.ts.map +1 -0
  64. package/dist/feedRepository/observers/getUserFeed/PaginationController.d.ts +5 -0
  65. package/dist/feedRepository/observers/getUserFeed/PaginationController.d.ts.map +1 -0
  66. package/dist/feedRepository/observers/getUserFeed/QueryStreamController.d.ts +15 -0
  67. package/dist/feedRepository/observers/getUserFeed/QueryStreamController.d.ts.map +1 -0
  68. package/dist/feedRepository/observers/getUserFeed.d.ts +23 -0
  69. package/dist/feedRepository/observers/getUserFeed.d.ts.map +1 -0
  70. package/dist/feedRepository/observers/index.d.ts +1 -0
  71. package/dist/feedRepository/observers/index.d.ts.map +1 -1
  72. package/dist/index.cjs.js +244 -3
  73. package/dist/index.esm.js +245 -4
  74. package/dist/index.umd.js +4 -4
  75. package/dist/liveReactionRepository/api/createReaction.d.ts.map +1 -1
  76. package/package.json +1 -1
  77. package/src/@types/domains/community.ts +1 -0
  78. package/src/@types/domains/feed.ts +44 -0
  79. package/src/@types/domains/pinnedPost.ts +1 -4
  80. package/src/@types/index.ts +1 -0
  81. package/src/client/api/index.ts +2 -0
  82. package/src/communityRepository/observers/getCommunities/CommunitiesLiveCollectionController.ts +3 -3
  83. package/src/feedRepository/index.ts +1 -1
  84. package/src/feedRepository/observers/getUserFeed/LiveCollectionController.ts +162 -0
  85. package/src/feedRepository/observers/getUserFeed/PaginationController.ts +37 -0
  86. package/src/feedRepository/observers/getUserFeed/QueryStreamController.ts +119 -0
  87. package/src/feedRepository/observers/getUserFeed.ts +56 -0
  88. package/src/feedRepository/observers/index.ts +1 -0
  89. package/src/liveReactionRepository/api/createReaction.ts +0 -1
  90. package/tsconfig.tsbuildinfo +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"createReaction.d.ts","sourceRoot":"","sources":["../../../src/liveReactionRepository/api/createReaction.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,cAAc;iBAMZ,MAAM;cACT,MAAM;MACd,QAAQ,OAAO,CAyBlB,CAAC"}
1
+ {"version":3,"file":"createReaction.d.ts","sourceRoot":"","sources":["../../../src/liveReactionRepository/api/createReaction.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,cAAc;iBAMZ,MAAM;cACT,MAAM;MACd,QAAQ,OAAO,CAwBlB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amityco/ts-sdk",
3
- "version": "7.8.1-b470fee3.0",
3
+ "version": "7.8.1-e2ad782.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",
@@ -28,6 +28,7 @@ declare global {
28
28
  const enum CommunitySortByEnum {
29
29
  FirstCreated = 'firstCreated',
30
30
  LastCreated = 'lastCreated',
31
+ DisplayName = 'displayName',
31
32
  }
32
33
 
33
34
  type CommunitySortBy = `${Amity.CommunitySortByEnum}`;
@@ -1,7 +1,35 @@
1
1
  export {};
2
2
 
3
+ export const enum FeedDataTypeEnum {
4
+ Text = 'text',
5
+ Video = 'video',
6
+ Image = 'image',
7
+ File = 'file',
8
+ LiveStream = 'liveStream',
9
+ Clip = 'clip',
10
+ Poll = 'poll',
11
+ }
12
+
13
+ export const enum FeedSortByEnum {
14
+ LastCreated = 'lastCreated',
15
+ FirstCreated = 'firstCreated',
16
+ LastUpdated = 'lastUpdated',
17
+ FirstUpdated = 'firstUpdated',
18
+ }
19
+
20
+ export const enum FeedSourceEnum {
21
+ Community = 'community',
22
+ User = 'user',
23
+ }
24
+
3
25
  declare global {
4
26
  namespace Amity {
27
+ type FeedDataType = FeedDataTypeEnum;
28
+
29
+ type FeedSortBy = FeedSortByEnum;
30
+
31
+ type FeedSource = FeedSourceEnum;
32
+
5
33
  type Feed = {
6
34
  feedId: string;
7
35
  feedType: 'reviewing' | 'published';
@@ -31,5 +59,21 @@ declare global {
31
59
  Amity.InternalPost['postId'],
32
60
  QueryGlobalFeed
33
61
  >;
62
+
63
+ type QueryUserFeed = {
64
+ userId: string;
65
+ includeDeleted?: boolean;
66
+ sortBy?: Amity.FeedSortBy;
67
+ dataTypes?: Amity.FeedDataType[];
68
+ matchingOnlyParentPost?: boolean;
69
+ feedSources?: Amity.FeedSource[];
70
+ };
71
+
72
+ type UserFeedLiveCollection = Amity.LiveCollectionParams<QueryUserFeed>;
73
+
74
+ type UserFeedLiveCollectionCache = Amity.LiveCollectionCache<
75
+ Amity.InternalPost['postId'],
76
+ QueryUserFeed
77
+ >;
34
78
  }
35
79
  }
@@ -24,12 +24,9 @@ declare global {
24
24
  'params'
25
25
  >;
26
26
 
27
- type PinnedPost = {
27
+ type PinnedPost = Amity.RawPin & {
28
28
  post: Amity.Post | undefined;
29
- placement: Amity.Pin['placement'];
30
29
  target: Amity.PinTarget | undefined;
31
- pinnedBy: Amity.User;
32
- pinnedAt: Date;
33
30
  };
34
31
 
35
32
  type GlobalPinnedPostLiveCollection = Amity.LiveCollectionParams<{}>;
@@ -44,4 +44,5 @@ export * from './domains/joinRequest';
44
44
  export * from './domains/pin';
45
45
  export * from './domains/pinnedPost';
46
46
  export * from './domains/liveReaction';
47
+ export * from './domains/feed';
47
48
  export * from './domains/hashtag';
@@ -22,4 +22,6 @@ export * from './setUploadedFileAccessType';
22
22
 
23
23
  export * from './fetchLinkPreview';
24
24
 
25
+ export * from './getSocialSettings';
26
+
25
27
  export * from './getShareableLinkConfiguration';
@@ -29,6 +29,7 @@ import {
29
29
  } from '~/communityRepository/communityMembership';
30
30
  import { isNonNullable } from '~/utils';
31
31
  import { convertEventPayload } from '~/utils/event';
32
+ import { communityLinkedObject } from '~/utils/linkedObject/communityLinkedObject';
32
33
 
33
34
  export class CommunityLiveCollectionController extends LiveCollectionController<
34
35
  'community',
@@ -105,12 +106,11 @@ export class CommunityLiveCollectionController extends LiveCollectionController<
105
106
  const collection = pullFromCache<Amity.CommunityLiveCollectionCache>(this.cacheKey)?.data;
106
107
  if (!collection) return;
107
108
 
108
- const data = this.applyFilter(
109
+ const data =
109
110
  collection.data
110
111
  .map(id => pullFromCache<Amity.Community>(['community', 'get', id]))
111
112
  .filter(isNonNullable)
112
- .map(({ data }) => data) ?? [],
113
- );
113
+ .map(({ data }) => communityLinkedObject(data)) ?? [];
114
114
 
115
115
  if (!this.shouldNotify(data) && origin === 'event') return;
116
116
 
@@ -1,2 +1,2 @@
1
1
  export { queryGlobalFeed } from './api';
2
- export { getCustomRankingGlobalFeed, getGlobalFeed } from './observers';
2
+ export { getCustomRankingGlobalFeed, getGlobalFeed, getUserFeed } from './observers';
@@ -0,0 +1,162 @@
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 { isNonNullable } from '~/utils';
18
+ import { EnumPostActions } from '~/postRepository/observers/enums';
19
+ import { LinkedObject } from '~/utils/linkedObject';
20
+ import { preparePostPayload } from '~/postRepository/utils/payload';
21
+ import { convertEventPayload } from '~/utils/event';
22
+ import { onCommentCreated, onCommentDeleted } from '~/commentRepository';
23
+ import { getPost } from '~/postRepository/internalApi/getPost';
24
+ import { onPostUpdatedLocal } from '~/postRepository/events/onPostUpdatedLocal';
25
+ import { onLocalPostReactionAdded } from '~/postRepository/events/onLocalPostReactionAdded';
26
+ import { onLocalPostReactionRemoved } from '~/postRepository/events/onLocalPostReactionRemoved';
27
+ import { onLocalPostDeleted } from '~/postRepository/events/onLocalPostDeleted';
28
+
29
+ export class UserFeedLiveCollectionController extends LiveCollectionController<
30
+ 'post',
31
+ Amity.UserFeedLiveCollection,
32
+ Amity.Post,
33
+ UserFeedPaginationController
34
+ > {
35
+ private queryStreamController: UserFeedQueryStreamController;
36
+
37
+ private query: Amity.UserFeedLiveCollection;
38
+
39
+ constructor(
40
+ query: Amity.UserFeedLiveCollection,
41
+ callback: Amity.LiveCollectionCallback<Amity.Post>,
42
+ ) {
43
+ const queryStreamId = hash(query);
44
+ const cacheKey = ['userFeed', 'collection', queryStreamId];
45
+ const paginationController = new UserFeedPaginationController(query);
46
+
47
+ super(paginationController, queryStreamId, cacheKey, callback);
48
+
49
+ this.query = query;
50
+ this.queryStreamController = new UserFeedQueryStreamController(
51
+ this.query,
52
+ this.cacheKey,
53
+ this.notifyChange.bind(this),
54
+ preparePostPayload,
55
+ );
56
+
57
+ this.callback = callback.bind(this);
58
+ this.loadPage({ initial: true });
59
+ }
60
+
61
+ protected setup() {
62
+ const collection = pullFromCache<Amity.UserFeedLiveCollectionCache>(this.cacheKey)?.data;
63
+ if (!collection) {
64
+ pushToCache(this.cacheKey, {
65
+ data: [],
66
+ params: {},
67
+ });
68
+ }
69
+ }
70
+
71
+ protected async persistModel(queryPayload: Amity.PostPayload & Amity.Pagination) {
72
+ await this.queryStreamController.saveToMainDB(queryPayload);
73
+ }
74
+
75
+ protected persistQueryStream({
76
+ response,
77
+ direction,
78
+ refresh,
79
+ }: Amity.LiveCollectionPersistQueryStreamParams<'post'>) {
80
+ this.queryStreamController.appendToQueryStream(response, direction, refresh);
81
+ }
82
+
83
+ startSubscription() {
84
+ return this.queryStreamController.subscribeRTE([
85
+ { fn: onPostCreated, action: EnumPostActions.OnPostCreated },
86
+ { fn: onPostUpdated, action: EnumPostActions.OnPostUpdated },
87
+ { fn: onPostUpdatedLocal, action: EnumPostActions.OnPostUpdated },
88
+ { fn: onPostDeleted, action: EnumPostActions.OnPostDeleted },
89
+ { fn: onPostFlagged, action: EnumPostActions.OnPostFlagged },
90
+ { fn: onPostUnflagged, action: EnumPostActions.OnPostUnflagged },
91
+ { fn: onPostApproved, action: EnumPostActions.OnPostApproved },
92
+ { fn: onPostDeclined, action: EnumPostActions.OnPostDeclined },
93
+ { fn: onPostReactionAdded, action: EnumPostActions.OnPostReactionAdded },
94
+ { fn: onPostReactionRemoved, action: EnumPostActions.OnPostReactionRemoved },
95
+ { fn: onLocalPostReactionAdded, action: EnumPostActions.OnPostReactionAdded },
96
+ { fn: onLocalPostReactionRemoved, action: EnumPostActions.OnPostReactionRemoved },
97
+ { fn: onLocalPostDeleted, action: EnumPostActions.OnPostDeleted },
98
+ {
99
+ fn: convertEventPayload(
100
+ (callback: Amity.Listener<Amity.InternalComment>) => {
101
+ return onCommentCreated(async (comment: Amity.InternalComment) => {
102
+ const currentCollection = pullFromCache<Amity.UserFeedLiveCollectionCache>(
103
+ this.cacheKey,
104
+ )?.data;
105
+
106
+ if (!currentCollection || currentCollection.data.includes(comment.referenceId))
107
+ return;
108
+
109
+ await getPost(comment.referenceId);
110
+ callback(comment);
111
+ });
112
+ },
113
+ 'referenceId',
114
+ 'post',
115
+ ),
116
+ action: EnumPostActions.OnPostUpdated,
117
+ },
118
+ {
119
+ fn: convertEventPayload(
120
+ (callback: Amity.Listener<Amity.InternalComment>) => {
121
+ return onCommentDeleted(async (comment: Amity.InternalComment) => {
122
+ const currentCollection = pullFromCache<Amity.UserFeedLiveCollectionCache>(
123
+ this.cacheKey,
124
+ )?.data;
125
+
126
+ if (!currentCollection || currentCollection.data.includes(comment.referenceId))
127
+ return;
128
+
129
+ await getPost(comment.referenceId);
130
+ callback(comment);
131
+ });
132
+ },
133
+ 'referenceId',
134
+ 'post',
135
+ ),
136
+ action: EnumPostActions.OnPostUpdated,
137
+ },
138
+ ]);
139
+ }
140
+
141
+ notifyChange({ origin, loading, error }: Amity.LiveCollectionNotifyParams) {
142
+ const collection = pullFromCache<Amity.UserFeedLiveCollectionCache>(this.cacheKey)?.data;
143
+ if (!collection) return;
144
+
145
+ const data = (
146
+ collection.data
147
+ .map(id => pullFromCache<Amity.InternalPost>(['post', 'get', id])!)
148
+ .filter(isNonNullable)
149
+ .map(({ data }) => data) ?? []
150
+ ).map(LinkedObject.post);
151
+
152
+ if (!this.shouldNotify(data) && origin === 'event') return;
153
+
154
+ this.callback({
155
+ onNextPage: () => this.loadPage({ direction: Amity.LiveCollectionPageDirection.NEXT }),
156
+ data,
157
+ hasNextPage: !!this.paginationController.getNextToken(),
158
+ loading,
159
+ error,
160
+ });
161
+ }
162
+ }
@@ -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 */
@@ -1,2 +1,3 @@
1
1
  export { getCustomRankingGlobalFeed } from './getCustomRankingGlobalFeed';
2
2
  export { getGlobalFeed } from './getGlobalFeed';
3
+ export { getUserFeed } from './getUserFeed';
@@ -48,7 +48,6 @@ export const createReaction = async ({
48
48
  occurredAt: new Date().toISOString(),
49
49
  };
50
50
 
51
-
52
51
  reactionSynceEngine.createLiveReaction(reaction);
53
52
 
54
53
  fireEvent('local.liveReaction.created', [{ ...reaction, userId: client.userId!, referenceId }]);