@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.
- package/CHANGELOG.md +21 -0
- package/dist/cjs/index.js +2 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/react-bindings.js +5 -19
- package/dist/cjs/react-bindings.js.map +1 -1
- package/dist/es/index.mjs +15 -14
- package/dist/es/index.mjs.map +1 -1
- package/dist/es/react-bindings.mjs +5 -19
- package/dist/es/react-bindings.mjs.map +1 -1
- package/dist/{feeds-client-B4zeBggL.js → feeds-client-C1c6lcS3.js} +705 -214
- package/dist/feeds-client-C1c6lcS3.js.map +1 -0
- package/dist/{feeds-client-DeAqnd1a.mjs → feeds-client-jtUTE4AC.mjs} +711 -220
- package/dist/feeds-client-jtUTE4AC.mjs.map +1 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/dist/types/activity-with-state-updates/activity-with-state-updates.d.ts.map +1 -1
- package/dist/types/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivityRead.d.ts +6 -2
- package/dist/types/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivityRead.d.ts.map +1 -1
- package/dist/types/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivitySeen.d.ts +6 -2
- package/dist/types/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivitySeen.d.ts.map +1 -1
- package/dist/types/feed/activity-filter.d.ts +11 -0
- package/dist/types/feed/activity-filter.d.ts.map +1 -0
- package/dist/types/feed/event-handlers/activity/handle-activity-added.d.ts +3 -2
- package/dist/types/feed/event-handlers/activity/handle-activity-added.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/activity/handle-activity-deleted.d.ts +3 -2
- package/dist/types/feed/event-handlers/activity/handle-activity-deleted.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/activity/handle-activity-feedback.d.ts +5 -0
- package/dist/types/feed/event-handlers/activity/handle-activity-feedback.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/activity/handle-activity-pinned.d.ts +3 -2
- package/dist/types/feed/event-handlers/activity/handle-activity-pinned.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/activity/handle-activity-unpinned.d.ts +3 -2
- package/dist/types/feed/event-handlers/activity/handle-activity-unpinned.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/activity/handle-activity-updated.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/activity/index.d.ts +3 -1
- package/dist/types/feed/event-handlers/activity/index.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/activity-updater.d.ts +1 -0
- package/dist/types/feed/event-handlers/activity-updater.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/add-aggregated-activities-to-state.d.ts +1 -1
- package/dist/types/feed/event-handlers/add-aggregated-activities-to-state.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/bookmark/handle-bookmark-added.d.ts +6 -5
- package/dist/types/feed/event-handlers/bookmark/handle-bookmark-added.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/bookmark/handle-bookmark-deleted.d.ts +6 -5
- package/dist/types/feed/event-handlers/bookmark/handle-bookmark-deleted.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/bookmark/handle-bookmark-updated.d.ts +6 -5
- package/dist/types/feed/event-handlers/bookmark/handle-bookmark-updated.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/comment/handle-comment-updated.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/feed/handle-feed-deleted.d.ts +4 -0
- package/dist/types/feed/event-handlers/feed/handle-feed-deleted.d.ts.map +1 -0
- package/dist/types/feed/event-handlers/feed/handle-feed-updated.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/feed/index.d.ts +1 -0
- package/dist/types/feed/event-handlers/feed/index.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/feed-member/handle-feed-member-added.d.ts +3 -2
- package/dist/types/feed/event-handlers/feed-member/handle-feed-member-added.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/feed-member/handle-feed-member-removed.d.ts +3 -2
- package/dist/types/feed/event-handlers/feed-member/handle-feed-member-removed.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/feed-member/handle-feed-member-updated.d.ts +3 -2
- package/dist/types/feed/event-handlers/feed-member/handle-feed-member-updated.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/follow/handle-follow-created.d.ts +2 -2
- package/dist/types/feed/event-handlers/follow/handle-follow-created.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/follow/handle-follow-updated.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/notification-feed/handle-notification-feed-updated.d.ts +3 -2
- package/dist/types/feed/event-handlers/notification-feed/handle-notification-feed-updated.d.ts.map +1 -1
- package/dist/types/feed/feed.d.ts +17 -12
- package/dist/types/feed/feed.d.ts.map +1 -1
- package/dist/types/feeds-client/apply-new-activity-to-active-feeds.d.ts +4 -0
- package/dist/types/feeds-client/apply-new-activity-to-active-feeds.d.ts.map +1 -0
- package/dist/types/feeds-client/feeds-client.d.ts +29 -8
- package/dist/types/feeds-client/feeds-client.d.ts.map +1 -1
- package/dist/types/gen/feeds/FeedsApi.d.ts +6 -4
- package/dist/types/gen/feeds/FeedsApi.d.ts.map +1 -1
- package/dist/types/gen/models/index.d.ts +40 -2
- package/dist/types/gen/models/index.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/types.d.ts +15 -0
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/utils/state-update-queue.d.ts +11 -2
- package/dist/types/utils/state-update-queue.d.ts.map +1 -1
- package/dist/types/utils/unique-array-merge.d.ts +1 -1
- package/dist/types/utils/unique-array-merge.d.ts.map +1 -1
- package/package.json +2 -1
- package/src/activity-with-state-updates/activity-with-state-updates.ts +8 -2
- package/src/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivityRead.ts +6 -20
- package/src/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivitySeen.ts +6 -20
- package/src/feed/activity-filter.ts +44 -0
- package/src/feed/event-handlers/activity/handle-activity-added.ts +22 -8
- package/src/feed/event-handlers/activity/handle-activity-deleted.ts +28 -2
- package/src/feed/event-handlers/activity/handle-activity-feedback.ts +17 -7
- package/src/feed/event-handlers/activity/handle-activity-pinned.ts +25 -3
- package/src/feed/event-handlers/activity/handle-activity-unpinned.ts +25 -2
- package/src/feed/event-handlers/activity/handle-activity-updated.ts +5 -1
- package/src/feed/event-handlers/activity/index.ts +3 -1
- package/src/feed/event-handlers/add-aggregated-activities-to-state.ts +11 -2
- package/src/feed/event-handlers/bookmark/handle-bookmark-added.ts +20 -11
- package/src/feed/event-handlers/bookmark/handle-bookmark-deleted.ts +21 -11
- package/src/feed/event-handlers/bookmark/handle-bookmark-updated.ts +24 -10
- package/src/feed/event-handlers/comment/handle-comment-updated.ts +11 -10
- package/src/feed/event-handlers/feed/handle-feed-deleted.ts +12 -0
- package/src/feed/event-handlers/feed/handle-feed-updated.ts +8 -0
- package/src/feed/event-handlers/feed/index.ts +1 -0
- package/src/feed/event-handlers/feed-member/handle-feed-member-added.ts +25 -2
- package/src/feed/event-handlers/feed-member/handle-feed-member-removed.ts +25 -2
- package/src/feed/event-handlers/feed-member/handle-feed-member-updated.ts +25 -2
- package/src/feed/event-handlers/follow/handle-follow-created.ts +18 -1
- package/src/feed/event-handlers/follow/handle-follow-updated.ts +14 -0
- package/src/feed/event-handlers/notification-feed/handle-notification-feed-updated.ts +68 -2
- package/src/feed/event-handlers/story-feeds/handle-story-feeds-updated.ts +1 -1
- package/src/feed/feed.ts +79 -26
- package/src/feeds-client/apply-new-activity-to-active-feeds.ts +9 -0
- package/src/feeds-client/feeds-client.ts +301 -28
- package/src/gen/feeds/FeedsApi.ts +79 -12
- package/src/gen/model-decoders/decoders.ts +7 -0
- package/src/gen/models/index.ts +66 -4
- package/src/index.ts +1 -0
- package/src/types.ts +17 -0
- package/src/utils/state-update-queue.ts +42 -28
- package/src/utils/unique-array-merge.ts +11 -3
- package/dist/feeds-client-B4zeBggL.js.map +0 -1
- package/dist/feeds-client-DeAqnd1a.mjs.map +0 -1
- package/dist/types/feed/event-handlers/activity/handle-activity-marked.d.ts +0 -12
- package/dist/types/feed/event-handlers/activity/handle-activity-marked.d.ts.map +0 -1
- 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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
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: {
|
|
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
|
-
|
|
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?.
|
|
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
|
-
|
|
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(
|
|
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) =>
|
|
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
|
|
2653
|
-
id: string
|
|
2654
|
-
|
|
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<
|
|
2661
|
-
>(
|
|
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.
|
|
2730
|
+
decoders.AddUserGroupMembersResponse?.(response.body);
|
|
2664
2731
|
|
|
2665
2732
|
return { ...response.body, metadata: response.metadata };
|
|
2666
2733
|
}
|
|
2667
2734
|
|
|
2668
|
-
async
|
|
2669
|
-
request:
|
|
2670
|
-
): Promise<StreamResponse<
|
|
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<
|
|
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.
|
|
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 },
|