@stream-io/feeds-client 0.3.51 → 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 (121) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/cjs/index.js +2 -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 +15 -14
  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-B4zeBggL.js → feeds-client-C1c6lcS3.js} +705 -214
  11. package/dist/feeds-client-C1c6lcS3.js.map +1 -0
  12. package/dist/{feeds-client-DeAqnd1a.mjs → feeds-client-jtUTE4AC.mjs} +711 -220
  13. package/dist/feeds-client-jtUTE4AC.mjs.map +1 -0
  14. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  15. package/dist/types/activity-with-state-updates/activity-with-state-updates.d.ts.map +1 -1
  16. package/dist/types/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivityRead.d.ts +6 -2
  17. package/dist/types/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivityRead.d.ts.map +1 -1
  18. package/dist/types/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivitySeen.d.ts +6 -2
  19. package/dist/types/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivitySeen.d.ts.map +1 -1
  20. package/dist/types/feed/activity-filter.d.ts +11 -0
  21. package/dist/types/feed/activity-filter.d.ts.map +1 -0
  22. package/dist/types/feed/event-handlers/activity/handle-activity-added.d.ts +3 -2
  23. package/dist/types/feed/event-handlers/activity/handle-activity-added.d.ts.map +1 -1
  24. package/dist/types/feed/event-handlers/activity/handle-activity-deleted.d.ts +3 -2
  25. package/dist/types/feed/event-handlers/activity/handle-activity-deleted.d.ts.map +1 -1
  26. package/dist/types/feed/event-handlers/activity/handle-activity-feedback.d.ts +5 -0
  27. package/dist/types/feed/event-handlers/activity/handle-activity-feedback.d.ts.map +1 -1
  28. package/dist/types/feed/event-handlers/activity/handle-activity-pinned.d.ts +3 -2
  29. package/dist/types/feed/event-handlers/activity/handle-activity-pinned.d.ts.map +1 -1
  30. package/dist/types/feed/event-handlers/activity/handle-activity-unpinned.d.ts +3 -2
  31. package/dist/types/feed/event-handlers/activity/handle-activity-unpinned.d.ts.map +1 -1
  32. package/dist/types/feed/event-handlers/activity/handle-activity-updated.d.ts.map +1 -1
  33. package/dist/types/feed/event-handlers/activity/index.d.ts +3 -1
  34. package/dist/types/feed/event-handlers/activity/index.d.ts.map +1 -1
  35. package/dist/types/feed/event-handlers/activity-updater.d.ts +1 -0
  36. package/dist/types/feed/event-handlers/activity-updater.d.ts.map +1 -1
  37. package/dist/types/feed/event-handlers/add-aggregated-activities-to-state.d.ts +1 -1
  38. package/dist/types/feed/event-handlers/add-aggregated-activities-to-state.d.ts.map +1 -1
  39. package/dist/types/feed/event-handlers/bookmark/handle-bookmark-added.d.ts +6 -5
  40. package/dist/types/feed/event-handlers/bookmark/handle-bookmark-added.d.ts.map +1 -1
  41. package/dist/types/feed/event-handlers/bookmark/handle-bookmark-deleted.d.ts +6 -5
  42. package/dist/types/feed/event-handlers/bookmark/handle-bookmark-deleted.d.ts.map +1 -1
  43. package/dist/types/feed/event-handlers/bookmark/handle-bookmark-updated.d.ts +6 -5
  44. package/dist/types/feed/event-handlers/bookmark/handle-bookmark-updated.d.ts.map +1 -1
  45. package/dist/types/feed/event-handlers/comment/handle-comment-updated.d.ts.map +1 -1
  46. package/dist/types/feed/event-handlers/feed/handle-feed-deleted.d.ts +4 -0
  47. package/dist/types/feed/event-handlers/feed/handle-feed-deleted.d.ts.map +1 -0
  48. package/dist/types/feed/event-handlers/feed/handle-feed-updated.d.ts.map +1 -1
  49. package/dist/types/feed/event-handlers/feed/index.d.ts +1 -0
  50. package/dist/types/feed/event-handlers/feed/index.d.ts.map +1 -1
  51. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-added.d.ts +3 -2
  52. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-added.d.ts.map +1 -1
  53. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-removed.d.ts +3 -2
  54. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-removed.d.ts.map +1 -1
  55. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-updated.d.ts +3 -2
  56. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-updated.d.ts.map +1 -1
  57. package/dist/types/feed/event-handlers/follow/handle-follow-created.d.ts +2 -2
  58. package/dist/types/feed/event-handlers/follow/handle-follow-created.d.ts.map +1 -1
  59. package/dist/types/feed/event-handlers/follow/handle-follow-updated.d.ts.map +1 -1
  60. package/dist/types/feed/event-handlers/notification-feed/handle-notification-feed-updated.d.ts +3 -2
  61. package/dist/types/feed/event-handlers/notification-feed/handle-notification-feed-updated.d.ts.map +1 -1
  62. package/dist/types/feed/feed.d.ts +17 -12
  63. package/dist/types/feed/feed.d.ts.map +1 -1
  64. package/dist/types/feeds-client/apply-new-activity-to-active-feeds.d.ts +4 -0
  65. package/dist/types/feeds-client/apply-new-activity-to-active-feeds.d.ts.map +1 -0
  66. package/dist/types/feeds-client/feeds-client.d.ts +29 -8
  67. package/dist/types/feeds-client/feeds-client.d.ts.map +1 -1
  68. package/dist/types/gen/feeds/FeedsApi.d.ts +6 -4
  69. package/dist/types/gen/feeds/FeedsApi.d.ts.map +1 -1
  70. package/dist/types/gen/models/index.d.ts +40 -2
  71. package/dist/types/gen/models/index.d.ts.map +1 -1
  72. package/dist/types/index.d.ts +1 -0
  73. package/dist/types/index.d.ts.map +1 -1
  74. package/dist/types/types.d.ts +15 -0
  75. package/dist/types/types.d.ts.map +1 -1
  76. package/dist/types/utils/state-update-queue.d.ts +11 -2
  77. package/dist/types/utils/state-update-queue.d.ts.map +1 -1
  78. package/dist/types/utils/unique-array-merge.d.ts +1 -1
  79. package/dist/types/utils/unique-array-merge.d.ts.map +1 -1
  80. package/package.json +2 -1
  81. package/src/activity-with-state-updates/activity-with-state-updates.ts +8 -2
  82. package/src/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivityRead.ts +6 -20
  83. package/src/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivitySeen.ts +6 -20
  84. package/src/feed/activity-filter.ts +44 -0
  85. package/src/feed/event-handlers/activity/handle-activity-added.ts +22 -8
  86. package/src/feed/event-handlers/activity/handle-activity-deleted.ts +28 -2
  87. package/src/feed/event-handlers/activity/handle-activity-feedback.ts +17 -7
  88. package/src/feed/event-handlers/activity/handle-activity-pinned.ts +25 -3
  89. package/src/feed/event-handlers/activity/handle-activity-unpinned.ts +25 -2
  90. package/src/feed/event-handlers/activity/handle-activity-updated.ts +5 -1
  91. package/src/feed/event-handlers/activity/index.ts +3 -1
  92. package/src/feed/event-handlers/add-aggregated-activities-to-state.ts +11 -2
  93. package/src/feed/event-handlers/bookmark/handle-bookmark-added.ts +20 -11
  94. package/src/feed/event-handlers/bookmark/handle-bookmark-deleted.ts +21 -11
  95. package/src/feed/event-handlers/bookmark/handle-bookmark-updated.ts +24 -10
  96. package/src/feed/event-handlers/comment/handle-comment-updated.ts +11 -10
  97. package/src/feed/event-handlers/feed/handle-feed-deleted.ts +12 -0
  98. package/src/feed/event-handlers/feed/handle-feed-updated.ts +8 -0
  99. package/src/feed/event-handlers/feed/index.ts +1 -0
  100. package/src/feed/event-handlers/feed-member/handle-feed-member-added.ts +25 -2
  101. package/src/feed/event-handlers/feed-member/handle-feed-member-removed.ts +25 -2
  102. package/src/feed/event-handlers/feed-member/handle-feed-member-updated.ts +25 -2
  103. package/src/feed/event-handlers/follow/handle-follow-created.ts +18 -1
  104. package/src/feed/event-handlers/follow/handle-follow-updated.ts +14 -0
  105. package/src/feed/event-handlers/notification-feed/handle-notification-feed-updated.ts +68 -2
  106. package/src/feed/event-handlers/story-feeds/handle-story-feeds-updated.ts +1 -1
  107. package/src/feed/feed.ts +79 -26
  108. package/src/feeds-client/apply-new-activity-to-active-feeds.ts +9 -0
  109. package/src/feeds-client/feeds-client.ts +301 -28
  110. package/src/gen/feeds/FeedsApi.ts +79 -12
  111. package/src/gen/model-decoders/decoders.ts +7 -0
  112. package/src/gen/models/index.ts +66 -4
  113. package/src/index.ts +1 -0
  114. package/src/types.ts +17 -0
  115. package/src/utils/state-update-queue.ts +42 -28
  116. package/src/utils/unique-array-merge.ts +11 -3
  117. package/dist/feeds-client-B4zeBggL.js.map +0 -1
  118. package/dist/feeds-client-DeAqnd1a.mjs.map +0 -1
  119. package/dist/types/feed/event-handlers/activity/handle-activity-marked.d.ts +0 -12
  120. package/dist/types/feed/event-handlers/activity/handle-activity-marked.d.ts.map +0 -1
  121. package/src/feed/event-handlers/activity/handle-activity-marked.ts +0 -68
@@ -2,6 +2,7 @@
2
2
  const stateStore = require("@stream-io/state-store");
3
3
  const loggerInternal = require("@stream-io/logger");
4
4
  const axiosImport = require("axios");
5
+ const filter = require("@stream-io/filter");
5
6
  function _interopNamespaceDefault(e) {
6
7
  const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
7
8
  if (e) {
@@ -1140,6 +1141,12 @@ decoders.QueryBookmarksResponse = (input) => {
1140
1141
  };
1141
1142
  return decode(typeMappings, input);
1142
1143
  };
1144
+ decoders.QueryCollectionsResponse = (input) => {
1145
+ const typeMappings = {
1146
+ collections: { type: "CollectionResponse", isSingle: false }
1147
+ };
1148
+ return decode(typeMappings, input);
1149
+ };
1143
1150
  decoders.QueryCommentReactionsResponse = (input) => {
1144
1151
  const typeMappings = {
1145
1152
  reactions: { type: "FeedsReactionResponse", isSingle: false }
@@ -1714,6 +1721,21 @@ class FeedsApi {
1714
1721
  decoders.DeleteActivitiesResponse?.(response.body);
1715
1722
  return { ...response.body, metadata: response.metadata };
1716
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
+ }
1717
1739
  async queryActivities(request) {
1718
1740
  const body = {
1719
1741
  enrich_own_fields: request?.enrich_own_fields,
@@ -2126,6 +2148,25 @@ class FeedsApi {
2126
2148
  decoders.CreateCollectionsResponse?.(response.body);
2127
2149
  return { ...response.body, metadata: response.metadata };
2128
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
+ }
2129
2170
  async getComments(request) {
2130
2171
  const queryParams = {
2131
2172
  object_id: request?.object_id,
@@ -2185,6 +2226,7 @@ class FeedsApi {
2185
2226
  async queryComments(request) {
2186
2227
  const body = {
2187
2228
  filter: request?.filter,
2229
+ id_around: request?.id_around,
2188
2230
  limit: request?.limit,
2189
2231
  next: request?.next,
2190
2232
  prev: request?.prev,
@@ -3216,15 +3258,26 @@ class FeedsApi {
3216
3258
  decoders.UpdateUserGroupResponse?.(response.body);
3217
3259
  return { ...response.body, metadata: response.metadata };
3218
3260
  }
3219
- async removeUserGroupMembers(request) {
3261
+ async addUserGroupMembers(request) {
3220
3262
  const pathParams = {
3221
3263
  id: request?.id
3222
3264
  };
3223
- const response = await this.apiClient.sendRequest("DELETE", "/api/v2/usergroups/{id}/members", pathParams, void 0);
3224
- 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);
3225
3278
  return { ...response.body, metadata: response.metadata };
3226
3279
  }
3227
- async addUserGroupMembers(request) {
3280
+ async removeUserGroupMembers(request) {
3228
3281
  const pathParams = {
3229
3282
  id: request?.id
3230
3283
  };
@@ -3234,13 +3287,13 @@ class FeedsApi {
3234
3287
  };
3235
3288
  const response = await this.apiClient.sendRequest(
3236
3289
  "POST",
3237
- "/api/v2/usergroups/{id}/members",
3290
+ "/api/v2/usergroups/{id}/members/delete",
3238
3291
  pathParams,
3239
3292
  void 0,
3240
3293
  body,
3241
3294
  "application/json"
3242
3295
  );
3243
- decoders.AddUserGroupMembersResponse?.(response.body);
3296
+ decoders.RemoveUserGroupMembersResponse?.(response.body);
3244
3297
  return { ...response.body, metadata: response.metadata };
3245
3298
  }
3246
3299
  async queryUsers(request) {
@@ -4128,7 +4181,7 @@ const getRateLimitFromResponseHeader = (response_headers) => {
4128
4181
  };
4129
4182
  return result;
4130
4183
  };
4131
- const version = "0.3.51";
4184
+ const version = "1.1.0";
4132
4185
  const axios = axiosImport.default ?? axiosImport;
4133
4186
  class ApiClient {
4134
4187
  constructor(apiKey, tokenManager, connectionIdManager, options) {
@@ -4944,7 +4997,7 @@ const uniqueArrayMerge = (existingArray, arrayToMerge, getKey) => {
4944
4997
  });
4945
4998
  return existingArray.concat(filteredArrayToMerge);
4946
4999
  };
4947
- const replaceUniqueArrayMerge = (existingArray, arrayToMerge, getKey) => {
5000
+ const replaceUniqueArrayMerge = (existingArray, arrayToMerge, getKey, position) => {
4948
5001
  const existingMap = /* @__PURE__ */ new Map();
4949
5002
  (existingArray ?? []).forEach((item) => {
4950
5003
  existingMap.set(getKey(item), item);
@@ -4960,9 +5013,14 @@ const replaceUniqueArrayMerge = (existingArray, arrayToMerge, getKey) => {
4960
5013
  existingMap.delete(getKey(originalItem));
4961
5014
  }
4962
5015
  });
4963
- existingMap.forEach((item) => {
4964
- result.push(item);
4965
- });
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
+ }
4966
5024
  return result;
4967
5025
  };
4968
5026
  const Constants = {
@@ -5009,24 +5067,25 @@ function getStateUpdateQueueId(...args) {
5009
5067
  const [data, prefix] = args;
5010
5068
  const toJoin = [prefix];
5011
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
+ }
5012
5077
  case "activity-updated": {
5013
5078
  return toJoin.concat([data.activity.id]).join("-");
5014
5079
  }
5015
5080
  case "activity-reaction-created":
5016
5081
  case "activity-reaction-deleted":
5017
5082
  case "activity-reaction-updated": {
5018
- return toJoin.concat([
5019
- data.activity.id,
5020
- data.reaction.type
5021
- ]).join("-");
5083
+ return toJoin.concat([data.activity.id, data.reaction.type]).join("-");
5022
5084
  }
5023
5085
  case "comment-reaction-created":
5024
5086
  case "comment-reaction-deleted":
5025
5087
  case "comment-reaction-updated": {
5026
- return toJoin.concat([
5027
- data.comment.id,
5028
- data.reaction.type
5029
- ]).join("-");
5088
+ return toJoin.concat([data.comment.id, data.reaction.type]).join("-");
5030
5089
  }
5031
5090
  case "comment-created":
5032
5091
  case "comment-deleted":
@@ -5038,6 +5097,13 @@ function getStateUpdateQueueId(...args) {
5038
5097
  case "follow-updated": {
5039
5098
  return toJoin.concat([data.source_feed.feed, data.target_feed.feed]).join("-");
5040
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
+ }
5041
5107
  default: {
5042
5108
  ensureExhausted(data, "Encountered unknown state update queue prefix.");
5043
5109
  }
@@ -5063,7 +5129,7 @@ function updateEntityInArray({
5063
5129
  updatedEntities[index] = newEntity;
5064
5130
  return { changed: true, entities: updatedEntities };
5065
5131
  }
5066
- const updateStateFollowCreated = (follow, currentState, currentFeedId, connectedUserId) => {
5132
+ const updateStateFollowCreated = (follow, currentState, currentFeedId, connectedUserId, hasOwnFields = false) => {
5067
5133
  if (follow.status !== "accepted") {
5068
5134
  return { changed: false, data: currentState };
5069
5135
  }
@@ -5072,7 +5138,12 @@ const updateStateFollowCreated = (follow, currentState, currentFeedId, connected
5072
5138
  newState = {
5073
5139
  ...newState,
5074
5140
  // Update FeedResponse fields, that has the new follower/following count
5075
- ...follow.source_feed
5141
+ ...follow.source_feed,
5142
+ ...hasOwnFields ? {
5143
+ own_capabilities: follow.source_feed.own_capabilities,
5144
+ own_follows: follow.source_feed.own_follows,
5145
+ own_followings: follow.source_feed.own_followings
5146
+ } : {}
5076
5147
  };
5077
5148
  if (currentState.following !== void 0) {
5078
5149
  newState.following = [follow, ...currentState.following];
@@ -5085,9 +5156,14 @@ const updateStateFollowCreated = (follow, currentState, currentFeedId, connected
5085
5156
  newState = {
5086
5157
  ...newState,
5087
5158
  // Update FeedResponse fields, that has the new follower/following count
5088
- ...follow.target_feed
5089
- };
5090
- if (source.created_by.id === connectedUserId) {
5159
+ ...follow.target_feed,
5160
+ ...hasOwnFields ? {
5161
+ own_capabilities: follow.target_feed.own_capabilities,
5162
+ own_follows: follow.target_feed.own_follows,
5163
+ own_followings: follow.target_feed.own_followings
5164
+ } : {}
5165
+ };
5166
+ if (source.created_by.id === connectedUserId && !hasOwnFields) {
5091
5167
  newState.own_follows = currentState.own_follows ? currentState.own_follows.concat(follow) : [follow];
5092
5168
  }
5093
5169
  if (currentState.followers !== void 0) {
@@ -5096,7 +5172,7 @@ const updateStateFollowCreated = (follow, currentState, currentFeedId, connected
5096
5172
  }
5097
5173
  return { changed: true, data: newState };
5098
5174
  };
5099
- function handleFollowCreated(eventOrResponse, fromWs) {
5175
+ function handleFollowCreated(eventOrResponse, fromWs, hasOwnFields = false) {
5100
5176
  const follow = eventOrResponse.follow;
5101
5177
  if (!shouldUpdateState({
5102
5178
  stateUpdateQueueId: getStateUpdateQueueId(follow, "follow-created"),
@@ -5112,7 +5188,8 @@ function handleFollowCreated(eventOrResponse, fromWs) {
5112
5188
  follow,
5113
5189
  this.currentState,
5114
5190
  this.feed,
5115
- connectedUser?.id
5191
+ connectedUser?.id,
5192
+ hasOwnFields
5116
5193
  );
5117
5194
  if (result.changed) {
5118
5195
  this.state.next(result.data);
@@ -5195,7 +5272,12 @@ function handleFollowUpdated(eventOrResponse, fromWs) {
5195
5272
  newState ?? (newState = {
5196
5273
  ...currentState,
5197
5274
  // Update FeedResponse fields, that has the new follower/following count
5198
- ...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
+ } : {}
5199
5281
  });
5200
5282
  const index = currentState.following?.findIndex(
5201
5283
  (f) => f.target_feed.feed === follow.target_feed.feed
@@ -5212,7 +5294,12 @@ function handleFollowUpdated(eventOrResponse, fromWs) {
5212
5294
  newState ?? (newState = {
5213
5295
  ...currentState,
5214
5296
  // Update FeedResponse fields, that has the new follower/following count
5215
- ...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
+ } : {}
5216
5303
  });
5217
5304
  if (source.created_by.id === connectedUserId && currentState.own_follows) {
5218
5305
  const index2 = currentState.own_follows.findIndex(
@@ -5336,14 +5423,14 @@ function handleCommentUpdated(payload, fromWs) {
5336
5423
  const { comment } = payload;
5337
5424
  const entityId = comment.parent_id ?? comment.object_id;
5338
5425
  if (!shouldUpdateState({
5339
- stateUpdateQueueId: getStateUpdateQueueId(
5340
- payload,
5341
- "comment-updated"
5342
- ),
5426
+ stateUpdateQueueId: getStateUpdateQueueId(payload, "comment-updated"),
5343
5427
  stateUpdateQueue: this.stateUpdateQueue,
5344
5428
  watch: this.currentState.watch,
5345
5429
  fromWs,
5346
- isTriggeredByConnectedUser: eventTriggeredByConnectedUser.call(this, payload)
5430
+ isTriggeredByConnectedUser: eventTriggeredByConnectedUser.call(
5431
+ this,
5432
+ payload
5433
+ )
5347
5434
  })) {
5348
5435
  return;
5349
5436
  }
@@ -5353,7 +5440,10 @@ function handleCommentUpdated(payload, fromWs) {
5353
5440
  const index = this.getCommentIndex(comment, currentState);
5354
5441
  if (index === -1) return currentState;
5355
5442
  const newComments = [...entityState.comments];
5356
- newComments[index] = comment;
5443
+ newComments[index] = {
5444
+ ...comment,
5445
+ own_reactions: entityState.comments[index].own_reactions
5446
+ };
5357
5447
  return {
5358
5448
  ...currentState,
5359
5449
  comments_by_entity_id: {
@@ -5504,7 +5594,19 @@ function handleCommentReactionUpdated(payload, fromWs) {
5504
5594
  };
5505
5595
  });
5506
5596
  }
5507
- 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
+ }
5508
5610
  const { connected_user: connectedUser } = this.client.state.getLatestValue();
5509
5611
  this.state.next((currentState) => {
5510
5612
  let newState;
@@ -5523,7 +5625,19 @@ function handleFeedMemberAdded(event) {
5523
5625
  return newState ?? currentState;
5524
5626
  });
5525
5627
  }
5526
- 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
+ }
5527
5641
  const { connected_user: connectedUser } = this.client.state.getLatestValue();
5528
5642
  this.state.next((currentState) => {
5529
5643
  const memberIndex = currentState.members?.findIndex(
@@ -5547,7 +5661,19 @@ function handleFeedMemberUpdated(event) {
5547
5661
  return newState ?? currentState;
5548
5662
  });
5549
5663
  }
5550
- 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
+ }
5551
5677
  const { connected_user: connectedUser } = this.client.state.getLatestValue();
5552
5678
  this.state.next((currentState) => {
5553
5679
  let newState;
@@ -5567,6 +5693,9 @@ function handleFeedMemberRemoved(event) {
5567
5693
  return newState ?? currentState;
5568
5694
  });
5569
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
+ };
5570
5699
  const sharedUpdateActivity$6 = ({
5571
5700
  currentActivity,
5572
5701
  event,
@@ -5574,7 +5703,9 @@ const sharedUpdateActivity$6 = ({
5574
5703
  }) => {
5575
5704
  let newOwnBookmarks = currentActivity.own_bookmarks;
5576
5705
  if (eventBelongsToCurrentUser) {
5577
- newOwnBookmarks = [...newOwnBookmarks, event.bookmark];
5706
+ newOwnBookmarks = currentActivity.own_bookmarks.filter(
5707
+ (bookmark) => !isSameBookmark(bookmark, event.bookmark)
5708
+ );
5578
5709
  }
5579
5710
  return {
5580
5711
  ...currentActivity,
@@ -5582,18 +5713,20 @@ const sharedUpdateActivity$6 = ({
5582
5713
  own_bookmarks: newOwnBookmarks
5583
5714
  };
5584
5715
  };
5585
- const addBookmarkToActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5716
+ const removeBookmarkFromActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5586
5717
  entities: activities,
5587
- 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))),
5588
5719
  updater: (matchedActivity) => sharedUpdateActivity$6({
5589
5720
  currentActivity: matchedActivity,
5590
5721
  event,
5591
5722
  eventBelongsToCurrentUser
5592
5723
  })
5593
5724
  });
5594
- const addBookmarkToPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
5725
+ const removeBookmarkFromPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
5595
5726
  entities: pinnedActivities,
5596
- 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
+ )),
5597
5730
  updater: (matchedPinnedActivity) => {
5598
5731
  const newActivity = sharedUpdateActivity$6({
5599
5732
  currentActivity: matchedPinnedActivity.activity,
@@ -5609,7 +5742,7 @@ const addBookmarkToPinnedActivities = (event, pinnedActivities, eventBelongsToCu
5609
5742
  };
5610
5743
  }
5611
5744
  });
5612
- function handleBookmarkAdded(event) {
5745
+ function handleBookmarkDeleted(event) {
5613
5746
  const {
5614
5747
  activities: currentActivities,
5615
5748
  pinned_activities: currentPinnedActivities
@@ -5617,12 +5750,12 @@ function handleBookmarkAdded(event) {
5617
5750
  const { connected_user: connectedUser } = this.client.state.getLatestValue();
5618
5751
  const eventBelongsToCurrentUser = event.bookmark.user.id === connectedUser?.id;
5619
5752
  const [result1, result2] = [
5620
- addBookmarkToActivities(
5753
+ removeBookmarkFromActivities(
5621
5754
  event,
5622
5755
  currentActivities,
5623
5756
  eventBelongsToCurrentUser
5624
5757
  ),
5625
- addBookmarkToPinnedActivities(
5758
+ removeBookmarkFromPinnedActivities(
5626
5759
  event,
5627
5760
  currentPinnedActivities,
5628
5761
  eventBelongsToCurrentUser
@@ -5635,9 +5768,6 @@ function handleBookmarkAdded(event) {
5635
5768
  });
5636
5769
  }
5637
5770
  }
5638
- const isSameBookmark = (bookmark1, bookmark2) => {
5639
- return bookmark1.user.id === bookmark2.user.id && bookmark1.activity.id === bookmark2.activity.id && bookmark1.folder?.id === bookmark2.folder?.id;
5640
- };
5641
5771
  const sharedUpdateActivity$5 = ({
5642
5772
  currentActivity,
5643
5773
  event,
@@ -5645,9 +5775,7 @@ const sharedUpdateActivity$5 = ({
5645
5775
  }) => {
5646
5776
  let newOwnBookmarks = currentActivity.own_bookmarks;
5647
5777
  if (eventBelongsToCurrentUser) {
5648
- newOwnBookmarks = currentActivity.own_bookmarks.filter(
5649
- (bookmark) => !isSameBookmark(bookmark, event.bookmark)
5650
- );
5778
+ newOwnBookmarks = [...newOwnBookmarks, event.bookmark];
5651
5779
  }
5652
5780
  return {
5653
5781
  ...currentActivity,
@@ -5655,18 +5783,20 @@ const sharedUpdateActivity$5 = ({
5655
5783
  own_bookmarks: newOwnBookmarks
5656
5784
  };
5657
5785
  };
5658
- const removeBookmarkFromActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5786
+ const addBookmarkToActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5659
5787
  entities: activities,
5660
- 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))),
5661
5789
  updater: (matchedActivity) => sharedUpdateActivity$5({
5662
5790
  currentActivity: matchedActivity,
5663
5791
  event,
5664
5792
  eventBelongsToCurrentUser
5665
5793
  })
5666
5794
  });
5667
- const removeBookmarkFromPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
5795
+ const addBookmarkToPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
5668
5796
  entities: pinnedActivities,
5669
- 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
+ )),
5670
5800
  updater: (matchedPinnedActivity) => {
5671
5801
  const newActivity = sharedUpdateActivity$5({
5672
5802
  currentActivity: matchedPinnedActivity.activity,
@@ -5682,7 +5812,7 @@ const removeBookmarkFromPinnedActivities = (event, pinnedActivities, eventBelong
5682
5812
  };
5683
5813
  }
5684
5814
  });
5685
- function handleBookmarkDeleted(event) {
5815
+ function handleBookmarkAdded(event) {
5686
5816
  const {
5687
5817
  activities: currentActivities,
5688
5818
  pinned_activities: currentPinnedActivities
@@ -5690,12 +5820,12 @@ function handleBookmarkDeleted(event) {
5690
5820
  const { connected_user: connectedUser } = this.client.state.getLatestValue();
5691
5821
  const eventBelongsToCurrentUser = event.bookmark.user.id === connectedUser?.id;
5692
5822
  const [result1, result2] = [
5693
- removeBookmarkFromActivities(
5823
+ addBookmarkToActivities(
5694
5824
  event,
5695
5825
  currentActivities,
5696
5826
  eventBelongsToCurrentUser
5697
5827
  ),
5698
- removeBookmarkFromPinnedActivities(
5828
+ addBookmarkToPinnedActivities(
5699
5829
  event,
5700
5830
  currentPinnedActivities,
5701
5831
  eventBelongsToCurrentUser
@@ -5716,7 +5846,7 @@ const sharedUpdateActivity$4 = ({
5716
5846
  let newOwnBookmarks = currentActivity.own_bookmarks;
5717
5847
  if (eventBelongsToCurrentUser) {
5718
5848
  const bookmarkIndex = newOwnBookmarks.findIndex(
5719
- (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
5720
5850
  );
5721
5851
  if (bookmarkIndex !== -1) {
5722
5852
  newOwnBookmarks = [...newOwnBookmarks];
@@ -5731,7 +5861,7 @@ const sharedUpdateActivity$4 = ({
5731
5861
  };
5732
5862
  const updateBookmarkInActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5733
5863
  entities: activities,
5734
- 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))),
5735
5865
  updater: (matchedActivity) => sharedUpdateActivity$4({
5736
5866
  currentActivity: matchedActivity,
5737
5867
  event,
@@ -5740,7 +5870,9 @@ const updateBookmarkInActivities = (event, activities, eventBelongsToCurrentUser
5740
5870
  });
5741
5871
  const updateBookmarkInPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
5742
5872
  entities: pinnedActivities,
5743
- 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
+ )),
5744
5876
  updater: (matchedPinnedActivity) => {
5745
5877
  const newActivity = sharedUpdateActivity$4({
5746
5878
  currentActivity: matchedPinnedActivity.activity,
@@ -5782,7 +5914,13 @@ function handleBookmarkUpdated(event) {
5782
5914
  });
5783
5915
  }
5784
5916
  }
5785
- function addActivitiesToState(newActivities, activities, position, { fromWebSocket } = { fromWebSocket: false }) {
5917
+ function addActivitiesToState(newActivities, activities, position, {
5918
+ hasOwnFields,
5919
+ backfillOwnFields
5920
+ } = {
5921
+ hasOwnFields: true,
5922
+ backfillOwnFields: true
5923
+ }) {
5786
5924
  if (activities === void 0) {
5787
5925
  return {
5788
5926
  changed: false,
@@ -5805,23 +5943,31 @@ function addActivitiesToState(newActivities, activities, position, { fromWebSock
5805
5943
  ...activities,
5806
5944
  ...position === "end" ? newActivitiesDeduplicated : []
5807
5945
  ];
5808
- this.newActivitiesAdded(newActivitiesDeduplicated, { fromWebSocket });
5946
+ this.activitiesAddedOrUpdated(newActivitiesDeduplicated, {
5947
+ hasOwnFields,
5948
+ backfillOwnFields
5949
+ });
5809
5950
  result = { changed: true, activities: updatedActivities };
5810
5951
  }
5811
5952
  return result;
5812
5953
  }
5813
5954
  function handleActivityAdded(event) {
5814
- if (this.activityAddedEventFilter) {
5815
- if (!this.activityAddedEventFilter(event)) {
5816
- return;
5817
- }
5955
+ const currentUser = this.client.state.getLatestValue().connected_user;
5956
+ const decision = this.resolveNewActivityDecision(
5957
+ event.activity,
5958
+ currentUser,
5959
+ false
5960
+ );
5961
+ if (decision === "ignore") {
5962
+ return;
5818
5963
  }
5964
+ const position = decision === "add-to-end" ? "end" : "start";
5819
5965
  const currentActivities = this.currentState.activities;
5820
5966
  const result = addActivitiesToState.bind(this)(
5821
5967
  [event.activity],
5822
5968
  currentActivities,
5823
- this.currentState.addNewActivitiesTo,
5824
- { fromWebSocket: true }
5969
+ position,
5970
+ { hasOwnFields: false, backfillOwnFields: true }
5825
5971
  );
5826
5972
  if (result.changed) {
5827
5973
  const activity = event.activity;
@@ -5853,7 +5999,19 @@ const removePinnedActivityFromState = (activityResponse, pinnedActivities) => {
5853
5999
  return { changed: false, pinned_activities: pinnedActivities };
5854
6000
  }
5855
6001
  };
5856
- 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
+ }
5857
6015
  const {
5858
6016
  activities: currentActivities,
5859
6017
  pinned_activities: currentPinnedActivities
@@ -5938,7 +6096,10 @@ function handleActivityUpdated(payload, fromWs) {
5938
6096
  updatePinnedActivityInState(payload, currentPinnedActivities)
5939
6097
  ];
5940
6098
  if (result1?.changed || result2.changed) {
5941
- this.client.hydratePollCache([payload.activity]);
6099
+ this.activitiesAddedOrUpdated([payload.activity], {
6100
+ hasOwnFields: payload.activity.current_feed?.own_capabilities !== void 0,
6101
+ backfillOwnFields: false
6102
+ });
5942
6103
  this.state.partialNext({
5943
6104
  activities: result1?.changed ? result1.entities : currentActivities,
5944
6105
  pinned_activities: result2.entities
@@ -6196,53 +6357,133 @@ function handleActivityReactionUpdated(payload, fromWs) {
6196
6357
  });
6197
6358
  }
6198
6359
  }
6199
- const updateNotificationStatusFromActivityMarked = (event, currentNotificationStatus, aggregatedActivities = []) => {
6200
- if (!currentNotificationStatus) {
6201
- return {
6202
- changed: false
6203
- };
6204
- }
6205
- const newState = {
6206
- ...currentNotificationStatus
6207
- };
6208
- if (event.mark_all_read) {
6209
- const allGroupIds = aggregatedActivities.map((activity) => activity.group);
6210
- newState.read_activities = [
6211
- .../* @__PURE__ */ new Set([
6212
- ...currentNotificationStatus.read_activities ?? [],
6213
- ...allGroupIds
6214
- ])
6215
- ];
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;
6216
6372
  }
6217
- if (event.mark_read && event.mark_read.length > 0) {
6218
- newState.read_activities = [
6219
- .../* @__PURE__ */ new Set([
6220
- ...currentNotificationStatus?.read_activities ?? [],
6221
- ...event.mark_read
6222
- ])
6223
- ];
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;
6224
6398
  }
6225
- if (event.mark_all_seen) {
6226
- 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
+ };
6227
6424
  }
6228
- return {
6229
- changed: true,
6230
- data: { notification_status: newState }
6231
- };
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
+ });
6232
6451
  };
6233
- function handleActivityMarked(event) {
6234
- const result = updateNotificationStatusFromActivityMarked(
6235
- event,
6236
- this.currentState.notification_status,
6237
- this.currentState.aggregated_activities
6238
- );
6239
- 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) {
6240
6470
  this.state.partialNext({
6241
- notification_status: result.data?.notification_status
6471
+ activities: result1.entities,
6472
+ pinned_activities: result2.entities
6242
6473
  });
6243
6474
  }
6244
6475
  }
6476
+ function handleFeedDeleted(event) {
6477
+ if (this.currentState.deleted_at) {
6478
+ return;
6479
+ }
6480
+ this.state.partialNext({ deleted_at: event.created_at });
6481
+ }
6245
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
+ }
6246
6487
  this.state.partialNext({ ...event.feed });
6247
6488
  }
6248
6489
  const addAggregatedActivitiesToState = (newAggregatedActivities, aggregatedActivities, position) => {
@@ -6291,11 +6532,20 @@ const addAggregatedActivitiesToState = (newAggregatedActivities, aggregatedActiv
6291
6532
  (a) => a.group
6292
6533
  );
6293
6534
  break;
6294
- case "replace":
6535
+ case "replace-then-end":
6295
6536
  result.aggregated_activities = replaceUniqueArrayMerge(
6296
6537
  aggregatedActivities ?? [],
6297
6538
  newAggregatedActivities,
6298
- (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"
6299
6549
  );
6300
6550
  break;
6301
6551
  }
@@ -6322,7 +6572,7 @@ const updateNotificationStatus = (newNotificationStatus, currentNotificationStat
6322
6572
  };
6323
6573
  }
6324
6574
  };
6325
- const updateNotificationFeedFromEvent = (event, currentAggregatedActivities, currentNotificationStatus) => {
6575
+ const updateNotificationFeedFromEvent = (event, currentAggregatedActivities, currentNotificationStatus, currentActivities) => {
6326
6576
  const updates = {};
6327
6577
  if (event.notification_status) {
6328
6578
  const notificationStatusResult = updateNotificationStatus(
@@ -6333,11 +6583,47 @@ const updateNotificationFeedFromEvent = (event, currentAggregatedActivities, cur
6333
6583
  updates.notification_status = notificationStatusResult.notification_status;
6334
6584
  }
6335
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
+ }
6336
6622
  if (event.aggregated_activities && currentAggregatedActivities) {
6337
6623
  const aggregatedActivitiesResult = addAggregatedActivitiesToState(
6338
6624
  event.aggregated_activities,
6339
- currentAggregatedActivities,
6340
- "start"
6625
+ updates.aggregated_activities ?? currentAggregatedActivities,
6626
+ "replace-then-start"
6341
6627
  );
6342
6628
  if (aggregatedActivitiesResult.changed) {
6343
6629
  updates.aggregated_activities = aggregatedActivitiesResult.aggregated_activities;
@@ -6357,12 +6643,14 @@ function handleNotificationFeedUpdated(event) {
6357
6643
  const result = updateNotificationFeedFromEvent(
6358
6644
  event,
6359
6645
  this.currentState.aggregated_activities,
6360
- this.currentState.notification_status
6646
+ this.currentState.notification_status,
6647
+ this.currentState.activities
6361
6648
  );
6362
6649
  if (result.changed) {
6363
6650
  this.state.partialNext({
6364
6651
  notification_status: result.data?.notification_status,
6365
- aggregated_activities: result.data?.aggregated_activities
6652
+ aggregated_activities: result.data?.aggregated_activities,
6653
+ activities: result.data?.activities ?? this.currentState.activities
6366
6654
  });
6367
6655
  }
6368
6656
  }
@@ -6412,7 +6700,7 @@ function updateStoriesFeedFromEvent(aggregatedActivities, activities, event) {
6412
6700
  const aggregatedActivitiesResult = addAggregatedActivitiesToState(
6413
6701
  event.aggregated_activities,
6414
6702
  aggregatedActivities,
6415
- "replace"
6703
+ "replace-then-end"
6416
6704
  );
6417
6705
  if (aggregatedActivitiesResult.changed) {
6418
6706
  result.data.aggregated_activities = aggregatedActivitiesResult.aggregated_activities;
@@ -6450,6 +6738,30 @@ function handleWatchStarted() {
6450
6738
  function handleWatchStopped() {
6451
6739
  this.state.partialNext({ watch: false });
6452
6740
  }
6741
+ const activityResolvers = [
6742
+ {
6743
+ matchesField: (field) => field === "activity_type",
6744
+ resolve: (activity) => activity.type
6745
+ },
6746
+ {
6747
+ matchesField: (field) => field === "within_bounds",
6748
+ resolve: (activity) => activity.location
6749
+ },
6750
+ {
6751
+ matchesField: () => true,
6752
+ resolve: (item, path) => filter.resolveDotPathValue(item, path)
6753
+ }
6754
+ ];
6755
+ function activityFilter(activity, requestConfig) {
6756
+ const filter$1 = requestConfig?.filter;
6757
+ if (!filter$1 || typeof filter$1 !== "object") {
6758
+ return true;
6759
+ }
6760
+ return filter.itemMatchesFilter(activity, filter$1, {
6761
+ resolvers: [...activityResolvers],
6762
+ arrayEqMode: "contains"
6763
+ });
6764
+ }
6453
6765
  const DEFAULT_MAX_RETRIES = 3;
6454
6766
  function isRetryableError(error) {
6455
6767
  if (error instanceof StreamApiError) {
@@ -6482,61 +6794,6 @@ async function withRetry(fn, options = {}) {
6482
6794
  }
6483
6795
  throw lastError;
6484
6796
  }
6485
- const isPin = (entity) => {
6486
- return "activity" in entity;
6487
- };
6488
- const updateActivityFromFeedback = (feedback, activities) => {
6489
- if (!activities) {
6490
- return {
6491
- changed: false,
6492
- entities: []
6493
- };
6494
- }
6495
- return updateEntityInArray({
6496
- entities: activities,
6497
- matcher: (e) => isPin(e) ? e.activity.id === feedback.activity_id : e.id === feedback.activity_id,
6498
- updater: (e) => {
6499
- if (isPin(e)) {
6500
- return {
6501
- ...e,
6502
- activity: {
6503
- ...e.activity,
6504
- hidden: feedback.value === "true"
6505
- }
6506
- };
6507
- } else {
6508
- return {
6509
- ...e,
6510
- hidden: feedback.value === "true"
6511
- };
6512
- }
6513
- }
6514
- });
6515
- };
6516
- function handleActivityFeedback(event) {
6517
- const {
6518
- activities: currentActivities,
6519
- pinned_activities: currentPinnedActivities
6520
- } = this.currentState;
6521
- const { connected_user: connectedUser } = this.client.state.getLatestValue();
6522
- const eventBelongsToCurrentUser = event.activity_feedback.user.id === connectedUser?.id;
6523
- if (!eventBelongsToCurrentUser || event.activity_feedback.action !== "hide") {
6524
- return;
6525
- }
6526
- const [result1, result2] = [
6527
- updateActivityFromFeedback(event.activity_feedback, currentActivities),
6528
- updateActivityFromFeedback(
6529
- event.activity_feedback,
6530
- currentPinnedActivities
6531
- )
6532
- ];
6533
- if (result1.changed || result2.changed) {
6534
- this.state.partialNext({
6535
- activities: result1.entities,
6536
- pinned_activities: result2.entities
6537
- });
6538
- }
6539
- }
6540
6797
  const deepEqual = (x, y) => {
6541
6798
  if (x === y) {
6542
6799
  return true;
@@ -6641,9 +6898,9 @@ function clearQueuedFeeds() {
6641
6898
  queuedFeeds.clear();
6642
6899
  }
6643
6900
  const _Feed = class _Feed extends FeedApi {
6644
- constructor(client, groupId, id, data, watch = false, addNewActivitiesTo = "start", activityAddedEventFilter) {
6901
+ constructor(client, groupId, id, data, watch = false, onNewActivity) {
6645
6902
  super(client, groupId, id);
6646
- this.activityAddedEventFilter = activityAddedEventFilter;
6903
+ this.onNewActivity = onNewActivity;
6647
6904
  this.indexedActivityIds = /* @__PURE__ */ new Set();
6648
6905
  this.stateUpdateQueue = /* @__PURE__ */ new Set();
6649
6906
  this.eventHandlers = {
@@ -6663,7 +6920,7 @@ const _Feed = class _Feed extends FeedApi {
6663
6920
  "feeds.comment.deleted": handleCommentDeleted.bind(this),
6664
6921
  "feeds.comment.updated": handleCommentUpdated.bind(this),
6665
6922
  "feeds.feed.created": _Feed.noop,
6666
- "feeds.feed.deleted": _Feed.noop,
6923
+ "feeds.feed.deleted": handleFeedDeleted.bind(this),
6667
6924
  "feeds.feed.updated": handleFeedUpdated.bind(this),
6668
6925
  "feeds.feed_group.changed": _Feed.noop,
6669
6926
  "feeds.feed_group.deleted": _Feed.noop,
@@ -6686,9 +6943,9 @@ const _Feed = class _Feed extends FeedApi {
6686
6943
  "feeds.poll.vote_casted": _Feed.noop,
6687
6944
  "feeds.poll.vote_changed": _Feed.noop,
6688
6945
  "feeds.poll.vote_removed": _Feed.noop,
6689
- "feeds.activity.pinned": _Feed.noop,
6690
- "feeds.activity.unpinned": _Feed.noop,
6691
- "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,
6692
6949
  "moderation.custom_action": _Feed.noop,
6693
6950
  "moderation.flagged": _Feed.noop,
6694
6951
  "moderation.mark_reviewed": _Feed.noop,
@@ -6713,8 +6970,7 @@ const _Feed = class _Feed extends FeedApi {
6713
6970
  is_loading: false,
6714
6971
  is_loading_activities: false,
6715
6972
  comments_by_entity_id: {},
6716
- watch,
6717
- addNewActivitiesTo
6973
+ watch
6718
6974
  });
6719
6975
  this.client = client;
6720
6976
  this.state.subscribeWithSelector(
@@ -6735,9 +6991,6 @@ const _Feed = class _Feed extends FeedApi {
6735
6991
  get currentState() {
6736
6992
  return this.state.getLatestValue();
6737
6993
  }
6738
- set addNewActivitiesTo(value) {
6739
- this.state.partialNext({ addNewActivitiesTo: value });
6740
- }
6741
6994
  hasActivity(activityId) {
6742
6995
  return this.indexedActivityIds.has(activityId);
6743
6996
  }
@@ -6746,6 +6999,24 @@ const _Feed = class _Feed extends FeedApi {
6746
6999
  (pinnedActivity) => pinnedActivity.activity.id === activityId
6747
7000
  );
6748
7001
  }
7002
+ /**
7003
+ * Resolves how to handle a new activity (WS or HTTP): ignore, add-to-start, or add-to-end.
7004
+ * Uses onNewActivity if set; else default (current user + filter match) adds to start.
7005
+ */
7006
+ resolveNewActivityDecision(activity, currentUser, _fromHttp) {
7007
+ if (this.onNewActivity) {
7008
+ return this.onNewActivity({ activity, currentUser });
7009
+ }
7010
+ if (!currentUser) return "ignore";
7011
+ if (activity.user?.id !== currentUser.id) return "ignore";
7012
+ if (!activityFilter(
7013
+ activity,
7014
+ this.currentState.last_get_or_create_request_config
7015
+ )) {
7016
+ return "ignore";
7017
+ }
7018
+ return "add-to-start";
7019
+ }
6749
7020
  async synchronize() {
6750
7021
  const { last_get_or_create_request_config } = this.state.getLatestValue();
6751
7022
  if (last_get_or_create_request_config?.watch) {
@@ -6783,7 +7054,8 @@ const _Feed = class _Feed extends FeedApi {
6783
7054
  const result = addActivitiesToState.bind(this)(
6784
7055
  response.activities,
6785
7056
  currentActivities,
6786
- "end"
7057
+ "end",
7058
+ { hasOwnFields: true, backfillOwnFields: false }
6787
7059
  );
6788
7060
  const aggregatedActivitiesResult = addAggregatedActivitiesToState(
6789
7061
  response.aggregated_activities,
@@ -6832,7 +7104,7 @@ const _Feed = class _Feed extends FeedApi {
6832
7104
  return nextState;
6833
7105
  });
6834
7106
  }
6835
- this.newActivitiesAdded(response.activities);
7107
+ this.activitiesAddedOrUpdated(response.activities);
6836
7108
  return response;
6837
7109
  } finally {
6838
7110
  this.state.partialNext({
@@ -7140,11 +7412,11 @@ const _Feed = class _Feed extends FeedApi {
7140
7412
  * _Note: Useful only for feeds with `groupId` of `user` value._
7141
7413
  */
7142
7414
  async queryFollowers(request) {
7143
- const filter = {
7415
+ const filter2 = {
7144
7416
  target_feed: this.feed
7145
7417
  };
7146
7418
  const response = await this.client.queryFollows({
7147
- filter,
7419
+ filter: filter2,
7148
7420
  ...request
7149
7421
  });
7150
7422
  return response;
@@ -7155,11 +7427,11 @@ const _Feed = class _Feed extends FeedApi {
7155
7427
  * _Note: Useful only for feeds with `groupId` of `timeline` value._
7156
7428
  */
7157
7429
  async queryFollowing(request) {
7158
- const filter = {
7430
+ const filter2 = {
7159
7431
  source_feed: this.feed
7160
7432
  };
7161
7433
  const response = await this.client.queryFollows({
7162
- filter,
7434
+ filter: filter2,
7163
7435
  ...request
7164
7436
  });
7165
7437
  return response;
@@ -7207,11 +7479,41 @@ const _Feed = class _Feed extends FeedApi {
7207
7479
  next: currentState.next
7208
7480
  });
7209
7481
  }
7482
+ /**
7483
+ * Applies a new activity to this feed's state (decision + add to activities).
7484
+ * Used when the activity was added via this feed's addActivity or via client.addActivity.
7485
+ */
7486
+ addActivityFromHTTPResponse(activity) {
7487
+ const currentUser = this.client.state.getLatestValue().connected_user;
7488
+ const decision = this.resolveNewActivityDecision(
7489
+ activity,
7490
+ currentUser,
7491
+ true
7492
+ );
7493
+ if (decision !== "ignore") {
7494
+ const position = decision === "add-to-end" ? "end" : "start";
7495
+ const currentActivities = this.currentState.activities;
7496
+ const result = addActivitiesToState.bind(this)(
7497
+ [activity],
7498
+ currentActivities,
7499
+ position,
7500
+ {
7501
+ hasOwnFields: activity.current_feed?.own_capabilities !== void 0,
7502
+ backfillOwnFields: false
7503
+ }
7504
+ );
7505
+ if (result.changed) {
7506
+ this.client.hydratePollCache([activity]);
7507
+ this.state.partialNext({ activities: result.activities });
7508
+ }
7509
+ }
7510
+ }
7210
7511
  async addActivity(request) {
7211
7512
  const response = await this.client.addActivity({
7212
7513
  ...request,
7213
7514
  feeds: [this.feed]
7214
7515
  });
7516
+ this.addActivityFromHTTPResponse(response.activity);
7215
7517
  return response;
7216
7518
  }
7217
7519
  handleWSEvent(event) {
@@ -7232,7 +7534,7 @@ const _Feed = class _Feed extends FeedApi {
7232
7534
  }
7233
7535
  this.eventDispatcher.dispatch(event);
7234
7536
  }
7235
- newActivitiesAdded(activities, options = { fromWebSocket: false }) {
7537
+ activitiesAddedOrUpdated(activities, options = { hasOwnFields: true, backfillOwnFields: true }) {
7236
7538
  this.client.hydratePollCache(activities);
7237
7539
  this.getOrCreateFeeds(activities, options);
7238
7540
  }
@@ -7250,7 +7552,7 @@ const _Feed = class _Feed extends FeedApi {
7250
7552
  });
7251
7553
  const newFeeds = Array.from(feedsToGetOrCreate.values());
7252
7554
  const fieldsToUpdate = [];
7253
- if (!options.fromWebSocket) {
7555
+ if (options.hasOwnFields) {
7254
7556
  fieldsToUpdate.push("own_membership");
7255
7557
  if (!enrichmentOptions?.skip_own_capabilities) {
7256
7558
  fieldsToUpdate.push("own_capabilities");
@@ -7270,7 +7572,7 @@ const _Feed = class _Feed extends FeedApi {
7270
7572
  fieldsToUpdate
7271
7573
  });
7272
7574
  });
7273
- if (options.fromWebSocket) {
7575
+ if (!options.hasOwnFields && options.backfillOwnFields) {
7274
7576
  const uninitializedFeeds = newFeeds.filter((feedResponse) => {
7275
7577
  const feed = this.client.feed(feedResponse.group_id, feedResponse.id);
7276
7578
  return feed.currentState.own_capabilities === void 0;
@@ -7293,6 +7595,9 @@ const _Feed = class _Feed extends FeedApi {
7293
7595
  _Feed.noop = () => {
7294
7596
  };
7295
7597
  let Feed = _Feed;
7598
+ function applyNewActivityToActiveFeeds(activity) {
7599
+ return this.addActivityFromHTTPResponse(activity);
7600
+ }
7296
7601
  function handleUserUpdated(event) {
7297
7602
  this.state.next((currentState) => {
7298
7603
  let newState;
@@ -7372,7 +7677,9 @@ function disconnectActivityFromFeed(activity) {
7372
7677
  }
7373
7678
  }
7374
7679
  class ActivityWithStateUpdates {
7375
- constructor(id, feedsClient, { fromResponse } = { fromResponse: void 0 }) {
7680
+ constructor(id, feedsClient, { fromResponse } = {
7681
+ fromResponse: void 0
7682
+ }) {
7376
7683
  this.id = id;
7377
7684
  this.feedsClient = feedsClient;
7378
7685
  this.state = new stateStore.StateStore({
@@ -7423,7 +7730,7 @@ class ActivityWithStateUpdates {
7423
7730
  initialState: activityResponse
7424
7731
  });
7425
7732
  if (this.feed) {
7426
- this.feed.activityAddedEventFilter = () => false;
7733
+ this.feed.onNewActivity = () => "ignore";
7427
7734
  }
7428
7735
  if (comments) {
7429
7736
  await this.loadNextPageActivityComments(comments);
@@ -7476,7 +7783,11 @@ class ActivityWithStateUpdates {
7476
7783
  const { activities } = addActivitiesToState.bind(this.feed)(
7477
7784
  [initialState],
7478
7785
  [],
7479
- "start"
7786
+ "start",
7787
+ {
7788
+ hasOwnFields: initialState.current_feed?.own_capabilities !== void 0,
7789
+ backfillOwnFields: false
7790
+ }
7480
7791
  );
7481
7792
  this.feed?.state.partialNext({
7482
7793
  activities
@@ -7748,6 +8059,53 @@ class FeedsClient extends FeedsApi {
7748
8059
  }
7749
8060
  return response;
7750
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
+ };
7751
8109
  this.addComment = async (request) => {
7752
8110
  const response = await super.addComment(request);
7753
8111
  const { comment } = response;
@@ -7833,10 +8191,125 @@ class FeedsClient extends FeedsApi {
7833
8191
  }
7834
8192
  return response;
7835
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
+ };
7836
8309
  this.queryPollAnswers = async (request) => {
7837
- const filter = request.filter ?? {};
8310
+ const filter2 = request.filter ?? {};
7838
8311
  const queryPollAnswersFilter = {
7839
- ...filter,
8312
+ ...filter2,
7840
8313
  is_answer: true
7841
8314
  };
7842
8315
  const queryPollAnswersRequest = {
@@ -7907,18 +8380,12 @@ class FeedsClient extends FeedsApi {
7907
8380
  id,
7908
8381
  data,
7909
8382
  watch,
7910
- options2?.addNewActivitiesTo,
7911
- options2?.activityAddedEventFilter
8383
+ options2?.onNewActivity
7912
8384
  );
7913
8385
  }
7914
8386
  const feed = this.activeFeeds[fid];
7915
- if (!isCreated && options2) {
7916
- if (options2?.addNewActivitiesTo) {
7917
- feed.addNewActivitiesTo = options2.addNewActivitiesTo;
7918
- }
7919
- if (options2?.activityAddedEventFilter) {
7920
- feed.activityAddedEventFilter = options2.activityAddedEventFilter;
7921
- }
8387
+ if (!isCreated && options2?.onNewActivity !== void 0) {
8388
+ feed.onNewActivity = options2.onNewActivity;
7922
8389
  }
7923
8390
  if (!feed.currentState.watch) {
7924
8391
  if (!isCreated && data) {
@@ -8098,6 +8565,16 @@ class FeedsClient extends FeedsApi {
8098
8565
  });
8099
8566
  }
8100
8567
  }
8568
+ async addActivity(request) {
8569
+ const response = await super.addActivity(request);
8570
+ request.feeds.forEach((fid) => {
8571
+ const feed = this.activeFeeds[fid];
8572
+ if (feed) {
8573
+ applyNewActivityToActiveFeeds.call(feed, response.activity);
8574
+ }
8575
+ });
8576
+ return response;
8577
+ }
8101
8578
  async queryFeeds(request) {
8102
8579
  const response = await this._queryFeeds(request);
8103
8580
  const feedResponses = response.feeds;
@@ -8107,12 +8584,12 @@ class FeedsClient extends FeedsApi {
8107
8584
  id: feedResponse.id,
8108
8585
  data: feedResponse,
8109
8586
  watch: request?.watch,
8110
- fieldsToUpdate: [
8587
+ fieldsToUpdate: request?.enrich_own_fields ? [
8111
8588
  "own_capabilities",
8112
8589
  "own_follows",
8113
8590
  "own_membership",
8114
8591
  "own_followings"
8115
- ]
8592
+ ] : []
8116
8593
  })
8117
8594
  );
8118
8595
  return {
@@ -8144,10 +8621,21 @@ class FeedsClient extends FeedsApi {
8144
8621
  });
8145
8622
  return response;
8146
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
+ }
8147
8635
  // For follow API endpoints we update the state after HTTP response to allow queryFeeds with watch: false
8148
8636
  async follow(request) {
8149
8637
  const response = await super.follow(request);
8150
- this.updateStateFromFollows([response.follow]);
8638
+ this.updateStateFromFollows([response.follow], !!request.enrich_own_fields);
8151
8639
  return response;
8152
8640
  }
8153
8641
  /**
@@ -8157,12 +8645,12 @@ class FeedsClient extends FeedsApi {
8157
8645
  */
8158
8646
  async followBatch(request) {
8159
8647
  const response = await super.followBatch(request);
8160
- this.updateStateFromFollows(response.follows);
8648
+ this.updateStateFromFollows(response.follows, !!request.enrich_own_fields);
8161
8649
  return response;
8162
8650
  }
8163
8651
  async getOrCreateFollows(request) {
8164
8652
  const response = await super.getOrCreateFollows(request);
8165
- this.updateStateFromFollows(response.created);
8653
+ this.updateStateFromFollows(response.created, !!request.enrich_own_fields);
8166
8654
  return response;
8167
8655
  }
8168
8656
  async unfollow(request) {
@@ -8253,13 +8741,15 @@ class FeedsClient extends FeedsApi {
8253
8741
  }).map((a) => getFeed.call(a))
8254
8742
  ];
8255
8743
  }
8256
- updateStateFromFollows(follows) {
8744
+ updateStateFromFollows(follows, hasOwnFields) {
8257
8745
  follows.forEach((follow) => {
8258
8746
  const feeds = [
8259
8747
  ...this.findAllActiveFeedsByFid(follow.source_feed.feed),
8260
8748
  ...this.findAllActiveFeedsByFid(follow.target_feed.feed)
8261
8749
  ];
8262
- feeds.forEach((f) => handleFollowCreated.bind(f)({ follow }, false));
8750
+ feeds.forEach(
8751
+ (f) => handleFollowCreated.bind(f)({ follow }, false, hasOwnFields)
8752
+ );
8263
8753
  });
8264
8754
  }
8265
8755
  updateStateFromUnfollows(follows) {
@@ -8290,6 +8780,7 @@ exports.Feed = Feed;
8290
8780
  exports.FeedsClient = FeedsClient;
8291
8781
  exports.StreamApiError = StreamApiError;
8292
8782
  exports.StreamPoll = StreamPoll;
8783
+ exports.activityFilter = activityFilter;
8293
8784
  exports.checkHasAnotherPage = checkHasAnotherPage;
8294
8785
  exports.debounce = debounce;
8295
8786
  exports.ensureExhausted = ensureExhausted;
@@ -8305,4 +8796,4 @@ exports.replaceUniqueArrayMerge = replaceUniqueArrayMerge;
8305
8796
  exports.shouldUpdateState = shouldUpdateState;
8306
8797
  exports.uniqueArrayMerge = uniqueArrayMerge;
8307
8798
  exports.updateEntityInArray = updateEntityInArray;
8308
- //# sourceMappingURL=feeds-client-B4zeBggL.js.map
8799
+ //# sourceMappingURL=feeds-client-C1c6lcS3.js.map