@stream-io/feeds-client 0.3.51 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/cjs/index.js +2 -1
  3. package/dist/cjs/index.js.map +1 -1
  4. package/dist/cjs/react-bindings.js +5 -19
  5. package/dist/cjs/react-bindings.js.map +1 -1
  6. package/dist/es/index.mjs +15 -14
  7. package/dist/es/index.mjs.map +1 -1
  8. package/dist/es/react-bindings.mjs +5 -19
  9. package/dist/es/react-bindings.mjs.map +1 -1
  10. package/dist/{feeds-client-B4zeBggL.js → feeds-client-C1c6lcS3.js} +705 -214
  11. package/dist/feeds-client-C1c6lcS3.js.map +1 -0
  12. package/dist/{feeds-client-DeAqnd1a.mjs → feeds-client-jtUTE4AC.mjs} +711 -220
  13. package/dist/feeds-client-jtUTE4AC.mjs.map +1 -0
  14. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  15. package/dist/types/activity-with-state-updates/activity-with-state-updates.d.ts.map +1 -1
  16. package/dist/types/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivityRead.d.ts +6 -2
  17. package/dist/types/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivityRead.d.ts.map +1 -1
  18. package/dist/types/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivitySeen.d.ts +6 -2
  19. package/dist/types/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivitySeen.d.ts.map +1 -1
  20. package/dist/types/feed/activity-filter.d.ts +11 -0
  21. package/dist/types/feed/activity-filter.d.ts.map +1 -0
  22. package/dist/types/feed/event-handlers/activity/handle-activity-added.d.ts +3 -2
  23. package/dist/types/feed/event-handlers/activity/handle-activity-added.d.ts.map +1 -1
  24. package/dist/types/feed/event-handlers/activity/handle-activity-deleted.d.ts +3 -2
  25. package/dist/types/feed/event-handlers/activity/handle-activity-deleted.d.ts.map +1 -1
  26. package/dist/types/feed/event-handlers/activity/handle-activity-feedback.d.ts +5 -0
  27. package/dist/types/feed/event-handlers/activity/handle-activity-feedback.d.ts.map +1 -1
  28. package/dist/types/feed/event-handlers/activity/handle-activity-pinned.d.ts +3 -2
  29. package/dist/types/feed/event-handlers/activity/handle-activity-pinned.d.ts.map +1 -1
  30. package/dist/types/feed/event-handlers/activity/handle-activity-unpinned.d.ts +3 -2
  31. package/dist/types/feed/event-handlers/activity/handle-activity-unpinned.d.ts.map +1 -1
  32. package/dist/types/feed/event-handlers/activity/handle-activity-updated.d.ts.map +1 -1
  33. package/dist/types/feed/event-handlers/activity/index.d.ts +3 -1
  34. package/dist/types/feed/event-handlers/activity/index.d.ts.map +1 -1
  35. package/dist/types/feed/event-handlers/activity-updater.d.ts +1 -0
  36. package/dist/types/feed/event-handlers/activity-updater.d.ts.map +1 -1
  37. package/dist/types/feed/event-handlers/add-aggregated-activities-to-state.d.ts +1 -1
  38. package/dist/types/feed/event-handlers/add-aggregated-activities-to-state.d.ts.map +1 -1
  39. package/dist/types/feed/event-handlers/bookmark/handle-bookmark-added.d.ts +6 -5
  40. package/dist/types/feed/event-handlers/bookmark/handle-bookmark-added.d.ts.map +1 -1
  41. package/dist/types/feed/event-handlers/bookmark/handle-bookmark-deleted.d.ts +6 -5
  42. package/dist/types/feed/event-handlers/bookmark/handle-bookmark-deleted.d.ts.map +1 -1
  43. package/dist/types/feed/event-handlers/bookmark/handle-bookmark-updated.d.ts +6 -5
  44. package/dist/types/feed/event-handlers/bookmark/handle-bookmark-updated.d.ts.map +1 -1
  45. package/dist/types/feed/event-handlers/comment/handle-comment-updated.d.ts.map +1 -1
  46. package/dist/types/feed/event-handlers/feed/handle-feed-deleted.d.ts +4 -0
  47. package/dist/types/feed/event-handlers/feed/handle-feed-deleted.d.ts.map +1 -0
  48. package/dist/types/feed/event-handlers/feed/handle-feed-updated.d.ts.map +1 -1
  49. package/dist/types/feed/event-handlers/feed/index.d.ts +1 -0
  50. package/dist/types/feed/event-handlers/feed/index.d.ts.map +1 -1
  51. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-added.d.ts +3 -2
  52. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-added.d.ts.map +1 -1
  53. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-removed.d.ts +3 -2
  54. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-removed.d.ts.map +1 -1
  55. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-updated.d.ts +3 -2
  56. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-updated.d.ts.map +1 -1
  57. package/dist/types/feed/event-handlers/follow/handle-follow-created.d.ts +2 -2
  58. package/dist/types/feed/event-handlers/follow/handle-follow-created.d.ts.map +1 -1
  59. package/dist/types/feed/event-handlers/follow/handle-follow-updated.d.ts.map +1 -1
  60. package/dist/types/feed/event-handlers/notification-feed/handle-notification-feed-updated.d.ts +3 -2
  61. package/dist/types/feed/event-handlers/notification-feed/handle-notification-feed-updated.d.ts.map +1 -1
  62. package/dist/types/feed/feed.d.ts +17 -12
  63. package/dist/types/feed/feed.d.ts.map +1 -1
  64. package/dist/types/feeds-client/apply-new-activity-to-active-feeds.d.ts +4 -0
  65. package/dist/types/feeds-client/apply-new-activity-to-active-feeds.d.ts.map +1 -0
  66. package/dist/types/feeds-client/feeds-client.d.ts +29 -8
  67. package/dist/types/feeds-client/feeds-client.d.ts.map +1 -1
  68. package/dist/types/gen/feeds/FeedsApi.d.ts +6 -4
  69. package/dist/types/gen/feeds/FeedsApi.d.ts.map +1 -1
  70. package/dist/types/gen/models/index.d.ts +40 -2
  71. package/dist/types/gen/models/index.d.ts.map +1 -1
  72. package/dist/types/index.d.ts +1 -0
  73. package/dist/types/index.d.ts.map +1 -1
  74. package/dist/types/types.d.ts +15 -0
  75. package/dist/types/types.d.ts.map +1 -1
  76. package/dist/types/utils/state-update-queue.d.ts +11 -2
  77. package/dist/types/utils/state-update-queue.d.ts.map +1 -1
  78. package/dist/types/utils/unique-array-merge.d.ts +1 -1
  79. package/dist/types/utils/unique-array-merge.d.ts.map +1 -1
  80. package/package.json +2 -1
  81. package/src/activity-with-state-updates/activity-with-state-updates.ts +8 -2
  82. package/src/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivityRead.ts +6 -20
  83. package/src/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivitySeen.ts +6 -20
  84. package/src/feed/activity-filter.ts +44 -0
  85. package/src/feed/event-handlers/activity/handle-activity-added.ts +22 -8
  86. package/src/feed/event-handlers/activity/handle-activity-deleted.ts +28 -2
  87. package/src/feed/event-handlers/activity/handle-activity-feedback.ts +17 -7
  88. package/src/feed/event-handlers/activity/handle-activity-pinned.ts +25 -3
  89. package/src/feed/event-handlers/activity/handle-activity-unpinned.ts +25 -2
  90. package/src/feed/event-handlers/activity/handle-activity-updated.ts +5 -1
  91. package/src/feed/event-handlers/activity/index.ts +3 -1
  92. package/src/feed/event-handlers/add-aggregated-activities-to-state.ts +11 -2
  93. package/src/feed/event-handlers/bookmark/handle-bookmark-added.ts +20 -11
  94. package/src/feed/event-handlers/bookmark/handle-bookmark-deleted.ts +21 -11
  95. package/src/feed/event-handlers/bookmark/handle-bookmark-updated.ts +24 -10
  96. package/src/feed/event-handlers/comment/handle-comment-updated.ts +11 -10
  97. package/src/feed/event-handlers/feed/handle-feed-deleted.ts +12 -0
  98. package/src/feed/event-handlers/feed/handle-feed-updated.ts +8 -0
  99. package/src/feed/event-handlers/feed/index.ts +1 -0
  100. package/src/feed/event-handlers/feed-member/handle-feed-member-added.ts +25 -2
  101. package/src/feed/event-handlers/feed-member/handle-feed-member-removed.ts +25 -2
  102. package/src/feed/event-handlers/feed-member/handle-feed-member-updated.ts +25 -2
  103. package/src/feed/event-handlers/follow/handle-follow-created.ts +18 -1
  104. package/src/feed/event-handlers/follow/handle-follow-updated.ts +14 -0
  105. package/src/feed/event-handlers/notification-feed/handle-notification-feed-updated.ts +68 -2
  106. package/src/feed/event-handlers/story-feeds/handle-story-feeds-updated.ts +1 -1
  107. package/src/feed/feed.ts +79 -26
  108. package/src/feeds-client/apply-new-activity-to-active-feeds.ts +9 -0
  109. package/src/feeds-client/feeds-client.ts +301 -28
  110. package/src/gen/feeds/FeedsApi.ts +79 -12
  111. package/src/gen/model-decoders/decoders.ts +7 -0
  112. package/src/gen/models/index.ts +66 -4
  113. package/src/index.ts +1 -0
  114. package/src/types.ts +17 -0
  115. package/src/utils/state-update-queue.ts +42 -28
  116. package/src/utils/unique-array-merge.ts +11 -3
  117. package/dist/feeds-client-B4zeBggL.js.map +0 -1
  118. package/dist/feeds-client-DeAqnd1a.mjs.map +0 -1
  119. package/dist/types/feed/event-handlers/activity/handle-activity-marked.d.ts +0 -12
  120. package/dist/types/feed/event-handlers/activity/handle-activity-marked.d.ts.map +0 -1
  121. package/src/feed/event-handlers/activity/handle-activity-marked.ts +0 -68
@@ -1,7 +1,13 @@
1
1
  import { FeedsApi } from '../gen/feeds/FeedsApi';
2
2
  import type {
3
- ActivityAddedEvent,
3
+ AcceptFeedMemberInviteResponse,
4
+ ActivityFeedbackRequest,
5
+ ActivityFeedbackResponse,
4
6
  ActivityResponse,
7
+ AddActivityRequest,
8
+ AddActivityResponse,
9
+ AddBookmarkRequest,
10
+ AddBookmarkResponse,
5
11
  AddCommentReactionRequest,
6
12
  AddCommentReactionResponse,
7
13
  AddCommentRequest,
@@ -10,8 +16,11 @@ import type {
10
16
  CastPollVoteRequest,
11
17
  CreateGuestResponse,
12
18
  DeleteActivityReactionResponse,
19
+ DeleteActivityResponse,
20
+ DeleteBookmarkResponse,
13
21
  DeleteCommentReactionResponse,
14
22
  DeleteCommentResponse,
23
+ DeleteFeedResponse,
15
24
  FeedResponse,
16
25
  FileUploadRequest,
17
26
  FollowBatchRequest,
@@ -22,16 +31,24 @@ import type {
22
31
  ImageSize,
23
32
  ImageUploadRequest,
24
33
  OwnBatchRequest,
34
+ PinActivityResponse,
25
35
  PollResponse,
26
36
  PollVoteResponse,
27
37
  PollVotesResponse,
28
38
  QueryFeedsRequest,
29
39
  QueryPollVotesRequest,
40
+ RejectFeedMemberInviteResponse,
30
41
  UnfollowBatchRequest,
42
+ UnpinActivityResponse,
43
+ UpdateActivityPartialResponse,
31
44
  UpdateActivityRequest,
32
45
  UpdateActivityResponse,
46
+ UpdateBookmarkRequest,
47
+ UpdateBookmarkResponse,
33
48
  UpdateCommentRequest,
34
49
  UpdateCommentResponse,
50
+ UpdateFeedMembersResponse,
51
+ UpdateFeedResponse,
35
52
  UpdateFollowRequest,
36
53
  UpdatePollPartialRequest,
37
54
  UpdatePollRequest,
@@ -41,6 +58,7 @@ import type {
41
58
  import type {
42
59
  ConnectedUser,
43
60
  FeedsEvent,
61
+ OnNewActivityCallback,
44
62
  StreamFile,
45
63
  TokenOrProvider,
46
64
  } from '../types';
@@ -66,22 +84,34 @@ import { StreamPoll } from '../common/Poll';
66
84
  import {
67
85
  Feed,
68
86
  type FeedState,
87
+ handleActivityDeleted,
69
88
  handleActivityReactionAdded,
70
89
  handleActivityReactionDeleted,
71
90
  handleActivityReactionUpdated,
72
91
  handleActivityUpdated,
92
+ handleActivityPinned,
93
+ handleActivityUnpinned,
94
+ handleBookmarkAdded,
95
+ handleBookmarkDeleted,
96
+ handleBookmarkUpdated,
73
97
  handleCommentAdded,
74
98
  handleCommentDeleted,
75
99
  handleCommentReactionAdded,
76
100
  handleCommentReactionDeleted,
77
101
  handleCommentUpdated,
102
+ handleFeedDeleted,
103
+ handleFeedMemberAdded,
104
+ handleFeedMemberRemoved,
105
+ handleFeedMemberUpdated,
78
106
  handleFeedUpdated,
79
107
  handleFollowCreated,
80
108
  handleFollowDeleted,
81
109
  handleFollowUpdated,
82
110
  handleWatchStarted,
83
111
  handleWatchStopped,
112
+ updateActivityFromFeedback,
84
113
  } from '../feed';
114
+ import { applyNewActivityToActiveFeeds } from './apply-new-activity-to-active-feeds';
85
115
  import { handleUserUpdated } from './event-handlers';
86
116
  import {
87
117
  type SyncFailure,
@@ -561,6 +591,66 @@ export class FeedsClient extends FeedsApi {
561
591
  return response;
562
592
  };
563
593
 
594
+ updateActivityPartial = async (
595
+ ...args: Parameters<FeedsApi['updateActivityPartial']>
596
+ ): Promise<StreamResponse<UpdateActivityPartialResponse>> => {
597
+ const response = await super.updateActivityPartial(...args);
598
+ for (const feed of this.allActiveFeeds) {
599
+ handleActivityUpdated.bind(feed)(response, false);
600
+ }
601
+ return response;
602
+ };
603
+
604
+ deleteActivity = async (
605
+ ...args: Parameters<FeedsApi['deleteActivity']>
606
+ ): Promise<StreamResponse<DeleteActivityResponse>> => {
607
+ const response = await super.deleteActivity(...args);
608
+ const activityId = args[0].id;
609
+ for (const feed of this.allActiveFeeds) {
610
+ handleActivityDeleted.bind(feed)(
611
+ { activity: { id: activityId } } as Parameters<
612
+ typeof handleActivityDeleted
613
+ >[0],
614
+ false,
615
+ );
616
+ }
617
+ this.activeActivities = this.activeActivities.filter(
618
+ (activity) => activity.id !== activityId,
619
+ );
620
+ return response;
621
+ };
622
+
623
+ activityFeedback = async (
624
+ request: ActivityFeedbackRequest & { activity_id: string },
625
+ ): Promise<StreamResponse<ActivityFeedbackResponse>> => {
626
+ const response = await super.activityFeedback(request);
627
+ if (request.hide !== undefined) {
628
+ const feedback = {
629
+ activity_id: request.activity_id,
630
+ action: 'hide' as const,
631
+ value: request.hide ? 'true' : 'false',
632
+ };
633
+ for (const feed of this.allActiveFeeds) {
634
+ const {
635
+ activities: currentActivities,
636
+ pinned_activities: currentPinnedActivities,
637
+ } = feed.currentState;
638
+ const [result1, result2] = [
639
+ updateActivityFromFeedback(feedback, currentActivities),
640
+ updateActivityFromFeedback(feedback, currentPinnedActivities),
641
+ ];
642
+
643
+ if (result1.changed || result2.changed) {
644
+ feed.state.partialNext({
645
+ activities: result1.entities,
646
+ pinned_activities: result2.entities,
647
+ });
648
+ }
649
+ }
650
+ }
651
+ return response;
652
+ };
653
+
564
654
  addComment = async (
565
655
  request: AddCommentRequest,
566
656
  ): Promise<StreamResponse<AddCommentResponse>> => {
@@ -614,6 +704,19 @@ export class FeedsClient extends FeedsApi {
614
704
  return response;
615
705
  };
616
706
 
707
+ async addActivity(
708
+ request: AddActivityRequest,
709
+ ): Promise<StreamResponse<AddActivityResponse>> {
710
+ const response = await super.addActivity(request);
711
+ request.feeds.forEach((fid) => {
712
+ const feed = this.activeFeeds[fid];
713
+ if (feed) {
714
+ applyNewActivityToActiveFeeds.call(feed, response.activity);
715
+ }
716
+ });
717
+ return response;
718
+ }
719
+
617
720
  addActivityReaction = async (
618
721
  request: AddReactionRequest & {
619
722
  activity_id: string;
@@ -677,6 +780,160 @@ export class FeedsClient extends FeedsApi {
677
780
  return response;
678
781
  };
679
782
 
783
+ addBookmark = async (
784
+ request: AddBookmarkRequest & { activity_id: string },
785
+ ): Promise<StreamResponse<AddBookmarkResponse>> => {
786
+ const response = await super.addBookmark(request);
787
+ for (const feed of this.allActiveFeeds) {
788
+ handleBookmarkAdded.bind(feed)(response);
789
+ }
790
+ return response;
791
+ };
792
+
793
+ updateBookmark = async (
794
+ request: UpdateBookmarkRequest & { activity_id: string },
795
+ ): Promise<StreamResponse<UpdateBookmarkResponse>> => {
796
+ const response = await super.updateBookmark(request);
797
+ for (const feed of this.allActiveFeeds) {
798
+ handleBookmarkUpdated.bind(feed)(response);
799
+ }
800
+ return response;
801
+ };
802
+
803
+ deleteBookmark = async (request: {
804
+ activity_id: string;
805
+ folder_id?: string;
806
+ }): Promise<StreamResponse<DeleteBookmarkResponse>> => {
807
+ const response = await super.deleteBookmark(request);
808
+ for (const feed of this.allActiveFeeds) {
809
+ handleBookmarkDeleted.bind(feed)(response);
810
+ }
811
+ return response;
812
+ };
813
+
814
+ pinActivity = async (
815
+ ...args: Parameters<FeedsApi['pinActivity']>
816
+ ): Promise<StreamResponse<PinActivityResponse>> => {
817
+ const response = await super.pinActivity(...args);
818
+ const feedIds =
819
+ response.activity?.feeds ?? (response.feed ? [response.feed] : []);
820
+ for (const fid of feedIds) {
821
+ const feed = this.activeFeeds[fid];
822
+ if (feed) {
823
+ handleActivityPinned.bind(feed)(
824
+ { pinned_activity: response } as Parameters<
825
+ typeof handleActivityPinned
826
+ >[0],
827
+ false,
828
+ );
829
+ }
830
+ }
831
+ return response;
832
+ };
833
+
834
+ unpinActivity = async (
835
+ ...args: Parameters<FeedsApi['unpinActivity']>
836
+ ): Promise<StreamResponse<UnpinActivityResponse>> => {
837
+ const response = await super.unpinActivity(...args);
838
+ const feedIds =
839
+ response.activity?.feeds ?? (response.feed ? [response.feed] : []);
840
+ for (const fid of feedIds) {
841
+ const feed = this.activeFeeds[fid];
842
+ if (feed) {
843
+ handleActivityUnpinned.bind(feed)(
844
+ {
845
+ pinned_activity: {
846
+ ...response,
847
+ created_at: new Date(),
848
+ },
849
+ } as Parameters<typeof handleActivityUnpinned>[0],
850
+ false,
851
+ );
852
+ }
853
+ }
854
+ return response;
855
+ };
856
+
857
+ updateFeed = async (
858
+ ...args: Parameters<FeedsApi['updateFeed']>
859
+ ): Promise<StreamResponse<UpdateFeedResponse>> => {
860
+ const response = await super.updateFeed(...args);
861
+ const fid = `${args[0].feed_group_id}:${args[0].feed_id}`;
862
+ const feed = this.activeFeeds[fid];
863
+ if (feed) {
864
+ handleFeedUpdated.call(feed, { feed: response.feed } as Parameters<
865
+ typeof handleFeedUpdated
866
+ >[0]);
867
+ }
868
+ return response;
869
+ };
870
+
871
+ deleteFeed = async (
872
+ ...args: Parameters<FeedsApi['deleteFeed']>
873
+ ): Promise<StreamResponse<DeleteFeedResponse>> => {
874
+ const response = await super.deleteFeed(...args);
875
+ const fid = `${args[0].feed_group_id}:${args[0].feed_id}`;
876
+ const feed = this.activeFeeds[fid];
877
+ if (feed) {
878
+ handleFeedDeleted.call(feed, {
879
+ created_at: new Date(),
880
+ } as Parameters<typeof handleFeedDeleted>[0]);
881
+ // If the feed is not watched, clean up immediately (no WS event will follow).
882
+ // If watched, the WS handler will clean up after dispatching the event.
883
+ if (!feed.currentState.watch) {
884
+ delete this.activeFeeds[fid];
885
+ this.activeActivities = this.activeActivities.filter(
886
+ (activity) => getFeed.call(activity)?.feed !== fid,
887
+ );
888
+ }
889
+ }
890
+ return response;
891
+ };
892
+
893
+ updateFeedMembers = async (
894
+ ...args: Parameters<FeedsApi['updateFeedMembers']>
895
+ ): Promise<StreamResponse<UpdateFeedMembersResponse>> => {
896
+ const response = await super.updateFeedMembers(...args);
897
+ const fid = `${args[0].feed_group_id}:${args[0].feed_id}`;
898
+ const feed = this.activeFeeds[fid];
899
+ if (feed) {
900
+ for (const member of response.added) {
901
+ handleFeedMemberAdded.call(feed, { member }, false);
902
+ }
903
+ for (const member of response.updated) {
904
+ handleFeedMemberUpdated.call(feed, { member }, false);
905
+ }
906
+ for (const memberId of response.removed_ids) {
907
+ handleFeedMemberRemoved.call(feed, { member_id: memberId }, false);
908
+ }
909
+ }
910
+ return response;
911
+ };
912
+
913
+ acceptFeedMemberInvite = async (
914
+ ...args: Parameters<FeedsApi['acceptFeedMemberInvite']>
915
+ ): Promise<StreamResponse<AcceptFeedMemberInviteResponse>> => {
916
+ const response = await super.acceptFeedMemberInvite(...args);
917
+ const fid = `${args[0].feed_group_id}:${args[0].feed_id}`;
918
+ const feed = this.activeFeeds[fid];
919
+ if (feed) {
920
+ handleFeedMemberUpdated.call(feed, { member: response.member }, false);
921
+ }
922
+ return response;
923
+ };
924
+
925
+ rejectFeedMemberInvite = async (
926
+ ...args: Parameters<FeedsApi['rejectFeedMemberInvite']>
927
+ ): Promise<StreamResponse<RejectFeedMemberInviteResponse>> => {
928
+ const response = await super.rejectFeedMemberInvite(...args);
929
+ const fid = `${args[0].feed_group_id}:${args[0].feed_id}`;
930
+ const feed = this.activeFeeds[fid];
931
+ if (feed) {
932
+ handleFeedMemberUpdated.call(feed, { member: response.member }, false);
933
+ }
934
+ return response;
935
+ };
936
+
680
937
  queryPollAnswers = async (
681
938
  request: QueryPollVotesRequest & { poll_id: string; user_id?: string },
682
939
  ): Promise<StreamResponse<PollVotesResponse>> => {
@@ -737,16 +994,14 @@ export class FeedsClient extends FeedsApi {
737
994
  * @param groupId for example `user`, `notification` or id of a custom feed group
738
995
  * @param id
739
996
  * @param options
740
- * @param options.addNewActivitiesTo - when a new activity is received from a WebSocket event by default it's added to the start of the list. You can change this to `end` to add it to the end of the list. Useful for story feeds.
741
- * @param options.activityAddedEventFilter - a callback that is called when a new activity is received from a WebSocket event. You can use this to prevent the activity from being added to the feed. Useful for feed filtering, or if you don't want new activities to be added to the feed.
997
+ * @param options.onNewActivity - callback to control how new activities (WS or addActivity response) are added: 'add-to-start', 'add-to-end', or 'ignore'.
742
998
  * @returns
743
999
  */
744
1000
  feed = (
745
1001
  groupId: string,
746
1002
  id: string,
747
1003
  options?: {
748
- addNewActivitiesTo?: 'start' | 'end';
749
- activityAddedEventFilter?: (event: ActivityAddedEvent) => boolean;
1004
+ onNewActivity?: OnNewActivityCallback;
750
1005
  },
751
1006
  ) => {
752
1007
  return this.getOrCreateActiveFeed({
@@ -787,12 +1042,14 @@ export class FeedsClient extends FeedsApi {
787
1042
  id: feedResponse.id,
788
1043
  data: feedResponse,
789
1044
  watch: request?.watch,
790
- fieldsToUpdate: [
791
- 'own_capabilities',
792
- 'own_follows',
793
- 'own_membership',
794
- 'own_followings',
795
- ],
1045
+ fieldsToUpdate: request?.enrich_own_fields
1046
+ ? [
1047
+ 'own_capabilities',
1048
+ 'own_follows',
1049
+ 'own_membership',
1050
+ 'own_followings',
1051
+ ]
1052
+ : [],
796
1053
  }),
797
1054
  );
798
1055
 
@@ -840,10 +1097,24 @@ export class FeedsClient extends FeedsApi {
840
1097
  return response;
841
1098
  }
842
1099
 
1100
+ async acceptFollow(...args: Parameters<FeedsApi['acceptFollow']>) {
1101
+ const response = await super.acceptFollow(...args);
1102
+
1103
+ [
1104
+ response.follow.source_feed.feed,
1105
+ response.follow.target_feed.feed,
1106
+ ].forEach((fid) => {
1107
+ const feeds = this.findAllActiveFeedsByFid(fid);
1108
+ feeds.forEach((f) => handleFollowUpdated.bind(f)(response, false));
1109
+ });
1110
+
1111
+ return response;
1112
+ }
1113
+
843
1114
  // For follow API endpoints we update the state after HTTP response to allow queryFeeds with watch: false
844
1115
  async follow(request: FollowRequest) {
845
1116
  const response = await super.follow(request);
846
- this.updateStateFromFollows([response.follow]);
1117
+ this.updateStateFromFollows([response.follow], !!request.enrich_own_fields);
847
1118
 
848
1119
  return response;
849
1120
  }
@@ -855,7 +1126,7 @@ export class FeedsClient extends FeedsApi {
855
1126
  */
856
1127
  async followBatch(request: FollowBatchRequest) {
857
1128
  const response = await super.followBatch(request);
858
- this.updateStateFromFollows(response.follows);
1129
+ this.updateStateFromFollows(response.follows, !!request.enrich_own_fields);
859
1130
 
860
1131
  return response;
861
1132
  }
@@ -863,12 +1134,16 @@ export class FeedsClient extends FeedsApi {
863
1134
  async getOrCreateFollows(request: FollowBatchRequest) {
864
1135
  const response = await super.getOrCreateFollows(request);
865
1136
 
866
- this.updateStateFromFollows(response.created);
1137
+ this.updateStateFromFollows(response.created, !!request.enrich_own_fields);
867
1138
 
868
1139
  return response;
869
1140
  }
870
1141
 
871
- async unfollow(request: { source: string; target: string, enrich_own_fields?: boolean }) {
1142
+ async unfollow(request: {
1143
+ source: string;
1144
+ target: string;
1145
+ enrich_own_fields?: boolean;
1146
+ }) {
872
1147
  const response = await super.unfollow(request);
873
1148
  this.updateStateFromUnfollows([response.follow]);
874
1149
 
@@ -951,8 +1226,7 @@ export class FeedsClient extends FeedsApi {
951
1226
  data?: FeedResponse;
952
1227
  watch?: boolean;
953
1228
  options?: {
954
- addNewActivitiesTo?: 'start' | 'end';
955
- activityAddedEventFilter?: (event: ActivityAddedEvent) => boolean;
1229
+ onNewActivity?: OnNewActivityCallback;
956
1230
  };
957
1231
  fieldsToUpdate: Array<
958
1232
  'own_capabilities' | 'own_follows' | 'own_followings' | 'own_membership'
@@ -969,20 +1243,14 @@ export class FeedsClient extends FeedsApi {
969
1243
  id,
970
1244
  data,
971
1245
  watch,
972
- options?.addNewActivitiesTo,
973
- options?.activityAddedEventFilter,
1246
+ options?.onNewActivity,
974
1247
  );
975
1248
  }
976
1249
 
977
1250
  const feed = this.activeFeeds[fid];
978
1251
 
979
- if (!isCreated && options) {
980
- if (options?.addNewActivitiesTo) {
981
- feed.addNewActivitiesTo = options.addNewActivitiesTo;
982
- }
983
- if (options?.activityAddedEventFilter) {
984
- feed.activityAddedEventFilter = options.activityAddedEventFilter;
985
- }
1252
+ if (!isCreated && options?.onNewActivity !== undefined) {
1253
+ feed.onNewActivity = options.onNewActivity;
986
1254
  }
987
1255
 
988
1256
  if (!feed.currentState.watch) {
@@ -1097,13 +1365,18 @@ export class FeedsClient extends FeedsApi {
1097
1365
  ];
1098
1366
  }
1099
1367
 
1100
- private updateStateFromFollows(follows: FollowResponse[]) {
1368
+ private updateStateFromFollows(
1369
+ follows: FollowResponse[],
1370
+ hasOwnFields: boolean,
1371
+ ) {
1101
1372
  follows.forEach((follow) => {
1102
1373
  const feeds = [
1103
1374
  ...this.findAllActiveFeedsByFid(follow.source_feed.feed),
1104
1375
  ...this.findAllActiveFeedsByFid(follow.target_feed.feed),
1105
1376
  ];
1106
- feeds.forEach((f) => handleFollowCreated.bind(f)({ follow }, false));
1377
+ feeds.forEach((f) =>
1378
+ handleFollowCreated.bind(f)({ follow }, false, hasOwnFields),
1379
+ );
1107
1380
  });
1108
1381
  }
1109
1382
 
@@ -84,6 +84,8 @@ import type {
84
84
  QueryBookmarkFoldersResponse,
85
85
  QueryBookmarksRequest,
86
86
  QueryBookmarksResponse,
87
+ QueryCollectionsRequest,
88
+ QueryCollectionsResponse,
87
89
  QueryCommentReactionsRequest,
88
90
  QueryCommentReactionsResponse,
89
91
  QueryCommentsRequest,
@@ -106,6 +108,7 @@ import type {
106
108
  RejectFeedMemberInviteResponse,
107
109
  RejectFollowRequest,
108
110
  RejectFollowResponse,
111
+ RemoveUserGroupMembersRequest,
109
112
  RemoveUserGroupMembersResponse,
110
113
  Response,
111
114
  RestoreActivityRequest,
@@ -114,6 +117,8 @@ import type {
114
117
  SharedLocationResponse,
115
118
  SharedLocationsResponse,
116
119
  SingleFollowResponse,
120
+ TrackActivityMetricsRequest,
121
+ TrackActivityMetricsResponse,
117
122
  UnblockUsersRequest,
118
123
  UnblockUsersResponse,
119
124
  UnfollowBatchRequest,
@@ -413,6 +418,29 @@ export class FeedsApi {
413
418
  return { ...response.body, metadata: response.metadata };
414
419
  }
415
420
 
421
+ async trackActivityMetrics(
422
+ request: TrackActivityMetricsRequest,
423
+ ): Promise<StreamResponse<TrackActivityMetricsResponse>> {
424
+ const body = {
425
+ events: request?.events,
426
+ };
427
+
428
+ const response = await this.apiClient.sendRequest<
429
+ StreamResponse<TrackActivityMetricsResponse>
430
+ >(
431
+ 'POST',
432
+ '/api/v2/feeds/activities/metrics/track',
433
+ undefined,
434
+ undefined,
435
+ body,
436
+ 'application/json',
437
+ );
438
+
439
+ decoders.TrackActivityMetricsResponse?.(response.body);
440
+
441
+ return { ...response.body, metadata: response.metadata };
442
+ }
443
+
416
444
  async queryActivities(
417
445
  request?: QueryActivitiesRequest,
418
446
  ): Promise<StreamResponse<QueryActivitiesResponse>> {
@@ -1020,6 +1048,33 @@ export class FeedsApi {
1020
1048
  return { ...response.body, metadata: response.metadata };
1021
1049
  }
1022
1050
 
1051
+ async queryCollections(
1052
+ request?: QueryCollectionsRequest,
1053
+ ): Promise<StreamResponse<QueryCollectionsResponse>> {
1054
+ const body = {
1055
+ limit: request?.limit,
1056
+ next: request?.next,
1057
+ prev: request?.prev,
1058
+ sort: request?.sort,
1059
+ filter: request?.filter,
1060
+ };
1061
+
1062
+ const response = await this.apiClient.sendRequest<
1063
+ StreamResponse<QueryCollectionsResponse>
1064
+ >(
1065
+ 'POST',
1066
+ '/api/v2/feeds/collections/query',
1067
+ undefined,
1068
+ undefined,
1069
+ body,
1070
+ 'application/json',
1071
+ );
1072
+
1073
+ decoders.QueryCollectionsResponse?.(response.body);
1074
+
1075
+ return { ...response.body, metadata: response.metadata };
1076
+ }
1077
+
1023
1078
  async getComments(request: {
1024
1079
  object_id: string;
1025
1080
  object_type: string;
@@ -1112,6 +1167,7 @@ export class FeedsApi {
1112
1167
  ): Promise<StreamResponse<QueryCommentsResponse>> {
1113
1168
  const body = {
1114
1169
  filter: request?.filter,
1170
+ id_around: request?.id_around,
1115
1171
  limit: request?.limit,
1116
1172
  next: request?.next,
1117
1173
  prev: request?.prev,
@@ -2649,25 +2705,36 @@ export class FeedsApi {
2649
2705
  return { ...response.body, metadata: response.metadata };
2650
2706
  }
2651
2707
 
2652
- async removeUserGroupMembers(request: {
2653
- id: string;
2654
- }): Promise<StreamResponse<RemoveUserGroupMembersResponse>> {
2708
+ async addUserGroupMembers(
2709
+ request: AddUserGroupMembersRequest & { id: string },
2710
+ ): Promise<StreamResponse<AddUserGroupMembersResponse>> {
2655
2711
  const pathParams = {
2656
2712
  id: request?.id,
2657
2713
  };
2714
+ const body = {
2715
+ member_ids: request?.member_ids,
2716
+ team_id: request?.team_id,
2717
+ };
2658
2718
 
2659
2719
  const response = await this.apiClient.sendRequest<
2660
- StreamResponse<RemoveUserGroupMembersResponse>
2661
- >('DELETE', '/api/v2/usergroups/{id}/members', pathParams, undefined);
2720
+ StreamResponse<AddUserGroupMembersResponse>
2721
+ >(
2722
+ 'POST',
2723
+ '/api/v2/usergroups/{id}/members',
2724
+ pathParams,
2725
+ undefined,
2726
+ body,
2727
+ 'application/json',
2728
+ );
2662
2729
 
2663
- decoders.RemoveUserGroupMembersResponse?.(response.body);
2730
+ decoders.AddUserGroupMembersResponse?.(response.body);
2664
2731
 
2665
2732
  return { ...response.body, metadata: response.metadata };
2666
2733
  }
2667
2734
 
2668
- async addUserGroupMembers(
2669
- request: AddUserGroupMembersRequest & { id: string },
2670
- ): Promise<StreamResponse<AddUserGroupMembersResponse>> {
2735
+ async removeUserGroupMembers(
2736
+ request: RemoveUserGroupMembersRequest & { id: string },
2737
+ ): Promise<StreamResponse<RemoveUserGroupMembersResponse>> {
2671
2738
  const pathParams = {
2672
2739
  id: request?.id,
2673
2740
  };
@@ -2677,17 +2744,17 @@ export class FeedsApi {
2677
2744
  };
2678
2745
 
2679
2746
  const response = await this.apiClient.sendRequest<
2680
- StreamResponse<AddUserGroupMembersResponse>
2747
+ StreamResponse<RemoveUserGroupMembersResponse>
2681
2748
  >(
2682
2749
  'POST',
2683
- '/api/v2/usergroups/{id}/members',
2750
+ '/api/v2/usergroups/{id}/members/delete',
2684
2751
  pathParams,
2685
2752
  undefined,
2686
2753
  body,
2687
2754
  'application/json',
2688
2755
  );
2689
2756
 
2690
- decoders.AddUserGroupMembersResponse?.(response.body);
2757
+ decoders.RemoveUserGroupMembersResponse?.(response.body);
2691
2758
 
2692
2759
  return { ...response.body, metadata: response.metadata };
2693
2760
  }
@@ -1554,6 +1554,13 @@ decoders.QueryBookmarksResponse = (input?: Record<string, any>) => {
1554
1554
  return decode(typeMappings, input);
1555
1555
  };
1556
1556
 
1557
+ decoders.QueryCollectionsResponse = (input?: Record<string, any>) => {
1558
+ const typeMappings: TypeMapping = {
1559
+ collections: { type: 'CollectionResponse', isSingle: false },
1560
+ };
1561
+ return decode(typeMappings, input);
1562
+ };
1563
+
1557
1564
  decoders.QueryCommentReactionsResponse = (input?: Record<string, any>) => {
1558
1565
  const typeMappings: TypeMapping = {
1559
1566
  reactions: { type: 'FeedsReactionResponse', isSingle: false },