@stream-io/feeds-client 0.2.1 → 0.2.3

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 (92) hide show
  1. package/@react-bindings/hooks/feed-state-hooks/index.ts +4 -0
  2. package/CHANGELOG.md +16 -0
  3. package/dist/@react-bindings/contexts/StreamSearchContext.d.ts +1 -1
  4. package/dist/@react-bindings/contexts/StreamSearchResultsContext.d.ts +1 -1
  5. package/dist/@react-bindings/hooks/feed-state-hooks/index.d.ts +4 -0
  6. package/dist/@react-bindings/hooks/feed-state-hooks/useAggregatedActivities.d.ts +11 -0
  7. package/dist/@react-bindings/hooks/feed-state-hooks/useIsAggregatedActivityRead.d.ts +6 -0
  8. package/dist/@react-bindings/hooks/feed-state-hooks/useIsAggregatedActivitySeen.d.ts +6 -0
  9. package/dist/@react-bindings/hooks/feed-state-hooks/useNotificationStatus.d.ts +13 -0
  10. package/dist/@react-bindings/hooks/search-state-hooks/useSearchQuery.d.ts +1 -1
  11. package/dist/@react-bindings/hooks/search-state-hooks/useSearchResult.d.ts +1 -1
  12. package/dist/@react-bindings/hooks/search-state-hooks/useSearchSources.d.ts +2 -2
  13. package/dist/@react-bindings/wrappers/StreamFeed.d.ts +1 -1
  14. package/dist/@react-bindings/wrappers/StreamSearch.d.ts +1 -1
  15. package/dist/@react-bindings/wrappers/StreamSearchResults.d.ts +1 -1
  16. package/dist/index-react-bindings.browser.cjs +178 -35
  17. package/dist/index-react-bindings.browser.cjs.map +1 -1
  18. package/dist/index-react-bindings.browser.js +175 -36
  19. package/dist/index-react-bindings.browser.js.map +1 -1
  20. package/dist/index-react-bindings.node.cjs +178 -35
  21. package/dist/index-react-bindings.node.cjs.map +1 -1
  22. package/dist/index-react-bindings.node.js +175 -36
  23. package/dist/index-react-bindings.node.js.map +1 -1
  24. package/dist/index.browser.cjs +328 -180
  25. package/dist/index.browser.cjs.map +1 -1
  26. package/dist/index.browser.js +328 -181
  27. package/dist/index.browser.js.map +1 -1
  28. package/dist/index.d.ts +1 -5
  29. package/dist/index.node.cjs +328 -180
  30. package/dist/index.node.cjs.map +1 -1
  31. package/dist/index.node.js +328 -181
  32. package/dist/index.node.js.map +1 -1
  33. package/dist/src/common/{ActivitySearchSource.d.ts → search/ActivitySearchSource.d.ts} +3 -3
  34. package/dist/src/common/{BaseSearchSource.d.ts → search/BaseSearchSource.d.ts} +41 -35
  35. package/dist/src/common/{FeedSearchSource.d.ts → search/FeedSearchSource.d.ts} +3 -3
  36. package/dist/src/common/{SearchController.d.ts → search/SearchController.d.ts} +1 -3
  37. package/dist/src/common/{UserSearchSource.d.ts → search/UserSearchSource.d.ts} +4 -4
  38. package/dist/src/common/search/index.d.ts +6 -0
  39. package/dist/src/common/search/types.d.ts +22 -0
  40. package/dist/src/common/types.d.ts +1 -0
  41. package/dist/src/feed/event-handlers/activity/handle-activity-deleted.d.ts +5 -12
  42. package/dist/src/feed/event-handlers/activity/handle-activity-marked.d.ts +11 -0
  43. package/dist/src/feed/event-handlers/activity/index.d.ts +1 -0
  44. package/dist/src/feed/event-handlers/notification-feed/handle-notification-feed-updated.d.ts +8 -1
  45. package/dist/src/feed/feed.d.ts +2 -2
  46. package/dist/src/gen/models/index.d.ts +58 -26
  47. package/dist/tsconfig.tsbuildinfo +1 -1
  48. package/index.ts +1 -5
  49. package/package.json +1 -1
  50. package/src/common/{ActivitySearchSource.ts → search/ActivitySearchSource.ts} +3 -3
  51. package/src/common/{BaseSearchSource.ts → search/BaseSearchSource.ts} +137 -69
  52. package/src/common/{FeedSearchSource.ts → search/FeedSearchSource.ts} +3 -3
  53. package/src/common/{SearchController.ts → search/SearchController.ts} +2 -7
  54. package/src/common/{UserSearchSource.ts → search/UserSearchSource.ts} +3 -3
  55. package/src/common/search/index.ts +6 -0
  56. package/src/common/search/types.ts +21 -0
  57. package/src/common/types.ts +2 -0
  58. package/src/feed/event-handlers/activity/activity-marked-utils.test.ts +208 -0
  59. package/src/feed/event-handlers/activity/activity-utils.test.ts +2 -2
  60. package/src/feed/event-handlers/activity/handle-activity-added.test.ts +86 -0
  61. package/src/feed/event-handlers/activity/handle-activity-deleted.test.ts +117 -0
  62. package/src/feed/event-handlers/activity/handle-activity-deleted.ts +8 -4
  63. package/src/feed/event-handlers/activity/handle-activity-marked.ts +68 -0
  64. package/src/feed/event-handlers/activity/handle-activity-reaction-added.test.ts +15 -15
  65. package/src/feed/event-handlers/activity/handle-activity-reaction-deleted.test.ts +14 -14
  66. package/src/feed/event-handlers/activity/handle-activity-unpinned.test.ts +4 -3
  67. package/src/feed/event-handlers/activity/handle-activity-updated.test.ts +4 -4
  68. package/src/feed/event-handlers/activity/index.ts +2 -1
  69. package/src/feed/event-handlers/bookmark/handle-bookmark-added.test.ts +14 -14
  70. package/src/feed/event-handlers/bookmark/handle-bookmark-deleted.test.ts +14 -14
  71. package/src/feed/event-handlers/bookmark/handle-bookmark-updated.test.ts +16 -16
  72. package/src/feed/event-handlers/comment/handle-comment-added.test.ts +147 -0
  73. package/src/feed/event-handlers/comment/handle-comment-deleted.test.ts +133 -0
  74. package/src/feed/event-handlers/comment/handle-comment-deleted.ts +24 -10
  75. package/src/feed/event-handlers/comment/handle-comment-reaction.test.ts +315 -0
  76. package/src/feed/event-handlers/comment/handle-comment-updated.test.ts +131 -0
  77. package/src/feed/event-handlers/feed-member/handle-feed-member-added.test.ts +75 -0
  78. package/src/feed/event-handlers/feed-member/handle-feed-member-removed.test.ts +82 -0
  79. package/src/feed/event-handlers/feed-member/handle-feed-member-removed.ts +19 -9
  80. package/src/feed/event-handlers/feed-member/handle-feed-member-updated.test.ts +84 -0
  81. package/src/feed/event-handlers/follow/handle-follow-created.test.ts +7 -7
  82. package/src/feed/event-handlers/follow/handle-follow-deleted.test.ts +2 -2
  83. package/src/feed/event-handlers/follow/handle-follow-updated.test.ts +1 -1
  84. package/src/feed/event-handlers/notification-feed/handle-notification-feed-updated.test.ts +120 -0
  85. package/src/feed/event-handlers/notification-feed/handle-notification-feed-updated.ts +47 -3
  86. package/src/feed/feed.ts +4 -2
  87. package/src/gen/feeds/FeedsApi.ts +6 -0
  88. package/src/gen/model-decoders/decoders.ts +12 -0
  89. package/src/gen/models/index.ts +90 -34
  90. package/src/test-utils/response-generators.ts +230 -0
  91. package/dist/src/test-utils/index.d.ts +0 -1
  92. package/dist/src/test-utils/response-generators.d.ts +0 -54
@@ -0,0 +1,84 @@
1
+ import { beforeEach, describe, expect, it } from 'vitest';
2
+ import { Feed } from '../../../feed';
3
+ import { FeedsClient } from '../../../feeds-client';
4
+ import { handleFeedMemberUpdated } from './handle-feed-member-updated';
5
+ import {
6
+ generateFeedResponse,
7
+ generateFeedMemberUpdatedEvent,
8
+ generateFeedMemberResponse,
9
+ generateOwnUser,
10
+ getHumanId,
11
+ } from '../../../test-utils/response-generators';
12
+
13
+ describe(handleFeedMemberUpdated.name, () => {
14
+ let feed: Feed;
15
+ let client: FeedsClient;
16
+ let currentUserId: string;
17
+
18
+ beforeEach(() => {
19
+ client = new FeedsClient('mock-api-key');
20
+ currentUserId = getHumanId();
21
+ client.state.partialNext({
22
+ connected_user: generateOwnUser({ id: currentUserId }),
23
+ });
24
+ const feedResponse = generateFeedResponse({
25
+ id: 'main',
26
+ group_id: 'user',
27
+ created_by: { id: currentUserId },
28
+ });
29
+ feed = new Feed(
30
+ client,
31
+ feedResponse.group_id,
32
+ feedResponse.id,
33
+ feedResponse,
34
+ );
35
+ });
36
+
37
+ it('updates an existing member in members array', () => {
38
+ const member1 = generateFeedMemberResponse();
39
+ const member2 = generateFeedMemberResponse();
40
+ feed.state.partialNext({ members: [member1, member2] });
41
+
42
+ const event = generateFeedMemberUpdatedEvent({
43
+ member: { user: { id: member1.user.id }, role: 'admin' },
44
+ });
45
+
46
+ handleFeedMemberUpdated.call(feed, event);
47
+
48
+ const stateAfter = feed.currentState;
49
+ expect(stateAfter.members).toHaveLength(2);
50
+ expect(stateAfter.members?.[0]).toBe(event.member);
51
+ expect(stateAfter.members?.[1]).toBe(member2);
52
+ });
53
+
54
+ it('does not modify members when target is not present', () => {
55
+ const existingMember = generateFeedMemberResponse();
56
+ feed.state.partialNext({ members: [existingMember] });
57
+
58
+ const event = generateFeedMemberUpdatedEvent();
59
+
60
+ const stateBefore = feed.currentState;
61
+ handleFeedMemberUpdated.call(feed, event);
62
+
63
+ const stateAfter = feed.currentState;
64
+ expect(stateAfter).toBe(stateBefore);
65
+ });
66
+
67
+ it('sets own_membership when the updated member is the connected user', () => {
68
+ const event = generateFeedMemberUpdatedEvent({
69
+ member: {
70
+ user: { id: currentUserId },
71
+ role: 'owner',
72
+ status: 'member',
73
+ },
74
+ });
75
+
76
+ const stateBefore = feed.currentState;
77
+ expect(stateBefore.own_membership).toBeUndefined();
78
+
79
+ handleFeedMemberUpdated.call(feed, event);
80
+
81
+ const stateAfter = feed.currentState;
82
+ expect(stateAfter.own_membership).toBe(event.member);
83
+ });
84
+ });
@@ -78,10 +78,10 @@ describe('handle-follow-created', () => {
78
78
 
79
79
  expect(result.changed).toBe(true);
80
80
  expect(result.data.following).toHaveLength(1);
81
- expect(result.data.following?.[0]).toEqual(follow);
81
+ expect(result.data.following?.[0]).toBe(follow);
82
82
  expect(result.data).toMatchObject(follow.source_feed);
83
83
  expect(result.data.own_follows).toBeUndefined();
84
- expect(result.data.following_count).toEqual(1);
84
+ expect(result.data.following_count).toBe(1);
85
85
  });
86
86
 
87
87
  it('should handle when someone follows this feed', () => {
@@ -120,10 +120,10 @@ describe('handle-follow-created', () => {
120
120
 
121
121
  expect(result.changed).toBe(true);
122
122
  expect(result.data.followers).toHaveLength(1);
123
- expect(result.data.followers?.[0]).toEqual(follow);
123
+ expect(result.data.followers?.[0]).toBe(follow);
124
124
  expect(result.data).toMatchObject(follow.target_feed);
125
125
  expect(result.data.own_follows).toBeUndefined();
126
- expect(result.data.follower_count).toEqual(1);
126
+ expect(result.data.follower_count).toBe(1);
127
127
  });
128
128
 
129
129
  it('should add to own_follows when connected user is the source', () => {
@@ -161,7 +161,7 @@ describe('handle-follow-created', () => {
161
161
 
162
162
  expect(result.changed).toBe(true);
163
163
  expect(result.data.own_follows).toHaveLength(1);
164
- expect(result.data.own_follows?.[0]).toEqual(follow);
164
+ expect(result.data.own_follows?.[0]).toBe(follow);
165
165
  });
166
166
 
167
167
  it('should not update followers/following when they are undefined', () => {
@@ -243,8 +243,8 @@ describe('handle-follow-created', () => {
243
243
 
244
244
  expect(result.changed).toBe(true);
245
245
  expect(result.data.followers).toHaveLength(2);
246
- expect(result.data.followers?.[0]).toEqual(follow);
247
- expect(result.data.followers?.[1]).toEqual(existingFollow);
246
+ expect(result.data.followers?.[0]).toBe(follow);
247
+ expect(result.data.followers?.[1]).toBe(existingFollow);
248
248
  });
249
249
  });
250
250
  });
@@ -95,7 +95,7 @@ describe('handle-follow-deleted', () => {
95
95
 
96
96
  expect(result.changed).toBe(true);
97
97
  expect(result.data.followers).toHaveLength(0);
98
- expect(result.data.own_follows).toEqual(currentState.own_follows);
98
+ expect(result.data.own_follows).toBe(currentState.own_follows);
99
99
  expect(result.data).toMatchObject(follow.target_feed);
100
100
  });
101
101
 
@@ -262,7 +262,7 @@ describe('handle-follow-deleted', () => {
262
262
 
263
263
  expect(result.changed).toBe(true);
264
264
  expect(result.data.following).toHaveLength(1);
265
- expect(result.data.following?.[0]).toEqual(followToKeep);
265
+ expect(result.data.following?.[0]).toBe(followToKeep);
266
266
  });
267
267
  });
268
268
  });
@@ -148,7 +148,7 @@ describe(handleFollowUpdated.name, () => {
148
148
 
149
149
  // State should not change
150
150
  const stateAfter = feed.currentState;
151
- expect(stateAfter).toEqual(stateBefore);
151
+ expect(stateAfter).toBe(stateBefore);
152
152
  });
153
153
 
154
154
  it('allows update again after clearing stateUpdateQueue', () => {
@@ -0,0 +1,120 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import {
3
+ NotificationFeedUpdatedEvent,
4
+ NotificationStatusResponse,
5
+ AggregatedActivityResponse,
6
+ } from '../../../gen/models';
7
+ import { updateNotificationFeedFromEvent } from './handle-notification-feed-updated';
8
+
9
+ const createMockNotificationFeedUpdatedEvent = (
10
+ overrides: Partial<NotificationFeedUpdatedEvent> = {},
11
+ ): NotificationFeedUpdatedEvent => ({
12
+ created_at: new Date(),
13
+ fid: 'user:notification',
14
+ custom: {},
15
+ type: 'feeds.notification_feed.updated',
16
+ ...overrides,
17
+ });
18
+
19
+ const createMockNotificationStatus = (
20
+ overrides: Partial<NotificationStatusResponse> = {},
21
+ ): NotificationStatusResponse => ({
22
+ unread: 0,
23
+ unseen: 0,
24
+ ...overrides,
25
+ });
26
+
27
+ const createMockAggregatedActivity = (
28
+ overrides: Partial<AggregatedActivityResponse> = {},
29
+ ): AggregatedActivityResponse => ({
30
+ activity_count: 1,
31
+ created_at: new Date(),
32
+ group: 'test-group',
33
+ score: 1,
34
+ updated_at: new Date(),
35
+ user_count: 1,
36
+ activities: [],
37
+ ...overrides,
38
+ });
39
+
40
+ describe('notification-feed-utils', () => {
41
+ describe('updateNotificationFeedFromEvent', () => {
42
+ it('should return unchanged if event has no notification_status or aggregated_activities', () => {
43
+ const event = createMockNotificationFeedUpdatedEvent();
44
+
45
+ const result = updateNotificationFeedFromEvent(event);
46
+
47
+ expect(result.changed).toBe(false);
48
+ });
49
+
50
+ it('should update notification_status when event has notification_status', () => {
51
+ const notificationStatus = createMockNotificationStatus({
52
+ unread: 5,
53
+ unseen: 3,
54
+ read_activities: ['activity1', 'activity2'],
55
+ });
56
+ const event = createMockNotificationFeedUpdatedEvent({
57
+ notification_status: notificationStatus,
58
+ });
59
+
60
+ const result = updateNotificationFeedFromEvent(event);
61
+
62
+ expect(result.changed).toBe(true);
63
+ expect(result.data?.notification_status).toBe(notificationStatus);
64
+ expect(result.data?.aggregated_activities).toBeUndefined();
65
+ });
66
+
67
+ it('should update aggregated_activities when event has aggregated_activities', () => {
68
+ const aggregatedActivities = [
69
+ createMockAggregatedActivity({ group: 'group1' }),
70
+ createMockAggregatedActivity({ group: 'group2' }),
71
+ ];
72
+ const event = createMockNotificationFeedUpdatedEvent({
73
+ aggregated_activities: aggregatedActivities,
74
+ });
75
+
76
+ const result = updateNotificationFeedFromEvent(event);
77
+
78
+ expect(result.changed).toBe(true);
79
+ expect(result.data?.aggregated_activities).toBe(aggregatedActivities);
80
+ expect(result.data?.notification_status).toBeUndefined();
81
+ });
82
+
83
+ it('should update both notification_status and aggregated_activities when event has both', () => {
84
+ const notificationStatus = createMockNotificationStatus({
85
+ unread: 2,
86
+ unseen: 1,
87
+ });
88
+ const aggregatedActivities = [
89
+ createMockAggregatedActivity({ group: 'group1' }),
90
+ ];
91
+ const event = createMockNotificationFeedUpdatedEvent({
92
+ notification_status: notificationStatus,
93
+ aggregated_activities: aggregatedActivities,
94
+ });
95
+
96
+ const result = updateNotificationFeedFromEvent(event);
97
+
98
+ expect(result.changed).toBe(true);
99
+ expect(result.data?.notification_status).toBe(notificationStatus);
100
+ expect(result.data?.aggregated_activities).toBe(aggregatedActivities);
101
+ });
102
+
103
+ it('should handle notification_status with all fields', () => {
104
+ const notificationStatus = createMockNotificationStatus({
105
+ unread: 10,
106
+ unseen: 5,
107
+ last_seen_at: new Date('2023-01-01'),
108
+ read_activities: ['activity1', 'activity2', 'activity3'],
109
+ });
110
+ const event = createMockNotificationFeedUpdatedEvent({
111
+ notification_status: notificationStatus,
112
+ });
113
+
114
+ const result = updateNotificationFeedFromEvent(event);
115
+
116
+ expect(result.changed).toBe(true);
117
+ expect(result.data?.notification_status).toBe(notificationStatus);
118
+ });
119
+ });
120
+ });
@@ -1,10 +1,54 @@
1
1
  import type { Feed } from '../../../feed';
2
- import type { EventPayload } from '../../../types-internal';
2
+ import {
3
+ AggregatedActivityResponse,
4
+ NotificationFeedUpdatedEvent,
5
+ NotificationStatusResponse,
6
+ } from '../../../gen/models';
7
+ import type { EventPayload, UpdateStateResult } from '../../../types-internal';
8
+
9
+ export const updateNotificationFeedFromEvent = (
10
+ event: NotificationFeedUpdatedEvent,
11
+ ): UpdateStateResult<{
12
+ data?: {
13
+ notification_status?: NotificationStatusResponse;
14
+ aggregated_activities?: AggregatedActivityResponse[];
15
+ };
16
+ }> => {
17
+ const updates: {
18
+ notification_status?: NotificationStatusResponse;
19
+ aggregated_activities?: AggregatedActivityResponse[];
20
+ } = {};
21
+
22
+ if (event.notification_status) {
23
+ updates.notification_status = event.notification_status;
24
+ }
25
+
26
+ if (event.aggregated_activities) {
27
+ updates.aggregated_activities = event.aggregated_activities;
28
+ }
29
+
30
+ // Only return changed if we have actual updates
31
+ if (Object.keys(updates).length > 0) {
32
+ return {
33
+ changed: true,
34
+ data: updates,
35
+ };
36
+ }
37
+
38
+ return {
39
+ changed: false,
40
+ };
41
+ };
3
42
 
4
43
  export function handleNotificationFeedUpdated(
5
44
  this: Feed,
6
45
  event: EventPayload<'feeds.notification_feed.updated'>,
7
46
  ) {
8
- console.info('notification feed updated', event);
9
- // TODO: handle notification feed updates
47
+ const result = updateNotificationFeedFromEvent(event);
48
+ if (result.changed) {
49
+ this.state.partialNext({
50
+ notification_status: result.data?.notification_status,
51
+ aggregated_activities: result.data?.aggregated_activities,
52
+ });
53
+ }
10
54
  }
package/src/feed/feed.ts CHANGED
@@ -12,6 +12,7 @@ import {
12
12
  SortParamRequest,
13
13
  ThreadedCommentResponse,
14
14
  FollowRequest,
15
+ QueryCommentsRequest,
15
16
  } from '../gen/models';
16
17
  import { StreamResponse } from '../gen-imports';
17
18
  import { StateStore } from '../common/StateStore';
@@ -41,6 +42,7 @@ import {
41
42
  handleActivityReactionAdded,
42
43
  handleFeedUpdated,
43
44
  handleNotificationFeedUpdated,
45
+ handleActivityMarked,
44
46
  } from './event-handlers';
45
47
  import { capitalize } from '../common/utils';
46
48
  import type {
@@ -70,7 +72,7 @@ export type FeedState = Omit<
70
72
  | {
71
73
  pagination?: PagerResponseWithLoadingStates & {
72
74
  // registered on first pagination attempt and then used for real-time updates & subsequent pagination calls
73
- sort?: string;
75
+ sort?: QueryCommentsRequest['sort'] | (string & {});
74
76
  };
75
77
  /**
76
78
  * Id of the "store" where the actual parent is stored in the comments array.
@@ -180,7 +182,7 @@ export class Feed extends FeedApi {
180
182
  'feeds.poll.vote_removed': Feed.noop,
181
183
  'feeds.activity.pinned': Feed.noop,
182
184
  'feeds.activity.unpinned': Feed.noop,
183
- 'feeds.activity.marked': Feed.noop,
185
+ 'feeds.activity.marked': handleActivityMarked.bind(this),
184
186
  'moderation.custom_action': Feed.noop,
185
187
  'moderation.flagged': Feed.noop,
186
188
  'moderation.mark_reviewed': Feed.noop,
@@ -578,6 +578,7 @@ export class FeedsApi {
578
578
  const body = {
579
579
  type: request?.type,
580
580
  create_notification_activity: request?.create_notification_activity,
581
+ skip_push: request?.skip_push,
581
582
  custom: request?.custom,
582
583
  };
583
584
 
@@ -888,6 +889,7 @@ export class FeedsApi {
888
889
  object_type: request?.object_type,
889
890
  create_notification_activity: request?.create_notification_activity,
890
891
  parent_id: request?.parent_id,
892
+ skip_push: request?.skip_push,
891
893
  attachments: request?.attachments,
892
894
  mentioned_user_ids: request?.mentioned_user_ids,
893
895
  custom: request?.custom,
@@ -1003,6 +1005,7 @@ export class FeedsApi {
1003
1005
  };
1004
1006
  const body = {
1005
1007
  comment: request?.comment,
1008
+ skip_push: request?.skip_push,
1006
1009
  custom: request?.custom,
1007
1010
  };
1008
1011
 
@@ -1031,6 +1034,7 @@ export class FeedsApi {
1031
1034
  const body = {
1032
1035
  type: request?.type,
1033
1036
  create_notification_activity: request?.create_notification_activity,
1037
+ skip_push: request?.skip_push,
1034
1038
  custom: request?.custom,
1035
1039
  };
1036
1040
 
@@ -1554,6 +1558,7 @@ export class FeedsApi {
1554
1558
  create_notification_activity: request?.create_notification_activity,
1555
1559
  follower_role: request?.follower_role,
1556
1560
  push_preference: request?.push_preference,
1561
+ skip_push: request?.skip_push,
1557
1562
  custom: request?.custom,
1558
1563
  };
1559
1564
 
@@ -1581,6 +1586,7 @@ export class FeedsApi {
1581
1586
  target: request?.target,
1582
1587
  create_notification_activity: request?.create_notification_activity,
1583
1588
  push_preference: request?.push_preference,
1589
+ skip_push: request?.skip_push,
1584
1590
  custom: request?.custom,
1585
1591
  };
1586
1592
 
@@ -584,6 +584,8 @@ decoders.CommentAddedEvent = (input?: Record<string, any>) => {
584
584
  const typeMappings: TypeMapping = {
585
585
  created_at: { type: 'DatetimeType', isSingle: true },
586
586
 
587
+ activity: { type: 'ActivityResponse', isSingle: true },
588
+
587
589
  comment: { type: 'CommentResponse', isSingle: true },
588
590
 
589
591
  received_at: { type: 'DatetimeType', isSingle: true },
@@ -606,6 +608,8 @@ decoders.CommentReactionAddedEvent = (input?: Record<string, any>) => {
606
608
  const typeMappings: TypeMapping = {
607
609
  created_at: { type: 'DatetimeType', isSingle: true },
608
610
 
611
+ activity: { type: 'ActivityResponse', isSingle: true },
612
+
609
613
  comment: { type: 'CommentResponse', isSingle: true },
610
614
 
611
615
  reaction: { type: 'FeedsReactionResponse', isSingle: true },
@@ -632,6 +636,8 @@ decoders.CommentReactionUpdatedEvent = (input?: Record<string, any>) => {
632
636
  const typeMappings: TypeMapping = {
633
637
  created_at: { type: 'DatetimeType', isSingle: true },
634
638
 
639
+ activity: { type: 'ActivityResponse', isSingle: true },
640
+
635
641
  comment: { type: 'CommentResponse', isSingle: true },
636
642
 
637
643
  reaction: { type: 'FeedsReactionResponse', isSingle: true },
@@ -1128,6 +1134,8 @@ decoders.Message = (input?: Record<string, any>) => {
1128
1134
 
1129
1135
  thread_participants: { type: 'User', isSingle: false },
1130
1136
 
1137
+ member: { type: 'ChannelMember', isSingle: true },
1138
+
1131
1139
  pinned_by: { type: 'User', isSingle: true },
1132
1140
 
1133
1141
  poll: { type: 'Poll', isSingle: true },
@@ -1214,6 +1222,10 @@ decoders.ModerationCustomActionEvent = (input?: Record<string, any>) => {
1214
1222
 
1215
1223
  decoders.ModerationFlagResponse = (input?: Record<string, any>) => {
1216
1224
  const typeMappings: TypeMapping = {
1225
+ created_at: { type: 'DatetimeType', isSingle: true },
1226
+
1227
+ updated_at: { type: 'DatetimeType', isSingle: true },
1228
+
1217
1229
  review_queue_item: { type: 'ReviewQueueItemResponse', isSingle: true },
1218
1230
 
1219
1231
  user: { type: 'UserResponse', isSingle: true },