@amityco/ts-sdk-react-native 6.23.0 → 6.24.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 (80) hide show
  1. package/dist/@types/core/events.d.ts +5 -0
  2. package/dist/@types/core/events.d.ts.map +1 -1
  3. package/dist/@types/domains/community.d.ts +15 -0
  4. package/dist/@types/domains/community.d.ts.map +1 -1
  5. package/dist/client/utils/ReadReceiptSync/readReceiptSyncEngine.d.ts.map +1 -1
  6. package/dist/commentRepository/api/deleteComment.d.ts.map +1 -1
  7. package/dist/commentRepository/internalApi/createComment.d.ts.map +1 -1
  8. package/dist/communityRepository/observers/getCommunities/CommunitiesLiveCollectionController.d.ts +14 -0
  9. package/dist/communityRepository/observers/getCommunities/CommunitiesLiveCollectionController.d.ts.map +1 -0
  10. package/dist/communityRepository/observers/getCommunities/CommunitiesPaginationController.d.ts +9 -0
  11. package/dist/communityRepository/observers/getCommunities/CommunitiesPaginationController.d.ts.map +1 -0
  12. package/dist/communityRepository/observers/getCommunities/CommunitiesQueryStreamController.d.ts +15 -0
  13. package/dist/communityRepository/observers/getCommunities/CommunitiesQueryStreamController.d.ts.map +1 -0
  14. package/dist/communityRepository/observers/getCommunities/enums.d.ts +6 -0
  15. package/dist/communityRepository/observers/getCommunities/enums.d.ts.map +1 -0
  16. package/dist/communityRepository/observers/index.d.ts +1 -0
  17. package/dist/communityRepository/observers/index.d.ts.map +1 -1
  18. package/dist/communityRepository/observers/searchCommunities/SearchCommunitiesLiveCollectionController.d.ts +14 -0
  19. package/dist/communityRepository/observers/searchCommunities/SearchCommunitiesLiveCollectionController.d.ts.map +1 -0
  20. package/dist/communityRepository/observers/searchCommunities/SearchCommunitiesPaginationController.d.ts +9 -0
  21. package/dist/communityRepository/observers/searchCommunities/SearchCommunitiesPaginationController.d.ts.map +1 -0
  22. package/dist/communityRepository/observers/searchCommunities/SearchCommunitiesQueryStreamController.d.ts +15 -0
  23. package/dist/communityRepository/observers/searchCommunities/SearchCommunitiesQueryStreamController.d.ts.map +1 -0
  24. package/dist/communityRepository/observers/searchCommunities/enums.d.ts +6 -0
  25. package/dist/communityRepository/observers/searchCommunities/enums.d.ts.map +1 -0
  26. package/dist/communityRepository/observers/searchCommunities.d.ts +20 -0
  27. package/dist/communityRepository/observers/searchCommunities.d.ts.map +1 -0
  28. package/dist/core/events.d.ts +3 -3
  29. package/dist/core/events.d.ts.map +1 -1
  30. package/dist/core/liveCollection/LiveCollectionController.d.ts +4 -1
  31. package/dist/core/liveCollection/LiveCollectionController.d.ts.map +1 -1
  32. package/dist/index.cjs.js +582 -334
  33. package/dist/index.esm.js +573 -325
  34. package/dist/index.umd.js +4 -4
  35. package/dist/marker/events/onChannelUnreadUpdatedLocal.d.ts +12 -0
  36. package/dist/marker/events/onChannelUnreadUpdatedLocal.d.ts.map +1 -0
  37. package/dist/marker/events/onSubChannelUnreadUpdatedLocal.d.ts +12 -0
  38. package/dist/marker/events/onSubChannelUnreadUpdatedLocal.d.ts.map +1 -0
  39. package/dist/marker/events/onUserFeedMarkerUpdated.d.ts.map +1 -1
  40. package/dist/marker/utils/reCalculateChannelUnreadInfo.d.ts +1 -1
  41. package/dist/marker/utils/reCalculateChannelUnreadInfo.d.ts.map +1 -1
  42. package/dist/postRepository/observers/getPost.d.ts.map +1 -1
  43. package/dist/postRepository/observers/getPosts.d.ts.map +1 -1
  44. package/package.json +1 -1
  45. package/src/@types/core/events.ts +8 -0
  46. package/src/@types/domains/community.ts +25 -0
  47. package/src/channelRepository/channelMembership/observers/getMembers/ChannelMemberLiveCollectionController.ts +2 -2
  48. package/src/channelRepository/observers/getChannel.ts +2 -2
  49. package/src/channelRepository/observers/getChannels/ChannelLiveCollectionController.ts +7 -7
  50. package/src/client/utils/ReadReceiptSync/readReceiptSyncEngine.ts +6 -3
  51. package/src/commentRepository/api/createComment.ts +2 -2
  52. package/src/commentRepository/api/deleteComment.ts +2 -4
  53. package/src/commentRepository/events/utils.ts +1 -1
  54. package/src/commentRepository/internalApi/createComment.ts +3 -2
  55. package/src/commentRepository/internalApi/deleteComment.ts +2 -2
  56. package/src/communityRepository/observers/getCommunities/CommunitiesLiveCollectionController.ts +147 -0
  57. package/src/communityRepository/observers/getCommunities/CommunitiesPaginationController.ts +31 -0
  58. package/src/communityRepository/observers/getCommunities/CommunitiesQueryStreamController.ts +86 -0
  59. package/src/communityRepository/observers/getCommunities/enums.ts +5 -0
  60. package/src/communityRepository/observers/index.ts +1 -0
  61. package/src/communityRepository/observers/searchCommunities/SearchCommunitiesLiveCollectionController.ts +129 -0
  62. package/src/communityRepository/observers/searchCommunities/SearchCommunitiesPaginationController.ts +31 -0
  63. package/src/communityRepository/observers/searchCommunities/SearchCommunitiesQueryStreamController.ts +81 -0
  64. package/src/communityRepository/observers/searchCommunities/enums.ts +5 -0
  65. package/src/communityRepository/observers/searchCommunities.ts +56 -0
  66. package/src/core/liveCollection/LiveCollectionController.ts +6 -3
  67. package/src/marker/events/onChannelUnreadUpdatedLocal.ts +29 -0
  68. package/src/marker/events/onSubChannelMarkerFetched.ts +1 -1
  69. package/src/marker/events/onSubChannelUnreadUpdatedLocal.ts +29 -0
  70. package/src/marker/events/onUserFeedMarkerUpdated.ts +3 -4
  71. package/src/marker/utils/reCalculateChannelUnreadInfo.ts +7 -3
  72. package/src/messageRepository/observers/getMessages/MessageLiveCollectionController.ts +3 -3
  73. package/src/postRepository/api/editPost.ts +1 -1
  74. package/src/postRepository/api/updatePost.ts +1 -1
  75. package/src/postRepository/observers/getPost.ts +26 -0
  76. package/src/postRepository/observers/getPosts.ts +31 -0
  77. package/src/storyRepository/observers/getGlobalStoryTargets/GlobalStoryLiveCollectionController.ts +2 -2
  78. package/src/storyRepository/observers/getStoriesByTargetIds/StoryLiveCollectionController.ts +1 -1
  79. package/src/subChannelRepository/observers/getSubChannel.ts +2 -2
  80. package/src/subChannelRepository/observers/getSubChannels/SubChannelLiveCollectionController.ts +4 -4
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Internal used only
3
+ *
4
+ * Fired when an {@link Amity.userMessageFeedMarkers} has been resolved by Object Rsesolver
5
+ *
6
+ * @param callback The function to call when the event was fired
7
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
8
+ *
9
+ * @category MessageMarker Events
10
+ */
11
+ export declare const onChannelUnreadUpdatedLocal: (callback: Amity.Listener<Amity.Events['local.channelUnread.updated']>) => Amity.Unsubscriber;
12
+ //# sourceMappingURL=onChannelUnreadUpdatedLocal.d.ts.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Internal used only
3
+ *
4
+ * Fired when an {@link Amity.userMessageFeedMarkers} has been resolved by Object Rsesolver
5
+ *
6
+ * @param callback The function to call when the event was fired
7
+ * @returns an {@link Amity.Unsubscriber} function to stop listening
8
+ *
9
+ * @category MessageMarker Events
10
+ */
11
+ export declare const onSubChannelUnreadUpdatedLocal: (callback: Amity.Listener<Amity.Events['local.subChannelUnread.updated']>) => Amity.Unsubscriber;
12
+ //# sourceMappingURL=onSubChannelUnreadUpdatedLocal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onSubChannelUnreadUpdatedLocal.d.ts","sourceRoot":"","sources":["../../../src/marker/events/onSubChannelUnreadUpdatedLocal.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AACH,eAAO,MAAM,8BAA8B,aAC/B,MAAM,QAAQ,CAAC,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC,KACvE,MAAM,YAaR,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"onUserFeedMarkerUpdated.d.ts","sourceRoot":"","sources":["../../../src/marker/events/onUserFeedMarkerUpdated.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,uBAAuB,aACxB,MAAM,QAAQ,CAAC,MAAM,UAAU,CAAC,KACzC,MAAM,YAgBR,CAAC"}
1
+ {"version":3,"file":"onUserFeedMarkerUpdated.d.ts","sourceRoot":"","sources":["../../../src/marker/events/onUserFeedMarkerUpdated.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,uBAAuB,aACxB,MAAM,QAAQ,CAAC,MAAM,UAAU,CAAC,KACzC,MAAM,YAeR,CAAC"}
@@ -1,2 +1,2 @@
1
- export declare const reCalculateChannelUnreadInfo: (channelId: string) => Promise<void>;
1
+ export declare const reCalculateChannelUnreadInfo: (channelId: string) => Amity.ChannelUnreadInfo;
2
2
  //# sourceMappingURL=reCalculateChannelUnreadInfo.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reCalculateChannelUnreadInfo.d.ts","sourceRoot":"","sources":["../../../src/marker/utils/reCalculateChannelUnreadInfo.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,4BAA4B,cAAqB,MAAM,kBAiCnE,CAAC"}
1
+ {"version":3,"file":"reCalculateChannelUnreadInfo.d.ts","sourceRoot":"","sources":["../../../src/marker/utils/reCalculateChannelUnreadInfo.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,4BAA4B,cAAe,MAAM,KAAG,MAAM,iBAqCtE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"getPost.d.ts","sourceRoot":"","sources":["../../../src/postRepository/observers/getPost.ts"],"names":[],"mappings":"AAmBA;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,OAAO,WACV,MAAM,IAAI,CAAC,QAAQ,CAAC,YAClB,MAAM,kBAAkB,CAAC,MAAM,IAAI,CAAC,KAC7C,MAAM,YA0CR,CAAC"}
1
+ {"version":3,"file":"getPost.d.ts","sourceRoot":"","sources":["../../../src/postRepository/observers/getPost.ts"],"names":[],"mappings":"AAqBA;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,OAAO,WACV,MAAM,IAAI,CAAC,QAAQ,CAAC,YAClB,MAAM,kBAAkB,CAAC,MAAM,IAAI,CAAC,KAC7C,MAAM,YAkER,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"getPosts.d.ts","sourceRoot":"","sources":["../../../src/postRepository/observers/getPosts.ts"],"names":[],"mappings":"AAwCA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,QAAQ,WACX,MAAM,kBAAkB,YACtB,MAAM,sBAAsB,CAAC,MAAM,IAAI,CAAC,WACzC,MAAM,oBAAoB,KAClC,MAAM,YAsJR,CAAC"}
1
+ {"version":3,"file":"getPosts.d.ts","sourceRoot":"","sources":["../../../src/postRepository/observers/getPosts.ts"],"names":[],"mappings":"AA2CA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,QAAQ,WACX,MAAM,kBAAkB,YACtB,MAAM,sBAAsB,CAAC,MAAM,IAAI,CAAC,WACzC,MAAM,oBAAoB,KAClC,MAAM,YAkLR,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amityco/ts-sdk-react-native",
3
- "version": "6.23.0",
3
+ "version": "6.24.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",
@@ -194,6 +194,9 @@ declare global {
194
194
  userFeedMarkers: Amity.UserFeedMarkerResponse[];
195
195
  };
196
196
 
197
+ 'local.subChannelUnread.updated': Amity.SubChannelUnreadInfo;
198
+ 'local.channelUnread.updated': Amity.ChannelUnreadInfo;
199
+
197
200
  'local.story.created': Amity.StoryPayload;
198
201
  'local.story.updated': Amity.StoryPayload;
199
202
  'local.story.deleted': Amity.StoryPayload;
@@ -206,6 +209,11 @@ declare global {
206
209
  'local.story.error': Amity.StoryPayload;
207
210
  'local.story.reload': { referenceIds: Amity.Story['referenceId'][] };
208
211
 
212
+ 'local.post.updated': Amity.PostPayload;
213
+
214
+ 'local.comment.created': Amity.CommentPayload;
215
+ 'local.comment.deleted': Amity.CommentPayload;
216
+
209
217
  sessionStateChange: Amity.SessionStates;
210
218
  // used by accessTokenExpiryWatcher
211
219
  tokenExpired: Amity.SessionStates.TOKEN_EXPIRED;
@@ -75,6 +75,22 @@ declare global {
75
75
  };
76
76
 
77
77
  type QueryCommunities = {
78
+ /** @deprecated use searchCommunities instead */
79
+ displayName?: string;
80
+ membership?: 'all' | 'member' | 'notMember';
81
+ categoryId?: Amity.InternalCategory['categoryId'];
82
+ includeDeleted?: boolean;
83
+ tags?: Amity.Taggable['tags'];
84
+ sortBy?:
85
+ | 'firstCreated'
86
+ | 'lastCreated'
87
+ /** @deprecated sortBy displayName is not available */
88
+ | 'displayName';
89
+ page?: string;
90
+ limit?: number;
91
+ };
92
+
93
+ type SearchQueryCommunities = {
78
94
  displayName?: string;
79
95
  membership?: 'all' | 'member' | 'notMember';
80
96
  categoryId?: Amity.InternalCategory['categoryId'];
@@ -87,11 +103,20 @@ declare global {
87
103
 
88
104
  type CommunityLiveCollection = Amity.LiveCollectionParams<Omit<QueryCommunities, 'page'>>;
89
105
 
106
+ type SearchCommunityLiveCollection = Amity.LiveCollectionParams<
107
+ Omit<SearchQueryCommunities, 'page'>
108
+ >;
109
+
90
110
  type CommunityLiveCollectionCache = Amity.LiveCollectionCache<
91
111
  Amity.Community['communityId'],
92
112
  Pick<QueryCommunities, 'page'>
93
113
  >;
94
114
 
115
+ type SearchCommunityLiveCollectionCache = Amity.LiveCollectionCache<
116
+ Amity.Community['communityId'],
117
+ Pick<SearchQueryCommunities, 'page'>
118
+ >;
119
+
95
120
  type QueryCommunityMembers = {
96
121
  communityId: string;
97
122
  memberships?: ('banned' | 'member')[];
@@ -52,7 +52,7 @@ export class ChannelMemberLiveCollectionController extends LiveCollectionControl
52
52
  );
53
53
 
54
54
  this.callback = callback.bind(this);
55
- this.loadPage(true);
55
+ this.loadPage({ initial: true });
56
56
  }
57
57
 
58
58
  protected setup() {
@@ -104,7 +104,7 @@ export class ChannelMemberLiveCollectionController extends LiveCollectionControl
104
104
  if (!this.shouldNotify(data) && origin === 'event') return;
105
105
 
106
106
  this.callback({
107
- onNextPage: () => this.loadPage(false, Amity.LiveCollectionPageDirection.NEXT),
107
+ onNextPage: () => this.loadPage({ direction: Amity.LiveCollectionPageDirection.NEXT }),
108
108
  data,
109
109
  hasNextPage: !!this.paginationController.getNextToken(),
110
110
  loading,
@@ -33,8 +33,8 @@ import { isEqual } from '~/utils/isEqual';
33
33
  import { updateChannelCache } from '../utils/updateChannelCache';
34
34
  import { onChannelMarkerUpdated } from '~/marker/events/onChannelMarkerUpdated';
35
35
  import { onSubChannelCreated } from '~/subChannelRepository';
36
- import { onUserFeedMarkerUpdated } from '~/marker/events/onUserFeedMarkerUpdated';
37
36
  import { LinkedObject } from '~/utils/linkedObject';
37
+ import { onChannelUnreadUpdatedLocal } from '~/marker/events/onChannelUnreadUpdatedLocal';
38
38
 
39
39
  /* begin_public_function
40
40
  id: channel.get
@@ -271,7 +271,7 @@ export const getChannel = (
271
271
  'channel',
272
272
  ),
273
273
  convertEventPayload(onSubChannelCreated, 'channelId', 'channel'),
274
- convertEventPayload(onUserFeedMarkerUpdated, 'entityId', 'channel'),
274
+ convertEventPayload(onChannelUnreadUpdatedLocal, 'channelId', 'channel'),
275
275
  ],
276
276
  {
277
277
  forceDispatch: true,
@@ -47,7 +47,6 @@ import { getActiveClient } from '~/client';
47
47
  import { prepareChannelPayload } from '~/channelRepository/utils';
48
48
  import { ChannelPaginationNoPageController } from './ChannelPagnationNoPageController';
49
49
  import { PaginationController } from '~/core/liveCollection/PaginationController';
50
- import { onUserFeedMarkerUpdated } from '~/marker/events/onUserFeedMarkerUpdated';
51
50
  import { onSubChannelCreated } from '~/subChannelRepository';
52
51
 
53
52
  import ObjectResolverEngine from '~/client/utils/ObjectResolver/objectResolverEngine';
@@ -56,6 +55,7 @@ import { resolveUnreadInfoOnChannelEvent } from '~/channelRepository/utils/resol
56
55
  import { onChannelResolved } from '~/channelRepository/events/onChannelResolved';
57
56
  import { onUserMessageFeedMarkerResolved } from '~/marker/events/onUserMessageFeedMarkerResolved';
58
57
  import { LinkedObject } from '~/utils/linkedObject';
58
+ import { onChannelUnreadUpdatedLocal } from '~/marker/events/onChannelUnreadUpdatedLocal';
59
59
 
60
60
  export class ChannelLiveCollectionController extends LiveCollectionController<
61
61
  'channel',
@@ -98,7 +98,7 @@ export class ChannelLiveCollectionController extends LiveCollectionController<
98
98
 
99
99
  this.paginationController = paginationController;
100
100
  this.callback = callback.bind(this);
101
- this.loadPage(true);
101
+ this.loadPage({ initial: true });
102
102
  }
103
103
 
104
104
  protected setup() {
@@ -148,7 +148,7 @@ export class ChannelLiveCollectionController extends LiveCollectionController<
148
148
  this.callback({
149
149
  onNextPage:
150
150
  this.paginationController instanceof ChannelPaginationController
151
- ? () => this.loadPage(false, Amity.LiveCollectionPageDirection.NEXT)
151
+ ? () => this.loadPage({ direction: Amity.LiveCollectionPageDirection.NEXT })
152
152
  : undefined,
153
153
  data,
154
154
  hasNextPage:
@@ -517,10 +517,6 @@ export class ChannelLiveCollectionController extends LiveCollectionController<
517
517
  ),
518
518
  action: Amity.ChannelActionType.OnUpdate,
519
519
  },
520
- {
521
- fn: convertEventPayload(onUserFeedMarkerUpdated, 'entityId', 'channel'),
522
- action: Amity.ChannelActionType.OnUpdate,
523
- },
524
520
  {
525
521
  fn: convertEventPayload(onSubChannelCreated, 'channelId', 'channel'),
526
522
  action: Amity.ChannelActionType.OnUpdate,
@@ -553,6 +549,10 @@ export class ChannelLiveCollectionController extends LiveCollectionController<
553
549
  },
554
550
  action: Amity.ChannelActionType.OnResolve,
555
551
  },
552
+ {
553
+ fn: convertEventPayload(onChannelUnreadUpdatedLocal, 'channelId', 'channel'),
554
+ action: Amity.ChannelActionType.OnUpdate,
555
+ },
556
556
  ];
557
557
 
558
558
  if (this.paginationController instanceof PaginationController) {
@@ -2,6 +2,7 @@ import { pullFromCache, pushToCache, queryCache } from '~/cache/api';
2
2
  import { getActiveClient } from '../../api/activeClient';
3
3
  import { markAsReadBySegment } from '~/subChannelRepository/api/markAsReadBySegment';
4
4
  import { reCalculateChannelUnreadInfo } from '~/marker/utils/reCalculateChannelUnreadInfo';
5
+ import { fireEvent } from '~/core/events';
5
6
 
6
7
  export class MessageReadReceiptSyncEngine {
7
8
  private client: Amity.Client;
@@ -178,10 +179,12 @@ export class MessageReadReceiptSyncEngine {
178
179
  subChannelUnreadInfo.readToSegment = segment;
179
180
  subChannelUnreadInfo.unreadCount = Math.max(subChannelUnreadInfo.lastSegment - segment, 0);
180
181
 
181
- reCalculateChannelUnreadInfo(subChannelUnreadInfo.channelId);
182
- }
182
+ const channelUnreadInfo = reCalculateChannelUnreadInfo(subChannelUnreadInfo.channelId);
183
+ fireEvent('local.channelUnread.updated', channelUnreadInfo);
183
184
 
184
- pushToCache(cacheKey, subChannelUnreadInfo);
185
+ pushToCache(cacheKey, subChannelUnreadInfo);
186
+ fireEvent('local.subChannelUnread.updated', subChannelUnreadInfo);
187
+ }
185
188
 
186
189
  // Step 2: Enqueue the read receipt
187
190
  this.enqueueReadReceipt(subChannelId, segment);
@@ -53,7 +53,7 @@ export const createComment = async (
53
53
  if (['post', 'content'].includes(bundle.referenceType)) {
54
54
  const post = await getPost(bundle.referenceId);
55
55
 
56
- fireEvent('post.updated', {
56
+ fireEvent('local.post.updated', {
57
57
  posts: [post.data],
58
58
  categories: [],
59
59
  comments: [],
@@ -97,7 +97,7 @@ export const createComment = async (
97
97
  }
98
98
  }
99
99
 
100
- fireEvent('comment.created', data);
100
+ fireEvent('local.comment.created', data);
101
101
 
102
102
  return {
103
103
  data: LinkedObject.comment(comments[0]),
@@ -64,8 +64,7 @@ export const deleteComment = async (
64
64
  } else {
65
65
  const post = await getPost(comment.data.referenceId);
66
66
 
67
- // @TODO: Need to separate Local / MQTT later
68
- fireEvent('post.updated', {
67
+ fireEvent('local.post.updated', {
69
68
  posts: [post.data],
70
69
  categories: [],
71
70
  comments: [],
@@ -78,8 +77,7 @@ export const deleteComment = async (
78
77
  });
79
78
  }
80
79
 
81
- // @TODO: Need to separate Local / MQTT later
82
- fireEvent('comment.deleted', {
80
+ fireEvent('local.comment.deleted', {
83
81
  comments: [deleted],
84
82
  commentChildren: [],
85
83
  files: [],
@@ -1,5 +1,5 @@
1
1
  import { getActiveClient } from '~/client/api';
2
- import { createEventSubscriber } from '~/core/events';
2
+ import { createEventSubscriber, fireEvent } from '~/core/events';
3
3
  import { pullFromCache, pushToCache, queryCache, upsertInCache } from '~/cache/api';
4
4
  import { ingestInCache } from '~/cache/api/ingestInCache';
5
5
  import { LinkedObject } from '~/utils/linkedObject';
@@ -27,7 +27,7 @@ export const createComment = async (
27
27
 
28
28
  const post = await getPost(bundle.referenceId);
29
29
 
30
- fireEvent('post.updated', {
30
+ fireEvent('local.post.updated', {
31
31
  posts: [post.data],
32
32
  categories: [],
33
33
  comments: [],
@@ -38,7 +38,8 @@ export const createComment = async (
38
38
  postChildren: [],
39
39
  users: [],
40
40
  });
41
- fireEvent('comment.created', data);
41
+
42
+ fireEvent('local.comment.created', data);
42
43
 
43
44
  const { comments } = data;
44
45
  return {
@@ -33,7 +33,7 @@ export const deleteComment = async (
33
33
 
34
34
  const post = await getPost(comment.data.referenceId);
35
35
 
36
- fireEvent('post.updated', {
36
+ fireEvent('local.post.updated', {
37
37
  posts: [post.data],
38
38
  categories: [],
39
39
  comments: [],
@@ -45,7 +45,7 @@ export const deleteComment = async (
45
45
  users: [],
46
46
  });
47
47
 
48
- fireEvent('comment.deleted', {
48
+ fireEvent('local.comment.deleted', {
49
49
  comments: [deleted],
50
50
  commentChildren: [],
51
51
  files: [],
@@ -0,0 +1,147 @@
1
+ /* eslint-disable no-use-before-define */
2
+ import hash from 'object-hash';
3
+ import { pullFromCache, pushToCache } from '~/cache/api';
4
+ import { CommunitiesPaginationController } from './CommunitiesPaginationController';
5
+ import { CommunitiesQueryStreamController } from './CommunitiesQueryStreamController';
6
+ import { LiveCollectionController } from '~/core/liveCollection/LiveCollectionController';
7
+ import {
8
+ onCommunityCreated,
9
+ onCommunityDeleted,
10
+ onCommunityUpdated,
11
+ } from '~/communityRepository/events';
12
+ import {
13
+ filterByCommunityMembership,
14
+ filterByPropEquality,
15
+ sortByDisplayName,
16
+ sortByFirstCreated,
17
+ sortByLastCreated,
18
+ } from '~/core/query';
19
+ import { prepareCommunityPayload } from '~/communityRepository/utils';
20
+ import { getActiveClient } from '~/client';
21
+ import { EnumCommunityActions } from './enums';
22
+
23
+ export class CommunityLiveCollectionController extends LiveCollectionController<
24
+ 'community',
25
+ Amity.CommunityLiveCollection,
26
+ Amity.Community,
27
+ CommunitiesPaginationController
28
+ > {
29
+ private queryStreamController: CommunitiesQueryStreamController;
30
+
31
+ private query: Amity.CommunityLiveCollection;
32
+
33
+ constructor(
34
+ query: Amity.CommunityLiveCollection,
35
+ callback: Amity.LiveCollectionCallback<Amity.Community>,
36
+ ) {
37
+ const queryStreamId = hash(query);
38
+ const cacheKey = ['community', 'collection', queryStreamId];
39
+ const paginationController = new CommunitiesPaginationController(query);
40
+
41
+ super(paginationController, queryStreamId, cacheKey, callback);
42
+
43
+ this.query = query;
44
+ this.queryStreamController = new CommunitiesQueryStreamController(
45
+ this.query,
46
+ this.cacheKey,
47
+ this.notifyChange.bind(this),
48
+ prepareCommunityPayload,
49
+ );
50
+
51
+ this.callback = callback.bind(this);
52
+ this.loadPage({ initial: true });
53
+ }
54
+
55
+ protected setup() {
56
+ const collection = pullFromCache<Amity.CommunityLiveCollectionCache>(this.cacheKey)?.data;
57
+ if (!collection) {
58
+ pushToCache(this.cacheKey, {
59
+ data: [],
60
+ params: {},
61
+ });
62
+ }
63
+ }
64
+
65
+ protected async persistModel(queryPayload: Amity.CommunityPayload & Amity.Pagination) {
66
+ await this.queryStreamController.saveToMainDB(queryPayload);
67
+ }
68
+
69
+ protected persistQueryStream({
70
+ response,
71
+ direction,
72
+ refresh,
73
+ }: Amity.LiveCollectionPersistQueryStreamParams<'community'>) {
74
+ this.queryStreamController.appendToQueryStream(response, direction, refresh);
75
+ }
76
+
77
+ startSubscription() {
78
+ return this.queryStreamController.subscribeRTE([
79
+ { fn: onCommunityCreated, action: EnumCommunityActions.OnCommunityCreated },
80
+ { fn: onCommunityDeleted, action: EnumCommunityActions.OnCommunityDeleted },
81
+ { fn: onCommunityUpdated, action: EnumCommunityActions.OnCommunityUpdated },
82
+ ]);
83
+ }
84
+
85
+ notifyChange({ origin, loading, error }: Amity.LiveCollectionNotifyParams) {
86
+ const collection = pullFromCache<Amity.CommunityLiveCollectionCache>(this.cacheKey)?.data;
87
+ if (!collection) return;
88
+
89
+ const data = this.applyFilter(
90
+ collection.data
91
+ .map(id => pullFromCache<Amity.Community>(['community', 'get', id])!)
92
+ .filter(Boolean)
93
+ .map(({ data }) => data) ?? [],
94
+ );
95
+
96
+ if (!this.shouldNotify(data) && origin === 'event') return;
97
+
98
+ this.callback({
99
+ onNextPage: () => this.loadPage({ direction: Amity.LiveCollectionPageDirection.NEXT }),
100
+ data,
101
+ hasNextPage: !!this.paginationController.getNextToken(),
102
+ loading,
103
+ error,
104
+ });
105
+ }
106
+
107
+ applyFilter(data: Amity.Community[]) {
108
+ const { userId } = getActiveClient();
109
+
110
+ let communities = data;
111
+
112
+ if (this.query.includeDeleted) {
113
+ communities = filterByPropEquality(communities, 'isDeleted', false);
114
+ }
115
+
116
+ if (this.query.categoryId) {
117
+ communities = communities.filter(c => c.categoryIds?.includes(this.query.categoryId!));
118
+ }
119
+
120
+ if (this.query.tags) {
121
+ communities = communities.filter(c => c.tags?.some(t => this.query.tags?.includes(t)));
122
+ }
123
+
124
+ if (this.query.membership && userId) {
125
+ communities = filterByCommunityMembership(communities, this.query.membership, userId);
126
+ }
127
+
128
+ if (!this.query.displayName) {
129
+ const sortFn = (() => {
130
+ switch (this.query.sortBy) {
131
+ case 'firstCreated':
132
+ return sortByFirstCreated;
133
+ case 'lastCreated':
134
+ return sortByLastCreated;
135
+ case 'displayName':
136
+ return sortByDisplayName;
137
+ default:
138
+ return sortByLastCreated;
139
+ }
140
+ })();
141
+
142
+ communities = communities.sort(sortFn);
143
+ }
144
+
145
+ return communities;
146
+ }
147
+ }
@@ -0,0 +1,31 @@
1
+ import { PaginationController } from '~/core/liveCollection/PaginationController';
2
+ import { COLLECTION_DEFAULT_PAGINATION_LIMIT } from '~/utils/constants';
3
+ import { inferIsDeleted } from '~/utils/inferIsDeleted';
4
+
5
+ /**
6
+ * TODO: handle cache receive cache option, and cache policy
7
+ * TODO: check if querybyIds is supported
8
+ */
9
+ export class CommunitiesPaginationController extends PaginationController<
10
+ 'community',
11
+ Amity.CommunityLiveCollection
12
+ > {
13
+ async getRequest(queryParams: Amity.CommunityLiveCollection, token: string | undefined) {
14
+ const { limit = COLLECTION_DEFAULT_PAGINATION_LIMIT, ...params } = queryParams;
15
+ const options = token ? { token } : { limit };
16
+
17
+ const { data: queryResponse } = await this.http.get<Amity.CommunityPayload & Amity.Pagination>(
18
+ `/api/v3/communities`,
19
+ {
20
+ params: {
21
+ ...params,
22
+ isDeleted: inferIsDeleted(params.includeDeleted),
23
+ keyword: params.displayName,
24
+ filter: params.membership,
25
+ options,
26
+ },
27
+ },
28
+ );
29
+ return queryResponse;
30
+ }
31
+ }
@@ -0,0 +1,86 @@
1
+ import { QueryStreamController } from '~/core/liveCollection/QueryStreamController';
2
+ import { pullFromCache, pushToCache } from '~/cache/api';
3
+ import { ingestInCache } from '~/cache/api/ingestInCache';
4
+ import { getResolver } from '~/core/model';
5
+ import { getActiveClient } from '~/client';
6
+ import { EnumCommunityActions } from './enums';
7
+
8
+ export class CommunitiesQueryStreamController extends QueryStreamController<
9
+ Amity.CommunityPayload,
10
+ Amity.CommunityLiveCollection
11
+ > {
12
+ private notifyChange: (params: Amity.LiveCollectionNotifyParams) => void;
13
+
14
+ private preparePayload: (response: Amity.CommunityPayload) => Amity.ProcessedCommunityPayload;
15
+
16
+ constructor(
17
+ query: Amity.CommunityLiveCollection,
18
+ cacheKey: string[],
19
+ notifyChange: (params: Amity.LiveCollectionNotifyParams) => void,
20
+ preparePayload: (response: Amity.CommunityPayload) => Amity.ProcessedCommunityPayload,
21
+ ) {
22
+ super(query, cacheKey);
23
+ this.notifyChange = notifyChange;
24
+ this.preparePayload = preparePayload;
25
+ }
26
+
27
+ async saveToMainDB(response: Amity.CommunityPayload) {
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.CommunityPayload & Partial<Amity.Pagination>,
40
+ direction: Amity.LiveCollectionPageDirection,
41
+ refresh = false,
42
+ ) {
43
+ if (refresh) {
44
+ pushToCache(this.cacheKey, {
45
+ data: response.communities.map(getResolver('community')),
46
+ });
47
+ } else {
48
+ const collection = pullFromCache<Amity.CommunityLiveCollectionCache>(this.cacheKey)?.data;
49
+
50
+ const communities = collection?.data ?? [];
51
+
52
+ pushToCache(this.cacheKey, {
53
+ ...collection,
54
+ data: [...new Set([...communities, ...response.communities.map(getResolver('community'))])],
55
+ });
56
+ }
57
+ }
58
+
59
+ reactor(action: EnumCommunityActions) {
60
+ return (community: Amity.Community) => {
61
+ const collection = pullFromCache<Amity.CommunityLiveCollectionCache>(this.cacheKey)?.data;
62
+ if (!collection) return;
63
+
64
+ if (this.query.displayName && action === EnumCommunityActions.OnCommunityCreated) {
65
+ return;
66
+ }
67
+
68
+ /*
69
+ * Simply update collection and let responder decide what to do with data
70
+ */
71
+ collection.data = [...new Set([community.communityId, ...collection.data])];
72
+
73
+ pushToCache(this.cacheKey, collection);
74
+ this.notifyChange({ origin: Amity.LiveDataOrigin.EVENT, loading: false });
75
+ };
76
+ }
77
+
78
+ subscribeRTE(
79
+ createSubscriber: {
80
+ fn: (reactor: (channel: Amity.Community) => void) => Amity.Unsubscriber;
81
+ action: EnumCommunityActions;
82
+ }[],
83
+ ) {
84
+ return createSubscriber.map(subscriber => subscriber.fn(this.reactor(subscriber.action)));
85
+ }
86
+ }
@@ -0,0 +1,5 @@
1
+ export enum EnumCommunityActions {
2
+ OnCommunityCreated = 'onCommunityCreated',
3
+ OnCommunityDeleted = 'onCommunityDeleted',
4
+ OnCommunityUpdated = 'onCommunityUpdated',
5
+ }
@@ -1,5 +1,6 @@
1
1
  export * from './observeCommunity';
2
2
 
3
+ export * from './searchCommunities';
3
4
  export * from './getCommunities';
4
5
  export * from './getCommunity';
5
6
  export * from './getTrendingCommunities';