@stream-io/feeds-client 0.2.0 → 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 (83) 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/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 +505 -222
  10. package/dist/index-react-bindings.browser.cjs.map +1 -1
  11. package/dist/index-react-bindings.browser.js +502 -223
  12. package/dist/index-react-bindings.browser.js.map +1 -1
  13. package/dist/index-react-bindings.node.cjs +505 -222
  14. package/dist/index-react-bindings.node.cjs.map +1 -1
  15. package/dist/index-react-bindings.node.js +502 -223
  16. package/dist/index-react-bindings.node.js.map +1 -1
  17. package/dist/index.browser.cjs +440 -205
  18. package/dist/index.browser.cjs.map +1 -1
  19. package/dist/index.browser.js +440 -206
  20. package/dist/index.browser.js.map +1 -1
  21. package/dist/index.node.cjs +440 -205
  22. package/dist/index.node.cjs.map +1 -1
  23. package/dist/index.node.js +440 -206
  24. package/dist/index.node.js.map +1 -1
  25. package/dist/src/feed/event-handlers/activity/handle-activity-deleted.d.ts +12 -3
  26. package/dist/src/feed/event-handlers/activity/handle-activity-marked.d.ts +11 -0
  27. package/dist/src/feed/event-handlers/activity/handle-activity-pinned.d.ts +3 -0
  28. package/dist/src/feed/event-handlers/activity/handle-activity-reaction-added.d.ts +10 -6
  29. package/dist/src/feed/event-handlers/activity/handle-activity-reaction-deleted.d.ts +10 -6
  30. package/dist/src/feed/event-handlers/activity/handle-activity-unpinned.d.ts +3 -0
  31. package/dist/src/feed/event-handlers/activity/handle-activity-updated.d.ts +7 -3
  32. package/dist/src/feed/event-handlers/activity/index.d.ts +1 -0
  33. package/dist/src/feed/event-handlers/bookmark/handle-bookmark-added.d.ts +10 -6
  34. package/dist/src/feed/event-handlers/bookmark/handle-bookmark-deleted.d.ts +10 -6
  35. package/dist/src/feed/event-handlers/bookmark/handle-bookmark-updated.d.ts +10 -6
  36. package/dist/src/feed/event-handlers/notification-feed/handle-notification-feed-updated.d.ts +8 -1
  37. package/dist/src/feed/feed.d.ts +2 -2
  38. package/dist/src/gen/models/index.d.ts +36 -1
  39. package/dist/src/test-utils/response-generators.d.ts +66 -1
  40. package/dist/src/utils/index.d.ts +1 -0
  41. package/dist/src/utils/update-entity-in-array.d.ts +27 -0
  42. package/dist/tsconfig.tsbuildinfo +1 -1
  43. package/package.json +1 -1
  44. package/src/feed/event-handlers/activity/activity-marked-utils.test.ts +208 -0
  45. package/src/feed/event-handlers/activity/activity-reaction-utils.test.ts +108 -96
  46. package/src/feed/event-handlers/activity/activity-utils.test.ts +84 -122
  47. package/src/feed/event-handlers/activity/handle-activity-deleted.ts +43 -10
  48. package/src/feed/event-handlers/activity/handle-activity-marked.ts +68 -0
  49. package/src/feed/event-handlers/activity/handle-activity-pinned.test.ts +60 -0
  50. package/src/feed/event-handlers/activity/handle-activity-pinned.ts +30 -0
  51. package/src/feed/event-handlers/activity/handle-activity-reaction-added.test.ts +157 -0
  52. package/src/feed/event-handlers/activity/handle-activity-reaction-added.ts +82 -40
  53. package/src/feed/event-handlers/activity/handle-activity-reaction-deleted.test.ts +200 -0
  54. package/src/feed/event-handlers/activity/handle-activity-reaction-deleted.ts +89 -51
  55. package/src/feed/event-handlers/activity/handle-activity-unpinned.test.ts +95 -0
  56. package/src/feed/event-handlers/activity/handle-activity-unpinned.ts +30 -0
  57. package/src/feed/event-handlers/activity/handle-activity-updated.test.ts +115 -0
  58. package/src/feed/event-handlers/activity/handle-activity-updated.ts +73 -35
  59. package/src/feed/event-handlers/activity/index.ts +2 -1
  60. package/src/feed/event-handlers/bookmark/bookmark-utils.test.ts +121 -109
  61. package/src/feed/event-handlers/bookmark/handle-bookmark-added.test.ts +178 -0
  62. package/src/feed/event-handlers/bookmark/handle-bookmark-added.ts +82 -39
  63. package/src/feed/event-handlers/bookmark/handle-bookmark-deleted.test.ts +188 -0
  64. package/src/feed/event-handlers/bookmark/handle-bookmark-deleted.ts +86 -48
  65. package/src/feed/event-handlers/bookmark/handle-bookmark-updated.test.ts +196 -0
  66. package/src/feed/event-handlers/bookmark/handle-bookmark-updated.ts +83 -44
  67. package/src/feed/event-handlers/comment/handle-comment-added.test.ts +147 -0
  68. package/src/feed/event-handlers/comment/handle-comment-deleted.test.ts +133 -0
  69. package/src/feed/event-handlers/comment/handle-comment-deleted.ts +24 -10
  70. package/src/feed/event-handlers/comment/handle-comment-reaction.test.ts +315 -0
  71. package/src/feed/event-handlers/comment/handle-comment-updated.test.ts +131 -0
  72. package/src/feed/event-handlers/follow/handle-follow-created.test.ts +7 -7
  73. package/src/feed/event-handlers/follow/handle-follow-deleted.test.ts +2 -2
  74. package/src/feed/event-handlers/follow/handle-follow-updated.test.ts +1 -1
  75. package/src/feed/event-handlers/notification-feed/handle-notification-feed-updated.test.ts +120 -0
  76. package/src/feed/event-handlers/notification-feed/handle-notification-feed-updated.ts +47 -3
  77. package/src/feed/feed.ts +4 -2
  78. package/src/gen/model-decoders/decoders.ts +14 -1
  79. package/src/gen/models/index.ts +73 -2
  80. package/src/gen/moderation/ModerationApi.ts +1 -0
  81. package/src/test-utils/response-generators.ts +383 -0
  82. package/src/utils/index.ts +1 -0
  83. package/src/utils/update-entity-in-array.ts +51 -0
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,
@@ -6,7 +6,7 @@ export const decoders: Record<string, Decoder> = {};
6
6
 
7
7
  const decodeDatetimeType = (input: number | string) =>
8
8
  typeof input === 'number'
9
- ? new Date(Math.floor(input / 1000000))
9
+ ? new Date(Math.floor(input / 1e6))
10
10
  : new Date(input);
11
11
 
12
12
  decoders.DatetimeType = decodeDatetimeType;
@@ -469,6 +469,8 @@ decoders.Channel = (input?: Record<string, any>) => {
469
469
 
470
470
  last_message_at: { type: 'DatetimeType', isSingle: true },
471
471
 
472
+ message_count_updated_at: { type: 'DatetimeType', isSingle: true },
473
+
472
474
  active_live_locations: { type: 'SharedLocation', isSingle: false },
473
475
 
474
476
  invites: { type: 'ChannelMember', isSingle: false },
@@ -857,6 +859,8 @@ decoders.FeedMemberResponse = (input?: Record<string, any>) => {
857
859
  invite_accepted_at: { type: 'DatetimeType', isSingle: true },
858
860
 
859
861
  invite_rejected_at: { type: 'DatetimeType', isSingle: true },
862
+
863
+ membership_level: { type: 'MembershipLevelResponse', isSingle: true },
860
864
  };
861
865
  return decode(typeMappings, input);
862
866
  };
@@ -1091,6 +1095,15 @@ decoders.ListDevicesResponse = (input?: Record<string, any>) => {
1091
1095
  return decode(typeMappings, input);
1092
1096
  };
1093
1097
 
1098
+ decoders.MembershipLevelResponse = (input?: Record<string, any>) => {
1099
+ const typeMappings: TypeMapping = {
1100
+ created_at: { type: 'DatetimeType', isSingle: true },
1101
+
1102
+ updated_at: { type: 'DatetimeType', isSingle: true },
1103
+ };
1104
+ return decode(typeMappings, input);
1105
+ };
1106
+
1094
1107
  decoders.Message = (input?: Record<string, any>) => {
1095
1108
  const typeMappings: TypeMapping = {
1096
1109
  created_at: { type: 'DatetimeType', isSingle: true },
@@ -672,6 +672,8 @@ export interface AggregatedActivityResponse {
672
672
 
673
673
  export interface AggregationConfig {
674
674
  format?: string;
675
+
676
+ group_size?: number;
675
677
  }
676
678
 
677
679
  export interface AppEventResponse {
@@ -1516,6 +1518,10 @@ export interface Channel {
1516
1518
 
1517
1519
  member_count?: number;
1518
1520
 
1521
+ message_count?: number;
1522
+
1523
+ message_count_updated_at?: Date;
1524
+
1519
1525
  team?: string;
1520
1526
 
1521
1527
  active_live_locations?: SharedLocation[];
@@ -1540,6 +1546,8 @@ export interface ChannelConfig {
1540
1546
 
1541
1547
  connect_events: boolean;
1542
1548
 
1549
+ count_messages: boolean;
1550
+
1543
1551
  created_at: Date;
1544
1552
 
1545
1553
  custom_events: boolean;
@@ -1606,6 +1614,8 @@ export interface ChannelConfigWithInfo {
1606
1614
 
1607
1615
  connect_events: boolean;
1608
1616
 
1617
+ count_messages: boolean;
1618
+
1609
1619
  created_at: Date;
1610
1620
 
1611
1621
  custom_events: boolean;
@@ -1704,6 +1714,8 @@ export interface ChannelMember {
1704
1714
 
1705
1715
  user_id?: string;
1706
1716
 
1717
+ deleted_messages?: string[];
1718
+
1707
1719
  user?: UserResponse;
1708
1720
  }
1709
1721
 
@@ -1796,6 +1808,8 @@ export interface ChannelResponse {
1796
1808
 
1797
1809
  member_count?: number;
1798
1810
 
1811
+ message_count?: number;
1812
+
1799
1813
  mute_expires_at?: Date;
1800
1814
 
1801
1815
  muted?: boolean;
@@ -2006,6 +2020,8 @@ export interface ConfigOverrides {
2006
2020
 
2007
2021
  blocklist_behavior?: 'flag' | 'block';
2008
2022
 
2023
+ count_messages?: boolean;
2024
+
2009
2025
  max_message_length?: number;
2010
2026
 
2011
2027
  quotes?: boolean;
@@ -2050,6 +2066,8 @@ export interface ConfigResponse {
2050
2066
 
2051
2067
  block_list_config?: BlockListConfig;
2052
2068
 
2069
+ llm_config?: LLMConfig;
2070
+
2053
2071
  rule_builder_config?: RuleBuilderConfig;
2054
2072
 
2055
2073
  velocity_filter_config?: VelocityFilterConfig;
@@ -2743,6 +2761,8 @@ export interface FeedMemberResponse {
2743
2761
  invite_rejected_at?: Date;
2744
2762
 
2745
2763
  custom?: Record<string, any>;
2764
+
2765
+ membership_level?: MembershipLevelResponse;
2746
2766
  }
2747
2767
 
2748
2768
  export interface FeedMemberUpdatedEvent {
@@ -3533,6 +3553,33 @@ export interface IngressVideoLayerResponse {
3533
3553
  min_dimension: number;
3534
3554
  }
3535
3555
 
3556
+ export interface LLMConfig {
3557
+ enabled: boolean;
3558
+
3559
+ rules: LLMRule[];
3560
+
3561
+ async?: boolean;
3562
+
3563
+ severity_descriptions?: Record<string, string>;
3564
+ }
3565
+
3566
+ export interface LLMRule {
3567
+ action:
3568
+ | 'flag'
3569
+ | 'shadow'
3570
+ | 'remove'
3571
+ | 'bounce'
3572
+ | 'bounce_flag'
3573
+ | 'bounce_remove'
3574
+ | 'keep';
3575
+
3576
+ description: string;
3577
+
3578
+ label: string;
3579
+
3580
+ severity_rules: BodyguardSeverityRule[];
3581
+ }
3582
+
3536
3583
  export interface LabelThresholds {
3537
3584
  block?: number;
3538
3585
 
@@ -3605,6 +3652,24 @@ export interface MemberLookup {
3605
3652
  limit: number;
3606
3653
  }
3607
3654
 
3655
+ export interface MembershipLevelResponse {
3656
+ created_at: Date;
3657
+
3658
+ id: string;
3659
+
3660
+ name: string;
3661
+
3662
+ priority: number;
3663
+
3664
+ updated_at: Date;
3665
+
3666
+ tags: string[];
3667
+
3668
+ description?: string;
3669
+
3670
+ custom?: Record<string, any>;
3671
+ }
3672
+
3608
3673
  export interface Message {
3609
3674
  cid: string;
3610
3675
 
@@ -3654,6 +3719,8 @@ export interface Message {
3654
3719
 
3655
3720
  deleted_at?: Date;
3656
3721
 
3722
+ deleted_for_me?: boolean;
3723
+
3657
3724
  message_text_updated_at?: Date;
3658
3725
 
3659
3726
  mml?: string;
@@ -3760,6 +3827,8 @@ export interface MessageResponse {
3760
3827
 
3761
3828
  deleted_at?: Date;
3762
3829
 
3830
+ deleted_for_me?: boolean;
3831
+
3763
3832
  message_text_updated_at?: Date;
3764
3833
 
3765
3834
  mml?: string;
@@ -3838,6 +3907,8 @@ export interface ModerationFlagResponse {
3838
3907
 
3839
3908
  user_id: string;
3840
3909
 
3910
+ result: Array<Record<string, any>>;
3911
+
3841
3912
  entity_creator_id?: string;
3842
3913
 
3843
3914
  reason?: string;
@@ -3846,8 +3917,6 @@ export interface ModerationFlagResponse {
3846
3917
 
3847
3918
  labels?: string[];
3848
3919
 
3849
- result?: Array<Record<string, any>>;
3850
-
3851
3920
  custom?: Record<string, any>;
3852
3921
 
3853
3922
  moderation_payload?: ModerationPayload;
@@ -5872,6 +5941,8 @@ export interface UpsertConfigRequest {
5872
5941
 
5873
5942
  google_vision_config?: GoogleVisionConfig;
5874
5943
 
5944
+ llm_config?: LLMConfig;
5945
+
5875
5946
  rule_builder_config?: RuleBuilderConfig;
5876
5947
 
5877
5948
  velocity_filter_config?: VelocityFilterConfig;
@@ -69,6 +69,7 @@ export class ModerationApi {
69
69
  block_list_config: request?.block_list_config,
70
70
  bodyguard_config: request?.bodyguard_config,
71
71
  google_vision_config: request?.google_vision_config,
72
+ llm_config: request?.llm_config,
72
73
  rule_builder_config: request?.rule_builder_config,
73
74
  velocity_filter_config: request?.velocity_filter_config,
74
75
  video_call_rule_config: request?.video_call_rule_config,
@@ -1,11 +1,19 @@
1
1
  import {
2
+ ActivityPinResponse,
3
+ ActivityResponse,
4
+ BookmarkFolderResponse,
5
+ BookmarkResponse,
6
+ CommentResponse,
2
7
  FeedResponse,
8
+ FeedsReactionResponse,
3
9
  FollowResponse,
4
10
  OwnUser,
5
11
  OwnUserResponse,
12
+ PinActivityResponse,
6
13
  UserResponse,
7
14
  } from '../gen/models';
8
15
  import { humanId } from 'human-id';
16
+ import { EventPayload } from '../types-internal';
9
17
 
10
18
  export const getHumanId = () => humanId({ capitalize: false, separator: '-' });
11
19
 
@@ -99,3 +107,378 @@ export const generateFollowResponse = (
99
107
  ...overrides,
100
108
  };
101
109
  };
110
+
111
+ export const generateActivityResponse = (
112
+ overrides: Omit<Partial<ActivityResponse>, 'user'> & {
113
+ user?: Partial<UserResponse>;
114
+ } = {},
115
+ ): ActivityResponse => {
116
+ return {
117
+ id: getHumanId(),
118
+ type: 'test',
119
+ created_at: new Date(),
120
+ updated_at: new Date(),
121
+ visibility: 'public',
122
+ bookmark_count: 0,
123
+ comment_count: 0,
124
+ reaction_count: 0,
125
+ share_count: 0,
126
+ attachments: [],
127
+ comments: [],
128
+ feeds: [],
129
+ filter_tags: [],
130
+ interest_tags: [],
131
+ latest_reactions: [],
132
+ mentioned_users: [],
133
+ own_bookmarks: [],
134
+ own_reactions: [],
135
+ custom: {},
136
+ reaction_groups: {},
137
+ search_data: {},
138
+ popularity: 0,
139
+ score: 0,
140
+ ...overrides,
141
+ user: generateUserResponse(overrides.user),
142
+ };
143
+ };
144
+
145
+ export const generateFeedReactionResponse = (
146
+ overrides: Omit<Partial<FeedsReactionResponse>, 'user'> & {
147
+ user?: Partial<UserResponse>;
148
+ } = {},
149
+ ): FeedsReactionResponse => {
150
+ const user = generateUserResponse(overrides.user);
151
+ return {
152
+ type: 'like',
153
+ activity_id: getHumanId(),
154
+ created_at: new Date(),
155
+ updated_at: new Date(),
156
+ ...overrides,
157
+ user,
158
+ };
159
+ };
160
+
161
+ export const generateCommentResponse = (
162
+ overrides: Omit<Partial<CommentResponse>, 'user'> & {
163
+ user?: Parameters<typeof generateUserResponse>[0];
164
+ } = {},
165
+ ): CommentResponse => {
166
+ const user = generateUserResponse(overrides.user);
167
+ const sharedId = getHumanId();
168
+ return {
169
+ id: `comment-${sharedId}`,
170
+ object_id: `activity-${sharedId}`,
171
+ object_type: 'activity',
172
+ confidence_score: 1,
173
+ created_at: new Date(),
174
+ updated_at: new Date(),
175
+ score: 0,
176
+ reaction_count: 0,
177
+ reply_count: 0,
178
+ upvote_count: 0,
179
+ downvote_count: 0,
180
+ mentioned_users: [],
181
+ own_reactions: [],
182
+ status: '',
183
+ ...overrides,
184
+ user,
185
+ };
186
+ };
187
+
188
+ export const generateActivityPinResponse = (
189
+ overrides: Omit<Partial<ActivityPinResponse>, 'activity' | 'user'> & {
190
+ activity?: Partial<ActivityResponse>;
191
+ user?: Partial<UserResponse>;
192
+ } = {},
193
+ ): ActivityPinResponse => {
194
+ return {
195
+ created_at: new Date(),
196
+ updated_at: new Date(),
197
+ feed: getHumanId(),
198
+ ...overrides,
199
+ activity: generateActivityResponse(overrides.activity),
200
+ user: generateUserResponse(overrides.user),
201
+ };
202
+ };
203
+
204
+ export const generateBookmarkFolderResponse = (
205
+ overrides: Partial<BookmarkFolderResponse> = {},
206
+ ): BookmarkFolderResponse => ({
207
+ id: `bookmark-folder-${getHumanId()}`,
208
+ name: humanId(),
209
+ created_at: new Date(),
210
+ updated_at: new Date(),
211
+ ...overrides,
212
+ });
213
+
214
+ export const generateBookmarkResponse = (
215
+ overrides: Omit<Partial<BookmarkResponse>, 'activity' | 'user'> & {
216
+ activity?: Partial<ActivityResponse>;
217
+ user?: Partial<UserResponse>;
218
+ } = {},
219
+ ): BookmarkResponse => ({
220
+ created_at: new Date(),
221
+ updated_at: new Date(),
222
+ ...overrides,
223
+ activity: generateActivityResponse(overrides.activity),
224
+ user: generateUserResponse(overrides.user),
225
+ });
226
+
227
+ // event generators
228
+ export function generateActivityReactionAddedEvent(
229
+ overrides: Omit<
230
+ Partial<EventPayload<'feeds.activity.reaction.added'>>,
231
+ 'activity' | 'type' | 'reaction' | 'user'
232
+ > & {
233
+ activity?: Parameters<typeof generateActivityResponse>[0];
234
+ reaction?: Parameters<typeof generateFeedReactionResponse>[0];
235
+ user?: Parameters<typeof generateUserResponse>[0];
236
+ } = {},
237
+ ): EventPayload<'feeds.activity.reaction.added'> {
238
+ const activity = generateActivityResponse(overrides.activity);
239
+ const reaction = generateFeedReactionResponse(overrides.reaction);
240
+ const user = generateUserResponse(overrides.user);
241
+
242
+ return {
243
+ type: 'feeds.activity.reaction.added',
244
+ created_at: new Date(),
245
+ fid: '',
246
+ custom: {},
247
+ ...overrides,
248
+ user,
249
+ reaction,
250
+ activity,
251
+ };
252
+ }
253
+
254
+ export function generateActivityReactionDeletedEvent(
255
+ overrides: Omit<
256
+ Partial<EventPayload<'feeds.activity.reaction.deleted'>>,
257
+ 'user' | 'activity' | 'reaction'
258
+ > & {
259
+ activity?: Parameters<typeof generateActivityResponse>[0];
260
+ reaction?: Parameters<typeof generateFeedReactionResponse>[0];
261
+ user?: Parameters<typeof generateUserResponse>[0];
262
+ } = {},
263
+ ): EventPayload<'feeds.activity.reaction.deleted'> {
264
+ const activity = generateActivityResponse(overrides.activity);
265
+ const reaction = generateFeedReactionResponse(overrides.reaction);
266
+ const user = generateUserResponse(overrides.user);
267
+ return {
268
+ type: 'feeds.activity.reaction.deleted',
269
+ created_at: new Date(),
270
+ fid: '',
271
+ custom: {},
272
+ ...overrides,
273
+ user,
274
+ reaction,
275
+ activity,
276
+ };
277
+ }
278
+
279
+ export function generateActivityUpdatedEvent(
280
+ overrides: Omit<
281
+ Partial<EventPayload<'feeds.activity.updated'>>,
282
+ 'activity' | 'type'
283
+ > & {
284
+ activity?: Parameters<typeof generateActivityResponse>[0];
285
+ } = {},
286
+ ): EventPayload<'feeds.activity.updated'> {
287
+ const activity = generateActivityResponse(overrides.activity);
288
+ return {
289
+ type: 'feeds.activity.updated',
290
+ created_at: new Date(),
291
+ fid: '',
292
+ custom: {},
293
+ ...overrides,
294
+ activity,
295
+ };
296
+ }
297
+
298
+ export function generateBookmarkAddedEvent(
299
+ overrides: Omit<
300
+ Partial<EventPayload<'feeds.bookmark.added'>>,
301
+ 'bookmark' | 'user'
302
+ > & {
303
+ bookmark?: Parameters<typeof generateBookmarkResponse>[0];
304
+ user?: Parameters<typeof generateUserResponse>[0];
305
+ } = {},
306
+ ): EventPayload<'feeds.bookmark.added'> {
307
+ const bookmark = generateBookmarkResponse(overrides.bookmark);
308
+ const user = generateUserResponse(overrides.user);
309
+ return {
310
+ type: 'feeds.bookmark.added',
311
+ created_at: new Date(),
312
+ custom: {},
313
+ ...overrides,
314
+ bookmark,
315
+ user,
316
+ };
317
+ }
318
+
319
+ export function generateBookmarkDeletedEvent(
320
+ overrides: Omit<
321
+ Partial<EventPayload<'feeds.bookmark.deleted'>>,
322
+ 'bookmark' | 'user'
323
+ > & {
324
+ bookmark?: Parameters<typeof generateBookmarkResponse>[0];
325
+ user?: Parameters<typeof generateUserResponse>[0];
326
+ } = {},
327
+ ): EventPayload<'feeds.bookmark.deleted'> {
328
+ const bookmark = generateBookmarkResponse(overrides.bookmark);
329
+ const user = generateUserResponse(overrides.user);
330
+ return {
331
+ type: 'feeds.bookmark.deleted',
332
+ created_at: new Date(),
333
+ custom: {},
334
+ ...overrides,
335
+ bookmark,
336
+ user,
337
+ };
338
+ }
339
+
340
+ export function generateBookmarkUpdatedEvent(
341
+ overrides: Omit<
342
+ Partial<EventPayload<'feeds.bookmark.updated'>>,
343
+ 'bookmark' | 'user'
344
+ > & {
345
+ bookmark?: Parameters<typeof generateBookmarkResponse>[0];
346
+ user?: Parameters<typeof generateUserResponse>[0];
347
+ } = {},
348
+ ): EventPayload<'feeds.bookmark.updated'> {
349
+ const bookmark = generateBookmarkResponse(overrides.bookmark);
350
+ const user = generateUserResponse(overrides.user);
351
+ return {
352
+ type: 'feeds.bookmark.updated',
353
+ created_at: new Date(),
354
+ custom: {},
355
+ ...overrides,
356
+ bookmark,
357
+ user,
358
+ };
359
+ }
360
+
361
+ export function generateCommentAddedEvent(
362
+ overrides: Omit<
363
+ Partial<EventPayload<'feeds.comment.added'>>,
364
+ 'comment' | 'type'
365
+ > & { comment?: Parameters<typeof generateCommentResponse>[0] } = {},
366
+ ): EventPayload<'feeds.comment.added'> {
367
+ const comment = generateCommentResponse(overrides.comment);
368
+ return {
369
+ type: 'feeds.comment.added',
370
+ created_at: new Date(),
371
+ fid: '',
372
+ custom: {},
373
+ ...overrides,
374
+ comment,
375
+ };
376
+ }
377
+
378
+ export function generateCommentDeletedEvent(
379
+ overrides: Omit<
380
+ Partial<EventPayload<'feeds.comment.deleted'>>,
381
+ 'comment' | 'type'
382
+ > & { comment?: Parameters<typeof generateCommentResponse>[0] } = {},
383
+ ): EventPayload<'feeds.comment.deleted'> {
384
+ const comment = generateCommentResponse(overrides.comment);
385
+ return {
386
+ type: 'feeds.comment.deleted',
387
+ created_at: new Date(),
388
+ fid: '',
389
+ custom: {},
390
+ ...overrides,
391
+ comment,
392
+ };
393
+ }
394
+
395
+ export function generateCommentUpdatedEvent(
396
+ overrides: Omit<
397
+ Partial<EventPayload<'feeds.comment.updated'>>,
398
+ 'comment' | 'type'
399
+ > & { comment?: Parameters<typeof generateCommentResponse>[0] } = {},
400
+ ): EventPayload<'feeds.comment.updated'> {
401
+ const comment = generateCommentResponse(overrides.comment);
402
+ return {
403
+ type: 'feeds.comment.updated',
404
+ created_at: new Date(),
405
+ fid: '',
406
+ custom: {},
407
+ ...overrides,
408
+ comment,
409
+ };
410
+ }
411
+
412
+ export function generateCommentReactionAddedEvent(
413
+ overrides: Omit<
414
+ Partial<EventPayload<'feeds.comment.reaction.added'>>,
415
+ 'comment' | 'reaction' | 'type'
416
+ > & {
417
+ comment?: Parameters<typeof generateCommentResponse>[0];
418
+ reaction?: Parameters<typeof generateFeedReactionResponse>[0];
419
+ } = {},
420
+ ): EventPayload<'feeds.comment.reaction.added'> {
421
+ const comment = generateCommentResponse(overrides.comment);
422
+ const reaction = generateFeedReactionResponse(overrides.reaction);
423
+ return {
424
+ type: 'feeds.comment.reaction.added',
425
+ created_at: new Date(),
426
+ fid: '',
427
+ custom: {},
428
+ ...overrides,
429
+ comment,
430
+ reaction,
431
+ };
432
+ }
433
+
434
+ export function generateCommentReactionDeletedEvent(
435
+ overrides: Omit<
436
+ Partial<EventPayload<'feeds.comment.reaction.deleted'>>,
437
+ 'comment' | 'reaction' | 'type'
438
+ > & {
439
+ comment?: Parameters<typeof generateCommentResponse>[0];
440
+ reaction?: Parameters<typeof generateFeedReactionResponse>[0];
441
+ } = {},
442
+ ): EventPayload<'feeds.comment.reaction.deleted'> {
443
+ const comment = generateCommentResponse(overrides.comment);
444
+ const reaction = generateFeedReactionResponse(overrides.reaction);
445
+ return {
446
+ type: 'feeds.comment.reaction.deleted',
447
+ created_at: new Date(),
448
+ fid: '',
449
+ custom: {},
450
+ ...overrides,
451
+ comment,
452
+ reaction,
453
+ };
454
+ }
455
+
456
+ export function generateActivityPinnedEvent(
457
+ overrides: Omit<
458
+ Partial<EventPayload<'feeds.activity.pinned'>>,
459
+ 'pinned_activity' | 'user'
460
+ > & {
461
+ pinned_activity?: Parameters<typeof generateActivityPinResponse>[0];
462
+ user?: Parameters<typeof generateUserResponse>[0];
463
+ } = {},
464
+ ): EventPayload<'feeds.activity.pinned'> {
465
+ const pinnedActivity = generateActivityPinResponse(overrides.pinned_activity);
466
+ const user = generateUserResponse(overrides.user);
467
+
468
+ // FIXME(TEMPORARY): re-map ActivityPinResponse to PinActivityResponse
469
+ const typeAdjustedPinnedActivity: PinActivityResponse = {
470
+ ...pinnedActivity,
471
+ user_id: pinnedActivity.user.id,
472
+ duration: '0',
473
+ };
474
+
475
+ return {
476
+ type: 'feeds.activity.pinned',
477
+ created_at: pinnedActivity.created_at,
478
+ fid: pinnedActivity.feed,
479
+ custom: {},
480
+ ...overrides,
481
+ pinned_activity: typeAdjustedPinnedActivity,
482
+ user,
483
+ };
484
+ }
@@ -3,3 +3,4 @@ export * from './unique-array-merge';
3
3
  export * from './constants';
4
4
  export * from './type-assertions';
5
5
  export * from './state-update-queue';
6
+ export * from './update-entity-in-array';