@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
@@ -340,6 +340,7 @@ decoders.Channel = (input) => {
340
340
  updated_at: { type: 'DatetimeType', isSingle: true },
341
341
  deleted_at: { type: 'DatetimeType', isSingle: true },
342
342
  last_message_at: { type: 'DatetimeType', isSingle: true },
343
+ message_count_updated_at: { type: 'DatetimeType', isSingle: true },
343
344
  active_live_locations: { type: 'SharedLocation', isSingle: false },
344
345
  invites: { type: 'ChannelMember', isSingle: false },
345
346
  members: { type: 'ChannelMember', isSingle: false },
@@ -617,6 +618,7 @@ decoders.FeedMemberResponse = (input) => {
617
618
  user: { type: 'UserResponse', isSingle: true },
618
619
  invite_accepted_at: { type: 'DatetimeType', isSingle: true },
619
620
  invite_rejected_at: { type: 'DatetimeType', isSingle: true },
621
+ membership_level: { type: 'MembershipLevelResponse', isSingle: true },
620
622
  };
621
623
  return decode(typeMappings, input);
622
624
  };
@@ -789,6 +791,13 @@ decoders.ListDevicesResponse = (input) => {
789
791
  };
790
792
  return decode(typeMappings, input);
791
793
  };
794
+ decoders.MembershipLevelResponse = (input) => {
795
+ const typeMappings = {
796
+ created_at: { type: 'DatetimeType', isSingle: true },
797
+ updated_at: { type: 'DatetimeType', isSingle: true },
798
+ };
799
+ return decode(typeMappings, input);
800
+ };
792
801
  decoders.Message = (input) => {
793
802
  const typeMappings = {
794
803
  created_at: { type: 'DatetimeType', isSingle: true },
@@ -3820,6 +3829,7 @@ class ModerationApi {
3820
3829
  block_list_config: request?.block_list_config,
3821
3830
  bodyguard_config: request?.bodyguard_config,
3822
3831
  google_vision_config: request?.google_vision_config,
3832
+ llm_config: request?.llm_config,
3823
3833
  rule_builder_config: request?.rule_builder_config,
3824
3834
  velocity_filter_config: request?.velocity_filter_config,
3825
3835
  video_call_rule_config: request?.video_call_rule_config,
@@ -4303,6 +4313,23 @@ function getStateUpdateQueueId(data, prefix) {
4303
4313
  throw new Error(`Cannot create state update queueId for data: ${JSON.stringify(data)}`);
4304
4314
  }
4305
4315
 
4316
+ function updateEntityInArray({ matcher, updater, entities, }) {
4317
+ if (!entities || !entities.length) {
4318
+ return { changed: false, entities };
4319
+ }
4320
+ const index = entities.findIndex(matcher);
4321
+ if (index === -1) {
4322
+ return { changed: false, entities };
4323
+ }
4324
+ const newEntity = updater(entities[index]);
4325
+ if (newEntity === entities[index]) {
4326
+ return { changed: false, entities };
4327
+ }
4328
+ const updatedEntities = [...entities];
4329
+ updatedEntities[index] = newEntity;
4330
+ return { changed: true, entities: updatedEntities };
4331
+ }
4332
+
4306
4333
  const updateStateFollowCreated = (follow, currentState, currentFeedId, connectedUserId) => {
4307
4334
  // filter non-accepted follows (the way getOrCreate does by default)
4308
4335
  if (follow.status !== 'accepted') {
@@ -4638,6 +4665,179 @@ function handleFeedMemberRemoved(event) {
4638
4665
  });
4639
4666
  }
4640
4667
 
4668
+ const sharedUpdateActivity$5 = ({ currentActivity, event, eventBelongsToCurrentUser, }) => {
4669
+ let newOwnBookmarks = currentActivity.own_bookmarks;
4670
+ if (eventBelongsToCurrentUser) {
4671
+ newOwnBookmarks = [...newOwnBookmarks, event.bookmark];
4672
+ }
4673
+ return {
4674
+ ...event.bookmark.activity,
4675
+ own_bookmarks: newOwnBookmarks,
4676
+ own_reactions: currentActivity.own_reactions,
4677
+ };
4678
+ };
4679
+ const addBookmarkToActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
4680
+ entities: activities,
4681
+ matcher: (activity) => activity.id === event.bookmark.activity.id,
4682
+ updater: (matchedActivity) => sharedUpdateActivity$5({
4683
+ currentActivity: matchedActivity,
4684
+ event,
4685
+ eventBelongsToCurrentUser,
4686
+ }),
4687
+ });
4688
+ const addBookmarkToPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
4689
+ entities: pinnedActivities,
4690
+ matcher: (pinnedActivity) => pinnedActivity.activity.id === event.bookmark.activity.id,
4691
+ updater: (matchedPinnedActivity) => {
4692
+ const newActivity = sharedUpdateActivity$5({
4693
+ currentActivity: matchedPinnedActivity.activity,
4694
+ event,
4695
+ eventBelongsToCurrentUser,
4696
+ });
4697
+ if (newActivity === matchedPinnedActivity.activity) {
4698
+ return matchedPinnedActivity;
4699
+ }
4700
+ return {
4701
+ ...matchedPinnedActivity,
4702
+ activity: newActivity,
4703
+ };
4704
+ },
4705
+ });
4706
+ function handleBookmarkAdded(event) {
4707
+ const { activities: currentActivities, pinned_activities: currentPinnedActivities, } = this.currentState;
4708
+ const { connected_user: connectedUser } = this.client.state.getLatestValue();
4709
+ const eventBelongsToCurrentUser = event.bookmark.user.id === connectedUser?.id;
4710
+ const [result1, result2] = [
4711
+ addBookmarkToActivities(event, currentActivities, eventBelongsToCurrentUser),
4712
+ addBookmarkToPinnedActivities(event, currentPinnedActivities, eventBelongsToCurrentUser),
4713
+ ];
4714
+ if (result1.changed || result2.changed) {
4715
+ this.state.partialNext({
4716
+ activities: result1.entities,
4717
+ pinned_activities: result2.entities,
4718
+ });
4719
+ }
4720
+ }
4721
+
4722
+ // Helper function to check if two bookmarks are the same
4723
+ // A bookmark is identified by activity_id + folder_id + user_id
4724
+ const isSameBookmark = (bookmark1, bookmark2) => {
4725
+ return (bookmark1.user.id === bookmark2.user.id &&
4726
+ bookmark1.activity.id === bookmark2.activity.id &&
4727
+ bookmark1.folder?.id === bookmark2.folder?.id);
4728
+ };
4729
+ const sharedUpdateActivity$4 = ({ currentActivity, event, eventBelongsToCurrentUser, }) => {
4730
+ let newOwnBookmarks = currentActivity.own_bookmarks;
4731
+ if (eventBelongsToCurrentUser) {
4732
+ newOwnBookmarks = currentActivity.own_bookmarks.filter((bookmark) => !isSameBookmark(bookmark, event.bookmark));
4733
+ }
4734
+ return {
4735
+ ...event.bookmark.activity,
4736
+ own_bookmarks: newOwnBookmarks,
4737
+ own_reactions: currentActivity.own_reactions,
4738
+ };
4739
+ };
4740
+ const removeBookmarkFromActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
4741
+ entities: activities,
4742
+ matcher: (activity) => activity.id === event.bookmark.activity.id,
4743
+ updater: (matchedActivity) => sharedUpdateActivity$4({
4744
+ currentActivity: matchedActivity,
4745
+ event,
4746
+ eventBelongsToCurrentUser,
4747
+ }),
4748
+ });
4749
+ const removeBookmarkFromPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
4750
+ entities: pinnedActivities,
4751
+ matcher: (pinnedActivity) => pinnedActivity.activity.id === event.bookmark.activity.id,
4752
+ updater: (matchedPinnedActivity) => {
4753
+ const newActivity = sharedUpdateActivity$4({
4754
+ currentActivity: matchedPinnedActivity.activity,
4755
+ event,
4756
+ eventBelongsToCurrentUser,
4757
+ });
4758
+ if (newActivity === matchedPinnedActivity.activity) {
4759
+ return matchedPinnedActivity;
4760
+ }
4761
+ return {
4762
+ ...matchedPinnedActivity,
4763
+ activity: newActivity,
4764
+ };
4765
+ },
4766
+ });
4767
+ function handleBookmarkDeleted(event) {
4768
+ const { activities: currentActivities, pinned_activities: currentPinnedActivities, } = this.currentState;
4769
+ const { connected_user: connectedUser } = this.client.state.getLatestValue();
4770
+ const eventBelongsToCurrentUser = event.bookmark.user.id === connectedUser?.id;
4771
+ const [result1, result2] = [
4772
+ removeBookmarkFromActivities(event, currentActivities, eventBelongsToCurrentUser),
4773
+ removeBookmarkFromPinnedActivities(event, currentPinnedActivities, eventBelongsToCurrentUser),
4774
+ ];
4775
+ if (result1.changed || result2.changed) {
4776
+ this.state.partialNext({
4777
+ activities: result1.entities,
4778
+ pinned_activities: result2.entities,
4779
+ });
4780
+ }
4781
+ }
4782
+
4783
+ const sharedUpdateActivity$3 = ({ currentActivity, event, eventBelongsToCurrentUser, }) => {
4784
+ let newOwnBookmarks = currentActivity.own_bookmarks;
4785
+ if (eventBelongsToCurrentUser) {
4786
+ const bookmarkIndex = newOwnBookmarks.findIndex((bookmark) => isSameBookmark(bookmark, event.bookmark));
4787
+ if (bookmarkIndex !== -1) {
4788
+ newOwnBookmarks = [...newOwnBookmarks];
4789
+ newOwnBookmarks[bookmarkIndex] = event.bookmark;
4790
+ }
4791
+ }
4792
+ return {
4793
+ ...event.bookmark.activity,
4794
+ own_bookmarks: newOwnBookmarks,
4795
+ own_reactions: currentActivity.own_reactions,
4796
+ };
4797
+ };
4798
+ const updateBookmarkInActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
4799
+ entities: activities,
4800
+ matcher: (activity) => activity.id === event.bookmark.activity.id,
4801
+ updater: (matchedActivity) => sharedUpdateActivity$3({
4802
+ currentActivity: matchedActivity,
4803
+ event,
4804
+ eventBelongsToCurrentUser,
4805
+ }),
4806
+ });
4807
+ const updateBookmarkInPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
4808
+ entities: pinnedActivities,
4809
+ matcher: (pinnedActivity) => pinnedActivity.activity.id === event.bookmark.activity.id,
4810
+ updater: (matchedPinnedActivity) => {
4811
+ const newActivity = sharedUpdateActivity$3({
4812
+ currentActivity: matchedPinnedActivity.activity,
4813
+ event,
4814
+ eventBelongsToCurrentUser,
4815
+ });
4816
+ if (newActivity === matchedPinnedActivity.activity) {
4817
+ return matchedPinnedActivity;
4818
+ }
4819
+ return {
4820
+ ...matchedPinnedActivity,
4821
+ activity: newActivity,
4822
+ };
4823
+ },
4824
+ });
4825
+ function handleBookmarkUpdated(event) {
4826
+ const { activities: currentActivities, pinned_activities: currentPinnedActivities, } = this.currentState;
4827
+ const { connected_user: connectedUser } = this.client.state.getLatestValue();
4828
+ const eventBelongsToCurrentUser = event.bookmark.user.id === connectedUser?.id;
4829
+ const [result1, result2] = [
4830
+ updateBookmarkInActivities(event, currentActivities, eventBelongsToCurrentUser),
4831
+ updateBookmarkInPinnedActivities(event, currentPinnedActivities, eventBelongsToCurrentUser),
4832
+ ];
4833
+ if (result1.changed || result2.changed) {
4834
+ this.state.partialNext({
4835
+ activities: result1.entities,
4836
+ pinned_activities: result2.entities,
4837
+ });
4838
+ }
4839
+ }
4840
+
4641
4841
  const addActivitiesToState = (newActivities, activities, position) => {
4642
4842
  let result;
4643
4843
  if (activities === undefined) {
@@ -4682,7 +4882,8 @@ function handleActivityAdded(event) {
4682
4882
  }
4683
4883
 
4684
4884
  const removeActivityFromState = (activityResponse, activities) => {
4685
- const index = activities.findIndex((a) => a.id === activityResponse.id);
4885
+ const index = activities?.findIndex((activity) => activity.id === activityResponse.id) ??
4886
+ -1;
4686
4887
  if (index !== -1) {
4687
4888
  const newActivities = [...activities];
4688
4889
  newActivities.splice(index, 1);
@@ -4692,13 +4893,28 @@ const removeActivityFromState = (activityResponse, activities) => {
4692
4893
  return { changed: false, activities };
4693
4894
  }
4694
4895
  };
4896
+ const removePinnedActivityFromState = (activityResponse, pinnedActivities) => {
4897
+ const index = pinnedActivities?.findIndex((pinnedActivity) => pinnedActivity.activity.id === activityResponse.id) ?? -1;
4898
+ if (index !== -1) {
4899
+ const newActivities = [...pinnedActivities];
4900
+ newActivities.splice(index, 1);
4901
+ return { changed: true, activities: newActivities };
4902
+ }
4903
+ else {
4904
+ return { changed: false, pinned_activities: pinnedActivities };
4905
+ }
4906
+ };
4695
4907
  function handleActivityDeleted(event) {
4696
- const currentActivities = this.currentState.activities;
4697
- if (currentActivities) {
4698
- const result = removeActivityFromState(event.activity, currentActivities);
4699
- if (result.changed) {
4700
- this.state.partialNext({ activities: result.activities });
4701
- }
4908
+ const { activities: currentActivities, pinned_activities: currentPinnedActivities, } = this.currentState;
4909
+ const [result1, result2] = [
4910
+ removeActivityFromState(event.activity, currentActivities),
4911
+ removePinnedActivityFromState(event.activity, currentPinnedActivities),
4912
+ ];
4913
+ if (result1.changed || result2.changed) {
4914
+ this.state.partialNext({
4915
+ activities: result1.activities,
4916
+ pinned_activities: result2.pinned_activities,
4917
+ });
4702
4918
  }
4703
4919
  }
4704
4920
 
@@ -4712,221 +4928,163 @@ function handleActivityRemovedFromFeed(event) {
4712
4928
  }
4713
4929
  }
4714
4930
 
4715
- const updateActivityInState = (updatedActivityResponse, activities, replaceCompletely = false) => {
4716
- const index = activities.findIndex((a) => a.id === updatedActivityResponse.id);
4717
- if (index !== -1) {
4718
- const newActivities = [...activities];
4719
- const activity = activities[index];
4720
- if (replaceCompletely) {
4721
- newActivities[index] = updatedActivityResponse;
4722
- }
4723
- else {
4724
- newActivities[index] = {
4725
- ...updatedActivityResponse,
4726
- own_reactions: activity.own_reactions,
4727
- own_bookmarks: activity.own_bookmarks,
4728
- latest_reactions: activity.latest_reactions,
4729
- reaction_groups: activity.reaction_groups,
4730
- };
4931
+ const sharedUpdateActivity$2 = ({ currentActivity, event, }) => {
4932
+ return {
4933
+ ...event.activity,
4934
+ own_reactions: currentActivity.own_reactions,
4935
+ own_bookmarks: currentActivity.own_bookmarks,
4936
+ };
4937
+ };
4938
+ const updateActivityInState = (event, activities) => updateEntityInArray({
4939
+ entities: activities,
4940
+ matcher: (activity) => activity.id === event.activity.id,
4941
+ updater: (matchedActivity) => sharedUpdateActivity$2({
4942
+ currentActivity: matchedActivity,
4943
+ event,
4944
+ }),
4945
+ });
4946
+ const updatePinnedActivityInState = (event, pinnedActivities) => updateEntityInArray({
4947
+ entities: pinnedActivities,
4948
+ matcher: (pinnedActivity) => pinnedActivity.activity.id === event.activity.id,
4949
+ updater: (matchedPinnedActivity) => {
4950
+ const newActivity = sharedUpdateActivity$2({
4951
+ currentActivity: matchedPinnedActivity.activity,
4952
+ event,
4953
+ });
4954
+ if (newActivity === matchedPinnedActivity.activity) {
4955
+ return matchedPinnedActivity;
4731
4956
  }
4732
- return { changed: true, activities: newActivities };
4733
- }
4734
- else {
4735
- return { changed: false, activities };
4736
- }
4737
- };
4957
+ return {
4958
+ ...matchedPinnedActivity,
4959
+ activity: newActivity,
4960
+ };
4961
+ },
4962
+ });
4738
4963
  function handleActivityUpdated(event) {
4739
- const currentActivities = this.currentState.activities;
4740
- if (currentActivities) {
4741
- const result = updateActivityInState(event.activity, currentActivities);
4742
- if (result.changed) {
4743
- this.client.hydratePollCache([event.activity]);
4744
- this.state.partialNext({ activities: result.activities });
4745
- }
4964
+ const { activities: currentActivities, pinned_activities: currentPinnedActivities, } = this.currentState;
4965
+ const [result1, result2] = [
4966
+ updateActivityInState(event, currentActivities),
4967
+ updatePinnedActivityInState(event, currentPinnedActivities),
4968
+ ];
4969
+ if (result1.changed || result2.changed) {
4970
+ this.client.hydratePollCache([event.activity]);
4971
+ this.state.partialNext({
4972
+ activities: result1.entities,
4973
+ pinned_activities: result2.entities,
4974
+ });
4746
4975
  }
4747
4976
  }
4748
4977
 
4749
- const addReactionToActivity = (event, activity, isCurrentUser) => {
4750
- // Update own_reactions if the reaction is from the current user
4751
- const ownReactions = [...(activity.own_reactions || [])];
4752
- if (isCurrentUser) {
4753
- ownReactions.push(event.reaction);
4978
+ // shared function to update the activity with the new reaction
4979
+ const sharedUpdateActivity$1 = ({ currentActivity, event, eventBelongsToCurrentUser, }) => {
4980
+ let newOwnReactions = currentActivity.own_reactions;
4981
+ if (eventBelongsToCurrentUser) {
4982
+ newOwnReactions = [...currentActivity.own_reactions, event.reaction];
4754
4983
  }
4755
4984
  return {
4756
- ...activity,
4757
- own_reactions: ownReactions,
4758
- latest_reactions: event.activity.latest_reactions,
4759
- reaction_groups: event.activity.reaction_groups,
4760
- changed: true,
4761
- };
4762
- };
4763
- const addReactionToActivities = (event, activities, isCurrentUser) => {
4764
- if (!activities) {
4765
- return { changed: false, activities: [] };
4766
- }
4767
- const activityIndex = activities.findIndex((a) => a.id === event.activity.id);
4768
- if (activityIndex === -1) {
4769
- return { changed: false, activities };
4770
- }
4771
- const activity = activities[activityIndex];
4772
- const updatedActivity = addReactionToActivity(event, activity, isCurrentUser);
4773
- return updateActivityInState(updatedActivity, activities, true);
4774
- };
4985
+ ...event.activity,
4986
+ own_reactions: newOwnReactions,
4987
+ own_bookmarks: currentActivity.own_bookmarks,
4988
+ };
4989
+ };
4990
+ const addReactionToActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
4991
+ entities: activities,
4992
+ matcher: (activity) => activity.id === event.activity.id,
4993
+ updater: (matchedActivity) => sharedUpdateActivity$1({
4994
+ currentActivity: matchedActivity,
4995
+ event,
4996
+ eventBelongsToCurrentUser,
4997
+ }),
4998
+ });
4999
+ const addReactionToPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
5000
+ entities: pinnedActivities,
5001
+ matcher: (pinnedActivity) => pinnedActivity.activity.id === event.activity.id,
5002
+ updater: (matchedPinnedActivity) => {
5003
+ const newActivity = sharedUpdateActivity$1({
5004
+ currentActivity: matchedPinnedActivity.activity,
5005
+ event,
5006
+ eventBelongsToCurrentUser,
5007
+ });
5008
+ // this should never happen, but just in case
5009
+ if (newActivity === matchedPinnedActivity.activity) {
5010
+ return matchedPinnedActivity;
5011
+ }
5012
+ return {
5013
+ ...matchedPinnedActivity,
5014
+ activity: newActivity,
5015
+ };
5016
+ },
5017
+ });
4775
5018
  function handleActivityReactionAdded(event) {
4776
- const currentActivities = this.currentState.activities;
4777
- const connectedUser = this.client.state.getLatestValue().connected_user;
4778
- const isCurrentUser = Boolean(connectedUser && event.reaction.user.id === connectedUser.id);
4779
- const result = addReactionToActivities(event, currentActivities, isCurrentUser);
4780
- if (result.changed) {
4781
- this.state.partialNext({ activities: result.activities });
4782
- }
4783
- }
4784
-
4785
- const removeReactionFromActivity = (event, activity, isCurrentUser) => {
4786
- // Update own_reactions if the reaction is from the current user
4787
- const ownReactions = isCurrentUser
4788
- ? (activity.own_reactions || []).filter((r) => !(r.type === event.reaction.type &&
4789
- r.user.id === event.reaction.user.id))
4790
- : activity.own_reactions;
4791
- return {
4792
- ...activity,
4793
- own_reactions: ownReactions,
4794
- latest_reactions: event.activity.latest_reactions,
4795
- reaction_groups: event.activity.reaction_groups,
4796
- changed: true,
4797
- };
4798
- };
4799
- const removeReactionFromActivities = (event, activities, isCurrentUser) => {
4800
- if (!activities) {
4801
- return { changed: false, activities: [] };
4802
- }
4803
- const activityIndex = activities.findIndex((a) => a.id === event.activity.id);
4804
- if (activityIndex === -1) {
4805
- return { changed: false, activities };
4806
- }
4807
- const activity = activities[activityIndex];
4808
- const updatedActivity = removeReactionFromActivity(event, activity, isCurrentUser);
4809
- return updateActivityInState(updatedActivity, activities, true);
4810
- };
4811
- function handleActivityReactionDeleted(event) {
4812
- const currentActivities = this.currentState.activities;
5019
+ const { activities: currentActivities, pinned_activities: currentPinnedActivities, } = this.currentState;
4813
5020
  const connectedUser = this.client.state.getLatestValue().connected_user;
4814
- const isCurrentUser = Boolean(connectedUser && event.reaction.user.id === connectedUser.id);
4815
- const result = removeReactionFromActivities(event, currentActivities, isCurrentUser);
4816
- if (result.changed) {
4817
- this.state.partialNext({ activities: result.activities });
4818
- }
4819
- }
4820
-
4821
- const addBookmarkToActivity = (event, activity, isCurrentUser) => {
4822
- // Update own_bookmarks if the bookmark is from the current user
4823
- const ownBookmarks = [...(activity.own_bookmarks || [])];
4824
- if (isCurrentUser) {
4825
- ownBookmarks.push(event.bookmark);
4826
- }
4827
- return {
4828
- ...activity,
4829
- own_bookmarks: ownBookmarks,
4830
- changed: true,
4831
- };
4832
- };
4833
- const addBookmarkToActivities = (event, activities, isCurrentUser) => {
4834
- if (!activities) {
4835
- return { changed: false, activities: [] };
4836
- }
4837
- const activityIndex = activities.findIndex((a) => a.id === event.bookmark.activity.id);
4838
- if (activityIndex === -1) {
4839
- return { changed: false, activities };
4840
- }
4841
- const activity = activities[activityIndex];
4842
- const updatedActivity = addBookmarkToActivity(event, activity, isCurrentUser);
4843
- return updateActivityInState(updatedActivity, activities, true);
4844
- };
4845
- function handleBookmarkAdded(event) {
4846
- const currentActivities = this.currentState.activities;
4847
- const { connected_user: connectedUser } = this.client.state.getLatestValue();
4848
- const isCurrentUser = event.bookmark.user.id === connectedUser?.id;
4849
- const result = addBookmarkToActivities(event, currentActivities, isCurrentUser);
4850
- if (result.changed) {
4851
- this.state.partialNext({ activities: result.activities });
5021
+ const eventBelongsToCurrentUser = typeof connectedUser !== 'undefined' &&
5022
+ event.reaction.user.id === connectedUser.id;
5023
+ const [result1, result2] = [
5024
+ addReactionToActivities(event, currentActivities, eventBelongsToCurrentUser),
5025
+ addReactionToPinnedActivities(event, currentPinnedActivities, eventBelongsToCurrentUser),
5026
+ ];
5027
+ if (result1.changed || result2.changed) {
5028
+ this.state.partialNext({
5029
+ activities: result1.entities,
5030
+ pinned_activities: result2.entities,
5031
+ });
4852
5032
  }
4853
5033
  }
4854
5034
 
4855
- // Helper function to check if two bookmarks are the same
4856
- // A bookmark is identified by activity_id + folder_id + user_id
4857
- const isSameBookmark = (bookmark1, bookmark2) => {
4858
- return (bookmark1.user.id === bookmark2.user.id &&
4859
- bookmark1.activity.id === bookmark2.activity.id &&
4860
- bookmark1.folder?.id === bookmark2.folder?.id);
4861
- };
4862
- const removeBookmarkFromActivities = (event, activities, isCurrentUser) => {
4863
- if (!activities) {
4864
- return { changed: false, activities: [] };
5035
+ const sharedUpdateActivity = ({ currentActivity, event, eventBelongsToCurrentUser, }) => {
5036
+ let newOwnReactions = currentActivity.own_reactions;
5037
+ if (eventBelongsToCurrentUser) {
5038
+ newOwnReactions = currentActivity.own_reactions.filter((reaction) => !(reaction.type === event.reaction.type &&
5039
+ reaction.user.id === event.reaction.user.id));
4865
5040
  }
4866
- const activityIndex = activities.findIndex((a) => a.id === event.bookmark.activity.id);
4867
- if (activityIndex === -1) {
4868
- return { changed: false, activities };
4869
- }
4870
- const activity = activities[activityIndex];
4871
- const updatedActivity = removeBookmarkFromActivity(event, activity, isCurrentUser);
4872
- return updateActivityInState(updatedActivity, activities, true);
4873
- };
4874
- const removeBookmarkFromActivity = (event, activity, isCurrentUser) => {
4875
- // Update own_bookmarks if the bookmark is from the current user
4876
- const ownBookmarks = isCurrentUser
4877
- ? (activity.own_bookmarks || []).filter((bookmark) => !isSameBookmark(bookmark, event.bookmark))
4878
- : activity.own_bookmarks;
4879
5041
  return {
4880
- ...activity,
4881
- own_bookmarks: ownBookmarks,
4882
- changed: true,
4883
- };
4884
- };
4885
- function handleBookmarkDeleted(event) {
4886
- const currentActivities = this.currentState.activities;
4887
- const { connected_user: connectedUser } = this.client.state.getLatestValue();
4888
- const isCurrentUser = event.bookmark.user.id === connectedUser?.id;
4889
- const result = removeBookmarkFromActivities(event, currentActivities, isCurrentUser);
4890
- if (result.changed) {
4891
- this.state.partialNext({ activities: result.activities });
4892
- }
4893
- }
4894
-
4895
- const updateBookmarkInActivity = (event, activity, isCurrentUser) => {
4896
- // Update own_bookmarks if the bookmark is from the current user
4897
- let ownBookmarks = activity.own_bookmarks || [];
4898
- if (isCurrentUser) {
4899
- const bookmarkIndex = ownBookmarks.findIndex((bookmark) => isSameBookmark(bookmark, event.bookmark));
4900
- if (bookmarkIndex !== -1) {
4901
- ownBookmarks = [...ownBookmarks];
4902
- ownBookmarks[bookmarkIndex] = event.bookmark;
5042
+ ...event.activity,
5043
+ own_reactions: newOwnReactions,
5044
+ own_bookmarks: currentActivity.own_bookmarks,
5045
+ };
5046
+ };
5047
+ const removeReactionFromActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5048
+ entities: activities,
5049
+ matcher: (activity) => activity.id === event.activity.id,
5050
+ updater: (matchedActivity) => sharedUpdateActivity({
5051
+ currentActivity: matchedActivity,
5052
+ event,
5053
+ eventBelongsToCurrentUser,
5054
+ }),
5055
+ });
5056
+ const removeReactionFromPinnedActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
5057
+ entities: activities,
5058
+ matcher: (pinnedActivity) => pinnedActivity.activity.id === event.activity.id,
5059
+ updater: (matchedPinnedActivity) => {
5060
+ const newActivity = sharedUpdateActivity({
5061
+ currentActivity: matchedPinnedActivity.activity,
5062
+ event,
5063
+ eventBelongsToCurrentUser,
5064
+ });
5065
+ if (newActivity === matchedPinnedActivity.activity) {
5066
+ return matchedPinnedActivity;
4903
5067
  }
4904
- }
4905
- return {
4906
- ...activity,
4907
- own_bookmarks: ownBookmarks,
4908
- changed: true,
4909
- };
4910
- };
4911
- const updateBookmarkInActivities = (event, activities, isCurrentUser) => {
4912
- if (!activities) {
4913
- return { changed: false, activities: [] };
4914
- }
4915
- const activityIndex = activities.findIndex((a) => a.id === event.bookmark.activity.id);
4916
- if (activityIndex === -1) {
4917
- return { changed: false, activities };
4918
- }
4919
- const activity = activities[activityIndex];
4920
- const updatedActivity = updateBookmarkInActivity(event, activity, isCurrentUser);
4921
- return updateActivityInState(updatedActivity, activities, true);
4922
- };
4923
- function handleBookmarkUpdated(event) {
4924
- const currentActivities = this.currentState.activities;
4925
- const { connected_user: connectedUser } = this.client.state.getLatestValue();
4926
- const isCurrentUser = event.bookmark.user.id === connectedUser?.id;
4927
- const result = updateBookmarkInActivities(event, currentActivities, isCurrentUser);
4928
- if (result.changed) {
4929
- this.state.partialNext({ activities: result.activities });
5068
+ return {
5069
+ ...matchedPinnedActivity,
5070
+ activity: newActivity,
5071
+ };
5072
+ },
5073
+ });
5074
+ function handleActivityReactionDeleted(event) {
5075
+ const { activities: currentActivities, pinned_activities: currentPinnedActivities, } = this.currentState;
5076
+ const connectedUser = this.client.state.getLatestValue().connected_user;
5077
+ const eventBelongsToCurrentUser = typeof connectedUser !== 'undefined' &&
5078
+ event.reaction.user.id === connectedUser.id;
5079
+ const [result1, result2] = [
5080
+ removeReactionFromActivities(event, currentActivities, eventBelongsToCurrentUser),
5081
+ removeReactionFromPinnedActivities(event, currentPinnedActivities, eventBelongsToCurrentUser),
5082
+ ];
5083
+ if (result1.changed || result2.changed) {
5084
+ this.state.partialNext({
5085
+ activities: result1.entities,
5086
+ pinned_activities: result2.entities,
5087
+ });
4930
5088
  }
4931
5089
  }
4932
5090
 
@@ -6238,4 +6396,5 @@ exports.isVideoFile = isVideoFile;
6238
6396
  exports.isVoteAnswer = isVoteAnswer;
6239
6397
  exports.shouldUpdateState = shouldUpdateState;
6240
6398
  exports.uniqueArrayMerge = uniqueArrayMerge;
6399
+ exports.updateEntityInArray = updateEntityInArray;
6241
6400
  //# sourceMappingURL=index.node.cjs.map