@stream-io/feeds-client 0.3.48 → 0.3.50

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 (47) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/cjs/index.js +1 -1
  3. package/dist/cjs/index.js.map +1 -1
  4. package/dist/cjs/react-bindings.js +1 -1
  5. package/dist/es/index.mjs +2 -2
  6. package/dist/es/index.mjs.map +1 -1
  7. package/dist/es/react-bindings.mjs +1 -1
  8. package/dist/{feeds-client-D-EFo20w.mjs → feeds-client-BHpmg4_E.mjs} +270 -176
  9. package/dist/feeds-client-BHpmg4_E.mjs.map +1 -0
  10. package/dist/{feeds-client-DuJuJuEJ.js → feeds-client-CKxvuiKz.js} +270 -176
  11. package/dist/feeds-client-CKxvuiKz.js.map +1 -0
  12. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  13. package/dist/types/common/Poll.d.ts +7 -3
  14. package/dist/types/common/Poll.d.ts.map +1 -1
  15. package/dist/types/common/real-time/StableWSConnection.d.ts +3 -3
  16. package/dist/types/common/real-time/StableWSConnection.d.ts.map +1 -1
  17. package/dist/types/feed/event-handlers/activity-updater.d.ts +3 -1
  18. package/dist/types/feed/event-handlers/activity-updater.d.ts.map +1 -1
  19. package/dist/types/feed/event-handlers/comment/handle-comment-added.d.ts.map +1 -1
  20. package/dist/types/feed/feed.d.ts +2 -2
  21. package/dist/types/feed/feed.d.ts.map +1 -1
  22. package/dist/types/feeds-client/feeds-client.d.ts +7 -3
  23. package/dist/types/feeds-client/feeds-client.d.ts.map +1 -1
  24. package/dist/types/gen/feeds/FeedsApi.d.ts +34 -3
  25. package/dist/types/gen/feeds/FeedsApi.d.ts.map +1 -1
  26. package/dist/types/gen/model-decoders/event-decoder-mapping.d.ts.map +1 -1
  27. package/dist/types/gen/models/index.d.ts +276 -422
  28. package/dist/types/gen/models/index.d.ts.map +1 -1
  29. package/dist/types/gen/moderation/ModerationApi.d.ts.map +1 -1
  30. package/dist/types/types.d.ts +2 -2
  31. package/dist/types/types.d.ts.map +1 -1
  32. package/dist/types/utils/constants.d.ts +1 -1
  33. package/package.json +1 -1
  34. package/src/common/Poll.ts +16 -15
  35. package/src/feed/event-handlers/comment/handle-comment-added.ts +14 -2
  36. package/src/feed/feed.ts +25 -9
  37. package/src/feeds-client/feeds-client.ts +28 -1
  38. package/src/gen/feeds/FeedsApi.ts +200 -2
  39. package/src/gen/model-decoders/decoders.ts +95 -230
  40. package/src/gen/model-decoders/event-decoder-mapping.ts +6 -2
  41. package/src/gen/models/index.ts +443 -746
  42. package/src/gen/moderation/ModerationApi.ts +1 -0
  43. package/src/test-utils/response-generators.ts +3 -2
  44. package/src/types.ts +2 -2
  45. package/src/utils/constants.ts +1 -1
  46. package/dist/feeds-client-D-EFo20w.mjs.map +0 -1
  47. package/dist/feeds-client-DuJuJuEJ.js.map +0 -1
@@ -36,11 +36,23 @@ export function handleCommentAdded(
36
36
  }
37
37
 
38
38
  const newComments = entityState?.comments ? [...entityState.comments] : [];
39
+ const sort = entityState.pagination?.sort;
40
+ const hasMorePages = entityState.pagination?.next !== undefined;
41
+ const isFromCurrentUser = eventTriggeredByConnectedUser.call(this, payload);
39
42
 
40
- if (entityState.pagination?.sort === 'last') {
43
+ if (sort === 'last') {
41
44
  newComments.unshift(comment);
45
+ } else if (sort === 'first') {
46
+ if (isFromCurrentUser) {
47
+ newComments.push(comment);
48
+ } else {
49
+ if (!hasMorePages) {
50
+ newComments.push(comment);
51
+ } else {
52
+ return currentState;
53
+ }
54
+ }
42
55
  } else {
43
- // 'first' and other sort options
44
56
  newComments.push(comment);
45
57
  }
46
58
 
package/src/feed/feed.ts CHANGED
@@ -188,6 +188,7 @@ export class Feed extends FeedApi {
188
188
  'feeds.feed.updated': handleFeedUpdated.bind(this),
189
189
  'feeds.feed_group.changed': Feed.noop,
190
190
  'feeds.feed_group.deleted': Feed.noop,
191
+ 'feeds.feed_group.restored': Feed.noop,
191
192
  'feeds.follow.created': handleFollowCreated.bind(this),
192
193
  'feeds.follow.deleted': handleFollowDeleted.bind(this),
193
194
  'feeds.follow.updated': handleFollowUpdated.bind(this),
@@ -216,11 +217,11 @@ export class Feed extends FeedApi {
216
217
  'app.updated': Feed.noop,
217
218
  'user.banned': Feed.noop,
218
219
  'user.deactivated': Feed.noop,
219
- 'user.muted': Feed.noop,
220
220
  'user.reactivated': Feed.noop,
221
221
  'user.updated': Feed.noop,
222
222
  'feeds.activity.feedback': handleActivityFeedback.bind(this),
223
223
  'feeds.activity.restored': Feed.noop,
224
+ 'user.unbanned': Feed.noop,
224
225
  };
225
226
 
226
227
  protected eventDispatcher: EventDispatcher<WSEvent['type'], WSEvent> =
@@ -295,7 +296,9 @@ export class Feed extends FeedApi {
295
296
  const { last_get_or_create_request_config } = this.state.getLatestValue();
296
297
  if (last_get_or_create_request_config?.watch) {
297
298
  this.inProgressGetOrCreate = undefined;
298
- await withRetry(() => this.getOrCreate(last_get_or_create_request_config));
299
+ await withRetry(() =>
300
+ this.getOrCreate(last_get_or_create_request_config),
301
+ );
299
302
  }
300
303
  }
301
304
 
@@ -509,6 +512,25 @@ export class Feed extends FeedApi {
509
512
  );
510
513
 
511
514
  const existingComments = newCommentsByEntityId[entityId]?.comments;
515
+ let comments: CommentResponse[] = existingComments
516
+ ? uniqueArrayMerge(
517
+ existingComments,
518
+ newComments,
519
+ (comment) => comment.id,
520
+ )
521
+ : newComments;
522
+ // Only sort when merging pages (existing + new); initial load order comes from API
523
+ if (
524
+ data.sort === 'first' &&
525
+ existingComments &&
526
+ existingComments.length > 0
527
+ ) {
528
+ comments = [...comments].sort(
529
+ (a, b) =>
530
+ new Date(a.created_at).getTime() -
531
+ new Date(b.created_at).getTime(),
532
+ );
533
+ }
512
534
 
513
535
  newCommentsByEntityId[entityId] = {
514
536
  ...newCommentsByEntityId[entityId],
@@ -518,13 +540,7 @@ export class Feed extends FeedApi {
518
540
  next: item.next,
519
541
  sort: data.sort,
520
542
  },
521
- comments: existingComments
522
- ? uniqueArrayMerge(
523
- existingComments,
524
- newComments,
525
- (comment) => comment.id,
526
- )
527
- : newComments,
543
+ comments,
528
544
  };
529
545
  }
530
546
 
@@ -33,6 +33,8 @@ import type {
33
33
  UpdateCommentRequest,
34
34
  UpdateCommentResponse,
35
35
  UpdateFollowRequest,
36
+ UpdatePollPartialRequest,
37
+ UpdatePollRequest,
36
38
  UserRequest,
37
39
  WSEvent,
38
40
  } from '../gen/models';
@@ -452,15 +454,40 @@ export class FeedsClient extends FeedsApi {
452
454
  return streamDevToken(userId);
453
455
  };
454
456
 
457
+ updatePoll = async (request: UpdatePollRequest) => {
458
+ const poll = this.pollFromState(request.id);
459
+ const response = await super.updatePoll(request);
460
+ if (response.poll && poll) {
461
+ poll.handlePollUpdated({ poll: response.poll, created_at: new Date() });
462
+ }
463
+ return response;
464
+ };
465
+
466
+ updatePollPartial = async (
467
+ request: UpdatePollPartialRequest & { poll_id: string },
468
+ ) => {
469
+ const poll = this.pollFromState(request.poll_id);
470
+ const response = await super.updatePollPartial(request);
471
+ if (response.poll && poll) {
472
+ poll.handlePollUpdated({ poll: response.poll, created_at: new Date() });
473
+ }
474
+ return response;
475
+ };
476
+
455
477
  closePoll = async (request: {
456
478
  poll_id: string;
457
479
  }): Promise<StreamResponse<PollResponse>> => {
458
- return await this.updatePollPartial({
480
+ const poll = this.pollFromState(request.poll_id);
481
+ const response = await super.updatePollPartial({
459
482
  poll_id: request.poll_id,
460
483
  set: {
461
484
  is_closed: true,
462
485
  },
463
486
  });
487
+ if (response.poll && poll) {
488
+ poll.handlePollClosed({ poll: response.poll, created_at: new Date() });
489
+ }
490
+ return response;
464
491
  };
465
492
 
466
493
  castPollVote = async (
@@ -18,6 +18,8 @@ import type {
18
18
  AddCommentsBatchResponse,
19
19
  AddReactionRequest,
20
20
  AddReactionResponse,
21
+ AddUserGroupMembersRequest,
22
+ AddUserGroupMembersResponse,
21
23
  BlockUsersRequest,
22
24
  BlockUsersResponse,
23
25
  CastPollVoteRequest,
@@ -32,6 +34,8 @@ import type {
32
34
  CreateGuestResponse,
33
35
  CreatePollOptionRequest,
34
36
  CreatePollRequest,
37
+ CreateUserGroupRequest,
38
+ CreateUserGroupResponse,
35
39
  DeleteActivitiesRequest,
36
40
  DeleteActivitiesResponse,
37
41
  DeleteActivityReactionResponse,
@@ -57,10 +61,12 @@ import type {
57
61
  GetOGResponse,
58
62
  GetOrCreateFeedRequest,
59
63
  GetOrCreateFeedResponse,
64
+ GetUserGroupResponse,
60
65
  ImageUploadRequest,
61
66
  ImageUploadResponse,
62
67
  ListBlockListResponse,
63
68
  ListDevicesResponse,
69
+ ListUserGroupsResponse,
64
70
  MarkActivityRequest,
65
71
  OwnBatchRequest,
66
72
  OwnBatchResponse,
@@ -100,9 +106,11 @@ import type {
100
106
  RejectFeedMemberInviteResponse,
101
107
  RejectFollowRequest,
102
108
  RejectFollowResponse,
109
+ RemoveUserGroupMembersResponse,
103
110
  Response,
104
111
  RestoreActivityRequest,
105
112
  RestoreActivityResponse,
113
+ SearchUserGroupsResponse,
106
114
  SharedLocationResponse,
107
115
  SharedLocationsResponse,
108
116
  SingleFollowResponse,
@@ -136,6 +144,8 @@ import type {
136
144
  UpdatePollOptionRequest,
137
145
  UpdatePollPartialRequest,
138
146
  UpdatePollRequest,
147
+ UpdateUserGroupRequest,
148
+ UpdateUserGroupResponse,
139
149
  UpdateUsersPartialRequest,
140
150
  UpdateUsersRequest,
141
151
  UpdateUsersResponse,
@@ -775,6 +785,7 @@ export class FeedsApi {
775
785
  mentioned_user_ids: request?.mentioned_user_ids,
776
786
  custom: request?.custom,
777
787
  location: request?.location,
788
+ search_data: request?.search_data,
778
789
  };
779
790
 
780
791
  const response = await this.apiClient.sendRequest<
@@ -935,8 +946,8 @@ export class FeedsApi {
935
946
  return { ...response.body, metadata: response.metadata };
936
947
  }
937
948
 
938
- async readCollections(request: {
939
- collection_refs: string[];
949
+ async readCollections(request?: {
950
+ collection_refs?: string[];
940
951
  }): Promise<StreamResponse<ReadCollectionsResponse>> {
941
952
  const queryParams = {
942
953
  collection_refs: request?.collection_refs,
@@ -2465,6 +2476,193 @@ export class FeedsApi {
2465
2476
  return { ...response.body, metadata: response.metadata };
2466
2477
  }
2467
2478
 
2479
+ async listUserGroups(request?: {
2480
+ limit?: number;
2481
+ id_gt?: string;
2482
+ created_at_gt?: string;
2483
+ team_id?: string;
2484
+ }): Promise<StreamResponse<ListUserGroupsResponse>> {
2485
+ const queryParams = {
2486
+ limit: request?.limit,
2487
+ id_gt: request?.id_gt,
2488
+ created_at_gt: request?.created_at_gt,
2489
+ team_id: request?.team_id,
2490
+ };
2491
+
2492
+ const response = await this.apiClient.sendRequest<
2493
+ StreamResponse<ListUserGroupsResponse>
2494
+ >('GET', '/api/v2/usergroups', undefined, queryParams);
2495
+
2496
+ decoders.ListUserGroupsResponse?.(response.body);
2497
+
2498
+ return { ...response.body, metadata: response.metadata };
2499
+ }
2500
+
2501
+ async createUserGroup(
2502
+ request: CreateUserGroupRequest,
2503
+ ): Promise<StreamResponse<CreateUserGroupResponse>> {
2504
+ const body = {
2505
+ name: request?.name,
2506
+ description: request?.description,
2507
+ id: request?.id,
2508
+ team_id: request?.team_id,
2509
+ member_ids: request?.member_ids,
2510
+ };
2511
+
2512
+ const response = await this.apiClient.sendRequest<
2513
+ StreamResponse<CreateUserGroupResponse>
2514
+ >(
2515
+ 'POST',
2516
+ '/api/v2/usergroups',
2517
+ undefined,
2518
+ undefined,
2519
+ body,
2520
+ 'application/json',
2521
+ );
2522
+
2523
+ decoders.CreateUserGroupResponse?.(response.body);
2524
+
2525
+ return { ...response.body, metadata: response.metadata };
2526
+ }
2527
+
2528
+ async searchUserGroups(request: {
2529
+ query: string;
2530
+ limit?: number;
2531
+ name_gt?: string;
2532
+ id_gt?: string;
2533
+ team_id?: string;
2534
+ }): Promise<StreamResponse<SearchUserGroupsResponse>> {
2535
+ const queryParams = {
2536
+ query: request?.query,
2537
+ limit: request?.limit,
2538
+ name_gt: request?.name_gt,
2539
+ id_gt: request?.id_gt,
2540
+ team_id: request?.team_id,
2541
+ };
2542
+
2543
+ const response = await this.apiClient.sendRequest<
2544
+ StreamResponse<SearchUserGroupsResponse>
2545
+ >('GET', '/api/v2/usergroups/search', undefined, queryParams);
2546
+
2547
+ decoders.SearchUserGroupsResponse?.(response.body);
2548
+
2549
+ return { ...response.body, metadata: response.metadata };
2550
+ }
2551
+
2552
+ async deleteUserGroup(request: {
2553
+ id: string;
2554
+ team_id?: string;
2555
+ }): Promise<StreamResponse<Response>> {
2556
+ const queryParams = {
2557
+ team_id: request?.team_id,
2558
+ };
2559
+ const pathParams = {
2560
+ id: request?.id,
2561
+ };
2562
+
2563
+ const response = await this.apiClient.sendRequest<StreamResponse<Response>>(
2564
+ 'DELETE',
2565
+ '/api/v2/usergroups/{id}',
2566
+ pathParams,
2567
+ queryParams,
2568
+ );
2569
+
2570
+ decoders.Response?.(response.body);
2571
+
2572
+ return { ...response.body, metadata: response.metadata };
2573
+ }
2574
+
2575
+ async getUserGroup(request: {
2576
+ id: string;
2577
+ team_id?: string;
2578
+ }): Promise<StreamResponse<GetUserGroupResponse>> {
2579
+ const queryParams = {
2580
+ team_id: request?.team_id,
2581
+ };
2582
+ const pathParams = {
2583
+ id: request?.id,
2584
+ };
2585
+
2586
+ const response = await this.apiClient.sendRequest<
2587
+ StreamResponse<GetUserGroupResponse>
2588
+ >('GET', '/api/v2/usergroups/{id}', pathParams, queryParams);
2589
+
2590
+ decoders.GetUserGroupResponse?.(response.body);
2591
+
2592
+ return { ...response.body, metadata: response.metadata };
2593
+ }
2594
+
2595
+ async updateUserGroup(
2596
+ request: UpdateUserGroupRequest & { id: string },
2597
+ ): Promise<StreamResponse<UpdateUserGroupResponse>> {
2598
+ const pathParams = {
2599
+ id: request?.id,
2600
+ };
2601
+ const body = {
2602
+ description: request?.description,
2603
+ name: request?.name,
2604
+ team_id: request?.team_id,
2605
+ };
2606
+
2607
+ const response = await this.apiClient.sendRequest<
2608
+ StreamResponse<UpdateUserGroupResponse>
2609
+ >(
2610
+ 'PUT',
2611
+ '/api/v2/usergroups/{id}',
2612
+ pathParams,
2613
+ undefined,
2614
+ body,
2615
+ 'application/json',
2616
+ );
2617
+
2618
+ decoders.UpdateUserGroupResponse?.(response.body);
2619
+
2620
+ return { ...response.body, metadata: response.metadata };
2621
+ }
2622
+
2623
+ async removeUserGroupMembers(request: {
2624
+ id: string;
2625
+ }): Promise<StreamResponse<RemoveUserGroupMembersResponse>> {
2626
+ const pathParams = {
2627
+ id: request?.id,
2628
+ };
2629
+
2630
+ const response = await this.apiClient.sendRequest<
2631
+ StreamResponse<RemoveUserGroupMembersResponse>
2632
+ >('DELETE', '/api/v2/usergroups/{id}/members', pathParams, undefined);
2633
+
2634
+ decoders.RemoveUserGroupMembersResponse?.(response.body);
2635
+
2636
+ return { ...response.body, metadata: response.metadata };
2637
+ }
2638
+
2639
+ async addUserGroupMembers(
2640
+ request: AddUserGroupMembersRequest & { id: string },
2641
+ ): Promise<StreamResponse<AddUserGroupMembersResponse>> {
2642
+ const pathParams = {
2643
+ id: request?.id,
2644
+ };
2645
+ const body = {
2646
+ member_ids: request?.member_ids,
2647
+ team_id: request?.team_id,
2648
+ };
2649
+
2650
+ const response = await this.apiClient.sendRequest<
2651
+ StreamResponse<AddUserGroupMembersResponse>
2652
+ >(
2653
+ 'POST',
2654
+ '/api/v2/usergroups/{id}/members',
2655
+ pathParams,
2656
+ undefined,
2657
+ body,
2658
+ 'application/json',
2659
+ );
2660
+
2661
+ decoders.AddUserGroupMembersResponse?.(response.body);
2662
+
2663
+ return { ...response.body, metadata: response.metadata };
2664
+ }
2665
+
2468
2666
  async queryUsers(request?: {
2469
2667
  payload?: QueryUsersPayload;
2470
2668
  }): Promise<StreamResponse<QueryUsersResponse>> {