@stream-io/feeds-client 0.2.1 → 0.2.2

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 (54) hide show
  1. package/@react-bindings/hooks/feed-state-hooks/index.ts +4 -0
  2. package/CHANGELOG.md +8 -0
  3. package/dist/@react-bindings/hooks/feed-state-hooks/index.d.ts +4 -0
  4. package/dist/@react-bindings/hooks/feed-state-hooks/useAggregatedActivities.d.ts +11 -0
  5. package/dist/@react-bindings/hooks/feed-state-hooks/useIsAggregatedActivityRead.d.ts +6 -0
  6. package/dist/@react-bindings/hooks/feed-state-hooks/useIsAggregatedActivitySeen.d.ts +6 -0
  7. package/dist/@react-bindings/hooks/feed-state-hooks/useNotificationStatus.d.ts +13 -0
  8. package/dist/@react-bindings/wrappers/StreamFeed.d.ts +1 -1
  9. package/dist/index-react-bindings.browser.cjs +154 -29
  10. package/dist/index-react-bindings.browser.cjs.map +1 -1
  11. package/dist/index-react-bindings.browser.js +151 -30
  12. package/dist/index-react-bindings.browser.js.map +1 -1
  13. package/dist/index-react-bindings.node.cjs +154 -29
  14. package/dist/index-react-bindings.node.cjs.map +1 -1
  15. package/dist/index-react-bindings.node.js +151 -30
  16. package/dist/index-react-bindings.node.js.map +1 -1
  17. package/dist/index.browser.cjs +88 -12
  18. package/dist/index.browser.cjs.map +1 -1
  19. package/dist/index.browser.js +88 -12
  20. package/dist/index.browser.js.map +1 -1
  21. package/dist/index.node.cjs +88 -12
  22. package/dist/index.node.cjs.map +1 -1
  23. package/dist/index.node.js +88 -12
  24. package/dist/index.node.js.map +1 -1
  25. package/dist/src/feed/event-handlers/activity/handle-activity-marked.d.ts +11 -0
  26. package/dist/src/feed/event-handlers/activity/index.d.ts +1 -0
  27. package/dist/src/feed/event-handlers/notification-feed/handle-notification-feed-updated.d.ts +8 -1
  28. package/dist/src/feed/feed.d.ts +2 -2
  29. package/dist/src/test-utils/response-generators.d.ts +21 -1
  30. package/dist/tsconfig.tsbuildinfo +1 -1
  31. package/package.json +1 -1
  32. package/src/feed/event-handlers/activity/activity-marked-utils.test.ts +208 -0
  33. package/src/feed/event-handlers/activity/handle-activity-marked.ts +68 -0
  34. package/src/feed/event-handlers/activity/handle-activity-reaction-added.test.ts +15 -15
  35. package/src/feed/event-handlers/activity/handle-activity-reaction-deleted.test.ts +14 -14
  36. package/src/feed/event-handlers/activity/handle-activity-unpinned.test.ts +4 -3
  37. package/src/feed/event-handlers/activity/handle-activity-updated.test.ts +4 -4
  38. package/src/feed/event-handlers/activity/index.ts +2 -1
  39. package/src/feed/event-handlers/bookmark/handle-bookmark-added.test.ts +14 -14
  40. package/src/feed/event-handlers/bookmark/handle-bookmark-deleted.test.ts +14 -14
  41. package/src/feed/event-handlers/bookmark/handle-bookmark-updated.test.ts +16 -16
  42. package/src/feed/event-handlers/comment/handle-comment-added.test.ts +147 -0
  43. package/src/feed/event-handlers/comment/handle-comment-deleted.test.ts +133 -0
  44. package/src/feed/event-handlers/comment/handle-comment-deleted.ts +24 -10
  45. package/src/feed/event-handlers/comment/handle-comment-reaction.test.ts +315 -0
  46. package/src/feed/event-handlers/comment/handle-comment-updated.test.ts +131 -0
  47. package/src/feed/event-handlers/follow/handle-follow-created.test.ts +7 -7
  48. package/src/feed/event-handlers/follow/handle-follow-deleted.test.ts +2 -2
  49. package/src/feed/event-handlers/follow/handle-follow-updated.test.ts +1 -1
  50. package/src/feed/event-handlers/notification-feed/handle-notification-feed-updated.test.ts +120 -0
  51. package/src/feed/event-handlers/notification-feed/handle-notification-feed-updated.ts +47 -3
  52. package/src/feed/feed.ts +4 -2
  53. package/src/gen/model-decoders/decoders.ts +1 -1
  54. package/src/test-utils/response-generators.ts +123 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stream-io/feeds-client",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "packageManager": "yarn@3.2.4",
5
5
  "main": "./dist/index.node.js",
6
6
  "exports": {
@@ -0,0 +1,208 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import {
3
+ ActivityMarkEvent,
4
+ NotificationStatusResponse,
5
+ } from '../../../gen/models';
6
+ import { updateNotificationStatusFromActivityMarked } from './handle-activity-marked';
7
+
8
+ const createMockActivityMarkEvent = (
9
+ overrides: Partial<ActivityMarkEvent> = {},
10
+ ): ActivityMarkEvent => ({
11
+ created_at: new Date(),
12
+ fid: 'user:notification',
13
+ custom: {},
14
+ type: 'feeds.activity.marked',
15
+ ...overrides,
16
+ });
17
+
18
+ const createMockNotificationStatus = (
19
+ overrides: Partial<NotificationStatusResponse> = {},
20
+ ): NotificationStatusResponse => ({
21
+ unread: 0,
22
+ unseen: 0,
23
+ ...overrides,
24
+ });
25
+
26
+ const createMockAggregatedActivity = (group: string) => ({ group });
27
+
28
+ describe('activity-marked-utils', () => {
29
+ describe('updateNotificationStatusFromActivityMarked', () => {
30
+ it('should return unchanged if notification_status is undefined', () => {
31
+ const event = createMockActivityMarkEvent({ mark_all_read: true });
32
+ const currentStatus = undefined;
33
+
34
+ const result = updateNotificationStatusFromActivityMarked(
35
+ event,
36
+ currentStatus,
37
+ );
38
+
39
+ expect(result.changed).toBe(false);
40
+ });
41
+
42
+ it('should handle mark_all_read by adding all aggregated activity groups', () => {
43
+ const event = createMockActivityMarkEvent({ mark_all_read: true });
44
+ const currentStatus = createMockNotificationStatus({
45
+ read_activities: ['existing1'],
46
+ });
47
+ const aggregatedActivities = [
48
+ createMockAggregatedActivity('group1'),
49
+ createMockAggregatedActivity('group2'),
50
+ createMockAggregatedActivity('group3'),
51
+ ];
52
+
53
+ const result = updateNotificationStatusFromActivityMarked(
54
+ event,
55
+ currentStatus,
56
+ aggregatedActivities,
57
+ );
58
+
59
+ expect(result.changed).toBe(true);
60
+ expect(result.data?.notification_status.read_activities).toEqual([
61
+ 'existing1',
62
+ 'group1',
63
+ 'group2',
64
+ 'group3',
65
+ ]);
66
+ });
67
+
68
+ it('should handle mark_read by adding specific activity IDs', () => {
69
+ const event = createMockActivityMarkEvent({
70
+ mark_read: ['activity1', 'activity2'],
71
+ });
72
+ const currentStatus = createMockNotificationStatus({
73
+ read_activities: ['existing1'],
74
+ });
75
+
76
+ const result = updateNotificationStatusFromActivityMarked(
77
+ event,
78
+ currentStatus,
79
+ );
80
+
81
+ expect(result.changed).toBe(true);
82
+ expect(result.data?.notification_status.read_activities).toEqual([
83
+ 'existing1',
84
+ 'activity1',
85
+ 'activity2',
86
+ ]);
87
+ });
88
+
89
+ it('should handle mark_all_seen by setting last_seen_at to current date', () => {
90
+ const event = createMockActivityMarkEvent({ mark_all_seen: true });
91
+ const currentStatus = createMockNotificationStatus({
92
+ last_seen_at: new Date('2023-01-01'),
93
+ });
94
+
95
+ const result = updateNotificationStatusFromActivityMarked(
96
+ event,
97
+ currentStatus,
98
+ );
99
+
100
+ expect(result.changed).toBe(true);
101
+ expect(result.data?.notification_status.last_seen_at).toBeInstanceOf(
102
+ Date,
103
+ );
104
+ expect(
105
+ result.data?.notification_status.last_seen_at!.getTime(),
106
+ ).toBeGreaterThan(new Date('2023-01-01').getTime());
107
+ });
108
+
109
+ it('should handle multiple mark flags simultaneously', () => {
110
+ const event = createMockActivityMarkEvent({
111
+ mark_all_read: true,
112
+ mark_all_seen: true,
113
+ });
114
+ const currentStatus = createMockNotificationStatus({
115
+ read_activities: ['existing1'],
116
+ last_seen_at: new Date('2023-01-01'),
117
+ });
118
+ const aggregatedActivities = [
119
+ createMockAggregatedActivity('group1'),
120
+ createMockAggregatedActivity('group2'),
121
+ ];
122
+
123
+ const result = updateNotificationStatusFromActivityMarked(
124
+ event,
125
+ currentStatus,
126
+ aggregatedActivities,
127
+ );
128
+
129
+ expect(result.changed).toBe(true);
130
+ expect(result.data?.notification_status.read_activities).toEqual([
131
+ 'existing1',
132
+ 'group1',
133
+ 'group2',
134
+ ]);
135
+ expect(result.data?.notification_status.last_seen_at).toBeInstanceOf(
136
+ Date,
137
+ );
138
+ });
139
+
140
+ it('should deduplicate read activities when adding new ones', () => {
141
+ const event = createMockActivityMarkEvent({
142
+ mark_read: ['activity1', 'activity1', 'activity2'],
143
+ });
144
+ const currentStatus = createMockNotificationStatus({
145
+ read_activities: ['existing1', 'activity1'],
146
+ });
147
+
148
+ const result = updateNotificationStatusFromActivityMarked(
149
+ event,
150
+ currentStatus,
151
+ );
152
+
153
+ expect(result.changed).toBe(true);
154
+ expect(result.data?.notification_status.read_activities).toEqual([
155
+ 'existing1',
156
+ 'activity1',
157
+ 'activity2',
158
+ ]);
159
+ });
160
+
161
+ it('should preserve existing notification status fields', () => {
162
+ const event = createMockActivityMarkEvent({ mark_all_seen: true });
163
+ const currentStatus = createMockNotificationStatus({
164
+ unread: 5,
165
+ unseen: 3,
166
+ read_activities: ['existing1'],
167
+ });
168
+
169
+ const result = updateNotificationStatusFromActivityMarked(
170
+ event,
171
+ currentStatus,
172
+ );
173
+
174
+ expect(result.changed).toBe(true);
175
+ expect(result.data?.notification_status.unread).toBe(5);
176
+ expect(result.data?.notification_status.unseen).toBe(3);
177
+ expect(result.data?.notification_status.read_activities).toEqual([
178
+ 'existing1',
179
+ ]);
180
+ expect(result.data?.notification_status.last_seen_at).toBeInstanceOf(
181
+ Date,
182
+ );
183
+ });
184
+
185
+ it('should handle mark_all_read with no existing read_activities', () => {
186
+ const event = createMockActivityMarkEvent({ mark_all_read: true });
187
+ const currentStatus = createMockNotificationStatus({
188
+ read_activities: undefined,
189
+ });
190
+ const aggregatedActivities = [
191
+ createMockAggregatedActivity('group1'),
192
+ createMockAggregatedActivity('group2'),
193
+ ];
194
+
195
+ const result = updateNotificationStatusFromActivityMarked(
196
+ event,
197
+ currentStatus,
198
+ aggregatedActivities,
199
+ );
200
+
201
+ expect(result.changed).toBe(true);
202
+ expect(result.data?.notification_status.read_activities).toEqual([
203
+ 'group1',
204
+ 'group2',
205
+ ]);
206
+ });
207
+ });
208
+ });
@@ -0,0 +1,68 @@
1
+ import {
2
+ ActivityMarkEvent,
3
+ NotificationStatusResponse,
4
+ } from '../../../gen/models';
5
+ import { EventPayload, UpdateStateResult } from '../../../types-internal';
6
+ import { Feed } from '../../feed';
7
+
8
+ export const updateNotificationStatusFromActivityMarked = (
9
+ event: ActivityMarkEvent,
10
+ currentNotificationStatus: NotificationStatusResponse | undefined,
11
+ aggregatedActivities: Array<{ group: string }> = [],
12
+ ): UpdateStateResult<{
13
+ data?: { notification_status: NotificationStatusResponse };
14
+ }> => {
15
+ if (!currentNotificationStatus) {
16
+ return {
17
+ changed: false,
18
+ };
19
+ }
20
+
21
+ const newState = {
22
+ ...currentNotificationStatus,
23
+ };
24
+
25
+ if (event.mark_all_read) {
26
+ const allGroupIds = aggregatedActivities.map((activity) => activity.group);
27
+ newState.read_activities = [
28
+ ...new Set([
29
+ ...(currentNotificationStatus.read_activities ?? []),
30
+ ...allGroupIds,
31
+ ]),
32
+ ];
33
+ }
34
+
35
+ if (event.mark_read && event.mark_read.length > 0) {
36
+ newState.read_activities = [
37
+ ...new Set([
38
+ ...(currentNotificationStatus?.read_activities ?? []),
39
+ ...event.mark_read,
40
+ ]),
41
+ ];
42
+ }
43
+
44
+ if (event.mark_all_seen) {
45
+ newState.last_seen_at = new Date();
46
+ }
47
+
48
+ return {
49
+ changed: true,
50
+ data: { notification_status: newState },
51
+ };
52
+ };
53
+
54
+ export function handleActivityMarked(
55
+ this: Feed,
56
+ event: EventPayload<'feeds.activity.marked'>,
57
+ ) {
58
+ const result = updateNotificationStatusFromActivityMarked(
59
+ event,
60
+ this.currentState.notification_status,
61
+ this.currentState.aggregated_activities,
62
+ );
63
+ if (result.changed) {
64
+ this.state.partialNext({
65
+ notification_status: result.data?.notification_status,
66
+ });
67
+ }
68
+ }
@@ -58,8 +58,8 @@ describe(handleActivityReactionAdded.name, () => {
58
58
 
59
59
  const stateBefore = feed.currentState;
60
60
 
61
- expect(stateBefore.activities![0].reaction_count).toEqual(0);
62
- expect(stateBefore.pinned_activities![0].activity.reaction_count).toEqual(
61
+ expect(stateBefore.activities![0].reaction_count).toBe(0);
62
+ expect(stateBefore.pinned_activities![0].activity.reaction_count).toBe(
63
63
  0,
64
64
  );
65
65
 
@@ -71,14 +71,14 @@ describe(handleActivityReactionAdded.name, () => {
71
71
  expect(stateAfter.pinned_activities![0].activity.own_reactions).toContain(
72
72
  event.reaction,
73
73
  );
74
- expect(stateAfter.activities![0].own_bookmarks).toEqual(
74
+ expect(stateAfter.activities![0].own_bookmarks).toBe(
75
75
  stateBefore.activities![0].own_bookmarks,
76
76
  );
77
- expect(stateAfter.pinned_activities![0].activity.own_bookmarks).toEqual(
77
+ expect(stateAfter.pinned_activities![0].activity.own_bookmarks).toBe(
78
78
  stateBefore.pinned_activities![0].activity.own_bookmarks,
79
79
  );
80
- expect(stateAfter.activities![0].reaction_count).toEqual(1);
81
- expect(stateAfter.pinned_activities![0].activity.reaction_count).toEqual(1);
80
+ expect(stateAfter.activities![0].reaction_count).toBe(1);
81
+ expect(stateAfter.pinned_activities![0].activity.reaction_count).toBe(1);
82
82
  });
83
83
 
84
84
  it('does not add to own_reactions if reaction is from another user but still updates activity', () => {
@@ -102,8 +102,8 @@ describe(handleActivityReactionAdded.name, () => {
102
102
 
103
103
  const stateBefore = feed.currentState;
104
104
 
105
- expect(stateBefore.activities![0].reaction_count).toEqual(0);
106
- expect(stateBefore.pinned_activities![0].activity.reaction_count).toEqual(
105
+ expect(stateBefore.activities![0].reaction_count).toBe(0);
106
+ expect(stateBefore.pinned_activities![0].activity.reaction_count).toBe(
107
107
  0,
108
108
  );
109
109
 
@@ -115,18 +115,18 @@ describe(handleActivityReactionAdded.name, () => {
115
115
  expect(
116
116
  stateAfter.pinned_activities![0].activity.own_reactions,
117
117
  ).toHaveLength(0);
118
- expect(stateAfter.activities![0].reaction_count).toEqual(1);
119
- expect(stateAfter.pinned_activities![0].activity.reaction_count).toEqual(1);
120
- expect(stateAfter.activities![0].own_bookmarks).toEqual(
118
+ expect(stateAfter.activities![0].reaction_count).toBe(1);
119
+ expect(stateAfter.pinned_activities![0].activity.reaction_count).toBe(1);
120
+ expect(stateAfter.activities![0].own_bookmarks).toBe(
121
121
  stateBefore.activities![0].own_bookmarks,
122
122
  );
123
- expect(stateAfter.pinned_activities![0].activity.own_bookmarks).toEqual(
123
+ expect(stateAfter.pinned_activities![0].activity.own_bookmarks).toBe(
124
124
  stateBefore.pinned_activities![0].activity.own_bookmarks,
125
125
  );
126
- expect(stateAfter.activities![0].own_reactions).toEqual(
126
+ expect(stateAfter.activities![0].own_reactions).toBe(
127
127
  stateBefore.activities![0].own_reactions,
128
128
  );
129
- expect(stateAfter.pinned_activities![0].activity.own_reactions).toEqual(
129
+ expect(stateAfter.pinned_activities![0].activity.own_reactions).toBe(
130
130
  stateBefore.pinned_activities![0].activity.own_reactions,
131
131
  );
132
132
  });
@@ -152,6 +152,6 @@ describe(handleActivityReactionAdded.name, () => {
152
152
 
153
153
  const stateAfter = feed.currentState;
154
154
 
155
- expect(stateAfter).toEqual(stateBefore);
155
+ expect(stateAfter).toBe(stateBefore);
156
156
  });
157
157
  });
@@ -72,8 +72,8 @@ describe(handleActivityReactionDeleted.name, () => {
72
72
  expect(
73
73
  stateBefore.pinned_activities![0].activity.own_reactions,
74
74
  ).toHaveLength(1);
75
- expect(stateBefore.activities![0].reaction_count).toEqual(1);
76
- expect(stateBefore.pinned_activities![0].activity.reaction_count).toEqual(
75
+ expect(stateBefore.activities![0].reaction_count).toBe(1);
76
+ expect(stateBefore.pinned_activities![0].activity.reaction_count).toBe(
77
77
  1,
78
78
  );
79
79
 
@@ -84,12 +84,12 @@ describe(handleActivityReactionDeleted.name, () => {
84
84
  expect(
85
85
  stateAfter.pinned_activities![0].activity.own_reactions,
86
86
  ).toHaveLength(0);
87
- expect(stateAfter.activities![0].reaction_count).toEqual(0);
88
- expect(stateAfter.pinned_activities![0].activity.reaction_count).toEqual(0);
89
- expect(stateAfter.activities![0].own_bookmarks).toEqual(
87
+ expect(stateAfter.activities![0].reaction_count).toBe(0);
88
+ expect(stateAfter.pinned_activities![0].activity.reaction_count).toBe(0);
89
+ expect(stateAfter.activities![0].own_bookmarks).toBe(
90
90
  stateBefore.activities![0].own_bookmarks,
91
91
  );
92
- expect(stateAfter.pinned_activities![0].activity.own_bookmarks).toEqual(
92
+ expect(stateAfter.pinned_activities![0].activity.own_bookmarks).toBe(
93
93
  stateBefore.pinned_activities![0].activity.own_bookmarks,
94
94
  );
95
95
  });
@@ -130,8 +130,8 @@ describe(handleActivityReactionDeleted.name, () => {
130
130
  expect(
131
131
  stateBefore.pinned_activities![0].activity.own_reactions,
132
132
  ).toHaveLength(1);
133
- expect(stateBefore.activities![0].reaction_count).toEqual(1);
134
- expect(stateBefore.pinned_activities![0].activity.reaction_count).toEqual(
133
+ expect(stateBefore.activities![0].reaction_count).toBe(1);
134
+ expect(stateBefore.pinned_activities![0].activity.reaction_count).toBe(
135
135
  1,
136
136
  );
137
137
 
@@ -139,23 +139,23 @@ describe(handleActivityReactionDeleted.name, () => {
139
139
 
140
140
  const stateAfter = feed.currentState;
141
141
  expect(stateAfter.activities![0].own_reactions).toHaveLength(1);
142
- expect(stateAfter.activities![0].own_reactions).toEqual(
142
+ expect(stateAfter.activities![0].own_reactions).toBe(
143
143
  stateBefore.activities![0].own_reactions,
144
144
  );
145
- expect(stateAfter.pinned_activities![0].activity.own_reactions).toEqual(
145
+ expect(stateAfter.pinned_activities![0].activity.own_reactions).toBe(
146
146
  stateBefore.pinned_activities![0].activity.own_reactions,
147
147
  );
148
- expect(stateAfter.activities![0].own_bookmarks).toEqual(
148
+ expect(stateAfter.activities![0].own_bookmarks).toBe(
149
149
  stateBefore.activities![0].own_bookmarks,
150
150
  );
151
- expect(stateAfter.pinned_activities![0].activity.own_bookmarks).toEqual(
151
+ expect(stateAfter.pinned_activities![0].activity.own_bookmarks).toBe(
152
152
  stateBefore.pinned_activities![0].activity.own_bookmarks,
153
153
  );
154
154
  expect(
155
155
  stateAfter.pinned_activities![0].activity.own_reactions,
156
156
  ).toHaveLength(1);
157
- expect(stateAfter.activities![0].reaction_count).toEqual(0);
158
- expect(stateAfter.pinned_activities![0].activity.reaction_count).toEqual(0);
157
+ expect(stateAfter.activities![0].reaction_count).toBe(0);
158
+ expect(stateAfter.pinned_activities![0].activity.reaction_count).toBe(0);
159
159
  });
160
160
 
161
161
  it('does nothing if activity is not found', () => {
@@ -22,7 +22,7 @@ function makeUnpinnedEvent(
22
22
  pinned_activity: {
23
23
  created_at: pinnedActivity.created_at,
24
24
  duration: '0',
25
- fid: pinnedActivity.feed,
25
+ feed: pinnedActivity.feed,
26
26
  user_id: pinnedActivity.user.id,
27
27
  activity: pinnedActivity.activity,
28
28
  },
@@ -67,7 +67,7 @@ describe(handleActivityUnpinned.name, () => {
67
67
  const stateBefore = feed.currentState;
68
68
  handleActivityUnpinned.call(feed, event);
69
69
  const stateAfter = feed.currentState;
70
- expect(stateAfter.pinned_activities).toEqual(stateBefore.pinned_activities);
70
+ expect(stateAfter.pinned_activities).toBe(stateBefore.pinned_activities);
71
71
  });
72
72
 
73
73
  it('does nothing if pinned_activities is empty', () => {
@@ -76,9 +76,10 @@ describe(handleActivityUnpinned.name, () => {
76
76
  pinned_activities: [],
77
77
  }));
78
78
  const event = makeUnpinnedEvent(pinnedActivity);
79
+ const stateBefore = feed.currentState;
79
80
  handleActivityUnpinned.call(feed, event);
80
81
  const stateAfter = feed.currentState;
81
- expect(stateAfter.pinned_activities).toEqual([]);
82
+ expect(stateAfter).toBe(stateBefore);
82
83
  });
83
84
 
84
85
  it('does nothing if pinned_activities is undefined', () => {
@@ -77,16 +77,16 @@ describe(handleActivityUpdated.name, () => {
77
77
  id: 'activity-1',
78
78
  text: 'updated text',
79
79
  });
80
- expect(stateAfter.activities![0].own_reactions).toEqual(
80
+ expect(stateAfter.activities![0].own_reactions).toBe(
81
81
  stateBefore.activities![0].own_reactions,
82
82
  );
83
- expect(stateAfter.activities![0].own_bookmarks).toEqual(
83
+ expect(stateAfter.activities![0].own_bookmarks).toBe(
84
84
  stateBefore.activities![0].own_bookmarks,
85
85
  );
86
- expect(stateAfter.pinned_activities![0].activity.own_reactions).toEqual(
86
+ expect(stateAfter.pinned_activities![0].activity.own_reactions).toBe(
87
87
  stateBefore.pinned_activities![0].activity.own_reactions,
88
88
  );
89
- expect(stateAfter.pinned_activities![0].activity.own_bookmarks).toEqual(
89
+ expect(stateAfter.pinned_activities![0].activity.own_bookmarks).toBe(
90
90
  stateBefore.pinned_activities![0].activity.own_bookmarks,
91
91
  );
92
92
  });
@@ -3,4 +3,5 @@ export * from './handle-activity-deleted';
3
3
  export * from './handle-activity-removed-from-feed';
4
4
  export * from './handle-activity-updated';
5
5
  export * from './handle-activity-reaction-added';
6
- export * from './handle-activity-reaction-deleted';
6
+ export * from './handle-activity-reaction-deleted';
7
+ export * from './handle-activity-marked';
@@ -65,8 +65,8 @@ describe(handleBookmarkAdded.name, () => {
65
65
  expect(
66
66
  stateBefore.pinned_activities![0].activity.own_bookmarks,
67
67
  ).toHaveLength(0);
68
- expect(stateBefore.activities![0].bookmark_count).toEqual(0);
69
- expect(stateBefore.pinned_activities![0].activity.bookmark_count).toEqual(
68
+ expect(stateBefore.activities![0].bookmark_count).toBe(0);
69
+ expect(stateBefore.pinned_activities![0].activity.bookmark_count).toBe(
70
70
  0,
71
71
  );
72
72
 
@@ -81,14 +81,14 @@ describe(handleBookmarkAdded.name, () => {
81
81
  expect(stateAfter.pinned_activities![0].activity.own_bookmarks).toContain(
82
82
  event.bookmark,
83
83
  );
84
- expect(stateAfter.activities![0].own_reactions).toEqual(
84
+ expect(stateAfter.activities![0].own_reactions).toBe(
85
85
  stateBefore.activities![0].own_reactions,
86
86
  );
87
- expect(stateAfter.pinned_activities![0].activity.own_reactions).toEqual(
87
+ expect(stateAfter.pinned_activities![0].activity.own_reactions).toBe(
88
88
  stateBefore.pinned_activities![0].activity.own_reactions,
89
89
  );
90
- expect(stateAfter.activities![0].bookmark_count).toEqual(1);
91
- expect(stateAfter.pinned_activities![0].activity.bookmark_count).toEqual(1);
90
+ expect(stateAfter.activities![0].bookmark_count).toBe(1);
91
+ expect(stateAfter.pinned_activities![0].activity.bookmark_count).toBe(1);
92
92
  });
93
93
 
94
94
  it('does not add to own_bookmarks if bookmark is from another user but still updates activity', () => {
@@ -120,28 +120,28 @@ describe(handleBookmarkAdded.name, () => {
120
120
  expect(
121
121
  stateBefore.pinned_activities![0].activity.own_bookmarks,
122
122
  ).toHaveLength(0);
123
- expect(stateBefore.activities![0].bookmark_count).toEqual(0);
124
- expect(stateBefore.pinned_activities![0].activity.bookmark_count).toEqual(
123
+ expect(stateBefore.activities![0].bookmark_count).toBe(0);
124
+ expect(stateBefore.pinned_activities![0].activity.bookmark_count).toBe(
125
125
  0,
126
126
  );
127
127
 
128
128
  handleBookmarkAdded.call(feed, event);
129
129
 
130
130
  const stateAfter = feed.currentState;
131
- expect(stateAfter.activities![0].own_bookmarks).toEqual(
131
+ expect(stateAfter.activities![0].own_bookmarks).toBe(
132
132
  stateBefore.activities![0].own_bookmarks,
133
133
  );
134
- expect(stateAfter.pinned_activities![0].activity.own_bookmarks).toEqual(
134
+ expect(stateAfter.pinned_activities![0].activity.own_bookmarks).toBe(
135
135
  stateBefore.pinned_activities![0].activity.own_bookmarks,
136
136
  );
137
- expect(stateAfter.activities![0].own_reactions).toEqual(
137
+ expect(stateAfter.activities![0].own_reactions).toBe(
138
138
  stateBefore.activities![0].own_reactions,
139
139
  );
140
- expect(stateAfter.pinned_activities![0].activity.own_reactions).toEqual(
140
+ expect(stateAfter.pinned_activities![0].activity.own_reactions).toBe(
141
141
  stateBefore.pinned_activities![0].activity.own_reactions,
142
142
  );
143
- expect(stateAfter.activities![0].bookmark_count).toEqual(1);
144
- expect(stateAfter.pinned_activities![0].activity.bookmark_count).toEqual(1);
143
+ expect(stateAfter.activities![0].bookmark_count).toBe(1);
144
+ expect(stateAfter.pinned_activities![0].activity.bookmark_count).toBe(1);
145
145
  });
146
146
 
147
147
  it('does nothing if activity is not found', () => {
@@ -71,8 +71,8 @@ describe(handleBookmarkDeleted.name, () => {
71
71
  expect(
72
72
  stateBefore.pinned_activities![0].activity.own_bookmarks,
73
73
  ).toHaveLength(1);
74
- expect(stateBefore.activities![0].bookmark_count).toEqual(1);
75
- expect(stateBefore.pinned_activities![0].activity.bookmark_count).toEqual(
74
+ expect(stateBefore.activities![0].bookmark_count).toBe(1);
75
+ expect(stateBefore.pinned_activities![0].activity.bookmark_count).toBe(
76
76
  1,
77
77
  );
78
78
 
@@ -83,14 +83,14 @@ describe(handleBookmarkDeleted.name, () => {
83
83
  expect(
84
84
  stateAfter.pinned_activities![0].activity.own_bookmarks,
85
85
  ).toHaveLength(0);
86
- expect(stateAfter.activities![0].own_reactions).toEqual(
86
+ expect(stateAfter.activities![0].own_reactions).toBe(
87
87
  stateBefore.activities![0].own_reactions,
88
88
  );
89
- expect(stateAfter.pinned_activities![0].activity.own_reactions).toEqual(
89
+ expect(stateAfter.pinned_activities![0].activity.own_reactions).toBe(
90
90
  stateBefore.pinned_activities![0].activity.own_reactions,
91
91
  );
92
- expect(stateAfter.activities![0].bookmark_count).toEqual(0);
93
- expect(stateAfter.pinned_activities![0].activity.bookmark_count).toEqual(0);
92
+ expect(stateAfter.activities![0].bookmark_count).toBe(0);
93
+ expect(stateAfter.pinned_activities![0].activity.bookmark_count).toBe(0);
94
94
  });
95
95
 
96
96
  it('does not remove from own_bookmarks if bookmark is from another user but still updates activity', () => {
@@ -127,28 +127,28 @@ describe(handleBookmarkDeleted.name, () => {
127
127
  expect(
128
128
  stateBefore.pinned_activities![0].activity.own_bookmarks,
129
129
  ).toHaveLength(1);
130
- expect(stateBefore.activities![0].bookmark_count).toEqual(1);
131
- expect(stateBefore.pinned_activities![0].activity.bookmark_count).toEqual(
130
+ expect(stateBefore.activities![0].bookmark_count).toBe(1);
131
+ expect(stateBefore.pinned_activities![0].activity.bookmark_count).toBe(
132
132
  1,
133
133
  );
134
134
 
135
135
  handleBookmarkDeleted.call(feed, event);
136
136
 
137
137
  const stateAfter = feed.currentState;
138
- expect(stateAfter.activities![0].own_bookmarks).toEqual(
138
+ expect(stateAfter.activities![0].own_bookmarks).toBe(
139
139
  stateBefore.activities![0].own_bookmarks,
140
140
  );
141
- expect(stateAfter.pinned_activities![0].activity.own_bookmarks).toEqual(
141
+ expect(stateAfter.pinned_activities![0].activity.own_bookmarks).toBe(
142
142
  stateBefore.pinned_activities![0].activity.own_bookmarks,
143
143
  );
144
- expect(stateAfter.activities![0].own_reactions).toEqual(
144
+ expect(stateAfter.activities![0].own_reactions).toBe(
145
145
  stateBefore.activities![0].own_reactions,
146
146
  );
147
- expect(stateAfter.pinned_activities![0].activity.own_reactions).toEqual(
147
+ expect(stateAfter.pinned_activities![0].activity.own_reactions).toBe(
148
148
  stateBefore.pinned_activities![0].activity.own_reactions,
149
149
  );
150
- expect(stateAfter.activities![0].bookmark_count).toEqual(0);
151
- expect(stateAfter.pinned_activities![0].activity.bookmark_count).toEqual(0);
150
+ expect(stateAfter.activities![0].bookmark_count).toBe(0);
151
+ expect(stateAfter.pinned_activities![0].activity.bookmark_count).toBe(0);
152
152
  });
153
153
 
154
154
  it('does nothing if activity is not found', () => {