@stream-io/feeds-client 0.2.18 → 0.2.19
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 +16 -0
- package/dist/cjs/index.js +94 -25
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/react-bindings.js +26 -55
- package/dist/cjs/react-bindings.js.map +1 -1
- package/dist/es/index.mjs +86 -17
- package/dist/es/index.mjs.map +1 -1
- package/dist/es/react-bindings.mjs +19 -48
- package/dist/es/react-bindings.mjs.map +1 -1
- package/dist/{index--koeDtxd.js → feeds-client-C09giTf1.js} +177 -79
- package/dist/feeds-client-C09giTf1.js.map +1 -0
- package/dist/{index-Zde8UE5f.mjs → feeds-client-CFadXO-B.mjs} +190 -92
- package/dist/feeds-client-CFadXO-B.mjs.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/bindings/react/hooks/feed-state-hooks/useOwnCapabilities.d.ts +2 -32
- package/dist/types/bindings/react/hooks/feed-state-hooks/useOwnCapabilities.d.ts.map +1 -1
- package/dist/types/common/real-time/event-models.d.ts +7 -2
- package/dist/types/common/real-time/event-models.d.ts.map +1 -1
- package/dist/types/common/types.d.ts +1 -0
- package/dist/types/common/types.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/activity/handle-activity-added.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/activity/handle-activity-updated.d.ts.map +1 -1
- package/dist/types/feed/feed.d.ts +1 -1
- package/dist/types/feed/feed.d.ts.map +1 -1
- package/dist/types/feeds-client/feeds-client.d.ts +9 -1
- package/dist/types/feeds-client/feeds-client.d.ts.map +1 -1
- package/dist/types/utils/throttling/index.d.ts +3 -0
- package/dist/types/utils/throttling/index.d.ts.map +1 -0
- package/dist/types/utils/throttling/throttle.d.ts +34 -0
- package/dist/types/utils/throttling/throttle.d.ts.map +1 -0
- package/dist/types/utils/throttling/throttled-get-batched-own-capabilities.d.ts +14 -0
- package/dist/types/utils/throttling/throttled-get-batched-own-capabilities.d.ts.map +1 -0
- package/package.json +7 -3
- package/react-bindings.d.ts +11 -0
- package/react-bindings.js +7 -0
- package/react-bindings.mjs +11 -0
- package/src/bindings/react/hooks/feed-state-hooks/useOwnCapabilities.ts +21 -73
- package/src/common/real-time/event-models.ts +8 -2
- package/src/common/types.ts +1 -0
- package/src/feed/event-handlers/activity/handle-activity-added.ts +9 -1
- package/src/feed/event-handlers/activity/handle-activity-updated.ts +4 -0
- package/src/feed/feed.ts +18 -3
- package/src/feeds-client/feeds-client.ts +106 -3
- package/src/utils/throttling/index.ts +2 -0
- package/src/utils/throttling/throttle.ts +123 -0
- package/src/utils/throttling/throttled-get-batched-own-capabilities.ts +42 -0
- package/dist/index--koeDtxd.js.map +0 -1
- package/dist/index-Zde8UE5f.mjs.map +0 -1
- package/src/feed/event-handlers/activity/activity-marked-utils.test.ts +0 -208
- package/src/feed/event-handlers/activity/activity-reaction-utils.test.ts +0 -371
- package/src/feed/event-handlers/activity/handle-activity-added.test.ts +0 -97
- package/src/feed/event-handlers/activity/handle-activity-deleted.test.ts +0 -117
- package/src/feed/event-handlers/activity/handle-activity-pinned.test.ts +0 -60
- package/src/feed/event-handlers/activity/handle-activity-reaction-added.test.ts +0 -257
- package/src/feed/event-handlers/activity/handle-activity-reaction-deleted.test.ts +0 -317
- package/src/feed/event-handlers/activity/handle-activity-reaction-updated.test.ts +0 -282
- package/src/feed/event-handlers/activity/handle-activity-unpinned.test.ts +0 -95
- package/src/feed/event-handlers/activity/handle-activity-updated.test.ts +0 -245
- package/src/feed/event-handlers/add-aggregated-activities-to-state.test.ts +0 -510
- package/src/feed/event-handlers/bookmark/bookmark-utils.test.ts +0 -521
- package/src/feed/event-handlers/bookmark/handle-bookmark-added.test.ts +0 -178
- package/src/feed/event-handlers/bookmark/handle-bookmark-deleted.test.ts +0 -188
- package/src/feed/event-handlers/bookmark/handle-bookmark-updated.test.ts +0 -196
- package/src/feed/event-handlers/comment/handle-comment-added.test.ts +0 -271
- package/src/feed/event-handlers/comment/handle-comment-deleted.test.ts +0 -255
- package/src/feed/event-handlers/comment/handle-comment-reaction-added.test.ts +0 -329
- package/src/feed/event-handlers/comment/handle-comment-reaction-deleted.test.ts +0 -343
- package/src/feed/event-handlers/comment/handle-comment-reaction-updated.test.ts +0 -350
- package/src/feed/event-handlers/comment/handle-comment-updated.test.ts +0 -267
- package/src/feed/event-handlers/comment/utils/update-comment-count.test.ts +0 -322
- package/src/feed/event-handlers/feed-member/handle-feed-member-added.test.ts +0 -75
- package/src/feed/event-handlers/feed-member/handle-feed-member-removed.test.ts +0 -82
- package/src/feed/event-handlers/feed-member/handle-feed-member-updated.test.ts +0 -84
- package/src/feed/event-handlers/follow/follow-state-update-queue.test.ts +0 -219
- package/src/feed/event-handlers/follow/handle-follow-created.test.ts +0 -250
- package/src/feed/event-handlers/follow/handle-follow-deleted.test.ts +0 -268
- package/src/feed/event-handlers/follow/handle-follow-updated.test.ts +0 -131
- package/src/feed/event-handlers/notification-feed/handle-notification-feed-updated.test.ts +0 -182
- package/src/feed/event-handlers/story-feeds/handle-story-feeds-updated.test.ts +0 -45
- package/src/feed/feed.test.ts +0 -90
- package/src/feeds-client/event-handlers/user/handle-user-updated.test.ts +0 -53
- package/src/utils/event-triggered-by-connected-user.test.ts +0 -73
- package/src/utils/state-update-queue.test.ts +0 -129
- package/src/utils/unique-array-merge.test.ts +0 -179
|
@@ -1,245 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
-
import { Feed } from '../../../feed';
|
|
3
|
-
import { FeedsClient } from '../../../feeds-client';
|
|
4
|
-
import { handleActivityUpdated } from './handle-activity-updated';
|
|
5
|
-
import {
|
|
6
|
-
generateActivityPinResponse,
|
|
7
|
-
generateActivityResponse,
|
|
8
|
-
generateActivityUpdatedEvent,
|
|
9
|
-
generateBookmarkResponse,
|
|
10
|
-
generateFeedReactionResponse,
|
|
11
|
-
generateFeedResponse,
|
|
12
|
-
generateOwnUser,
|
|
13
|
-
generateUserResponseCommonFields,
|
|
14
|
-
getHumanId,
|
|
15
|
-
} from '../../../test-utils';
|
|
16
|
-
import type { EventPayload } from '../../../types-internal';
|
|
17
|
-
import { shouldUpdateState } from '../../../utils';
|
|
18
|
-
import type { ActivityResponse } from '../../../gen/models';
|
|
19
|
-
|
|
20
|
-
describe(handleActivityUpdated.name, () => {
|
|
21
|
-
let feed: Feed;
|
|
22
|
-
let client: FeedsClient;
|
|
23
|
-
let currentUserId: string;
|
|
24
|
-
|
|
25
|
-
beforeEach(() => {
|
|
26
|
-
client = new FeedsClient('mock-api-key');
|
|
27
|
-
currentUserId = getHumanId();
|
|
28
|
-
client.state.partialNext({
|
|
29
|
-
connected_user: generateOwnUser({ id: currentUserId }),
|
|
30
|
-
});
|
|
31
|
-
const feedResponse = generateFeedResponse({
|
|
32
|
-
id: 'main',
|
|
33
|
-
group_id: 'user',
|
|
34
|
-
created_by: { id: currentUserId },
|
|
35
|
-
});
|
|
36
|
-
feed = new Feed(
|
|
37
|
-
client,
|
|
38
|
-
feedResponse.group_id,
|
|
39
|
-
feedResponse.id,
|
|
40
|
-
feedResponse,
|
|
41
|
-
);
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
it('updates the correct activity in state when event matches, preserves own_reactions & own_bookmarks', () => {
|
|
45
|
-
const activity = generateActivityResponse({
|
|
46
|
-
id: 'activity-1',
|
|
47
|
-
text: 'original text',
|
|
48
|
-
own_reactions: [generateFeedReactionResponse()],
|
|
49
|
-
own_bookmarks: [generateBookmarkResponse()],
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
const activityPin = generateActivityPinResponse({
|
|
53
|
-
activity: { ...activity },
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
feed.state.partialNext({
|
|
57
|
-
activities: [activity],
|
|
58
|
-
pinned_activities: [activityPin],
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
const event = generateActivityUpdatedEvent({
|
|
62
|
-
activity: {
|
|
63
|
-
...activity,
|
|
64
|
-
text: 'updated text',
|
|
65
|
-
own_reactions: [],
|
|
66
|
-
own_bookmarks: [],
|
|
67
|
-
},
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
const stateBefore = feed.currentState;
|
|
71
|
-
|
|
72
|
-
handleActivityUpdated.call(feed, event);
|
|
73
|
-
|
|
74
|
-
const stateAfter = feed.currentState;
|
|
75
|
-
|
|
76
|
-
expect(stateAfter.activities![0]).toMatchObject({
|
|
77
|
-
id: 'activity-1',
|
|
78
|
-
text: 'updated text',
|
|
79
|
-
});
|
|
80
|
-
expect(stateAfter.pinned_activities![0].activity).toMatchObject({
|
|
81
|
-
id: 'activity-1',
|
|
82
|
-
text: 'updated text',
|
|
83
|
-
});
|
|
84
|
-
expect(stateAfter.activities![0].own_reactions).toBe(
|
|
85
|
-
stateBefore.activities![0].own_reactions,
|
|
86
|
-
);
|
|
87
|
-
expect(stateAfter.activities![0].own_bookmarks).toBe(
|
|
88
|
-
stateBefore.activities![0].own_bookmarks,
|
|
89
|
-
);
|
|
90
|
-
expect(stateAfter.pinned_activities![0].activity.own_reactions).toBe(
|
|
91
|
-
stateBefore.pinned_activities![0].activity.own_reactions,
|
|
92
|
-
);
|
|
93
|
-
expect(stateAfter.pinned_activities![0].activity.own_bookmarks).toBe(
|
|
94
|
-
stateBefore.pinned_activities![0].activity.own_bookmarks,
|
|
95
|
-
);
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
it('does nothing if activity is not found in activities or pinned_activities', () => {
|
|
99
|
-
const activity = generateActivityResponse({});
|
|
100
|
-
const activityPin = generateActivityPinResponse({
|
|
101
|
-
activity: { ...activity },
|
|
102
|
-
});
|
|
103
|
-
feed.state.partialNext({
|
|
104
|
-
activities: [activity],
|
|
105
|
-
pinned_activities: [activityPin],
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
const event = generateActivityUpdatedEvent({
|
|
109
|
-
activity: {
|
|
110
|
-
id: 'not-found-id',
|
|
111
|
-
},
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
const stateBefore = feed.currentState;
|
|
115
|
-
handleActivityUpdated.call(feed, event);
|
|
116
|
-
const stateAfter = feed.currentState;
|
|
117
|
-
expect(stateAfter).toBe(stateBefore);
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
describe(`Activity updated ${shouldUpdateState.name} integration`, () => {
|
|
121
|
-
const activityId = 'reacted-activity';
|
|
122
|
-
const updatedText = 'updated-text';
|
|
123
|
-
let existingActivity: ActivityResponse;
|
|
124
|
-
let currentUserPayload: EventPayload<'feeds.activity.updated'>;
|
|
125
|
-
|
|
126
|
-
beforeEach(() => {
|
|
127
|
-
existingActivity = generateActivityResponse({
|
|
128
|
-
id: activityId,
|
|
129
|
-
text: 'original-text',
|
|
130
|
-
});
|
|
131
|
-
currentUserPayload = generateActivityUpdatedEvent({
|
|
132
|
-
activity: { ...existingActivity, text: updatedText },
|
|
133
|
-
user: generateUserResponseCommonFields({ id: currentUserId }),
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
feed.state.partialNext({ activities: [existingActivity] });
|
|
137
|
-
feed.state.partialNext({ watch: true });
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
it(`skips update if ${shouldUpdateState.name} returns false`, () => {
|
|
141
|
-
// 1. HTTP and then WS
|
|
142
|
-
|
|
143
|
-
handleActivityUpdated.call(feed, currentUserPayload, false);
|
|
144
|
-
|
|
145
|
-
let stateBefore = feed.currentState;
|
|
146
|
-
|
|
147
|
-
handleActivityUpdated.call(feed, currentUserPayload);
|
|
148
|
-
|
|
149
|
-
let stateAfter = feed.currentState;
|
|
150
|
-
|
|
151
|
-
expect(stateAfter).toBe(stateBefore);
|
|
152
|
-
// @ts-expect-error Using Feed internals for tests only
|
|
153
|
-
expect(feed.stateUpdateQueue.size).toEqual(0);
|
|
154
|
-
|
|
155
|
-
// 2. WS and the HTTP
|
|
156
|
-
|
|
157
|
-
handleActivityUpdated.call(feed, currentUserPayload);
|
|
158
|
-
|
|
159
|
-
stateBefore = feed.currentState;
|
|
160
|
-
|
|
161
|
-
handleActivityUpdated.call(feed, currentUserPayload, false);
|
|
162
|
-
|
|
163
|
-
stateAfter = feed.currentState;
|
|
164
|
-
|
|
165
|
-
expect(stateAfter).toBe(stateBefore);
|
|
166
|
-
// @ts-expect-error Using Feed internals for tests only
|
|
167
|
-
expect(feed.stateUpdateQueue.size).toEqual(0);
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
it('allows update again from WS after clearing the stateUpdateQueue', () => {
|
|
171
|
-
handleActivityUpdated.call(feed, currentUserPayload);
|
|
172
|
-
|
|
173
|
-
expect(feed.currentState.activities?.[0]).toMatchObject({
|
|
174
|
-
...existingActivity,
|
|
175
|
-
text: updatedText,
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
// Clear the queue
|
|
179
|
-
(feed as any).stateUpdateQueue.clear();
|
|
180
|
-
|
|
181
|
-
// Now update should be allowed from another WS event
|
|
182
|
-
handleActivityUpdated.call(feed, {
|
|
183
|
-
...currentUserPayload,
|
|
184
|
-
activity: {
|
|
185
|
-
...currentUserPayload.activity,
|
|
186
|
-
text: 'updated-again-text',
|
|
187
|
-
},
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
expect(feed.currentState.activities?.[0]).toMatchObject({
|
|
191
|
-
...existingActivity,
|
|
192
|
-
text: 'updated-again-text',
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
it('allows update again from HTTP response after clearing the stateUpdateQueue', () => {
|
|
197
|
-
handleActivityUpdated.call(feed, currentUserPayload, false);
|
|
198
|
-
|
|
199
|
-
expect(feed.currentState.activities?.[0]).toMatchObject({
|
|
200
|
-
...existingActivity,
|
|
201
|
-
text: updatedText,
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
// Clear the queue
|
|
205
|
-
(feed as any).stateUpdateQueue.clear();
|
|
206
|
-
|
|
207
|
-
// Now update should be allowed from another WS event
|
|
208
|
-
handleActivityUpdated.call(
|
|
209
|
-
feed,
|
|
210
|
-
{
|
|
211
|
-
...currentUserPayload,
|
|
212
|
-
activity: {
|
|
213
|
-
...currentUserPayload.activity,
|
|
214
|
-
text: 'updated-again-text',
|
|
215
|
-
},
|
|
216
|
-
},
|
|
217
|
-
false,
|
|
218
|
-
);
|
|
219
|
-
|
|
220
|
-
expect(feed.currentState.activities?.[0]).toMatchObject({
|
|
221
|
-
...existingActivity,
|
|
222
|
-
text: 'updated-again-text',
|
|
223
|
-
});
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
it('should not insert anything into the stateUpdateQueue if the connected_user did not trigger the reaction', () => {
|
|
227
|
-
const otherUserPayload = {
|
|
228
|
-
...currentUserPayload,
|
|
229
|
-
user: generateUserResponseCommonFields({ id: getHumanId() }),
|
|
230
|
-
};
|
|
231
|
-
|
|
232
|
-
handleActivityUpdated.call(feed, otherUserPayload);
|
|
233
|
-
|
|
234
|
-
expect((feed as any).stateUpdateQueue).toEqual(new Set());
|
|
235
|
-
|
|
236
|
-
handleActivityUpdated.call(feed, otherUserPayload);
|
|
237
|
-
|
|
238
|
-
expect((feed as any).stateUpdateQueue).toEqual(new Set());
|
|
239
|
-
expect(feed.currentState.activities?.[0]).toMatchObject({
|
|
240
|
-
...existingActivity,
|
|
241
|
-
text: updatedText,
|
|
242
|
-
});
|
|
243
|
-
});
|
|
244
|
-
});
|
|
245
|
-
});
|