@stream-io/feeds-client 0.2.0 → 0.2.1

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 (58) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/index-react-bindings.browser.cjs +365 -207
  3. package/dist/index-react-bindings.browser.cjs.map +1 -1
  4. package/dist/index-react-bindings.browser.js +365 -207
  5. package/dist/index-react-bindings.browser.js.map +1 -1
  6. package/dist/index-react-bindings.node.cjs +365 -207
  7. package/dist/index-react-bindings.node.cjs.map +1 -1
  8. package/dist/index-react-bindings.node.js +365 -207
  9. package/dist/index-react-bindings.node.js.map +1 -1
  10. package/dist/index.browser.cjs +366 -207
  11. package/dist/index.browser.cjs.map +1 -1
  12. package/dist/index.browser.js +366 -208
  13. package/dist/index.browser.js.map +1 -1
  14. package/dist/index.node.cjs +366 -207
  15. package/dist/index.node.cjs.map +1 -1
  16. package/dist/index.node.js +366 -208
  17. package/dist/index.node.js.map +1 -1
  18. package/dist/src/feed/event-handlers/activity/handle-activity-deleted.d.ts +12 -3
  19. package/dist/src/feed/event-handlers/activity/handle-activity-pinned.d.ts +3 -0
  20. package/dist/src/feed/event-handlers/activity/handle-activity-reaction-added.d.ts +10 -6
  21. package/dist/src/feed/event-handlers/activity/handle-activity-reaction-deleted.d.ts +10 -6
  22. package/dist/src/feed/event-handlers/activity/handle-activity-unpinned.d.ts +3 -0
  23. package/dist/src/feed/event-handlers/activity/handle-activity-updated.d.ts +7 -3
  24. package/dist/src/feed/event-handlers/bookmark/handle-bookmark-added.d.ts +10 -6
  25. package/dist/src/feed/event-handlers/bookmark/handle-bookmark-deleted.d.ts +10 -6
  26. package/dist/src/feed/event-handlers/bookmark/handle-bookmark-updated.d.ts +10 -6
  27. package/dist/src/gen/models/index.d.ts +36 -1
  28. package/dist/src/test-utils/response-generators.d.ts +46 -1
  29. package/dist/src/utils/index.d.ts +1 -0
  30. package/dist/src/utils/update-entity-in-array.d.ts +27 -0
  31. package/dist/tsconfig.tsbuildinfo +1 -1
  32. package/package.json +1 -1
  33. package/src/feed/event-handlers/activity/activity-reaction-utils.test.ts +108 -96
  34. package/src/feed/event-handlers/activity/activity-utils.test.ts +84 -122
  35. package/src/feed/event-handlers/activity/handle-activity-deleted.ts +43 -10
  36. package/src/feed/event-handlers/activity/handle-activity-pinned.test.ts +60 -0
  37. package/src/feed/event-handlers/activity/handle-activity-pinned.ts +30 -0
  38. package/src/feed/event-handlers/activity/handle-activity-reaction-added.test.ts +157 -0
  39. package/src/feed/event-handlers/activity/handle-activity-reaction-added.ts +82 -40
  40. package/src/feed/event-handlers/activity/handle-activity-reaction-deleted.test.ts +200 -0
  41. package/src/feed/event-handlers/activity/handle-activity-reaction-deleted.ts +89 -51
  42. package/src/feed/event-handlers/activity/handle-activity-unpinned.test.ts +94 -0
  43. package/src/feed/event-handlers/activity/handle-activity-unpinned.ts +30 -0
  44. package/src/feed/event-handlers/activity/handle-activity-updated.test.ts +115 -0
  45. package/src/feed/event-handlers/activity/handle-activity-updated.ts +73 -35
  46. package/src/feed/event-handlers/bookmark/bookmark-utils.test.ts +121 -109
  47. package/src/feed/event-handlers/bookmark/handle-bookmark-added.test.ts +178 -0
  48. package/src/feed/event-handlers/bookmark/handle-bookmark-added.ts +82 -39
  49. package/src/feed/event-handlers/bookmark/handle-bookmark-deleted.test.ts +188 -0
  50. package/src/feed/event-handlers/bookmark/handle-bookmark-deleted.ts +86 -48
  51. package/src/feed/event-handlers/bookmark/handle-bookmark-updated.test.ts +196 -0
  52. package/src/feed/event-handlers/bookmark/handle-bookmark-updated.ts +83 -44
  53. package/src/gen/model-decoders/decoders.ts +13 -0
  54. package/src/gen/models/index.ts +73 -2
  55. package/src/gen/moderation/ModerationApi.ts +1 -0
  56. package/src/test-utils/response-generators.ts +260 -0
  57. package/src/utils/index.ts +1 -0
  58. package/src/utils/update-entity-in-array.ts +51 -0
@@ -338,6 +338,7 @@ decoders.Channel = (input) => {
338
338
  updated_at: { type: 'DatetimeType', isSingle: true },
339
339
  deleted_at: { type: 'DatetimeType', isSingle: true },
340
340
  last_message_at: { type: 'DatetimeType', isSingle: true },
341
+ message_count_updated_at: { type: 'DatetimeType', isSingle: true },
341
342
  active_live_locations: { type: 'SharedLocation', isSingle: false },
342
343
  invites: { type: 'ChannelMember', isSingle: false },
343
344
  members: { type: 'ChannelMember', isSingle: false },
@@ -615,6 +616,7 @@ decoders.FeedMemberResponse = (input) => {
615
616
  user: { type: 'UserResponse', isSingle: true },
616
617
  invite_accepted_at: { type: 'DatetimeType', isSingle: true },
617
618
  invite_rejected_at: { type: 'DatetimeType', isSingle: true },
619
+ membership_level: { type: 'MembershipLevelResponse', isSingle: true },
618
620
  };
619
621
  return decode(typeMappings, input);
620
622
  };
@@ -787,6 +789,13 @@ decoders.ListDevicesResponse = (input) => {
787
789
  };
788
790
  return decode(typeMappings, input);
789
791
  };
792
+ decoders.MembershipLevelResponse = (input) => {
793
+ const typeMappings = {
794
+ created_at: { type: 'DatetimeType', isSingle: true },
795
+ updated_at: { type: 'DatetimeType', isSingle: true },
796
+ };
797
+ return decode(typeMappings, input);
798
+ };
790
799
  decoders.Message = (input) => {
791
800
  const typeMappings = {
792
801
  created_at: { type: 'DatetimeType', isSingle: true },
@@ -3818,6 +3827,7 @@ class ModerationApi {
3818
3827
  block_list_config: request?.block_list_config,
3819
3828
  bodyguard_config: request?.bodyguard_config,
3820
3829
  google_vision_config: request?.google_vision_config,
3830
+ llm_config: request?.llm_config,
3821
3831
  rule_builder_config: request?.rule_builder_config,
3822
3832
  velocity_filter_config: request?.velocity_filter_config,
3823
3833
  video_call_rule_config: request?.video_call_rule_config,
@@ -4301,6 +4311,23 @@ function getStateUpdateQueueId(data, prefix) {
4301
4311
  throw new Error(`Cannot create state update queueId for data: ${JSON.stringify(data)}`);
4302
4312
  }
4303
4313
 
4314
+ function updateEntityInArray({ matcher, updater, entities, }) {
4315
+ if (!entities || !entities.length) {
4316
+ return { changed: false, entities };
4317
+ }
4318
+ const index = entities.findIndex(matcher);
4319
+ if (index === -1) {
4320
+ return { changed: false, entities };
4321
+ }
4322
+ const newEntity = updater(entities[index]);
4323
+ if (newEntity === entities[index]) {
4324
+ return { changed: false, entities };
4325
+ }
4326
+ const updatedEntities = [...entities];
4327
+ updatedEntities[index] = newEntity;
4328
+ return { changed: true, entities: updatedEntities };
4329
+ }
4330
+
4304
4331
  const updateStateFollowCreated = (follow, currentState, currentFeedId, connectedUserId) => {
4305
4332
  // filter non-accepted follows (the way getOrCreate does by default)
4306
4333
  if (follow.status !== 'accepted') {
@@ -4636,6 +4663,179 @@ function handleFeedMemberRemoved(event) {
4636
4663
  });
4637
4664
  }
4638
4665
 
4666
+ const sharedUpdateActivity$5 = ({ currentActivity, event, eventBelongsToCurrentUser, }) => {
4667
+ let newOwnBookmarks = currentActivity.own_bookmarks;
4668
+ if (eventBelongsToCurrentUser) {
4669
+ newOwnBookmarks = [...newOwnBookmarks, event.bookmark];
4670
+ }
4671
+ return {
4672
+ ...event.bookmark.activity,
4673
+ own_bookmarks: newOwnBookmarks,
4674
+ own_reactions: currentActivity.own_reactions,
4675
+ };
4676
+ };
4677
+ const addBookmarkToActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
4678
+ entities: activities,
4679
+ matcher: (activity) => activity.id === event.bookmark.activity.id,
4680
+ updater: (matchedActivity) => sharedUpdateActivity$5({
4681
+ currentActivity: matchedActivity,
4682
+ event,
4683
+ eventBelongsToCurrentUser,
4684
+ }),
4685
+ });
4686
+ const addBookmarkToPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
4687
+ entities: pinnedActivities,
4688
+ matcher: (pinnedActivity) => pinnedActivity.activity.id === event.bookmark.activity.id,
4689
+ updater: (matchedPinnedActivity) => {
4690
+ const newActivity = sharedUpdateActivity$5({
4691
+ currentActivity: matchedPinnedActivity.activity,
4692
+ event,
4693
+ eventBelongsToCurrentUser,
4694
+ });
4695
+ if (newActivity === matchedPinnedActivity.activity) {
4696
+ return matchedPinnedActivity;
4697
+ }
4698
+ return {
4699
+ ...matchedPinnedActivity,
4700
+ activity: newActivity,
4701
+ };
4702
+ },
4703
+ });
4704
+ function handleBookmarkAdded(event) {
4705
+ const { activities: currentActivities, pinned_activities: currentPinnedActivities, } = this.currentState;
4706
+ const { connected_user: connectedUser } = this.client.state.getLatestValue();
4707
+ const eventBelongsToCurrentUser = event.bookmark.user.id === connectedUser?.id;
4708
+ const [result1, result2] = [
4709
+ addBookmarkToActivities(event, currentActivities, eventBelongsToCurrentUser),
4710
+ addBookmarkToPinnedActivities(event, currentPinnedActivities, eventBelongsToCurrentUser),
4711
+ ];
4712
+ if (result1.changed || result2.changed) {
4713
+ this.state.partialNext({
4714
+ activities: result1.entities,
4715
+ pinned_activities: result2.entities,
4716
+ });
4717
+ }
4718
+ }
4719
+
4720
+ // Helper function to check if two bookmarks are the same
4721
+ // A bookmark is identified by activity_id + folder_id + user_id
4722
+ const isSameBookmark = (bookmark1, bookmark2) => {
4723
+ return (bookmark1.user.id === bookmark2.user.id &&
4724
+ bookmark1.activity.id === bookmark2.activity.id &&
4725
+ bookmark1.folder?.id === bookmark2.folder?.id);
4726
+ };
4727
+ const sharedUpdateActivity$4 = ({ currentActivity, event, eventBelongsToCurrentUser, }) => {
4728
+ let newOwnBookmarks = currentActivity.own_bookmarks;
4729
+ if (eventBelongsToCurrentUser) {
4730
+ newOwnBookmarks = currentActivity.own_bookmarks.filter((bookmark) => !isSameBookmark(bookmark, event.bookmark));
4731
+ }
4732
+ return {
4733
+ ...event.bookmark.activity,
4734
+ own_bookmarks: newOwnBookmarks,
4735
+ own_reactions: currentActivity.own_reactions,
4736
+ };
4737
+ };
4738
+ const removeBookmarkFromActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
4739
+ entities: activities,
4740
+ matcher: (activity) => activity.id === event.bookmark.activity.id,
4741
+ updater: (matchedActivity) => sharedUpdateActivity$4({
4742
+ currentActivity: matchedActivity,
4743
+ event,
4744
+ eventBelongsToCurrentUser,
4745
+ }),
4746
+ });
4747
+ const removeBookmarkFromPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
4748
+ entities: pinnedActivities,
4749
+ matcher: (pinnedActivity) => pinnedActivity.activity.id === event.bookmark.activity.id,
4750
+ updater: (matchedPinnedActivity) => {
4751
+ const newActivity = sharedUpdateActivity$4({
4752
+ currentActivity: matchedPinnedActivity.activity,
4753
+ event,
4754
+ eventBelongsToCurrentUser,
4755
+ });
4756
+ if (newActivity === matchedPinnedActivity.activity) {
4757
+ return matchedPinnedActivity;
4758
+ }
4759
+ return {
4760
+ ...matchedPinnedActivity,
4761
+ activity: newActivity,
4762
+ };
4763
+ },
4764
+ });
4765
+ function handleBookmarkDeleted(event) {
4766
+ const { activities: currentActivities, pinned_activities: currentPinnedActivities, } = this.currentState;
4767
+ const { connected_user: connectedUser } = this.client.state.getLatestValue();
4768
+ const eventBelongsToCurrentUser = event.bookmark.user.id === connectedUser?.id;
4769
+ const [result1, result2] = [
4770
+ removeBookmarkFromActivities(event, currentActivities, eventBelongsToCurrentUser),
4771
+ removeBookmarkFromPinnedActivities(event, currentPinnedActivities, eventBelongsToCurrentUser),
4772
+ ];
4773
+ if (result1.changed || result2.changed) {
4774
+ this.state.partialNext({
4775
+ activities: result1.entities,
4776
+ pinned_activities: result2.entities,
4777
+ });
4778
+ }
4779
+ }
4780
+
4781
+ const sharedUpdateActivity$3 = ({ currentActivity, event, eventBelongsToCurrentUser, }) => {
4782
+ let newOwnBookmarks = currentActivity.own_bookmarks;
4783
+ if (eventBelongsToCurrentUser) {
4784
+ const bookmarkIndex = newOwnBookmarks.findIndex((bookmark) => isSameBookmark(bookmark, event.bookmark));
4785
+ if (bookmarkIndex !== -1) {
4786
+ newOwnBookmarks = [...newOwnBookmarks];
4787
+ newOwnBookmarks[bookmarkIndex] = event.bookmark;
4788
+ }
4789
+ }
4790
+ return {
4791
+ ...event.bookmark.activity,
4792
+ own_bookmarks: newOwnBookmarks,
4793
+ own_reactions: currentActivity.own_reactions,
4794
+ };
4795
+ };
4796
+ const updateBookmarkInActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
4797
+ entities: activities,
4798
+ matcher: (activity) => activity.id === event.bookmark.activity.id,
4799
+ updater: (matchedActivity) => sharedUpdateActivity$3({
4800
+ currentActivity: matchedActivity,
4801
+ event,
4802
+ eventBelongsToCurrentUser,
4803
+ }),
4804
+ });
4805
+ const updateBookmarkInPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
4806
+ entities: pinnedActivities,
4807
+ matcher: (pinnedActivity) => pinnedActivity.activity.id === event.bookmark.activity.id,
4808
+ updater: (matchedPinnedActivity) => {
4809
+ const newActivity = sharedUpdateActivity$3({
4810
+ currentActivity: matchedPinnedActivity.activity,
4811
+ event,
4812
+ eventBelongsToCurrentUser,
4813
+ });
4814
+ if (newActivity === matchedPinnedActivity.activity) {
4815
+ return matchedPinnedActivity;
4816
+ }
4817
+ return {
4818
+ ...matchedPinnedActivity,
4819
+ activity: newActivity,
4820
+ };
4821
+ },
4822
+ });
4823
+ function handleBookmarkUpdated(event) {
4824
+ const { activities: currentActivities, pinned_activities: currentPinnedActivities, } = this.currentState;
4825
+ const { connected_user: connectedUser } = this.client.state.getLatestValue();
4826
+ const eventBelongsToCurrentUser = event.bookmark.user.id === connectedUser?.id;
4827
+ const [result1, result2] = [
4828
+ updateBookmarkInActivities(event, currentActivities, eventBelongsToCurrentUser),
4829
+ updateBookmarkInPinnedActivities(event, currentPinnedActivities, eventBelongsToCurrentUser),
4830
+ ];
4831
+ if (result1.changed || result2.changed) {
4832
+ this.state.partialNext({
4833
+ activities: result1.entities,
4834
+ pinned_activities: result2.entities,
4835
+ });
4836
+ }
4837
+ }
4838
+
4639
4839
  const addActivitiesToState = (newActivities, activities, position) => {
4640
4840
  let result;
4641
4841
  if (activities === undefined) {
@@ -4680,7 +4880,8 @@ function handleActivityAdded(event) {
4680
4880
  }
4681
4881
 
4682
4882
  const removeActivityFromState = (activityResponse, activities) => {
4683
- const index = activities.findIndex((a) => a.id === activityResponse.id);
4883
+ const index = activities?.findIndex((activity) => activity.id === activityResponse.id) ??
4884
+ -1;
4684
4885
  if (index !== -1) {
4685
4886
  const newActivities = [...activities];
4686
4887
  newActivities.splice(index, 1);
@@ -4690,13 +4891,28 @@ const removeActivityFromState = (activityResponse, activities) => {
4690
4891
  return { changed: false, activities };
4691
4892
  }
4692
4893
  };
4894
+ const removePinnedActivityFromState = (activityResponse, pinnedActivities) => {
4895
+ const index = pinnedActivities?.findIndex((pinnedActivity) => pinnedActivity.activity.id === activityResponse.id) ?? -1;
4896
+ if (index !== -1) {
4897
+ const newActivities = [...pinnedActivities];
4898
+ newActivities.splice(index, 1);
4899
+ return { changed: true, activities: newActivities };
4900
+ }
4901
+ else {
4902
+ return { changed: false, pinned_activities: pinnedActivities };
4903
+ }
4904
+ };
4693
4905
  function handleActivityDeleted(event) {
4694
- const currentActivities = this.currentState.activities;
4695
- if (currentActivities) {
4696
- const result = removeActivityFromState(event.activity, currentActivities);
4697
- if (result.changed) {
4698
- this.state.partialNext({ activities: result.activities });
4699
- }
4906
+ const { activities: currentActivities, pinned_activities: currentPinnedActivities, } = this.currentState;
4907
+ const [result1, result2] = [
4908
+ removeActivityFromState(event.activity, currentActivities),
4909
+ removePinnedActivityFromState(event.activity, currentPinnedActivities),
4910
+ ];
4911
+ if (result1.changed || result2.changed) {
4912
+ this.state.partialNext({
4913
+ activities: result1.activities,
4914
+ pinned_activities: result2.pinned_activities,
4915
+ });
4700
4916
  }
4701
4917
  }
4702
4918
 
@@ -4710,221 +4926,163 @@ function handleActivityRemovedFromFeed(event) {
4710
4926
  }
4711
4927
  }
4712
4928
 
4713
- const updateActivityInState = (updatedActivityResponse, activities, replaceCompletely = false) => {
4714
- const index = activities.findIndex((a) => a.id === updatedActivityResponse.id);
4715
- if (index !== -1) {
4716
- const newActivities = [...activities];
4717
- const activity = activities[index];
4718
- if (replaceCompletely) {
4719
- newActivities[index] = updatedActivityResponse;
4720
- }
4721
- else {
4722
- newActivities[index] = {
4723
- ...updatedActivityResponse,
4724
- own_reactions: activity.own_reactions,
4725
- own_bookmarks: activity.own_bookmarks,
4726
- latest_reactions: activity.latest_reactions,
4727
- reaction_groups: activity.reaction_groups,
4728
- };
4929
+ const sharedUpdateActivity$2 = ({ currentActivity, event, }) => {
4930
+ return {
4931
+ ...event.activity,
4932
+ own_reactions: currentActivity.own_reactions,
4933
+ own_bookmarks: currentActivity.own_bookmarks,
4934
+ };
4935
+ };
4936
+ const updateActivityInState = (event, activities) => updateEntityInArray({
4937
+ entities: activities,
4938
+ matcher: (activity) => activity.id === event.activity.id,
4939
+ updater: (matchedActivity) => sharedUpdateActivity$2({
4940
+ currentActivity: matchedActivity,
4941
+ event,
4942
+ }),
4943
+ });
4944
+ const updatePinnedActivityInState = (event, pinnedActivities) => updateEntityInArray({
4945
+ entities: pinnedActivities,
4946
+ matcher: (pinnedActivity) => pinnedActivity.activity.id === event.activity.id,
4947
+ updater: (matchedPinnedActivity) => {
4948
+ const newActivity = sharedUpdateActivity$2({
4949
+ currentActivity: matchedPinnedActivity.activity,
4950
+ event,
4951
+ });
4952
+ if (newActivity === matchedPinnedActivity.activity) {
4953
+ return matchedPinnedActivity;
4729
4954
  }
4730
- return { changed: true, activities: newActivities };
4731
- }
4732
- else {
4733
- return { changed: false, activities };
4734
- }
4735
- };
4955
+ return {
4956
+ ...matchedPinnedActivity,
4957
+ activity: newActivity,
4958
+ };
4959
+ },
4960
+ });
4736
4961
  function handleActivityUpdated(event) {
4737
- const currentActivities = this.currentState.activities;
4738
- if (currentActivities) {
4739
- const result = updateActivityInState(event.activity, currentActivities);
4740
- if (result.changed) {
4741
- this.client.hydratePollCache([event.activity]);
4742
- this.state.partialNext({ activities: result.activities });
4743
- }
4962
+ const { activities: currentActivities, pinned_activities: currentPinnedActivities, } = this.currentState;
4963
+ const [result1, result2] = [
4964
+ updateActivityInState(event, currentActivities),
4965
+ updatePinnedActivityInState(event, currentPinnedActivities),
4966
+ ];
4967
+ if (result1.changed || result2.changed) {
4968
+ this.client.hydratePollCache([event.activity]);
4969
+ this.state.partialNext({
4970
+ activities: result1.entities,
4971
+ pinned_activities: result2.entities,
4972
+ });
4744
4973
  }
4745
4974
  }
4746
4975
 
4747
- const addReactionToActivity = (event, activity, isCurrentUser) => {
4748
- // Update own_reactions if the reaction is from the current user
4749
- const ownReactions = [...(activity.own_reactions || [])];
4750
- if (isCurrentUser) {
4751
- ownReactions.push(event.reaction);
4976
+ // shared function to update the activity with the new reaction
4977
+ const sharedUpdateActivity$1 = ({ currentActivity, event, eventBelongsToCurrentUser, }) => {
4978
+ let newOwnReactions = currentActivity.own_reactions;
4979
+ if (eventBelongsToCurrentUser) {
4980
+ newOwnReactions = [...currentActivity.own_reactions, event.reaction];
4752
4981
  }
4753
4982
  return {
4754
- ...activity,
4755
- own_reactions: ownReactions,
4756
- latest_reactions: event.activity.latest_reactions,
4757
- reaction_groups: event.activity.reaction_groups,
4758
- changed: true,
4759
- };
4760
- };
4761
- const addReactionToActivities = (event, activities, isCurrentUser) => {
4762
- if (!activities) {
4763
- return { changed: false, activities: [] };
4764
- }
4765
- const activityIndex = activities.findIndex((a) => a.id === event.activity.id);
4766
- if (activityIndex === -1) {
4767
- return { changed: false, activities };
4768
- }
4769
- const activity = activities[activityIndex];
4770
- const updatedActivity = addReactionToActivity(event, activity, isCurrentUser);
4771
- return updateActivityInState(updatedActivity, activities, true);
4772
- };
4983
+ ...event.activity,
4984
+ own_reactions: newOwnReactions,
4985
+ own_bookmarks: currentActivity.own_bookmarks,
4986
+ };
4987
+ };
4988
+ const addReactionToActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
4989
+ entities: activities,
4990
+ matcher: (activity) => activity.id === event.activity.id,
4991
+ updater: (matchedActivity) => sharedUpdateActivity$1({
4992
+ currentActivity: matchedActivity,
4993
+ event,
4994
+ eventBelongsToCurrentUser,
4995
+ }),
4996
+ });
4997
+ const addReactionToPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
4998
+ entities: pinnedActivities,
4999
+ matcher: (pinnedActivity) => pinnedActivity.activity.id === event.activity.id,
5000
+ updater: (matchedPinnedActivity) => {
5001
+ const newActivity = sharedUpdateActivity$1({
5002
+ currentActivity: matchedPinnedActivity.activity,
5003
+ event,
5004
+ eventBelongsToCurrentUser,
5005
+ });
5006
+ // this should never happen, but just in case
5007
+ if (newActivity === matchedPinnedActivity.activity) {
5008
+ return matchedPinnedActivity;
5009
+ }
5010
+ return {
5011
+ ...matchedPinnedActivity,
5012
+ activity: newActivity,
5013
+ };
5014
+ },
5015
+ });
4773
5016
  function handleActivityReactionAdded(event) {
4774
- const currentActivities = this.currentState.activities;
4775
- const connectedUser = this.client.state.getLatestValue().connected_user;
4776
- const isCurrentUser = Boolean(connectedUser && event.reaction.user.id === connectedUser.id);
4777
- const result = addReactionToActivities(event, currentActivities, isCurrentUser);
4778
- if (result.changed) {
4779
- this.state.partialNext({ activities: result.activities });
4780
- }
4781
- }
4782
-
4783
- const removeReactionFromActivity = (event, activity, isCurrentUser) => {
4784
- // Update own_reactions if the reaction is from the current user
4785
- const ownReactions = isCurrentUser
4786
- ? (activity.own_reactions || []).filter((r) => !(r.type === event.reaction.type &&
4787
- r.user.id === event.reaction.user.id))
4788
- : activity.own_reactions;
4789
- return {
4790
- ...activity,
4791
- own_reactions: ownReactions,
4792
- latest_reactions: event.activity.latest_reactions,
4793
- reaction_groups: event.activity.reaction_groups,
4794
- changed: true,
4795
- };
4796
- };
4797
- const removeReactionFromActivities = (event, activities, isCurrentUser) => {
4798
- if (!activities) {
4799
- return { changed: false, activities: [] };
4800
- }
4801
- const activityIndex = activities.findIndex((a) => a.id === event.activity.id);
4802
- if (activityIndex === -1) {
4803
- return { changed: false, activities };
4804
- }
4805
- const activity = activities[activityIndex];
4806
- const updatedActivity = removeReactionFromActivity(event, activity, isCurrentUser);
4807
- return updateActivityInState(updatedActivity, activities, true);
4808
- };
4809
- function handleActivityReactionDeleted(event) {
4810
- const currentActivities = this.currentState.activities;
5017
+ const { activities: currentActivities, pinned_activities: currentPinnedActivities, } = this.currentState;
4811
5018
  const connectedUser = this.client.state.getLatestValue().connected_user;
4812
- const isCurrentUser = Boolean(connectedUser && event.reaction.user.id === connectedUser.id);
4813
- const result = removeReactionFromActivities(event, currentActivities, isCurrentUser);
4814
- if (result.changed) {
4815
- this.state.partialNext({ activities: result.activities });
4816
- }
4817
- }
4818
-
4819
- const addBookmarkToActivity = (event, activity, isCurrentUser) => {
4820
- // Update own_bookmarks if the bookmark is from the current user
4821
- const ownBookmarks = [...(activity.own_bookmarks || [])];
4822
- if (isCurrentUser) {
4823
- ownBookmarks.push(event.bookmark);
4824
- }
4825
- return {
4826
- ...activity,
4827
- own_bookmarks: ownBookmarks,
4828
- changed: true,
4829
- };
4830
- };
4831
- const addBookmarkToActivities = (event, activities, isCurrentUser) => {
4832
- if (!activities) {
4833
- return { changed: false, activities: [] };
4834
- }
4835
- const activityIndex = activities.findIndex((a) => a.id === event.bookmark.activity.id);
4836
- if (activityIndex === -1) {
4837
- return { changed: false, activities };
4838
- }
4839
- const activity = activities[activityIndex];
4840
- const updatedActivity = addBookmarkToActivity(event, activity, isCurrentUser);
4841
- return updateActivityInState(updatedActivity, activities, true);
4842
- };
4843
- function handleBookmarkAdded(event) {
4844
- const currentActivities = this.currentState.activities;
4845
- const { connected_user: connectedUser } = this.client.state.getLatestValue();
4846
- const isCurrentUser = event.bookmark.user.id === connectedUser?.id;
4847
- const result = addBookmarkToActivities(event, currentActivities, isCurrentUser);
4848
- if (result.changed) {
4849
- this.state.partialNext({ activities: result.activities });
5019
+ const eventBelongsToCurrentUser = typeof connectedUser !== 'undefined' &&
5020
+ event.reaction.user.id === connectedUser.id;
5021
+ const [result1, result2] = [
5022
+ addReactionToActivities(event, currentActivities, eventBelongsToCurrentUser),
5023
+ addReactionToPinnedActivities(event, currentPinnedActivities, eventBelongsToCurrentUser),
5024
+ ];
5025
+ if (result1.changed || result2.changed) {
5026
+ this.state.partialNext({
5027
+ activities: result1.entities,
5028
+ pinned_activities: result2.entities,
5029
+ });
4850
5030
  }
4851
5031
  }
4852
5032
 
4853
- // Helper function to check if two bookmarks are the same
4854
- // A bookmark is identified by activity_id + folder_id + user_id
4855
- const isSameBookmark = (bookmark1, bookmark2) => {
4856
- return (bookmark1.user.id === bookmark2.user.id &&
4857
- bookmark1.activity.id === bookmark2.activity.id &&
4858
- bookmark1.folder?.id === bookmark2.folder?.id);
4859
- };
4860
- const removeBookmarkFromActivities = (event, activities, isCurrentUser) => {
4861
- if (!activities) {
4862
- return { changed: false, activities: [] };
5033
+ const sharedUpdateActivity = ({ currentActivity, event, eventBelongsToCurrentUser, }) => {
5034
+ let newOwnReactions = currentActivity.own_reactions;
5035
+ if (eventBelongsToCurrentUser) {
5036
+ newOwnReactions = currentActivity.own_reactions.filter((reaction) => !(reaction.type === event.reaction.type &&
5037
+ reaction.user.id === event.reaction.user.id));
4863
5038
  }
4864
- const activityIndex = activities.findIndex((a) => a.id === event.bookmark.activity.id);
4865
- if (activityIndex === -1) {
4866
- return { changed: false, activities };
4867
- }
4868
- const activity = activities[activityIndex];
4869
- const updatedActivity = removeBookmarkFromActivity(event, activity, isCurrentUser);
4870
- return updateActivityInState(updatedActivity, activities, true);
4871
- };
4872
- const removeBookmarkFromActivity = (event, activity, isCurrentUser) => {
4873
- // Update own_bookmarks if the bookmark is from the current user
4874
- const ownBookmarks = isCurrentUser
4875
- ? (activity.own_bookmarks || []).filter((bookmark) => !isSameBookmark(bookmark, event.bookmark))
4876
- : activity.own_bookmarks;
4877
5039
  return {
4878
- ...activity,
4879
- own_bookmarks: ownBookmarks,
4880
- changed: true,
4881
- };
4882
- };
4883
- function handleBookmarkDeleted(event) {
4884
- const currentActivities = this.currentState.activities;
4885
- const { connected_user: connectedUser } = this.client.state.getLatestValue();
4886
- const isCurrentUser = event.bookmark.user.id === connectedUser?.id;
4887
- const result = removeBookmarkFromActivities(event, currentActivities, isCurrentUser);
4888
- if (result.changed) {
4889
- this.state.partialNext({ activities: result.activities });
4890
- }
4891
- }
4892
-
4893
- const updateBookmarkInActivity = (event, activity, isCurrentUser) => {
4894
- // Update own_bookmarks if the bookmark is from the current user
4895
- let ownBookmarks = activity.own_bookmarks || [];
4896
- if (isCurrentUser) {
4897
- const bookmarkIndex = ownBookmarks.findIndex((bookmark) => isSameBookmark(bookmark, event.bookmark));
4898
- if (bookmarkIndex !== -1) {
4899
- ownBookmarks = [...ownBookmarks];
4900
- ownBookmarks[bookmarkIndex] = event.bookmark;
5040
+ ...event.activity,
5041
+ own_reactions: newOwnReactions,
5042
+ own_bookmarks: currentActivity.own_bookmarks,
5043
+ };
5044
+ };
5045
+ const removeReactionFromActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5046
+ entities: activities,
5047
+ matcher: (activity) => activity.id === event.activity.id,
5048
+ updater: (matchedActivity) => sharedUpdateActivity({
5049
+ currentActivity: matchedActivity,
5050
+ event,
5051
+ eventBelongsToCurrentUser,
5052
+ }),
5053
+ });
5054
+ const removeReactionFromPinnedActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5055
+ entities: activities,
5056
+ matcher: (pinnedActivity) => pinnedActivity.activity.id === event.activity.id,
5057
+ updater: (matchedPinnedActivity) => {
5058
+ const newActivity = sharedUpdateActivity({
5059
+ currentActivity: matchedPinnedActivity.activity,
5060
+ event,
5061
+ eventBelongsToCurrentUser,
5062
+ });
5063
+ if (newActivity === matchedPinnedActivity.activity) {
5064
+ return matchedPinnedActivity;
4901
5065
  }
4902
- }
4903
- return {
4904
- ...activity,
4905
- own_bookmarks: ownBookmarks,
4906
- changed: true,
4907
- };
4908
- };
4909
- const updateBookmarkInActivities = (event, activities, isCurrentUser) => {
4910
- if (!activities) {
4911
- return { changed: false, activities: [] };
4912
- }
4913
- const activityIndex = activities.findIndex((a) => a.id === event.bookmark.activity.id);
4914
- if (activityIndex === -1) {
4915
- return { changed: false, activities };
4916
- }
4917
- const activity = activities[activityIndex];
4918
- const updatedActivity = updateBookmarkInActivity(event, activity, isCurrentUser);
4919
- return updateActivityInState(updatedActivity, activities, true);
4920
- };
4921
- function handleBookmarkUpdated(event) {
4922
- const currentActivities = this.currentState.activities;
4923
- const { connected_user: connectedUser } = this.client.state.getLatestValue();
4924
- const isCurrentUser = event.bookmark.user.id === connectedUser?.id;
4925
- const result = updateBookmarkInActivities(event, currentActivities, isCurrentUser);
4926
- if (result.changed) {
4927
- this.state.partialNext({ activities: result.activities });
5066
+ return {
5067
+ ...matchedPinnedActivity,
5068
+ activity: newActivity,
5069
+ };
5070
+ },
5071
+ });
5072
+ function handleActivityReactionDeleted(event) {
5073
+ const { activities: currentActivities, pinned_activities: currentPinnedActivities, } = this.currentState;
5074
+ const connectedUser = this.client.state.getLatestValue().connected_user;
5075
+ const eventBelongsToCurrentUser = typeof connectedUser !== 'undefined' &&
5076
+ event.reaction.user.id === connectedUser.id;
5077
+ const [result1, result2] = [
5078
+ removeReactionFromActivities(event, currentActivities, eventBelongsToCurrentUser),
5079
+ removeReactionFromPinnedActivities(event, currentPinnedActivities, eventBelongsToCurrentUser),
5080
+ ];
5081
+ if (result1.changed || result2.changed) {
5082
+ this.state.partialNext({
5083
+ activities: result1.entities,
5084
+ pinned_activities: result2.entities,
5085
+ });
4928
5086
  }
4929
5087
  }
4930
5088
 
@@ -6212,5 +6370,5 @@ class FeedSearchSource extends BaseSearchSource {
6212
6370
  }
6213
6371
  }
6214
6372
 
6215
- export { ActivitySearchSource, BaseSearchSource, ChannelOwnCapability, Constants, Feed, FeedOwnCapability, FeedSearchSource, FeedsClient, MergedStateStore, SearchController, StateStore, StreamApiError, StreamPoll, UserSearchSource, checkHasAnotherPage, getStateUpdateQueueId, isCommentResponse, isFollowResponse, isImageFile, isPatch, isVideoFile, isVoteAnswer, shouldUpdateState, uniqueArrayMerge };
6373
+ export { ActivitySearchSource, BaseSearchSource, ChannelOwnCapability, Constants, Feed, FeedOwnCapability, FeedSearchSource, FeedsClient, MergedStateStore, SearchController, StateStore, StreamApiError, StreamPoll, UserSearchSource, checkHasAnotherPage, getStateUpdateQueueId, isCommentResponse, isFollowResponse, isImageFile, isPatch, isVideoFile, isVoteAnswer, shouldUpdateState, uniqueArrayMerge, updateEntityInArray };
6216
6374
  //# sourceMappingURL=index.browser.js.map