@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
@@ -1,6 +1,7 @@
1
1
  import { StateStore } from "@stream-io/state-store";
2
2
  import * as loggerInternal from "@stream-io/logger";
3
3
  import axiosImport from "axios";
4
+ import { itemMatchesFilter, resolveDotPathValue } from "@stream-io/filter";
4
5
  const decoders = {};
5
6
  const decodeDatetimeType = (input) => typeof input === "number" ? new Date(Math.floor(input / 1e6)) : new Date(input);
6
7
  decoders.DatetimeType = decodeDatetimeType;
@@ -1122,6 +1123,12 @@ decoders.QueryBookmarksResponse = (input) => {
1122
1123
  };
1123
1124
  return decode(typeMappings, input);
1124
1125
  };
1126
+ decoders.QueryCollectionsResponse = (input) => {
1127
+ const typeMappings = {
1128
+ collections: { type: "CollectionResponse", isSingle: false }
1129
+ };
1130
+ return decode(typeMappings, input);
1131
+ };
1125
1132
  decoders.QueryCommentReactionsResponse = (input) => {
1126
1133
  const typeMappings = {
1127
1134
  reactions: { type: "FeedsReactionResponse", isSingle: false }
@@ -1696,6 +1703,21 @@ class FeedsApi {
1696
1703
  decoders.DeleteActivitiesResponse?.(response.body);
1697
1704
  return { ...response.body, metadata: response.metadata };
1698
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
+ }
1699
1721
  async queryActivities(request) {
1700
1722
  const body = {
1701
1723
  enrich_own_fields: request?.enrich_own_fields,
@@ -2108,6 +2130,25 @@ class FeedsApi {
2108
2130
  decoders.CreateCollectionsResponse?.(response.body);
2109
2131
  return { ...response.body, metadata: response.metadata };
2110
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
+ }
2111
2152
  async getComments(request) {
2112
2153
  const queryParams = {
2113
2154
  object_id: request?.object_id,
@@ -2167,6 +2208,7 @@ class FeedsApi {
2167
2208
  async queryComments(request) {
2168
2209
  const body = {
2169
2210
  filter: request?.filter,
2211
+ id_around: request?.id_around,
2170
2212
  limit: request?.limit,
2171
2213
  next: request?.next,
2172
2214
  prev: request?.prev,
@@ -3198,15 +3240,26 @@ class FeedsApi {
3198
3240
  decoders.UpdateUserGroupResponse?.(response.body);
3199
3241
  return { ...response.body, metadata: response.metadata };
3200
3242
  }
3201
- async removeUserGroupMembers(request) {
3243
+ async addUserGroupMembers(request) {
3202
3244
  const pathParams = {
3203
3245
  id: request?.id
3204
3246
  };
3205
- const response = await this.apiClient.sendRequest("DELETE", "/api/v2/usergroups/{id}/members", pathParams, void 0);
3206
- 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);
3207
3260
  return { ...response.body, metadata: response.metadata };
3208
3261
  }
3209
- async addUserGroupMembers(request) {
3262
+ async removeUserGroupMembers(request) {
3210
3263
  const pathParams = {
3211
3264
  id: request?.id
3212
3265
  };
@@ -3216,13 +3269,13 @@ class FeedsApi {
3216
3269
  };
3217
3270
  const response = await this.apiClient.sendRequest(
3218
3271
  "POST",
3219
- "/api/v2/usergroups/{id}/members",
3272
+ "/api/v2/usergroups/{id}/members/delete",
3220
3273
  pathParams,
3221
3274
  void 0,
3222
3275
  body,
3223
3276
  "application/json"
3224
3277
  );
3225
- decoders.AddUserGroupMembersResponse?.(response.body);
3278
+ decoders.RemoveUserGroupMembersResponse?.(response.body);
3226
3279
  return { ...response.body, metadata: response.metadata };
3227
3280
  }
3228
3281
  async queryUsers(request) {
@@ -4110,7 +4163,7 @@ const getRateLimitFromResponseHeader = (response_headers) => {
4110
4163
  };
4111
4164
  return result;
4112
4165
  };
4113
- const version = "0.3.51";
4166
+ const version = "1.1.0";
4114
4167
  const axios = axiosImport.default ?? axiosImport;
4115
4168
  class ApiClient {
4116
4169
  constructor(apiKey, tokenManager, connectionIdManager, options) {
@@ -4926,7 +4979,7 @@ const uniqueArrayMerge = (existingArray, arrayToMerge, getKey) => {
4926
4979
  });
4927
4980
  return existingArray.concat(filteredArrayToMerge);
4928
4981
  };
4929
- const replaceUniqueArrayMerge = (existingArray, arrayToMerge, getKey) => {
4982
+ const replaceUniqueArrayMerge = (existingArray, arrayToMerge, getKey, position) => {
4930
4983
  const existingMap = /* @__PURE__ */ new Map();
4931
4984
  (existingArray ?? []).forEach((item) => {
4932
4985
  existingMap.set(getKey(item), item);
@@ -4942,9 +4995,14 @@ const replaceUniqueArrayMerge = (existingArray, arrayToMerge, getKey) => {
4942
4995
  existingMap.delete(getKey(originalItem));
4943
4996
  }
4944
4997
  });
4945
- existingMap.forEach((item) => {
4946
- result.push(item);
4947
- });
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
+ }
4948
5006
  return result;
4949
5007
  };
4950
5008
  const Constants = {
@@ -4991,24 +5049,25 @@ function getStateUpdateQueueId(...args) {
4991
5049
  const [data, prefix] = args;
4992
5050
  const toJoin = [prefix];
4993
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
+ }
4994
5059
  case "activity-updated": {
4995
5060
  return toJoin.concat([data.activity.id]).join("-");
4996
5061
  }
4997
5062
  case "activity-reaction-created":
4998
5063
  case "activity-reaction-deleted":
4999
5064
  case "activity-reaction-updated": {
5000
- return toJoin.concat([
5001
- data.activity.id,
5002
- data.reaction.type
5003
- ]).join("-");
5065
+ return toJoin.concat([data.activity.id, data.reaction.type]).join("-");
5004
5066
  }
5005
5067
  case "comment-reaction-created":
5006
5068
  case "comment-reaction-deleted":
5007
5069
  case "comment-reaction-updated": {
5008
- return toJoin.concat([
5009
- data.comment.id,
5010
- data.reaction.type
5011
- ]).join("-");
5070
+ return toJoin.concat([data.comment.id, data.reaction.type]).join("-");
5012
5071
  }
5013
5072
  case "comment-created":
5014
5073
  case "comment-deleted":
@@ -5020,6 +5079,13 @@ function getStateUpdateQueueId(...args) {
5020
5079
  case "follow-updated": {
5021
5080
  return toJoin.concat([data.source_feed.feed, data.target_feed.feed]).join("-");
5022
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
+ }
5023
5089
  default: {
5024
5090
  ensureExhausted(data, "Encountered unknown state update queue prefix.");
5025
5091
  }
@@ -5045,7 +5111,7 @@ function updateEntityInArray({
5045
5111
  updatedEntities[index] = newEntity;
5046
5112
  return { changed: true, entities: updatedEntities };
5047
5113
  }
5048
- const updateStateFollowCreated = (follow, currentState, currentFeedId, connectedUserId) => {
5114
+ const updateStateFollowCreated = (follow, currentState, currentFeedId, connectedUserId, hasOwnFields = false) => {
5049
5115
  if (follow.status !== "accepted") {
5050
5116
  return { changed: false, data: currentState };
5051
5117
  }
@@ -5054,7 +5120,12 @@ const updateStateFollowCreated = (follow, currentState, currentFeedId, connected
5054
5120
  newState = {
5055
5121
  ...newState,
5056
5122
  // Update FeedResponse fields, that has the new follower/following count
5057
- ...follow.source_feed
5123
+ ...follow.source_feed,
5124
+ ...hasOwnFields ? {
5125
+ own_capabilities: follow.source_feed.own_capabilities,
5126
+ own_follows: follow.source_feed.own_follows,
5127
+ own_followings: follow.source_feed.own_followings
5128
+ } : {}
5058
5129
  };
5059
5130
  if (currentState.following !== void 0) {
5060
5131
  newState.following = [follow, ...currentState.following];
@@ -5067,9 +5138,14 @@ const updateStateFollowCreated = (follow, currentState, currentFeedId, connected
5067
5138
  newState = {
5068
5139
  ...newState,
5069
5140
  // Update FeedResponse fields, that has the new follower/following count
5070
- ...follow.target_feed
5071
- };
5072
- if (source.created_by.id === connectedUserId) {
5141
+ ...follow.target_feed,
5142
+ ...hasOwnFields ? {
5143
+ own_capabilities: follow.target_feed.own_capabilities,
5144
+ own_follows: follow.target_feed.own_follows,
5145
+ own_followings: follow.target_feed.own_followings
5146
+ } : {}
5147
+ };
5148
+ if (source.created_by.id === connectedUserId && !hasOwnFields) {
5073
5149
  newState.own_follows = currentState.own_follows ? currentState.own_follows.concat(follow) : [follow];
5074
5150
  }
5075
5151
  if (currentState.followers !== void 0) {
@@ -5078,7 +5154,7 @@ const updateStateFollowCreated = (follow, currentState, currentFeedId, connected
5078
5154
  }
5079
5155
  return { changed: true, data: newState };
5080
5156
  };
5081
- function handleFollowCreated(eventOrResponse, fromWs) {
5157
+ function handleFollowCreated(eventOrResponse, fromWs, hasOwnFields = false) {
5082
5158
  const follow = eventOrResponse.follow;
5083
5159
  if (!shouldUpdateState({
5084
5160
  stateUpdateQueueId: getStateUpdateQueueId(follow, "follow-created"),
@@ -5094,7 +5170,8 @@ function handleFollowCreated(eventOrResponse, fromWs) {
5094
5170
  follow,
5095
5171
  this.currentState,
5096
5172
  this.feed,
5097
- connectedUser?.id
5173
+ connectedUser?.id,
5174
+ hasOwnFields
5098
5175
  );
5099
5176
  if (result.changed) {
5100
5177
  this.state.next(result.data);
@@ -5177,7 +5254,12 @@ function handleFollowUpdated(eventOrResponse, fromWs) {
5177
5254
  newState ?? (newState = {
5178
5255
  ...currentState,
5179
5256
  // Update FeedResponse fields, that has the new follower/following count
5180
- ...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
+ } : {}
5181
5263
  });
5182
5264
  const index = currentState.following?.findIndex(
5183
5265
  (f) => f.target_feed.feed === follow.target_feed.feed
@@ -5194,7 +5276,12 @@ function handleFollowUpdated(eventOrResponse, fromWs) {
5194
5276
  newState ?? (newState = {
5195
5277
  ...currentState,
5196
5278
  // Update FeedResponse fields, that has the new follower/following count
5197
- ...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
+ } : {}
5198
5285
  });
5199
5286
  if (source.created_by.id === connectedUserId && currentState.own_follows) {
5200
5287
  const index2 = currentState.own_follows.findIndex(
@@ -5318,14 +5405,14 @@ function handleCommentUpdated(payload, fromWs) {
5318
5405
  const { comment } = payload;
5319
5406
  const entityId = comment.parent_id ?? comment.object_id;
5320
5407
  if (!shouldUpdateState({
5321
- stateUpdateQueueId: getStateUpdateQueueId(
5322
- payload,
5323
- "comment-updated"
5324
- ),
5408
+ stateUpdateQueueId: getStateUpdateQueueId(payload, "comment-updated"),
5325
5409
  stateUpdateQueue: this.stateUpdateQueue,
5326
5410
  watch: this.currentState.watch,
5327
5411
  fromWs,
5328
- isTriggeredByConnectedUser: eventTriggeredByConnectedUser.call(this, payload)
5412
+ isTriggeredByConnectedUser: eventTriggeredByConnectedUser.call(
5413
+ this,
5414
+ payload
5415
+ )
5329
5416
  })) {
5330
5417
  return;
5331
5418
  }
@@ -5335,7 +5422,10 @@ function handleCommentUpdated(payload, fromWs) {
5335
5422
  const index = this.getCommentIndex(comment, currentState);
5336
5423
  if (index === -1) return currentState;
5337
5424
  const newComments = [...entityState.comments];
5338
- newComments[index] = comment;
5425
+ newComments[index] = {
5426
+ ...comment,
5427
+ own_reactions: entityState.comments[index].own_reactions
5428
+ };
5339
5429
  return {
5340
5430
  ...currentState,
5341
5431
  comments_by_entity_id: {
@@ -5486,7 +5576,19 @@ function handleCommentReactionUpdated(payload, fromWs) {
5486
5576
  };
5487
5577
  });
5488
5578
  }
5489
- 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
+ }
5490
5592
  const { connected_user: connectedUser } = this.client.state.getLatestValue();
5491
5593
  this.state.next((currentState) => {
5492
5594
  let newState;
@@ -5505,7 +5607,19 @@ function handleFeedMemberAdded(event) {
5505
5607
  return newState ?? currentState;
5506
5608
  });
5507
5609
  }
5508
- 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
+ }
5509
5623
  const { connected_user: connectedUser } = this.client.state.getLatestValue();
5510
5624
  this.state.next((currentState) => {
5511
5625
  const memberIndex = currentState.members?.findIndex(
@@ -5529,7 +5643,19 @@ function handleFeedMemberUpdated(event) {
5529
5643
  return newState ?? currentState;
5530
5644
  });
5531
5645
  }
5532
- 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
+ }
5533
5659
  const { connected_user: connectedUser } = this.client.state.getLatestValue();
5534
5660
  this.state.next((currentState) => {
5535
5661
  let newState;
@@ -5549,6 +5675,9 @@ function handleFeedMemberRemoved(event) {
5549
5675
  return newState ?? currentState;
5550
5676
  });
5551
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
+ };
5552
5681
  const sharedUpdateActivity$6 = ({
5553
5682
  currentActivity,
5554
5683
  event,
@@ -5556,7 +5685,9 @@ const sharedUpdateActivity$6 = ({
5556
5685
  }) => {
5557
5686
  let newOwnBookmarks = currentActivity.own_bookmarks;
5558
5687
  if (eventBelongsToCurrentUser) {
5559
- newOwnBookmarks = [...newOwnBookmarks, event.bookmark];
5688
+ newOwnBookmarks = currentActivity.own_bookmarks.filter(
5689
+ (bookmark) => !isSameBookmark(bookmark, event.bookmark)
5690
+ );
5560
5691
  }
5561
5692
  return {
5562
5693
  ...currentActivity,
@@ -5564,18 +5695,20 @@ const sharedUpdateActivity$6 = ({
5564
5695
  own_bookmarks: newOwnBookmarks
5565
5696
  };
5566
5697
  };
5567
- const addBookmarkToActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5698
+ const removeBookmarkFromActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5568
5699
  entities: activities,
5569
- 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))),
5570
5701
  updater: (matchedActivity) => sharedUpdateActivity$6({
5571
5702
  currentActivity: matchedActivity,
5572
5703
  event,
5573
5704
  eventBelongsToCurrentUser
5574
5705
  })
5575
5706
  });
5576
- const addBookmarkToPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
5707
+ const removeBookmarkFromPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
5577
5708
  entities: pinnedActivities,
5578
- 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
+ )),
5579
5712
  updater: (matchedPinnedActivity) => {
5580
5713
  const newActivity = sharedUpdateActivity$6({
5581
5714
  currentActivity: matchedPinnedActivity.activity,
@@ -5591,7 +5724,7 @@ const addBookmarkToPinnedActivities = (event, pinnedActivities, eventBelongsToCu
5591
5724
  };
5592
5725
  }
5593
5726
  });
5594
- function handleBookmarkAdded(event) {
5727
+ function handleBookmarkDeleted(event) {
5595
5728
  const {
5596
5729
  activities: currentActivities,
5597
5730
  pinned_activities: currentPinnedActivities
@@ -5599,12 +5732,12 @@ function handleBookmarkAdded(event) {
5599
5732
  const { connected_user: connectedUser } = this.client.state.getLatestValue();
5600
5733
  const eventBelongsToCurrentUser = event.bookmark.user.id === connectedUser?.id;
5601
5734
  const [result1, result2] = [
5602
- addBookmarkToActivities(
5735
+ removeBookmarkFromActivities(
5603
5736
  event,
5604
5737
  currentActivities,
5605
5738
  eventBelongsToCurrentUser
5606
5739
  ),
5607
- addBookmarkToPinnedActivities(
5740
+ removeBookmarkFromPinnedActivities(
5608
5741
  event,
5609
5742
  currentPinnedActivities,
5610
5743
  eventBelongsToCurrentUser
@@ -5617,9 +5750,6 @@ function handleBookmarkAdded(event) {
5617
5750
  });
5618
5751
  }
5619
5752
  }
5620
- const isSameBookmark = (bookmark1, bookmark2) => {
5621
- return bookmark1.user.id === bookmark2.user.id && bookmark1.activity.id === bookmark2.activity.id && bookmark1.folder?.id === bookmark2.folder?.id;
5622
- };
5623
5753
  const sharedUpdateActivity$5 = ({
5624
5754
  currentActivity,
5625
5755
  event,
@@ -5627,9 +5757,7 @@ const sharedUpdateActivity$5 = ({
5627
5757
  }) => {
5628
5758
  let newOwnBookmarks = currentActivity.own_bookmarks;
5629
5759
  if (eventBelongsToCurrentUser) {
5630
- newOwnBookmarks = currentActivity.own_bookmarks.filter(
5631
- (bookmark) => !isSameBookmark(bookmark, event.bookmark)
5632
- );
5760
+ newOwnBookmarks = [...newOwnBookmarks, event.bookmark];
5633
5761
  }
5634
5762
  return {
5635
5763
  ...currentActivity,
@@ -5637,18 +5765,20 @@ const sharedUpdateActivity$5 = ({
5637
5765
  own_bookmarks: newOwnBookmarks
5638
5766
  };
5639
5767
  };
5640
- const removeBookmarkFromActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5768
+ const addBookmarkToActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5641
5769
  entities: activities,
5642
- 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))),
5643
5771
  updater: (matchedActivity) => sharedUpdateActivity$5({
5644
5772
  currentActivity: matchedActivity,
5645
5773
  event,
5646
5774
  eventBelongsToCurrentUser
5647
5775
  })
5648
5776
  });
5649
- const removeBookmarkFromPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
5777
+ const addBookmarkToPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
5650
5778
  entities: pinnedActivities,
5651
- 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
+ )),
5652
5782
  updater: (matchedPinnedActivity) => {
5653
5783
  const newActivity = sharedUpdateActivity$5({
5654
5784
  currentActivity: matchedPinnedActivity.activity,
@@ -5664,7 +5794,7 @@ const removeBookmarkFromPinnedActivities = (event, pinnedActivities, eventBelong
5664
5794
  };
5665
5795
  }
5666
5796
  });
5667
- function handleBookmarkDeleted(event) {
5797
+ function handleBookmarkAdded(event) {
5668
5798
  const {
5669
5799
  activities: currentActivities,
5670
5800
  pinned_activities: currentPinnedActivities
@@ -5672,12 +5802,12 @@ function handleBookmarkDeleted(event) {
5672
5802
  const { connected_user: connectedUser } = this.client.state.getLatestValue();
5673
5803
  const eventBelongsToCurrentUser = event.bookmark.user.id === connectedUser?.id;
5674
5804
  const [result1, result2] = [
5675
- removeBookmarkFromActivities(
5805
+ addBookmarkToActivities(
5676
5806
  event,
5677
5807
  currentActivities,
5678
5808
  eventBelongsToCurrentUser
5679
5809
  ),
5680
- removeBookmarkFromPinnedActivities(
5810
+ addBookmarkToPinnedActivities(
5681
5811
  event,
5682
5812
  currentPinnedActivities,
5683
5813
  eventBelongsToCurrentUser
@@ -5698,7 +5828,7 @@ const sharedUpdateActivity$4 = ({
5698
5828
  let newOwnBookmarks = currentActivity.own_bookmarks;
5699
5829
  if (eventBelongsToCurrentUser) {
5700
5830
  const bookmarkIndex = newOwnBookmarks.findIndex(
5701
- (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
5702
5832
  );
5703
5833
  if (bookmarkIndex !== -1) {
5704
5834
  newOwnBookmarks = [...newOwnBookmarks];
@@ -5713,7 +5843,7 @@ const sharedUpdateActivity$4 = ({
5713
5843
  };
5714
5844
  const updateBookmarkInActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5715
5845
  entities: activities,
5716
- 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))),
5717
5847
  updater: (matchedActivity) => sharedUpdateActivity$4({
5718
5848
  currentActivity: matchedActivity,
5719
5849
  event,
@@ -5722,7 +5852,9 @@ const updateBookmarkInActivities = (event, activities, eventBelongsToCurrentUser
5722
5852
  });
5723
5853
  const updateBookmarkInPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
5724
5854
  entities: pinnedActivities,
5725
- 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
+ )),
5726
5858
  updater: (matchedPinnedActivity) => {
5727
5859
  const newActivity = sharedUpdateActivity$4({
5728
5860
  currentActivity: matchedPinnedActivity.activity,
@@ -5764,7 +5896,13 @@ function handleBookmarkUpdated(event) {
5764
5896
  });
5765
5897
  }
5766
5898
  }
5767
- function addActivitiesToState(newActivities, activities, position, { fromWebSocket } = { fromWebSocket: false }) {
5899
+ function addActivitiesToState(newActivities, activities, position, {
5900
+ hasOwnFields,
5901
+ backfillOwnFields
5902
+ } = {
5903
+ hasOwnFields: true,
5904
+ backfillOwnFields: true
5905
+ }) {
5768
5906
  if (activities === void 0) {
5769
5907
  return {
5770
5908
  changed: false,
@@ -5787,23 +5925,31 @@ function addActivitiesToState(newActivities, activities, position, { fromWebSock
5787
5925
  ...activities,
5788
5926
  ...position === "end" ? newActivitiesDeduplicated : []
5789
5927
  ];
5790
- this.newActivitiesAdded(newActivitiesDeduplicated, { fromWebSocket });
5928
+ this.activitiesAddedOrUpdated(newActivitiesDeduplicated, {
5929
+ hasOwnFields,
5930
+ backfillOwnFields
5931
+ });
5791
5932
  result = { changed: true, activities: updatedActivities };
5792
5933
  }
5793
5934
  return result;
5794
5935
  }
5795
5936
  function handleActivityAdded(event) {
5796
- if (this.activityAddedEventFilter) {
5797
- if (!this.activityAddedEventFilter(event)) {
5798
- return;
5799
- }
5937
+ const currentUser = this.client.state.getLatestValue().connected_user;
5938
+ const decision = this.resolveNewActivityDecision(
5939
+ event.activity,
5940
+ currentUser,
5941
+ false
5942
+ );
5943
+ if (decision === "ignore") {
5944
+ return;
5800
5945
  }
5946
+ const position = decision === "add-to-end" ? "end" : "start";
5801
5947
  const currentActivities = this.currentState.activities;
5802
5948
  const result = addActivitiesToState.bind(this)(
5803
5949
  [event.activity],
5804
5950
  currentActivities,
5805
- this.currentState.addNewActivitiesTo,
5806
- { fromWebSocket: true }
5951
+ position,
5952
+ { hasOwnFields: false, backfillOwnFields: true }
5807
5953
  );
5808
5954
  if (result.changed) {
5809
5955
  const activity = event.activity;
@@ -5835,7 +5981,19 @@ const removePinnedActivityFromState = (activityResponse, pinnedActivities) => {
5835
5981
  return { changed: false, pinned_activities: pinnedActivities };
5836
5982
  }
5837
5983
  };
5838
- 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
+ }
5839
5997
  const {
5840
5998
  activities: currentActivities,
5841
5999
  pinned_activities: currentPinnedActivities
@@ -5920,7 +6078,10 @@ function handleActivityUpdated(payload, fromWs) {
5920
6078
  updatePinnedActivityInState(payload, currentPinnedActivities)
5921
6079
  ];
5922
6080
  if (result1?.changed || result2.changed) {
5923
- this.client.hydratePollCache([payload.activity]);
6081
+ this.activitiesAddedOrUpdated([payload.activity], {
6082
+ hasOwnFields: payload.activity.current_feed?.own_capabilities !== void 0,
6083
+ backfillOwnFields: false
6084
+ });
5924
6085
  this.state.partialNext({
5925
6086
  activities: result1?.changed ? result1.entities : currentActivities,
5926
6087
  pinned_activities: result2.entities
@@ -6178,53 +6339,133 @@ function handleActivityReactionUpdated(payload, fromWs) {
6178
6339
  });
6179
6340
  }
6180
6341
  }
6181
- const updateNotificationStatusFromActivityMarked = (event, currentNotificationStatus, aggregatedActivities = []) => {
6182
- if (!currentNotificationStatus) {
6183
- return {
6184
- changed: false
6185
- };
6186
- }
6187
- const newState = {
6188
- ...currentNotificationStatus
6189
- };
6190
- if (event.mark_all_read) {
6191
- const allGroupIds = aggregatedActivities.map((activity) => activity.group);
6192
- newState.read_activities = [
6193
- .../* @__PURE__ */ new Set([
6194
- ...currentNotificationStatus.read_activities ?? [],
6195
- ...allGroupIds
6196
- ])
6197
- ];
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;
6198
6354
  }
6199
- if (event.mark_read && event.mark_read.length > 0) {
6200
- newState.read_activities = [
6201
- .../* @__PURE__ */ new Set([
6202
- ...currentNotificationStatus?.read_activities ?? [],
6203
- ...event.mark_read
6204
- ])
6205
- ];
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;
6206
6380
  }
6207
- if (event.mark_all_seen) {
6208
- 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
+ };
6209
6406
  }
6210
- return {
6211
- changed: true,
6212
- data: { notification_status: newState }
6213
- };
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
+ });
6214
6433
  };
6215
- function handleActivityMarked(event) {
6216
- const result = updateNotificationStatusFromActivityMarked(
6217
- event,
6218
- this.currentState.notification_status,
6219
- this.currentState.aggregated_activities
6220
- );
6221
- 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) {
6222
6452
  this.state.partialNext({
6223
- notification_status: result.data?.notification_status
6453
+ activities: result1.entities,
6454
+ pinned_activities: result2.entities
6224
6455
  });
6225
6456
  }
6226
6457
  }
6458
+ function handleFeedDeleted(event) {
6459
+ if (this.currentState.deleted_at) {
6460
+ return;
6461
+ }
6462
+ this.state.partialNext({ deleted_at: event.created_at });
6463
+ }
6227
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
+ }
6228
6469
  this.state.partialNext({ ...event.feed });
6229
6470
  }
6230
6471
  const addAggregatedActivitiesToState = (newAggregatedActivities, aggregatedActivities, position) => {
@@ -6273,11 +6514,20 @@ const addAggregatedActivitiesToState = (newAggregatedActivities, aggregatedActiv
6273
6514
  (a) => a.group
6274
6515
  );
6275
6516
  break;
6276
- case "replace":
6517
+ case "replace-then-end":
6277
6518
  result.aggregated_activities = replaceUniqueArrayMerge(
6278
6519
  aggregatedActivities ?? [],
6279
6520
  newAggregatedActivities,
6280
- (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"
6281
6531
  );
6282
6532
  break;
6283
6533
  }
@@ -6304,7 +6554,7 @@ const updateNotificationStatus = (newNotificationStatus, currentNotificationStat
6304
6554
  };
6305
6555
  }
6306
6556
  };
6307
- const updateNotificationFeedFromEvent = (event, currentAggregatedActivities, currentNotificationStatus) => {
6557
+ const updateNotificationFeedFromEvent = (event, currentAggregatedActivities, currentNotificationStatus, currentActivities) => {
6308
6558
  const updates = {};
6309
6559
  if (event.notification_status) {
6310
6560
  const notificationStatusResult = updateNotificationStatus(
@@ -6315,11 +6565,47 @@ const updateNotificationFeedFromEvent = (event, currentAggregatedActivities, cur
6315
6565
  updates.notification_status = notificationStatusResult.notification_status;
6316
6566
  }
6317
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
+ }
6318
6604
  if (event.aggregated_activities && currentAggregatedActivities) {
6319
6605
  const aggregatedActivitiesResult = addAggregatedActivitiesToState(
6320
6606
  event.aggregated_activities,
6321
- currentAggregatedActivities,
6322
- "start"
6607
+ updates.aggregated_activities ?? currentAggregatedActivities,
6608
+ "replace-then-start"
6323
6609
  );
6324
6610
  if (aggregatedActivitiesResult.changed) {
6325
6611
  updates.aggregated_activities = aggregatedActivitiesResult.aggregated_activities;
@@ -6339,12 +6625,14 @@ function handleNotificationFeedUpdated(event) {
6339
6625
  const result = updateNotificationFeedFromEvent(
6340
6626
  event,
6341
6627
  this.currentState.aggregated_activities,
6342
- this.currentState.notification_status
6628
+ this.currentState.notification_status,
6629
+ this.currentState.activities
6343
6630
  );
6344
6631
  if (result.changed) {
6345
6632
  this.state.partialNext({
6346
6633
  notification_status: result.data?.notification_status,
6347
- aggregated_activities: result.data?.aggregated_activities
6634
+ aggregated_activities: result.data?.aggregated_activities,
6635
+ activities: result.data?.activities ?? this.currentState.activities
6348
6636
  });
6349
6637
  }
6350
6638
  }
@@ -6394,7 +6682,7 @@ function updateStoriesFeedFromEvent(aggregatedActivities, activities, event) {
6394
6682
  const aggregatedActivitiesResult = addAggregatedActivitiesToState(
6395
6683
  event.aggregated_activities,
6396
6684
  aggregatedActivities,
6397
- "replace"
6685
+ "replace-then-end"
6398
6686
  );
6399
6687
  if (aggregatedActivitiesResult.changed) {
6400
6688
  result.data.aggregated_activities = aggregatedActivitiesResult.aggregated_activities;
@@ -6432,6 +6720,30 @@ function handleWatchStarted() {
6432
6720
  function handleWatchStopped() {
6433
6721
  this.state.partialNext({ watch: false });
6434
6722
  }
6723
+ const activityResolvers = [
6724
+ {
6725
+ matchesField: (field) => field === "activity_type",
6726
+ resolve: (activity) => activity.type
6727
+ },
6728
+ {
6729
+ matchesField: (field) => field === "within_bounds",
6730
+ resolve: (activity) => activity.location
6731
+ },
6732
+ {
6733
+ matchesField: () => true,
6734
+ resolve: (item, path) => resolveDotPathValue(item, path)
6735
+ }
6736
+ ];
6737
+ function activityFilter(activity, requestConfig) {
6738
+ const filter = requestConfig?.filter;
6739
+ if (!filter || typeof filter !== "object") {
6740
+ return true;
6741
+ }
6742
+ return itemMatchesFilter(activity, filter, {
6743
+ resolvers: [...activityResolvers],
6744
+ arrayEqMode: "contains"
6745
+ });
6746
+ }
6435
6747
  const DEFAULT_MAX_RETRIES = 3;
6436
6748
  function isRetryableError(error) {
6437
6749
  if (error instanceof StreamApiError) {
@@ -6464,61 +6776,6 @@ async function withRetry(fn, options = {}) {
6464
6776
  }
6465
6777
  throw lastError;
6466
6778
  }
6467
- const isPin = (entity) => {
6468
- return "activity" in entity;
6469
- };
6470
- const updateActivityFromFeedback = (feedback, activities) => {
6471
- if (!activities) {
6472
- return {
6473
- changed: false,
6474
- entities: []
6475
- };
6476
- }
6477
- return updateEntityInArray({
6478
- entities: activities,
6479
- matcher: (e) => isPin(e) ? e.activity.id === feedback.activity_id : e.id === feedback.activity_id,
6480
- updater: (e) => {
6481
- if (isPin(e)) {
6482
- return {
6483
- ...e,
6484
- activity: {
6485
- ...e.activity,
6486
- hidden: feedback.value === "true"
6487
- }
6488
- };
6489
- } else {
6490
- return {
6491
- ...e,
6492
- hidden: feedback.value === "true"
6493
- };
6494
- }
6495
- }
6496
- });
6497
- };
6498
- function handleActivityFeedback(event) {
6499
- const {
6500
- activities: currentActivities,
6501
- pinned_activities: currentPinnedActivities
6502
- } = this.currentState;
6503
- const { connected_user: connectedUser } = this.client.state.getLatestValue();
6504
- const eventBelongsToCurrentUser = event.activity_feedback.user.id === connectedUser?.id;
6505
- if (!eventBelongsToCurrentUser || event.activity_feedback.action !== "hide") {
6506
- return;
6507
- }
6508
- const [result1, result2] = [
6509
- updateActivityFromFeedback(event.activity_feedback, currentActivities),
6510
- updateActivityFromFeedback(
6511
- event.activity_feedback,
6512
- currentPinnedActivities
6513
- )
6514
- ];
6515
- if (result1.changed || result2.changed) {
6516
- this.state.partialNext({
6517
- activities: result1.entities,
6518
- pinned_activities: result2.entities
6519
- });
6520
- }
6521
- }
6522
6779
  const deepEqual = (x, y) => {
6523
6780
  if (x === y) {
6524
6781
  return true;
@@ -6623,9 +6880,9 @@ function clearQueuedFeeds() {
6623
6880
  queuedFeeds.clear();
6624
6881
  }
6625
6882
  const _Feed = class _Feed extends FeedApi {
6626
- constructor(client, groupId, id, data, watch = false, addNewActivitiesTo = "start", activityAddedEventFilter) {
6883
+ constructor(client, groupId, id, data, watch = false, onNewActivity) {
6627
6884
  super(client, groupId, id);
6628
- this.activityAddedEventFilter = activityAddedEventFilter;
6885
+ this.onNewActivity = onNewActivity;
6629
6886
  this.indexedActivityIds = /* @__PURE__ */ new Set();
6630
6887
  this.stateUpdateQueue = /* @__PURE__ */ new Set();
6631
6888
  this.eventHandlers = {
@@ -6645,7 +6902,7 @@ const _Feed = class _Feed extends FeedApi {
6645
6902
  "feeds.comment.deleted": handleCommentDeleted.bind(this),
6646
6903
  "feeds.comment.updated": handleCommentUpdated.bind(this),
6647
6904
  "feeds.feed.created": _Feed.noop,
6648
- "feeds.feed.deleted": _Feed.noop,
6905
+ "feeds.feed.deleted": handleFeedDeleted.bind(this),
6649
6906
  "feeds.feed.updated": handleFeedUpdated.bind(this),
6650
6907
  "feeds.feed_group.changed": _Feed.noop,
6651
6908
  "feeds.feed_group.deleted": _Feed.noop,
@@ -6668,9 +6925,9 @@ const _Feed = class _Feed extends FeedApi {
6668
6925
  "feeds.poll.vote_casted": _Feed.noop,
6669
6926
  "feeds.poll.vote_changed": _Feed.noop,
6670
6927
  "feeds.poll.vote_removed": _Feed.noop,
6671
- "feeds.activity.pinned": _Feed.noop,
6672
- "feeds.activity.unpinned": _Feed.noop,
6673
- "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,
6674
6931
  "moderation.custom_action": _Feed.noop,
6675
6932
  "moderation.flagged": _Feed.noop,
6676
6933
  "moderation.mark_reviewed": _Feed.noop,
@@ -6695,8 +6952,7 @@ const _Feed = class _Feed extends FeedApi {
6695
6952
  is_loading: false,
6696
6953
  is_loading_activities: false,
6697
6954
  comments_by_entity_id: {},
6698
- watch,
6699
- addNewActivitiesTo
6955
+ watch
6700
6956
  });
6701
6957
  this.client = client;
6702
6958
  this.state.subscribeWithSelector(
@@ -6717,9 +6973,6 @@ const _Feed = class _Feed extends FeedApi {
6717
6973
  get currentState() {
6718
6974
  return this.state.getLatestValue();
6719
6975
  }
6720
- set addNewActivitiesTo(value) {
6721
- this.state.partialNext({ addNewActivitiesTo: value });
6722
- }
6723
6976
  hasActivity(activityId) {
6724
6977
  return this.indexedActivityIds.has(activityId);
6725
6978
  }
@@ -6728,6 +6981,24 @@ const _Feed = class _Feed extends FeedApi {
6728
6981
  (pinnedActivity) => pinnedActivity.activity.id === activityId
6729
6982
  );
6730
6983
  }
6984
+ /**
6985
+ * Resolves how to handle a new activity (WS or HTTP): ignore, add-to-start, or add-to-end.
6986
+ * Uses onNewActivity if set; else default (current user + filter match) adds to start.
6987
+ */
6988
+ resolveNewActivityDecision(activity, currentUser, _fromHttp) {
6989
+ if (this.onNewActivity) {
6990
+ return this.onNewActivity({ activity, currentUser });
6991
+ }
6992
+ if (!currentUser) return "ignore";
6993
+ if (activity.user?.id !== currentUser.id) return "ignore";
6994
+ if (!activityFilter(
6995
+ activity,
6996
+ this.currentState.last_get_or_create_request_config
6997
+ )) {
6998
+ return "ignore";
6999
+ }
7000
+ return "add-to-start";
7001
+ }
6731
7002
  async synchronize() {
6732
7003
  const { last_get_or_create_request_config } = this.state.getLatestValue();
6733
7004
  if (last_get_or_create_request_config?.watch) {
@@ -6765,7 +7036,8 @@ const _Feed = class _Feed extends FeedApi {
6765
7036
  const result = addActivitiesToState.bind(this)(
6766
7037
  response.activities,
6767
7038
  currentActivities,
6768
- "end"
7039
+ "end",
7040
+ { hasOwnFields: true, backfillOwnFields: false }
6769
7041
  );
6770
7042
  const aggregatedActivitiesResult = addAggregatedActivitiesToState(
6771
7043
  response.aggregated_activities,
@@ -6814,7 +7086,7 @@ const _Feed = class _Feed extends FeedApi {
6814
7086
  return nextState;
6815
7087
  });
6816
7088
  }
6817
- this.newActivitiesAdded(response.activities);
7089
+ this.activitiesAddedOrUpdated(response.activities);
6818
7090
  return response;
6819
7091
  } finally {
6820
7092
  this.state.partialNext({
@@ -7189,11 +7461,41 @@ const _Feed = class _Feed extends FeedApi {
7189
7461
  next: currentState.next
7190
7462
  });
7191
7463
  }
7464
+ /**
7465
+ * Applies a new activity to this feed's state (decision + add to activities).
7466
+ * Used when the activity was added via this feed's addActivity or via client.addActivity.
7467
+ */
7468
+ addActivityFromHTTPResponse(activity) {
7469
+ const currentUser = this.client.state.getLatestValue().connected_user;
7470
+ const decision = this.resolveNewActivityDecision(
7471
+ activity,
7472
+ currentUser,
7473
+ true
7474
+ );
7475
+ if (decision !== "ignore") {
7476
+ const position = decision === "add-to-end" ? "end" : "start";
7477
+ const currentActivities = this.currentState.activities;
7478
+ const result = addActivitiesToState.bind(this)(
7479
+ [activity],
7480
+ currentActivities,
7481
+ position,
7482
+ {
7483
+ hasOwnFields: activity.current_feed?.own_capabilities !== void 0,
7484
+ backfillOwnFields: false
7485
+ }
7486
+ );
7487
+ if (result.changed) {
7488
+ this.client.hydratePollCache([activity]);
7489
+ this.state.partialNext({ activities: result.activities });
7490
+ }
7491
+ }
7492
+ }
7192
7493
  async addActivity(request) {
7193
7494
  const response = await this.client.addActivity({
7194
7495
  ...request,
7195
7496
  feeds: [this.feed]
7196
7497
  });
7498
+ this.addActivityFromHTTPResponse(response.activity);
7197
7499
  return response;
7198
7500
  }
7199
7501
  handleWSEvent(event) {
@@ -7214,7 +7516,7 @@ const _Feed = class _Feed extends FeedApi {
7214
7516
  }
7215
7517
  this.eventDispatcher.dispatch(event);
7216
7518
  }
7217
- newActivitiesAdded(activities, options = { fromWebSocket: false }) {
7519
+ activitiesAddedOrUpdated(activities, options = { hasOwnFields: true, backfillOwnFields: true }) {
7218
7520
  this.client.hydratePollCache(activities);
7219
7521
  this.getOrCreateFeeds(activities, options);
7220
7522
  }
@@ -7232,7 +7534,7 @@ const _Feed = class _Feed extends FeedApi {
7232
7534
  });
7233
7535
  const newFeeds = Array.from(feedsToGetOrCreate.values());
7234
7536
  const fieldsToUpdate = [];
7235
- if (!options.fromWebSocket) {
7537
+ if (options.hasOwnFields) {
7236
7538
  fieldsToUpdate.push("own_membership");
7237
7539
  if (!enrichmentOptions?.skip_own_capabilities) {
7238
7540
  fieldsToUpdate.push("own_capabilities");
@@ -7252,7 +7554,7 @@ const _Feed = class _Feed extends FeedApi {
7252
7554
  fieldsToUpdate
7253
7555
  });
7254
7556
  });
7255
- if (options.fromWebSocket) {
7557
+ if (!options.hasOwnFields && options.backfillOwnFields) {
7256
7558
  const uninitializedFeeds = newFeeds.filter((feedResponse) => {
7257
7559
  const feed = this.client.feed(feedResponse.group_id, feedResponse.id);
7258
7560
  return feed.currentState.own_capabilities === void 0;
@@ -7275,6 +7577,9 @@ const _Feed = class _Feed extends FeedApi {
7275
7577
  _Feed.noop = () => {
7276
7578
  };
7277
7579
  let Feed = _Feed;
7580
+ function applyNewActivityToActiveFeeds(activity) {
7581
+ return this.addActivityFromHTTPResponse(activity);
7582
+ }
7278
7583
  function handleUserUpdated(event) {
7279
7584
  this.state.next((currentState) => {
7280
7585
  let newState;
@@ -7354,7 +7659,9 @@ function disconnectActivityFromFeed(activity) {
7354
7659
  }
7355
7660
  }
7356
7661
  class ActivityWithStateUpdates {
7357
- constructor(id, feedsClient, { fromResponse } = { fromResponse: void 0 }) {
7662
+ constructor(id, feedsClient, { fromResponse } = {
7663
+ fromResponse: void 0
7664
+ }) {
7358
7665
  this.id = id;
7359
7666
  this.feedsClient = feedsClient;
7360
7667
  this.state = new StateStore({
@@ -7405,7 +7712,7 @@ class ActivityWithStateUpdates {
7405
7712
  initialState: activityResponse
7406
7713
  });
7407
7714
  if (this.feed) {
7408
- this.feed.activityAddedEventFilter = () => false;
7715
+ this.feed.onNewActivity = () => "ignore";
7409
7716
  }
7410
7717
  if (comments) {
7411
7718
  await this.loadNextPageActivityComments(comments);
@@ -7458,7 +7765,11 @@ class ActivityWithStateUpdates {
7458
7765
  const { activities } = addActivitiesToState.bind(this.feed)(
7459
7766
  [initialState],
7460
7767
  [],
7461
- "start"
7768
+ "start",
7769
+ {
7770
+ hasOwnFields: initialState.current_feed?.own_capabilities !== void 0,
7771
+ backfillOwnFields: false
7772
+ }
7462
7773
  );
7463
7774
  this.feed?.state.partialNext({
7464
7775
  activities
@@ -7730,6 +8041,53 @@ class FeedsClient extends FeedsApi {
7730
8041
  }
7731
8042
  return response;
7732
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
+ };
7733
8091
  this.addComment = async (request) => {
7734
8092
  const response = await super.addComment(request);
7735
8093
  const { comment } = response;
@@ -7815,6 +8173,121 @@ class FeedsClient extends FeedsApi {
7815
8173
  }
7816
8174
  return response;
7817
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
+ };
7818
8291
  this.queryPollAnswers = async (request) => {
7819
8292
  const filter = request.filter ?? {};
7820
8293
  const queryPollAnswersFilter = {
@@ -7889,18 +8362,12 @@ class FeedsClient extends FeedsApi {
7889
8362
  id,
7890
8363
  data,
7891
8364
  watch,
7892
- options2?.addNewActivitiesTo,
7893
- options2?.activityAddedEventFilter
8365
+ options2?.onNewActivity
7894
8366
  );
7895
8367
  }
7896
8368
  const feed = this.activeFeeds[fid];
7897
- if (!isCreated && options2) {
7898
- if (options2?.addNewActivitiesTo) {
7899
- feed.addNewActivitiesTo = options2.addNewActivitiesTo;
7900
- }
7901
- if (options2?.activityAddedEventFilter) {
7902
- feed.activityAddedEventFilter = options2.activityAddedEventFilter;
7903
- }
8369
+ if (!isCreated && options2?.onNewActivity !== void 0) {
8370
+ feed.onNewActivity = options2.onNewActivity;
7904
8371
  }
7905
8372
  if (!feed.currentState.watch) {
7906
8373
  if (!isCreated && data) {
@@ -8080,6 +8547,16 @@ class FeedsClient extends FeedsApi {
8080
8547
  });
8081
8548
  }
8082
8549
  }
8550
+ async addActivity(request) {
8551
+ const response = await super.addActivity(request);
8552
+ request.feeds.forEach((fid) => {
8553
+ const feed = this.activeFeeds[fid];
8554
+ if (feed) {
8555
+ applyNewActivityToActiveFeeds.call(feed, response.activity);
8556
+ }
8557
+ });
8558
+ return response;
8559
+ }
8083
8560
  async queryFeeds(request) {
8084
8561
  const response = await this._queryFeeds(request);
8085
8562
  const feedResponses = response.feeds;
@@ -8089,12 +8566,12 @@ class FeedsClient extends FeedsApi {
8089
8566
  id: feedResponse.id,
8090
8567
  data: feedResponse,
8091
8568
  watch: request?.watch,
8092
- fieldsToUpdate: [
8569
+ fieldsToUpdate: request?.enrich_own_fields ? [
8093
8570
  "own_capabilities",
8094
8571
  "own_follows",
8095
8572
  "own_membership",
8096
8573
  "own_followings"
8097
- ]
8574
+ ] : []
8098
8575
  })
8099
8576
  );
8100
8577
  return {
@@ -8126,10 +8603,21 @@ class FeedsClient extends FeedsApi {
8126
8603
  });
8127
8604
  return response;
8128
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
+ }
8129
8617
  // For follow API endpoints we update the state after HTTP response to allow queryFeeds with watch: false
8130
8618
  async follow(request) {
8131
8619
  const response = await super.follow(request);
8132
- this.updateStateFromFollows([response.follow]);
8620
+ this.updateStateFromFollows([response.follow], !!request.enrich_own_fields);
8133
8621
  return response;
8134
8622
  }
8135
8623
  /**
@@ -8139,12 +8627,12 @@ class FeedsClient extends FeedsApi {
8139
8627
  */
8140
8628
  async followBatch(request) {
8141
8629
  const response = await super.followBatch(request);
8142
- this.updateStateFromFollows(response.follows);
8630
+ this.updateStateFromFollows(response.follows, !!request.enrich_own_fields);
8143
8631
  return response;
8144
8632
  }
8145
8633
  async getOrCreateFollows(request) {
8146
8634
  const response = await super.getOrCreateFollows(request);
8147
- this.updateStateFromFollows(response.created);
8635
+ this.updateStateFromFollows(response.created, !!request.enrich_own_fields);
8148
8636
  return response;
8149
8637
  }
8150
8638
  async unfollow(request) {
@@ -8235,13 +8723,15 @@ class FeedsClient extends FeedsApi {
8235
8723
  }).map((a) => getFeed.call(a))
8236
8724
  ];
8237
8725
  }
8238
- updateStateFromFollows(follows) {
8726
+ updateStateFromFollows(follows, hasOwnFields) {
8239
8727
  follows.forEach((follow) => {
8240
8728
  const feeds = [
8241
8729
  ...this.findAllActiveFeedsByFid(follow.source_feed.feed),
8242
8730
  ...this.findAllActiveFeedsByFid(follow.target_feed.feed)
8243
8731
  ];
8244
- feeds.forEach((f) => handleFollowCreated.bind(f)({ follow }, false));
8732
+ feeds.forEach(
8733
+ (f) => handleFollowCreated.bind(f)({ follow }, false, hasOwnFields)
8734
+ );
8245
8735
  });
8246
8736
  }
8247
8737
  updateStateFromUnfollows(follows) {
@@ -8271,22 +8761,23 @@ export {
8271
8761
  Constants as C,
8272
8762
  FeedsClient as F,
8273
8763
  StreamApiError as S,
8274
- Feed as a,
8275
- StreamPoll as b,
8276
- checkHasAnotherPage as c,
8764
+ activityFilter as a,
8765
+ Feed as b,
8766
+ StreamPoll as c,
8277
8767
  debounce as d,
8278
- isFollowResponse as e,
8279
- isReactionResponse as f,
8280
- isCommentResponse as g,
8281
- isImageFile as h,
8768
+ checkHasAnotherPage as e,
8769
+ isFollowResponse as f,
8770
+ isReactionResponse as g,
8771
+ isCommentResponse as h,
8282
8772
  isVoteAnswer as i,
8283
- isVideoFile as j,
8284
- getStateUpdateQueueId as k,
8285
- updateEntityInArray as l,
8286
- feedsLoggerSystem as m,
8287
- ensureExhausted as n,
8773
+ isImageFile as j,
8774
+ isVideoFile as k,
8775
+ getStateUpdateQueueId as l,
8776
+ updateEntityInArray as m,
8777
+ feedsLoggerSystem as n,
8778
+ ensureExhausted as o,
8288
8779
  replaceUniqueArrayMerge as r,
8289
8780
  shouldUpdateState as s,
8290
8781
  uniqueArrayMerge as u
8291
8782
  };
8292
- //# sourceMappingURL=feeds-client-DeAqnd1a.mjs.map
8783
+ //# sourceMappingURL=feeds-client-jtUTE4AC.mjs.map