@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
@@ -2,7 +2,7 @@ import axios from 'axios';
2
2
 
3
3
  const decoders = {};
4
4
  const decodeDatetimeType = (input) => typeof input === 'number'
5
- ? new Date(Math.floor(input / 1000000))
5
+ ? new Date(Math.floor(input / 1e6))
6
6
  : new Date(input);
7
7
  decoders.DatetimeType = decodeDatetimeType;
8
8
  const decode = (typeMappings, input) => {
@@ -4518,20 +4518,29 @@ function handleCommentAdded(event) {
4518
4518
  function handleCommentDeleted({ comment }) {
4519
4519
  const entityId = comment.parent_id ?? comment.object_id;
4520
4520
  this.state.next((currentState) => {
4521
- const newCommentsByEntityId = {
4522
- ...currentState.comments_by_entity_id,
4523
- [entityId]: {
4524
- ...currentState.comments_by_entity_id[entityId],
4525
- },
4526
- };
4521
+ let newCommentsByEntityId;
4527
4522
  const index = this.getCommentIndex(comment, currentState);
4528
- if (newCommentsByEntityId?.[entityId]?.comments?.length && index !== -1) {
4523
+ if (index !== -1) {
4524
+ newCommentsByEntityId ?? (newCommentsByEntityId = {
4525
+ ...currentState.comments_by_entity_id,
4526
+ [entityId]: {
4527
+ ...currentState.comments_by_entity_id[entityId],
4528
+ },
4529
+ });
4529
4530
  newCommentsByEntityId[entityId].comments = [
4530
4531
  ...newCommentsByEntityId[entityId].comments,
4531
4532
  ];
4532
4533
  newCommentsByEntityId[entityId]?.comments?.splice(index, 1);
4533
4534
  }
4534
- delete newCommentsByEntityId[comment.id];
4535
+ if (typeof currentState.comments_by_entity_id[comment.id] !== 'undefined') {
4536
+ newCommentsByEntityId ?? (newCommentsByEntityId = {
4537
+ ...currentState.comments_by_entity_id,
4538
+ });
4539
+ delete newCommentsByEntityId[comment.id];
4540
+ }
4541
+ if (!newCommentsByEntityId) {
4542
+ return currentState;
4543
+ }
4535
4544
  return {
4536
4545
  ...currentState,
4537
4546
  comments_by_entity_id: newCommentsByEntityId,
@@ -5086,13 +5095,80 @@ function handleActivityReactionDeleted(event) {
5086
5095
  }
5087
5096
  }
5088
5097
 
5098
+ const updateNotificationStatusFromActivityMarked = (event, currentNotificationStatus, aggregatedActivities = []) => {
5099
+ if (!currentNotificationStatus) {
5100
+ return {
5101
+ changed: false,
5102
+ };
5103
+ }
5104
+ const newState = {
5105
+ ...currentNotificationStatus,
5106
+ };
5107
+ if (event.mark_all_read) {
5108
+ const allGroupIds = aggregatedActivities.map((activity) => activity.group);
5109
+ newState.read_activities = [
5110
+ ...new Set([
5111
+ ...(currentNotificationStatus.read_activities ?? []),
5112
+ ...allGroupIds,
5113
+ ]),
5114
+ ];
5115
+ }
5116
+ if (event.mark_read && event.mark_read.length > 0) {
5117
+ newState.read_activities = [
5118
+ ...new Set([
5119
+ ...(currentNotificationStatus?.read_activities ?? []),
5120
+ ...event.mark_read,
5121
+ ]),
5122
+ ];
5123
+ }
5124
+ if (event.mark_all_seen) {
5125
+ newState.last_seen_at = new Date();
5126
+ }
5127
+ return {
5128
+ changed: true,
5129
+ data: { notification_status: newState },
5130
+ };
5131
+ };
5132
+ function handleActivityMarked(event) {
5133
+ const result = updateNotificationStatusFromActivityMarked(event, this.currentState.notification_status, this.currentState.aggregated_activities);
5134
+ if (result.changed) {
5135
+ this.state.partialNext({
5136
+ notification_status: result.data?.notification_status,
5137
+ });
5138
+ }
5139
+ }
5140
+
5089
5141
  function handleFeedUpdated(event) {
5090
5142
  this.state.partialNext({ ...event.feed });
5091
5143
  }
5092
5144
 
5145
+ const updateNotificationFeedFromEvent = (event) => {
5146
+ const updates = {};
5147
+ if (event.notification_status) {
5148
+ updates.notification_status = event.notification_status;
5149
+ }
5150
+ if (event.aggregated_activities) {
5151
+ updates.aggregated_activities = event.aggregated_activities;
5152
+ }
5153
+ // Only return changed if we have actual updates
5154
+ if (Object.keys(updates).length > 0) {
5155
+ return {
5156
+ changed: true,
5157
+ data: updates,
5158
+ };
5159
+ }
5160
+ return {
5161
+ changed: false,
5162
+ };
5163
+ };
5093
5164
  function handleNotificationFeedUpdated(event) {
5094
- console.info('notification feed updated', event);
5095
- // TODO: handle notification feed updates
5165
+ const result = updateNotificationFeedFromEvent(event);
5166
+ if (result.changed) {
5167
+ this.state.partialNext({
5168
+ notification_status: result.data?.notification_status,
5169
+ aggregated_activities: result.data?.aggregated_activities,
5170
+ });
5171
+ }
5096
5172
  }
5097
5173
 
5098
5174
  function handleWatchStarted() {
@@ -5147,7 +5223,7 @@ class Feed extends FeedApi {
5147
5223
  'feeds.poll.vote_removed': Feed.noop,
5148
5224
  'feeds.activity.pinned': Feed.noop,
5149
5225
  'feeds.activity.unpinned': Feed.noop,
5150
- 'feeds.activity.marked': Feed.noop,
5226
+ 'feeds.activity.marked': handleActivityMarked.bind(this),
5151
5227
  'moderation.custom_action': Feed.noop,
5152
5228
  'moderation.flagged': Feed.noop,
5153
5229
  'moderation.mark_reviewed': Feed.noop,