@stream-io/feeds-client 0.2.16 → 0.2.18

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 (82) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/cjs/index.js +1 -1
  3. package/dist/cjs/react-bindings.js +1 -1
  4. package/dist/es/index.mjs +2 -2
  5. package/dist/es/react-bindings.mjs +1 -1
  6. package/dist/{index-CaFrpjpl.js → index--koeDtxd.js} +310 -80
  7. package/dist/index--koeDtxd.js.map +1 -0
  8. package/dist/{index-J3MkoYPN.mjs → index-Zde8UE5f.mjs} +310 -80
  9. package/dist/index-Zde8UE5f.mjs.map +1 -0
  10. package/dist/tsconfig.tsbuildinfo +1 -1
  11. package/dist/types/common/real-time/StableWSConnection.d.ts +3 -3
  12. package/dist/types/feed/event-handlers/activity/handle-activity-added.d.ts +4 -3
  13. package/dist/types/feed/event-handlers/activity/handle-activity-added.d.ts.map +1 -1
  14. package/dist/types/feed/event-handlers/activity/handle-activity-reaction-updated.d.ts +14 -0
  15. package/dist/types/feed/event-handlers/activity/handle-activity-reaction-updated.d.ts.map +1 -0
  16. package/dist/types/feed/event-handlers/activity/handle-activity-updated.d.ts.map +1 -1
  17. package/dist/types/feed/event-handlers/activity/index.d.ts +1 -0
  18. package/dist/types/feed/event-handlers/activity/index.d.ts.map +1 -1
  19. package/dist/types/feed/event-handlers/activity-updater.d.ts +44 -0
  20. package/dist/types/feed/event-handlers/activity-updater.d.ts.map +1 -0
  21. package/dist/types/feed/event-handlers/add-aggregated-activities-to-state.d.ts +6 -0
  22. package/dist/types/feed/event-handlers/add-aggregated-activities-to-state.d.ts.map +1 -0
  23. package/dist/types/feed/event-handlers/comment/handle-comment-reaction-added.d.ts.map +1 -1
  24. package/dist/types/feed/event-handlers/comment/handle-comment-reaction-updated.d.ts +6 -0
  25. package/dist/types/feed/event-handlers/comment/handle-comment-reaction-updated.d.ts.map +1 -0
  26. package/dist/types/feed/event-handlers/comment/index.d.ts +1 -0
  27. package/dist/types/feed/event-handlers/comment/index.d.ts.map +1 -1
  28. package/dist/types/feed/event-handlers/index.d.ts +3 -1
  29. package/dist/types/feed/event-handlers/index.d.ts.map +1 -1
  30. package/dist/types/feed/event-handlers/{aggregated-feed/handle-aggregated-feed-updated.d.ts → notification-feed/handle-notification-feed-updated.d.ts} +2 -11
  31. package/dist/types/feed/event-handlers/notification-feed/handle-notification-feed-updated.d.ts.map +1 -0
  32. package/dist/types/feed/event-handlers/notification-feed/index.d.ts +2 -0
  33. package/dist/types/feed/event-handlers/notification-feed/index.d.ts.map +1 -0
  34. package/dist/types/feed/event-handlers/story-feeds/handle-story-feeds-updated.d.ts +15 -0
  35. package/dist/types/feed/event-handlers/story-feeds/handle-story-feeds-updated.d.ts.map +1 -0
  36. package/dist/types/feed/event-handlers/story-feeds/index.d.ts +2 -0
  37. package/dist/types/feed/event-handlers/story-feeds/index.d.ts.map +1 -0
  38. package/dist/types/feed/feed.d.ts +9 -3
  39. package/dist/types/feed/feed.d.ts.map +1 -1
  40. package/dist/types/feeds-client/feeds-client.d.ts +5 -3
  41. package/dist/types/feeds-client/feeds-client.d.ts.map +1 -1
  42. package/dist/types/gen/feeds/FeedsApi.d.ts.map +1 -1
  43. package/dist/types/gen/models/index.d.ts +43 -452
  44. package/dist/types/gen/models/index.d.ts.map +1 -1
  45. package/dist/types/utils/state-update-queue.d.ts +5 -1
  46. package/dist/types/utils/state-update-queue.d.ts.map +1 -1
  47. package/package.json +1 -1
  48. package/src/feed/event-handlers/activity/handle-activity-added.test.ts +16 -5
  49. package/src/feed/event-handlers/activity/handle-activity-added.ts +9 -11
  50. package/src/feed/event-handlers/activity/handle-activity-reaction-updated.test.ts +282 -0
  51. package/src/feed/event-handlers/activity/handle-activity-reaction-updated.ts +140 -0
  52. package/src/feed/event-handlers/activity/handle-activity-updated.ts +8 -16
  53. package/src/feed/event-handlers/activity/index.ts +1 -0
  54. package/src/feed/event-handlers/activity-updater.ts +15 -0
  55. package/src/feed/event-handlers/add-aggregated-activities-to-state.test.ts +510 -0
  56. package/src/feed/event-handlers/add-aggregated-activities-to-state.ts +72 -0
  57. package/src/feed/event-handlers/comment/handle-comment-reaction-added.ts +1 -2
  58. package/src/feed/event-handlers/comment/handle-comment-reaction-updated.test.ts +350 -0
  59. package/src/feed/event-handlers/comment/handle-comment-reaction-updated.ts +72 -0
  60. package/src/feed/event-handlers/comment/index.ts +1 -1
  61. package/src/feed/event-handlers/index.ts +3 -1
  62. package/src/feed/event-handlers/notification-feed/handle-notification-feed-updated.test.ts +182 -0
  63. package/src/feed/event-handlers/{aggregated-feed/handle-aggregated-feed-updated.ts → notification-feed/handle-notification-feed-updated.ts} +2 -94
  64. package/src/feed/event-handlers/notification-feed/index.ts +1 -0
  65. package/src/feed/event-handlers/story-feeds/handle-story-feeds-updated.test.ts +45 -0
  66. package/src/feed/event-handlers/story-feeds/handle-story-feeds-updated.ts +122 -0
  67. package/src/feed/event-handlers/story-feeds/index.ts +1 -0
  68. package/src/feed/feed.ts +16 -2
  69. package/src/feeds-client/feeds-client.ts +36 -6
  70. package/src/gen/feeds/FeedsApi.ts +5 -0
  71. package/src/gen/model-decoders/decoders.ts +10 -4
  72. package/src/gen/models/index.ts +76 -835
  73. package/src/test-utils/response-generators.ts +89 -1
  74. package/src/utils/state-update-queue.ts +14 -2
  75. package/dist/index-CaFrpjpl.js.map +0 -1
  76. package/dist/index-J3MkoYPN.mjs.map +0 -1
  77. package/dist/types/feed/event-handlers/aggregated-feed/handle-aggregated-feed-updated.d.ts.map +0 -1
  78. package/dist/types/feed/event-handlers/aggregated-feed/index.d.ts +0 -2
  79. package/dist/types/feed/event-handlers/aggregated-feed/index.d.ts.map +0 -1
  80. package/src/feed/event-handlers/activity/activity-utils.test.ts +0 -252
  81. package/src/feed/event-handlers/aggregated-feed/handle-aggregated-feed-updated.test.ts +0 -644
  82. package/src/feed/event-handlers/aggregated-feed/index.ts +0 -1
@@ -889,8 +889,9 @@ decoders.MessageResponse = (input) => {
889
889
  decoders.ModerationCustomActionEvent = (input) => {
890
890
  const typeMappings = {
891
891
  created_at: { type: "DatetimeType", isSingle: true },
892
- message: { type: "Message", isSingle: true },
893
- user: { type: "User", isSingle: true }
892
+ review_queue_item: { type: "ReviewQueueItemResponse", isSingle: true },
893
+ received_at: { type: "DatetimeType", isSingle: true },
894
+ message: { type: "MessageResponse", isSingle: true }
894
895
  };
895
896
  return decode(typeMappings, input);
896
897
  };
@@ -913,8 +914,9 @@ decoders.ModerationFlaggedEvent = (input) => {
913
914
  decoders.ModerationMarkReviewedEvent = (input) => {
914
915
  const typeMappings = {
915
916
  created_at: { type: "DatetimeType", isSingle: true },
916
- message: { type: "Message", isSingle: true },
917
- user: { type: "User", isSingle: true }
917
+ item: { type: "ReviewQueueItemResponse", isSingle: true },
918
+ received_at: { type: "DatetimeType", isSingle: true },
919
+ message: { type: "MessageResponse", isSingle: true }
918
920
  };
919
921
  return decode(typeMappings, input);
920
922
  };
@@ -1268,6 +1270,7 @@ decoders.StoriesFeedUpdatedEvent = (input) => {
1268
1270
  const typeMappings = {
1269
1271
  created_at: { type: "DatetimeType", isSingle: true },
1270
1272
  received_at: { type: "DatetimeType", isSingle: true },
1273
+ activities: { type: "ActivityResponse", isSingle: false },
1271
1274
  aggregated_activities: {
1272
1275
  type: "AggregatedActivityResponse",
1273
1276
  isSingle: false
@@ -1489,6 +1492,8 @@ class FeedsApi {
1489
1492
  const body = {
1490
1493
  name: request?.name,
1491
1494
  words: request?.words,
1495
+ is_leet_check_enabled: request?.is_leet_check_enabled,
1496
+ is_plural_check_enabled: request?.is_plural_check_enabled,
1492
1497
  team: request?.team,
1493
1498
  type: request?.type
1494
1499
  };
@@ -1524,6 +1529,8 @@ class FeedsApi {
1524
1529
  name: request?.name
1525
1530
  };
1526
1531
  const body = {
1532
+ is_leet_check_enabled: request?.is_leet_check_enabled,
1533
+ is_plural_check_enabled: request?.is_plural_check_enabled,
1527
1534
  team: request?.team,
1528
1535
  words: request?.words
1529
1536
  };
@@ -1720,7 +1727,8 @@ class FeedsApi {
1720
1727
  mute_user: request?.mute_user,
1721
1728
  reason: request?.reason,
1722
1729
  report: request?.report,
1723
- show_less: request?.show_less
1730
+ show_less: request?.show_less,
1731
+ show_more: request?.show_more
1724
1732
  };
1725
1733
  const response = await this.apiClient.sendRequest(
1726
1734
  "POST",
@@ -3740,7 +3748,7 @@ const getRateLimitFromResponseHeader = (response_headers) => {
3740
3748
  };
3741
3749
  return result;
3742
3750
  };
3743
- const version = "0.2.16";
3751
+ const version = "0.2.18";
3744
3752
  class ApiClient {
3745
3753
  constructor(apiKey, tokenManager, connectionIdManager, options) {
3746
3754
  this.apiKey = apiKey;
@@ -4549,14 +4557,16 @@ function getStateUpdateQueueId(...args) {
4549
4557
  return toJoin.concat([data.activity.id]).join("-");
4550
4558
  }
4551
4559
  case "activity-reaction-created":
4552
- case "activity-reaction-deleted": {
4560
+ case "activity-reaction-deleted":
4561
+ case "activity-reaction-updated": {
4553
4562
  return toJoin.concat([
4554
4563
  data.activity.id,
4555
4564
  data.reaction.type
4556
4565
  ]).join("-");
4557
4566
  }
4558
4567
  case "comment-reaction-created":
4559
- case "comment-reaction-deleted": {
4568
+ case "comment-reaction-deleted":
4569
+ case "comment-reaction-updated": {
4560
4570
  return toJoin.concat([
4561
4571
  data.comment.id,
4562
4572
  data.reaction.type
@@ -4916,7 +4926,6 @@ function handleCommentReactionAdded(payload, fromWs) {
4916
4926
  newComments[commentIndex] = {
4917
4927
  ...newComments[commentIndex],
4918
4928
  reaction_count: comment.reaction_count ?? 0,
4919
- // TODO: FIXME this should be handled by the backend
4920
4929
  latest_reactions: comment.latest_reactions ?? [],
4921
4930
  reaction_groups: comment.reaction_groups ?? {},
4922
4931
  own_reactions: ownReactions
@@ -4981,6 +4990,51 @@ function handleCommentReactionDeleted(payload, fromWs) {
4981
4990
  };
4982
4991
  });
4983
4992
  }
4993
+ function handleCommentReactionUpdated(payload, fromWs) {
4994
+ const { comment, reaction } = payload;
4995
+ const connectedUser = this.client.state.getLatestValue().connected_user;
4996
+ const isOwnReaction = reaction.user.id === connectedUser?.id;
4997
+ if (!shouldUpdateState({
4998
+ stateUpdateQueueId: getStateUpdateQueueId(
4999
+ payload,
5000
+ "comment-reaction-updated"
5001
+ ),
5002
+ stateUpdateQueue: this.stateUpdateQueue,
5003
+ watch: this.currentState.watch,
5004
+ fromWs,
5005
+ isTriggeredByConnectedUser: isOwnReaction
5006
+ })) {
5007
+ return;
5008
+ }
5009
+ this.state.next((currentState) => {
5010
+ const commentIndex = this.getCommentIndex(comment, currentState);
5011
+ if (commentIndex === -1) return currentState;
5012
+ const forId = comment.parent_id ?? comment.object_id;
5013
+ const entityState = currentState.comments_by_entity_id[forId];
5014
+ const newComments = entityState?.comments?.concat([]) ?? [];
5015
+ let ownReactions = newComments[commentIndex].own_reactions;
5016
+ if (isOwnReaction) {
5017
+ ownReactions = [reaction];
5018
+ }
5019
+ newComments[commentIndex] = {
5020
+ ...newComments[commentIndex],
5021
+ reaction_count: comment.reaction_count ?? 0,
5022
+ latest_reactions: comment.latest_reactions ?? [],
5023
+ reaction_groups: comment.reaction_groups ?? {},
5024
+ own_reactions: ownReactions
5025
+ };
5026
+ return {
5027
+ ...currentState,
5028
+ comments_by_entity_id: {
5029
+ ...currentState.comments_by_entity_id,
5030
+ [forId]: {
5031
+ ...entityState,
5032
+ comments: newComments
5033
+ }
5034
+ }
5035
+ };
5036
+ });
5037
+ }
4984
5038
  function handleFeedMemberAdded(event) {
4985
5039
  const { connected_user: connectedUser } = this.client.state.getLatestValue();
4986
5040
  this.state.next((currentState) => {
@@ -5044,7 +5098,7 @@ function handleFeedMemberRemoved(event) {
5044
5098
  return newState ?? currentState;
5045
5099
  });
5046
5100
  }
5047
- const sharedUpdateActivity$5 = ({
5101
+ const sharedUpdateActivity$6 = ({
5048
5102
  currentActivity,
5049
5103
  event,
5050
5104
  eventBelongsToCurrentUser
@@ -5062,7 +5116,7 @@ const sharedUpdateActivity$5 = ({
5062
5116
  const addBookmarkToActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5063
5117
  entities: activities,
5064
5118
  matcher: (activity) => activity.id === event.bookmark.activity.id,
5065
- updater: (matchedActivity) => sharedUpdateActivity$5({
5119
+ updater: (matchedActivity) => sharedUpdateActivity$6({
5066
5120
  currentActivity: matchedActivity,
5067
5121
  event,
5068
5122
  eventBelongsToCurrentUser
@@ -5072,7 +5126,7 @@ const addBookmarkToPinnedActivities = (event, pinnedActivities, eventBelongsToCu
5072
5126
  entities: pinnedActivities,
5073
5127
  matcher: (pinnedActivity) => pinnedActivity.activity.id === event.bookmark.activity.id,
5074
5128
  updater: (matchedPinnedActivity) => {
5075
- const newActivity = sharedUpdateActivity$5({
5129
+ const newActivity = sharedUpdateActivity$6({
5076
5130
  currentActivity: matchedPinnedActivity.activity,
5077
5131
  event,
5078
5132
  eventBelongsToCurrentUser
@@ -5115,7 +5169,7 @@ function handleBookmarkAdded(event) {
5115
5169
  const isSameBookmark = (bookmark1, bookmark2) => {
5116
5170
  return bookmark1.user.id === bookmark2.user.id && bookmark1.activity.id === bookmark2.activity.id && bookmark1.folder?.id === bookmark2.folder?.id;
5117
5171
  };
5118
- const sharedUpdateActivity$4 = ({
5172
+ const sharedUpdateActivity$5 = ({
5119
5173
  currentActivity,
5120
5174
  event,
5121
5175
  eventBelongsToCurrentUser
@@ -5135,7 +5189,7 @@ const sharedUpdateActivity$4 = ({
5135
5189
  const removeBookmarkFromActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5136
5190
  entities: activities,
5137
5191
  matcher: (activity) => activity.id === event.bookmark.activity.id,
5138
- updater: (matchedActivity) => sharedUpdateActivity$4({
5192
+ updater: (matchedActivity) => sharedUpdateActivity$5({
5139
5193
  currentActivity: matchedActivity,
5140
5194
  event,
5141
5195
  eventBelongsToCurrentUser
@@ -5145,7 +5199,7 @@ const removeBookmarkFromPinnedActivities = (event, pinnedActivities, eventBelong
5145
5199
  entities: pinnedActivities,
5146
5200
  matcher: (pinnedActivity) => pinnedActivity.activity.id === event.bookmark.activity.id,
5147
5201
  updater: (matchedPinnedActivity) => {
5148
- const newActivity = sharedUpdateActivity$4({
5202
+ const newActivity = sharedUpdateActivity$5({
5149
5203
  currentActivity: matchedPinnedActivity.activity,
5150
5204
  event,
5151
5205
  eventBelongsToCurrentUser
@@ -5185,7 +5239,7 @@ function handleBookmarkDeleted(event) {
5185
5239
  });
5186
5240
  }
5187
5241
  }
5188
- const sharedUpdateActivity$3 = ({
5242
+ const sharedUpdateActivity$4 = ({
5189
5243
  currentActivity,
5190
5244
  event,
5191
5245
  eventBelongsToCurrentUser
@@ -5209,7 +5263,7 @@ const sharedUpdateActivity$3 = ({
5209
5263
  const updateBookmarkInActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5210
5264
  entities: activities,
5211
5265
  matcher: (activity) => activity.id === event.bookmark.activity.id,
5212
- updater: (matchedActivity) => sharedUpdateActivity$3({
5266
+ updater: (matchedActivity) => sharedUpdateActivity$4({
5213
5267
  currentActivity: matchedActivity,
5214
5268
  event,
5215
5269
  eventBelongsToCurrentUser
@@ -5219,7 +5273,7 @@ const updateBookmarkInPinnedActivities = (event, pinnedActivities, eventBelongsT
5219
5273
  entities: pinnedActivities,
5220
5274
  matcher: (pinnedActivity) => pinnedActivity.activity.id === event.bookmark.activity.id,
5221
5275
  updater: (matchedPinnedActivity) => {
5222
- const newActivity = sharedUpdateActivity$3({
5276
+ const newActivity = sharedUpdateActivity$4({
5223
5277
  currentActivity: matchedPinnedActivity.activity,
5224
5278
  event,
5225
5279
  eventBelongsToCurrentUser
@@ -5260,19 +5314,16 @@ function handleBookmarkUpdated(event) {
5260
5314
  }
5261
5315
  }
5262
5316
  function addActivitiesToState(newActivities, activities, position) {
5263
- let result;
5264
5317
  if (activities === void 0) {
5265
- activities = [];
5266
- result = {
5267
- changed: true,
5268
- activities
5269
- };
5270
- } else {
5271
- result = {
5318
+ return {
5272
5319
  changed: false,
5273
- activities
5320
+ activities: []
5274
5321
  };
5275
5322
  }
5323
+ let result = {
5324
+ changed: false,
5325
+ activities
5326
+ };
5276
5327
  const newActivitiesDeduplicated = [];
5277
5328
  newActivities.forEach((newActivityResponse) => {
5278
5329
  if (!this.hasActivity(newActivityResponse.id)) {
@@ -5294,7 +5345,7 @@ function handleActivityAdded(event) {
5294
5345
  const result = addActivitiesToState.bind(this)(
5295
5346
  [event.activity],
5296
5347
  currentActivities,
5297
- "start"
5348
+ this.currentState.addNewActivitiesTo
5298
5349
  );
5299
5350
  if (result.changed) {
5300
5351
  this.client.hydratePollCache([event.activity]);
@@ -5350,31 +5401,32 @@ function handleActivityRemovedFromFeed(event) {
5350
5401
  }
5351
5402
  }
5352
5403
  }
5353
- const sharedUpdateActivity$2 = ({
5404
+ const updateActivity = ({
5354
5405
  currentActivity,
5355
- event
5406
+ newActivtiy
5356
5407
  }) => {
5357
5408
  return {
5358
- ...event.activity,
5409
+ ...newActivtiy,
5359
5410
  own_reactions: currentActivity.own_reactions,
5360
5411
  own_bookmarks: currentActivity.own_bookmarks
5361
5412
  };
5362
5413
  };
5414
+ const sharedUpdateActivity$3 = updateActivity;
5363
5415
  const updateActivityInState = (event, activities) => updateEntityInArray({
5364
5416
  entities: activities,
5365
5417
  matcher: (activity) => activity.id === event.activity.id,
5366
- updater: (matchedActivity) => sharedUpdateActivity$2({
5418
+ updater: (matchedActivity) => sharedUpdateActivity$3({
5367
5419
  currentActivity: matchedActivity,
5368
- event
5420
+ newActivtiy: event.activity
5369
5421
  })
5370
5422
  });
5371
5423
  const updatePinnedActivityInState = (event, pinnedActivities) => updateEntityInArray({
5372
5424
  entities: pinnedActivities,
5373
5425
  matcher: (pinnedActivity) => pinnedActivity.activity.id === event.activity.id,
5374
5426
  updater: (matchedPinnedActivity) => {
5375
- const newActivity = sharedUpdateActivity$2({
5427
+ const newActivity = sharedUpdateActivity$3({
5376
5428
  currentActivity: matchedPinnedActivity.activity,
5377
- event
5429
+ newActivtiy: event.activity
5378
5430
  });
5379
5431
  if (newActivity === matchedPinnedActivity.activity) {
5380
5432
  return matchedPinnedActivity;
@@ -5414,7 +5466,7 @@ function handleActivityUpdated(payload, fromWs) {
5414
5466
  });
5415
5467
  }
5416
5468
  }
5417
- const sharedUpdateActivity$1 = ({
5469
+ const sharedUpdateActivity$2 = ({
5418
5470
  payload,
5419
5471
  currentActivity,
5420
5472
  eventBelongsToCurrentUser
@@ -5435,7 +5487,7 @@ const sharedUpdateActivity$1 = ({
5435
5487
  const addReactionToActivities = (payload, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5436
5488
  entities: activities,
5437
5489
  matcher: (activity) => activity.id === payload.activity.id,
5438
- updater: (matchedActivity) => sharedUpdateActivity$1({
5490
+ updater: (matchedActivity) => sharedUpdateActivity$2({
5439
5491
  payload,
5440
5492
  currentActivity: matchedActivity,
5441
5493
  eventBelongsToCurrentUser
@@ -5445,7 +5497,7 @@ const addReactionToPinnedActivities = (payload, pinnedActivities, eventBelongsTo
5445
5497
  entities: pinnedActivities,
5446
5498
  matcher: (pinnedActivity) => pinnedActivity.activity.id === payload.activity.id,
5447
5499
  updater: (matchedPinnedActivity) => {
5448
- const updatedActivity = sharedUpdateActivity$1({
5500
+ const updatedActivity = sharedUpdateActivity$2({
5449
5501
  payload,
5450
5502
  currentActivity: matchedPinnedActivity.activity,
5451
5503
  eventBelongsToCurrentUser
@@ -5497,7 +5549,7 @@ function handleActivityReactionAdded(payload, fromWs) {
5497
5549
  });
5498
5550
  }
5499
5551
  }
5500
- const sharedUpdateActivity = ({
5552
+ const sharedUpdateActivity$1 = ({
5501
5553
  currentActivity,
5502
5554
  payload,
5503
5555
  eventBelongsToCurrentUser
@@ -5520,7 +5572,7 @@ const sharedUpdateActivity = ({
5520
5572
  const removeReactionFromActivities = (payload, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5521
5573
  entities: activities,
5522
5574
  matcher: (activity) => activity.id === payload.activity.id,
5523
- updater: (matchedActivity) => sharedUpdateActivity({
5575
+ updater: (matchedActivity) => sharedUpdateActivity$1({
5524
5576
  currentActivity: matchedActivity,
5525
5577
  payload,
5526
5578
  eventBelongsToCurrentUser
@@ -5530,7 +5582,7 @@ const removeReactionFromPinnedActivities = (payload, activities, eventBelongsToC
5530
5582
  entities: activities,
5531
5583
  matcher: (pinnedActivity) => pinnedActivity.activity.id === payload.activity.id,
5532
5584
  updater: (matchedPinnedActivity) => {
5533
- const newActivity = sharedUpdateActivity({
5585
+ const newActivity = sharedUpdateActivity$1({
5534
5586
  currentActivity: matchedPinnedActivity.activity,
5535
5587
  payload,
5536
5588
  eventBelongsToCurrentUser
@@ -5582,6 +5634,89 @@ function handleActivityReactionDeleted(payload, fromWs) {
5582
5634
  });
5583
5635
  }
5584
5636
  }
5637
+ const sharedUpdateActivity = ({
5638
+ payload,
5639
+ currentActivity,
5640
+ eventBelongsToCurrentUser
5641
+ }) => {
5642
+ const { activity: newActivity, reaction: newReaction } = payload;
5643
+ let ownReactions = currentActivity.own_reactions;
5644
+ if (eventBelongsToCurrentUser) {
5645
+ ownReactions = [newReaction];
5646
+ }
5647
+ return {
5648
+ ...currentActivity,
5649
+ latest_reactions: newActivity.latest_reactions,
5650
+ reaction_groups: newActivity.reaction_groups,
5651
+ reaction_count: newActivity.reaction_count,
5652
+ own_reactions: ownReactions
5653
+ };
5654
+ };
5655
+ const updateReactionInActivities = (payload, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5656
+ entities: activities,
5657
+ matcher: (activity) => activity.id === payload.activity.id,
5658
+ updater: (matchedActivity) => sharedUpdateActivity({
5659
+ payload,
5660
+ currentActivity: matchedActivity,
5661
+ eventBelongsToCurrentUser
5662
+ })
5663
+ });
5664
+ const updateReactionInPinnedActivities = (payload, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
5665
+ entities: pinnedActivities,
5666
+ matcher: (pinnedActivity) => pinnedActivity.activity.id === payload.activity.id,
5667
+ updater: (matchedPinnedActivity) => {
5668
+ const updatedActivity = sharedUpdateActivity({
5669
+ payload,
5670
+ currentActivity: matchedPinnedActivity.activity,
5671
+ eventBelongsToCurrentUser
5672
+ });
5673
+ if (updatedActivity === matchedPinnedActivity.activity) {
5674
+ return matchedPinnedActivity;
5675
+ }
5676
+ return {
5677
+ ...matchedPinnedActivity,
5678
+ activity: updatedActivity
5679
+ };
5680
+ }
5681
+ });
5682
+ function handleActivityReactionUpdated(payload, fromWs) {
5683
+ const connectedUser = this.client.state.getLatestValue().connected_user;
5684
+ const eventBelongsToCurrentUser = typeof connectedUser !== "undefined" && payload.reaction.user.id === connectedUser.id;
5685
+ if (!shouldUpdateState({
5686
+ stateUpdateQueueId: getStateUpdateQueueId(
5687
+ payload,
5688
+ "activity-reaction-updated"
5689
+ ),
5690
+ stateUpdateQueue: this.stateUpdateQueue,
5691
+ watch: this.currentState.watch,
5692
+ fromWs,
5693
+ isTriggeredByConnectedUser: eventBelongsToCurrentUser
5694
+ })) {
5695
+ return;
5696
+ }
5697
+ const {
5698
+ activities: currentActivities,
5699
+ pinned_activities: currentPinnedActivities
5700
+ } = this.currentState;
5701
+ const [result1, result2] = [
5702
+ this.hasActivity(payload.activity.id) ? updateReactionInActivities(
5703
+ payload,
5704
+ currentActivities,
5705
+ eventBelongsToCurrentUser
5706
+ ) : void 0,
5707
+ updateReactionInPinnedActivities(
5708
+ payload,
5709
+ currentPinnedActivities,
5710
+ eventBelongsToCurrentUser
5711
+ )
5712
+ ];
5713
+ if (result1?.changed || result2.changed) {
5714
+ this.state.partialNext({
5715
+ ...result1 ? { activities: result1.entities } : {},
5716
+ pinned_activities: result2.entities
5717
+ });
5718
+ }
5719
+ }
5585
5720
  const updateNotificationStatusFromActivityMarked = (event, currentNotificationStatus, aggregatedActivities = []) => {
5586
5721
  if (!currentNotificationStatus) {
5587
5722
  return {
@@ -5636,36 +5771,55 @@ const addAggregatedActivitiesToState = (newAggregatedActivities, aggregatedActiv
5636
5771
  if (newAggregatedActivities.length === 0) {
5637
5772
  result = {
5638
5773
  changed: false,
5639
- aggregated_activities: []
5774
+ aggregated_activities: aggregatedActivities ?? []
5640
5775
  };
5641
5776
  } else {
5642
5777
  result = {
5643
5778
  changed: true,
5644
5779
  aggregated_activities: []
5645
5780
  };
5646
- }
5647
- switch (position) {
5648
- case "start":
5649
- result.aggregated_activities = uniqueArrayMerge(
5650
- newAggregatedActivities,
5651
- aggregatedActivities ?? [],
5652
- (a) => a.group
5781
+ newAggregatedActivities.forEach((newAggregatedActivity) => {
5782
+ const existingAggregatedActivity = aggregatedActivities?.find(
5783
+ (a) => a.group === newAggregatedActivity.group
5653
5784
  );
5654
- break;
5655
- case "end":
5656
- result.aggregated_activities = uniqueArrayMerge(
5657
- aggregatedActivities ?? [],
5658
- newAggregatedActivities,
5659
- (a) => a.group
5660
- );
5661
- break;
5662
- case "replace":
5663
- result.aggregated_activities = replaceUniqueArrayMerge(
5664
- aggregatedActivities ?? [],
5665
- newAggregatedActivities,
5666
- (a) => a.group
5667
- );
5668
- break;
5785
+ if (existingAggregatedActivity) {
5786
+ for (let i = 0; i < newAggregatedActivity.activities.length; i++) {
5787
+ const activity = newAggregatedActivity.activities[i];
5788
+ const existingActivity = existingAggregatedActivity.activities.find(
5789
+ (a) => a.id === activity.id
5790
+ );
5791
+ if (existingActivity) {
5792
+ newAggregatedActivity.activities[i] = updateActivity({
5793
+ currentActivity: existingActivity,
5794
+ newActivtiy: activity
5795
+ });
5796
+ }
5797
+ }
5798
+ }
5799
+ });
5800
+ switch (position) {
5801
+ case "start":
5802
+ result.aggregated_activities = uniqueArrayMerge(
5803
+ newAggregatedActivities,
5804
+ aggregatedActivities ?? [],
5805
+ (a) => a.group
5806
+ );
5807
+ break;
5808
+ case "end":
5809
+ result.aggregated_activities = uniqueArrayMerge(
5810
+ aggregatedActivities ?? [],
5811
+ newAggregatedActivities,
5812
+ (a) => a.group
5813
+ );
5814
+ break;
5815
+ case "replace":
5816
+ result.aggregated_activities = replaceUniqueArrayMerge(
5817
+ aggregatedActivities ?? [],
5818
+ newAggregatedActivities,
5819
+ (a) => a.group
5820
+ );
5821
+ break;
5822
+ }
5669
5823
  }
5670
5824
  return result;
5671
5825
  };
@@ -5691,7 +5845,7 @@ const updateNotificationStatus = (newNotificationStatus, currentNotificationStat
5691
5845
  };
5692
5846
  const updateNotificationFeedFromEvent = (event, currentAggregatedActivities, currentNotificationStatus) => {
5693
5847
  const updates = {};
5694
- if (event.notification_status && currentNotificationStatus) {
5848
+ if (event.notification_status) {
5695
5849
  const notificationStatusResult = updateNotificationStatus(
5696
5850
  event.notification_status,
5697
5851
  currentNotificationStatus
@@ -5733,18 +5887,65 @@ function handleNotificationFeedUpdated(event) {
5733
5887
  });
5734
5888
  }
5735
5889
  }
5736
- function updateStoriesFeedFromEvent(aggregatedActivities, event) {
5737
- if (!aggregatedActivities) {
5890
+ const updateActivities = (activitiesToUpsert, currentActivities) => {
5891
+ if (!activitiesToUpsert || activitiesToUpsert.length === 0 || !currentActivities) {
5892
+ return {
5893
+ changed: false,
5894
+ activities: currentActivities ?? []
5895
+ };
5896
+ }
5897
+ const result = [];
5898
+ for (let i = 0; i < currentActivities.length; i++) {
5899
+ const activity = currentActivities[i];
5900
+ const updatedActivity = activitiesToUpsert.find(
5901
+ (a) => a.id === activity.id
5902
+ );
5903
+ if (updatedActivity) {
5904
+ result.push(
5905
+ updateActivity({
5906
+ currentActivity: activity,
5907
+ newActivtiy: updatedActivity
5908
+ })
5909
+ );
5910
+ } else {
5911
+ result.push(activity);
5912
+ }
5913
+ }
5914
+ return {
5915
+ changed: true,
5916
+ activities: result
5917
+ };
5918
+ };
5919
+ function updateStoriesFeedFromEvent(aggregatedActivities, activities, event) {
5920
+ if (!aggregatedActivities && event.aggregated_activities && event.aggregated_activities?.length > 0 || !activities && event.activities && event.activities?.length > 0) {
5738
5921
  return {
5739
5922
  changed: false
5740
5923
  };
5741
5924
  }
5925
+ const result = {
5926
+ changed: true,
5927
+ data: {
5928
+ aggregated_activities: aggregatedActivities,
5929
+ activities
5930
+ }
5931
+ };
5742
5932
  if (event.aggregated_activities) {
5743
- const result = addAggregatedActivitiesToState(
5933
+ const aggregatedActivitiesResult = addAggregatedActivitiesToState(
5744
5934
  event.aggregated_activities,
5745
5935
  aggregatedActivities,
5746
5936
  "replace"
5747
5937
  );
5938
+ if (aggregatedActivitiesResult.changed) {
5939
+ result.data.aggregated_activities = aggregatedActivitiesResult.aggregated_activities;
5940
+ }
5941
+ }
5942
+ if (event.activities) {
5943
+ const activitiesResult = updateActivities(event.activities, activities);
5944
+ if (activitiesResult.changed) {
5945
+ result.data.activities = activitiesResult.activities;
5946
+ }
5947
+ }
5948
+ if (event.aggregated_activities || event.activities) {
5748
5949
  return result;
5749
5950
  }
5750
5951
  return {
@@ -5754,11 +5955,13 @@ function updateStoriesFeedFromEvent(aggregatedActivities, event) {
5754
5955
  function handleStoriesFeedUpdated(event) {
5755
5956
  const result = updateStoriesFeedFromEvent(
5756
5957
  this.currentState.aggregated_activities,
5958
+ this.currentState.activities,
5757
5959
  event
5758
5960
  );
5759
5961
  if (result.changed) {
5760
5962
  this.state.partialNext({
5761
- aggregated_activities: result.data?.aggregated_activities
5963
+ aggregated_activities: result.data?.aggregated_activities,
5964
+ activities: result.data?.activities
5762
5965
  });
5763
5966
  }
5764
5967
  }
@@ -5769,7 +5972,7 @@ function handleWatchStopped() {
5769
5972
  this.state.partialNext({ watch: false });
5770
5973
  }
5771
5974
  const _Feed = class _Feed extends FeedApi {
5772
- constructor(client, groupId, id, data, watch = false) {
5975
+ constructor(client, groupId, id, data, watch = false, addNewActivitiesTo = "start") {
5773
5976
  super(client, groupId, id);
5774
5977
  this.indexedActivityIds = /* @__PURE__ */ new Set();
5775
5978
  this.stateUpdateQueue = /* @__PURE__ */ new Set();
@@ -5778,7 +5981,7 @@ const _Feed = class _Feed extends FeedApi {
5778
5981
  "feeds.activity.deleted": handleActivityDeleted.bind(this),
5779
5982
  "feeds.activity.reaction.added": handleActivityReactionAdded.bind(this),
5780
5983
  "feeds.activity.reaction.deleted": handleActivityReactionDeleted.bind(this),
5781
- "feeds.activity.reaction.updated": _Feed.noop,
5984
+ "feeds.activity.reaction.updated": handleActivityReactionUpdated.bind(this),
5782
5985
  "feeds.activity.removed_from_feed": handleActivityRemovedFromFeed.bind(this),
5783
5986
  "feeds.activity.updated": handleActivityUpdated.bind(this),
5784
5987
  "feeds.bookmark.added": handleBookmarkAdded.bind(this),
@@ -5799,7 +6002,7 @@ const _Feed = class _Feed extends FeedApi {
5799
6002
  "feeds.follow.updated": handleFollowUpdated.bind(this),
5800
6003
  "feeds.comment.reaction.added": handleCommentReactionAdded.bind(this),
5801
6004
  "feeds.comment.reaction.deleted": handleCommentReactionDeleted.bind(this),
5802
- "feeds.comment.reaction.updated": _Feed.noop,
6005
+ "feeds.comment.reaction.updated": handleCommentReactionUpdated.bind(this),
5803
6006
  "feeds.feed_member.added": handleFeedMemberAdded.bind(this),
5804
6007
  "feeds.feed_member.removed": handleFeedMemberRemoved.bind(this),
5805
6008
  "feeds.feed_member.updated": handleFeedMemberUpdated.bind(this),
@@ -5837,7 +6040,8 @@ const _Feed = class _Feed extends FeedApi {
5837
6040
  is_loading: false,
5838
6041
  is_loading_activities: false,
5839
6042
  comments_by_entity_id: {},
5840
- watch
6043
+ watch,
6044
+ addNewActivitiesTo
5841
6045
  });
5842
6046
  this.client = client;
5843
6047
  this.state.subscribeWithSelector(
@@ -5858,6 +6062,9 @@ const _Feed = class _Feed extends FeedApi {
5858
6062
  get currentState() {
5859
6063
  return this.state.getLatestValue();
5860
6064
  }
6065
+ set addNewActivitiesTo(value) {
6066
+ this.state.partialNext({ addNewActivitiesTo: value });
6067
+ }
5861
6068
  hasActivity(activityId) {
5862
6069
  return this.indexedActivityIds.has(activityId);
5863
6070
  }
@@ -6493,9 +6700,14 @@ class FeedsClient extends FeedsApi {
6493
6700
  return response;
6494
6701
  };
6495
6702
  this.addActivityReaction = async (request) => {
6703
+ const shouldEnforceUnique = request.enforce_unique;
6496
6704
  const response = await super.addActivityReaction(request);
6497
6705
  for (const feed of Object.values(this.activeFeeds)) {
6498
- handleActivityReactionAdded.bind(feed)(response, false);
6706
+ if (shouldEnforceUnique) {
6707
+ handleActivityReactionUpdated.bind(feed)(response, false);
6708
+ } else {
6709
+ handleActivityReactionAdded.bind(feed)(response, false);
6710
+ }
6499
6711
  }
6500
6712
  return response;
6501
6713
  };
@@ -6510,9 +6722,14 @@ class FeedsClient extends FeedsApi {
6510
6722
  return response;
6511
6723
  };
6512
6724
  this.addCommentReaction = async (request) => {
6725
+ const shouldEnforceUnique = request.enforce_unique;
6513
6726
  const response = await super.addCommentReaction(request);
6514
6727
  for (const feed of Object.values(this.activeFeeds)) {
6515
- handleCommentReactionAdded.bind(feed)(response, false);
6728
+ if (shouldEnforceUnique) {
6729
+ handleCommentReactionUpdated.bind(feed)(response, false);
6730
+ } else {
6731
+ handleCommentReactionAdded.bind(feed)(response, false);
6732
+ }
6516
6733
  }
6517
6734
  return response;
6518
6735
  };
@@ -6554,8 +6771,14 @@ class FeedsClient extends FeedsApi {
6554
6771
  };
6555
6772
  this.on = this.eventDispatcher.on;
6556
6773
  this.off = this.eventDispatcher.off;
6557
- this.feed = (groupId, id) => {
6558
- return this.getOrCreateActiveFeed(groupId, id);
6774
+ this.feed = (groupId, id, options2) => {
6775
+ return this.getOrCreateActiveFeed(
6776
+ groupId,
6777
+ id,
6778
+ void 0,
6779
+ void 0,
6780
+ options2?.addNewActivitiesTo
6781
+ );
6559
6782
  };
6560
6783
  this.updateNetworkConnectionStatus = (event) => {
6561
6784
  const networkEvent = {
@@ -6564,10 +6787,17 @@ class FeedsClient extends FeedsApi {
6564
6787
  };
6565
6788
  this.eventDispatcher.dispatch(networkEvent);
6566
6789
  };
6567
- this.getOrCreateActiveFeed = (group, id, data, watch) => {
6790
+ this.getOrCreateActiveFeed = (group, id, data, watch, addNewActivitiesTo) => {
6568
6791
  const fid = `${group}:${id}`;
6569
6792
  if (!this.activeFeeds[fid]) {
6570
- this.activeFeeds[fid] = new Feed(this, group, id, data, watch);
6793
+ this.activeFeeds[fid] = new Feed(
6794
+ this,
6795
+ group,
6796
+ id,
6797
+ data,
6798
+ watch,
6799
+ addNewActivitiesTo
6800
+ );
6571
6801
  }
6572
6802
  const feed = this.activeFeeds[fid];
6573
6803
  if (!feed.currentState.watch) {
@@ -6880,4 +7110,4 @@ exports.replaceUniqueArrayMerge = replaceUniqueArrayMerge;
6880
7110
  exports.shouldUpdateState = shouldUpdateState;
6881
7111
  exports.uniqueArrayMerge = uniqueArrayMerge;
6882
7112
  exports.updateEntityInArray = updateEntityInArray;
6883
- //# sourceMappingURL=index-CaFrpjpl.js.map
7113
+ //# sourceMappingURL=index--koeDtxd.js.map