@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
@@ -1123,6 +1123,12 @@ decoders.QueryBookmarksResponse = (input) => {
1123
1123
  };
1124
1124
  return decode(typeMappings, input);
1125
1125
  };
1126
+ decoders.QueryCollectionsResponse = (input) => {
1127
+ const typeMappings = {
1128
+ collections: { type: "CollectionResponse", isSingle: false }
1129
+ };
1130
+ return decode(typeMappings, input);
1131
+ };
1126
1132
  decoders.QueryCommentReactionsResponse = (input) => {
1127
1133
  const typeMappings = {
1128
1134
  reactions: { type: "FeedsReactionResponse", isSingle: false }
@@ -1697,6 +1703,21 @@ class FeedsApi {
1697
1703
  decoders.DeleteActivitiesResponse?.(response.body);
1698
1704
  return { ...response.body, metadata: response.metadata };
1699
1705
  }
1706
+ async trackActivityMetrics(request) {
1707
+ const body = {
1708
+ events: request?.events
1709
+ };
1710
+ const response = await this.apiClient.sendRequest(
1711
+ "POST",
1712
+ "/api/v2/feeds/activities/metrics/track",
1713
+ void 0,
1714
+ void 0,
1715
+ body,
1716
+ "application/json"
1717
+ );
1718
+ decoders.TrackActivityMetricsResponse?.(response.body);
1719
+ return { ...response.body, metadata: response.metadata };
1720
+ }
1700
1721
  async queryActivities(request) {
1701
1722
  const body = {
1702
1723
  enrich_own_fields: request?.enrich_own_fields,
@@ -2109,6 +2130,25 @@ class FeedsApi {
2109
2130
  decoders.CreateCollectionsResponse?.(response.body);
2110
2131
  return { ...response.body, metadata: response.metadata };
2111
2132
  }
2133
+ async queryCollections(request) {
2134
+ const body = {
2135
+ limit: request?.limit,
2136
+ next: request?.next,
2137
+ prev: request?.prev,
2138
+ sort: request?.sort,
2139
+ filter: request?.filter
2140
+ };
2141
+ const response = await this.apiClient.sendRequest(
2142
+ "POST",
2143
+ "/api/v2/feeds/collections/query",
2144
+ void 0,
2145
+ void 0,
2146
+ body,
2147
+ "application/json"
2148
+ );
2149
+ decoders.QueryCollectionsResponse?.(response.body);
2150
+ return { ...response.body, metadata: response.metadata };
2151
+ }
2112
2152
  async getComments(request) {
2113
2153
  const queryParams = {
2114
2154
  object_id: request?.object_id,
@@ -2168,6 +2208,7 @@ class FeedsApi {
2168
2208
  async queryComments(request) {
2169
2209
  const body = {
2170
2210
  filter: request?.filter,
2211
+ id_around: request?.id_around,
2171
2212
  limit: request?.limit,
2172
2213
  next: request?.next,
2173
2214
  prev: request?.prev,
@@ -3199,15 +3240,26 @@ class FeedsApi {
3199
3240
  decoders.UpdateUserGroupResponse?.(response.body);
3200
3241
  return { ...response.body, metadata: response.metadata };
3201
3242
  }
3202
- async removeUserGroupMembers(request) {
3243
+ async addUserGroupMembers(request) {
3203
3244
  const pathParams = {
3204
3245
  id: request?.id
3205
3246
  };
3206
- const response = await this.apiClient.sendRequest("DELETE", "/api/v2/usergroups/{id}/members", pathParams, void 0);
3207
- decoders.RemoveUserGroupMembersResponse?.(response.body);
3247
+ const body = {
3248
+ member_ids: request?.member_ids,
3249
+ team_id: request?.team_id
3250
+ };
3251
+ const response = await this.apiClient.sendRequest(
3252
+ "POST",
3253
+ "/api/v2/usergroups/{id}/members",
3254
+ pathParams,
3255
+ void 0,
3256
+ body,
3257
+ "application/json"
3258
+ );
3259
+ decoders.AddUserGroupMembersResponse?.(response.body);
3208
3260
  return { ...response.body, metadata: response.metadata };
3209
3261
  }
3210
- async addUserGroupMembers(request) {
3262
+ async removeUserGroupMembers(request) {
3211
3263
  const pathParams = {
3212
3264
  id: request?.id
3213
3265
  };
@@ -3217,13 +3269,13 @@ class FeedsApi {
3217
3269
  };
3218
3270
  const response = await this.apiClient.sendRequest(
3219
3271
  "POST",
3220
- "/api/v2/usergroups/{id}/members",
3272
+ "/api/v2/usergroups/{id}/members/delete",
3221
3273
  pathParams,
3222
3274
  void 0,
3223
3275
  body,
3224
3276
  "application/json"
3225
3277
  );
3226
- decoders.AddUserGroupMembersResponse?.(response.body);
3278
+ decoders.RemoveUserGroupMembersResponse?.(response.body);
3227
3279
  return { ...response.body, metadata: response.metadata };
3228
3280
  }
3229
3281
  async queryUsers(request) {
@@ -4111,7 +4163,7 @@ const getRateLimitFromResponseHeader = (response_headers) => {
4111
4163
  };
4112
4164
  return result;
4113
4165
  };
4114
- const version = "1.0.0";
4166
+ const version = "1.1.0";
4115
4167
  const axios = axiosImport.default ?? axiosImport;
4116
4168
  class ApiClient {
4117
4169
  constructor(apiKey, tokenManager, connectionIdManager, options) {
@@ -4927,7 +4979,7 @@ const uniqueArrayMerge = (existingArray, arrayToMerge, getKey) => {
4927
4979
  });
4928
4980
  return existingArray.concat(filteredArrayToMerge);
4929
4981
  };
4930
- const replaceUniqueArrayMerge = (existingArray, arrayToMerge, getKey) => {
4982
+ const replaceUniqueArrayMerge = (existingArray, arrayToMerge, getKey, position) => {
4931
4983
  const existingMap = /* @__PURE__ */ new Map();
4932
4984
  (existingArray ?? []).forEach((item) => {
4933
4985
  existingMap.set(getKey(item), item);
@@ -4943,9 +4995,14 @@ const replaceUniqueArrayMerge = (existingArray, arrayToMerge, getKey) => {
4943
4995
  existingMap.delete(getKey(originalItem));
4944
4996
  }
4945
4997
  });
4946
- existingMap.forEach((item) => {
4947
- result.push(item);
4948
- });
4998
+ const newItemsInOrder = arrayToMerge.filter(
4999
+ (item) => existingMap.has(getKey(item))
5000
+ );
5001
+ if (position === "end") {
5002
+ newItemsInOrder.forEach((item) => result.push(item));
5003
+ } else {
5004
+ result.unshift(...newItemsInOrder);
5005
+ }
4949
5006
  return result;
4950
5007
  };
4951
5008
  const Constants = {
@@ -4992,24 +5049,25 @@ function getStateUpdateQueueId(...args) {
4992
5049
  const [data, prefix] = args;
4993
5050
  const toJoin = [prefix];
4994
5051
  switch (prefix) {
5052
+ case "activity-deleted": {
5053
+ return toJoin.concat([data.activity.id]).join("-");
5054
+ }
5055
+ case "activity-pinned":
5056
+ case "activity-unpinned": {
5057
+ return toJoin.concat([data.pinned_activity.activity.id]).join("-");
5058
+ }
4995
5059
  case "activity-updated": {
4996
5060
  return toJoin.concat([data.activity.id]).join("-");
4997
5061
  }
4998
5062
  case "activity-reaction-created":
4999
5063
  case "activity-reaction-deleted":
5000
5064
  case "activity-reaction-updated": {
5001
- return toJoin.concat([
5002
- data.activity.id,
5003
- data.reaction.type
5004
- ]).join("-");
5065
+ return toJoin.concat([data.activity.id, data.reaction.type]).join("-");
5005
5066
  }
5006
5067
  case "comment-reaction-created":
5007
5068
  case "comment-reaction-deleted":
5008
5069
  case "comment-reaction-updated": {
5009
- return toJoin.concat([
5010
- data.comment.id,
5011
- data.reaction.type
5012
- ]).join("-");
5070
+ return toJoin.concat([data.comment.id, data.reaction.type]).join("-");
5013
5071
  }
5014
5072
  case "comment-created":
5015
5073
  case "comment-deleted":
@@ -5021,6 +5079,13 @@ function getStateUpdateQueueId(...args) {
5021
5079
  case "follow-updated": {
5022
5080
  return toJoin.concat([data.source_feed.feed, data.target_feed.feed]).join("-");
5023
5081
  }
5082
+ case "feed-member-added":
5083
+ case "feed-member-updated": {
5084
+ return toJoin.concat([data.member.user.id]).join("-");
5085
+ }
5086
+ case "feed-member-removed": {
5087
+ return toJoin.concat([data.member_id]).join("-");
5088
+ }
5024
5089
  default: {
5025
5090
  ensureExhausted(data, "Encountered unknown state update queue prefix.");
5026
5091
  }
@@ -5189,7 +5254,12 @@ function handleFollowUpdated(eventOrResponse, fromWs) {
5189
5254
  newState ?? (newState = {
5190
5255
  ...currentState,
5191
5256
  // Update FeedResponse fields, that has the new follower/following count
5192
- ...follow.source_feed
5257
+ ...follow.source_feed,
5258
+ ...follow.source_feed.own_capabilities !== void 0 ? {
5259
+ own_capabilities: follow.source_feed.own_capabilities,
5260
+ own_follows: follow.source_feed.own_follows,
5261
+ own_followings: follow.source_feed.own_followings
5262
+ } : {}
5193
5263
  });
5194
5264
  const index = currentState.following?.findIndex(
5195
5265
  (f) => f.target_feed.feed === follow.target_feed.feed
@@ -5206,7 +5276,12 @@ function handleFollowUpdated(eventOrResponse, fromWs) {
5206
5276
  newState ?? (newState = {
5207
5277
  ...currentState,
5208
5278
  // Update FeedResponse fields, that has the new follower/following count
5209
- ...follow.target_feed
5279
+ ...follow.target_feed,
5280
+ ...follow.target_feed.own_capabilities !== void 0 ? {
5281
+ own_capabilities: follow.target_feed.own_capabilities,
5282
+ own_follows: follow.target_feed.own_follows,
5283
+ own_followings: follow.target_feed.own_followings
5284
+ } : {}
5210
5285
  });
5211
5286
  if (source.created_by.id === connectedUserId && currentState.own_follows) {
5212
5287
  const index2 = currentState.own_follows.findIndex(
@@ -5501,7 +5576,19 @@ function handleCommentReactionUpdated(payload, fromWs) {
5501
5576
  };
5502
5577
  });
5503
5578
  }
5504
- function handleFeedMemberAdded(event) {
5579
+ function handleFeedMemberAdded(event, fromWs) {
5580
+ if (!shouldUpdateState({
5581
+ stateUpdateQueueId: getStateUpdateQueueId(event, "feed-member-added"),
5582
+ stateUpdateQueue: this.stateUpdateQueue,
5583
+ watch: this.currentState.watch,
5584
+ fromWs,
5585
+ isTriggeredByConnectedUser: eventTriggeredByConnectedUser.call(
5586
+ this,
5587
+ event
5588
+ )
5589
+ })) {
5590
+ return;
5591
+ }
5505
5592
  const { connected_user: connectedUser } = this.client.state.getLatestValue();
5506
5593
  this.state.next((currentState) => {
5507
5594
  let newState;
@@ -5520,7 +5607,19 @@ function handleFeedMemberAdded(event) {
5520
5607
  return newState ?? currentState;
5521
5608
  });
5522
5609
  }
5523
- function handleFeedMemberUpdated(event) {
5610
+ function handleFeedMemberUpdated(event, fromWs) {
5611
+ if (!shouldUpdateState({
5612
+ stateUpdateQueueId: getStateUpdateQueueId(event, "feed-member-updated"),
5613
+ stateUpdateQueue: this.stateUpdateQueue,
5614
+ watch: this.currentState.watch,
5615
+ fromWs,
5616
+ isTriggeredByConnectedUser: eventTriggeredByConnectedUser.call(
5617
+ this,
5618
+ event
5619
+ )
5620
+ })) {
5621
+ return;
5622
+ }
5524
5623
  const { connected_user: connectedUser } = this.client.state.getLatestValue();
5525
5624
  this.state.next((currentState) => {
5526
5625
  const memberIndex = currentState.members?.findIndex(
@@ -5544,7 +5643,19 @@ function handleFeedMemberUpdated(event) {
5544
5643
  return newState ?? currentState;
5545
5644
  });
5546
5645
  }
5547
- function handleFeedMemberRemoved(event) {
5646
+ function handleFeedMemberRemoved(event, fromWs) {
5647
+ if (!shouldUpdateState({
5648
+ stateUpdateQueueId: getStateUpdateQueueId(event, "feed-member-removed"),
5649
+ stateUpdateQueue: this.stateUpdateQueue,
5650
+ watch: this.currentState.watch,
5651
+ fromWs,
5652
+ isTriggeredByConnectedUser: eventTriggeredByConnectedUser.call(
5653
+ this,
5654
+ event
5655
+ )
5656
+ })) {
5657
+ return;
5658
+ }
5548
5659
  const { connected_user: connectedUser } = this.client.state.getLatestValue();
5549
5660
  this.state.next((currentState) => {
5550
5661
  let newState;
@@ -5564,6 +5675,9 @@ function handleFeedMemberRemoved(event) {
5564
5675
  return newState ?? currentState;
5565
5676
  });
5566
5677
  }
5678
+ const isSameBookmark = (bookmark1, bookmark2) => {
5679
+ 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();
5680
+ };
5567
5681
  const sharedUpdateActivity$6 = ({
5568
5682
  currentActivity,
5569
5683
  event,
@@ -5571,7 +5685,9 @@ const sharedUpdateActivity$6 = ({
5571
5685
  }) => {
5572
5686
  let newOwnBookmarks = currentActivity.own_bookmarks;
5573
5687
  if (eventBelongsToCurrentUser) {
5574
- newOwnBookmarks = [...newOwnBookmarks, event.bookmark];
5688
+ newOwnBookmarks = currentActivity.own_bookmarks.filter(
5689
+ (bookmark) => !isSameBookmark(bookmark, event.bookmark)
5690
+ );
5575
5691
  }
5576
5692
  return {
5577
5693
  ...currentActivity,
@@ -5579,18 +5695,20 @@ const sharedUpdateActivity$6 = ({
5579
5695
  own_bookmarks: newOwnBookmarks
5580
5696
  };
5581
5697
  };
5582
- const addBookmarkToActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5698
+ const removeBookmarkFromActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5583
5699
  entities: activities,
5584
- matcher: (activity) => activity.id === event.bookmark.activity.id,
5700
+ matcher: (activity) => activity.id === event.bookmark.activity.id && (!eventBelongsToCurrentUser || activity.own_bookmarks.some((b) => isSameBookmark(b, event.bookmark))),
5585
5701
  updater: (matchedActivity) => sharedUpdateActivity$6({
5586
5702
  currentActivity: matchedActivity,
5587
5703
  event,
5588
5704
  eventBelongsToCurrentUser
5589
5705
  })
5590
5706
  });
5591
- const addBookmarkToPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
5707
+ const removeBookmarkFromPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
5592
5708
  entities: pinnedActivities,
5593
- matcher: (pinnedActivity) => pinnedActivity.activity.id === event.bookmark.activity.id,
5709
+ matcher: (pinnedActivity) => pinnedActivity.activity.id === event.bookmark.activity.id && (!eventBelongsToCurrentUser || pinnedActivity.activity.own_bookmarks.some(
5710
+ (b) => isSameBookmark(b, event.bookmark)
5711
+ )),
5594
5712
  updater: (matchedPinnedActivity) => {
5595
5713
  const newActivity = sharedUpdateActivity$6({
5596
5714
  currentActivity: matchedPinnedActivity.activity,
@@ -5606,7 +5724,7 @@ const addBookmarkToPinnedActivities = (event, pinnedActivities, eventBelongsToCu
5606
5724
  };
5607
5725
  }
5608
5726
  });
5609
- function handleBookmarkAdded(event) {
5727
+ function handleBookmarkDeleted(event) {
5610
5728
  const {
5611
5729
  activities: currentActivities,
5612
5730
  pinned_activities: currentPinnedActivities
@@ -5614,12 +5732,12 @@ function handleBookmarkAdded(event) {
5614
5732
  const { connected_user: connectedUser } = this.client.state.getLatestValue();
5615
5733
  const eventBelongsToCurrentUser = event.bookmark.user.id === connectedUser?.id;
5616
5734
  const [result1, result2] = [
5617
- addBookmarkToActivities(
5735
+ removeBookmarkFromActivities(
5618
5736
  event,
5619
5737
  currentActivities,
5620
5738
  eventBelongsToCurrentUser
5621
5739
  ),
5622
- addBookmarkToPinnedActivities(
5740
+ removeBookmarkFromPinnedActivities(
5623
5741
  event,
5624
5742
  currentPinnedActivities,
5625
5743
  eventBelongsToCurrentUser
@@ -5632,9 +5750,6 @@ function handleBookmarkAdded(event) {
5632
5750
  });
5633
5751
  }
5634
5752
  }
5635
- const isSameBookmark = (bookmark1, bookmark2) => {
5636
- return bookmark1.user.id === bookmark2.user.id && bookmark1.activity.id === bookmark2.activity.id && bookmark1.folder?.id === bookmark2.folder?.id;
5637
- };
5638
5753
  const sharedUpdateActivity$5 = ({
5639
5754
  currentActivity,
5640
5755
  event,
@@ -5642,9 +5757,7 @@ const sharedUpdateActivity$5 = ({
5642
5757
  }) => {
5643
5758
  let newOwnBookmarks = currentActivity.own_bookmarks;
5644
5759
  if (eventBelongsToCurrentUser) {
5645
- newOwnBookmarks = currentActivity.own_bookmarks.filter(
5646
- (bookmark) => !isSameBookmark(bookmark, event.bookmark)
5647
- );
5760
+ newOwnBookmarks = [...newOwnBookmarks, event.bookmark];
5648
5761
  }
5649
5762
  return {
5650
5763
  ...currentActivity,
@@ -5652,18 +5765,20 @@ const sharedUpdateActivity$5 = ({
5652
5765
  own_bookmarks: newOwnBookmarks
5653
5766
  };
5654
5767
  };
5655
- const removeBookmarkFromActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5768
+ const addBookmarkToActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5656
5769
  entities: activities,
5657
- matcher: (activity) => activity.id === event.bookmark.activity.id,
5770
+ matcher: (activity) => activity.id === event.bookmark.activity.id && (!eventBelongsToCurrentUser || !activity.own_bookmarks.some((b) => isSameBookmark(b, event.bookmark))),
5658
5771
  updater: (matchedActivity) => sharedUpdateActivity$5({
5659
5772
  currentActivity: matchedActivity,
5660
5773
  event,
5661
5774
  eventBelongsToCurrentUser
5662
5775
  })
5663
5776
  });
5664
- const removeBookmarkFromPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
5777
+ const addBookmarkToPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
5665
5778
  entities: pinnedActivities,
5666
- matcher: (pinnedActivity) => pinnedActivity.activity.id === event.bookmark.activity.id,
5779
+ matcher: (pinnedActivity) => pinnedActivity.activity.id === event.bookmark.activity.id && (!eventBelongsToCurrentUser || !pinnedActivity.activity.own_bookmarks.some(
5780
+ (b) => isSameBookmark(b, event.bookmark)
5781
+ )),
5667
5782
  updater: (matchedPinnedActivity) => {
5668
5783
  const newActivity = sharedUpdateActivity$5({
5669
5784
  currentActivity: matchedPinnedActivity.activity,
@@ -5679,7 +5794,7 @@ const removeBookmarkFromPinnedActivities = (event, pinnedActivities, eventBelong
5679
5794
  };
5680
5795
  }
5681
5796
  });
5682
- function handleBookmarkDeleted(event) {
5797
+ function handleBookmarkAdded(event) {
5683
5798
  const {
5684
5799
  activities: currentActivities,
5685
5800
  pinned_activities: currentPinnedActivities
@@ -5687,12 +5802,12 @@ function handleBookmarkDeleted(event) {
5687
5802
  const { connected_user: connectedUser } = this.client.state.getLatestValue();
5688
5803
  const eventBelongsToCurrentUser = event.bookmark.user.id === connectedUser?.id;
5689
5804
  const [result1, result2] = [
5690
- removeBookmarkFromActivities(
5805
+ addBookmarkToActivities(
5691
5806
  event,
5692
5807
  currentActivities,
5693
5808
  eventBelongsToCurrentUser
5694
5809
  ),
5695
- removeBookmarkFromPinnedActivities(
5810
+ addBookmarkToPinnedActivities(
5696
5811
  event,
5697
5812
  currentPinnedActivities,
5698
5813
  eventBelongsToCurrentUser
@@ -5713,7 +5828,7 @@ const sharedUpdateActivity$4 = ({
5713
5828
  let newOwnBookmarks = currentActivity.own_bookmarks;
5714
5829
  if (eventBelongsToCurrentUser) {
5715
5830
  const bookmarkIndex = newOwnBookmarks.findIndex(
5716
- (bookmark) => isSameBookmark(bookmark, event.bookmark)
5831
+ (bookmark) => bookmark.user.id === event.bookmark.user.id && bookmark.activity.id === event.bookmark.activity.id && bookmark.folder?.id === event.bookmark.folder?.id
5717
5832
  );
5718
5833
  if (bookmarkIndex !== -1) {
5719
5834
  newOwnBookmarks = [...newOwnBookmarks];
@@ -5728,7 +5843,7 @@ const sharedUpdateActivity$4 = ({
5728
5843
  };
5729
5844
  const updateBookmarkInActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5730
5845
  entities: activities,
5731
- matcher: (activity) => activity.id === event.bookmark.activity.id,
5846
+ matcher: (activity) => activity.id === event.bookmark.activity.id && (!eventBelongsToCurrentUser || !activity.own_bookmarks.some((b) => isSameBookmark(b, event.bookmark))),
5732
5847
  updater: (matchedActivity) => sharedUpdateActivity$4({
5733
5848
  currentActivity: matchedActivity,
5734
5849
  event,
@@ -5737,7 +5852,9 @@ const updateBookmarkInActivities = (event, activities, eventBelongsToCurrentUser
5737
5852
  });
5738
5853
  const updateBookmarkInPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
5739
5854
  entities: pinnedActivities,
5740
- matcher: (pinnedActivity) => pinnedActivity.activity.id === event.bookmark.activity.id,
5855
+ matcher: (pinnedActivity) => pinnedActivity.activity.id === event.bookmark.activity.id && (!eventBelongsToCurrentUser || !pinnedActivity.activity.own_bookmarks.some(
5856
+ (b) => isSameBookmark(b, event.bookmark)
5857
+ )),
5741
5858
  updater: (matchedPinnedActivity) => {
5742
5859
  const newActivity = sharedUpdateActivity$4({
5743
5860
  currentActivity: matchedPinnedActivity.activity,
@@ -5864,7 +5981,19 @@ const removePinnedActivityFromState = (activityResponse, pinnedActivities) => {
5864
5981
  return { changed: false, pinned_activities: pinnedActivities };
5865
5982
  }
5866
5983
  };
5867
- function handleActivityDeleted(event) {
5984
+ function handleActivityDeleted(event, fromWs) {
5985
+ if (!shouldUpdateState({
5986
+ stateUpdateQueueId: getStateUpdateQueueId(event, "activity-deleted"),
5987
+ stateUpdateQueue: this.stateUpdateQueue,
5988
+ watch: this.currentState.watch,
5989
+ fromWs,
5990
+ isTriggeredByConnectedUser: eventTriggeredByConnectedUser.call(
5991
+ this,
5992
+ event
5993
+ )
5994
+ })) {
5995
+ return;
5996
+ }
5868
5997
  const {
5869
5998
  activities: currentActivities,
5870
5999
  pinned_activities: currentPinnedActivities
@@ -6210,53 +6339,133 @@ function handleActivityReactionUpdated(payload, fromWs) {
6210
6339
  });
6211
6340
  }
6212
6341
  }
6213
- const updateNotificationStatusFromActivityMarked = (event, currentNotificationStatus, aggregatedActivities = []) => {
6214
- if (!currentNotificationStatus) {
6215
- return {
6216
- changed: false
6217
- };
6218
- }
6219
- const newState = {
6220
- ...currentNotificationStatus
6221
- };
6222
- if (event.mark_all_read) {
6223
- const allGroupIds = aggregatedActivities.map((activity) => activity.group);
6224
- newState.read_activities = [
6225
- .../* @__PURE__ */ new Set([
6226
- ...currentNotificationStatus.read_activities ?? [],
6227
- ...allGroupIds
6228
- ])
6229
- ];
6342
+ function handleActivityPinned(event, fromWs) {
6343
+ if (!shouldUpdateState({
6344
+ stateUpdateQueueId: getStateUpdateQueueId(event, "activity-pinned"),
6345
+ stateUpdateQueue: this.stateUpdateQueue,
6346
+ watch: this.currentState.watch,
6347
+ fromWs,
6348
+ isTriggeredByConnectedUser: eventTriggeredByConnectedUser.call(
6349
+ this,
6350
+ event
6351
+ )
6352
+ })) {
6353
+ return;
6230
6354
  }
6231
- if (event.mark_read && event.mark_read.length > 0) {
6232
- newState.read_activities = [
6233
- .../* @__PURE__ */ new Set([
6234
- ...currentNotificationStatus?.read_activities ?? [],
6235
- ...event.mark_read
6236
- ])
6237
- ];
6355
+ this.state.next((currentState) => {
6356
+ const newState = {
6357
+ ...currentState
6358
+ };
6359
+ const pinnedActivity = {
6360
+ ...event.pinned_activity,
6361
+ user: event.user,
6362
+ updated_at: /* @__PURE__ */ new Date()
6363
+ };
6364
+ newState.pinned_activities = currentState.pinned_activities ? [pinnedActivity, ...currentState.pinned_activities] : [pinnedActivity];
6365
+ return newState;
6366
+ });
6367
+ }
6368
+ function handleActivityUnpinned(event, fromWs) {
6369
+ if (!shouldUpdateState({
6370
+ stateUpdateQueueId: getStateUpdateQueueId(event, "activity-unpinned"),
6371
+ stateUpdateQueue: this.stateUpdateQueue,
6372
+ watch: this.currentState.watch,
6373
+ fromWs,
6374
+ isTriggeredByConnectedUser: eventTriggeredByConnectedUser.call(
6375
+ this,
6376
+ event
6377
+ )
6378
+ })) {
6379
+ return;
6238
6380
  }
6239
- if (event.mark_all_seen) {
6240
- newState.last_seen_at = /* @__PURE__ */ new Date();
6381
+ this.state.next((currentState) => {
6382
+ let newState;
6383
+ const index = currentState.pinned_activities?.findIndex(
6384
+ (pinnedActivity) => pinnedActivity.activity.id === event.pinned_activity.activity.id
6385
+ ) ?? -1;
6386
+ if (index >= 0) {
6387
+ newState ?? (newState = {
6388
+ ...currentState
6389
+ });
6390
+ const newPinnedActivities = [...currentState.pinned_activities];
6391
+ newPinnedActivities.splice(index, 1);
6392
+ newState.pinned_activities = newPinnedActivities;
6393
+ }
6394
+ return newState ?? currentState;
6395
+ });
6396
+ }
6397
+ const isPin = (entity) => {
6398
+ return "activity" in entity;
6399
+ };
6400
+ const updateActivityFromFeedback = (feedback, activities) => {
6401
+ if (!activities) {
6402
+ return {
6403
+ changed: false,
6404
+ entities: []
6405
+ };
6241
6406
  }
6242
- return {
6243
- changed: true,
6244
- data: { notification_status: newState }
6245
- };
6407
+ return updateEntityInArray({
6408
+ entities: activities,
6409
+ matcher: (e) => {
6410
+ const newHidden = feedback.value === "true";
6411
+ if (isPin(e)) {
6412
+ return e.activity.id === feedback.activity_id && e.activity.hidden !== newHidden;
6413
+ }
6414
+ return e.id === feedback.activity_id && e.hidden !== newHidden;
6415
+ },
6416
+ updater: (e) => {
6417
+ if (isPin(e)) {
6418
+ return {
6419
+ ...e,
6420
+ activity: {
6421
+ ...e.activity,
6422
+ hidden: feedback.value === "true"
6423
+ }
6424
+ };
6425
+ } else {
6426
+ return {
6427
+ ...e,
6428
+ hidden: feedback.value === "true"
6429
+ };
6430
+ }
6431
+ }
6432
+ });
6246
6433
  };
6247
- function handleActivityMarked(event) {
6248
- const result = updateNotificationStatusFromActivityMarked(
6249
- event,
6250
- this.currentState.notification_status,
6251
- this.currentState.aggregated_activities
6252
- );
6253
- if (result.changed) {
6434
+ function handleActivityFeedback(event) {
6435
+ const {
6436
+ activities: currentActivities,
6437
+ pinned_activities: currentPinnedActivities
6438
+ } = this.currentState;
6439
+ const { connected_user: connectedUser } = this.client.state.getLatestValue();
6440
+ const eventBelongsToCurrentUser = event.activity_feedback.user.id === connectedUser?.id;
6441
+ if (!eventBelongsToCurrentUser || event.activity_feedback.action !== "hide") {
6442
+ return;
6443
+ }
6444
+ const [result1, result2] = [
6445
+ updateActivityFromFeedback(event.activity_feedback, currentActivities),
6446
+ updateActivityFromFeedback(
6447
+ event.activity_feedback,
6448
+ currentPinnedActivities
6449
+ )
6450
+ ];
6451
+ if (result1.changed || result2.changed) {
6254
6452
  this.state.partialNext({
6255
- notification_status: result.data?.notification_status
6453
+ activities: result1.entities,
6454
+ pinned_activities: result2.entities
6256
6455
  });
6257
6456
  }
6258
6457
  }
6458
+ function handleFeedDeleted(event) {
6459
+ if (this.currentState.deleted_at) {
6460
+ return;
6461
+ }
6462
+ this.state.partialNext({ deleted_at: event.created_at });
6463
+ }
6259
6464
  function handleFeedUpdated(event) {
6465
+ const currentUpdatedAt = this.currentState.updated_at;
6466
+ if (currentUpdatedAt && event.feed.updated_at && currentUpdatedAt.getTime() >= event.feed.updated_at.getTime()) {
6467
+ return;
6468
+ }
6260
6469
  this.state.partialNext({ ...event.feed });
6261
6470
  }
6262
6471
  const addAggregatedActivitiesToState = (newAggregatedActivities, aggregatedActivities, position) => {
@@ -6305,11 +6514,20 @@ const addAggregatedActivitiesToState = (newAggregatedActivities, aggregatedActiv
6305
6514
  (a) => a.group
6306
6515
  );
6307
6516
  break;
6308
- case "replace":
6517
+ case "replace-then-end":
6309
6518
  result.aggregated_activities = replaceUniqueArrayMerge(
6310
6519
  aggregatedActivities ?? [],
6311
6520
  newAggregatedActivities,
6312
- (a) => a.group
6521
+ (a) => a.group,
6522
+ "end"
6523
+ );
6524
+ break;
6525
+ case "replace-then-start":
6526
+ result.aggregated_activities = replaceUniqueArrayMerge(
6527
+ aggregatedActivities ?? [],
6528
+ newAggregatedActivities,
6529
+ (a) => a.group,
6530
+ "start"
6313
6531
  );
6314
6532
  break;
6315
6533
  }
@@ -6336,7 +6554,7 @@ const updateNotificationStatus = (newNotificationStatus, currentNotificationStat
6336
6554
  };
6337
6555
  }
6338
6556
  };
6339
- const updateNotificationFeedFromEvent = (event, currentAggregatedActivities, currentNotificationStatus) => {
6557
+ const updateNotificationFeedFromEvent = (event, currentAggregatedActivities, currentNotificationStatus, currentActivities) => {
6340
6558
  const updates = {};
6341
6559
  if (event.notification_status) {
6342
6560
  const notificationStatusResult = updateNotificationStatus(
@@ -6347,11 +6565,47 @@ const updateNotificationFeedFromEvent = (event, currentAggregatedActivities, cur
6347
6565
  updates.notification_status = notificationStatusResult.notification_status;
6348
6566
  }
6349
6567
  }
6568
+ const effectiveStatus = event.notification_status ?? currentNotificationStatus;
6569
+ const lastReadAt = effectiveStatus?.last_read_at;
6570
+ const lastSeenAt = effectiveStatus?.last_seen_at;
6571
+ const readActivities = effectiveStatus?.read_activities ?? [];
6572
+ const seenActivities = effectiveStatus?.seen_activities ?? [];
6573
+ if (currentActivities?.length && !currentAggregatedActivities?.length && effectiveStatus) {
6574
+ let anyChanged = false;
6575
+ const updatedActivities = currentActivities.map((activity) => {
6576
+ const isRead = lastReadAt != null && activity.updated_at.getTime() < lastReadAt.getTime() || readActivities.includes(activity.id);
6577
+ const isSeen = lastSeenAt != null && activity.updated_at.getTime() < lastSeenAt.getTime() || seenActivities.includes(activity.id);
6578
+ if (activity.is_read !== isRead || activity.is_seen !== isSeen) {
6579
+ anyChanged = true;
6580
+ return { ...activity, is_read: isRead, is_seen: isSeen };
6581
+ }
6582
+ return activity;
6583
+ });
6584
+ if (anyChanged) {
6585
+ updates.activities = updatedActivities;
6586
+ }
6587
+ }
6588
+ if (currentAggregatedActivities?.length && effectiveStatus) {
6589
+ const baseAggregated = currentAggregatedActivities;
6590
+ let anyChanged = false;
6591
+ const updatedAggregated = baseAggregated.map((group) => {
6592
+ const isRead = lastReadAt != null && group.updated_at.getTime() < lastReadAt.getTime() || readActivities.includes(group.group);
6593
+ const isSeen = lastSeenAt != null && group.updated_at.getTime() < lastSeenAt.getTime() || seenActivities.includes(group.group);
6594
+ if (group.is_read !== isRead || group.is_seen !== isSeen) {
6595
+ anyChanged = true;
6596
+ return { ...group, is_read: isRead, is_seen: isSeen };
6597
+ }
6598
+ return group;
6599
+ });
6600
+ if (anyChanged) {
6601
+ updates.aggregated_activities = updatedAggregated;
6602
+ }
6603
+ }
6350
6604
  if (event.aggregated_activities && currentAggregatedActivities) {
6351
6605
  const aggregatedActivitiesResult = addAggregatedActivitiesToState(
6352
6606
  event.aggregated_activities,
6353
- currentAggregatedActivities,
6354
- "start"
6607
+ updates.aggregated_activities ?? currentAggregatedActivities,
6608
+ "replace-then-start"
6355
6609
  );
6356
6610
  if (aggregatedActivitiesResult.changed) {
6357
6611
  updates.aggregated_activities = aggregatedActivitiesResult.aggregated_activities;
@@ -6371,12 +6625,14 @@ function handleNotificationFeedUpdated(event) {
6371
6625
  const result = updateNotificationFeedFromEvent(
6372
6626
  event,
6373
6627
  this.currentState.aggregated_activities,
6374
- this.currentState.notification_status
6628
+ this.currentState.notification_status,
6629
+ this.currentState.activities
6375
6630
  );
6376
6631
  if (result.changed) {
6377
6632
  this.state.partialNext({
6378
6633
  notification_status: result.data?.notification_status,
6379
- aggregated_activities: result.data?.aggregated_activities
6634
+ aggregated_activities: result.data?.aggregated_activities,
6635
+ activities: result.data?.activities ?? this.currentState.activities
6380
6636
  });
6381
6637
  }
6382
6638
  }
@@ -6426,7 +6682,7 @@ function updateStoriesFeedFromEvent(aggregatedActivities, activities, event) {
6426
6682
  const aggregatedActivitiesResult = addAggregatedActivitiesToState(
6427
6683
  event.aggregated_activities,
6428
6684
  aggregatedActivities,
6429
- "replace"
6685
+ "replace-then-end"
6430
6686
  );
6431
6687
  if (aggregatedActivitiesResult.changed) {
6432
6688
  result.data.aggregated_activities = aggregatedActivitiesResult.aggregated_activities;
@@ -6520,61 +6776,6 @@ async function withRetry(fn, options = {}) {
6520
6776
  }
6521
6777
  throw lastError;
6522
6778
  }
6523
- const isPin = (entity) => {
6524
- return "activity" in entity;
6525
- };
6526
- const updateActivityFromFeedback = (feedback, activities) => {
6527
- if (!activities) {
6528
- return {
6529
- changed: false,
6530
- entities: []
6531
- };
6532
- }
6533
- return updateEntityInArray({
6534
- entities: activities,
6535
- matcher: (e) => isPin(e) ? e.activity.id === feedback.activity_id : e.id === feedback.activity_id,
6536
- updater: (e) => {
6537
- if (isPin(e)) {
6538
- return {
6539
- ...e,
6540
- activity: {
6541
- ...e.activity,
6542
- hidden: feedback.value === "true"
6543
- }
6544
- };
6545
- } else {
6546
- return {
6547
- ...e,
6548
- hidden: feedback.value === "true"
6549
- };
6550
- }
6551
- }
6552
- });
6553
- };
6554
- function handleActivityFeedback(event) {
6555
- const {
6556
- activities: currentActivities,
6557
- pinned_activities: currentPinnedActivities
6558
- } = this.currentState;
6559
- const { connected_user: connectedUser } = this.client.state.getLatestValue();
6560
- const eventBelongsToCurrentUser = event.activity_feedback.user.id === connectedUser?.id;
6561
- if (!eventBelongsToCurrentUser || event.activity_feedback.action !== "hide") {
6562
- return;
6563
- }
6564
- const [result1, result2] = [
6565
- updateActivityFromFeedback(event.activity_feedback, currentActivities),
6566
- updateActivityFromFeedback(
6567
- event.activity_feedback,
6568
- currentPinnedActivities
6569
- )
6570
- ];
6571
- if (result1.changed || result2.changed) {
6572
- this.state.partialNext({
6573
- activities: result1.entities,
6574
- pinned_activities: result2.entities
6575
- });
6576
- }
6577
- }
6578
6779
  const deepEqual = (x, y) => {
6579
6780
  if (x === y) {
6580
6781
  return true;
@@ -6701,7 +6902,7 @@ const _Feed = class _Feed extends FeedApi {
6701
6902
  "feeds.comment.deleted": handleCommentDeleted.bind(this),
6702
6903
  "feeds.comment.updated": handleCommentUpdated.bind(this),
6703
6904
  "feeds.feed.created": _Feed.noop,
6704
- "feeds.feed.deleted": _Feed.noop,
6905
+ "feeds.feed.deleted": handleFeedDeleted.bind(this),
6705
6906
  "feeds.feed.updated": handleFeedUpdated.bind(this),
6706
6907
  "feeds.feed_group.changed": _Feed.noop,
6707
6908
  "feeds.feed_group.deleted": _Feed.noop,
@@ -6724,9 +6925,9 @@ const _Feed = class _Feed extends FeedApi {
6724
6925
  "feeds.poll.vote_casted": _Feed.noop,
6725
6926
  "feeds.poll.vote_changed": _Feed.noop,
6726
6927
  "feeds.poll.vote_removed": _Feed.noop,
6727
- "feeds.activity.pinned": _Feed.noop,
6728
- "feeds.activity.unpinned": _Feed.noop,
6729
- "feeds.activity.marked": handleActivityMarked.bind(this),
6928
+ "feeds.activity.pinned": handleActivityPinned.bind(this),
6929
+ "feeds.activity.unpinned": handleActivityUnpinned.bind(this),
6930
+ "feeds.activity.marked": _Feed.noop,
6730
6931
  "moderation.custom_action": _Feed.noop,
6731
6932
  "moderation.flagged": _Feed.noop,
6732
6933
  "moderation.mark_reviewed": _Feed.noop,
@@ -7840,6 +8041,53 @@ class FeedsClient extends FeedsApi {
7840
8041
  }
7841
8042
  return response;
7842
8043
  };
8044
+ this.updateActivityPartial = async (...args) => {
8045
+ const response = await super.updateActivityPartial(...args);
8046
+ for (const feed of this.allActiveFeeds) {
8047
+ handleActivityUpdated.bind(feed)(response, false);
8048
+ }
8049
+ return response;
8050
+ };
8051
+ this.deleteActivity = async (...args) => {
8052
+ const response = await super.deleteActivity(...args);
8053
+ const activityId = args[0].id;
8054
+ for (const feed of this.allActiveFeeds) {
8055
+ handleActivityDeleted.bind(feed)(
8056
+ { activity: { id: activityId } },
8057
+ false
8058
+ );
8059
+ }
8060
+ this.activeActivities = this.activeActivities.filter(
8061
+ (activity) => activity.id !== activityId
8062
+ );
8063
+ return response;
8064
+ };
8065
+ this.activityFeedback = async (request) => {
8066
+ const response = await super.activityFeedback(request);
8067
+ if (request.hide !== void 0) {
8068
+ const feedback = {
8069
+ activity_id: request.activity_id,
8070
+ value: request.hide ? "true" : "false"
8071
+ };
8072
+ for (const feed of this.allActiveFeeds) {
8073
+ const {
8074
+ activities: currentActivities,
8075
+ pinned_activities: currentPinnedActivities
8076
+ } = feed.currentState;
8077
+ const [result1, result2] = [
8078
+ updateActivityFromFeedback(feedback, currentActivities),
8079
+ updateActivityFromFeedback(feedback, currentPinnedActivities)
8080
+ ];
8081
+ if (result1.changed || result2.changed) {
8082
+ feed.state.partialNext({
8083
+ activities: result1.entities,
8084
+ pinned_activities: result2.entities
8085
+ });
8086
+ }
8087
+ }
8088
+ }
8089
+ return response;
8090
+ };
7843
8091
  this.addComment = async (request) => {
7844
8092
  const response = await super.addComment(request);
7845
8093
  const { comment } = response;
@@ -7925,6 +8173,121 @@ class FeedsClient extends FeedsApi {
7925
8173
  }
7926
8174
  return response;
7927
8175
  };
8176
+ this.addBookmark = async (request) => {
8177
+ const response = await super.addBookmark(request);
8178
+ for (const feed of this.allActiveFeeds) {
8179
+ handleBookmarkAdded.bind(feed)(response);
8180
+ }
8181
+ return response;
8182
+ };
8183
+ this.updateBookmark = async (request) => {
8184
+ const response = await super.updateBookmark(request);
8185
+ for (const feed of this.allActiveFeeds) {
8186
+ handleBookmarkUpdated.bind(feed)(response);
8187
+ }
8188
+ return response;
8189
+ };
8190
+ this.deleteBookmark = async (request) => {
8191
+ const response = await super.deleteBookmark(request);
8192
+ for (const feed of this.allActiveFeeds) {
8193
+ handleBookmarkDeleted.bind(feed)(response);
8194
+ }
8195
+ return response;
8196
+ };
8197
+ this.pinActivity = async (...args) => {
8198
+ const response = await super.pinActivity(...args);
8199
+ const feedIds = response.activity?.feeds ?? (response.feed ? [response.feed] : []);
8200
+ for (const fid of feedIds) {
8201
+ const feed = this.activeFeeds[fid];
8202
+ if (feed) {
8203
+ handleActivityPinned.bind(feed)(
8204
+ { pinned_activity: response },
8205
+ false
8206
+ );
8207
+ }
8208
+ }
8209
+ return response;
8210
+ };
8211
+ this.unpinActivity = async (...args) => {
8212
+ const response = await super.unpinActivity(...args);
8213
+ const feedIds = response.activity?.feeds ?? (response.feed ? [response.feed] : []);
8214
+ for (const fid of feedIds) {
8215
+ const feed = this.activeFeeds[fid];
8216
+ if (feed) {
8217
+ handleActivityUnpinned.bind(feed)(
8218
+ {
8219
+ pinned_activity: {
8220
+ ...response,
8221
+ created_at: /* @__PURE__ */ new Date()
8222
+ }
8223
+ },
8224
+ false
8225
+ );
8226
+ }
8227
+ }
8228
+ return response;
8229
+ };
8230
+ this.updateFeed = async (...args) => {
8231
+ const response = await super.updateFeed(...args);
8232
+ const fid = `${args[0].feed_group_id}:${args[0].feed_id}`;
8233
+ const feed = this.activeFeeds[fid];
8234
+ if (feed) {
8235
+ handleFeedUpdated.call(feed, { feed: response.feed });
8236
+ }
8237
+ return response;
8238
+ };
8239
+ this.deleteFeed = async (...args) => {
8240
+ const response = await super.deleteFeed(...args);
8241
+ const fid = `${args[0].feed_group_id}:${args[0].feed_id}`;
8242
+ const feed = this.activeFeeds[fid];
8243
+ if (feed) {
8244
+ handleFeedDeleted.call(feed, {
8245
+ created_at: /* @__PURE__ */ new Date()
8246
+ });
8247
+ if (!feed.currentState.watch) {
8248
+ delete this.activeFeeds[fid];
8249
+ this.activeActivities = this.activeActivities.filter(
8250
+ (activity) => getFeed.call(activity)?.feed !== fid
8251
+ );
8252
+ }
8253
+ }
8254
+ return response;
8255
+ };
8256
+ this.updateFeedMembers = async (...args) => {
8257
+ const response = await super.updateFeedMembers(...args);
8258
+ const fid = `${args[0].feed_group_id}:${args[0].feed_id}`;
8259
+ const feed = this.activeFeeds[fid];
8260
+ if (feed) {
8261
+ for (const member of response.added) {
8262
+ handleFeedMemberAdded.call(feed, { member }, false);
8263
+ }
8264
+ for (const member of response.updated) {
8265
+ handleFeedMemberUpdated.call(feed, { member }, false);
8266
+ }
8267
+ for (const memberId of response.removed_ids) {
8268
+ handleFeedMemberRemoved.call(feed, { member_id: memberId }, false);
8269
+ }
8270
+ }
8271
+ return response;
8272
+ };
8273
+ this.acceptFeedMemberInvite = async (...args) => {
8274
+ const response = await super.acceptFeedMemberInvite(...args);
8275
+ const fid = `${args[0].feed_group_id}:${args[0].feed_id}`;
8276
+ const feed = this.activeFeeds[fid];
8277
+ if (feed) {
8278
+ handleFeedMemberUpdated.call(feed, { member: response.member }, false);
8279
+ }
8280
+ return response;
8281
+ };
8282
+ this.rejectFeedMemberInvite = async (...args) => {
8283
+ const response = await super.rejectFeedMemberInvite(...args);
8284
+ const fid = `${args[0].feed_group_id}:${args[0].feed_id}`;
8285
+ const feed = this.activeFeeds[fid];
8286
+ if (feed) {
8287
+ handleFeedMemberUpdated.call(feed, { member: response.member }, false);
8288
+ }
8289
+ return response;
8290
+ };
7928
8291
  this.queryPollAnswers = async (request) => {
7929
8292
  const filter = request.filter ?? {};
7930
8293
  const queryPollAnswersFilter = {
@@ -8240,6 +8603,17 @@ class FeedsClient extends FeedsApi {
8240
8603
  });
8241
8604
  return response;
8242
8605
  }
8606
+ async acceptFollow(...args) {
8607
+ const response = await super.acceptFollow(...args);
8608
+ [
8609
+ response.follow.source_feed.feed,
8610
+ response.follow.target_feed.feed
8611
+ ].forEach((fid) => {
8612
+ const feeds = this.findAllActiveFeedsByFid(fid);
8613
+ feeds.forEach((f) => handleFollowUpdated.bind(f)(response, false));
8614
+ });
8615
+ return response;
8616
+ }
8243
8617
  // For follow API endpoints we update the state after HTTP response to allow queryFeeds with watch: false
8244
8618
  async follow(request) {
8245
8619
  const response = await super.follow(request);
@@ -8406,4 +8780,4 @@ export {
8406
8780
  shouldUpdateState as s,
8407
8781
  uniqueArrayMerge as u
8408
8782
  };
8409
- //# sourceMappingURL=feeds-client-B03y08Kq.mjs.map
8783
+ //# sourceMappingURL=feeds-client-jtUTE4AC.mjs.map