@stream-io/feeds-client 0.1.10 → 0.2.0

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 (168) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/@react-bindings/contexts/StreamFeedContext.d.ts +1 -1
  3. package/dist/@react-bindings/contexts/StreamFeedsContext.d.ts +1 -1
  4. package/dist/@react-bindings/hooks/feed-state-hooks/useComments.d.ts +1 -1
  5. package/dist/@react-bindings/hooks/feed-state-hooks/useFeedActivities.d.ts +1 -1
  6. package/dist/@react-bindings/hooks/feed-state-hooks/useFeedMetadata.d.ts +1 -1
  7. package/dist/@react-bindings/hooks/feed-state-hooks/useFollowers.d.ts +1 -1
  8. package/dist/@react-bindings/hooks/feed-state-hooks/useFollowing.d.ts +1 -1
  9. package/dist/@react-bindings/hooks/feed-state-hooks/useOwnCapabilities.d.ts +1 -1
  10. package/dist/@react-bindings/hooks/feed-state-hooks/useOwnFollows.d.ts +1 -1
  11. package/dist/@react-bindings/hooks/useCreateFeedsClient.d.ts +1 -1
  12. package/dist/@react-bindings/wrappers/StreamFeed.d.ts +1 -1
  13. package/dist/index-react-bindings.browser.cjs +1720 -1601
  14. package/dist/index-react-bindings.browser.cjs.map +1 -1
  15. package/dist/index-react-bindings.browser.js +1720 -1601
  16. package/dist/index-react-bindings.browser.js.map +1 -1
  17. package/dist/index-react-bindings.node.cjs +1720 -1601
  18. package/dist/index-react-bindings.node.cjs.map +1 -1
  19. package/dist/index-react-bindings.node.js +1720 -1601
  20. package/dist/index-react-bindings.node.js.map +1 -1
  21. package/dist/index.browser.cjs +1724 -1602
  22. package/dist/index.browser.cjs.map +1 -1
  23. package/dist/index.browser.js +1722 -1603
  24. package/dist/index.browser.js.map +1 -1
  25. package/dist/index.d.ts +2 -2
  26. package/dist/index.node.cjs +1724 -1602
  27. package/dist/index.node.cjs.map +1 -1
  28. package/dist/index.node.js +1722 -1603
  29. package/dist/index.node.js.map +1 -1
  30. package/dist/src/common/ActivitySearchSource.d.ts +1 -1
  31. package/dist/src/common/FeedSearchSource.d.ts +2 -2
  32. package/dist/src/common/Poll.d.ts +1 -1
  33. package/dist/src/common/UserSearchSource.d.ts +1 -1
  34. package/dist/src/common/real-time/StableWSConnection.d.ts +3 -3
  35. package/dist/src/feed/event-handlers/activity/handle-activity-added.d.ts +7 -0
  36. package/dist/src/feed/event-handlers/activity/handle-activity-deleted.d.ts +8 -0
  37. package/dist/src/feed/event-handlers/activity/handle-activity-reaction-added.d.ts +8 -0
  38. package/dist/src/feed/event-handlers/activity/handle-activity-reaction-deleted.d.ts +8 -0
  39. package/dist/src/feed/event-handlers/activity/handle-activity-removed-from-feed.d.ts +3 -0
  40. package/dist/src/feed/event-handlers/activity/handle-activity-updated.d.ts +8 -0
  41. package/dist/src/feed/event-handlers/activity/index.d.ts +6 -0
  42. package/dist/src/feed/event-handlers/bookmark/handle-bookmark-added.d.ts +8 -0
  43. package/dist/src/feed/event-handlers/bookmark/handle-bookmark-deleted.d.ts +9 -0
  44. package/dist/src/feed/event-handlers/bookmark/handle-bookmark-updated.d.ts +8 -0
  45. package/dist/src/feed/event-handlers/bookmark/index.d.ts +3 -0
  46. package/dist/src/feed/event-handlers/comment/handle-comment-added.d.ts +3 -0
  47. package/dist/src/feed/event-handlers/comment/handle-comment-deleted.d.ts +3 -0
  48. package/dist/src/feed/event-handlers/comment/handle-comment-reaction.d.ts +3 -0
  49. package/dist/src/feed/event-handlers/comment/handle-comment-updated.d.ts +3 -0
  50. package/dist/src/feed/event-handlers/comment/index.d.ts +4 -0
  51. package/dist/src/feed/event-handlers/feed/handle-feed-updated.d.ts +3 -0
  52. package/dist/src/feed/event-handlers/feed/index.d.ts +1 -0
  53. package/dist/src/feed/event-handlers/feed-member/handle-feed-member-added.d.ts +3 -0
  54. package/dist/src/feed/event-handlers/feed-member/handle-feed-member-removed.d.ts +3 -0
  55. package/dist/src/feed/event-handlers/feed-member/handle-feed-member-updated.d.ts +3 -0
  56. package/dist/src/feed/event-handlers/feed-member/index.d.ts +3 -0
  57. package/dist/src/feed/event-handlers/follow/handle-follow-created.d.ts +7 -0
  58. package/dist/src/feed/event-handlers/follow/handle-follow-deleted.d.ts +7 -0
  59. package/dist/src/feed/event-handlers/follow/handle-follow-updated.d.ts +3 -0
  60. package/dist/src/feed/event-handlers/follow/index.d.ts +3 -0
  61. package/dist/src/feed/event-handlers/index.d.ts +8 -0
  62. package/dist/src/feed/event-handlers/notification-feed/handle-notification-feed-updated.d.ts +3 -0
  63. package/dist/src/feed/event-handlers/notification-feed/index.d.ts +1 -0
  64. package/dist/src/feed/event-handlers/watch/handle-watch-started.d.ts +2 -0
  65. package/dist/src/feed/event-handlers/watch/handle-watch-stopped.d.ts +2 -0
  66. package/dist/src/feed/event-handlers/watch/index.d.ts +2 -0
  67. package/dist/src/{Feed.d.ts → feed/feed.d.ts} +16 -43
  68. package/dist/src/feed/index.d.ts +2 -0
  69. package/dist/src/feeds-client/event-handlers/index.d.ts +1 -0
  70. package/dist/src/feeds-client/event-handlers/user/handle-user-updated.d.ts +3 -0
  71. package/dist/src/feeds-client/feeds-client.d.ts +76 -0
  72. package/dist/src/feeds-client/index.d.ts +2 -0
  73. package/dist/src/gen/feeds/FeedsApi.d.ts +27 -23
  74. package/dist/src/gen/models/index.d.ts +168 -23
  75. package/dist/src/gen-imports.d.ts +1 -1
  76. package/dist/src/test-utils/index.d.ts +1 -0
  77. package/dist/src/test-utils/response-generators.d.ts +9 -0
  78. package/dist/src/types-internal.d.ts +7 -0
  79. package/dist/src/types.d.ts +1 -1
  80. package/dist/src/utils/check-has-another-page.d.ts +1 -0
  81. package/dist/src/utils/constants.d.ts +3 -0
  82. package/dist/src/utils/index.d.ts +5 -0
  83. package/dist/src/utils/state-update-queue.d.ts +6 -0
  84. package/dist/src/utils/type-assertions.d.ts +7 -0
  85. package/dist/src/utils/unique-array-merge.d.ts +1 -0
  86. package/dist/tsconfig.tsbuildinfo +1 -1
  87. package/index.ts +2 -2
  88. package/package.json +3 -2
  89. package/src/common/ActivitySearchSource.ts +1 -1
  90. package/src/common/FeedSearchSource.ts +2 -2
  91. package/src/common/Poll.ts +1 -1
  92. package/src/common/UserSearchSource.ts +1 -1
  93. package/src/{state-updates → feed/event-handlers/activity}/activity-reaction-utils.test.ts +12 -2
  94. package/src/{state-updates → feed/event-handlers/activity}/activity-utils.test.ts +3 -2
  95. package/src/{state-updates/activity-utils.ts → feed/event-handlers/activity/handle-activity-added.ts} +16 -36
  96. package/src/feed/event-handlers/activity/handle-activity-deleted.ts +30 -0
  97. package/src/feed/event-handlers/activity/handle-activity-reaction-added.ts +67 -0
  98. package/src/feed/event-handlers/activity/handle-activity-reaction-deleted.ts +75 -0
  99. package/src/feed/event-handlers/activity/handle-activity-removed-from-feed.ts +16 -0
  100. package/src/feed/event-handlers/activity/handle-activity-updated.ts +47 -0
  101. package/src/feed/event-handlers/activity/index.ts +6 -0
  102. package/src/{state-updates → feed/event-handlers/bookmark}/bookmark-utils.test.ts +2 -2
  103. package/src/feed/event-handlers/bookmark/handle-bookmark-added.ts +63 -0
  104. package/src/feed/event-handlers/bookmark/handle-bookmark-deleted.ts +84 -0
  105. package/src/feed/event-handlers/bookmark/handle-bookmark-updated.ts +76 -0
  106. package/src/feed/event-handlers/bookmark/index.ts +3 -0
  107. package/src/feed/event-handlers/comment/handle-comment-added.ts +38 -0
  108. package/src/feed/event-handlers/comment/handle-comment-deleted.ts +35 -0
  109. package/src/feed/event-handlers/comment/handle-comment-reaction.ts +61 -0
  110. package/src/feed/event-handlers/comment/handle-comment-updated.ts +35 -0
  111. package/src/feed/event-handlers/comment/index.ts +4 -0
  112. package/src/feed/event-handlers/feed/handle-feed-updated.ts +9 -0
  113. package/src/feed/event-handlers/feed/index.ts +1 -0
  114. package/src/feed/event-handlers/feed-member/handle-feed-member-added.ts +31 -0
  115. package/src/feed/event-handlers/feed-member/handle-feed-member-removed.ts +24 -0
  116. package/src/feed/event-handlers/feed-member/handle-feed-member-updated.ts +40 -0
  117. package/src/feed/event-handlers/feed-member/index.ts +3 -0
  118. package/src/feed/event-handlers/follow/handle-follow-created.test.ts +250 -0
  119. package/src/feed/event-handlers/follow/handle-follow-created.ts +90 -0
  120. package/src/feed/event-handlers/follow/handle-follow-deleted.test.ts +268 -0
  121. package/src/feed/event-handlers/follow/handle-follow-deleted.ts +95 -0
  122. package/src/feed/event-handlers/follow/handle-follow-updated.test.ts +174 -0
  123. package/src/feed/event-handlers/follow/handle-follow-updated.ts +85 -0
  124. package/src/feed/event-handlers/follow/index.ts +3 -0
  125. package/src/feed/event-handlers/index.ts +8 -0
  126. package/src/feed/event-handlers/notification-feed/handle-notification-feed-updated.ts +10 -0
  127. package/src/feed/event-handlers/notification-feed/index.ts +1 -0
  128. package/src/feed/event-handlers/watch/handle-watch-started.ts +5 -0
  129. package/src/feed/event-handlers/watch/handle-watch-stopped.ts +5 -0
  130. package/src/feed/event-handlers/watch/index.ts +2 -0
  131. package/src/{Feed.ts → feed/feed.ts} +87 -516
  132. package/src/feed/index.ts +2 -0
  133. package/src/feeds-client/event-handlers/index.ts +1 -0
  134. package/src/feeds-client/event-handlers/user/handle-user-updated.test.ts +53 -0
  135. package/src/feeds-client/event-handlers/user/handle-user-updated.ts +28 -0
  136. package/src/{FeedsClient.ts → feeds-client/feeds-client.ts} +63 -36
  137. package/src/feeds-client/index.ts +2 -0
  138. package/src/gen/feeds/FeedsApi.ts +164 -138
  139. package/src/gen/model-decoders/decoders.ts +22 -0
  140. package/src/gen/models/index.ts +288 -29
  141. package/src/gen-imports.ts +1 -1
  142. package/src/test-utils/index.ts +1 -0
  143. package/src/test-utils/response-generators.ts +101 -0
  144. package/src/types-internal.ts +11 -0
  145. package/src/types.ts +1 -1
  146. package/src/utils/check-has-another-page.ts +6 -0
  147. package/src/utils/constants.ts +3 -0
  148. package/src/utils/index.ts +5 -0
  149. package/src/{state-updates → utils}/state-update-queue.test.ts +6 -6
  150. package/src/utils/state-update-queue.ts +42 -0
  151. package/src/utils/type-assertions.ts +22 -0
  152. package/src/{utils.test.ts → utils/unique-array-merge.test.ts} +7 -3
  153. package/src/utils/unique-array-merge.ts +19 -0
  154. package/dist/src/FeedsClient.d.ts +0 -75
  155. package/dist/src/state-updates/activity-reaction-utils.d.ts +0 -10
  156. package/dist/src/state-updates/activity-utils.d.ts +0 -13
  157. package/dist/src/state-updates/bookmark-utils.d.ts +0 -14
  158. package/dist/src/state-updates/follow-utils.d.ts +0 -19
  159. package/dist/src/state-updates/state-update-queue.d.ts +0 -15
  160. package/dist/src/utils.d.ts +0 -10
  161. package/src/state-updates/activity-reaction-utils.ts +0 -107
  162. package/src/state-updates/bookmark-utils.ts +0 -167
  163. package/src/state-updates/follow-utils.test.ts +0 -552
  164. package/src/state-updates/follow-utils.ts +0 -126
  165. package/src/state-updates/state-update-queue.ts +0 -35
  166. package/src/utils.ts +0 -48
  167. /package/dist/src/{ModerationClient.d.ts → moderation-client.d.ts} +0 -0
  168. /package/src/{ModerationClient.ts → moderation-client.ts} +0 -0
@@ -0,0 +1,2 @@
1
+ export * from './feed';
2
+ export * from './event-handlers';
@@ -0,0 +1 @@
1
+ export * from './user/handle-user-updated';
@@ -0,0 +1,53 @@
1
+ import { describe, it, beforeEach, expect } from 'vitest';
2
+
3
+ import { FeedsClient, handleUserUpdated } from '../..';
4
+ import { generateOwnUser, generateUserResponse } from '../../../test-utils';
5
+ import { EventPayload } from '../../../types-internal';
6
+
7
+ describe('handleUserUpdated', () => {
8
+ let feedsClient: FeedsClient;
9
+
10
+ beforeEach(() => {
11
+ feedsClient = new FeedsClient('mock-api-key');
12
+ const connectedUser = generateOwnUser();
13
+
14
+ feedsClient.state.partialNext({ connected_user: connectedUser });
15
+ });
16
+
17
+ it('should update the connected user in the state', () => {
18
+ const stateBefore = feedsClient.state.getLatestValue();
19
+
20
+ const event: EventPayload<'user.updated'> = {
21
+ type: 'user.updated',
22
+ created_at: new Date(),
23
+ custom: {},
24
+ user: {
25
+ ...generateUserResponse(),
26
+ ...stateBefore.connected_user!,
27
+ },
28
+ };
29
+
30
+ handleUserUpdated.call(feedsClient, event);
31
+
32
+ const stateAfter = feedsClient.state.getLatestValue();
33
+
34
+ expect(stateAfter.connected_user).toMatchObject({ name: event.user.name });
35
+ });
36
+
37
+ it('should not update the connected user if the incoming event contains other user', () => {
38
+ const event: EventPayload<'user.updated'> = {
39
+ type: 'user.updated',
40
+ created_at: new Date(),
41
+ custom: {},
42
+ user: generateUserResponse(),
43
+ };
44
+
45
+ const stateBefore = feedsClient.state.getLatestValue();
46
+
47
+ handleUserUpdated.call(feedsClient, event);
48
+
49
+ const stateAfter = feedsClient.state.getLatestValue();
50
+
51
+ expect(stateAfter.connected_user).toBe(stateBefore.connected_user);
52
+ });
53
+ });
@@ -0,0 +1,28 @@
1
+ import type { EventPayload } from '../../../types-internal';
2
+ import type { FeedsClient, FeedsClientState } from '../../feeds-client';
3
+
4
+ export function handleUserUpdated(
5
+ this: FeedsClient,
6
+ event: EventPayload<'user.updated'>,
7
+ ) {
8
+ this.state.next((currentState) => {
9
+ let newState: FeedsClientState | undefined;
10
+
11
+ const { connected_user } = currentState;
12
+
13
+ if (connected_user && connected_user.id === event.user.id) {
14
+ newState ??= {
15
+ ...currentState,
16
+ };
17
+
18
+ newState.connected_user = {
19
+ ...connected_user,
20
+ ...event.user,
21
+ };
22
+ }
23
+
24
+ // TODO: update other users in user map (if/once applicable)
25
+
26
+ return newState ?? currentState;
27
+ });
28
+ }
@@ -1,40 +1,49 @@
1
- import { FeedsApi } from './gen/feeds/FeedsApi';
1
+ import { FeedsApi } from '../gen/feeds/FeedsApi';
2
2
  import {
3
3
  ActivityResponse,
4
4
  FeedResponse,
5
5
  FileUploadRequest,
6
6
  FollowBatchRequest,
7
+ FollowRequest,
7
8
  ImageUploadRequest,
8
9
  OwnUser,
9
10
  PollResponse,
10
11
  PollVotesResponse,
11
12
  QueryFeedsRequest,
12
13
  QueryPollVotesRequest,
13
- SingleFollowRequest,
14
+ UpdateFollowRequest,
14
15
  UserRequest,
15
16
  WSEvent,
16
- } from './gen/models';
17
- import { FeedsEvent, StreamFile, TokenOrProvider } from './types';
18
- import { StateStore } from './common/StateStore';
19
- import { TokenManager } from './common/TokenManager';
20
- import { ConnectionIdManager } from './common/ConnectionIdManager';
21
- import { StableWSConnection } from './common/real-time/StableWSConnection';
22
- import { EventDispatcher } from './common/EventDispatcher';
23
- import { ApiClient } from './common/ApiClient';
17
+ } from '../gen/models';
18
+ import { FeedsEvent, StreamFile, TokenOrProvider } from '../types';
19
+ import { StateStore } from '../common/StateStore';
20
+ import { TokenManager } from '../common/TokenManager';
21
+ import { ConnectionIdManager } from '../common/ConnectionIdManager';
22
+ import { StableWSConnection } from '../common/real-time/StableWSConnection';
23
+ import { EventDispatcher } from '../common/EventDispatcher';
24
+ import { ApiClient } from '../common/ApiClient';
24
25
  import {
25
26
  addConnectionEventListeners,
26
27
  removeConnectionEventListeners,
27
28
  streamDevToken,
28
- } from './common/utils';
29
- import { decodeWSEvent } from './gen/model-decoders/event-decoder-mapping';
30
- import { Feed } from './Feed';
29
+ } from '../common/utils';
30
+ import { decodeWSEvent } from '../gen/model-decoders/event-decoder-mapping';
31
31
  import {
32
32
  FeedsClientOptions,
33
33
  NetworkChangedEvent,
34
34
  StreamResponse,
35
- } from './common/types';
36
- import { ModerationClient } from './ModerationClient';
37
- import { StreamPoll } from './common/Poll';
35
+ } from '../common/types';
36
+ import { ModerationClient } from '../moderation-client';
37
+ import { StreamPoll } from '../common/Poll';
38
+ import {
39
+ Feed,
40
+ handleFollowCreated,
41
+ handleFollowDeleted,
42
+ handleFollowUpdated,
43
+ handleWatchStarted,
44
+ handleWatchStopped,
45
+ } from '../feed';
46
+ import { handleUserUpdated } from './event-handlers';
38
47
 
39
48
  export type FeedsClientState = {
40
49
  connected_user: OwnUser | undefined;
@@ -101,7 +110,7 @@ export class FeedsClient extends FeedsApi {
101
110
  }
102
111
  } else {
103
112
  for (const activeFeed of Object.values(this.activeFeeds)) {
104
- activeFeed.handleWatchStopped();
113
+ handleWatchStopped.bind(activeFeed)();
105
114
  }
106
115
  }
107
116
  break;
@@ -188,6 +197,10 @@ export class FeedsClient extends FeedsApi {
188
197
 
189
198
  break;
190
199
  }
200
+ case 'user.updated': {
201
+ handleUserUpdated.call(this, event);
202
+ break;
203
+ }
191
204
  default: {
192
205
  feed?.handleWSEvent(event as unknown as WSEvent);
193
206
  }
@@ -338,7 +351,7 @@ export class FeedsClient extends FeedsApi {
338
351
  };
339
352
 
340
353
  async queryFeeds(request?: QueryFeedsRequest) {
341
- const response = await this.feedsQueryFeeds(request);
354
+ const response = await this._queryFeeds(request);
342
355
 
343
356
  const feeds = response.feeds.map((f) =>
344
357
  this.getOrCreateActiveFeed(f.group_id, f.id, f, request?.watch),
@@ -363,18 +376,35 @@ export class FeedsClient extends FeedsApi {
363
376
  this.eventDispatcher.dispatch(networkEvent);
364
377
  };
365
378
 
379
+ async updateFollow(request: UpdateFollowRequest) {
380
+ const response = await super.updateFollow(request);
381
+
382
+ [
383
+ response.follow.source_feed.feed,
384
+ response.follow.target_feed.feed,
385
+ ].forEach((fid) => {
386
+ const feed = this.activeFeeds[fid];
387
+ if (feed) {
388
+ handleFollowUpdated.bind(feed)(response);
389
+ }
390
+ });
391
+
392
+ return response;
393
+ }
394
+
366
395
  // For follow API endpoints we update the state after HTTP response to allow queryFeeds with watch: false
367
- async follow(request: SingleFollowRequest) {
396
+ async follow(request: FollowRequest) {
368
397
  const response = await super.follow(request);
369
398
 
370
- [response.follow.source_feed.fid, response.follow.target_feed.fid].forEach(
371
- (fid) => {
372
- const feed = this.activeFeeds[fid];
373
- if (feed) {
374
- feed.handleFollowCreated(response.follow);
375
- }
376
- },
377
- );
399
+ [
400
+ response.follow.source_feed.feed,
401
+ response.follow.target_feed.feed,
402
+ ].forEach((fid) => {
403
+ const feed = this.activeFeeds[fid];
404
+ if (feed) {
405
+ handleFollowCreated.bind(feed)(response);
406
+ }
407
+ });
378
408
 
379
409
  return response;
380
410
  }
@@ -383,25 +413,22 @@ export class FeedsClient extends FeedsApi {
383
413
  const response = await super.followBatch(request);
384
414
 
385
415
  response.follows.forEach((follow) => {
386
- const feed = this.activeFeeds[follow.source_feed.fid];
416
+ const feed = this.activeFeeds[follow.source_feed.feed];
387
417
  if (feed) {
388
- feed.handleFollowCreated(follow);
418
+ handleFollowCreated.bind(feed)({ follow });
389
419
  }
390
420
  });
391
421
 
392
422
  return response;
393
423
  }
394
424
 
395
- async unfollow(request: SingleFollowRequest) {
425
+ async unfollow(request: FollowRequest) {
396
426
  const response = await super.unfollow(request);
397
427
 
398
428
  [request.source, request.target].forEach((fid) => {
399
429
  const feed = this.activeFeeds[fid];
400
430
  if (feed) {
401
- feed.handleFollowDeleted({
402
- source_feed: { fid: request.source },
403
- target_feed: { fid: request.target },
404
- });
431
+ handleFollowDeleted.bind(feed)(response);
405
432
  }
406
433
  });
407
434
 
@@ -418,7 +445,7 @@ export class FeedsClient extends FeedsApi {
418
445
  const feed =
419
446
  this.activeFeeds[`${request.feed_group_id}:${request.feed_id}`];
420
447
  if (feed) {
421
- feed.handleWatchStopped();
448
+ handleWatchStopped.bind(feed)();
422
449
  }
423
450
 
424
451
  return response;
@@ -434,7 +461,7 @@ export class FeedsClient extends FeedsApi {
434
461
  if (this.activeFeeds[fid]) {
435
462
  const feed = this.activeFeeds[fid];
436
463
  if (watch && !feed.currentState.watch) {
437
- feed.handleWatchStarted();
464
+ handleWatchStarted.bind(feed)();
438
465
  }
439
466
  return feed;
440
467
  } else {
@@ -0,0 +1,2 @@
1
+ export * from './feeds-client';
2
+ export * from './event-handlers';