@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.
Files changed (58) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/index-react-bindings.browser.cjs +365 -207
  3. package/dist/index-react-bindings.browser.cjs.map +1 -1
  4. package/dist/index-react-bindings.browser.js +365 -207
  5. package/dist/index-react-bindings.browser.js.map +1 -1
  6. package/dist/index-react-bindings.node.cjs +365 -207
  7. package/dist/index-react-bindings.node.cjs.map +1 -1
  8. package/dist/index-react-bindings.node.js +365 -207
  9. package/dist/index-react-bindings.node.js.map +1 -1
  10. package/dist/index.browser.cjs +366 -207
  11. package/dist/index.browser.cjs.map +1 -1
  12. package/dist/index.browser.js +366 -208
  13. package/dist/index.browser.js.map +1 -1
  14. package/dist/index.node.cjs +366 -207
  15. package/dist/index.node.cjs.map +1 -1
  16. package/dist/index.node.js +366 -208
  17. package/dist/index.node.js.map +1 -1
  18. package/dist/src/feed/event-handlers/activity/handle-activity-deleted.d.ts +12 -3
  19. package/dist/src/feed/event-handlers/activity/handle-activity-pinned.d.ts +3 -0
  20. package/dist/src/feed/event-handlers/activity/handle-activity-reaction-added.d.ts +10 -6
  21. package/dist/src/feed/event-handlers/activity/handle-activity-reaction-deleted.d.ts +10 -6
  22. package/dist/src/feed/event-handlers/activity/handle-activity-unpinned.d.ts +3 -0
  23. package/dist/src/feed/event-handlers/activity/handle-activity-updated.d.ts +7 -3
  24. package/dist/src/feed/event-handlers/bookmark/handle-bookmark-added.d.ts +10 -6
  25. package/dist/src/feed/event-handlers/bookmark/handle-bookmark-deleted.d.ts +10 -6
  26. package/dist/src/feed/event-handlers/bookmark/handle-bookmark-updated.d.ts +10 -6
  27. package/dist/src/gen/models/index.d.ts +36 -1
  28. package/dist/src/test-utils/response-generators.d.ts +46 -1
  29. package/dist/src/utils/index.d.ts +1 -0
  30. package/dist/src/utils/update-entity-in-array.d.ts +27 -0
  31. package/dist/tsconfig.tsbuildinfo +1 -1
  32. package/package.json +1 -1
  33. package/src/feed/event-handlers/activity/activity-reaction-utils.test.ts +108 -96
  34. package/src/feed/event-handlers/activity/activity-utils.test.ts +84 -122
  35. package/src/feed/event-handlers/activity/handle-activity-deleted.ts +43 -10
  36. package/src/feed/event-handlers/activity/handle-activity-pinned.test.ts +60 -0
  37. package/src/feed/event-handlers/activity/handle-activity-pinned.ts +30 -0
  38. package/src/feed/event-handlers/activity/handle-activity-reaction-added.test.ts +157 -0
  39. package/src/feed/event-handlers/activity/handle-activity-reaction-added.ts +82 -40
  40. package/src/feed/event-handlers/activity/handle-activity-reaction-deleted.test.ts +200 -0
  41. package/src/feed/event-handlers/activity/handle-activity-reaction-deleted.ts +89 -51
  42. package/src/feed/event-handlers/activity/handle-activity-unpinned.test.ts +94 -0
  43. package/src/feed/event-handlers/activity/handle-activity-unpinned.ts +30 -0
  44. package/src/feed/event-handlers/activity/handle-activity-updated.test.ts +115 -0
  45. package/src/feed/event-handlers/activity/handle-activity-updated.ts +73 -35
  46. package/src/feed/event-handlers/bookmark/bookmark-utils.test.ts +121 -109
  47. package/src/feed/event-handlers/bookmark/handle-bookmark-added.test.ts +178 -0
  48. package/src/feed/event-handlers/bookmark/handle-bookmark-added.ts +82 -39
  49. package/src/feed/event-handlers/bookmark/handle-bookmark-deleted.test.ts +188 -0
  50. package/src/feed/event-handlers/bookmark/handle-bookmark-deleted.ts +86 -48
  51. package/src/feed/event-handlers/bookmark/handle-bookmark-updated.test.ts +196 -0
  52. package/src/feed/event-handlers/bookmark/handle-bookmark-updated.ts +83 -44
  53. package/src/gen/model-decoders/decoders.ts +13 -0
  54. package/src/gen/models/index.ts +73 -2
  55. package/src/gen/moderation/ModerationApi.ts +1 -0
  56. package/src/test-utils/response-generators.ts +260 -0
  57. package/src/utils/index.ts +1 -0
  58. package/src/utils/update-entity-in-array.ts +51 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stream-io/feeds-client",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "packageManager": "yarn@3.2.4",
5
5
  "main": "./dist/index.node.js",
6
6
  "exports": {
@@ -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
- addReactionToActivity,
10
- removeReactionFromActivity,
11
- addReactionToActivities,
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 createMockReaction = (
54
- type: string,
55
- userId: string,
56
- activityId: string,
57
- ): FeedsReactionResponse => ({
58
- type,
59
- user: {
60
- id: userId,
61
- created_at: new Date(),
62
- updated_at: new Date(),
63
- banned: false,
64
- language: 'en',
65
- online: false,
66
- role: 'user',
67
- blocked_user_ids: [],
68
- teams: [],
69
- custom: {},
70
- },
71
- activity_id: activityId,
72
- created_at: new Date(),
73
- updated_at: new Date(),
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 = createMockActivity('activity1');
104
- const reaction = createMockReaction('like', 'user1', 'activity1');
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 = createMockActivity('activity1');
133
- const reaction = createMockReaction('like', 'user2', 'activity1');
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 = createMockActivity('activity1');
164
- const reaction = createMockReaction('like', 'user1', 'activity1');
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 = createMockActivity('activity1');
196
- const reaction = createMockReaction('like', 'user1', 'activity1');
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 = createMockActivity('activity1');
217
+ const activity = generateActivityResponse({ id: 'activity1' });
230
218
  const activities = [activity];
231
- const reaction = createMockReaction('like', 'user1', 'activity1');
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.activities).toHaveLength(1);
248
- expect(result.activities[0].own_reactions).toHaveLength(1);
249
- expect(result.activities[0].own_reactions[0]).toEqual(reaction);
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 = createMockActivity('activity1');
245
+ const activity = generateActivityResponse({ id: 'activity1' });
254
246
  const activities = [activity];
255
- const reaction = createMockReaction('like', 'user1', 'activity2');
256
- const eventActivity = createMockActivity('activity2');
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.activities).toBe(activities);
267
+ expect(result.entities).toBe(activities);
272
268
  });
273
269
 
274
270
  it('should handle undefined activities', () => {
275
- const activity = createMockActivity('activity1');
276
- const reaction = createMockReaction('like', 'user1', 'activity1');
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.activities).toEqual([]);
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 = createMockActivity('activity1');
300
- const reaction = createMockReaction('like', 'user1', 'activity1');
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.activities).toHaveLength(1);
327
- expect(result.activities[0].own_reactions).toHaveLength(0);
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 = createMockActivity('activity1');
335
+ const activity = generateActivityResponse({ id: 'activity1' });
332
336
  const activities = [activity];
333
- const reaction = createMockReaction('like', 'user1', 'activity2');
334
- const eventActivity = createMockActivity('activity2');
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.activities).toBe(activities);
350
+ expect(result.entities).toBe(activities);
343
351
  });
344
352
 
345
353
  it('should handle undefined activities', () => {
346
- const activity = createMockActivity('activity1');
347
- const reaction = createMockReaction('like', 'user1', 'activity1');
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.activities).toEqual([]);
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, FeedsReactionResponse } from '../../../gen/models';
2
+ import { ActivityResponse } from '../../../gen/models';
3
3
  import {
4
4
  addActivitiesToState,
5
5
  updateActivityInState,
6
6
  removeActivityFromState,
7
7
  } from './';
8
-
9
- const createMockActivity = (id: string, text?: string): ActivityResponse =>
10
- ({
11
- id,
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 = createMockActivity('activity1');
52
- const activity2 = createMockActivity('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 = createMockActivity('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 = createMockActivity('activity1', 'original text');
124
- const updatedActivity = createMockActivity('activity1', 'updated text');
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(updatedActivity, originalActivities);
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.activities).toHaveLength(1);
131
- expect(result.activities[0].id).toBe('activity1');
132
- expect(result.activities[0].text).toBe('updated text');
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.activities).toBe(false);
111
+ expect(originalActivities === result.entities).toBe(false);
136
112
  });
137
113
 
138
- it('should preserve reaction data when updating an activity', () => {
139
- const originalActivity = createMockActivity('activity1', 'original text');
140
- // Mock the reaction structure with proper types
141
- originalActivity.own_reactions = [
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.latest_reactions = {} as FeedsReactionResponse[];
162
- (originalActivity.latest_reactions as any).like = [
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
- type: 'like',
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
- updated_at: new Date(),
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.activities[0].text).toBe('updated text');
153
+ expect(result.entities![0].text).toBe('updated text');
198
154
  // Check that reactions were preserved
199
- expect(result.activities[0].own_reactions).toEqual(
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 = createMockActivity('activity1');
212
- const updatedActivity = createMockActivity('activity2', 'some text');
161
+ const existingActivity = generateActivityResponse({ id: 'activity1' });
162
+ const updatedActivity = generateActivityResponse({
163
+ id: 'activity2',
164
+ text: 'some text',
165
+ });
213
166
 
214
- const result = updateActivityInState(updatedActivity, [existingActivity]);
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.activities).toHaveLength(1);
218
- expect(result.activities[0].id).toBe('activity1');
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 = createMockActivity('activity1');
225
- const activity2 = createMockActivity('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 = createMockActivity('activity1');
239
- const activity2 = createMockActivity('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 = createMockActivity('activity1');
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 { ActivityResponse } from '../../../gen/models';
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 = activities.findIndex((a) => a.id === activityResponse.id);
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 currentActivities = this.currentState.activities;
24
- if (currentActivities) {
25
- const result = removeActivityFromState(event.activity, currentActivities);
26
- if (result.changed) {
27
- this.state.partialNext({ activities: result.activities });
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
  }