@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/package.json
CHANGED
|
@@ -5,73 +5,45 @@ import {
|
|
|
5
5
|
ActivityResponse,
|
|
6
6
|
FeedsReactionResponse,
|
|
7
7
|
} from '../../../gen/models';
|
|
8
|
+
import { addReactionToActivities, removeReactionFromActivities } from './';
|
|
8
9
|
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
removeReactionFromActivities,
|
|
13
|
-
} from './';
|
|
14
|
-
|
|
15
|
-
const createMockActivity = (id: string): ActivityResponse => ({
|
|
16
|
-
id,
|
|
17
|
-
type: 'test',
|
|
18
|
-
created_at: new Date(),
|
|
19
|
-
updated_at: new Date(),
|
|
20
|
-
visibility: 'public',
|
|
21
|
-
bookmark_count: 0,
|
|
22
|
-
comment_count: 0,
|
|
23
|
-
share_count: 0,
|
|
24
|
-
attachments: [],
|
|
25
|
-
comments: [],
|
|
26
|
-
feeds: [],
|
|
27
|
-
filter_tags: [],
|
|
28
|
-
interest_tags: [],
|
|
29
|
-
latest_reactions: [],
|
|
30
|
-
mentioned_users: [],
|
|
31
|
-
own_bookmarks: [],
|
|
32
|
-
own_reactions: [],
|
|
33
|
-
custom: {},
|
|
34
|
-
reaction_groups: {},
|
|
35
|
-
search_data: {},
|
|
36
|
-
popularity: 0,
|
|
37
|
-
score: 0,
|
|
38
|
-
reaction_count: 0,
|
|
39
|
-
user: {
|
|
40
|
-
id: 'user1',
|
|
41
|
-
created_at: new Date(),
|
|
42
|
-
updated_at: new Date(),
|
|
43
|
-
banned: false,
|
|
44
|
-
language: 'en',
|
|
45
|
-
online: false,
|
|
46
|
-
role: 'user',
|
|
47
|
-
blocked_user_ids: [],
|
|
48
|
-
teams: [],
|
|
49
|
-
custom: {},
|
|
50
|
-
},
|
|
51
|
-
});
|
|
10
|
+
generateActivityResponse,
|
|
11
|
+
generateFeedReactionResponse,
|
|
12
|
+
} from '../../../test-utils';
|
|
52
13
|
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
)
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
14
|
+
const addReactionToActivity = (
|
|
15
|
+
event: ActivityReactionAddedEvent,
|
|
16
|
+
activity: ActivityResponse,
|
|
17
|
+
eventBelongsToCurrentUser: boolean,
|
|
18
|
+
) => {
|
|
19
|
+
const result = addReactionToActivities(
|
|
20
|
+
event,
|
|
21
|
+
[activity],
|
|
22
|
+
eventBelongsToCurrentUser,
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
return {
|
|
26
|
+
changed: result.changed,
|
|
27
|
+
...result.entities![0],
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const removeReactionFromActivity = (
|
|
32
|
+
event: ActivityReactionAddedEvent,
|
|
33
|
+
activity: ActivityResponse,
|
|
34
|
+
eventBelongsToCurrentUser: boolean,
|
|
35
|
+
) => {
|
|
36
|
+
const result = removeReactionFromActivities(
|
|
37
|
+
event,
|
|
38
|
+
[activity],
|
|
39
|
+
eventBelongsToCurrentUser,
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
return {
|
|
43
|
+
changed: result.changed,
|
|
44
|
+
...result.entities![0],
|
|
45
|
+
};
|
|
46
|
+
};
|
|
75
47
|
|
|
76
48
|
const createMockAddedEvent = (
|
|
77
49
|
reaction: FeedsReactionResponse,
|
|
@@ -100,8 +72,12 @@ const createMockDeletedEvent = (
|
|
|
100
72
|
describe('activity-reaction-utils', () => {
|
|
101
73
|
describe('addReactionToActivity', () => {
|
|
102
74
|
it('should add reaction to own_reactions when from current user', () => {
|
|
103
|
-
const activity =
|
|
104
|
-
const reaction =
|
|
75
|
+
const activity = generateActivityResponse({ id: 'activity1' });
|
|
76
|
+
const reaction = generateFeedReactionResponse({
|
|
77
|
+
type: 'like',
|
|
78
|
+
user: { id: 'user1' },
|
|
79
|
+
activity_id: 'activity1',
|
|
80
|
+
});
|
|
105
81
|
const eventActivity = { ...activity };
|
|
106
82
|
eventActivity.latest_reactions = [reaction];
|
|
107
83
|
eventActivity.reaction_groups = {
|
|
@@ -129,8 +105,12 @@ describe('activity-reaction-utils', () => {
|
|
|
129
105
|
});
|
|
130
106
|
|
|
131
107
|
it('should not add reaction to own_reactions when not from current user', () => {
|
|
132
|
-
const activity =
|
|
133
|
-
const reaction =
|
|
108
|
+
const activity = generateActivityResponse({ id: 'activity1' });
|
|
109
|
+
const reaction = generateFeedReactionResponse({
|
|
110
|
+
type: 'like',
|
|
111
|
+
user: { id: 'user2' },
|
|
112
|
+
activity_id: 'activity1',
|
|
113
|
+
});
|
|
134
114
|
const eventActivity = { ...activity };
|
|
135
115
|
eventActivity.latest_reactions = [reaction];
|
|
136
116
|
eventActivity.reaction_groups = {
|
|
@@ -160,8 +140,12 @@ describe('activity-reaction-utils', () => {
|
|
|
160
140
|
|
|
161
141
|
describe('removeReactionFromActivity', () => {
|
|
162
142
|
it('should remove reaction from own_reactions when from current user', () => {
|
|
163
|
-
const activity =
|
|
164
|
-
const reaction =
|
|
143
|
+
const activity = generateActivityResponse({ id: 'activity1' });
|
|
144
|
+
const reaction = generateFeedReactionResponse({
|
|
145
|
+
type: 'like',
|
|
146
|
+
user: { id: 'user1' },
|
|
147
|
+
activity_id: 'activity1',
|
|
148
|
+
});
|
|
165
149
|
const eventActivity = { ...activity };
|
|
166
150
|
eventActivity.latest_reactions = [reaction];
|
|
167
151
|
eventActivity.reaction_groups = {
|
|
@@ -192,8 +176,12 @@ describe('activity-reaction-utils', () => {
|
|
|
192
176
|
});
|
|
193
177
|
|
|
194
178
|
it('should not remove reaction from own_reactions when not from current user', () => {
|
|
195
|
-
const activity =
|
|
196
|
-
const reaction =
|
|
179
|
+
const activity = generateActivityResponse({ id: 'activity1' });
|
|
180
|
+
const reaction = generateFeedReactionResponse({
|
|
181
|
+
type: 'like',
|
|
182
|
+
user: { id: 'user1' },
|
|
183
|
+
activity_id: 'activity1',
|
|
184
|
+
});
|
|
197
185
|
const eventActivity = { ...activity };
|
|
198
186
|
eventActivity.latest_reactions = [reaction];
|
|
199
187
|
eventActivity.reaction_groups = {
|
|
@@ -226,9 +214,13 @@ describe('activity-reaction-utils', () => {
|
|
|
226
214
|
|
|
227
215
|
describe('addReactionToActivities', () => {
|
|
228
216
|
it('should add reaction to activity in activities array', () => {
|
|
229
|
-
const activity =
|
|
217
|
+
const activity = generateActivityResponse({ id: 'activity1' });
|
|
230
218
|
const activities = [activity];
|
|
231
|
-
const reaction =
|
|
219
|
+
const reaction = generateFeedReactionResponse({
|
|
220
|
+
type: 'like',
|
|
221
|
+
user: { id: 'user1' },
|
|
222
|
+
activity_id: 'activity1',
|
|
223
|
+
});
|
|
232
224
|
const eventActivity = { ...activity };
|
|
233
225
|
eventActivity.latest_reactions = [reaction];
|
|
234
226
|
eventActivity.reaction_groups = {
|
|
@@ -244,16 +236,20 @@ describe('activity-reaction-utils', () => {
|
|
|
244
236
|
const result = addReactionToActivities(event, activities, true);
|
|
245
237
|
|
|
246
238
|
expect(result.changed).toBe(true);
|
|
247
|
-
expect(result.
|
|
248
|
-
expect(result.
|
|
249
|
-
expect(result.
|
|
239
|
+
expect(result.entities!).toHaveLength(1);
|
|
240
|
+
expect(result.entities![0].own_reactions).toHaveLength(1);
|
|
241
|
+
expect(result.entities![0].own_reactions[0]).toEqual(reaction);
|
|
250
242
|
});
|
|
251
243
|
|
|
252
244
|
it('should return unchanged state if activity not found', () => {
|
|
253
|
-
const activity =
|
|
245
|
+
const activity = generateActivityResponse({ id: 'activity1' });
|
|
254
246
|
const activities = [activity];
|
|
255
|
-
const reaction =
|
|
256
|
-
|
|
247
|
+
const reaction = generateFeedReactionResponse({
|
|
248
|
+
type: 'like',
|
|
249
|
+
user: { id: 'user1' },
|
|
250
|
+
activity_id: 'activity2',
|
|
251
|
+
});
|
|
252
|
+
const eventActivity = generateActivityResponse({ id: 'activity2' });
|
|
257
253
|
eventActivity.latest_reactions = [reaction];
|
|
258
254
|
eventActivity.reaction_groups = {
|
|
259
255
|
[reaction.type]: {
|
|
@@ -268,12 +264,16 @@ describe('activity-reaction-utils', () => {
|
|
|
268
264
|
const result = addReactionToActivities(event, activities, true);
|
|
269
265
|
|
|
270
266
|
expect(result.changed).toBe(false);
|
|
271
|
-
expect(result.
|
|
267
|
+
expect(result.entities).toBe(activities);
|
|
272
268
|
});
|
|
273
269
|
|
|
274
270
|
it('should handle undefined activities', () => {
|
|
275
|
-
const activity =
|
|
276
|
-
const reaction =
|
|
271
|
+
const activity = generateActivityResponse({ id: 'activity1' });
|
|
272
|
+
const reaction = generateFeedReactionResponse({
|
|
273
|
+
type: 'like',
|
|
274
|
+
user: { id: 'user1' },
|
|
275
|
+
activity_id: 'activity1',
|
|
276
|
+
});
|
|
277
277
|
const eventActivity = { ...activity };
|
|
278
278
|
eventActivity.own_reactions = [reaction];
|
|
279
279
|
eventActivity.latest_reactions = [reaction];
|
|
@@ -290,14 +290,18 @@ describe('activity-reaction-utils', () => {
|
|
|
290
290
|
const result = addReactionToActivities(event, undefined, true);
|
|
291
291
|
|
|
292
292
|
expect(result.changed).toBe(false);
|
|
293
|
-
expect(result.
|
|
293
|
+
expect(result.entities).toBeUndefined();
|
|
294
294
|
});
|
|
295
295
|
});
|
|
296
296
|
|
|
297
297
|
describe('removeReactionFromActivities', () => {
|
|
298
298
|
it('should remove reaction from activity in activities array', () => {
|
|
299
|
-
const activity =
|
|
300
|
-
const reaction =
|
|
299
|
+
const activity = generateActivityResponse({ id: 'activity1' });
|
|
300
|
+
const reaction = generateFeedReactionResponse({
|
|
301
|
+
type: 'like',
|
|
302
|
+
user: { id: 'user1' },
|
|
303
|
+
activity_id: 'activity1',
|
|
304
|
+
});
|
|
301
305
|
const eventActivity = { ...activity };
|
|
302
306
|
eventActivity.latest_reactions = [reaction];
|
|
303
307
|
eventActivity.reaction_groups = {
|
|
@@ -323,15 +327,19 @@ describe('activity-reaction-utils', () => {
|
|
|
323
327
|
);
|
|
324
328
|
|
|
325
329
|
expect(result.changed).toBe(true);
|
|
326
|
-
expect(result.
|
|
327
|
-
expect(result.
|
|
330
|
+
expect(result.entities).toHaveLength(1);
|
|
331
|
+
expect(result.entities![0].own_reactions).toHaveLength(0);
|
|
328
332
|
});
|
|
329
333
|
|
|
330
334
|
it('should return unchanged state if activity not found', () => {
|
|
331
|
-
const activity =
|
|
335
|
+
const activity = generateActivityResponse({ id: 'activity1' });
|
|
332
336
|
const activities = [activity];
|
|
333
|
-
const reaction =
|
|
334
|
-
|
|
337
|
+
const reaction = generateFeedReactionResponse({
|
|
338
|
+
type: 'like',
|
|
339
|
+
user: { id: 'user1' },
|
|
340
|
+
activity_id: 'activity2',
|
|
341
|
+
});
|
|
342
|
+
const eventActivity = generateActivityResponse({ id: 'activity2' });
|
|
335
343
|
eventActivity.latest_reactions = [];
|
|
336
344
|
eventActivity.reaction_groups = {};
|
|
337
345
|
const event = createMockDeletedEvent(reaction, eventActivity);
|
|
@@ -339,12 +347,16 @@ describe('activity-reaction-utils', () => {
|
|
|
339
347
|
const result = removeReactionFromActivities(event, activities, true);
|
|
340
348
|
|
|
341
349
|
expect(result.changed).toBe(false);
|
|
342
|
-
expect(result.
|
|
350
|
+
expect(result.entities).toBe(activities);
|
|
343
351
|
});
|
|
344
352
|
|
|
345
353
|
it('should handle undefined activities', () => {
|
|
346
|
-
const activity =
|
|
347
|
-
const reaction =
|
|
354
|
+
const activity = generateActivityResponse({ id: 'activity1' });
|
|
355
|
+
const reaction = generateFeedReactionResponse({
|
|
356
|
+
type: 'like',
|
|
357
|
+
user: { id: 'user1' },
|
|
358
|
+
activity_id: 'activity1',
|
|
359
|
+
});
|
|
348
360
|
const eventActivity = { ...activity };
|
|
349
361
|
eventActivity.latest_reactions = [];
|
|
350
362
|
eventActivity.reaction_groups = {};
|
|
@@ -353,7 +365,7 @@ describe('activity-reaction-utils', () => {
|
|
|
353
365
|
const result = removeReactionFromActivities(event, undefined, true);
|
|
354
366
|
|
|
355
367
|
expect(result.changed).toBe(false);
|
|
356
|
-
expect(result.
|
|
368
|
+
expect(result.entities).toBeUndefined();
|
|
357
369
|
});
|
|
358
370
|
});
|
|
359
371
|
});
|
|
@@ -1,55 +1,19 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { ActivityResponse
|
|
2
|
+
import { ActivityResponse } from '../../../gen/models';
|
|
3
3
|
import {
|
|
4
4
|
addActivitiesToState,
|
|
5
5
|
updateActivityInState,
|
|
6
6
|
removeActivityFromState,
|
|
7
7
|
} from './';
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
type: 'test',
|
|
13
|
-
created_at: new Date(),
|
|
14
|
-
updated_at: new Date(),
|
|
15
|
-
visibility: 'public',
|
|
16
|
-
bookmark_count: 0,
|
|
17
|
-
comment_count: 0,
|
|
18
|
-
share_count: 0,
|
|
19
|
-
attachments: [],
|
|
20
|
-
comments: [],
|
|
21
|
-
feeds: [],
|
|
22
|
-
filter_tags: [],
|
|
23
|
-
interest_tags: [],
|
|
24
|
-
latest_reactions: [],
|
|
25
|
-
mentioned_users: [],
|
|
26
|
-
own_bookmarks: [],
|
|
27
|
-
own_reactions: [],
|
|
28
|
-
custom: {},
|
|
29
|
-
reaction_groups: {},
|
|
30
|
-
search_data: {},
|
|
31
|
-
text: text,
|
|
32
|
-
popularity: 0,
|
|
33
|
-
score: 0,
|
|
34
|
-
reaction_count: 0,
|
|
35
|
-
user: {
|
|
36
|
-
id: 'user1',
|
|
37
|
-
created_at: new Date(),
|
|
38
|
-
updated_at: new Date(),
|
|
39
|
-
banned: false,
|
|
40
|
-
language: 'en',
|
|
41
|
-
online: false,
|
|
42
|
-
role: 'user',
|
|
43
|
-
blocked_user_ids: [],
|
|
44
|
-
teams: [],
|
|
45
|
-
custom: {},
|
|
46
|
-
},
|
|
47
|
-
}) as ActivityResponse;
|
|
8
|
+
import {
|
|
9
|
+
generateActivityResponse,
|
|
10
|
+
generateFeedReactionResponse,
|
|
11
|
+
} from '../../../test-utils';
|
|
48
12
|
|
|
49
13
|
describe('activity-utils', () => {
|
|
50
14
|
describe('addActivitiesToState', () => {
|
|
51
|
-
const activity1 =
|
|
52
|
-
const activity2 =
|
|
15
|
+
const activity1 = generateActivityResponse({ id: 'activity1' });
|
|
16
|
+
const activity2 = generateActivityResponse({ id: 'activity2' });
|
|
53
17
|
|
|
54
18
|
it('should add activities to empty state', () => {
|
|
55
19
|
const result = addActivitiesToState([activity1], undefined, 'start');
|
|
@@ -101,7 +65,7 @@ describe('activity-utils', () => {
|
|
|
101
65
|
});
|
|
102
66
|
|
|
103
67
|
it('should handle multiple new activities correctly', () => {
|
|
104
|
-
const activity3 =
|
|
68
|
+
const activity3 = generateActivityResponse({ id: 'activity3' });
|
|
105
69
|
|
|
106
70
|
const existingActivities = [activity1];
|
|
107
71
|
const result = addActivitiesToState(
|
|
@@ -120,109 +84,107 @@ describe('activity-utils', () => {
|
|
|
120
84
|
|
|
121
85
|
describe('updateActivityInState', () => {
|
|
122
86
|
it('should update an activity in the state', () => {
|
|
123
|
-
const originalActivity =
|
|
124
|
-
|
|
87
|
+
const originalActivity = generateActivityResponse({
|
|
88
|
+
id: 'activity1',
|
|
89
|
+
text: 'original text',
|
|
90
|
+
});
|
|
91
|
+
const updatedActivity = { ...originalActivity, text: 'updated text' };
|
|
125
92
|
const originalActivities = [originalActivity];
|
|
126
93
|
|
|
127
|
-
const result = updateActivityInState(
|
|
94
|
+
const result = updateActivityInState(
|
|
95
|
+
{
|
|
96
|
+
activity: updatedActivity,
|
|
97
|
+
created_at: new Date(),
|
|
98
|
+
fid: '',
|
|
99
|
+
type: '',
|
|
100
|
+
custom: {},
|
|
101
|
+
},
|
|
102
|
+
originalActivities,
|
|
103
|
+
);
|
|
128
104
|
|
|
129
105
|
expect(result.changed).toBe(true);
|
|
130
|
-
expect(result.
|
|
131
|
-
expect(result.
|
|
132
|
-
expect(result.
|
|
106
|
+
expect(result.entities).toHaveLength(1);
|
|
107
|
+
expect(result.entities![0].id).toBe('activity1');
|
|
108
|
+
expect(result.entities![0].text).toBe('updated text');
|
|
133
109
|
|
|
134
110
|
// Make sure we create a new array
|
|
135
|
-
expect(originalActivities === result.
|
|
111
|
+
expect(originalActivities === result.entities).toBe(false);
|
|
136
112
|
});
|
|
137
113
|
|
|
138
|
-
it('should preserve reaction data when updating an activity', () => {
|
|
139
|
-
const
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
type: 'like',
|
|
144
|
-
user: {
|
|
145
|
-
id: 'user1',
|
|
146
|
-
created_at: new Date(),
|
|
147
|
-
updated_at: new Date(),
|
|
148
|
-
banned: false,
|
|
149
|
-
language: 'en',
|
|
150
|
-
online: false,
|
|
151
|
-
role: 'user',
|
|
152
|
-
blocked_user_ids: [],
|
|
153
|
-
teams: [],
|
|
154
|
-
custom: {},
|
|
155
|
-
},
|
|
156
|
-
activity_id: 'activity1',
|
|
157
|
-
created_at: new Date(),
|
|
158
|
-
updated_at: new Date(),
|
|
114
|
+
it('should preserve reaction data (own_reaction) when updating an activity', () => {
|
|
115
|
+
const r = generateFeedReactionResponse({
|
|
116
|
+
activity_id: 'activity1',
|
|
117
|
+
user: {
|
|
118
|
+
id: 'user1',
|
|
159
119
|
},
|
|
160
|
-
|
|
161
|
-
originalActivity
|
|
162
|
-
|
|
120
|
+
});
|
|
121
|
+
const originalActivity = generateActivityResponse({
|
|
122
|
+
id: 'activity1',
|
|
123
|
+
text: 'original text',
|
|
124
|
+
own_reactions: [r],
|
|
125
|
+
latest_reactions: [r],
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
const updatedActivity = generateActivityResponse({
|
|
129
|
+
id: 'activity1',
|
|
130
|
+
text: 'updated text',
|
|
131
|
+
own_reactions: [],
|
|
132
|
+
latest_reactions: [
|
|
133
|
+
r,
|
|
134
|
+
generateFeedReactionResponse({
|
|
135
|
+
activity_id: 'activity1',
|
|
136
|
+
user: { id: 'user2' },
|
|
137
|
+
}),
|
|
138
|
+
],
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
const result = updateActivityInState(
|
|
163
142
|
{
|
|
164
|
-
|
|
165
|
-
user: {
|
|
166
|
-
id: 'user1',
|
|
167
|
-
created_at: new Date(),
|
|
168
|
-
updated_at: new Date(),
|
|
169
|
-
banned: false,
|
|
170
|
-
language: 'en',
|
|
171
|
-
online: false,
|
|
172
|
-
role: 'user',
|
|
173
|
-
blocked_user_ids: [],
|
|
174
|
-
teams: [],
|
|
175
|
-
custom: {},
|
|
176
|
-
},
|
|
177
|
-
activity_id: 'activity1',
|
|
143
|
+
activity: updatedActivity,
|
|
178
144
|
created_at: new Date(),
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
originalActivity.reaction_groups = {
|
|
183
|
-
like: {
|
|
184
|
-
sum_scores: 0,
|
|
185
|
-
count: 1,
|
|
186
|
-
first_reaction_at: new Date(),
|
|
187
|
-
last_reaction_at: new Date(),
|
|
145
|
+
fid: '',
|
|
146
|
+
type: '',
|
|
147
|
+
custom: {},
|
|
188
148
|
},
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
const updatedActivity = createMockActivity('activity1', 'updated text');
|
|
192
|
-
// Reactions are not included in the updated activity from server
|
|
193
|
-
|
|
194
|
-
const result = updateActivityInState(updatedActivity, [originalActivity]);
|
|
149
|
+
[originalActivity],
|
|
150
|
+
);
|
|
195
151
|
|
|
196
152
|
expect(result.changed).toBe(true);
|
|
197
|
-
expect(result.
|
|
153
|
+
expect(result.entities![0].text).toBe('updated text');
|
|
198
154
|
// Check that reactions were preserved
|
|
199
|
-
expect(result.
|
|
155
|
+
expect(result.entities![0].own_reactions).toEqual(
|
|
200
156
|
originalActivity.own_reactions,
|
|
201
157
|
);
|
|
202
|
-
expect(result.activities[0].latest_reactions).toEqual(
|
|
203
|
-
originalActivity.latest_reactions,
|
|
204
|
-
);
|
|
205
|
-
expect(result.activities[0].reaction_groups).toEqual(
|
|
206
|
-
originalActivity.reaction_groups,
|
|
207
|
-
);
|
|
208
158
|
});
|
|
209
159
|
|
|
210
160
|
it('should return unchanged state if activity not found', () => {
|
|
211
|
-
const existingActivity =
|
|
212
|
-
const updatedActivity =
|
|
161
|
+
const existingActivity = generateActivityResponse({ id: 'activity1' });
|
|
162
|
+
const updatedActivity = generateActivityResponse({
|
|
163
|
+
id: 'activity2',
|
|
164
|
+
text: 'some text',
|
|
165
|
+
});
|
|
213
166
|
|
|
214
|
-
const result = updateActivityInState(
|
|
167
|
+
const result = updateActivityInState(
|
|
168
|
+
{
|
|
169
|
+
activity: updatedActivity,
|
|
170
|
+
created_at: new Date(),
|
|
171
|
+
fid: '',
|
|
172
|
+
type: '',
|
|
173
|
+
custom: {},
|
|
174
|
+
},
|
|
175
|
+
[existingActivity],
|
|
176
|
+
);
|
|
215
177
|
|
|
216
178
|
expect(result.changed).toBe(false);
|
|
217
|
-
expect(result.
|
|
218
|
-
expect(result.
|
|
179
|
+
expect(result.entities).toHaveLength(1);
|
|
180
|
+
expect(result.entities![0].id).toBe('activity1');
|
|
219
181
|
});
|
|
220
182
|
});
|
|
221
183
|
|
|
222
184
|
describe('removeActivityFromState', () => {
|
|
223
185
|
it('should remove an activity from the state', () => {
|
|
224
|
-
const activity1 =
|
|
225
|
-
const activity2 =
|
|
186
|
+
const activity1 = generateActivityResponse({ id: 'activity1' });
|
|
187
|
+
const activity2 = generateActivityResponse({ id: 'activity2' });
|
|
226
188
|
const activities = [activity1, activity2];
|
|
227
189
|
|
|
228
190
|
const result = removeActivityFromState(activity1, activities);
|
|
@@ -235,8 +197,8 @@ describe('activity-utils', () => {
|
|
|
235
197
|
});
|
|
236
198
|
|
|
237
199
|
it('should return unchanged state if activity not found', () => {
|
|
238
|
-
const activity1 =
|
|
239
|
-
const activity2 =
|
|
200
|
+
const activity1 = generateActivityResponse({ id: 'activity1' });
|
|
201
|
+
const activity2 = generateActivityResponse({ id: 'activity2' });
|
|
240
202
|
const activities = [activity1];
|
|
241
203
|
|
|
242
204
|
const result = removeActivityFromState(activity2, activities);
|
|
@@ -247,7 +209,7 @@ describe('activity-utils', () => {
|
|
|
247
209
|
});
|
|
248
210
|
|
|
249
211
|
it('should handle empty activities array', () => {
|
|
250
|
-
const activity =
|
|
212
|
+
const activity = generateActivityResponse({ id: 'activity1' });
|
|
251
213
|
const activities: ActivityResponse[] = [];
|
|
252
214
|
|
|
253
215
|
const result = removeActivityFromState(activity, activities);
|
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
import type { Feed } from '../../../feed';
|
|
2
|
-
import type {
|
|
2
|
+
import type {
|
|
3
|
+
ActivityPinResponse,
|
|
4
|
+
ActivityResponse,
|
|
5
|
+
} from '../../../gen/models';
|
|
3
6
|
import type { EventPayload } from '../../../types-internal';
|
|
4
7
|
|
|
5
8
|
export const removeActivityFromState = (
|
|
6
9
|
activityResponse: ActivityResponse,
|
|
7
|
-
activities: ActivityResponse[],
|
|
10
|
+
activities: ActivityResponse[] | undefined,
|
|
8
11
|
) => {
|
|
9
|
-
const index =
|
|
12
|
+
const index =
|
|
13
|
+
activities?.findIndex((activity) => activity.id === activityResponse.id) ??
|
|
14
|
+
-1;
|
|
15
|
+
|
|
10
16
|
if (index !== -1) {
|
|
11
|
-
const newActivities = [...activities];
|
|
17
|
+
const newActivities = [...activities!];
|
|
12
18
|
newActivities.splice(index, 1);
|
|
13
19
|
return { changed: true, activities: newActivities };
|
|
14
20
|
} else {
|
|
@@ -16,15 +22,42 @@ export const removeActivityFromState = (
|
|
|
16
22
|
}
|
|
17
23
|
};
|
|
18
24
|
|
|
25
|
+
export const removePinnedActivityFromState = (
|
|
26
|
+
activityResponse: ActivityResponse,
|
|
27
|
+
pinnedActivities: ActivityPinResponse[] | undefined,
|
|
28
|
+
) => {
|
|
29
|
+
const index =
|
|
30
|
+
pinnedActivities?.findIndex(
|
|
31
|
+
(pinnedActivity) => pinnedActivity.activity.id === activityResponse.id,
|
|
32
|
+
) ?? -1;
|
|
33
|
+
|
|
34
|
+
if (index !== -1) {
|
|
35
|
+
const newActivities = [...pinnedActivities!];
|
|
36
|
+
newActivities.splice(index, 1);
|
|
37
|
+
return { changed: true, activities: newActivities };
|
|
38
|
+
} else {
|
|
39
|
+
return { changed: false, pinned_activities: pinnedActivities };
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
|
|
19
43
|
export function handleActivityDeleted(
|
|
20
44
|
this: Feed,
|
|
21
45
|
event: EventPayload<'feeds.activity.deleted'>,
|
|
22
46
|
) {
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
47
|
+
const {
|
|
48
|
+
activities: currentActivities,
|
|
49
|
+
pinned_activities: currentPinnedActivities,
|
|
50
|
+
} = this.currentState;
|
|
51
|
+
|
|
52
|
+
const [result1, result2] = [
|
|
53
|
+
removeActivityFromState(event.activity, currentActivities),
|
|
54
|
+
removePinnedActivityFromState(event.activity, currentPinnedActivities),
|
|
55
|
+
];
|
|
56
|
+
|
|
57
|
+
if (result1.changed || result2.changed) {
|
|
58
|
+
this.state.partialNext({
|
|
59
|
+
activities: result1.activities,
|
|
60
|
+
pinned_activities: result2.pinned_activities,
|
|
61
|
+
});
|
|
29
62
|
}
|
|
30
63
|
}
|