@stream-io/feeds-client 0.2.7 → 0.2.8

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 (342) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/index.js +408 -0
  3. package/dist/cjs/index.js.map +1 -0
  4. package/dist/cjs/react-bindings.js +1368 -0
  5. package/dist/cjs/react-bindings.js.map +1 -0
  6. package/dist/es/index.mjs +398 -0
  7. package/dist/es/index.mjs.map +1 -0
  8. package/dist/es/react-bindings.mjs +1368 -0
  9. package/dist/es/react-bindings.mjs.map +1 -0
  10. package/dist/index-Cfbt0DFY.js +6492 -0
  11. package/dist/index-Cfbt0DFY.js.map +1 -0
  12. package/dist/index-DLC5hiNd.mjs +6476 -0
  13. package/dist/index-DLC5hiNd.mjs.map +1 -0
  14. package/dist/tsconfig.tsbuildinfo +1 -1
  15. package/dist/types/bindings/index.d.ts +2 -0
  16. package/dist/types/bindings/index.d.ts.map +1 -0
  17. package/dist/{@react-bindings → types/bindings/react}/contexts/StreamFeedContext.d.ts +2 -1
  18. package/dist/types/bindings/react/contexts/StreamFeedContext.d.ts.map +1 -0
  19. package/dist/{@react-bindings → types/bindings/react}/contexts/StreamFeedsContext.d.ts +2 -1
  20. package/dist/types/bindings/react/contexts/StreamFeedsContext.d.ts.map +1 -0
  21. package/dist/{@react-bindings → types/bindings/react}/contexts/StreamSearchContext.d.ts +2 -1
  22. package/dist/types/bindings/react/contexts/StreamSearchContext.d.ts.map +1 -0
  23. package/dist/{@react-bindings → types/bindings/react}/contexts/StreamSearchResultsContext.d.ts +2 -1
  24. package/dist/types/bindings/react/contexts/StreamSearchResultsContext.d.ts.map +1 -0
  25. package/dist/{@react-bindings → types/bindings/react}/hooks/client-state-hooks/index.d.ts +1 -0
  26. package/dist/types/bindings/react/hooks/client-state-hooks/index.d.ts.map +1 -0
  27. package/dist/types/bindings/react/hooks/client-state-hooks/useClientConnectedUser.d.ts +5 -0
  28. package/dist/types/bindings/react/hooks/client-state-hooks/useClientConnectedUser.d.ts.map +1 -0
  29. package/dist/{@react-bindings → types/bindings/react}/hooks/client-state-hooks/useWsConnectionState.d.ts +1 -0
  30. package/dist/types/bindings/react/hooks/client-state-hooks/useWsConnectionState.d.ts.map +1 -0
  31. package/dist/{@react-bindings → types/bindings/react}/hooks/feed-state-hooks/index.d.ts +1 -0
  32. package/dist/types/bindings/react/hooks/feed-state-hooks/index.d.ts.map +1 -0
  33. package/dist/{@react-bindings → types/bindings/react}/hooks/feed-state-hooks/useAggregatedActivities.d.ts +3 -2
  34. package/dist/types/bindings/react/hooks/feed-state-hooks/useAggregatedActivities.d.ts.map +1 -0
  35. package/dist/{@react-bindings → types/bindings/react}/hooks/feed-state-hooks/useComments.d.ts +2 -3
  36. package/dist/types/bindings/react/hooks/feed-state-hooks/useComments.d.ts.map +1 -0
  37. package/dist/{@react-bindings → types/bindings/react}/hooks/feed-state-hooks/useFeedActivities.d.ts +3 -2
  38. package/dist/types/bindings/react/hooks/feed-state-hooks/useFeedActivities.d.ts.map +1 -0
  39. package/dist/{@react-bindings → types/bindings/react}/hooks/feed-state-hooks/useFeedMetadata.d.ts +3 -2
  40. package/dist/types/bindings/react/hooks/feed-state-hooks/useFeedMetadata.d.ts.map +1 -0
  41. package/dist/{@react-bindings → types/bindings/react}/hooks/feed-state-hooks/useFollowers.d.ts +5 -4
  42. package/dist/types/bindings/react/hooks/feed-state-hooks/useFollowers.d.ts.map +1 -0
  43. package/dist/{@react-bindings → types/bindings/react}/hooks/feed-state-hooks/useFollowing.d.ts +5 -4
  44. package/dist/types/bindings/react/hooks/feed-state-hooks/useFollowing.d.ts.map +1 -0
  45. package/dist/{@react-bindings → types/bindings/react}/hooks/feed-state-hooks/useIsAggregatedActivityRead.d.ts +2 -2
  46. package/dist/types/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivityRead.d.ts.map +1 -0
  47. package/dist/{@react-bindings → types/bindings/react}/hooks/feed-state-hooks/useIsAggregatedActivitySeen.d.ts +2 -2
  48. package/dist/types/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivitySeen.d.ts.map +1 -0
  49. package/dist/{@react-bindings → types/bindings/react}/hooks/feed-state-hooks/useNotificationStatus.d.ts +2 -1
  50. package/dist/types/bindings/react/hooks/feed-state-hooks/useNotificationStatus.d.ts.map +1 -0
  51. package/dist/{@react-bindings → types/bindings/react}/hooks/feed-state-hooks/useOwnCapabilities.d.ts +2 -1
  52. package/dist/types/bindings/react/hooks/feed-state-hooks/useOwnCapabilities.d.ts.map +1 -0
  53. package/dist/{@react-bindings → types/bindings/react}/hooks/feed-state-hooks/useOwnFollows.d.ts +3 -2
  54. package/dist/types/bindings/react/hooks/feed-state-hooks/useOwnFollows.d.ts.map +1 -0
  55. package/dist/{@react-bindings → types/bindings/react}/hooks/internal/index.d.ts +1 -0
  56. package/dist/types/bindings/react/hooks/internal/index.d.ts.map +1 -0
  57. package/dist/{@react-bindings → types/bindings/react}/hooks/internal/useStableCallback.d.ts +1 -0
  58. package/dist/types/bindings/react/hooks/internal/useStableCallback.d.ts.map +1 -0
  59. package/dist/{@react-bindings → types/bindings/react}/hooks/search-state-hooks/index.d.ts +1 -0
  60. package/dist/types/bindings/react/hooks/search-state-hooks/index.d.ts.map +1 -0
  61. package/dist/{@react-bindings → types/bindings/react}/hooks/search-state-hooks/useSearchQuery.d.ts +2 -1
  62. package/dist/types/bindings/react/hooks/search-state-hooks/useSearchQuery.d.ts.map +1 -0
  63. package/dist/{@react-bindings → types/bindings/react}/hooks/search-state-hooks/useSearchResult.d.ts +2 -1
  64. package/dist/types/bindings/react/hooks/search-state-hooks/useSearchResult.d.ts.map +1 -0
  65. package/dist/types/bindings/react/hooks/search-state-hooks/useSearchSources.d.ts +5 -0
  66. package/dist/types/bindings/react/hooks/search-state-hooks/useSearchSources.d.ts.map +1 -0
  67. package/dist/{@react-bindings → types/bindings/react}/hooks/useCreateFeedsClient.d.ts +2 -4
  68. package/dist/types/bindings/react/hooks/useCreateFeedsClient.d.ts.map +1 -0
  69. package/dist/{@react-bindings → types/bindings/react}/hooks/util/index.d.ts +1 -0
  70. package/dist/types/bindings/react/hooks/util/index.d.ts.map +1 -0
  71. package/dist/{@react-bindings → types/bindings/react}/hooks/util/useBookmarkActions.d.ts +2 -1
  72. package/dist/types/bindings/react/hooks/util/useBookmarkActions.d.ts.map +1 -0
  73. package/dist/{@react-bindings → types/bindings/react}/hooks/util/useReactionActions.d.ts +2 -1
  74. package/dist/types/bindings/react/hooks/util/useReactionActions.d.ts.map +1 -0
  75. package/dist/{@react-bindings → types/bindings/react}/index.d.ts +2 -1
  76. package/dist/types/bindings/react/index.d.ts.map +1 -0
  77. package/dist/{@react-bindings → types/bindings/react}/wrappers/StreamFeed.d.ts +2 -1
  78. package/dist/types/bindings/react/wrappers/StreamFeed.d.ts.map +1 -0
  79. package/dist/{@react-bindings → types/bindings/react}/wrappers/StreamFeeds.d.ts +1 -0
  80. package/dist/types/bindings/react/wrappers/StreamFeeds.d.ts.map +1 -0
  81. package/dist/{@react-bindings → types/bindings/react}/wrappers/StreamSearch.d.ts +2 -1
  82. package/dist/types/bindings/react/wrappers/StreamSearch.d.ts.map +1 -0
  83. package/dist/{@react-bindings → types/bindings/react}/wrappers/StreamSearchResults.d.ts +2 -1
  84. package/dist/types/bindings/react/wrappers/StreamSearchResults.d.ts.map +1 -0
  85. package/dist/{src → types}/common/ApiClient.d.ts +18 -0
  86. package/dist/types/common/ApiClient.d.ts.map +1 -0
  87. package/dist/{src → types}/common/ConnectionIdManager.d.ts +1 -0
  88. package/dist/types/common/ConnectionIdManager.d.ts.map +1 -0
  89. package/dist/{src → types}/common/EventDispatcher.d.ts +1 -0
  90. package/dist/types/common/EventDispatcher.d.ts.map +1 -0
  91. package/dist/{src → types}/common/Poll.d.ts +2 -1
  92. package/dist/types/common/Poll.d.ts.map +1 -0
  93. package/dist/{src → types}/common/TokenManager.d.ts +2 -0
  94. package/dist/types/common/TokenManager.d.ts.map +1 -0
  95. package/dist/{src → types}/common/gen-imports.d.ts +1 -0
  96. package/dist/types/common/gen-imports.d.ts.map +1 -0
  97. package/dist/{src → types}/common/rate-limit.d.ts +1 -0
  98. package/dist/types/common/rate-limit.d.ts.map +1 -0
  99. package/dist/{src → types}/common/real-time/StableWSConnection.d.ts +4 -4
  100. package/dist/types/common/real-time/StableWSConnection.d.ts.map +1 -0
  101. package/dist/{src → types}/common/real-time/event-models.d.ts +1 -0
  102. package/dist/types/common/real-time/event-models.d.ts.map +1 -0
  103. package/dist/{src → types}/common/search/ActivitySearchSource.d.ts +1 -0
  104. package/dist/types/common/search/ActivitySearchSource.d.ts.map +1 -0
  105. package/dist/{src → types}/common/search/BaseSearchSource.d.ts +2 -1
  106. package/dist/types/common/search/BaseSearchSource.d.ts.map +1 -0
  107. package/dist/{src → types}/common/search/FeedSearchSource.d.ts +1 -0
  108. package/dist/types/common/search/FeedSearchSource.d.ts.map +1 -0
  109. package/dist/{src → types}/common/search/SearchController.d.ts +2 -1
  110. package/dist/types/common/search/SearchController.d.ts.map +1 -0
  111. package/dist/{src → types}/common/search/UserSearchSource.d.ts +2 -1
  112. package/dist/types/common/search/UserSearchSource.d.ts.map +1 -0
  113. package/dist/{src → types}/common/search/index.d.ts +1 -0
  114. package/dist/types/common/search/index.d.ts.map +1 -0
  115. package/dist/{src → types}/common/search/types.d.ts +1 -0
  116. package/dist/types/common/search/types.d.ts.map +1 -0
  117. package/dist/{src → types}/common/types.d.ts +3 -1
  118. package/dist/types/common/types.d.ts.map +1 -0
  119. package/dist/{src → types}/common/utils.d.ts +1 -0
  120. package/dist/types/common/utils.d.ts.map +1 -0
  121. package/dist/{src → types}/feed/event-handlers/activity/handle-activity-added.d.ts +3 -2
  122. package/dist/types/feed/event-handlers/activity/handle-activity-added.d.ts.map +1 -0
  123. package/dist/{src → types}/feed/event-handlers/activity/handle-activity-deleted.d.ts +3 -2
  124. package/dist/types/feed/event-handlers/activity/handle-activity-deleted.d.ts.map +1 -0
  125. package/dist/{src → types}/feed/event-handlers/activity/handle-activity-marked.d.ts +1 -0
  126. package/dist/types/feed/event-handlers/activity/handle-activity-marked.d.ts.map +1 -0
  127. package/dist/{src → types}/feed/event-handlers/activity/handle-activity-pinned.d.ts +1 -0
  128. package/dist/types/feed/event-handlers/activity/handle-activity-pinned.d.ts.map +1 -0
  129. package/dist/types/feed/event-handlers/activity/handle-activity-reaction-added.d.ts +15 -0
  130. package/dist/types/feed/event-handlers/activity/handle-activity-reaction-added.d.ts.map +1 -0
  131. package/dist/types/feed/event-handlers/activity/handle-activity-reaction-deleted.d.ts +15 -0
  132. package/dist/types/feed/event-handlers/activity/handle-activity-reaction-deleted.d.ts.map +1 -0
  133. package/dist/{src → types}/feed/event-handlers/activity/handle-activity-removed-from-feed.d.ts +1 -0
  134. package/dist/types/feed/event-handlers/activity/handle-activity-removed-from-feed.d.ts.map +1 -0
  135. package/dist/{src → types}/feed/event-handlers/activity/handle-activity-unpinned.d.ts +1 -0
  136. package/dist/types/feed/event-handlers/activity/handle-activity-unpinned.d.ts.map +1 -0
  137. package/dist/{src → types}/feed/event-handlers/activity/handle-activity-updated.d.ts +1 -0
  138. package/dist/types/feed/event-handlers/activity/handle-activity-updated.d.ts.map +1 -0
  139. package/dist/{src → types}/feed/event-handlers/activity/index.d.ts +1 -0
  140. package/dist/types/feed/event-handlers/activity/index.d.ts.map +1 -0
  141. package/dist/{src → types}/feed/event-handlers/bookmark/handle-bookmark-added.d.ts +1 -0
  142. package/dist/types/feed/event-handlers/bookmark/handle-bookmark-added.d.ts.map +1 -0
  143. package/dist/{src → types}/feed/event-handlers/bookmark/handle-bookmark-deleted.d.ts +1 -0
  144. package/dist/types/feed/event-handlers/bookmark/handle-bookmark-deleted.d.ts.map +1 -0
  145. package/dist/{src → types}/feed/event-handlers/bookmark/handle-bookmark-updated.d.ts +1 -0
  146. package/dist/types/feed/event-handlers/bookmark/handle-bookmark-updated.d.ts.map +1 -0
  147. package/dist/{src → types}/feed/event-handlers/bookmark/index.d.ts +1 -0
  148. package/dist/types/feed/event-handlers/bookmark/index.d.ts.map +1 -0
  149. package/dist/{src → types}/feed/event-handlers/comment/handle-comment-added.d.ts +1 -0
  150. package/dist/types/feed/event-handlers/comment/handle-comment-added.d.ts.map +1 -0
  151. package/dist/{src → types}/feed/event-handlers/comment/handle-comment-deleted.d.ts +1 -0
  152. package/dist/types/feed/event-handlers/comment/handle-comment-deleted.d.ts.map +1 -0
  153. package/dist/{src → types}/feed/event-handlers/comment/handle-comment-reaction.d.ts +1 -0
  154. package/dist/types/feed/event-handlers/comment/handle-comment-reaction.d.ts.map +1 -0
  155. package/dist/{src → types}/feed/event-handlers/comment/handle-comment-updated.d.ts +1 -0
  156. package/dist/types/feed/event-handlers/comment/handle-comment-updated.d.ts.map +1 -0
  157. package/dist/{src → types}/feed/event-handlers/comment/index.d.ts +1 -0
  158. package/dist/types/feed/event-handlers/comment/index.d.ts.map +1 -0
  159. package/dist/{src → types}/feed/event-handlers/feed/handle-feed-updated.d.ts +1 -0
  160. package/dist/types/feed/event-handlers/feed/handle-feed-updated.d.ts.map +1 -0
  161. package/dist/{src → types}/feed/event-handlers/feed/index.d.ts +1 -0
  162. package/dist/types/feed/event-handlers/feed/index.d.ts.map +1 -0
  163. package/dist/{src → types}/feed/event-handlers/feed-member/handle-feed-member-added.d.ts +1 -0
  164. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-added.d.ts.map +1 -0
  165. package/dist/{src → types}/feed/event-handlers/feed-member/handle-feed-member-removed.d.ts +1 -0
  166. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-removed.d.ts.map +1 -0
  167. package/dist/{src → types}/feed/event-handlers/feed-member/handle-feed-member-updated.d.ts +1 -0
  168. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-updated.d.ts.map +1 -0
  169. package/dist/{src → types}/feed/event-handlers/feed-member/index.d.ts +1 -0
  170. package/dist/types/feed/event-handlers/feed-member/index.d.ts.map +1 -0
  171. package/dist/{src → types}/feed/event-handlers/follow/handle-follow-created.d.ts +3 -2
  172. package/dist/types/feed/event-handlers/follow/handle-follow-created.d.ts.map +1 -0
  173. package/dist/{src → types}/feed/event-handlers/follow/handle-follow-deleted.d.ts +2 -1
  174. package/dist/types/feed/event-handlers/follow/handle-follow-deleted.d.ts.map +1 -0
  175. package/dist/{src → types}/feed/event-handlers/follow/handle-follow-updated.d.ts +3 -2
  176. package/dist/types/feed/event-handlers/follow/handle-follow-updated.d.ts.map +1 -0
  177. package/dist/{src → types}/feed/event-handlers/follow/index.d.ts +1 -0
  178. package/dist/types/feed/event-handlers/follow/index.d.ts.map +1 -0
  179. package/dist/{src → types}/feed/event-handlers/index.d.ts +1 -0
  180. package/dist/types/feed/event-handlers/index.d.ts.map +1 -0
  181. package/dist/{src → types}/feed/event-handlers/notification-feed/handle-notification-feed-updated.d.ts +1 -0
  182. package/dist/types/feed/event-handlers/notification-feed/handle-notification-feed-updated.d.ts.map +1 -0
  183. package/dist/{src → types}/feed/event-handlers/notification-feed/index.d.ts +1 -0
  184. package/dist/types/feed/event-handlers/notification-feed/index.d.ts.map +1 -0
  185. package/dist/{src → types}/feed/event-handlers/watch/handle-watch-started.d.ts +1 -0
  186. package/dist/types/feed/event-handlers/watch/handle-watch-started.d.ts.map +1 -0
  187. package/dist/{src → types}/feed/event-handlers/watch/handle-watch-stopped.d.ts +1 -0
  188. package/dist/types/feed/event-handlers/watch/handle-watch-stopped.d.ts.map +1 -0
  189. package/dist/{src → types}/feed/event-handlers/watch/index.d.ts +1 -0
  190. package/dist/types/feed/event-handlers/watch/index.d.ts.map +1 -0
  191. package/dist/{src → types}/feed/feed.d.ts +9 -6
  192. package/dist/types/feed/feed.d.ts.map +1 -0
  193. package/dist/{src → types}/feed/index.d.ts +1 -0
  194. package/dist/types/feed/index.d.ts.map +1 -0
  195. package/dist/{src → types}/feeds-client/event-handlers/index.d.ts +1 -0
  196. package/dist/types/feeds-client/event-handlers/index.d.ts.map +1 -0
  197. package/dist/{src → types}/feeds-client/event-handlers/user/handle-user-updated.d.ts +1 -0
  198. package/dist/types/feeds-client/event-handlers/user/handle-user-updated.d.ts.map +1 -0
  199. package/dist/{src → types}/feeds-client/feeds-client.d.ts +18 -10
  200. package/dist/types/feeds-client/feeds-client.d.ts.map +1 -0
  201. package/dist/{src → types}/feeds-client/index.d.ts +1 -0
  202. package/dist/types/feeds-client/index.d.ts.map +1 -0
  203. package/dist/{src → types}/gen/feeds/FeedApi.d.ts +1 -0
  204. package/dist/types/gen/feeds/FeedApi.d.ts.map +1 -0
  205. package/dist/{src → types}/gen/feeds/FeedsApi.d.ts +1 -0
  206. package/dist/types/gen/feeds/FeedsApi.d.ts.map +1 -0
  207. package/dist/{src → types}/gen/model-decoders/decoders.d.ts +1 -0
  208. package/dist/types/gen/model-decoders/decoders.d.ts.map +1 -0
  209. package/dist/{src → types}/gen/model-decoders/event-decoder-mapping.d.ts +1 -0
  210. package/dist/types/gen/model-decoders/event-decoder-mapping.d.ts.map +1 -0
  211. package/dist/{src → types}/gen/models/index.d.ts +43 -2
  212. package/dist/types/gen/models/index.d.ts.map +1 -0
  213. package/dist/{src → types}/gen/moderation/ModerationApi.d.ts +1 -0
  214. package/dist/types/gen/moderation/ModerationApi.d.ts.map +1 -0
  215. package/dist/{src → types}/gen-imports.d.ts +1 -0
  216. package/dist/types/gen-imports.d.ts.map +1 -0
  217. package/dist/types/index.d.ts +10 -0
  218. package/dist/types/index.d.ts.map +1 -0
  219. package/dist/{src → types}/moderation-client.d.ts +1 -0
  220. package/dist/types/moderation-client.d.ts.map +1 -0
  221. package/dist/{src → types}/types-internal.d.ts +4 -0
  222. package/dist/types/types-internal.d.ts.map +1 -0
  223. package/dist/{src → types}/types.d.ts +1 -0
  224. package/dist/types/types.d.ts.map +1 -0
  225. package/dist/{src → types}/utils/check-has-another-page.d.ts +1 -0
  226. package/dist/types/utils/check-has-another-page.d.ts.map +1 -0
  227. package/dist/{src → types}/utils/constants.d.ts +1 -0
  228. package/dist/types/utils/constants.d.ts.map +1 -0
  229. package/dist/{src → types}/utils/index.d.ts +2 -0
  230. package/dist/types/utils/index.d.ts.map +1 -0
  231. package/dist/types/utils/is-react-native.d.ts +5 -0
  232. package/dist/types/utils/is-react-native.d.ts.map +1 -0
  233. package/dist/types/utils/logger.d.ts +61 -0
  234. package/dist/types/utils/logger.d.ts.map +1 -0
  235. package/dist/types/utils/state-update-queue.d.ts +83 -0
  236. package/dist/types/utils/state-update-queue.d.ts.map +1 -0
  237. package/dist/types/utils/type-assertions.d.ts +12 -0
  238. package/dist/types/utils/type-assertions.d.ts.map +1 -0
  239. package/dist/{src → types}/utils/unique-array-merge.d.ts +1 -0
  240. package/dist/types/utils/unique-array-merge.d.ts.map +1 -0
  241. package/dist/{src → types}/utils/update-entity-in-array.d.ts +1 -0
  242. package/dist/types/utils/update-entity-in-array.d.ts.map +1 -0
  243. package/package.json +21 -33
  244. package/src/bindings/index.ts +1 -0
  245. package/src/bindings/react/contexts/StreamFeedContext.tsx +18 -0
  246. package/src/bindings/react/contexts/StreamFeedsContext.tsx +21 -0
  247. package/src/bindings/react/contexts/StreamSearchContext.tsx +18 -0
  248. package/src/bindings/react/contexts/StreamSearchResultsContext.tsx +20 -0
  249. package/src/bindings/react/hooks/client-state-hooks/useClientConnectedUser.ts +18 -0
  250. package/src/bindings/react/hooks/client-state-hooks/useWsConnectionState.ts +18 -0
  251. package/src/bindings/react/hooks/feed-state-hooks/useAggregatedActivities.ts +25 -0
  252. package/src/bindings/react/hooks/feed-state-hooks/useComments.ts +91 -0
  253. package/src/bindings/react/hooks/feed-state-hooks/useFeedActivities.ts +36 -0
  254. package/src/bindings/react/hooks/feed-state-hooks/useFeedMetadata.ts +28 -0
  255. package/src/bindings/react/hooks/feed-state-hooks/useFollowers.ts +54 -0
  256. package/src/bindings/react/hooks/feed-state-hooks/useFollowing.ts +54 -0
  257. package/src/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivityRead.ts +29 -0
  258. package/src/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivitySeen.ts +28 -0
  259. package/src/bindings/react/hooks/feed-state-hooks/useNotificationStatus.ts +28 -0
  260. package/src/bindings/react/hooks/feed-state-hooks/useOwnCapabilities.ts +70 -0
  261. package/src/bindings/react/hooks/feed-state-hooks/useOwnFollows.ts +18 -0
  262. package/src/bindings/react/hooks/internal/useStableCallback.ts +37 -0
  263. package/src/bindings/react/hooks/search-state-hooks/useSearchQuery.ts +14 -0
  264. package/src/bindings/react/hooks/search-state-hooks/useSearchResult.ts +36 -0
  265. package/src/bindings/react/hooks/search-state-hooks/useSearchSources.ts +17 -0
  266. package/src/bindings/react/hooks/useCreateFeedsClient.ts +73 -0
  267. package/src/bindings/react/hooks/util/useBookmarkActions.ts +40 -0
  268. package/src/bindings/react/hooks/util/useReactionActions.ts +56 -0
  269. package/{@react-bindings → src/bindings/react}/index.ts +1 -1
  270. package/src/bindings/react/wrappers/StreamFeed.tsx +23 -0
  271. package/src/bindings/react/wrappers/StreamFeeds.tsx +13 -0
  272. package/src/bindings/react/wrappers/StreamSearch.tsx +23 -0
  273. package/src/bindings/react/wrappers/StreamSearchResults.tsx +23 -0
  274. package/src/common/ApiClient.ts +86 -33
  275. package/src/common/EventDispatcher.ts +3 -6
  276. package/src/common/Poll.ts +1 -1
  277. package/src/common/TokenManager.ts +4 -0
  278. package/src/common/real-time/StableWSConnection.ts +64 -60
  279. package/src/common/search/BaseSearchSource.ts +11 -4
  280. package/src/common/search/SearchController.ts +4 -2
  281. package/src/common/types.ts +3 -2
  282. package/src/feed/event-handlers/activity/activity-utils.test.ts +40 -9
  283. package/src/feed/event-handlers/activity/handle-activity-added.test.ts +1 -1
  284. package/src/feed/event-handlers/activity/handle-activity-added.ts +7 -7
  285. package/src/feed/event-handlers/activity/handle-activity-deleted.ts +15 -12
  286. package/src/feed/event-handlers/activity/handle-activity-reaction-added.test.ts +101 -1
  287. package/src/feed/event-handlers/activity/handle-activity-reaction-added.ts +55 -29
  288. package/src/feed/event-handlers/activity/handle-activity-reaction-deleted.test.ts +118 -1
  289. package/src/feed/event-handlers/activity/handle-activity-reaction-deleted.ts +59 -32
  290. package/src/feed/event-handlers/activity/handle-activity-removed-from-feed.ts +1 -1
  291. package/src/feed/event-handlers/follow/follow-state-update-queue.test.ts +219 -0
  292. package/src/feed/event-handlers/follow/handle-follow-created.ts +7 -2
  293. package/src/feed/event-handlers/follow/handle-follow-deleted.ts +5 -0
  294. package/src/feed/event-handlers/follow/handle-follow-updated.test.ts +0 -43
  295. package/src/feed/event-handlers/follow/handle-follow-updated.ts +7 -2
  296. package/src/feed/feed.test.ts +90 -0
  297. package/src/feed/feed.ts +25 -4
  298. package/src/feeds-client/feeds-client.ts +35 -4
  299. package/src/gen/feeds/FeedsApi.ts +2 -0
  300. package/src/gen/model-decoders/decoders.ts +22 -0
  301. package/src/gen/models/index.ts +71 -3
  302. package/src/index.ts +9 -0
  303. package/src/test-utils/response-generators.ts +12 -3
  304. package/src/types-internal.ts +4 -0
  305. package/src/utils/index.ts +1 -0
  306. package/src/utils/is-react-native.ts +7 -0
  307. package/src/utils/logger.ts +18 -0
  308. package/src/utils/state-update-queue.test.ts +85 -9
  309. package/src/utils/state-update-queue.ts +104 -11
  310. package/src/utils/type-assertions.ts +22 -1
  311. package/dist/@react-bindings/hooks/client-state-hooks/useClientConnectedUser.d.ts +0 -4
  312. package/dist/@react-bindings/hooks/search-state-hooks/useSearchSources.d.ts +0 -4
  313. package/dist/@react-bindings/hooks/useStateStore.d.ts +0 -3
  314. package/dist/index-react-bindings.browser.cjs +0 -6607
  315. package/dist/index-react-bindings.browser.cjs.map +0 -1
  316. package/dist/index-react-bindings.browser.js +0 -6574
  317. package/dist/index-react-bindings.browser.js.map +0 -1
  318. package/dist/index-react-bindings.node.cjs +0 -6607
  319. package/dist/index-react-bindings.node.cjs.map +0 -1
  320. package/dist/index-react-bindings.node.js +0 -6574
  321. package/dist/index-react-bindings.node.js.map +0 -1
  322. package/dist/index.browser.cjs +0 -6578
  323. package/dist/index.browser.cjs.map +0 -1
  324. package/dist/index.browser.js +0 -6551
  325. package/dist/index.browser.js.map +0 -1
  326. package/dist/index.d.ts +0 -9
  327. package/dist/index.node.cjs +0 -6578
  328. package/dist/index.node.cjs.map +0 -1
  329. package/dist/index.node.js +0 -6551
  330. package/dist/index.node.js.map +0 -1
  331. package/dist/src/common/StateStore.d.ts +0 -125
  332. package/dist/src/feed/event-handlers/activity/handle-activity-reaction-added.d.ts +0 -12
  333. package/dist/src/feed/event-handlers/activity/handle-activity-reaction-deleted.d.ts +0 -12
  334. package/dist/src/utils/state-update-queue.d.ts +0 -6
  335. package/dist/src/utils/type-assertions.d.ts +0 -7
  336. package/index.ts +0 -9
  337. package/src/common/StateStore.ts +0 -332
  338. /package/{@react-bindings → src/bindings/react}/hooks/client-state-hooks/index.ts +0 -0
  339. /package/{@react-bindings → src/bindings/react}/hooks/feed-state-hooks/index.ts +0 -0
  340. /package/{@react-bindings → src/bindings/react}/hooks/internal/index.ts +0 -0
  341. /package/{@react-bindings → src/bindings/react}/hooks/search-state-hooks/index.ts +0 -0
  342. /package/{@react-bindings → src/bindings/react}/hooks/util/index.ts +0 -0
@@ -9,7 +9,9 @@ import {
9
9
  generateOwnUser,
10
10
  generateActivityReactionAddedEvent,
11
11
  getHumanId,
12
- } from '../../../test-utils/response-generators';
12
+ } from '../../../test-utils';
13
+ import { shouldUpdateState } from '../../../utils';
14
+ import { EventPayload } from '../../../types-internal';
13
15
 
14
16
  describe(handleActivityReactionAdded.name, () => {
15
17
  let feed: Feed;
@@ -154,4 +156,102 @@ describe(handleActivityReactionAdded.name, () => {
154
156
 
155
157
  expect(stateAfter).toBe(stateBefore);
156
158
  });
159
+
160
+ describe(`Activity reaction added ${shouldUpdateState.name} integration`, () => {
161
+ const activityId = 'reacted-activity';
162
+ let currentUserPayload: EventPayload<'feeds.activity.reaction.added'>;
163
+
164
+ beforeEach(() => {
165
+ currentUserPayload = generateActivityReactionAddedEvent({
166
+ reaction: { user: { id: currentUserId }, activity_id: activityId },
167
+ activity: { id: activityId }
168
+ });
169
+
170
+ feed.state.partialNext({ activities: [currentUserPayload.activity]});
171
+ feed.state.partialNext({ watch: true });
172
+ })
173
+
174
+ it(`skips update if ${shouldUpdateState.name} returns false`, () => {
175
+ // 1. HTTP and then WS
176
+
177
+ handleActivityReactionAdded.call(feed, currentUserPayload, false);
178
+
179
+ let stateBefore = feed.currentState;
180
+
181
+ handleActivityReactionAdded.call(feed, currentUserPayload);
182
+
183
+ let stateAfter = feed.currentState;
184
+
185
+ expect(stateAfter).toBe(stateBefore);
186
+ // @ts-expect-error Using Feed internals for tests only
187
+ expect(feed.stateUpdateQueue.size).toEqual(0);
188
+
189
+ // 2. WS and the HTTP
190
+
191
+ handleActivityReactionAdded.call(feed, currentUserPayload);
192
+
193
+ stateBefore = feed.currentState;
194
+
195
+ handleActivityReactionAdded.call(feed, currentUserPayload, false);
196
+
197
+ stateAfter = feed.currentState;
198
+
199
+ expect(stateAfter).toBe(stateBefore);
200
+ // @ts-expect-error Using Feed internals for tests only
201
+ expect(feed.stateUpdateQueue.size).toEqual(0);
202
+ })
203
+
204
+ it('allows update again from WS after clearing the stateUpdateQueue', () => {
205
+ handleActivityReactionAdded.call(feed, currentUserPayload);
206
+
207
+ // Clear the queue
208
+ (feed as any).stateUpdateQueue.clear();
209
+
210
+ // Now update should be allowed from another WS event
211
+ handleActivityReactionAdded.call(feed, currentUserPayload);
212
+
213
+ const activities = feed.currentState.activities!;
214
+ const activity = activities.find((a) => a.id === activityId);
215
+ const [latestReaction] = activity?.own_reactions ?? [];
216
+
217
+ expect(activity?.own_reactions.length).toEqual(2);
218
+ expect(latestReaction).toMatchObject(currentUserPayload.reaction);
219
+ });
220
+
221
+ it('allows update again from HTTP response after clearing the stateUpdateQueue', () => {
222
+ handleActivityReactionAdded.call(feed, currentUserPayload, false);
223
+
224
+ // Clear the queue
225
+ (feed as any).stateUpdateQueue.clear();
226
+
227
+ // Now update should be allowed from another HTTP response
228
+ handleActivityReactionAdded.call(feed, currentUserPayload, false);
229
+
230
+ const activities = feed.currentState.activities!;
231
+ const activity = activities.find((a) => a.id === activityId);
232
+ const [latestReaction] = activity?.own_reactions ?? [];
233
+
234
+ expect(activity?.own_reactions.length).toEqual(2);
235
+ expect(latestReaction).toMatchObject(currentUserPayload.reaction);
236
+ });
237
+
238
+ it('should not insert anything into the stateUpdateQueue if the connected_user did not trigger the reaction', () => {
239
+ const otherUserPayload = generateActivityReactionAddedEvent({
240
+ reaction: { user: { id: getHumanId() }, activity_id: activityId },
241
+ activity: { id: activityId }
242
+ });
243
+
244
+ handleActivityReactionAdded.call(feed, otherUserPayload);
245
+
246
+ expect((feed as any).stateUpdateQueue).toEqual(new Set());
247
+
248
+ handleActivityReactionAdded.call(feed, otherUserPayload);
249
+
250
+ const activities = feed.currentState.activities!;
251
+ const activity = activities.find((a) => a.id === activityId);
252
+
253
+ expect((feed as any).stateUpdateQueue).toEqual(new Set());
254
+ expect(activity?.own_reactions.length).toEqual(0);
255
+ });
256
+ })
157
257
  });
@@ -1,108 +1,134 @@
1
- import type { Feed } from '../../../feed';
1
+ import type { Feed } from '../../feed';
2
2
  import type {
3
3
  ActivityPinResponse,
4
- ActivityReactionAddedEvent,
5
4
  ActivityResponse,
6
5
  } from '../../../gen/models';
7
- import type { EventPayload } from '../../../types-internal';
8
- import { updateEntityInArray } from '../../../utils';
6
+ import type { EventPayload, PartializeAllBut } from '../../../types-internal';
7
+ import {
8
+ getStateUpdateQueueId,
9
+ shouldUpdateState,
10
+ updateEntityInArray,
11
+ } from '../../../utils';
12
+
13
+ type AddActivityReactionPayload = PartializeAllBut<EventPayload<'feeds.activity.reaction.added'>, 'activity' | 'reaction'>;
9
14
 
10
15
  // shared function to update the activity with the new reaction
11
16
  const sharedUpdateActivity = ({
17
+ payload,
12
18
  currentActivity,
13
- event,
14
19
  eventBelongsToCurrentUser,
15
20
  }: {
21
+ payload: AddActivityReactionPayload;
16
22
  currentActivity: ActivityResponse;
17
- event: ActivityReactionAddedEvent;
18
23
  eventBelongsToCurrentUser: boolean;
19
24
  }) => {
25
+ const { activity: newActivity, reaction: newReaction } = payload;
20
26
  let newOwnReactions = currentActivity.own_reactions;
21
27
 
22
28
  if (eventBelongsToCurrentUser) {
23
- newOwnReactions = [...currentActivity.own_reactions, event.reaction];
29
+ newOwnReactions = [...currentActivity.own_reactions, newReaction];
24
30
  }
25
31
 
26
32
  return {
27
- ...event.activity,
33
+ ...currentActivity,
34
+ latest_reactions: newActivity.latest_reactions,
35
+ reaction_groups: newActivity.reaction_groups,
36
+ reaction_count: newActivity.reaction_count,
28
37
  own_reactions: newOwnReactions,
29
- own_bookmarks: currentActivity.own_bookmarks,
30
38
  };
31
39
  };
32
40
 
33
41
  export const addReactionToActivities = (
34
- event: ActivityReactionAddedEvent,
42
+ payload: AddActivityReactionPayload,
35
43
  activities: ActivityResponse[] | undefined,
36
44
  eventBelongsToCurrentUser: boolean,
37
45
  ) =>
38
46
  updateEntityInArray({
39
47
  entities: activities,
40
- matcher: (activity) => activity.id === event.activity.id,
48
+ matcher: (activity) => activity.id === payload.activity.id,
41
49
  updater: (matchedActivity) =>
42
50
  sharedUpdateActivity({
51
+ payload,
43
52
  currentActivity: matchedActivity,
44
- event,
45
53
  eventBelongsToCurrentUser,
46
54
  }),
47
55
  });
48
56
 
49
57
  export const addReactionToPinnedActivities = (
50
- event: ActivityReactionAddedEvent,
58
+ payload: AddActivityReactionPayload,
51
59
  pinnedActivities: ActivityPinResponse[] | undefined,
52
60
  eventBelongsToCurrentUser: boolean,
53
61
  ) =>
54
62
  updateEntityInArray({
55
63
  entities: pinnedActivities,
56
64
  matcher: (pinnedActivity) =>
57
- pinnedActivity.activity.id === event.activity.id,
65
+ pinnedActivity.activity.id === payload.activity.id,
58
66
  updater: (matchedPinnedActivity) => {
59
- const newActivity = sharedUpdateActivity({
67
+ const updatedActivity = sharedUpdateActivity({
68
+ payload,
60
69
  currentActivity: matchedPinnedActivity.activity,
61
- event,
62
70
  eventBelongsToCurrentUser,
63
71
  });
64
72
 
65
73
  // this should never happen, but just in case
66
- if (newActivity === matchedPinnedActivity.activity) {
74
+ if (updatedActivity === matchedPinnedActivity.activity) {
67
75
  return matchedPinnedActivity;
68
76
  }
69
77
 
70
78
  return {
71
79
  ...matchedPinnedActivity,
72
- activity: newActivity,
80
+ activity: updatedActivity,
73
81
  };
74
82
  },
75
83
  });
76
84
 
77
85
  export function handleActivityReactionAdded(
78
86
  this: Feed,
79
- event: EventPayload<'feeds.activity.reaction.added'>,
87
+ payload: AddActivityReactionPayload,
88
+ fromWs?: boolean,
80
89
  ) {
90
+ const connectedUser = this.client.state.getLatestValue().connected_user;
91
+
92
+ const eventBelongsToCurrentUser =
93
+ typeof connectedUser !== 'undefined' &&
94
+ payload.reaction.user.id === connectedUser.id;
95
+
96
+ if (
97
+ !shouldUpdateState({
98
+ stateUpdateQueueId: getStateUpdateQueueId(
99
+ payload,
100
+ 'activity-reaction-created',
101
+ ),
102
+ stateUpdateQueue: this.stateUpdateQueue,
103
+ watch: this.currentState.watch,
104
+ fromWs,
105
+ isTriggeredByConnectedUser: eventBelongsToCurrentUser,
106
+ })
107
+ ) {
108
+ return;
109
+ }
110
+
81
111
  const {
82
112
  activities: currentActivities,
83
113
  pinned_activities: currentPinnedActivities,
84
114
  } = this.currentState;
85
- const connectedUser = this.client.state.getLatestValue().connected_user;
86
- const eventBelongsToCurrentUser =
87
- typeof connectedUser !== 'undefined' &&
88
- event.reaction.user.id === connectedUser.id;
89
115
 
90
116
  const [result1, result2] = [
91
- addReactionToActivities(
92
- event,
117
+ this.hasActivity(payload.activity.id) ? addReactionToActivities(
118
+ payload,
93
119
  currentActivities,
94
120
  eventBelongsToCurrentUser,
95
- ),
121
+ ) : undefined,
96
122
  addReactionToPinnedActivities(
97
- event,
123
+ payload,
98
124
  currentPinnedActivities,
99
125
  eventBelongsToCurrentUser,
100
126
  ),
101
127
  ];
102
128
 
103
- if (result1.changed || result2.changed) {
129
+ if (result1?.changed || result2.changed) {
104
130
  this.state.partialNext({
105
- activities: result1.entities,
131
+ ...(result1 ? { activities: result1.entities } : {}),
106
132
  pinned_activities: result2.entities,
107
133
  });
108
134
  }
@@ -2,6 +2,7 @@ import { describe, it, expect, beforeEach } from 'vitest';
2
2
  import { Feed } from '../../../feed';
3
3
  import { FeedsClient } from '../../../feeds-client';
4
4
  import { handleActivityReactionDeleted } from './handle-activity-reaction-deleted';
5
+ import { handleActivityReactionAdded } from './handle-activity-reaction-added';
5
6
  import {
6
7
  generateActivityPinResponse,
7
8
  generateActivityResponse,
@@ -10,7 +11,9 @@ import {
10
11
  generateOwnUser,
11
12
  getHumanId,
12
13
  generateActivityReactionDeletedEvent,
13
- } from '../../../test-utils/response-generators';
14
+ } from '../../../test-utils';
15
+ import { shouldUpdateState } from '../../../utils';
16
+ import { EventPayload } from '../../../types-internal';
14
17
 
15
18
  describe(handleActivityReactionDeleted.name, () => {
16
19
  let feed: Feed;
@@ -197,4 +200,118 @@ describe(handleActivityReactionDeleted.name, () => {
197
200
 
198
201
  expect(stateAfter).toBe(stateBefore);
199
202
  });
203
+
204
+ describe(`Activity reaction deleted ${shouldUpdateState.name} integration`, () => {
205
+ const activityId = 'reacted-activity';
206
+ let currentUserPayload: EventPayload<'feeds.activity.reaction.deleted'>;
207
+ let otherUserPayload: EventPayload<'feeds.activity.reaction.deleted'>;
208
+
209
+ beforeEach(() => {
210
+ currentUserPayload = generateActivityReactionDeletedEvent({
211
+ reaction: { user: { id: currentUserId }, activity_id: activityId },
212
+ activity: { id: activityId }
213
+ });
214
+
215
+ otherUserPayload = generateActivityReactionDeletedEvent({
216
+ reaction: { user: { id: getHumanId() }, activity_id: activityId },
217
+ activity: { id: activityId }
218
+ });
219
+
220
+ feed.state.partialNext({ activities: [currentUserPayload.activity]});
221
+ feed.state.partialNext({ watch: true });
222
+
223
+ handleActivityReactionAdded.call(feed, currentUserPayload, false);
224
+ handleActivityReactionAdded.call(feed, otherUserPayload, false);
225
+
226
+ (feed as any).stateUpdateQueue.clear();
227
+ })
228
+
229
+ it(`skips update if ${shouldUpdateState.name} returns false`, () => {
230
+ // 1. HTTP and then WS
231
+
232
+ handleActivityReactionDeleted.call(feed, currentUserPayload, false);
233
+
234
+ let stateBefore = feed.currentState;
235
+
236
+ handleActivityReactionDeleted.call(feed, currentUserPayload);
237
+
238
+ let stateAfter = feed.currentState;
239
+
240
+ expect(stateAfter).toBe(stateBefore);
241
+ // @ts-expect-error Using Feed internals for tests only
242
+ expect(feed.stateUpdateQueue.size).toEqual(0);
243
+
244
+ // 2. WS and the HTTP
245
+
246
+ handleActivityReactionDeleted.call(feed, currentUserPayload);
247
+
248
+ stateBefore = feed.currentState;
249
+
250
+ handleActivityReactionDeleted.call(feed, currentUserPayload, false);
251
+
252
+ stateAfter = feed.currentState;
253
+
254
+ expect(stateAfter).toBe(stateBefore);
255
+ // @ts-expect-error Using Feed internals for tests only
256
+ expect(feed.stateUpdateQueue.size).toEqual(0);
257
+ })
258
+
259
+ it('allows update again from WS after clearing the stateUpdateQueue', () => {
260
+ handleActivityReactionDeleted.call(feed, currentUserPayload);
261
+
262
+ let activities = feed.currentState.activities!;
263
+ let activity = activities.find((a) => a.id === activityId);
264
+
265
+ expect(activity?.own_reactions.length).toEqual(0);
266
+
267
+ // Clear the queue and reinitialize the state
268
+ handleActivityReactionAdded.call(feed, currentUserPayload, false);
269
+ (feed as any).stateUpdateQueue.clear();
270
+
271
+ // Now update should be allowed from another WS event
272
+ handleActivityReactionDeleted.call(feed, currentUserPayload);
273
+
274
+ activities = feed.currentState.activities!;
275
+ activity = activities.find((a) => a.id === activityId);
276
+
277
+ expect(activity?.own_reactions.length).toEqual(0);
278
+ });
279
+
280
+ it('allows update again from HTTP response after clearing the stateUpdateQueue', () => {
281
+ handleActivityReactionDeleted.call(feed, currentUserPayload, false);
282
+
283
+ let activities = feed.currentState.activities!;
284
+ let activity = activities.find((a) => a.id === activityId);
285
+
286
+ expect(activity?.own_reactions.length).toEqual(0);
287
+
288
+ // Clear the queue and reinitialize the state
289
+ handleActivityReactionAdded.call(feed, currentUserPayload, false);
290
+ (feed as any).stateUpdateQueue.clear();
291
+
292
+ // Now update should be allowed from another HTTP response
293
+ handleActivityReactionDeleted.call(feed, currentUserPayload, false);
294
+
295
+ activities = feed.currentState.activities!;
296
+ activity = activities.find((a) => a.id === activityId);
297
+
298
+ expect(activity?.own_reactions.length).toEqual(0);
299
+ });
300
+
301
+ it('should not insert anything into the stateUpdateQueue if the connected_user did not trigger the reaction', () => {
302
+ handleActivityReactionDeleted.call(feed, otherUserPayload);
303
+
304
+ expect((feed as any).stateUpdateQueue).toEqual(new Set());
305
+
306
+ handleActivityReactionDeleted.call(feed, otherUserPayload);
307
+
308
+ const activities = feed.currentState.activities!;
309
+ const activity = activities.find((a) => a.id === activityId);
310
+ const [latestOwnReaction] = activity?.own_reactions ?? [];
311
+
312
+ expect((feed as any).stateUpdateQueue).toEqual(new Set());
313
+ expect(activity?.own_reactions.length).toEqual(1);
314
+ expect(latestOwnReaction).toMatchObject(currentUserPayload.reaction);
315
+ });
316
+ })
200
317
  });
@@ -1,69 +1,77 @@
1
- import type { Feed } from '../../../feed';
1
+ import type { Feed } from '../../feed';
2
+ import { ActivityPinResponse, ActivityResponse } from '../../../gen/models';
3
+ import type { EventPayload, PartializeAllBut } from '../../../types-internal';
2
4
  import {
3
- ActivityPinResponse,
4
- ActivityReactionDeletedEvent,
5
- ActivityResponse,
6
- } from '../../../gen/models';
7
- import type { EventPayload } from '../../../types-internal';
8
- import { updateEntityInArray } from '../../../utils';
5
+ getStateUpdateQueueId,
6
+ shouldUpdateState,
7
+ updateEntityInArray,
8
+ } from '../../../utils';
9
+
10
+ type ActivityReactionDeletedPayload = PartializeAllBut<
11
+ EventPayload<'feeds.activity.reaction.deleted'>,
12
+ 'activity' | 'reaction'
13
+ >;
9
14
 
10
15
  const sharedUpdateActivity = ({
11
16
  currentActivity,
12
- event,
17
+ payload,
13
18
  eventBelongsToCurrentUser,
14
19
  }: {
15
20
  currentActivity: ActivityResponse;
16
- event: ActivityReactionDeletedEvent;
21
+ payload: ActivityReactionDeletedPayload;
17
22
  eventBelongsToCurrentUser: boolean;
18
23
  }) => {
24
+ const { activity: newActivity, reaction: newReaction } = payload;
19
25
  let newOwnReactions = currentActivity.own_reactions;
20
26
 
21
27
  if (eventBelongsToCurrentUser) {
22
28
  newOwnReactions = currentActivity.own_reactions.filter(
23
29
  (reaction) =>
24
30
  !(
25
- reaction.type === event.reaction.type &&
26
- reaction.user.id === event.reaction.user.id
31
+ reaction.type === newReaction.type &&
32
+ reaction.user.id === newReaction.user.id
27
33
  ),
28
34
  );
29
35
  }
30
36
 
31
37
  return {
32
- ...event.activity,
38
+ ...currentActivity,
39
+ latest_reactions: newActivity.latest_reactions,
40
+ reaction_groups: newActivity.reaction_groups,
41
+ reaction_count: newActivity.reaction_count,
33
42
  own_reactions: newOwnReactions,
34
- own_bookmarks: currentActivity.own_bookmarks,
35
43
  };
36
44
  };
37
45
 
38
46
  export const removeReactionFromActivities = (
39
- event: ActivityReactionDeletedEvent,
47
+ payload: ActivityReactionDeletedPayload,
40
48
  activities: ActivityResponse[] | undefined,
41
49
  eventBelongsToCurrentUser: boolean,
42
50
  ) =>
43
51
  updateEntityInArray({
44
52
  entities: activities,
45
- matcher: (activity) => activity.id === event.activity.id,
53
+ matcher: (activity) => activity.id === payload.activity.id,
46
54
  updater: (matchedActivity) =>
47
55
  sharedUpdateActivity({
48
56
  currentActivity: matchedActivity,
49
- event,
57
+ payload,
50
58
  eventBelongsToCurrentUser,
51
59
  }),
52
60
  });
53
61
 
54
62
  export const removeReactionFromPinnedActivities = (
55
- event: ActivityReactionDeletedEvent,
63
+ payload: ActivityReactionDeletedPayload,
56
64
  activities: ActivityPinResponse[] | undefined,
57
65
  eventBelongsToCurrentUser: boolean,
58
66
  ) =>
59
67
  updateEntityInArray({
60
68
  entities: activities,
61
69
  matcher: (pinnedActivity) =>
62
- pinnedActivity.activity.id === event.activity.id,
70
+ pinnedActivity.activity.id === payload.activity.id,
63
71
  updater: (matchedPinnedActivity) => {
64
72
  const newActivity = sharedUpdateActivity({
65
73
  currentActivity: matchedPinnedActivity.activity,
66
- event,
74
+ payload,
67
75
  eventBelongsToCurrentUser,
68
76
  });
69
77
 
@@ -80,33 +88,52 @@ export const removeReactionFromPinnedActivities = (
80
88
 
81
89
  export function handleActivityReactionDeleted(
82
90
  this: Feed,
83
- event: EventPayload<'feeds.activity.reaction.deleted'>,
91
+ payload: ActivityReactionDeletedPayload,
92
+ fromWs?: boolean,
84
93
  ) {
94
+ const connectedUser = this.client.state.getLatestValue().connected_user;
95
+ const eventBelongsToCurrentUser =
96
+ typeof connectedUser !== 'undefined' &&
97
+ payload.reaction.user.id === connectedUser.id;
98
+
99
+ if (
100
+ !shouldUpdateState({
101
+ stateUpdateQueueId: getStateUpdateQueueId(
102
+ payload,
103
+ 'activity-reaction-deleted',
104
+ ),
105
+ stateUpdateQueue: this.stateUpdateQueue,
106
+ watch: this.currentState.watch,
107
+ fromWs,
108
+ isTriggeredByConnectedUser: eventBelongsToCurrentUser
109
+ })
110
+ ) {
111
+ return;
112
+ }
113
+
85
114
  const {
86
115
  activities: currentActivities,
87
116
  pinned_activities: currentPinnedActivities,
88
117
  } = this.currentState;
89
- const connectedUser = this.client.state.getLatestValue().connected_user;
90
- const eventBelongsToCurrentUser =
91
- typeof connectedUser !== 'undefined' &&
92
- event.reaction.user.id === connectedUser.id;
93
118
 
94
119
  const [result1, result2] = [
95
- removeReactionFromActivities(
96
- event,
97
- currentActivities,
98
- eventBelongsToCurrentUser,
99
- ),
120
+ this.hasActivity(payload.activity.id)
121
+ ? removeReactionFromActivities(
122
+ payload,
123
+ currentActivities,
124
+ eventBelongsToCurrentUser,
125
+ )
126
+ : undefined,
100
127
  removeReactionFromPinnedActivities(
101
- event,
128
+ payload,
102
129
  currentPinnedActivities,
103
130
  eventBelongsToCurrentUser,
104
131
  ),
105
132
  ];
106
133
 
107
- if (result1.changed || result2.changed) {
134
+ if (result1?.changed || result2.changed) {
108
135
  this.state.partialNext({
109
- activities: result1.entities,
136
+ ...(result1 ? { activities: result1.entities } : {}),
110
137
  pinned_activities: result2.entities,
111
138
  });
112
139
  }
@@ -8,7 +8,7 @@ export function handleActivityRemovedFromFeed(
8
8
  ) {
9
9
  const currentActivities = this.currentState.activities;
10
10
  if (currentActivities) {
11
- const result = removeActivityFromState(event.activity, currentActivities);
11
+ const result = removeActivityFromState.bind(this)(event.activity, currentActivities);
12
12
  if (result.changed) {
13
13
  this.state.partialNext({ activities: result.activities });
14
14
  }