@stream-io/feeds-client 0.3.23 → 0.3.25

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 (38) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/index.js +2 -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 +3 -2
  6. package/dist/es/react-bindings.mjs +1 -1
  7. package/dist/{feeds-client-BJQdmCB4.mjs → feeds-client-BULS-w1O.mjs} +114 -48
  8. package/dist/feeds-client-BULS-w1O.mjs.map +1 -0
  9. package/dist/{feeds-client-BUZVIyHd.js → feeds-client-DUD5wy6N.js} +114 -48
  10. package/dist/feeds-client-DUD5wy6N.js.map +1 -0
  11. package/dist/types/common/Poll.d.ts +6 -6
  12. package/dist/types/common/Poll.d.ts.map +1 -1
  13. package/dist/types/feed/event-handlers/activity/handle-activity-added.d.ts +3 -1
  14. package/dist/types/feed/event-handlers/activity/handle-activity-added.d.ts.map +1 -1
  15. package/dist/types/feed/feed.d.ts +4 -1
  16. package/dist/types/feed/feed.d.ts.map +1 -1
  17. package/dist/types/feeds-client/feeds-client.d.ts +10 -3
  18. package/dist/types/feeds-client/feeds-client.d.ts.map +1 -1
  19. package/dist/types/feeds-client/get-or-create-active-feed.d.ts +1 -2
  20. package/dist/types/feeds-client/get-or-create-active-feed.d.ts.map +1 -1
  21. package/dist/types/utils/check-own-fields-equality.d.ts +5 -0
  22. package/dist/types/utils/check-own-fields-equality.d.ts.map +1 -0
  23. package/dist/types/utils/index.d.ts +1 -0
  24. package/dist/types/utils/index.d.ts.map +1 -1
  25. package/dist/types/utils/own-feed-fields.d.ts +3 -0
  26. package/dist/types/utils/own-feed-fields.d.ts.map +1 -0
  27. package/package.json +1 -1
  28. package/src/common/Poll.ts +13 -30
  29. package/src/feed/event-handlers/activity/handle-activity-added.ts +3 -1
  30. package/src/feed/feed.ts +49 -16
  31. package/src/feeds-client/feeds-client.ts +69 -32
  32. package/src/feeds-client/get-or-create-active-feed.ts +2 -6
  33. package/src/test-utils/response-generators.ts +2 -1
  34. package/src/utils/check-own-fields-equality.ts +40 -0
  35. package/src/utils/index.ts +1 -0
  36. package/src/utils/own-feed-fields.ts +6 -0
  37. package/dist/feeds-client-BJQdmCB4.mjs.map +0 -1
  38. package/dist/feeds-client-BUZVIyHd.js.map +0 -1
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const require$$0 = require("react");
4
4
  require("@stream-io/state-store");
5
- const feedsClient = require("../feeds-client-BUZVIyHd.js");
5
+ const feedsClient = require("../feeds-client-DUD5wy6N.js");
6
6
  var shim = { exports: {} };
7
7
  var useSyncExternalStoreShim_production = {};
8
8
  /**
package/dist/es/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import { StateStore } from "@stream-io/state-store";
2
2
  export * from "@stream-io/state-store";
3
- import { d as debounce } from "../feeds-client-BJQdmCB4.mjs";
4
- import { A, C, a, F, S, b, c, n, m, k, g, e, h, f, j, i, r, s, u, l } from "../feeds-client-BJQdmCB4.mjs";
3
+ import { d as debounce } from "../feeds-client-BULS-w1O.mjs";
4
+ import { A, C, a, F, S, b, c, n, m, k, g, e, h, f, j, i, o, r, s, u, l } from "../feeds-client-BULS-w1O.mjs";
5
5
  import { LogLevelEnum } from "@stream-io/logger";
6
6
  const ChannelOwnCapability = {
7
7
  BAN_CHANNEL_MEMBERS: "ban-channel-members",
@@ -461,6 +461,7 @@ export {
461
461
  f as isReactionResponse,
462
462
  j as isVideoFile,
463
463
  i as isVoteAnswer,
464
+ o as ownFeedFields,
464
465
  r as replaceUniqueArrayMerge,
465
466
  s as shouldUpdateState,
466
467
  u as uniqueArrayMerge,
@@ -1,6 +1,6 @@
1
1
  import require$$0, { useCallback, useMemo, useState, useEffect, createContext, useContext, useRef } from "react";
2
2
  import "@stream-io/state-store";
3
- import { F as FeedsClient, g as isCommentResponse, c as checkHasAnotherPage } from "../feeds-client-BJQdmCB4.mjs";
3
+ import { F as FeedsClient, g as isCommentResponse, c as checkHasAnotherPage } from "../feeds-client-BULS-w1O.mjs";
4
4
  var shim = { exports: {} };
5
5
  var useSyncExternalStoreShim_production = {};
6
6
  /**
@@ -3918,7 +3918,7 @@ const getRateLimitFromResponseHeader = (response_headers) => {
3918
3918
  };
3919
3919
  return result;
3920
3920
  };
3921
- const version = "0.3.23";
3921
+ const version = "0.3.25";
3922
3922
  const axios = axiosImport.default ?? axiosImport;
3923
3923
  class ApiClient {
3924
3924
  constructor(apiKey, tokenManager, connectionIdManager, options) {
@@ -4421,7 +4421,6 @@ class StreamPoll {
4421
4421
  } = event.poll;
4422
4422
  this.state.partialNext({
4423
4423
  answers_count,
4424
- // @ts-expect-error Incompatibility between PollResponseData and Poll due to teams_role, remove when OpenAPI spec is fixed
4425
4424
  latest_votes_by_option,
4426
4425
  vote_count,
4427
4426
  vote_counts_by_option,
@@ -4444,7 +4443,6 @@ class StreamPoll {
4444
4443
  if (isOwnVote) {
4445
4444
  if (isVoteAnswer(event.poll_vote)) {
4446
4445
  latestAnswers = [
4447
- // @ts-expect-error Incompatibility between PollResponseData and Poll due to teams_role, remove when OpenAPI spec is fixed
4448
4446
  event.poll_vote,
4449
4447
  ...latestAnswers.filter((answer) => answer.id !== event.poll_vote.id)
4450
4448
  ];
@@ -4484,7 +4482,6 @@ class StreamPoll {
4484
4482
  } = event.poll;
4485
4483
  this.state.partialNext({
4486
4484
  answers_count,
4487
- // @ts-expect-error Incompatibility between PollResponseData and Poll due to teams_role, remove when OpenAPI spec is fixed
4488
4485
  latest_votes_by_option,
4489
4486
  vote_count,
4490
4487
  vote_counts_by_option,
@@ -4527,7 +4524,6 @@ class StreamPoll {
4527
4524
  } = event.poll;
4528
4525
  this.state.partialNext({
4529
4526
  answers_count,
4530
- // @ts-expect-error Incompatibility between PollResponseData and Poll due to teams_role, remove when OpenAPI spec is fixed
4531
4527
  latest_votes_by_option,
4532
4528
  vote_count,
4533
4529
  vote_counts_by_option,
@@ -4784,6 +4780,7 @@ function updateEntityInArray({
4784
4780
  updatedEntities[index] = newEntity;
4785
4781
  return { changed: true, entities: updatedEntities };
4786
4782
  }
4783
+ const ownFeedFields = ["own_capabilities", "own_follows", "own_membership"];
4787
4784
  const updateStateFollowCreated = (follow, currentState, currentFeedId, connectedUserId) => {
4788
4785
  if (follow.status !== "accepted") {
4789
4786
  return { changed: false, data: currentState };
@@ -5490,7 +5487,7 @@ function handleBookmarkUpdated(event) {
5490
5487
  });
5491
5488
  }
5492
5489
  }
5493
- function addActivitiesToState(newActivities, activities, position) {
5490
+ function addActivitiesToState(newActivities, activities, position, { fromWebSocket } = { fromWebSocket: false }) {
5494
5491
  if (activities === void 0) {
5495
5492
  return {
5496
5493
  changed: false,
@@ -5513,7 +5510,7 @@ function addActivitiesToState(newActivities, activities, position) {
5513
5510
  ...activities,
5514
5511
  ...position === "end" ? newActivitiesDeduplicated : []
5515
5512
  ];
5516
- this.newActivitiesAdded(newActivitiesDeduplicated);
5513
+ this.newActivitiesAdded(newActivitiesDeduplicated, { fromWebSocket });
5517
5514
  result = { changed: true, activities: updatedActivities };
5518
5515
  }
5519
5516
  return result;
@@ -5528,7 +5525,8 @@ function handleActivityAdded(event) {
5528
5525
  const result = addActivitiesToState.bind(this)(
5529
5526
  [event.activity],
5530
5527
  currentActivities,
5531
- this.currentState.addNewActivitiesTo
5528
+ this.currentState.addNewActivitiesTo,
5529
+ { fromWebSocket: true }
5532
5530
  );
5533
5531
  if (result.changed) {
5534
5532
  const activity = event.activity;
@@ -6232,8 +6230,8 @@ const deepEqual = (x, y) => {
6232
6230
  return false;
6233
6231
  }
6234
6232
  };
6235
- function getOrCreateActiveFeed(group, id, data, watch) {
6236
- return this.getOrCreateActiveFeed(group, id, data, watch);
6233
+ function getOrCreateActiveFeed(...args) {
6234
+ return this.getOrCreateActiveFeed(...args);
6237
6235
  }
6238
6236
  const _Feed = class _Feed extends FeedApi {
6239
6237
  constructor(client, groupId, id, data, watch = false, addNewActivitiesTo = "start", activityAddedEventFilter) {
@@ -6816,9 +6814,11 @@ const _Feed = class _Feed extends FeedApi {
6816
6814
  event.activity.current_feed = currentActivity.current_feed;
6817
6815
  }
6818
6816
  if (event.activity.feeds.length === 1 && event.activity.current_feed && currentActivity?.current_feed) {
6819
- event.activity.current_feed.own_capabilities = currentActivity.current_feed.own_capabilities;
6820
- event.activity.current_feed.own_follows = currentActivity.current_feed.own_follows;
6821
- event.activity.current_feed.own_membership = currentActivity.current_feed.own_membership;
6817
+ ownFeedFields.forEach((field) => {
6818
+ if (field in currentActivity.current_feed) {
6819
+ event.activity.current_feed[field] = currentActivity.current_feed[field];
6820
+ }
6821
+ });
6822
6822
  }
6823
6823
  }
6824
6824
  eventHandler?.(event);
@@ -6828,17 +6828,31 @@ const _Feed = class _Feed extends FeedApi {
6828
6828
  }
6829
6829
  this.eventDispatcher.dispatch(event);
6830
6830
  }
6831
- newActivitiesAdded(activities) {
6831
+ newActivitiesAdded(activities, options = { fromWebSocket: false }) {
6832
6832
  this.client.hydratePollCache(activities);
6833
- activities.forEach((activity) => {
6834
- if (activity.current_feed) {
6835
- getOrCreateActiveFeed.bind(this.client)(
6836
- activity.current_feed.group_id,
6837
- activity.current_feed.id,
6838
- activity.current_feed
6839
- );
6840
- }
6841
- });
6833
+ this.getOrCreateFeeds(activities, options);
6834
+ }
6835
+ getOrCreateFeeds(activities, options) {
6836
+ const enrichmentOptions = this.currentState.last_get_or_create_request_config?.enrichment_options;
6837
+ if (!enrichmentOptions?.skip_activity_current_feed && !enrichmentOptions?.skip_all) {
6838
+ const feedsToGetOrCreate = /* @__PURE__ */ new Map();
6839
+ activities.forEach((activity) => {
6840
+ if (activity.current_feed && !feedsToGetOrCreate.has(activity.current_feed.feed)) {
6841
+ feedsToGetOrCreate.set(
6842
+ activity.current_feed.feed,
6843
+ activity.current_feed
6844
+ );
6845
+ }
6846
+ });
6847
+ feedsToGetOrCreate.values().forEach((feed) => {
6848
+ getOrCreateActiveFeed.bind(this.client)({
6849
+ group: feed.group_id,
6850
+ id: feed.id,
6851
+ data: feed,
6852
+ fromWebSocket: options.fromWebSocket
6853
+ });
6854
+ });
6855
+ }
6842
6856
  }
6843
6857
  };
6844
6858
  _Feed.noop = () => {
@@ -7128,6 +7142,30 @@ class ActivityWithStateUpdates {
7128
7142
  function getFeed() {
7129
7143
  return this.feed;
7130
7144
  }
7145
+ const isOwnFollowsEqual = (currentState, newState) => {
7146
+ const existingFollows = new Set(
7147
+ currentState.own_follows?.map(
7148
+ (f) => `${f.source_feed.feed}:${f.target_feed.feed}:${f.updated_at.getTime()}`
7149
+ )
7150
+ );
7151
+ const newFollows = new Set(
7152
+ newState.own_follows?.map(
7153
+ (f) => `${f.source_feed.feed}:${f.target_feed.feed}:${f.updated_at.getTime()}`
7154
+ )
7155
+ );
7156
+ if (existingFollows.size === newFollows.size) {
7157
+ const areEqual = Array.from(existingFollows).every(
7158
+ (f) => newFollows.has(f)
7159
+ );
7160
+ if (areEqual) {
7161
+ return true;
7162
+ }
7163
+ }
7164
+ return false;
7165
+ };
7166
+ const isOwnMembershipEqual = (currentState, newState) => {
7167
+ return (currentState.own_membership?.updated_at.getTime() ?? 0) === (newState.own_membership?.updated_at.getTime() ?? 0);
7168
+ };
7131
7169
  class FeedsClient extends FeedsApi {
7132
7170
  constructor(apiKey, options) {
7133
7171
  const tokenManager = new TokenManager();
@@ -7379,13 +7417,11 @@ class FeedsClient extends FeedsApi {
7379
7417
  this.on = this.eventDispatcher.on;
7380
7418
  this.off = this.eventDispatcher.off;
7381
7419
  this.feed = (groupId, id, options2) => {
7382
- return this.getOrCreateActiveFeed(
7383
- groupId,
7420
+ return this.getOrCreateActiveFeed({
7421
+ group: groupId,
7384
7422
  id,
7385
- void 0,
7386
- void 0,
7387
- options2
7388
- );
7423
+ options: options2
7424
+ });
7389
7425
  };
7390
7426
  this.activityWithStateUpdates = (id) => {
7391
7427
  let activity = this.activeActivities[id];
@@ -7402,7 +7438,14 @@ class FeedsClient extends FeedsApi {
7402
7438
  };
7403
7439
  this.eventDispatcher.dispatch(networkEvent);
7404
7440
  };
7405
- this.getOrCreateActiveFeed = (group, id, data, watch, options2) => {
7441
+ this.getOrCreateActiveFeed = ({
7442
+ group,
7443
+ id,
7444
+ data,
7445
+ watch,
7446
+ options: options2,
7447
+ fromWebSocket = false
7448
+ }) => {
7406
7449
  const fid = `${group}:${id}`;
7407
7450
  let isCreated = false;
7408
7451
  if (!this.activeFeeds[fid]) {
@@ -7427,7 +7470,29 @@ class FeedsClient extends FeedsApi {
7427
7470
  }
7428
7471
  }
7429
7472
  if (!feed.currentState.watch) {
7430
- if (data) handleFeedUpdated.call(feed, { feed: data });
7473
+ if (!isCreated && data) {
7474
+ if ((feed.currentState.updated_at?.getTime() ?? 0) < data.updated_at.getTime()) {
7475
+ handleFeedUpdated.call(feed, { feed: data });
7476
+ } else if ((feed.currentState.updated_at?.getTime() ?? 0) === data.updated_at.getTime() && !fromWebSocket) {
7477
+ const fieldsToUpdate = [];
7478
+ if (!isOwnFollowsEqual(feed.currentState, data)) {
7479
+ fieldsToUpdate.push("own_follows");
7480
+ }
7481
+ if (!isOwnMembershipEqual(feed.currentState, data)) {
7482
+ fieldsToUpdate.push("own_membership");
7483
+ }
7484
+ if (fieldsToUpdate.length > 0) {
7485
+ const fieldsToUpdateData = fieldsToUpdate.reduce(
7486
+ (acc, field) => {
7487
+ acc[field] = data[field];
7488
+ return acc;
7489
+ },
7490
+ {}
7491
+ );
7492
+ feed.state.partialNext(fieldsToUpdateData);
7493
+ }
7494
+ }
7495
+ }
7431
7496
  if (watch) handleWatchStarted.call(feed);
7432
7497
  }
7433
7498
  return feed;
@@ -7461,11 +7526,11 @@ class FeedsClient extends FeedsApi {
7461
7526
  }
7462
7527
  case "feeds.feed.created": {
7463
7528
  if (this.activeFeeds[event.feed.id]) break;
7464
- this.getOrCreateActiveFeed(
7465
- event.feed.group_id,
7466
- event.feed.id,
7467
- event.feed
7468
- );
7529
+ this.getOrCreateActiveFeed({
7530
+ group: event.feed.group_id,
7531
+ id: event.feed.id,
7532
+ data: event.feed
7533
+ });
7469
7534
  break;
7470
7535
  }
7471
7536
  case "feeds.feed.deleted": {
@@ -7605,12 +7670,12 @@ class FeedsClient extends FeedsApi {
7605
7670
  const response = await this._queryFeeds(request);
7606
7671
  const feedResponses = response.feeds;
7607
7672
  const feeds = feedResponses.map(
7608
- (feedResponse) => this.getOrCreateActiveFeed(
7609
- feedResponse.group_id,
7610
- feedResponse.id,
7611
- feedResponse,
7612
- request?.watch
7613
- )
7673
+ (feedResponse) => this.getOrCreateActiveFeed({
7674
+ group: feedResponse.group_id,
7675
+ id: feedResponse.id,
7676
+ data: feedResponse,
7677
+ watch: request?.watch
7678
+ })
7614
7679
  );
7615
7680
  this.hydrateCapabilitiesCache(feedResponses);
7616
7681
  return {
@@ -7700,11 +7765,11 @@ class FeedsClient extends FeedsApi {
7700
7765
  async getFollowSuggestions(...params) {
7701
7766
  const response = await super.getFollowSuggestions(...params);
7702
7767
  response.suggestions.forEach((suggestion) => {
7703
- this.getOrCreateActiveFeed(
7704
- suggestion.group_id,
7705
- suggestion.id,
7706
- suggestion
7707
- );
7768
+ this.getOrCreateActiveFeed({
7769
+ group: suggestion.group_id,
7770
+ id: suggestion.id,
7771
+ data: suggestion
7772
+ });
7708
7773
  });
7709
7774
  return response;
7710
7775
  }
@@ -7785,8 +7850,9 @@ export {
7785
7850
  updateEntityInArray as l,
7786
7851
  feedsLoggerSystem as m,
7787
7852
  ensureExhausted as n,
7853
+ ownFeedFields as o,
7788
7854
  replaceUniqueArrayMerge as r,
7789
7855
  shouldUpdateState as s,
7790
7856
  uniqueArrayMerge as u
7791
7857
  };
7792
- //# sourceMappingURL=feeds-client-BJQdmCB4.mjs.map
7858
+ //# sourceMappingURL=feeds-client-BULS-w1O.mjs.map