@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.
- package/CHANGELOG.md +8 -0
- package/dist/index-react-bindings.browser.cjs +365 -207
- package/dist/index-react-bindings.browser.cjs.map +1 -1
- package/dist/index-react-bindings.browser.js +365 -207
- package/dist/index-react-bindings.browser.js.map +1 -1
- package/dist/index-react-bindings.node.cjs +365 -207
- package/dist/index-react-bindings.node.cjs.map +1 -1
- package/dist/index-react-bindings.node.js +365 -207
- package/dist/index-react-bindings.node.js.map +1 -1
- package/dist/index.browser.cjs +366 -207
- package/dist/index.browser.cjs.map +1 -1
- package/dist/index.browser.js +366 -208
- package/dist/index.browser.js.map +1 -1
- package/dist/index.node.cjs +366 -207
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.js +366 -208
- package/dist/index.node.js.map +1 -1
- package/dist/src/feed/event-handlers/activity/handle-activity-deleted.d.ts +12 -3
- package/dist/src/feed/event-handlers/activity/handle-activity-pinned.d.ts +3 -0
- package/dist/src/feed/event-handlers/activity/handle-activity-reaction-added.d.ts +10 -6
- package/dist/src/feed/event-handlers/activity/handle-activity-reaction-deleted.d.ts +10 -6
- package/dist/src/feed/event-handlers/activity/handle-activity-unpinned.d.ts +3 -0
- package/dist/src/feed/event-handlers/activity/handle-activity-updated.d.ts +7 -3
- package/dist/src/feed/event-handlers/bookmark/handle-bookmark-added.d.ts +10 -6
- package/dist/src/feed/event-handlers/bookmark/handle-bookmark-deleted.d.ts +10 -6
- package/dist/src/feed/event-handlers/bookmark/handle-bookmark-updated.d.ts +10 -6
- package/dist/src/gen/models/index.d.ts +36 -1
- package/dist/src/test-utils/response-generators.d.ts +46 -1
- package/dist/src/utils/index.d.ts +1 -0
- package/dist/src/utils/update-entity-in-array.d.ts +27 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/feed/event-handlers/activity/activity-reaction-utils.test.ts +108 -96
- package/src/feed/event-handlers/activity/activity-utils.test.ts +84 -122
- package/src/feed/event-handlers/activity/handle-activity-deleted.ts +43 -10
- package/src/feed/event-handlers/activity/handle-activity-pinned.test.ts +60 -0
- package/src/feed/event-handlers/activity/handle-activity-pinned.ts +30 -0
- package/src/feed/event-handlers/activity/handle-activity-reaction-added.test.ts +157 -0
- package/src/feed/event-handlers/activity/handle-activity-reaction-added.ts +82 -40
- package/src/feed/event-handlers/activity/handle-activity-reaction-deleted.test.ts +200 -0
- package/src/feed/event-handlers/activity/handle-activity-reaction-deleted.ts +89 -51
- package/src/feed/event-handlers/activity/handle-activity-unpinned.test.ts +94 -0
- package/src/feed/event-handlers/activity/handle-activity-unpinned.ts +30 -0
- package/src/feed/event-handlers/activity/handle-activity-updated.test.ts +115 -0
- package/src/feed/event-handlers/activity/handle-activity-updated.ts +73 -35
- package/src/feed/event-handlers/bookmark/bookmark-utils.test.ts +121 -109
- package/src/feed/event-handlers/bookmark/handle-bookmark-added.test.ts +178 -0
- package/src/feed/event-handlers/bookmark/handle-bookmark-added.ts +82 -39
- package/src/feed/event-handlers/bookmark/handle-bookmark-deleted.test.ts +188 -0
- package/src/feed/event-handlers/bookmark/handle-bookmark-deleted.ts +86 -48
- package/src/feed/event-handlers/bookmark/handle-bookmark-updated.test.ts +196 -0
- package/src/feed/event-handlers/bookmark/handle-bookmark-updated.ts +83 -44
- package/src/gen/model-decoders/decoders.ts +13 -0
- package/src/gen/models/index.ts +73 -2
- package/src/gen/moderation/ModerationApi.ts +1 -0
- package/src/test-utils/response-generators.ts +260 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/update-entity-in-array.ts +51 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver).
|
|
4
4
|
|
|
5
|
+
## [0.2.1](https://github.com/GetStream/stream-feeds-js/compare/@stream-io/feeds-client-0.2.0...@stream-io/feeds-client-0.2.1) (2025-08-20)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* add membership_level in FeedMemberResponse ([#96](https://github.com/GetStream/stream-feeds-js/issues/96)) ([2aeeefa](https://github.com/GetStream/stream-feeds-js/commit/2aeeefa82abdc885dc52e9fe8249758042f9aed9))
|
|
11
|
+
* handle activity pinning ([#91](https://github.com/GetStream/stream-feeds-js/issues/91)) ([4347110](https://github.com/GetStream/stream-feeds-js/commit/4347110ce16c78f9e482d0c08e33dda0840678af))
|
|
12
|
+
|
|
5
13
|
## [0.2.0](https://github.com/GetStream/stream-feeds-js/compare/@stream-io/feeds-client-0.1.11...@stream-io/feeds-client-0.2.0) (2025-08-18)
|
|
6
14
|
|
|
7
15
|
|
|
@@ -613,6 +613,7 @@ decoders.Channel = (input) => {
|
|
|
613
613
|
updated_at: { type: 'DatetimeType', isSingle: true },
|
|
614
614
|
deleted_at: { type: 'DatetimeType', isSingle: true },
|
|
615
615
|
last_message_at: { type: 'DatetimeType', isSingle: true },
|
|
616
|
+
message_count_updated_at: { type: 'DatetimeType', isSingle: true },
|
|
616
617
|
active_live_locations: { type: 'SharedLocation', isSingle: false },
|
|
617
618
|
invites: { type: 'ChannelMember', isSingle: false },
|
|
618
619
|
members: { type: 'ChannelMember', isSingle: false },
|
|
@@ -890,6 +891,7 @@ decoders.FeedMemberResponse = (input) => {
|
|
|
890
891
|
user: { type: 'UserResponse', isSingle: true },
|
|
891
892
|
invite_accepted_at: { type: 'DatetimeType', isSingle: true },
|
|
892
893
|
invite_rejected_at: { type: 'DatetimeType', isSingle: true },
|
|
894
|
+
membership_level: { type: 'MembershipLevelResponse', isSingle: true },
|
|
893
895
|
};
|
|
894
896
|
return decode(typeMappings, input);
|
|
895
897
|
};
|
|
@@ -1062,6 +1064,13 @@ decoders.ListDevicesResponse = (input) => {
|
|
|
1062
1064
|
};
|
|
1063
1065
|
return decode(typeMappings, input);
|
|
1064
1066
|
};
|
|
1067
|
+
decoders.MembershipLevelResponse = (input) => {
|
|
1068
|
+
const typeMappings = {
|
|
1069
|
+
created_at: { type: 'DatetimeType', isSingle: true },
|
|
1070
|
+
updated_at: { type: 'DatetimeType', isSingle: true },
|
|
1071
|
+
};
|
|
1072
|
+
return decode(typeMappings, input);
|
|
1073
|
+
};
|
|
1065
1074
|
decoders.Message = (input) => {
|
|
1066
1075
|
const typeMappings = {
|
|
1067
1076
|
created_at: { type: 'DatetimeType', isSingle: true },
|
|
@@ -3812,6 +3821,7 @@ class ModerationApi {
|
|
|
3812
3821
|
block_list_config: request?.block_list_config,
|
|
3813
3822
|
bodyguard_config: request?.bodyguard_config,
|
|
3814
3823
|
google_vision_config: request?.google_vision_config,
|
|
3824
|
+
llm_config: request?.llm_config,
|
|
3815
3825
|
rule_builder_config: request?.rule_builder_config,
|
|
3816
3826
|
velocity_filter_config: request?.velocity_filter_config,
|
|
3817
3827
|
video_call_rule_config: request?.video_call_rule_config,
|
|
@@ -4288,6 +4298,23 @@ function getStateUpdateQueueId(data, prefix) {
|
|
|
4288
4298
|
throw new Error(`Cannot create state update queueId for data: ${JSON.stringify(data)}`);
|
|
4289
4299
|
}
|
|
4290
4300
|
|
|
4301
|
+
function updateEntityInArray({ matcher, updater, entities, }) {
|
|
4302
|
+
if (!entities || !entities.length) {
|
|
4303
|
+
return { changed: false, entities };
|
|
4304
|
+
}
|
|
4305
|
+
const index = entities.findIndex(matcher);
|
|
4306
|
+
if (index === -1) {
|
|
4307
|
+
return { changed: false, entities };
|
|
4308
|
+
}
|
|
4309
|
+
const newEntity = updater(entities[index]);
|
|
4310
|
+
if (newEntity === entities[index]) {
|
|
4311
|
+
return { changed: false, entities };
|
|
4312
|
+
}
|
|
4313
|
+
const updatedEntities = [...entities];
|
|
4314
|
+
updatedEntities[index] = newEntity;
|
|
4315
|
+
return { changed: true, entities: updatedEntities };
|
|
4316
|
+
}
|
|
4317
|
+
|
|
4291
4318
|
const updateStateFollowCreated = (follow, currentState, currentFeedId, connectedUserId) => {
|
|
4292
4319
|
// filter non-accepted follows (the way getOrCreate does by default)
|
|
4293
4320
|
if (follow.status !== 'accepted') {
|
|
@@ -4623,6 +4650,179 @@ function handleFeedMemberRemoved(event) {
|
|
|
4623
4650
|
});
|
|
4624
4651
|
}
|
|
4625
4652
|
|
|
4653
|
+
const sharedUpdateActivity$5 = ({ currentActivity, event, eventBelongsToCurrentUser, }) => {
|
|
4654
|
+
let newOwnBookmarks = currentActivity.own_bookmarks;
|
|
4655
|
+
if (eventBelongsToCurrentUser) {
|
|
4656
|
+
newOwnBookmarks = [...newOwnBookmarks, event.bookmark];
|
|
4657
|
+
}
|
|
4658
|
+
return {
|
|
4659
|
+
...event.bookmark.activity,
|
|
4660
|
+
own_bookmarks: newOwnBookmarks,
|
|
4661
|
+
own_reactions: currentActivity.own_reactions,
|
|
4662
|
+
};
|
|
4663
|
+
};
|
|
4664
|
+
const addBookmarkToActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
|
|
4665
|
+
entities: activities,
|
|
4666
|
+
matcher: (activity) => activity.id === event.bookmark.activity.id,
|
|
4667
|
+
updater: (matchedActivity) => sharedUpdateActivity$5({
|
|
4668
|
+
currentActivity: matchedActivity,
|
|
4669
|
+
event,
|
|
4670
|
+
eventBelongsToCurrentUser,
|
|
4671
|
+
}),
|
|
4672
|
+
});
|
|
4673
|
+
const addBookmarkToPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
|
|
4674
|
+
entities: pinnedActivities,
|
|
4675
|
+
matcher: (pinnedActivity) => pinnedActivity.activity.id === event.bookmark.activity.id,
|
|
4676
|
+
updater: (matchedPinnedActivity) => {
|
|
4677
|
+
const newActivity = sharedUpdateActivity$5({
|
|
4678
|
+
currentActivity: matchedPinnedActivity.activity,
|
|
4679
|
+
event,
|
|
4680
|
+
eventBelongsToCurrentUser,
|
|
4681
|
+
});
|
|
4682
|
+
if (newActivity === matchedPinnedActivity.activity) {
|
|
4683
|
+
return matchedPinnedActivity;
|
|
4684
|
+
}
|
|
4685
|
+
return {
|
|
4686
|
+
...matchedPinnedActivity,
|
|
4687
|
+
activity: newActivity,
|
|
4688
|
+
};
|
|
4689
|
+
},
|
|
4690
|
+
});
|
|
4691
|
+
function handleBookmarkAdded(event) {
|
|
4692
|
+
const { activities: currentActivities, pinned_activities: currentPinnedActivities, } = this.currentState;
|
|
4693
|
+
const { connected_user: connectedUser } = this.client.state.getLatestValue();
|
|
4694
|
+
const eventBelongsToCurrentUser = event.bookmark.user.id === connectedUser?.id;
|
|
4695
|
+
const [result1, result2] = [
|
|
4696
|
+
addBookmarkToActivities(event, currentActivities, eventBelongsToCurrentUser),
|
|
4697
|
+
addBookmarkToPinnedActivities(event, currentPinnedActivities, eventBelongsToCurrentUser),
|
|
4698
|
+
];
|
|
4699
|
+
if (result1.changed || result2.changed) {
|
|
4700
|
+
this.state.partialNext({
|
|
4701
|
+
activities: result1.entities,
|
|
4702
|
+
pinned_activities: result2.entities,
|
|
4703
|
+
});
|
|
4704
|
+
}
|
|
4705
|
+
}
|
|
4706
|
+
|
|
4707
|
+
// Helper function to check if two bookmarks are the same
|
|
4708
|
+
// A bookmark is identified by activity_id + folder_id + user_id
|
|
4709
|
+
const isSameBookmark = (bookmark1, bookmark2) => {
|
|
4710
|
+
return (bookmark1.user.id === bookmark2.user.id &&
|
|
4711
|
+
bookmark1.activity.id === bookmark2.activity.id &&
|
|
4712
|
+
bookmark1.folder?.id === bookmark2.folder?.id);
|
|
4713
|
+
};
|
|
4714
|
+
const sharedUpdateActivity$4 = ({ currentActivity, event, eventBelongsToCurrentUser, }) => {
|
|
4715
|
+
let newOwnBookmarks = currentActivity.own_bookmarks;
|
|
4716
|
+
if (eventBelongsToCurrentUser) {
|
|
4717
|
+
newOwnBookmarks = currentActivity.own_bookmarks.filter((bookmark) => !isSameBookmark(bookmark, event.bookmark));
|
|
4718
|
+
}
|
|
4719
|
+
return {
|
|
4720
|
+
...event.bookmark.activity,
|
|
4721
|
+
own_bookmarks: newOwnBookmarks,
|
|
4722
|
+
own_reactions: currentActivity.own_reactions,
|
|
4723
|
+
};
|
|
4724
|
+
};
|
|
4725
|
+
const removeBookmarkFromActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
|
|
4726
|
+
entities: activities,
|
|
4727
|
+
matcher: (activity) => activity.id === event.bookmark.activity.id,
|
|
4728
|
+
updater: (matchedActivity) => sharedUpdateActivity$4({
|
|
4729
|
+
currentActivity: matchedActivity,
|
|
4730
|
+
event,
|
|
4731
|
+
eventBelongsToCurrentUser,
|
|
4732
|
+
}),
|
|
4733
|
+
});
|
|
4734
|
+
const removeBookmarkFromPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
|
|
4735
|
+
entities: pinnedActivities,
|
|
4736
|
+
matcher: (pinnedActivity) => pinnedActivity.activity.id === event.bookmark.activity.id,
|
|
4737
|
+
updater: (matchedPinnedActivity) => {
|
|
4738
|
+
const newActivity = sharedUpdateActivity$4({
|
|
4739
|
+
currentActivity: matchedPinnedActivity.activity,
|
|
4740
|
+
event,
|
|
4741
|
+
eventBelongsToCurrentUser,
|
|
4742
|
+
});
|
|
4743
|
+
if (newActivity === matchedPinnedActivity.activity) {
|
|
4744
|
+
return matchedPinnedActivity;
|
|
4745
|
+
}
|
|
4746
|
+
return {
|
|
4747
|
+
...matchedPinnedActivity,
|
|
4748
|
+
activity: newActivity,
|
|
4749
|
+
};
|
|
4750
|
+
},
|
|
4751
|
+
});
|
|
4752
|
+
function handleBookmarkDeleted(event) {
|
|
4753
|
+
const { activities: currentActivities, pinned_activities: currentPinnedActivities, } = this.currentState;
|
|
4754
|
+
const { connected_user: connectedUser } = this.client.state.getLatestValue();
|
|
4755
|
+
const eventBelongsToCurrentUser = event.bookmark.user.id === connectedUser?.id;
|
|
4756
|
+
const [result1, result2] = [
|
|
4757
|
+
removeBookmarkFromActivities(event, currentActivities, eventBelongsToCurrentUser),
|
|
4758
|
+
removeBookmarkFromPinnedActivities(event, currentPinnedActivities, eventBelongsToCurrentUser),
|
|
4759
|
+
];
|
|
4760
|
+
if (result1.changed || result2.changed) {
|
|
4761
|
+
this.state.partialNext({
|
|
4762
|
+
activities: result1.entities,
|
|
4763
|
+
pinned_activities: result2.entities,
|
|
4764
|
+
});
|
|
4765
|
+
}
|
|
4766
|
+
}
|
|
4767
|
+
|
|
4768
|
+
const sharedUpdateActivity$3 = ({ currentActivity, event, eventBelongsToCurrentUser, }) => {
|
|
4769
|
+
let newOwnBookmarks = currentActivity.own_bookmarks;
|
|
4770
|
+
if (eventBelongsToCurrentUser) {
|
|
4771
|
+
const bookmarkIndex = newOwnBookmarks.findIndex((bookmark) => isSameBookmark(bookmark, event.bookmark));
|
|
4772
|
+
if (bookmarkIndex !== -1) {
|
|
4773
|
+
newOwnBookmarks = [...newOwnBookmarks];
|
|
4774
|
+
newOwnBookmarks[bookmarkIndex] = event.bookmark;
|
|
4775
|
+
}
|
|
4776
|
+
}
|
|
4777
|
+
return {
|
|
4778
|
+
...event.bookmark.activity,
|
|
4779
|
+
own_bookmarks: newOwnBookmarks,
|
|
4780
|
+
own_reactions: currentActivity.own_reactions,
|
|
4781
|
+
};
|
|
4782
|
+
};
|
|
4783
|
+
const updateBookmarkInActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
|
|
4784
|
+
entities: activities,
|
|
4785
|
+
matcher: (activity) => activity.id === event.bookmark.activity.id,
|
|
4786
|
+
updater: (matchedActivity) => sharedUpdateActivity$3({
|
|
4787
|
+
currentActivity: matchedActivity,
|
|
4788
|
+
event,
|
|
4789
|
+
eventBelongsToCurrentUser,
|
|
4790
|
+
}),
|
|
4791
|
+
});
|
|
4792
|
+
const updateBookmarkInPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
|
|
4793
|
+
entities: pinnedActivities,
|
|
4794
|
+
matcher: (pinnedActivity) => pinnedActivity.activity.id === event.bookmark.activity.id,
|
|
4795
|
+
updater: (matchedPinnedActivity) => {
|
|
4796
|
+
const newActivity = sharedUpdateActivity$3({
|
|
4797
|
+
currentActivity: matchedPinnedActivity.activity,
|
|
4798
|
+
event,
|
|
4799
|
+
eventBelongsToCurrentUser,
|
|
4800
|
+
});
|
|
4801
|
+
if (newActivity === matchedPinnedActivity.activity) {
|
|
4802
|
+
return matchedPinnedActivity;
|
|
4803
|
+
}
|
|
4804
|
+
return {
|
|
4805
|
+
...matchedPinnedActivity,
|
|
4806
|
+
activity: newActivity,
|
|
4807
|
+
};
|
|
4808
|
+
},
|
|
4809
|
+
});
|
|
4810
|
+
function handleBookmarkUpdated(event) {
|
|
4811
|
+
const { activities: currentActivities, pinned_activities: currentPinnedActivities, } = this.currentState;
|
|
4812
|
+
const { connected_user: connectedUser } = this.client.state.getLatestValue();
|
|
4813
|
+
const eventBelongsToCurrentUser = event.bookmark.user.id === connectedUser?.id;
|
|
4814
|
+
const [result1, result2] = [
|
|
4815
|
+
updateBookmarkInActivities(event, currentActivities, eventBelongsToCurrentUser),
|
|
4816
|
+
updateBookmarkInPinnedActivities(event, currentPinnedActivities, eventBelongsToCurrentUser),
|
|
4817
|
+
];
|
|
4818
|
+
if (result1.changed || result2.changed) {
|
|
4819
|
+
this.state.partialNext({
|
|
4820
|
+
activities: result1.entities,
|
|
4821
|
+
pinned_activities: result2.entities,
|
|
4822
|
+
});
|
|
4823
|
+
}
|
|
4824
|
+
}
|
|
4825
|
+
|
|
4626
4826
|
const addActivitiesToState = (newActivities, activities, position) => {
|
|
4627
4827
|
let result;
|
|
4628
4828
|
if (activities === undefined) {
|
|
@@ -4667,7 +4867,8 @@ function handleActivityAdded(event) {
|
|
|
4667
4867
|
}
|
|
4668
4868
|
|
|
4669
4869
|
const removeActivityFromState = (activityResponse, activities) => {
|
|
4670
|
-
const index = activities
|
|
4870
|
+
const index = activities?.findIndex((activity) => activity.id === activityResponse.id) ??
|
|
4871
|
+
-1;
|
|
4671
4872
|
if (index !== -1) {
|
|
4672
4873
|
const newActivities = [...activities];
|
|
4673
4874
|
newActivities.splice(index, 1);
|
|
@@ -4677,13 +4878,28 @@ const removeActivityFromState = (activityResponse, activities) => {
|
|
|
4677
4878
|
return { changed: false, activities };
|
|
4678
4879
|
}
|
|
4679
4880
|
};
|
|
4881
|
+
const removePinnedActivityFromState = (activityResponse, pinnedActivities) => {
|
|
4882
|
+
const index = pinnedActivities?.findIndex((pinnedActivity) => pinnedActivity.activity.id === activityResponse.id) ?? -1;
|
|
4883
|
+
if (index !== -1) {
|
|
4884
|
+
const newActivities = [...pinnedActivities];
|
|
4885
|
+
newActivities.splice(index, 1);
|
|
4886
|
+
return { changed: true, activities: newActivities };
|
|
4887
|
+
}
|
|
4888
|
+
else {
|
|
4889
|
+
return { changed: false, pinned_activities: pinnedActivities };
|
|
4890
|
+
}
|
|
4891
|
+
};
|
|
4680
4892
|
function handleActivityDeleted(event) {
|
|
4681
|
-
const currentActivities = this.currentState
|
|
4682
|
-
|
|
4683
|
-
|
|
4684
|
-
|
|
4685
|
-
|
|
4686
|
-
|
|
4893
|
+
const { activities: currentActivities, pinned_activities: currentPinnedActivities, } = this.currentState;
|
|
4894
|
+
const [result1, result2] = [
|
|
4895
|
+
removeActivityFromState(event.activity, currentActivities),
|
|
4896
|
+
removePinnedActivityFromState(event.activity, currentPinnedActivities),
|
|
4897
|
+
];
|
|
4898
|
+
if (result1.changed || result2.changed) {
|
|
4899
|
+
this.state.partialNext({
|
|
4900
|
+
activities: result1.activities,
|
|
4901
|
+
pinned_activities: result2.pinned_activities,
|
|
4902
|
+
});
|
|
4687
4903
|
}
|
|
4688
4904
|
}
|
|
4689
4905
|
|
|
@@ -4697,221 +4913,163 @@ function handleActivityRemovedFromFeed(event) {
|
|
|
4697
4913
|
}
|
|
4698
4914
|
}
|
|
4699
4915
|
|
|
4700
|
-
const
|
|
4701
|
-
|
|
4702
|
-
|
|
4703
|
-
|
|
4704
|
-
|
|
4705
|
-
|
|
4706
|
-
|
|
4707
|
-
|
|
4708
|
-
|
|
4709
|
-
|
|
4710
|
-
|
|
4711
|
-
|
|
4712
|
-
|
|
4713
|
-
|
|
4714
|
-
|
|
4715
|
-
|
|
4916
|
+
const sharedUpdateActivity$2 = ({ currentActivity, event, }) => {
|
|
4917
|
+
return {
|
|
4918
|
+
...event.activity,
|
|
4919
|
+
own_reactions: currentActivity.own_reactions,
|
|
4920
|
+
own_bookmarks: currentActivity.own_bookmarks,
|
|
4921
|
+
};
|
|
4922
|
+
};
|
|
4923
|
+
const updateActivityInState = (event, activities) => updateEntityInArray({
|
|
4924
|
+
entities: activities,
|
|
4925
|
+
matcher: (activity) => activity.id === event.activity.id,
|
|
4926
|
+
updater: (matchedActivity) => sharedUpdateActivity$2({
|
|
4927
|
+
currentActivity: matchedActivity,
|
|
4928
|
+
event,
|
|
4929
|
+
}),
|
|
4930
|
+
});
|
|
4931
|
+
const updatePinnedActivityInState = (event, pinnedActivities) => updateEntityInArray({
|
|
4932
|
+
entities: pinnedActivities,
|
|
4933
|
+
matcher: (pinnedActivity) => pinnedActivity.activity.id === event.activity.id,
|
|
4934
|
+
updater: (matchedPinnedActivity) => {
|
|
4935
|
+
const newActivity = sharedUpdateActivity$2({
|
|
4936
|
+
currentActivity: matchedPinnedActivity.activity,
|
|
4937
|
+
event,
|
|
4938
|
+
});
|
|
4939
|
+
if (newActivity === matchedPinnedActivity.activity) {
|
|
4940
|
+
return matchedPinnedActivity;
|
|
4716
4941
|
}
|
|
4717
|
-
return {
|
|
4718
|
-
|
|
4719
|
-
|
|
4720
|
-
|
|
4721
|
-
}
|
|
4722
|
-
};
|
|
4942
|
+
return {
|
|
4943
|
+
...matchedPinnedActivity,
|
|
4944
|
+
activity: newActivity,
|
|
4945
|
+
};
|
|
4946
|
+
},
|
|
4947
|
+
});
|
|
4723
4948
|
function handleActivityUpdated(event) {
|
|
4724
|
-
const currentActivities = this.currentState
|
|
4725
|
-
|
|
4726
|
-
|
|
4727
|
-
|
|
4728
|
-
|
|
4729
|
-
|
|
4730
|
-
|
|
4949
|
+
const { activities: currentActivities, pinned_activities: currentPinnedActivities, } = this.currentState;
|
|
4950
|
+
const [result1, result2] = [
|
|
4951
|
+
updateActivityInState(event, currentActivities),
|
|
4952
|
+
updatePinnedActivityInState(event, currentPinnedActivities),
|
|
4953
|
+
];
|
|
4954
|
+
if (result1.changed || result2.changed) {
|
|
4955
|
+
this.client.hydratePollCache([event.activity]);
|
|
4956
|
+
this.state.partialNext({
|
|
4957
|
+
activities: result1.entities,
|
|
4958
|
+
pinned_activities: result2.entities,
|
|
4959
|
+
});
|
|
4731
4960
|
}
|
|
4732
4961
|
}
|
|
4733
4962
|
|
|
4734
|
-
|
|
4735
|
-
|
|
4736
|
-
|
|
4737
|
-
if (
|
|
4738
|
-
|
|
4963
|
+
// shared function to update the activity with the new reaction
|
|
4964
|
+
const sharedUpdateActivity$1 = ({ currentActivity, event, eventBelongsToCurrentUser, }) => {
|
|
4965
|
+
let newOwnReactions = currentActivity.own_reactions;
|
|
4966
|
+
if (eventBelongsToCurrentUser) {
|
|
4967
|
+
newOwnReactions = [...currentActivity.own_reactions, event.reaction];
|
|
4739
4968
|
}
|
|
4740
4969
|
return {
|
|
4741
|
-
...activity,
|
|
4742
|
-
own_reactions:
|
|
4743
|
-
|
|
4744
|
-
|
|
4745
|
-
|
|
4746
|
-
|
|
4747
|
-
|
|
4748
|
-
|
|
4749
|
-
|
|
4750
|
-
|
|
4751
|
-
|
|
4752
|
-
|
|
4753
|
-
|
|
4754
|
-
|
|
4755
|
-
|
|
4756
|
-
|
|
4757
|
-
|
|
4758
|
-
|
|
4759
|
-
|
|
4970
|
+
...event.activity,
|
|
4971
|
+
own_reactions: newOwnReactions,
|
|
4972
|
+
own_bookmarks: currentActivity.own_bookmarks,
|
|
4973
|
+
};
|
|
4974
|
+
};
|
|
4975
|
+
const addReactionToActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
|
|
4976
|
+
entities: activities,
|
|
4977
|
+
matcher: (activity) => activity.id === event.activity.id,
|
|
4978
|
+
updater: (matchedActivity) => sharedUpdateActivity$1({
|
|
4979
|
+
currentActivity: matchedActivity,
|
|
4980
|
+
event,
|
|
4981
|
+
eventBelongsToCurrentUser,
|
|
4982
|
+
}),
|
|
4983
|
+
});
|
|
4984
|
+
const addReactionToPinnedActivities = (event, pinnedActivities, eventBelongsToCurrentUser) => updateEntityInArray({
|
|
4985
|
+
entities: pinnedActivities,
|
|
4986
|
+
matcher: (pinnedActivity) => pinnedActivity.activity.id === event.activity.id,
|
|
4987
|
+
updater: (matchedPinnedActivity) => {
|
|
4988
|
+
const newActivity = sharedUpdateActivity$1({
|
|
4989
|
+
currentActivity: matchedPinnedActivity.activity,
|
|
4990
|
+
event,
|
|
4991
|
+
eventBelongsToCurrentUser,
|
|
4992
|
+
});
|
|
4993
|
+
// this should never happen, but just in case
|
|
4994
|
+
if (newActivity === matchedPinnedActivity.activity) {
|
|
4995
|
+
return matchedPinnedActivity;
|
|
4996
|
+
}
|
|
4997
|
+
return {
|
|
4998
|
+
...matchedPinnedActivity,
|
|
4999
|
+
activity: newActivity,
|
|
5000
|
+
};
|
|
5001
|
+
},
|
|
5002
|
+
});
|
|
4760
5003
|
function handleActivityReactionAdded(event) {
|
|
4761
|
-
const currentActivities = this.currentState
|
|
5004
|
+
const { activities: currentActivities, pinned_activities: currentPinnedActivities, } = this.currentState;
|
|
4762
5005
|
const connectedUser = this.client.state.getLatestValue().connected_user;
|
|
4763
|
-
const
|
|
4764
|
-
|
|
4765
|
-
|
|
4766
|
-
|
|
4767
|
-
|
|
4768
|
-
|
|
4769
|
-
|
|
4770
|
-
|
|
4771
|
-
|
|
4772
|
-
|
|
4773
|
-
|
|
4774
|
-
r.user.id === event.reaction.user.id))
|
|
4775
|
-
: activity.own_reactions;
|
|
4776
|
-
return {
|
|
4777
|
-
...activity,
|
|
4778
|
-
own_reactions: ownReactions,
|
|
4779
|
-
latest_reactions: event.activity.latest_reactions,
|
|
4780
|
-
reaction_groups: event.activity.reaction_groups,
|
|
4781
|
-
changed: true,
|
|
4782
|
-
};
|
|
4783
|
-
};
|
|
4784
|
-
const removeReactionFromActivities = (event, activities, isCurrentUser) => {
|
|
4785
|
-
if (!activities) {
|
|
4786
|
-
return { changed: false, activities: [] };
|
|
4787
|
-
}
|
|
4788
|
-
const activityIndex = activities.findIndex((a) => a.id === event.activity.id);
|
|
4789
|
-
if (activityIndex === -1) {
|
|
4790
|
-
return { changed: false, activities };
|
|
4791
|
-
}
|
|
4792
|
-
const activity = activities[activityIndex];
|
|
4793
|
-
const updatedActivity = removeReactionFromActivity(event, activity, isCurrentUser);
|
|
4794
|
-
return updateActivityInState(updatedActivity, activities, true);
|
|
4795
|
-
};
|
|
4796
|
-
function handleActivityReactionDeleted(event) {
|
|
4797
|
-
const currentActivities = this.currentState.activities;
|
|
4798
|
-
const connectedUser = this.client.state.getLatestValue().connected_user;
|
|
4799
|
-
const isCurrentUser = Boolean(connectedUser && event.reaction.user.id === connectedUser.id);
|
|
4800
|
-
const result = removeReactionFromActivities(event, currentActivities, isCurrentUser);
|
|
4801
|
-
if (result.changed) {
|
|
4802
|
-
this.state.partialNext({ activities: result.activities });
|
|
4803
|
-
}
|
|
4804
|
-
}
|
|
4805
|
-
|
|
4806
|
-
const addBookmarkToActivity = (event, activity, isCurrentUser) => {
|
|
4807
|
-
// Update own_bookmarks if the bookmark is from the current user
|
|
4808
|
-
const ownBookmarks = [...(activity.own_bookmarks || [])];
|
|
4809
|
-
if (isCurrentUser) {
|
|
4810
|
-
ownBookmarks.push(event.bookmark);
|
|
4811
|
-
}
|
|
4812
|
-
return {
|
|
4813
|
-
...activity,
|
|
4814
|
-
own_bookmarks: ownBookmarks,
|
|
4815
|
-
changed: true,
|
|
4816
|
-
};
|
|
4817
|
-
};
|
|
4818
|
-
const addBookmarkToActivities = (event, activities, isCurrentUser) => {
|
|
4819
|
-
if (!activities) {
|
|
4820
|
-
return { changed: false, activities: [] };
|
|
4821
|
-
}
|
|
4822
|
-
const activityIndex = activities.findIndex((a) => a.id === event.bookmark.activity.id);
|
|
4823
|
-
if (activityIndex === -1) {
|
|
4824
|
-
return { changed: false, activities };
|
|
4825
|
-
}
|
|
4826
|
-
const activity = activities[activityIndex];
|
|
4827
|
-
const updatedActivity = addBookmarkToActivity(event, activity, isCurrentUser);
|
|
4828
|
-
return updateActivityInState(updatedActivity, activities, true);
|
|
4829
|
-
};
|
|
4830
|
-
function handleBookmarkAdded(event) {
|
|
4831
|
-
const currentActivities = this.currentState.activities;
|
|
4832
|
-
const { connected_user: connectedUser } = this.client.state.getLatestValue();
|
|
4833
|
-
const isCurrentUser = event.bookmark.user.id === connectedUser?.id;
|
|
4834
|
-
const result = addBookmarkToActivities(event, currentActivities, isCurrentUser);
|
|
4835
|
-
if (result.changed) {
|
|
4836
|
-
this.state.partialNext({ activities: result.activities });
|
|
5006
|
+
const eventBelongsToCurrentUser = typeof connectedUser !== 'undefined' &&
|
|
5007
|
+
event.reaction.user.id === connectedUser.id;
|
|
5008
|
+
const [result1, result2] = [
|
|
5009
|
+
addReactionToActivities(event, currentActivities, eventBelongsToCurrentUser),
|
|
5010
|
+
addReactionToPinnedActivities(event, currentPinnedActivities, eventBelongsToCurrentUser),
|
|
5011
|
+
];
|
|
5012
|
+
if (result1.changed || result2.changed) {
|
|
5013
|
+
this.state.partialNext({
|
|
5014
|
+
activities: result1.entities,
|
|
5015
|
+
pinned_activities: result2.entities,
|
|
5016
|
+
});
|
|
4837
5017
|
}
|
|
4838
5018
|
}
|
|
4839
5019
|
|
|
4840
|
-
|
|
4841
|
-
|
|
4842
|
-
|
|
4843
|
-
|
|
4844
|
-
|
|
4845
|
-
bookmark1.folder?.id === bookmark2.folder?.id);
|
|
4846
|
-
};
|
|
4847
|
-
const removeBookmarkFromActivities = (event, activities, isCurrentUser) => {
|
|
4848
|
-
if (!activities) {
|
|
4849
|
-
return { changed: false, activities: [] };
|
|
5020
|
+
const sharedUpdateActivity = ({ currentActivity, event, eventBelongsToCurrentUser, }) => {
|
|
5021
|
+
let newOwnReactions = currentActivity.own_reactions;
|
|
5022
|
+
if (eventBelongsToCurrentUser) {
|
|
5023
|
+
newOwnReactions = currentActivity.own_reactions.filter((reaction) => !(reaction.type === event.reaction.type &&
|
|
5024
|
+
reaction.user.id === event.reaction.user.id));
|
|
4850
5025
|
}
|
|
4851
|
-
const activityIndex = activities.findIndex((a) => a.id === event.bookmark.activity.id);
|
|
4852
|
-
if (activityIndex === -1) {
|
|
4853
|
-
return { changed: false, activities };
|
|
4854
|
-
}
|
|
4855
|
-
const activity = activities[activityIndex];
|
|
4856
|
-
const updatedActivity = removeBookmarkFromActivity(event, activity, isCurrentUser);
|
|
4857
|
-
return updateActivityInState(updatedActivity, activities, true);
|
|
4858
|
-
};
|
|
4859
|
-
const removeBookmarkFromActivity = (event, activity, isCurrentUser) => {
|
|
4860
|
-
// Update own_bookmarks if the bookmark is from the current user
|
|
4861
|
-
const ownBookmarks = isCurrentUser
|
|
4862
|
-
? (activity.own_bookmarks || []).filter((bookmark) => !isSameBookmark(bookmark, event.bookmark))
|
|
4863
|
-
: activity.own_bookmarks;
|
|
4864
5026
|
return {
|
|
4865
|
-
...activity,
|
|
4866
|
-
|
|
4867
|
-
|
|
4868
|
-
};
|
|
4869
|
-
};
|
|
4870
|
-
|
|
4871
|
-
|
|
4872
|
-
|
|
4873
|
-
|
|
4874
|
-
|
|
4875
|
-
|
|
4876
|
-
|
|
4877
|
-
}
|
|
4878
|
-
}
|
|
4879
|
-
|
|
4880
|
-
|
|
4881
|
-
|
|
4882
|
-
|
|
4883
|
-
|
|
4884
|
-
|
|
4885
|
-
|
|
4886
|
-
|
|
4887
|
-
|
|
5027
|
+
...event.activity,
|
|
5028
|
+
own_reactions: newOwnReactions,
|
|
5029
|
+
own_bookmarks: currentActivity.own_bookmarks,
|
|
5030
|
+
};
|
|
5031
|
+
};
|
|
5032
|
+
const removeReactionFromActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
|
|
5033
|
+
entities: activities,
|
|
5034
|
+
matcher: (activity) => activity.id === event.activity.id,
|
|
5035
|
+
updater: (matchedActivity) => sharedUpdateActivity({
|
|
5036
|
+
currentActivity: matchedActivity,
|
|
5037
|
+
event,
|
|
5038
|
+
eventBelongsToCurrentUser,
|
|
5039
|
+
}),
|
|
5040
|
+
});
|
|
5041
|
+
const removeReactionFromPinnedActivities = (event, activities, eventBelongsToCurrentUser) => updateEntityInArray({
|
|
5042
|
+
entities: activities,
|
|
5043
|
+
matcher: (pinnedActivity) => pinnedActivity.activity.id === event.activity.id,
|
|
5044
|
+
updater: (matchedPinnedActivity) => {
|
|
5045
|
+
const newActivity = sharedUpdateActivity({
|
|
5046
|
+
currentActivity: matchedPinnedActivity.activity,
|
|
5047
|
+
event,
|
|
5048
|
+
eventBelongsToCurrentUser,
|
|
5049
|
+
});
|
|
5050
|
+
if (newActivity === matchedPinnedActivity.activity) {
|
|
5051
|
+
return matchedPinnedActivity;
|
|
4888
5052
|
}
|
|
4889
|
-
|
|
4890
|
-
|
|
4891
|
-
|
|
4892
|
-
|
|
4893
|
-
|
|
4894
|
-
|
|
4895
|
-
|
|
4896
|
-
const
|
|
4897
|
-
|
|
4898
|
-
|
|
4899
|
-
|
|
4900
|
-
const
|
|
4901
|
-
|
|
4902
|
-
|
|
4903
|
-
|
|
4904
|
-
|
|
4905
|
-
|
|
4906
|
-
|
|
4907
|
-
|
|
4908
|
-
|
|
4909
|
-
const currentActivities = this.currentState.activities;
|
|
4910
|
-
const { connected_user: connectedUser } = this.client.state.getLatestValue();
|
|
4911
|
-
const isCurrentUser = event.bookmark.user.id === connectedUser?.id;
|
|
4912
|
-
const result = updateBookmarkInActivities(event, currentActivities, isCurrentUser);
|
|
4913
|
-
if (result.changed) {
|
|
4914
|
-
this.state.partialNext({ activities: result.activities });
|
|
5053
|
+
return {
|
|
5054
|
+
...matchedPinnedActivity,
|
|
5055
|
+
activity: newActivity,
|
|
5056
|
+
};
|
|
5057
|
+
},
|
|
5058
|
+
});
|
|
5059
|
+
function handleActivityReactionDeleted(event) {
|
|
5060
|
+
const { activities: currentActivities, pinned_activities: currentPinnedActivities, } = this.currentState;
|
|
5061
|
+
const connectedUser = this.client.state.getLatestValue().connected_user;
|
|
5062
|
+
const eventBelongsToCurrentUser = typeof connectedUser !== 'undefined' &&
|
|
5063
|
+
event.reaction.user.id === connectedUser.id;
|
|
5064
|
+
const [result1, result2] = [
|
|
5065
|
+
removeReactionFromActivities(event, currentActivities, eventBelongsToCurrentUser),
|
|
5066
|
+
removeReactionFromPinnedActivities(event, currentPinnedActivities, eventBelongsToCurrentUser),
|
|
5067
|
+
];
|
|
5068
|
+
if (result1.changed || result2.changed) {
|
|
5069
|
+
this.state.partialNext({
|
|
5070
|
+
activities: result1.entities,
|
|
5071
|
+
pinned_activities: result2.entities,
|
|
5072
|
+
});
|
|
4915
5073
|
}
|
|
4916
5074
|
}
|
|
4917
5075
|
|