@stream-io/feeds-client 1.0.0 → 1.1.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 (96) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/cjs/index.js +1 -1
  3. package/dist/cjs/index.js.map +1 -1
  4. package/dist/cjs/react-bindings.js +5 -19
  5. package/dist/cjs/react-bindings.js.map +1 -1
  6. package/dist/es/index.mjs +2 -2
  7. package/dist/es/index.mjs.map +1 -1
  8. package/dist/es/react-bindings.mjs +5 -19
  9. package/dist/es/react-bindings.mjs.map +1 -1
  10. package/dist/{feeds-client-tw63OGrd.js → feeds-client-C1c6lcS3.js} +529 -155
  11. package/dist/feeds-client-C1c6lcS3.js.map +1 -0
  12. package/dist/{feeds-client-B03y08Kq.mjs → feeds-client-jtUTE4AC.mjs} +529 -155
  13. package/dist/feeds-client-jtUTE4AC.mjs.map +1 -0
  14. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  15. package/dist/types/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivityRead.d.ts +6 -2
  16. package/dist/types/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivityRead.d.ts.map +1 -1
  17. package/dist/types/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivitySeen.d.ts +6 -2
  18. package/dist/types/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivitySeen.d.ts.map +1 -1
  19. package/dist/types/feed/event-handlers/activity/handle-activity-deleted.d.ts +3 -2
  20. package/dist/types/feed/event-handlers/activity/handle-activity-deleted.d.ts.map +1 -1
  21. package/dist/types/feed/event-handlers/activity/handle-activity-feedback.d.ts +5 -0
  22. package/dist/types/feed/event-handlers/activity/handle-activity-feedback.d.ts.map +1 -1
  23. package/dist/types/feed/event-handlers/activity/handle-activity-pinned.d.ts +3 -2
  24. package/dist/types/feed/event-handlers/activity/handle-activity-pinned.d.ts.map +1 -1
  25. package/dist/types/feed/event-handlers/activity/handle-activity-unpinned.d.ts +3 -2
  26. package/dist/types/feed/event-handlers/activity/handle-activity-unpinned.d.ts.map +1 -1
  27. package/dist/types/feed/event-handlers/activity/index.d.ts +3 -1
  28. package/dist/types/feed/event-handlers/activity/index.d.ts.map +1 -1
  29. package/dist/types/feed/event-handlers/activity-updater.d.ts +1 -0
  30. package/dist/types/feed/event-handlers/activity-updater.d.ts.map +1 -1
  31. package/dist/types/feed/event-handlers/add-aggregated-activities-to-state.d.ts +1 -1
  32. package/dist/types/feed/event-handlers/add-aggregated-activities-to-state.d.ts.map +1 -1
  33. package/dist/types/feed/event-handlers/bookmark/handle-bookmark-added.d.ts +6 -5
  34. package/dist/types/feed/event-handlers/bookmark/handle-bookmark-added.d.ts.map +1 -1
  35. package/dist/types/feed/event-handlers/bookmark/handle-bookmark-deleted.d.ts +6 -5
  36. package/dist/types/feed/event-handlers/bookmark/handle-bookmark-deleted.d.ts.map +1 -1
  37. package/dist/types/feed/event-handlers/bookmark/handle-bookmark-updated.d.ts +6 -5
  38. package/dist/types/feed/event-handlers/bookmark/handle-bookmark-updated.d.ts.map +1 -1
  39. package/dist/types/feed/event-handlers/feed/handle-feed-deleted.d.ts +4 -0
  40. package/dist/types/feed/event-handlers/feed/handle-feed-deleted.d.ts.map +1 -0
  41. package/dist/types/feed/event-handlers/feed/handle-feed-updated.d.ts.map +1 -1
  42. package/dist/types/feed/event-handlers/feed/index.d.ts +1 -0
  43. package/dist/types/feed/event-handlers/feed/index.d.ts.map +1 -1
  44. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-added.d.ts +3 -2
  45. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-added.d.ts.map +1 -1
  46. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-removed.d.ts +3 -2
  47. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-removed.d.ts.map +1 -1
  48. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-updated.d.ts +3 -2
  49. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-updated.d.ts.map +1 -1
  50. package/dist/types/feed/event-handlers/follow/handle-follow-updated.d.ts.map +1 -1
  51. package/dist/types/feed/event-handlers/notification-feed/handle-notification-feed-updated.d.ts +3 -2
  52. package/dist/types/feed/event-handlers/notification-feed/handle-notification-feed-updated.d.ts.map +1 -1
  53. package/dist/types/feed/feed.d.ts.map +1 -1
  54. package/dist/types/feeds-client/feeds-client.d.ts +24 -1
  55. package/dist/types/feeds-client/feeds-client.d.ts.map +1 -1
  56. package/dist/types/gen/feeds/FeedsApi.d.ts +6 -4
  57. package/dist/types/gen/feeds/FeedsApi.d.ts.map +1 -1
  58. package/dist/types/gen/models/index.d.ts +40 -2
  59. package/dist/types/gen/models/index.d.ts.map +1 -1
  60. package/dist/types/utils/state-update-queue.d.ts +11 -2
  61. package/dist/types/utils/state-update-queue.d.ts.map +1 -1
  62. package/dist/types/utils/unique-array-merge.d.ts +1 -1
  63. package/dist/types/utils/unique-array-merge.d.ts.map +1 -1
  64. package/package.json +1 -1
  65. package/src/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivityRead.ts +6 -20
  66. package/src/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivitySeen.ts +6 -20
  67. package/src/feed/event-handlers/activity/handle-activity-deleted.ts +28 -2
  68. package/src/feed/event-handlers/activity/handle-activity-feedback.ts +17 -7
  69. package/src/feed/event-handlers/activity/handle-activity-pinned.ts +25 -3
  70. package/src/feed/event-handlers/activity/handle-activity-unpinned.ts +25 -2
  71. package/src/feed/event-handlers/activity/index.ts +3 -1
  72. package/src/feed/event-handlers/add-aggregated-activities-to-state.ts +11 -2
  73. package/src/feed/event-handlers/bookmark/handle-bookmark-added.ts +20 -11
  74. package/src/feed/event-handlers/bookmark/handle-bookmark-deleted.ts +21 -11
  75. package/src/feed/event-handlers/bookmark/handle-bookmark-updated.ts +24 -10
  76. package/src/feed/event-handlers/feed/handle-feed-deleted.ts +12 -0
  77. package/src/feed/event-handlers/feed/handle-feed-updated.ts +8 -0
  78. package/src/feed/event-handlers/feed/index.ts +1 -0
  79. package/src/feed/event-handlers/feed-member/handle-feed-member-added.ts +25 -2
  80. package/src/feed/event-handlers/feed-member/handle-feed-member-removed.ts +25 -2
  81. package/src/feed/event-handlers/feed-member/handle-feed-member-updated.ts +25 -2
  82. package/src/feed/event-handlers/follow/handle-follow-updated.ts +14 -0
  83. package/src/feed/event-handlers/notification-feed/handle-notification-feed-updated.ts +68 -2
  84. package/src/feed/event-handlers/story-feeds/handle-story-feeds-updated.ts +1 -1
  85. package/src/feed/feed.ts +7 -5
  86. package/src/feeds-client/feeds-client.ts +255 -0
  87. package/src/gen/feeds/FeedsApi.ts +79 -12
  88. package/src/gen/model-decoders/decoders.ts +7 -0
  89. package/src/gen/models/index.ts +66 -4
  90. package/src/utils/state-update-queue.ts +42 -28
  91. package/src/utils/unique-array-merge.ts +11 -3
  92. package/dist/feeds-client-B03y08Kq.mjs.map +0 -1
  93. package/dist/feeds-client-tw63OGrd.js.map +0 -1
  94. package/dist/types/feed/event-handlers/activity/handle-activity-marked.d.ts +0 -12
  95. package/dist/types/feed/event-handlers/activity/handle-activity-marked.d.ts.map +0 -1
  96. package/src/feed/event-handlers/activity/handle-activity-marked.ts +0 -68
@@ -1141,6 +1141,12 @@ decoders.QueryBookmarksResponse = (input) => {
1141
1141
  };
1142
1142
  return decode(typeMappings, input);
1143
1143
  };
1144
+ decoders.QueryCollectionsResponse = (input) => {
1145
+ const typeMappings = {
1146
+ collections: { type: "CollectionResponse", isSingle: false }
1147
+ };
1148
+ return decode(typeMappings, input);
1149
+ };
1144
1150
  decoders.QueryCommentReactionsResponse = (input) => {
1145
1151
  const typeMappings = {
1146
1152
  reactions: { type: "FeedsReactionResponse", isSingle: false }
@@ -1715,6 +1721,21 @@ class FeedsApi {
1715
1721
  decoders.DeleteActivitiesResponse?.(response.body);
1716
1722
  return { ...response.body, metadata: response.metadata };
1717
1723
  }
1724
+ async trackActivityMetrics(request) {
1725
+ const body = {
1726
+ events: request?.events
1727
+ };
1728
+ const response = await this.apiClient.sendRequest(
1729
+ "POST",
1730
+ "/api/v2/feeds/activities/metrics/track",
1731
+ void 0,
1732
+ void 0,
1733
+ body,
1734
+ "application/json"
1735
+ );
1736
+ decoders.TrackActivityMetricsResponse?.(response.body);
1737
+ return { ...response.body, metadata: response.metadata };
1738
+ }
1718
1739
  async queryActivities(request) {
1719
1740
  const body = {
1720
1741
  enrich_own_fields: request?.enrich_own_fields,
@@ -2127,6 +2148,25 @@ class FeedsApi {
2127
2148
  decoders.CreateCollectionsResponse?.(response.body);
2128
2149
  return { ...response.body, metadata: response.metadata };
2129
2150
  }
2151
+ async queryCollections(request) {
2152
+ const body = {
2153
+ limit: request?.limit,
2154
+ next: request?.next,
2155
+ prev: request?.prev,
2156
+ sort: request?.sort,
2157
+ filter: request?.filter
2158
+ };
2159
+ const response = await this.apiClient.sendRequest(
2160
+ "POST",
2161
+ "/api/v2/feeds/collections/query",
2162
+ void 0,
2163
+ void 0,
2164
+ body,
2165
+ "application/json"
2166
+ );
2167
+ decoders.QueryCollectionsResponse?.(response.body);
2168
+ return { ...response.body, metadata: response.metadata };
2169
+ }
2130
2170
  async getComments(request) {
2131
2171
  const queryParams = {
2132
2172
  object_id: request?.object_id,
@@ -2186,6 +2226,7 @@ class FeedsApi {
2186
2226
  async queryComments(request) {
2187
2227
  const body = {
2188
2228
  filter: request?.filter,
2229
+ id_around: request?.id_around,
2189
2230
  limit: request?.limit,
2190
2231
  next: request?.next,
2191
2232
  prev: request?.prev,
@@ -3217,15 +3258,26 @@ class FeedsApi {
3217
3258
  decoders.UpdateUserGroupResponse?.(response.body);
3218
3259
  return { ...response.body, metadata: response.metadata };
3219
3260
  }
3220
- async removeUserGroupMembers(request) {
3261
+ async addUserGroupMembers(request) {
3221
3262
  const pathParams = {
3222
3263
  id: request?.id
3223
3264
  };
3224
- const response = await this.apiClient.sendRequest("DELETE", "/api/v2/usergroups/{id}/members", pathParams, void 0);
3225
- decoders.RemoveUserGroupMembersResponse?.(response.body);
3265
+ const body = {
3266
+ member_ids: request?.member_ids,
3267
+ team_id: request?.team_id
3268
+ };
3269
+ const response = await this.apiClient.sendRequest(
3270
+ "POST",
3271
+ "/api/v2/usergroups/{id}/members",
3272
+ pathParams,
3273
+ void 0,
3274
+ body,
3275
+ "application/json"
3276
+ );
3277
+ decoders.AddUserGroupMembersResponse?.(response.body);
3226
3278
  return { ...response.body, metadata: response.metadata };
3227
3279
  }
3228
- async addUserGroupMembers(request) {
3280
+ async removeUserGroupMembers(request) {
3229
3281
  const pathParams = {
3230
3282
  id: request?.id
3231
3283
  };
@@ -3235,13 +3287,13 @@ class FeedsApi {
3235
3287
  };
3236
3288
  const response = await this.apiClient.sendRequest(
3237
3289
  "POST",
3238
- "/api/v2/usergroups/{id}/members",
3290
+ "/api/v2/usergroups/{id}/members/delete",
3239
3291
  pathParams,
3240
3292
  void 0,
3241
3293
  body,
3242
3294
  "application/json"
3243
3295
  );
3244
- decoders.AddUserGroupMembersResponse?.(response.body);
3296
+ decoders.RemoveUserGroupMembersResponse?.(response.body);
3245
3297
  return { ...response.body, metadata: response.metadata };
3246
3298
  }
3247
3299
  async queryUsers(request) {
@@ -4129,7 +4181,7 @@ const getRateLimitFromResponseHeader = (response_headers) => {
4129
4181
  };
4130
4182
  return result;
4131
4183
  };
4132
- const version = "1.0.0";
4184
+ const version = "1.1.0";
4133
4185
  const axios = axiosImport.default ?? axiosImport;
4134
4186
  class ApiClient {
4135
4187
  constructor(apiKey, tokenManager, connectionIdManager, options) {
@@ -4945,7 +4997,7 @@ const uniqueArrayMerge = (existingArray, arrayToMerge, getKey) => {
4945
4997
  });
4946
4998
  return existingArray.concat(filteredArrayToMerge);
4947
4999
  };
4948
- const replaceUniqueArrayMerge = (existingArray, arrayToMerge, getKey) => {
5000
+ const replaceUniqueArrayMerge = (existingArray, arrayToMerge, getKey, position) => {
4949
5001
  const existingMap = /* @__PURE__ */ new Map();
4950
5002
  (existingArray ?? []).forEach((item) => {
4951
5003
  existingMap.set(getKey(item), item);
@@ -4961,9 +5013,14 @@ const replaceUniqueArrayMerge = (existingArray, arrayToMerge, getKey) => {
4961
5013
  existingMap.delete(getKey(originalItem));
4962
5014
  }
4963
5015
  });
4964
- existingMap.forEach((item) => {
4965
- result.push(item);
4966
- });
5016
+ const newItemsInOrder = arrayToMerge.filter(
5017
+ (item) => existingMap.has(getKey(item))
5018
+ );
5019
+ if (position === "end") {
5020
+ newItemsInOrder.forEach((item) => result.push(item));
5021
+ } else {
5022
+ result.unshift(...newItemsInOrder);
5023
+ }
4967
5024
  return result;
4968
5025
  };
4969
5026
  const Constants = {
@@ -5010,24 +5067,25 @@ function getStateUpdateQueueId(...args) {
5010
5067
  const [data, prefix] = args;
5011
5068
  const toJoin = [prefix];
5012
5069
  switch (prefix) {
5070
+ case "activity-deleted": {
5071
+ return toJoin.concat([data.activity.id]).join("-");
5072
+ }
5073
+ case "activity-pinned":
5074
+ case "activity-unpinned": {
5075
+ return toJoin.concat([data.pinned_activity.activity.id]).join("-");
5076
+ }
5013
5077
  case "activity-updated": {
5014
5078
  return toJoin.concat([data.activity.id]).join("-");
5015
5079
  }
5016
5080
  case "activity-reaction-created":
5017
5081
  case "activity-reaction-deleted":
5018
5082
  case "activity-reaction-updated": {
5019
- return toJoin.concat([
5020
- data.activity.id,
5021
- data.reaction.type
5022
- ]).join("-");
5083
+ return toJoin.concat([data.activity.id, data.reaction.type]).join("-");
5023
5084
  }
5024
5085
  case "comment-reaction-created":
5025
5086
  case "comment-reaction-deleted":
5026
5087
  case "comment-reaction-updated": {
5027
- return toJoin.concat([
5028
- data.comment.id,
5029
- data.reaction.type
5030
- ]).join("-");
5088
+ return toJoin.concat([data.comment.id, data.reaction.type]).join("-");
5031
5089
  }
5032
5090
  case "comment-created":
5033
5091
  case "comment-deleted":
@@ -5039,6 +5097,13 @@ function getStateUpdateQueueId(...args) {
5039
5097
  case "follow-updated": {
5040
5098
  return toJoin.concat([data.source_feed.feed, data.target_feed.feed]).join("-");
5041
5099
  }
5100
+ case "feed-member-added":
5101
+ case "feed-member-updated": {
5102
+ return toJoin.concat([data.member.user.id]).join("-");
5103
+ }
5104
+ case "feed-member-removed": {
5105
+ return toJoin.concat([data.member_id]).join("-");
5106
+ }
5042
5107
  default: {
5043
5108
  ensureExhausted(data, "Encountered unknown state update queue prefix.");
5044
5109
  }
@@ -5207,7 +5272,12 @@ function handleFollowUpdated(eventOrResponse, fromWs) {
5207
5272
  newState ?? (newState = {
5208
5273
  ...currentState,
5209
5274
  // Update FeedResponse fields, that has the new follower/following count
5210
- ...follow.source_feed
5275
+ ...follow.source_feed,
5276
+ ...follow.source_feed.own_capabilities !== void 0 ? {
5277
+ own_capabilities: follow.source_feed.own_capabilities,
5278
+ own_follows: follow.source_feed.own_follows,
5279
+ own_followings: follow.source_feed.own_followings
5280
+ } : {}
5211
5281
  });
5212
5282
  const index = currentState.following?.findIndex(
5213
5283
  (f) => f.target_feed.feed === follow.target_feed.feed
@@ -5224,7 +5294,12 @@ function handleFollowUpdated(eventOrResponse, fromWs) {
5224
5294
  newState ?? (newState = {
5225
5295
  ...currentState,
5226
5296
  // Update FeedResponse fields, that has the new follower/following count
5227
- ...follow.target_feed
5297
+ ...follow.target_feed,
5298
+ ...follow.target_feed.own_capabilities !== void 0 ? {
5299
+ own_capabilities: follow.target_feed.own_capabilities,
5300
+ own_follows: follow.target_feed.own_follows,
5301
+ own_followings: follow.target_feed.own_followings
5302
+ } : {}
5228
5303
  });
5229
5304
  if (source.created_by.id === connectedUserId && currentState.own_follows) {
5230
5305
  const index2 = currentState.own_follows.findIndex(
@@ -5519,7 +5594,19 @@ function handleCommentReactionUpdated(payload, fromWs) {
5519
5594
  };
5520
5595
  });
5521
5596
  }
5522
- function handleFeedMemberAdded(event) {
5597
+ function handleFeedMemberAdded(event, fromWs) {
5598
+ if (!shouldUpdateState({
5599
+ stateUpdateQueueId: getStateUpdateQueueId(event, "feed-member-added"),
5600
+ stateUpdateQueue: this.stateUpdateQueue,
5601
+ watch: this.currentState.watch,
5602
+ fromWs,
5603
+ isTriggeredByConnectedUser: eventTriggeredByConnectedUser.call(
5604
+ this,
5605
+ event
5606
+ )
5607
+ })) {
5608
+ return;
5609
+ }
5523
5610
  const { connected_user: connectedUser } = this.client.state.getLatestValue();
5524
5611
  this.state.next((currentState) => {
5525
5612
  let newState;
@@ -5538,7 +5625,19 @@ function handleFeedMemberAdded(event) {
5538
5625
  return newState ?? currentState;
5539
5626
  });
5540
5627
  }
5541
- function handleFeedMemberUpdated(event) {
5628
+ function handleFeedMemberUpdated(event, fromWs) {
5629
+ if (!shouldUpdateState({
5630
+ stateUpdateQueueId: getStateUpdateQueueId(event, "feed-member-updated"),
5631
+ stateUpdateQueue: this.stateUpdateQueue,
5632
+ watch: this.currentState.watch,
5633
+ fromWs,
5634
+ isTriggeredByConnectedUser: eventTriggeredByConnectedUser.call(
5635
+ this,
5636
+ event
5637
+ )
5638
+ })) {
5639
+ return;
5640
+ }
5542
5641
  const { connected_user: connectedUser } = this.client.state.getLatestValue();
5543
5642
  this.state.next((currentState) => {
5544
5643
  const memberIndex = currentState.members?.findIndex(
@@ -5562,7 +5661,19 @@ function handleFeedMemberUpdated(event) {
5562
5661
  return newState ?? currentState;
5563
5662
  });
5564
5663
  }
5565
- function handleFeedMemberRemoved(event) {
5664
+ function handleFeedMemberRemoved(event, fromWs) {
5665
+ if (!shouldUpdateState({
5666
+ stateUpdateQueueId: getStateUpdateQueueId(event, "feed-member-removed"),
5667
+ stateUpdateQueue: this.stateUpdateQueue,
5668
+ watch: this.currentState.watch,
5669
+ fromWs,
5670
+ isTriggeredByConnectedUser: eventTriggeredByConnectedUser.call(
5671
+ this,
5672
+ event
5673
+ )
5674
+ })) {
5675
+ return;
5676
+ }
5566
5677
  const { connected_user: connectedUser } = this.client.state.getLatestValue();
5567
5678
  this.state.next((currentState) => {
5568
5679
  let newState;
@@ -5582,6 +5693,9 @@ function handleFeedMemberRemoved(event) {
5582
5693
  return newState ?? currentState;
5583
5694
  });
5584
5695
  }
5696
+ const isSameBookmark = (bookmark1, bookmark2) => {
5697
+ return bookmark1.user.id === bookmark2.user.id && bookmark1.activity.id === bookmark2.activity.id && bookmark1.folder?.id === bookmark2.folder?.id && bookmark1.updated_at.getTime() === bookmark2.updated_at.getTime();
5698
+ };
5585
5699
  const sharedUpdateActivity$6 = ({
5586
5700
  currentActivity,
5587
5701
  event,
@@ -5589,7 +5703,9 @@ const sharedUpdateActivity$6 = ({
5589
5703
  }) => {
5590
5704
  let newOwnBookmarks = currentActivity.own_bookmarks;
5591
5705
  if (eventBelongsToCurrentUser) {
5592
- newOwnBookmarks = [...newOwnBookmarks, event.bookmark];
5706
+ newOwnBookmarks = currentActivity.own_bookmarks.filter(
5707
+ (bookmark) => !isSameBookmark(bookmark, event.bookmark)
5708
+ );
5593
5709
  }
5594
5710
  return {
5595
5711
  ...currentActivity,
@@ -5597,18 +5713,20 @@ const sharedUpdateActivity$6 = ({
5597
5713
  own_bookmarks: newOwnBookmarks
5598
5714
  };
5599
5715
  };
5600
- const addBookmarkToActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5716
+ const removeBookmarkFromActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5601
5717
  entities: activities,
5602
- matcher: (activity) => activity.id === event.bookmark.activity.id,
5718
+ matcher: (activity) => activity.id === event.bookmark.activity.id && (!eventBelongsToCurrentUser || activity.own_bookmarks.some((b) => isSameBookmark(b, event.bookmark))),
5603
5719
  updater: (matchedActivity) => sharedUpdateActivity$6({
5604
5720
  currentActivity: matchedActivity,
5605
5721
  event,
5606
5722
  eventBelongsToCurrentUser
5607
5723
  })
5608
5724
  });
5609
- const addBookmarkToPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
5725
+ const removeBookmarkFromPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
5610
5726
  entities: pinnedActivities,
5611
- matcher: (pinnedActivity) => pinnedActivity.activity.id === event.bookmark.activity.id,
5727
+ matcher: (pinnedActivity) => pinnedActivity.activity.id === event.bookmark.activity.id && (!eventBelongsToCurrentUser || pinnedActivity.activity.own_bookmarks.some(
5728
+ (b) => isSameBookmark(b, event.bookmark)
5729
+ )),
5612
5730
  updater: (matchedPinnedActivity) => {
5613
5731
  const newActivity = sharedUpdateActivity$6({
5614
5732
  currentActivity: matchedPinnedActivity.activity,
@@ -5624,7 +5742,7 @@ const addBookmarkToPinnedActivities = (event, pinnedActivities, eventBelongsToCu
5624
5742
  };
5625
5743
  }
5626
5744
  });
5627
- function handleBookmarkAdded(event) {
5745
+ function handleBookmarkDeleted(event) {
5628
5746
  const {
5629
5747
  activities: currentActivities,
5630
5748
  pinned_activities: currentPinnedActivities
@@ -5632,12 +5750,12 @@ function handleBookmarkAdded(event) {
5632
5750
  const { connected_user: connectedUser } = this.client.state.getLatestValue();
5633
5751
  const eventBelongsToCurrentUser = event.bookmark.user.id === connectedUser?.id;
5634
5752
  const [result1, result2] = [
5635
- addBookmarkToActivities(
5753
+ removeBookmarkFromActivities(
5636
5754
  event,
5637
5755
  currentActivities,
5638
5756
  eventBelongsToCurrentUser
5639
5757
  ),
5640
- addBookmarkToPinnedActivities(
5758
+ removeBookmarkFromPinnedActivities(
5641
5759
  event,
5642
5760
  currentPinnedActivities,
5643
5761
  eventBelongsToCurrentUser
@@ -5650,9 +5768,6 @@ function handleBookmarkAdded(event) {
5650
5768
  });
5651
5769
  }
5652
5770
  }
5653
- const isSameBookmark = (bookmark1, bookmark2) => {
5654
- return bookmark1.user.id === bookmark2.user.id && bookmark1.activity.id === bookmark2.activity.id && bookmark1.folder?.id === bookmark2.folder?.id;
5655
- };
5656
5771
  const sharedUpdateActivity$5 = ({
5657
5772
  currentActivity,
5658
5773
  event,
@@ -5660,9 +5775,7 @@ const sharedUpdateActivity$5 = ({
5660
5775
  }) => {
5661
5776
  let newOwnBookmarks = currentActivity.own_bookmarks;
5662
5777
  if (eventBelongsToCurrentUser) {
5663
- newOwnBookmarks = currentActivity.own_bookmarks.filter(
5664
- (bookmark) => !isSameBookmark(bookmark, event.bookmark)
5665
- );
5778
+ newOwnBookmarks = [...newOwnBookmarks, event.bookmark];
5666
5779
  }
5667
5780
  return {
5668
5781
  ...currentActivity,
@@ -5670,18 +5783,20 @@ const sharedUpdateActivity$5 = ({
5670
5783
  own_bookmarks: newOwnBookmarks
5671
5784
  };
5672
5785
  };
5673
- const removeBookmarkFromActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5786
+ const addBookmarkToActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5674
5787
  entities: activities,
5675
- matcher: (activity) => activity.id === event.bookmark.activity.id,
5788
+ matcher: (activity) => activity.id === event.bookmark.activity.id && (!eventBelongsToCurrentUser || !activity.own_bookmarks.some((b) => isSameBookmark(b, event.bookmark))),
5676
5789
  updater: (matchedActivity) => sharedUpdateActivity$5({
5677
5790
  currentActivity: matchedActivity,
5678
5791
  event,
5679
5792
  eventBelongsToCurrentUser
5680
5793
  })
5681
5794
  });
5682
- const removeBookmarkFromPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
5795
+ const addBookmarkToPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
5683
5796
  entities: pinnedActivities,
5684
- matcher: (pinnedActivity) => pinnedActivity.activity.id === event.bookmark.activity.id,
5797
+ matcher: (pinnedActivity) => pinnedActivity.activity.id === event.bookmark.activity.id && (!eventBelongsToCurrentUser || !pinnedActivity.activity.own_bookmarks.some(
5798
+ (b) => isSameBookmark(b, event.bookmark)
5799
+ )),
5685
5800
  updater: (matchedPinnedActivity) => {
5686
5801
  const newActivity = sharedUpdateActivity$5({
5687
5802
  currentActivity: matchedPinnedActivity.activity,
@@ -5697,7 +5812,7 @@ const removeBookmarkFromPinnedActivities = (event, pinnedActivities, eventBelong
5697
5812
  };
5698
5813
  }
5699
5814
  });
5700
- function handleBookmarkDeleted(event) {
5815
+ function handleBookmarkAdded(event) {
5701
5816
  const {
5702
5817
  activities: currentActivities,
5703
5818
  pinned_activities: currentPinnedActivities
@@ -5705,12 +5820,12 @@ function handleBookmarkDeleted(event) {
5705
5820
  const { connected_user: connectedUser } = this.client.state.getLatestValue();
5706
5821
  const eventBelongsToCurrentUser = event.bookmark.user.id === connectedUser?.id;
5707
5822
  const [result1, result2] = [
5708
- removeBookmarkFromActivities(
5823
+ addBookmarkToActivities(
5709
5824
  event,
5710
5825
  currentActivities,
5711
5826
  eventBelongsToCurrentUser
5712
5827
  ),
5713
- removeBookmarkFromPinnedActivities(
5828
+ addBookmarkToPinnedActivities(
5714
5829
  event,
5715
5830
  currentPinnedActivities,
5716
5831
  eventBelongsToCurrentUser
@@ -5731,7 +5846,7 @@ const sharedUpdateActivity$4 = ({
5731
5846
  let newOwnBookmarks = currentActivity.own_bookmarks;
5732
5847
  if (eventBelongsToCurrentUser) {
5733
5848
  const bookmarkIndex = newOwnBookmarks.findIndex(
5734
- (bookmark) => isSameBookmark(bookmark, event.bookmark)
5849
+ (bookmark) => bookmark.user.id === event.bookmark.user.id && bookmark.activity.id === event.bookmark.activity.id && bookmark.folder?.id === event.bookmark.folder?.id
5735
5850
  );
5736
5851
  if (bookmarkIndex !== -1) {
5737
5852
  newOwnBookmarks = [...newOwnBookmarks];
@@ -5746,7 +5861,7 @@ const sharedUpdateActivity$4 = ({
5746
5861
  };
5747
5862
  const updateBookmarkInActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5748
5863
  entities: activities,
5749
- matcher: (activity) => activity.id === event.bookmark.activity.id,
5864
+ matcher: (activity) => activity.id === event.bookmark.activity.id && (!eventBelongsToCurrentUser || !activity.own_bookmarks.some((b) => isSameBookmark(b, event.bookmark))),
5750
5865
  updater: (matchedActivity) => sharedUpdateActivity$4({
5751
5866
  currentActivity: matchedActivity,
5752
5867
  event,
@@ -5755,7 +5870,9 @@ const updateBookmarkInActivities = (event, activities, eventBelongsToCurrentUser
5755
5870
  });
5756
5871
  const updateBookmarkInPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
5757
5872
  entities: pinnedActivities,
5758
- matcher: (pinnedActivity) => pinnedActivity.activity.id === event.bookmark.activity.id,
5873
+ matcher: (pinnedActivity) => pinnedActivity.activity.id === event.bookmark.activity.id && (!eventBelongsToCurrentUser || !pinnedActivity.activity.own_bookmarks.some(
5874
+ (b) => isSameBookmark(b, event.bookmark)
5875
+ )),
5759
5876
  updater: (matchedPinnedActivity) => {
5760
5877
  const newActivity = sharedUpdateActivity$4({
5761
5878
  currentActivity: matchedPinnedActivity.activity,
@@ -5882,7 +5999,19 @@ const removePinnedActivityFromState = (activityResponse, pinnedActivities) => {
5882
5999
  return { changed: false, pinned_activities: pinnedActivities };
5883
6000
  }
5884
6001
  };
5885
- function handleActivityDeleted(event) {
6002
+ function handleActivityDeleted(event, fromWs) {
6003
+ if (!shouldUpdateState({
6004
+ stateUpdateQueueId: getStateUpdateQueueId(event, "activity-deleted"),
6005
+ stateUpdateQueue: this.stateUpdateQueue,
6006
+ watch: this.currentState.watch,
6007
+ fromWs,
6008
+ isTriggeredByConnectedUser: eventTriggeredByConnectedUser.call(
6009
+ this,
6010
+ event
6011
+ )
6012
+ })) {
6013
+ return;
6014
+ }
5886
6015
  const {
5887
6016
  activities: currentActivities,
5888
6017
  pinned_activities: currentPinnedActivities
@@ -6228,53 +6357,133 @@ function handleActivityReactionUpdated(payload, fromWs) {
6228
6357
  });
6229
6358
  }
6230
6359
  }
6231
- const updateNotificationStatusFromActivityMarked = (event, currentNotificationStatus, aggregatedActivities = []) => {
6232
- if (!currentNotificationStatus) {
6233
- return {
6234
- changed: false
6235
- };
6236
- }
6237
- const newState = {
6238
- ...currentNotificationStatus
6239
- };
6240
- if (event.mark_all_read) {
6241
- const allGroupIds = aggregatedActivities.map((activity) => activity.group);
6242
- newState.read_activities = [
6243
- .../* @__PURE__ */ new Set([
6244
- ...currentNotificationStatus.read_activities ?? [],
6245
- ...allGroupIds
6246
- ])
6247
- ];
6360
+ function handleActivityPinned(event, fromWs) {
6361
+ if (!shouldUpdateState({
6362
+ stateUpdateQueueId: getStateUpdateQueueId(event, "activity-pinned"),
6363
+ stateUpdateQueue: this.stateUpdateQueue,
6364
+ watch: this.currentState.watch,
6365
+ fromWs,
6366
+ isTriggeredByConnectedUser: eventTriggeredByConnectedUser.call(
6367
+ this,
6368
+ event
6369
+ )
6370
+ })) {
6371
+ return;
6248
6372
  }
6249
- if (event.mark_read && event.mark_read.length > 0) {
6250
- newState.read_activities = [
6251
- .../* @__PURE__ */ new Set([
6252
- ...currentNotificationStatus?.read_activities ?? [],
6253
- ...event.mark_read
6254
- ])
6255
- ];
6373
+ this.state.next((currentState) => {
6374
+ const newState = {
6375
+ ...currentState
6376
+ };
6377
+ const pinnedActivity = {
6378
+ ...event.pinned_activity,
6379
+ user: event.user,
6380
+ updated_at: /* @__PURE__ */ new Date()
6381
+ };
6382
+ newState.pinned_activities = currentState.pinned_activities ? [pinnedActivity, ...currentState.pinned_activities] : [pinnedActivity];
6383
+ return newState;
6384
+ });
6385
+ }
6386
+ function handleActivityUnpinned(event, fromWs) {
6387
+ if (!shouldUpdateState({
6388
+ stateUpdateQueueId: getStateUpdateQueueId(event, "activity-unpinned"),
6389
+ stateUpdateQueue: this.stateUpdateQueue,
6390
+ watch: this.currentState.watch,
6391
+ fromWs,
6392
+ isTriggeredByConnectedUser: eventTriggeredByConnectedUser.call(
6393
+ this,
6394
+ event
6395
+ )
6396
+ })) {
6397
+ return;
6256
6398
  }
6257
- if (event.mark_all_seen) {
6258
- newState.last_seen_at = /* @__PURE__ */ new Date();
6399
+ this.state.next((currentState) => {
6400
+ let newState;
6401
+ const index = currentState.pinned_activities?.findIndex(
6402
+ (pinnedActivity) => pinnedActivity.activity.id === event.pinned_activity.activity.id
6403
+ ) ?? -1;
6404
+ if (index >= 0) {
6405
+ newState ?? (newState = {
6406
+ ...currentState
6407
+ });
6408
+ const newPinnedActivities = [...currentState.pinned_activities];
6409
+ newPinnedActivities.splice(index, 1);
6410
+ newState.pinned_activities = newPinnedActivities;
6411
+ }
6412
+ return newState ?? currentState;
6413
+ });
6414
+ }
6415
+ const isPin = (entity) => {
6416
+ return "activity" in entity;
6417
+ };
6418
+ const updateActivityFromFeedback = (feedback, activities) => {
6419
+ if (!activities) {
6420
+ return {
6421
+ changed: false,
6422
+ entities: []
6423
+ };
6259
6424
  }
6260
- return {
6261
- changed: true,
6262
- data: { notification_status: newState }
6263
- };
6425
+ return updateEntityInArray({
6426
+ entities: activities,
6427
+ matcher: (e) => {
6428
+ const newHidden = feedback.value === "true";
6429
+ if (isPin(e)) {
6430
+ return e.activity.id === feedback.activity_id && e.activity.hidden !== newHidden;
6431
+ }
6432
+ return e.id === feedback.activity_id && e.hidden !== newHidden;
6433
+ },
6434
+ updater: (e) => {
6435
+ if (isPin(e)) {
6436
+ return {
6437
+ ...e,
6438
+ activity: {
6439
+ ...e.activity,
6440
+ hidden: feedback.value === "true"
6441
+ }
6442
+ };
6443
+ } else {
6444
+ return {
6445
+ ...e,
6446
+ hidden: feedback.value === "true"
6447
+ };
6448
+ }
6449
+ }
6450
+ });
6264
6451
  };
6265
- function handleActivityMarked(event) {
6266
- const result = updateNotificationStatusFromActivityMarked(
6267
- event,
6268
- this.currentState.notification_status,
6269
- this.currentState.aggregated_activities
6270
- );
6271
- if (result.changed) {
6452
+ function handleActivityFeedback(event) {
6453
+ const {
6454
+ activities: currentActivities,
6455
+ pinned_activities: currentPinnedActivities
6456
+ } = this.currentState;
6457
+ const { connected_user: connectedUser } = this.client.state.getLatestValue();
6458
+ const eventBelongsToCurrentUser = event.activity_feedback.user.id === connectedUser?.id;
6459
+ if (!eventBelongsToCurrentUser || event.activity_feedback.action !== "hide") {
6460
+ return;
6461
+ }
6462
+ const [result1, result2] = [
6463
+ updateActivityFromFeedback(event.activity_feedback, currentActivities),
6464
+ updateActivityFromFeedback(
6465
+ event.activity_feedback,
6466
+ currentPinnedActivities
6467
+ )
6468
+ ];
6469
+ if (result1.changed || result2.changed) {
6272
6470
  this.state.partialNext({
6273
- notification_status: result.data?.notification_status
6471
+ activities: result1.entities,
6472
+ pinned_activities: result2.entities
6274
6473
  });
6275
6474
  }
6276
6475
  }
6476
+ function handleFeedDeleted(event) {
6477
+ if (this.currentState.deleted_at) {
6478
+ return;
6479
+ }
6480
+ this.state.partialNext({ deleted_at: event.created_at });
6481
+ }
6277
6482
  function handleFeedUpdated(event) {
6483
+ const currentUpdatedAt = this.currentState.updated_at;
6484
+ if (currentUpdatedAt && event.feed.updated_at && currentUpdatedAt.getTime() >= event.feed.updated_at.getTime()) {
6485
+ return;
6486
+ }
6278
6487
  this.state.partialNext({ ...event.feed });
6279
6488
  }
6280
6489
  const addAggregatedActivitiesToState = (newAggregatedActivities, aggregatedActivities, position) => {
@@ -6323,11 +6532,20 @@ const addAggregatedActivitiesToState = (newAggregatedActivities, aggregatedActiv
6323
6532
  (a) => a.group
6324
6533
  );
6325
6534
  break;
6326
- case "replace":
6535
+ case "replace-then-end":
6327
6536
  result.aggregated_activities = replaceUniqueArrayMerge(
6328
6537
  aggregatedActivities ?? [],
6329
6538
  newAggregatedActivities,
6330
- (a) => a.group
6539
+ (a) => a.group,
6540
+ "end"
6541
+ );
6542
+ break;
6543
+ case "replace-then-start":
6544
+ result.aggregated_activities = replaceUniqueArrayMerge(
6545
+ aggregatedActivities ?? [],
6546
+ newAggregatedActivities,
6547
+ (a) => a.group,
6548
+ "start"
6331
6549
  );
6332
6550
  break;
6333
6551
  }
@@ -6354,7 +6572,7 @@ const updateNotificationStatus = (newNotificationStatus, currentNotificationStat
6354
6572
  };
6355
6573
  }
6356
6574
  };
6357
- const updateNotificationFeedFromEvent = (event, currentAggregatedActivities, currentNotificationStatus) => {
6575
+ const updateNotificationFeedFromEvent = (event, currentAggregatedActivities, currentNotificationStatus, currentActivities) => {
6358
6576
  const updates = {};
6359
6577
  if (event.notification_status) {
6360
6578
  const notificationStatusResult = updateNotificationStatus(
@@ -6365,11 +6583,47 @@ const updateNotificationFeedFromEvent = (event, currentAggregatedActivities, cur
6365
6583
  updates.notification_status = notificationStatusResult.notification_status;
6366
6584
  }
6367
6585
  }
6586
+ const effectiveStatus = event.notification_status ?? currentNotificationStatus;
6587
+ const lastReadAt = effectiveStatus?.last_read_at;
6588
+ const lastSeenAt = effectiveStatus?.last_seen_at;
6589
+ const readActivities = effectiveStatus?.read_activities ?? [];
6590
+ const seenActivities = effectiveStatus?.seen_activities ?? [];
6591
+ if (currentActivities?.length && !currentAggregatedActivities?.length && effectiveStatus) {
6592
+ let anyChanged = false;
6593
+ const updatedActivities = currentActivities.map((activity) => {
6594
+ const isRead = lastReadAt != null && activity.updated_at.getTime() < lastReadAt.getTime() || readActivities.includes(activity.id);
6595
+ const isSeen = lastSeenAt != null && activity.updated_at.getTime() < lastSeenAt.getTime() || seenActivities.includes(activity.id);
6596
+ if (activity.is_read !== isRead || activity.is_seen !== isSeen) {
6597
+ anyChanged = true;
6598
+ return { ...activity, is_read: isRead, is_seen: isSeen };
6599
+ }
6600
+ return activity;
6601
+ });
6602
+ if (anyChanged) {
6603
+ updates.activities = updatedActivities;
6604
+ }
6605
+ }
6606
+ if (currentAggregatedActivities?.length && effectiveStatus) {
6607
+ const baseAggregated = currentAggregatedActivities;
6608
+ let anyChanged = false;
6609
+ const updatedAggregated = baseAggregated.map((group) => {
6610
+ const isRead = lastReadAt != null && group.updated_at.getTime() < lastReadAt.getTime() || readActivities.includes(group.group);
6611
+ const isSeen = lastSeenAt != null && group.updated_at.getTime() < lastSeenAt.getTime() || seenActivities.includes(group.group);
6612
+ if (group.is_read !== isRead || group.is_seen !== isSeen) {
6613
+ anyChanged = true;
6614
+ return { ...group, is_read: isRead, is_seen: isSeen };
6615
+ }
6616
+ return group;
6617
+ });
6618
+ if (anyChanged) {
6619
+ updates.aggregated_activities = updatedAggregated;
6620
+ }
6621
+ }
6368
6622
  if (event.aggregated_activities && currentAggregatedActivities) {
6369
6623
  const aggregatedActivitiesResult = addAggregatedActivitiesToState(
6370
6624
  event.aggregated_activities,
6371
- currentAggregatedActivities,
6372
- "start"
6625
+ updates.aggregated_activities ?? currentAggregatedActivities,
6626
+ "replace-then-start"
6373
6627
  );
6374
6628
  if (aggregatedActivitiesResult.changed) {
6375
6629
  updates.aggregated_activities = aggregatedActivitiesResult.aggregated_activities;
@@ -6389,12 +6643,14 @@ function handleNotificationFeedUpdated(event) {
6389
6643
  const result = updateNotificationFeedFromEvent(
6390
6644
  event,
6391
6645
  this.currentState.aggregated_activities,
6392
- this.currentState.notification_status
6646
+ this.currentState.notification_status,
6647
+ this.currentState.activities
6393
6648
  );
6394
6649
  if (result.changed) {
6395
6650
  this.state.partialNext({
6396
6651
  notification_status: result.data?.notification_status,
6397
- aggregated_activities: result.data?.aggregated_activities
6652
+ aggregated_activities: result.data?.aggregated_activities,
6653
+ activities: result.data?.activities ?? this.currentState.activities
6398
6654
  });
6399
6655
  }
6400
6656
  }
@@ -6444,7 +6700,7 @@ function updateStoriesFeedFromEvent(aggregatedActivities, activities, event) {
6444
6700
  const aggregatedActivitiesResult = addAggregatedActivitiesToState(
6445
6701
  event.aggregated_activities,
6446
6702
  aggregatedActivities,
6447
- "replace"
6703
+ "replace-then-end"
6448
6704
  );
6449
6705
  if (aggregatedActivitiesResult.changed) {
6450
6706
  result.data.aggregated_activities = aggregatedActivitiesResult.aggregated_activities;
@@ -6538,61 +6794,6 @@ async function withRetry(fn, options = {}) {
6538
6794
  }
6539
6795
  throw lastError;
6540
6796
  }
6541
- const isPin = (entity) => {
6542
- return "activity" in entity;
6543
- };
6544
- const updateActivityFromFeedback = (feedback, activities) => {
6545
- if (!activities) {
6546
- return {
6547
- changed: false,
6548
- entities: []
6549
- };
6550
- }
6551
- return updateEntityInArray({
6552
- entities: activities,
6553
- matcher: (e) => isPin(e) ? e.activity.id === feedback.activity_id : e.id === feedback.activity_id,
6554
- updater: (e) => {
6555
- if (isPin(e)) {
6556
- return {
6557
- ...e,
6558
- activity: {
6559
- ...e.activity,
6560
- hidden: feedback.value === "true"
6561
- }
6562
- };
6563
- } else {
6564
- return {
6565
- ...e,
6566
- hidden: feedback.value === "true"
6567
- };
6568
- }
6569
- }
6570
- });
6571
- };
6572
- function handleActivityFeedback(event) {
6573
- const {
6574
- activities: currentActivities,
6575
- pinned_activities: currentPinnedActivities
6576
- } = this.currentState;
6577
- const { connected_user: connectedUser } = this.client.state.getLatestValue();
6578
- const eventBelongsToCurrentUser = event.activity_feedback.user.id === connectedUser?.id;
6579
- if (!eventBelongsToCurrentUser || event.activity_feedback.action !== "hide") {
6580
- return;
6581
- }
6582
- const [result1, result2] = [
6583
- updateActivityFromFeedback(event.activity_feedback, currentActivities),
6584
- updateActivityFromFeedback(
6585
- event.activity_feedback,
6586
- currentPinnedActivities
6587
- )
6588
- ];
6589
- if (result1.changed || result2.changed) {
6590
- this.state.partialNext({
6591
- activities: result1.entities,
6592
- pinned_activities: result2.entities
6593
- });
6594
- }
6595
- }
6596
6797
  const deepEqual = (x, y) => {
6597
6798
  if (x === y) {
6598
6799
  return true;
@@ -6719,7 +6920,7 @@ const _Feed = class _Feed extends FeedApi {
6719
6920
  "feeds.comment.deleted": handleCommentDeleted.bind(this),
6720
6921
  "feeds.comment.updated": handleCommentUpdated.bind(this),
6721
6922
  "feeds.feed.created": _Feed.noop,
6722
- "feeds.feed.deleted": _Feed.noop,
6923
+ "feeds.feed.deleted": handleFeedDeleted.bind(this),
6723
6924
  "feeds.feed.updated": handleFeedUpdated.bind(this),
6724
6925
  "feeds.feed_group.changed": _Feed.noop,
6725
6926
  "feeds.feed_group.deleted": _Feed.noop,
@@ -6742,9 +6943,9 @@ const _Feed = class _Feed extends FeedApi {
6742
6943
  "feeds.poll.vote_casted": _Feed.noop,
6743
6944
  "feeds.poll.vote_changed": _Feed.noop,
6744
6945
  "feeds.poll.vote_removed": _Feed.noop,
6745
- "feeds.activity.pinned": _Feed.noop,
6746
- "feeds.activity.unpinned": _Feed.noop,
6747
- "feeds.activity.marked": handleActivityMarked.bind(this),
6946
+ "feeds.activity.pinned": handleActivityPinned.bind(this),
6947
+ "feeds.activity.unpinned": handleActivityUnpinned.bind(this),
6948
+ "feeds.activity.marked": _Feed.noop,
6748
6949
  "moderation.custom_action": _Feed.noop,
6749
6950
  "moderation.flagged": _Feed.noop,
6750
6951
  "moderation.mark_reviewed": _Feed.noop,
@@ -7858,6 +8059,53 @@ class FeedsClient extends FeedsApi {
7858
8059
  }
7859
8060
  return response;
7860
8061
  };
8062
+ this.updateActivityPartial = async (...args) => {
8063
+ const response = await super.updateActivityPartial(...args);
8064
+ for (const feed of this.allActiveFeeds) {
8065
+ handleActivityUpdated.bind(feed)(response, false);
8066
+ }
8067
+ return response;
8068
+ };
8069
+ this.deleteActivity = async (...args) => {
8070
+ const response = await super.deleteActivity(...args);
8071
+ const activityId = args[0].id;
8072
+ for (const feed of this.allActiveFeeds) {
8073
+ handleActivityDeleted.bind(feed)(
8074
+ { activity: { id: activityId } },
8075
+ false
8076
+ );
8077
+ }
8078
+ this.activeActivities = this.activeActivities.filter(
8079
+ (activity) => activity.id !== activityId
8080
+ );
8081
+ return response;
8082
+ };
8083
+ this.activityFeedback = async (request) => {
8084
+ const response = await super.activityFeedback(request);
8085
+ if (request.hide !== void 0) {
8086
+ const feedback = {
8087
+ activity_id: request.activity_id,
8088
+ value: request.hide ? "true" : "false"
8089
+ };
8090
+ for (const feed of this.allActiveFeeds) {
8091
+ const {
8092
+ activities: currentActivities,
8093
+ pinned_activities: currentPinnedActivities
8094
+ } = feed.currentState;
8095
+ const [result1, result2] = [
8096
+ updateActivityFromFeedback(feedback, currentActivities),
8097
+ updateActivityFromFeedback(feedback, currentPinnedActivities)
8098
+ ];
8099
+ if (result1.changed || result2.changed) {
8100
+ feed.state.partialNext({
8101
+ activities: result1.entities,
8102
+ pinned_activities: result2.entities
8103
+ });
8104
+ }
8105
+ }
8106
+ }
8107
+ return response;
8108
+ };
7861
8109
  this.addComment = async (request) => {
7862
8110
  const response = await super.addComment(request);
7863
8111
  const { comment } = response;
@@ -7943,6 +8191,121 @@ class FeedsClient extends FeedsApi {
7943
8191
  }
7944
8192
  return response;
7945
8193
  };
8194
+ this.addBookmark = async (request) => {
8195
+ const response = await super.addBookmark(request);
8196
+ for (const feed of this.allActiveFeeds) {
8197
+ handleBookmarkAdded.bind(feed)(response);
8198
+ }
8199
+ return response;
8200
+ };
8201
+ this.updateBookmark = async (request) => {
8202
+ const response = await super.updateBookmark(request);
8203
+ for (const feed of this.allActiveFeeds) {
8204
+ handleBookmarkUpdated.bind(feed)(response);
8205
+ }
8206
+ return response;
8207
+ };
8208
+ this.deleteBookmark = async (request) => {
8209
+ const response = await super.deleteBookmark(request);
8210
+ for (const feed of this.allActiveFeeds) {
8211
+ handleBookmarkDeleted.bind(feed)(response);
8212
+ }
8213
+ return response;
8214
+ };
8215
+ this.pinActivity = async (...args) => {
8216
+ const response = await super.pinActivity(...args);
8217
+ const feedIds = response.activity?.feeds ?? (response.feed ? [response.feed] : []);
8218
+ for (const fid of feedIds) {
8219
+ const feed = this.activeFeeds[fid];
8220
+ if (feed) {
8221
+ handleActivityPinned.bind(feed)(
8222
+ { pinned_activity: response },
8223
+ false
8224
+ );
8225
+ }
8226
+ }
8227
+ return response;
8228
+ };
8229
+ this.unpinActivity = async (...args) => {
8230
+ const response = await super.unpinActivity(...args);
8231
+ const feedIds = response.activity?.feeds ?? (response.feed ? [response.feed] : []);
8232
+ for (const fid of feedIds) {
8233
+ const feed = this.activeFeeds[fid];
8234
+ if (feed) {
8235
+ handleActivityUnpinned.bind(feed)(
8236
+ {
8237
+ pinned_activity: {
8238
+ ...response,
8239
+ created_at: /* @__PURE__ */ new Date()
8240
+ }
8241
+ },
8242
+ false
8243
+ );
8244
+ }
8245
+ }
8246
+ return response;
8247
+ };
8248
+ this.updateFeed = async (...args) => {
8249
+ const response = await super.updateFeed(...args);
8250
+ const fid = `${args[0].feed_group_id}:${args[0].feed_id}`;
8251
+ const feed = this.activeFeeds[fid];
8252
+ if (feed) {
8253
+ handleFeedUpdated.call(feed, { feed: response.feed });
8254
+ }
8255
+ return response;
8256
+ };
8257
+ this.deleteFeed = async (...args) => {
8258
+ const response = await super.deleteFeed(...args);
8259
+ const fid = `${args[0].feed_group_id}:${args[0].feed_id}`;
8260
+ const feed = this.activeFeeds[fid];
8261
+ if (feed) {
8262
+ handleFeedDeleted.call(feed, {
8263
+ created_at: /* @__PURE__ */ new Date()
8264
+ });
8265
+ if (!feed.currentState.watch) {
8266
+ delete this.activeFeeds[fid];
8267
+ this.activeActivities = this.activeActivities.filter(
8268
+ (activity) => getFeed.call(activity)?.feed !== fid
8269
+ );
8270
+ }
8271
+ }
8272
+ return response;
8273
+ };
8274
+ this.updateFeedMembers = async (...args) => {
8275
+ const response = await super.updateFeedMembers(...args);
8276
+ const fid = `${args[0].feed_group_id}:${args[0].feed_id}`;
8277
+ const feed = this.activeFeeds[fid];
8278
+ if (feed) {
8279
+ for (const member of response.added) {
8280
+ handleFeedMemberAdded.call(feed, { member }, false);
8281
+ }
8282
+ for (const member of response.updated) {
8283
+ handleFeedMemberUpdated.call(feed, { member }, false);
8284
+ }
8285
+ for (const memberId of response.removed_ids) {
8286
+ handleFeedMemberRemoved.call(feed, { member_id: memberId }, false);
8287
+ }
8288
+ }
8289
+ return response;
8290
+ };
8291
+ this.acceptFeedMemberInvite = async (...args) => {
8292
+ const response = await super.acceptFeedMemberInvite(...args);
8293
+ const fid = `${args[0].feed_group_id}:${args[0].feed_id}`;
8294
+ const feed = this.activeFeeds[fid];
8295
+ if (feed) {
8296
+ handleFeedMemberUpdated.call(feed, { member: response.member }, false);
8297
+ }
8298
+ return response;
8299
+ };
8300
+ this.rejectFeedMemberInvite = async (...args) => {
8301
+ const response = await super.rejectFeedMemberInvite(...args);
8302
+ const fid = `${args[0].feed_group_id}:${args[0].feed_id}`;
8303
+ const feed = this.activeFeeds[fid];
8304
+ if (feed) {
8305
+ handleFeedMemberUpdated.call(feed, { member: response.member }, false);
8306
+ }
8307
+ return response;
8308
+ };
7946
8309
  this.queryPollAnswers = async (request) => {
7947
8310
  const filter2 = request.filter ?? {};
7948
8311
  const queryPollAnswersFilter = {
@@ -8258,6 +8621,17 @@ class FeedsClient extends FeedsApi {
8258
8621
  });
8259
8622
  return response;
8260
8623
  }
8624
+ async acceptFollow(...args) {
8625
+ const response = await super.acceptFollow(...args);
8626
+ [
8627
+ response.follow.source_feed.feed,
8628
+ response.follow.target_feed.feed
8629
+ ].forEach((fid) => {
8630
+ const feeds = this.findAllActiveFeedsByFid(fid);
8631
+ feeds.forEach((f) => handleFollowUpdated.bind(f)(response, false));
8632
+ });
8633
+ return response;
8634
+ }
8261
8635
  // For follow API endpoints we update the state after HTTP response to allow queryFeeds with watch: false
8262
8636
  async follow(request) {
8263
8637
  const response = await super.follow(request);
@@ -8422,4 +8796,4 @@ exports.replaceUniqueArrayMerge = replaceUniqueArrayMerge;
8422
8796
  exports.shouldUpdateState = shouldUpdateState;
8423
8797
  exports.uniqueArrayMerge = uniqueArrayMerge;
8424
8798
  exports.updateEntityInArray = updateEntityInArray;
8425
- //# sourceMappingURL=feeds-client-tw63OGrd.js.map
8799
+ //# sourceMappingURL=feeds-client-C1c6lcS3.js.map