@stream-io/feeds-client 0.2.11 → 0.2.13

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 (186) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/cjs/index.js +1 -1
  3. package/dist/cjs/index.js.map +1 -1
  4. package/dist/cjs/react-bindings.js +56 -46
  5. package/dist/cjs/react-bindings.js.map +1 -1
  6. package/dist/es/index.mjs +2 -2
  7. package/dist/es/index.mjs.map +1 -1
  8. package/dist/es/react-bindings.mjs +56 -46
  9. package/dist/es/react-bindings.mjs.map +1 -1
  10. package/dist/{index-CFv0uza2.js → index-RzB4c4g6.js} +98 -28
  11. package/dist/index-RzB4c4g6.js.map +1 -0
  12. package/dist/{index-DP0C8psw.mjs → index-gvcJhGPH.mjs} +98 -28
  13. package/dist/index-gvcJhGPH.mjs.map +1 -0
  14. package/dist/tsconfig.tsbuildinfo +1 -1
  15. package/dist/types/bindings/react/hooks/feed-state-hooks/useAggregatedActivities.d.ts +9 -4
  16. package/dist/types/bindings/react/hooks/feed-state-hooks/useAggregatedActivities.d.ts.map +1 -1
  17. package/dist/types/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivityRead.d.ts.map +1 -1
  18. package/dist/types/bindings/react/hooks/feed-state-hooks/useOwnCapabilities.d.ts +15 -16
  19. package/dist/types/bindings/react/hooks/feed-state-hooks/useOwnCapabilities.d.ts.map +1 -1
  20. package/dist/types/bindings/react/hooks/feed-state-hooks/useOwnFollows.d.ts +1 -1
  21. package/dist/types/bindings/react/hooks/feed-state-hooks/useOwnFollows.d.ts.map +1 -1
  22. package/dist/types/bindings/react/hooks/util/useReactionActions.d.ts +1 -1
  23. package/dist/types/bindings/react/hooks/util/useReactionActions.d.ts.map +1 -1
  24. package/dist/types/bindings/react/wrappers/StreamFeed.d.ts +1 -1
  25. package/dist/types/bindings/react/wrappers/StreamFeed.d.ts.map +1 -1
  26. package/dist/types/bindings/react/wrappers/StreamFeeds.d.ts +1 -1
  27. package/dist/types/bindings/react/wrappers/StreamFeeds.d.ts.map +1 -1
  28. package/dist/types/bindings/react/wrappers/StreamSearch.d.ts +1 -1
  29. package/dist/types/bindings/react/wrappers/StreamSearch.d.ts.map +1 -1
  30. package/dist/types/bindings/react/wrappers/StreamSearchResults.d.ts +1 -1
  31. package/dist/types/bindings/react/wrappers/StreamSearchResults.d.ts.map +1 -1
  32. package/dist/types/common/ApiClient.d.ts +3 -3
  33. package/dist/types/common/ApiClient.d.ts.map +1 -1
  34. package/dist/types/common/EventDispatcher.d.ts +1 -1
  35. package/dist/types/common/EventDispatcher.d.ts.map +1 -1
  36. package/dist/types/common/rate-limit.d.ts +1 -1
  37. package/dist/types/common/rate-limit.d.ts.map +1 -1
  38. package/dist/types/common/real-time/StableWSConnection.d.ts +3 -3
  39. package/dist/types/common/real-time/StableWSConnection.d.ts.map +1 -1
  40. package/dist/types/common/real-time/event-models.d.ts +1 -1
  41. package/dist/types/common/real-time/event-models.d.ts.map +1 -1
  42. package/dist/types/common/search/ActivitySearchSource.d.ts +2 -2
  43. package/dist/types/common/search/ActivitySearchSource.d.ts.map +1 -1
  44. package/dist/types/common/search/FeedSearchSource.d.ts +2 -2
  45. package/dist/types/common/search/FeedSearchSource.d.ts.map +1 -1
  46. package/dist/types/common/search/UserSearchSource.d.ts +2 -2
  47. package/dist/types/common/search/UserSearchSource.d.ts.map +1 -1
  48. package/dist/types/feed/event-handlers/activity/handle-activity-added.d.ts +3 -3
  49. package/dist/types/feed/event-handlers/activity/handle-activity-added.d.ts.map +1 -1
  50. package/dist/types/feed/event-handlers/activity/handle-activity-marked.d.ts +3 -3
  51. package/dist/types/feed/event-handlers/activity/handle-activity-marked.d.ts.map +1 -1
  52. package/dist/types/feed/event-handlers/activity/handle-activity-pinned.d.ts +2 -2
  53. package/dist/types/feed/event-handlers/activity/handle-activity-pinned.d.ts.map +1 -1
  54. package/dist/types/feed/event-handlers/activity/handle-activity-reaction-deleted.d.ts +1 -1
  55. package/dist/types/feed/event-handlers/activity/handle-activity-reaction-deleted.d.ts.map +1 -1
  56. package/dist/types/feed/event-handlers/activity/handle-activity-removed-from-feed.d.ts +2 -2
  57. package/dist/types/feed/event-handlers/activity/handle-activity-removed-from-feed.d.ts.map +1 -1
  58. package/dist/types/feed/event-handlers/activity/handle-activity-unpinned.d.ts +2 -2
  59. package/dist/types/feed/event-handlers/activity/handle-activity-unpinned.d.ts.map +1 -1
  60. package/dist/types/feed/event-handlers/activity/handle-activity-updated.d.ts +3 -3
  61. package/dist/types/feed/event-handlers/activity/handle-activity-updated.d.ts.map +1 -1
  62. package/dist/types/feed/event-handlers/comment/handle-comment-deleted.d.ts +3 -2
  63. package/dist/types/feed/event-handlers/comment/handle-comment-deleted.d.ts.map +1 -1
  64. package/dist/types/feed/event-handlers/comment/handle-comment-reaction-added.d.ts +3 -2
  65. package/dist/types/feed/event-handlers/comment/handle-comment-reaction-added.d.ts.map +1 -1
  66. package/dist/types/feed/event-handlers/comment/handle-comment-reaction-deleted.d.ts +3 -2
  67. package/dist/types/feed/event-handlers/comment/handle-comment-reaction-deleted.d.ts.map +1 -1
  68. package/dist/types/feed/event-handlers/comment/handle-comment-updated.d.ts +3 -2
  69. package/dist/types/feed/event-handlers/comment/handle-comment-updated.d.ts.map +1 -1
  70. package/dist/types/feed/event-handlers/comment/utils/update-comment-count.d.ts +2 -2
  71. package/dist/types/feed/event-handlers/comment/utils/update-comment-count.d.ts.map +1 -1
  72. package/dist/types/feed/event-handlers/feed/handle-feed-updated.d.ts +2 -2
  73. package/dist/types/feed/event-handlers/feed/handle-feed-updated.d.ts.map +1 -1
  74. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-added.d.ts +2 -2
  75. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-added.d.ts.map +1 -1
  76. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-removed.d.ts +2 -2
  77. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-removed.d.ts.map +1 -1
  78. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-updated.d.ts +2 -2
  79. package/dist/types/feed/event-handlers/feed-member/handle-feed-member-updated.d.ts.map +1 -1
  80. package/dist/types/feed/event-handlers/follow/handle-follow-updated.d.ts +1 -1
  81. package/dist/types/feed/event-handlers/follow/handle-follow-updated.d.ts.map +1 -1
  82. package/dist/types/feed/event-handlers/notification-feed/handle-notification-feed-updated.d.ts +9 -2
  83. package/dist/types/feed/event-handlers/notification-feed/handle-notification-feed-updated.d.ts.map +1 -1
  84. package/dist/types/feed/event-handlers/watch/handle-watch-started.d.ts +1 -1
  85. package/dist/types/feed/event-handlers/watch/handle-watch-started.d.ts.map +1 -1
  86. package/dist/types/feed/event-handlers/watch/handle-watch-stopped.d.ts +1 -1
  87. package/dist/types/feed/event-handlers/watch/handle-watch-stopped.d.ts.map +1 -1
  88. package/dist/types/feed/feed.d.ts +3 -3
  89. package/dist/types/feed/feed.d.ts.map +1 -1
  90. package/dist/types/feeds-client/feeds-client.d.ts +3 -3
  91. package/dist/types/feeds-client/feeds-client.d.ts.map +1 -1
  92. package/dist/types/gen/feeds/FeedApi.d.ts +2 -2
  93. package/dist/types/gen/feeds/FeedApi.d.ts.map +1 -1
  94. package/dist/types/gen/feeds/FeedsApi.d.ts +2 -2
  95. package/dist/types/gen/feeds/FeedsApi.d.ts.map +1 -1
  96. package/dist/types/gen/model-decoders/event-decoder-mapping.d.ts +1 -1
  97. package/dist/types/gen/model-decoders/event-decoder-mapping.d.ts.map +1 -1
  98. package/dist/types/gen/models/index.d.ts +24 -26
  99. package/dist/types/gen/models/index.d.ts.map +1 -1
  100. package/dist/types/gen/moderation/ModerationApi.d.ts +2 -2
  101. package/dist/types/gen/moderation/ModerationApi.d.ts.map +1 -1
  102. package/dist/types/types-internal.d.ts +1 -1
  103. package/dist/types/types-internal.d.ts.map +1 -1
  104. package/dist/types/types.d.ts +4 -4
  105. package/dist/types/types.d.ts.map +1 -1
  106. package/dist/types/utils/event-triggered-by-connected-user.d.ts +2 -2
  107. package/dist/types/utils/event-triggered-by-connected-user.d.ts.map +1 -1
  108. package/dist/types/utils/state-update-queue.d.ts +2 -2
  109. package/dist/types/utils/state-update-queue.d.ts.map +1 -1
  110. package/dist/types/utils/type-assertions.d.ts +3 -4
  111. package/dist/types/utils/type-assertions.d.ts.map +1 -1
  112. package/package.json +1 -1
  113. package/src/bindings/react/hooks/feed-state-hooks/useAggregatedActivities.ts +28 -4
  114. package/src/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivityRead.ts +4 -5
  115. package/src/bindings/react/hooks/feed-state-hooks/useOwnCapabilities.ts +52 -38
  116. package/src/bindings/react/hooks/feed-state-hooks/useOwnFollows.ts +1 -1
  117. package/src/bindings/react/hooks/util/useReactionActions.ts +2 -1
  118. package/src/bindings/react/wrappers/StreamFeed.tsx +1 -1
  119. package/src/bindings/react/wrappers/StreamFeeds.tsx +1 -1
  120. package/src/bindings/react/wrappers/StreamSearch.tsx +1 -1
  121. package/src/bindings/react/wrappers/StreamSearchResults.tsx +1 -1
  122. package/src/common/ApiClient.ts +6 -4
  123. package/src/common/EventDispatcher.ts +1 -1
  124. package/src/common/rate-limit.ts +1 -1
  125. package/src/common/real-time/StableWSConnection.ts +3 -3
  126. package/src/common/real-time/event-models.ts +1 -1
  127. package/src/common/search/ActivitySearchSource.ts +2 -2
  128. package/src/common/search/FeedSearchSource.ts +2 -2
  129. package/src/common/search/UserSearchSource.ts +2 -2
  130. package/src/feed/event-handlers/activity/activity-marked-utils.test.ts +1 -1
  131. package/src/feed/event-handlers/activity/activity-reaction-utils.test.ts +1 -1
  132. package/src/feed/event-handlers/activity/activity-utils.test.ts +1 -1
  133. package/src/feed/event-handlers/activity/handle-activity-added.ts +3 -3
  134. package/src/feed/event-handlers/activity/handle-activity-marked.ts +3 -3
  135. package/src/feed/event-handlers/activity/handle-activity-pinned.test.ts +1 -1
  136. package/src/feed/event-handlers/activity/handle-activity-pinned.ts +3 -3
  137. package/src/feed/event-handlers/activity/handle-activity-reaction-added.test.ts +1 -1
  138. package/src/feed/event-handlers/activity/handle-activity-reaction-deleted.test.ts +1 -1
  139. package/src/feed/event-handlers/activity/handle-activity-reaction-deleted.ts +1 -1
  140. package/src/feed/event-handlers/activity/handle-activity-removed-from-feed.ts +2 -2
  141. package/src/feed/event-handlers/activity/handle-activity-unpinned.test.ts +2 -2
  142. package/src/feed/event-handlers/activity/handle-activity-unpinned.ts +2 -2
  143. package/src/feed/event-handlers/activity/handle-activity-updated.test.ts +2 -2
  144. package/src/feed/event-handlers/activity/handle-activity-updated.ts +3 -3
  145. package/src/feed/event-handlers/bookmark/bookmark-utils.test.ts +1 -1
  146. package/src/feed/event-handlers/comment/handle-comment-added.test.ts +2 -2
  147. package/src/feed/event-handlers/comment/handle-comment-deleted.test.ts +2 -2
  148. package/src/feed/event-handlers/comment/handle-comment-deleted.ts +3 -2
  149. package/src/feed/event-handlers/comment/handle-comment-reaction-added.test.ts +2 -2
  150. package/src/feed/event-handlers/comment/handle-comment-reaction-added.ts +3 -2
  151. package/src/feed/event-handlers/comment/handle-comment-reaction-deleted.test.ts +2 -2
  152. package/src/feed/event-handlers/comment/handle-comment-reaction-deleted.ts +3 -2
  153. package/src/feed/event-handlers/comment/handle-comment-updated.test.ts +2 -2
  154. package/src/feed/event-handlers/comment/handle-comment-updated.ts +3 -2
  155. package/src/feed/event-handlers/comment/utils/update-comment-count.test.ts +3 -1
  156. package/src/feed/event-handlers/comment/utils/update-comment-count.ts +2 -2
  157. package/src/feed/event-handlers/feed/handle-feed-updated.ts +2 -2
  158. package/src/feed/event-handlers/feed-member/handle-feed-member-added.ts +2 -2
  159. package/src/feed/event-handlers/feed-member/handle-feed-member-removed.ts +2 -2
  160. package/src/feed/event-handlers/feed-member/handle-feed-member-updated.ts +2 -2
  161. package/src/feed/event-handlers/follow/handle-follow-created.test.ts +1 -1
  162. package/src/feed/event-handlers/follow/handle-follow-deleted.test.ts +1 -1
  163. package/src/feed/event-handlers/follow/handle-follow-updated.test.ts +1 -1
  164. package/src/feed/event-handlers/follow/handle-follow-updated.ts +1 -1
  165. package/src/feed/event-handlers/notification-feed/handle-notification-feed-updated.test.ts +310 -12
  166. package/src/feed/event-handlers/notification-feed/handle-notification-feed-updated.ts +90 -7
  167. package/src/feed/event-handlers/watch/handle-watch-started.ts +1 -1
  168. package/src/feed/event-handlers/watch/handle-watch-stopped.ts +1 -1
  169. package/src/feed/feed.test.ts +1 -1
  170. package/src/feed/feed.ts +24 -4
  171. package/src/feeds-client/event-handlers/user/handle-user-updated.test.ts +1 -1
  172. package/src/feeds-client/feeds-client.ts +5 -4
  173. package/src/gen/feeds/FeedApi.ts +2 -2
  174. package/src/gen/feeds/FeedsApi.ts +2 -2
  175. package/src/gen/model-decoders/decoders.ts +2 -4
  176. package/src/gen/model-decoders/event-decoder-mapping.ts +1 -1
  177. package/src/gen/models/index.ts +34 -33
  178. package/src/gen/moderation/ModerationApi.ts +2 -2
  179. package/src/test-utils/response-generators.ts +2 -2
  180. package/src/types-internal.ts +1 -1
  181. package/src/types.ts +4 -4
  182. package/src/utils/event-triggered-by-connected-user.ts +2 -2
  183. package/src/utils/state-update-queue.ts +2 -2
  184. package/src/utils/type-assertions.ts +7 -11
  185. package/dist/index-CFv0uza2.js.map +0 -1
  186. package/dist/index-DP0C8psw.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/common/search/SearchController.ts","../../src/common/search/BaseSearchSource.ts","../../src/common/search/ActivitySearchSource.ts","../../src/common/search/FeedSearchSource.ts","../../src/common/search/UserSearchSource.ts"],"sourcesContent":["import { StateStore } from '@stream-io/state-store';\nimport type { SearchSource } from './BaseSearchSource';\n\nexport type SearchControllerState = {\n isActive: boolean;\n searchQuery: string;\n sources: SearchSource[];\n};\n\nexport type InternalSearchControllerState = {};\n\nexport type SearchControllerConfig = {\n // The controller will make sure there is always exactly one active source. Enabled by default.\n keepSingleActiveSource: boolean;\n};\n\nexport type SearchControllerOptions = {\n config?: Partial<SearchControllerConfig>;\n sources?: SearchSource[];\n};\n\nexport class SearchController {\n /**\n * Not intended for direct use by integrators, might be removed without notice resulting in\n * broken integrations.\n */\n _internalState: StateStore<InternalSearchControllerState>;\n state: StateStore<SearchControllerState>;\n config: SearchControllerConfig;\n\n constructor({ config, sources }: SearchControllerOptions = {}) {\n this.state = new StateStore<SearchControllerState>({\n isActive: false,\n searchQuery: '',\n sources: sources ?? [],\n });\n this._internalState = new StateStore<InternalSearchControllerState>({});\n this.config = { keepSingleActiveSource: true, ...config };\n }\n get hasNext() {\n return this.sources.some((source) => source.hasNext);\n }\n\n get sources() {\n return this.state.getLatestValue().sources;\n }\n\n get activeSources() {\n return this.state.getLatestValue().sources.filter((s) => s.isActive);\n }\n\n get isActive() {\n return this.state.getLatestValue().isActive;\n }\n\n get searchQuery() {\n return this.state.getLatestValue().searchQuery;\n }\n\n get searchSourceTypes(): Array<SearchSource['type']> {\n return this.sources.map((s) => s.type);\n }\n\n addSource = (source: SearchSource) => {\n this.state.partialNext({\n sources: [...this.sources, source],\n });\n };\n\n getSource = (sourceType: SearchSource['type']) =>\n this.sources.find((s) => s.type === sourceType);\n\n removeSource = (sourceType: SearchSource['type']) => {\n const newSources = this.sources.filter((s) => s.type !== sourceType);\n if (newSources.length === this.sources.length) return;\n this.state.partialNext({ sources: newSources });\n };\n\n activateSource = (sourceType: SearchSource['type']) => {\n const source = this.getSource(sourceType);\n if (!source || source.isActive) return;\n if (this.config.keepSingleActiveSource) {\n this.sources.forEach((s) => {\n if (s.type !== sourceType) {\n s.deactivate();\n }\n });\n }\n source.activate();\n this.state.partialNext({ sources: [...this.sources] });\n };\n\n deactivateSource = (sourceType: SearchSource['type']) => {\n const source = this.getSource(sourceType);\n if (!source?.isActive) return;\n if (this.activeSources.length === 1) return;\n source.deactivate();\n this.state.partialNext({ sources: [...this.sources] });\n };\n\n activate = () => {\n if (!this.activeSources.length) {\n const sourcesToActivate = this.config.keepSingleActiveSource\n ? this.sources.slice(0, 1)\n : this.sources;\n sourcesToActivate.forEach((s) => s.activate());\n }\n if (this.isActive) return;\n this.state.partialNext({ isActive: true });\n };\n\n search = async (searchQuery?: string) => {\n const searchedSources = this.activeSources;\n this.state.partialNext({\n searchQuery,\n });\n await Promise.all(\n searchedSources.map((source) => source.search(searchQuery)),\n );\n };\n\n cancelSearchQueries = () => {\n this.activeSources.forEach((s) => s.cancelScheduledQuery());\n };\n\n clear = () => {\n this.cancelSearchQueries();\n this.sources.forEach((source) =>\n source.state.next({ ...source.initialState, isActive: source.isActive }),\n );\n this.state.next((current) => ({\n ...current,\n isActive: true,\n queriesInProgress: [],\n searchQuery: '',\n }));\n };\n\n exit = () => {\n this.cancelSearchQueries();\n this.sources.forEach((source) =>\n source.state.next({ ...source.initialState, isActive: source.isActive }),\n );\n this.state.next((current) => ({\n ...current,\n isActive: false,\n queriesInProgress: [],\n searchQuery: '',\n }));\n };\n}\n","import { StateStore } from '@stream-io/state-store';\nimport { debounce, type DebouncedFunc } from '../utils';\nimport type {\n QueryReturnValue,\n SearchSourceOptions,\n SearchSourceState,\n SearchSourceType,\n} from './types';\n\nexport type DebounceOptions = {\n debounceMs: number;\n};\ntype DebouncedExecQueryFunction = DebouncedFunc<\n (searchString?: string) => Promise<void>\n>;\n\ninterface ISearchSource<T = any> {\n activate(): void;\n\n canExecuteQuery(newSearchString?: string): boolean;\n\n deactivate(): void;\n\n readonly hasNext: boolean;\n readonly hasResults: boolean;\n readonly initialState: SearchSourceState<T>;\n readonly isActive: boolean;\n readonly isLoading: boolean;\n readonly items: T[] | undefined;\n readonly lastQueryError: Error | undefined;\n readonly next: string | undefined | null;\n readonly offset: number | undefined;\n\n resetState(): void;\n\n readonly searchQuery: string;\n\n readonly state: StateStore<SearchSourceState<T>>;\n readonly type: SearchSourceType;\n}\n\nexport interface SearchSource<T = any> extends ISearchSource<T> {\n cancelScheduledQuery(): void;\n setDebounceOptions(options: DebounceOptions): void;\n search(text?: string): Promise<void> | undefined;\n}\n\nexport interface SearchSourceSync<T = any> extends ISearchSource<T> {\n cancelScheduledQuery(): void;\n setDebounceOptions(options: DebounceOptions): void;\n search(text?: string): void;\n}\n\nconst DEFAULT_SEARCH_SOURCE_OPTIONS: Required<SearchSourceOptions> = {\n debounceMs: 300,\n pageSize: 10,\n allowEmptySearchString: false,\n resetOnNewSearchQuery: true,\n} as const;\n\nabstract class BaseSearchSourceBase<T> implements ISearchSource<T> {\n state: StateStore<SearchSourceState<T>>;\n pageSize: number;\n protected allowEmptySearchString: boolean;\n protected resetOnNewSearchQuery: boolean;\n abstract readonly type: SearchSourceType;\n\n protected constructor(options?: SearchSourceOptions) {\n const { pageSize, allowEmptySearchString, resetOnNewSearchQuery } = {\n ...DEFAULT_SEARCH_SOURCE_OPTIONS,\n ...options,\n };\n this.pageSize = pageSize;\n this.allowEmptySearchString = allowEmptySearchString;\n this.resetOnNewSearchQuery = resetOnNewSearchQuery;\n this.state = new StateStore<SearchSourceState<T>>(this.initialState);\n }\n\n get lastQueryError() {\n return this.state.getLatestValue().lastQueryError;\n }\n\n get hasNext() {\n return this.state.getLatestValue().hasNext;\n }\n\n get hasResults() {\n return Array.isArray(this.state.getLatestValue().items);\n }\n\n get isActive() {\n return this.state.getLatestValue().isActive;\n }\n\n get isLoading() {\n return this.state.getLatestValue().isLoading;\n }\n\n get initialState() {\n return {\n hasNext: true,\n isActive: false,\n isLoading: false,\n items: undefined,\n lastQueryError: undefined,\n next: undefined,\n offset: 0,\n searchQuery: '',\n };\n }\n\n get items() {\n return this.state.getLatestValue().items;\n }\n\n get next() {\n return this.state.getLatestValue().next;\n }\n\n get offset() {\n return this.state.getLatestValue().offset;\n }\n\n get searchQuery() {\n return this.state.getLatestValue().searchQuery;\n }\n\n activate = () => {\n if (this.isActive) return;\n this.state.partialNext({ isActive: true });\n };\n\n deactivate = () => {\n if (!this.isActive) return;\n this.state.partialNext({ isActive: false });\n };\n\n canExecuteQuery = (newSearchString?: string) => {\n const hasNewSearchQuery = typeof newSearchString !== 'undefined';\n const searchString = newSearchString ?? this.searchQuery;\n return !!(\n this.isActive &&\n !this.isLoading &&\n (this.hasNext || hasNewSearchQuery) &&\n (this.allowEmptySearchString || searchString)\n );\n };\n\n protected getStateBeforeFirstQuery(\n newSearchString: string,\n ): SearchSourceState<T> {\n const initialState = this.initialState;\n const oldItems = this.items;\n\n const items = this.resetOnNewSearchQuery ? initialState.items : oldItems;\n return {\n ...this.initialState,\n items,\n isActive: this.isActive,\n isLoading: this.resetOnNewSearchQuery ? true : !oldItems,\n searchQuery: newSearchString,\n };\n }\n\n protected getStateAfterQuery(\n stateUpdate: Partial<SearchSourceState<T>>,\n isFirstPage: boolean,\n ): SearchSourceState<T> {\n const current = this.state.getLatestValue();\n return {\n ...current,\n lastQueryError: undefined, // reset lastQueryError that can be overridden by the stateUpdate\n ...stateUpdate,\n isLoading: false,\n items: isFirstPage\n ? stateUpdate.items\n : [...(this.items ?? []), ...(stateUpdate.items || [])],\n };\n }\n\n protected prepareStateForQuery(newSearchString?: string) {\n const hasNewSearchQuery = typeof newSearchString !== 'undefined';\n const searchString = newSearchString ?? this.searchQuery;\n\n if (hasNewSearchQuery) {\n this.state.next(this.getStateBeforeFirstQuery(newSearchString ?? ''));\n } else {\n this.state.partialNext({ isLoading: true });\n }\n\n return { searchString, hasNewSearchQuery };\n }\n\n protected updatePaginationStateFromQuery(result: QueryReturnValue<T>) {\n const { items, next } = result;\n\n const stateUpdate: Partial<SearchSourceState<T>> = {};\n if (Object.prototype.hasOwnProperty.call(result, 'next')) {\n stateUpdate.next = next;\n stateUpdate.hasNext = !!next;\n } else {\n stateUpdate.offset = (this.offset ?? 0) + items.length;\n stateUpdate.hasNext = items.length === this.pageSize;\n }\n\n return stateUpdate;\n }\n\n resetState() {\n this.state.next(this.initialState);\n }\n\n resetStateAndActivate() {\n this.resetState();\n this.activate();\n }\n}\n\nexport abstract class BaseSearchSource<T>\n extends BaseSearchSourceBase<T>\n implements SearchSource<T>\n{\n protected searchDebounced!: DebouncedExecQueryFunction;\n\n constructor(options?: SearchSourceOptions) {\n const { debounceMs } = { ...DEFAULT_SEARCH_SOURCE_OPTIONS, ...options };\n super(options);\n this.setDebounceOptions({ debounceMs });\n }\n\n protected abstract query(searchQuery: string): Promise<QueryReturnValue<T>>;\n\n protected abstract filterQueryResults(items: T[]): T[] | Promise<T[]>;\n\n setDebounceOptions = ({ debounceMs }: DebounceOptions) => {\n this.searchDebounced = debounce(this.executeQuery.bind(this), debounceMs);\n };\n\n async executeQuery(newSearchString?: string) {\n if (!this.canExecuteQuery(newSearchString)) return;\n\n const { hasNewSearchQuery, searchString } =\n this.prepareStateForQuery(newSearchString);\n\n let stateUpdate: Partial<SearchSourceState<T>> = {};\n try {\n const results = await this.query(searchString);\n if (!results) return;\n\n const { items } = results;\n stateUpdate = this.updatePaginationStateFromQuery(results);\n stateUpdate.items = await this.filterQueryResults(items);\n } catch (e) {\n stateUpdate.lastQueryError = e as Error;\n } finally {\n this.state.next(this.getStateAfterQuery(stateUpdate, hasNewSearchQuery));\n }\n }\n\n search = (searchQuery?: string) => this.searchDebounced(searchQuery);\n\n cancelScheduledQuery() {\n this.searchDebounced.cancel();\n }\n}\n\nexport abstract class BaseSearchSourceSync<T>\n extends BaseSearchSourceBase<T>\n implements SearchSourceSync<T>\n{\n protected searchDebounced!: DebouncedExecQueryFunction;\n\n constructor(options?: SearchSourceOptions) {\n const { debounceMs } = { ...DEFAULT_SEARCH_SOURCE_OPTIONS, ...options };\n super(options);\n this.setDebounceOptions({ debounceMs });\n }\n\n protected abstract query(searchQuery: string): QueryReturnValue<T>;\n\n protected abstract filterQueryResults(items: T[]): T[];\n\n setDebounceOptions = ({ debounceMs }: DebounceOptions) => {\n this.searchDebounced = debounce(this.executeQuery.bind(this), debounceMs);\n };\n\n executeQuery(newSearchString?: string) {\n if (!this.canExecuteQuery(newSearchString)) return;\n\n const { hasNewSearchQuery, searchString } =\n this.prepareStateForQuery(newSearchString);\n\n let stateUpdate: Partial<SearchSourceState<T>> = {};\n try {\n const results = this.query(searchString);\n if (!results) return;\n\n const { items } = results;\n stateUpdate = this.updatePaginationStateFromQuery(results);\n stateUpdate.items = this.filterQueryResults(items);\n } catch (e) {\n stateUpdate.lastQueryError = e as Error;\n } finally {\n this.state.next(this.getStateAfterQuery(stateUpdate, hasNewSearchQuery));\n }\n }\n\n search = (searchQuery?: string) => this.searchDebounced(searchQuery);\n\n cancelScheduledQuery() {\n this.searchDebounced.cancel();\n }\n}\n","import { BaseSearchSource } from './BaseSearchSource';\nimport type { SearchSourceOptions } from './types';\n\nimport { FeedsClient } from '../../feeds-client';\nimport { ActivityResponse } from '../../gen/models';\n\nexport class ActivitySearchSource extends BaseSearchSource<ActivityResponse> {\n readonly type = 'activity' as const;\n private readonly client: FeedsClient;\n\n constructor(client: FeedsClient, options?: SearchSourceOptions) {\n super(options);\n this.client = client;\n }\n\n protected async query(searchQuery: string) {\n const { connected_user: connectedUser } =\n this.client.state.getLatestValue();\n if (!connectedUser) return { items: [] };\n\n const { activities: items, next } = await this.client.queryActivities({\n sort: [{ direction: -1, field: 'created_at' }],\n ...(!this.allowEmptySearchString || searchQuery.length > 0\n ? { filter: { text: { $autocomplete: searchQuery } } }\n : {}),\n limit: 10,\n next: this.next ?? undefined,\n });\n\n return { items, next };\n }\n\n protected filterQueryResults(items: ActivityResponse[]) {\n return items;\n }\n}\n","import { BaseSearchSource } from './BaseSearchSource';\nimport type { SearchSourceOptions } from './types';\n\nimport { FeedsClient } from '../../feeds-client';\nimport { Feed } from '../../feed';\n\nexport type FeedSearchSourceOptions = SearchSourceOptions & {\n groupId?: string;\n};\n\nexport class FeedSearchSource extends BaseSearchSource<Feed> {\n readonly type: string;\n readonly feedGroupId?: string | undefined;\n private readonly client: FeedsClient;\n\n constructor(client: FeedsClient, options?: FeedSearchSourceOptions) {\n super(options);\n this.client = client;\n this.feedGroupId = options?.groupId;\n this.type = `${this.feedGroupId}-feed`;\n }\n\n protected async query(searchQuery: string) {\n const { connected_user: connectedUser } =\n this.client.state.getLatestValue();\n if (!connectedUser) return { items: [] };\n\n const { feeds: items, next } = await this.client.queryFeeds({\n filter: {\n ...(this.feedGroupId ? { group_id: this.feedGroupId } : {}),\n ...(!this.allowEmptySearchString || searchQuery.length > 0\n ? {\n $or: [\n { name: { $autocomplete: searchQuery } },\n { description: { $autocomplete: searchQuery } },\n { 'created_by.name': { $autocomplete: searchQuery } },\n ],\n }\n : {}),\n },\n next: this.next ?? undefined,\n });\n\n return { items, next };\n }\n\n protected filterQueryResults(items: Feed[]) {\n return items;\n }\n}\n","import { BaseSearchSource } from './BaseSearchSource';\nimport type { SearchSourceOptions } from './types';\n\nimport { FeedsClient } from '../../feeds-client';\nimport { UserResponse } from '../../gen/models';\n\nexport class UserSearchSource extends BaseSearchSource<UserResponse> {\n readonly type = 'user' as const;\n private readonly client: FeedsClient;\n\n constructor(client: FeedsClient, options?: SearchSourceOptions) {\n super(options);\n this.client = client;\n }\n\n protected async query(searchQuery: string) {\n const { connected_user: connectedUser } =\n this.client.state.getLatestValue();\n if (!connectedUser) return { items: [] };\n\n const { users: items } = await this.client.queryUsers({\n payload: {\n filter_conditions: {\n ...(!this.allowEmptySearchString || searchQuery.length > 0\n ? {\n name: {\n $autocomplete: searchQuery,\n },\n }\n : {}),\n },\n },\n });\n\n return { items, next: undefined };\n }\n\n protected filterQueryResults(items: UserResponse[]) {\n return items;\n }\n}\n"],"names":["s","debounceMs","e"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../src/common/search/SearchController.ts","../../src/common/search/BaseSearchSource.ts","../../src/common/search/ActivitySearchSource.ts","../../src/common/search/FeedSearchSource.ts","../../src/common/search/UserSearchSource.ts"],"sourcesContent":["import { StateStore } from '@stream-io/state-store';\nimport type { SearchSource } from './BaseSearchSource';\n\nexport type SearchControllerState = {\n isActive: boolean;\n searchQuery: string;\n sources: SearchSource[];\n};\n\nexport type InternalSearchControllerState = {};\n\nexport type SearchControllerConfig = {\n // The controller will make sure there is always exactly one active source. Enabled by default.\n keepSingleActiveSource: boolean;\n};\n\nexport type SearchControllerOptions = {\n config?: Partial<SearchControllerConfig>;\n sources?: SearchSource[];\n};\n\nexport class SearchController {\n /**\n * Not intended for direct use by integrators, might be removed without notice resulting in\n * broken integrations.\n */\n _internalState: StateStore<InternalSearchControllerState>;\n state: StateStore<SearchControllerState>;\n config: SearchControllerConfig;\n\n constructor({ config, sources }: SearchControllerOptions = {}) {\n this.state = new StateStore<SearchControllerState>({\n isActive: false,\n searchQuery: '',\n sources: sources ?? [],\n });\n this._internalState = new StateStore<InternalSearchControllerState>({});\n this.config = { keepSingleActiveSource: true, ...config };\n }\n get hasNext() {\n return this.sources.some((source) => source.hasNext);\n }\n\n get sources() {\n return this.state.getLatestValue().sources;\n }\n\n get activeSources() {\n return this.state.getLatestValue().sources.filter((s) => s.isActive);\n }\n\n get isActive() {\n return this.state.getLatestValue().isActive;\n }\n\n get searchQuery() {\n return this.state.getLatestValue().searchQuery;\n }\n\n get searchSourceTypes(): Array<SearchSource['type']> {\n return this.sources.map((s) => s.type);\n }\n\n addSource = (source: SearchSource) => {\n this.state.partialNext({\n sources: [...this.sources, source],\n });\n };\n\n getSource = (sourceType: SearchSource['type']) =>\n this.sources.find((s) => s.type === sourceType);\n\n removeSource = (sourceType: SearchSource['type']) => {\n const newSources = this.sources.filter((s) => s.type !== sourceType);\n if (newSources.length === this.sources.length) return;\n this.state.partialNext({ sources: newSources });\n };\n\n activateSource = (sourceType: SearchSource['type']) => {\n const source = this.getSource(sourceType);\n if (!source || source.isActive) return;\n if (this.config.keepSingleActiveSource) {\n this.sources.forEach((s) => {\n if (s.type !== sourceType) {\n s.deactivate();\n }\n });\n }\n source.activate();\n this.state.partialNext({ sources: [...this.sources] });\n };\n\n deactivateSource = (sourceType: SearchSource['type']) => {\n const source = this.getSource(sourceType);\n if (!source?.isActive) return;\n if (this.activeSources.length === 1) return;\n source.deactivate();\n this.state.partialNext({ sources: [...this.sources] });\n };\n\n activate = () => {\n if (!this.activeSources.length) {\n const sourcesToActivate = this.config.keepSingleActiveSource\n ? this.sources.slice(0, 1)\n : this.sources;\n sourcesToActivate.forEach((s) => s.activate());\n }\n if (this.isActive) return;\n this.state.partialNext({ isActive: true });\n };\n\n search = async (searchQuery?: string) => {\n const searchedSources = this.activeSources;\n this.state.partialNext({\n searchQuery,\n });\n await Promise.all(\n searchedSources.map((source) => source.search(searchQuery)),\n );\n };\n\n cancelSearchQueries = () => {\n this.activeSources.forEach((s) => s.cancelScheduledQuery());\n };\n\n clear = () => {\n this.cancelSearchQueries();\n this.sources.forEach((source) =>\n source.state.next({ ...source.initialState, isActive: source.isActive }),\n );\n this.state.next((current) => ({\n ...current,\n isActive: true,\n queriesInProgress: [],\n searchQuery: '',\n }));\n };\n\n exit = () => {\n this.cancelSearchQueries();\n this.sources.forEach((source) =>\n source.state.next({ ...source.initialState, isActive: source.isActive }),\n );\n this.state.next((current) => ({\n ...current,\n isActive: false,\n queriesInProgress: [],\n searchQuery: '',\n }));\n };\n}\n","import { StateStore } from '@stream-io/state-store';\nimport { debounce, type DebouncedFunc } from '../utils';\nimport type {\n QueryReturnValue,\n SearchSourceOptions,\n SearchSourceState,\n SearchSourceType,\n} from './types';\n\nexport type DebounceOptions = {\n debounceMs: number;\n};\ntype DebouncedExecQueryFunction = DebouncedFunc<\n (searchString?: string) => Promise<void>\n>;\n\ninterface ISearchSource<T = any> {\n activate(): void;\n\n canExecuteQuery(newSearchString?: string): boolean;\n\n deactivate(): void;\n\n readonly hasNext: boolean;\n readonly hasResults: boolean;\n readonly initialState: SearchSourceState<T>;\n readonly isActive: boolean;\n readonly isLoading: boolean;\n readonly items: T[] | undefined;\n readonly lastQueryError: Error | undefined;\n readonly next: string | undefined | null;\n readonly offset: number | undefined;\n\n resetState(): void;\n\n readonly searchQuery: string;\n\n readonly state: StateStore<SearchSourceState<T>>;\n readonly type: SearchSourceType;\n}\n\nexport interface SearchSource<T = any> extends ISearchSource<T> {\n cancelScheduledQuery(): void;\n setDebounceOptions(options: DebounceOptions): void;\n search(text?: string): Promise<void> | undefined;\n}\n\nexport interface SearchSourceSync<T = any> extends ISearchSource<T> {\n cancelScheduledQuery(): void;\n setDebounceOptions(options: DebounceOptions): void;\n search(text?: string): void;\n}\n\nconst DEFAULT_SEARCH_SOURCE_OPTIONS: Required<SearchSourceOptions> = {\n debounceMs: 300,\n pageSize: 10,\n allowEmptySearchString: false,\n resetOnNewSearchQuery: true,\n} as const;\n\nabstract class BaseSearchSourceBase<T> implements ISearchSource<T> {\n state: StateStore<SearchSourceState<T>>;\n pageSize: number;\n protected allowEmptySearchString: boolean;\n protected resetOnNewSearchQuery: boolean;\n abstract readonly type: SearchSourceType;\n\n protected constructor(options?: SearchSourceOptions) {\n const { pageSize, allowEmptySearchString, resetOnNewSearchQuery } = {\n ...DEFAULT_SEARCH_SOURCE_OPTIONS,\n ...options,\n };\n this.pageSize = pageSize;\n this.allowEmptySearchString = allowEmptySearchString;\n this.resetOnNewSearchQuery = resetOnNewSearchQuery;\n this.state = new StateStore<SearchSourceState<T>>(this.initialState);\n }\n\n get lastQueryError() {\n return this.state.getLatestValue().lastQueryError;\n }\n\n get hasNext() {\n return this.state.getLatestValue().hasNext;\n }\n\n get hasResults() {\n return Array.isArray(this.state.getLatestValue().items);\n }\n\n get isActive() {\n return this.state.getLatestValue().isActive;\n }\n\n get isLoading() {\n return this.state.getLatestValue().isLoading;\n }\n\n get initialState() {\n return {\n hasNext: true,\n isActive: false,\n isLoading: false,\n items: undefined,\n lastQueryError: undefined,\n next: undefined,\n offset: 0,\n searchQuery: '',\n };\n }\n\n get items() {\n return this.state.getLatestValue().items;\n }\n\n get next() {\n return this.state.getLatestValue().next;\n }\n\n get offset() {\n return this.state.getLatestValue().offset;\n }\n\n get searchQuery() {\n return this.state.getLatestValue().searchQuery;\n }\n\n activate = () => {\n if (this.isActive) return;\n this.state.partialNext({ isActive: true });\n };\n\n deactivate = () => {\n if (!this.isActive) return;\n this.state.partialNext({ isActive: false });\n };\n\n canExecuteQuery = (newSearchString?: string) => {\n const hasNewSearchQuery = typeof newSearchString !== 'undefined';\n const searchString = newSearchString ?? this.searchQuery;\n return !!(\n this.isActive &&\n !this.isLoading &&\n (this.hasNext || hasNewSearchQuery) &&\n (this.allowEmptySearchString || searchString)\n );\n };\n\n protected getStateBeforeFirstQuery(\n newSearchString: string,\n ): SearchSourceState<T> {\n const initialState = this.initialState;\n const oldItems = this.items;\n\n const items = this.resetOnNewSearchQuery ? initialState.items : oldItems;\n return {\n ...this.initialState,\n items,\n isActive: this.isActive,\n isLoading: this.resetOnNewSearchQuery ? true : !oldItems,\n searchQuery: newSearchString,\n };\n }\n\n protected getStateAfterQuery(\n stateUpdate: Partial<SearchSourceState<T>>,\n isFirstPage: boolean,\n ): SearchSourceState<T> {\n const current = this.state.getLatestValue();\n return {\n ...current,\n lastQueryError: undefined, // reset lastQueryError that can be overridden by the stateUpdate\n ...stateUpdate,\n isLoading: false,\n items: isFirstPage\n ? stateUpdate.items\n : [...(this.items ?? []), ...(stateUpdate.items || [])],\n };\n }\n\n protected prepareStateForQuery(newSearchString?: string) {\n const hasNewSearchQuery = typeof newSearchString !== 'undefined';\n const searchString = newSearchString ?? this.searchQuery;\n\n if (hasNewSearchQuery) {\n this.state.next(this.getStateBeforeFirstQuery(newSearchString ?? ''));\n } else {\n this.state.partialNext({ isLoading: true });\n }\n\n return { searchString, hasNewSearchQuery };\n }\n\n protected updatePaginationStateFromQuery(result: QueryReturnValue<T>) {\n const { items, next } = result;\n\n const stateUpdate: Partial<SearchSourceState<T>> = {};\n if (Object.prototype.hasOwnProperty.call(result, 'next')) {\n stateUpdate.next = next;\n stateUpdate.hasNext = !!next;\n } else {\n stateUpdate.offset = (this.offset ?? 0) + items.length;\n stateUpdate.hasNext = items.length === this.pageSize;\n }\n\n return stateUpdate;\n }\n\n resetState() {\n this.state.next(this.initialState);\n }\n\n resetStateAndActivate() {\n this.resetState();\n this.activate();\n }\n}\n\nexport abstract class BaseSearchSource<T>\n extends BaseSearchSourceBase<T>\n implements SearchSource<T>\n{\n protected searchDebounced!: DebouncedExecQueryFunction;\n\n constructor(options?: SearchSourceOptions) {\n const { debounceMs } = { ...DEFAULT_SEARCH_SOURCE_OPTIONS, ...options };\n super(options);\n this.setDebounceOptions({ debounceMs });\n }\n\n protected abstract query(searchQuery: string): Promise<QueryReturnValue<T>>;\n\n protected abstract filterQueryResults(items: T[]): T[] | Promise<T[]>;\n\n setDebounceOptions = ({ debounceMs }: DebounceOptions) => {\n this.searchDebounced = debounce(this.executeQuery.bind(this), debounceMs);\n };\n\n async executeQuery(newSearchString?: string) {\n if (!this.canExecuteQuery(newSearchString)) return;\n\n const { hasNewSearchQuery, searchString } =\n this.prepareStateForQuery(newSearchString);\n\n let stateUpdate: Partial<SearchSourceState<T>> = {};\n try {\n const results = await this.query(searchString);\n if (!results) return;\n\n const { items } = results;\n stateUpdate = this.updatePaginationStateFromQuery(results);\n stateUpdate.items = await this.filterQueryResults(items);\n } catch (e) {\n stateUpdate.lastQueryError = e as Error;\n } finally {\n this.state.next(this.getStateAfterQuery(stateUpdate, hasNewSearchQuery));\n }\n }\n\n search = (searchQuery?: string) => this.searchDebounced(searchQuery);\n\n cancelScheduledQuery() {\n this.searchDebounced.cancel();\n }\n}\n\nexport abstract class BaseSearchSourceSync<T>\n extends BaseSearchSourceBase<T>\n implements SearchSourceSync<T>\n{\n protected searchDebounced!: DebouncedExecQueryFunction;\n\n constructor(options?: SearchSourceOptions) {\n const { debounceMs } = { ...DEFAULT_SEARCH_SOURCE_OPTIONS, ...options };\n super(options);\n this.setDebounceOptions({ debounceMs });\n }\n\n protected abstract query(searchQuery: string): QueryReturnValue<T>;\n\n protected abstract filterQueryResults(items: T[]): T[];\n\n setDebounceOptions = ({ debounceMs }: DebounceOptions) => {\n this.searchDebounced = debounce(this.executeQuery.bind(this), debounceMs);\n };\n\n executeQuery(newSearchString?: string) {\n if (!this.canExecuteQuery(newSearchString)) return;\n\n const { hasNewSearchQuery, searchString } =\n this.prepareStateForQuery(newSearchString);\n\n let stateUpdate: Partial<SearchSourceState<T>> = {};\n try {\n const results = this.query(searchString);\n if (!results) return;\n\n const { items } = results;\n stateUpdate = this.updatePaginationStateFromQuery(results);\n stateUpdate.items = this.filterQueryResults(items);\n } catch (e) {\n stateUpdate.lastQueryError = e as Error;\n } finally {\n this.state.next(this.getStateAfterQuery(stateUpdate, hasNewSearchQuery));\n }\n }\n\n search = (searchQuery?: string) => this.searchDebounced(searchQuery);\n\n cancelScheduledQuery() {\n this.searchDebounced.cancel();\n }\n}\n","import { BaseSearchSource } from './BaseSearchSource';\nimport type { SearchSourceOptions } from './types';\n\nimport type { FeedsClient } from '../../feeds-client';\nimport type { ActivityResponse } from '../../gen/models';\n\nexport class ActivitySearchSource extends BaseSearchSource<ActivityResponse> {\n readonly type = 'activity' as const;\n private readonly client: FeedsClient;\n\n constructor(client: FeedsClient, options?: SearchSourceOptions) {\n super(options);\n this.client = client;\n }\n\n protected async query(searchQuery: string) {\n const { connected_user: connectedUser } =\n this.client.state.getLatestValue();\n if (!connectedUser) return { items: [] };\n\n const { activities: items, next } = await this.client.queryActivities({\n sort: [{ direction: -1, field: 'created_at' }],\n ...(!this.allowEmptySearchString || searchQuery.length > 0\n ? { filter: { text: { $autocomplete: searchQuery } } }\n : {}),\n limit: 10,\n next: this.next ?? undefined,\n });\n\n return { items, next };\n }\n\n protected filterQueryResults(items: ActivityResponse[]) {\n return items;\n }\n}\n","import { BaseSearchSource } from './BaseSearchSource';\nimport type { SearchSourceOptions } from './types';\n\nimport type { FeedsClient } from '../../feeds-client';\nimport type { Feed } from '../../feed';\n\nexport type FeedSearchSourceOptions = SearchSourceOptions & {\n groupId?: string;\n};\n\nexport class FeedSearchSource extends BaseSearchSource<Feed> {\n readonly type: string;\n readonly feedGroupId?: string | undefined;\n private readonly client: FeedsClient;\n\n constructor(client: FeedsClient, options?: FeedSearchSourceOptions) {\n super(options);\n this.client = client;\n this.feedGroupId = options?.groupId;\n this.type = `${this.feedGroupId}-feed`;\n }\n\n protected async query(searchQuery: string) {\n const { connected_user: connectedUser } =\n this.client.state.getLatestValue();\n if (!connectedUser) return { items: [] };\n\n const { feeds: items, next } = await this.client.queryFeeds({\n filter: {\n ...(this.feedGroupId ? { group_id: this.feedGroupId } : {}),\n ...(!this.allowEmptySearchString || searchQuery.length > 0\n ? {\n $or: [\n { name: { $autocomplete: searchQuery } },\n { description: { $autocomplete: searchQuery } },\n { 'created_by.name': { $autocomplete: searchQuery } },\n ],\n }\n : {}),\n },\n next: this.next ?? undefined,\n });\n\n return { items, next };\n }\n\n protected filterQueryResults(items: Feed[]) {\n return items;\n }\n}\n","import { BaseSearchSource } from './BaseSearchSource';\nimport type { SearchSourceOptions } from './types';\n\nimport type { FeedsClient } from '../../feeds-client';\nimport type { UserResponse } from '../../gen/models';\n\nexport class UserSearchSource extends BaseSearchSource<UserResponse> {\n readonly type = 'user' as const;\n private readonly client: FeedsClient;\n\n constructor(client: FeedsClient, options?: SearchSourceOptions) {\n super(options);\n this.client = client;\n }\n\n protected async query(searchQuery: string) {\n const { connected_user: connectedUser } =\n this.client.state.getLatestValue();\n if (!connectedUser) return { items: [] };\n\n const { users: items } = await this.client.queryUsers({\n payload: {\n filter_conditions: {\n ...(!this.allowEmptySearchString || searchQuery.length > 0\n ? {\n name: {\n $autocomplete: searchQuery,\n },\n }\n : {}),\n },\n },\n });\n\n return { items, next: undefined };\n }\n\n protected filterQueryResults(items: UserResponse[]) {\n return items;\n }\n}\n"],"names":["s","debounceMs","e"],"mappings":"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"}
@@ -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, j as isCommentResponse, e as checkHasAnotherPage, b as FeedOwnCapability } from "../index-DP0C8psw.mjs";
3
+ import { F as FeedsClient, j as isCommentResponse, e as checkHasAnotherPage, b as FeedOwnCapability } from "../index-gvcJhGPH.mjs";
4
4
  import "@stream-io/logger";
5
5
  import "axios";
6
6
  var shim = { exports: {} };
@@ -523,38 +523,40 @@ const useOwnCapabilities = (feedFromProps) => {
523
523
  const feed = feedFromProps ?? feedFromContext;
524
524
  const { oc = stableEmptyArray } = useStateStore(feed?.state, selector$9) ?? {};
525
525
  return useMemo(
526
- () => ({
527
- can_add_activity: oc.indexOf(FeedOwnCapability.ADD_ACTIVITY) > -1,
528
- can_add_activity_reaction: oc.indexOf(FeedOwnCapability.ADD_ACTIVITY_REACTION) > -1,
529
- can_add_comment: oc.indexOf(FeedOwnCapability.ADD_COMMENT) > -1,
530
- can_add_comment_reaction: oc.indexOf(FeedOwnCapability.ADD_COMMENT_REACTION) > -1,
531
- can_bookmark_activity: oc.indexOf(FeedOwnCapability.BOOKMARK_ACTIVITY) > -1,
532
- can_create_feed: oc.indexOf(FeedOwnCapability.CREATE_FEED) > -1,
533
- can_delete_bookmark: oc.indexOf(FeedOwnCapability.DELETE_BOOKMARK) > -1,
534
- can_delete_comment: oc.indexOf(FeedOwnCapability.DELETE_COMMENT) > -1,
535
- can_delete_feed: oc.indexOf(FeedOwnCapability.DELETE_FEED) > -1,
536
- can_edit_bookmark: oc.indexOf(FeedOwnCapability.EDIT_BOOKMARK) > -1,
537
- can_follow: oc.indexOf(FeedOwnCapability.FOLLOW) > -1,
538
- can_remove_activity: oc.indexOf(FeedOwnCapability.REMOVE_ACTIVITY) > -1,
539
- can_remove_activity_reaction: oc.indexOf(FeedOwnCapability.REMOVE_ACTIVITY_REACTION) > -1,
540
- can_remove_comment_reaction: oc.indexOf(FeedOwnCapability.REMOVE_COMMENT_REACTION) > -1,
541
- can_unfollow: oc.indexOf(FeedOwnCapability.UNFOLLOW) > -1,
542
- can_update_feed: oc.indexOf(FeedOwnCapability.UPDATE_FEED) > -1,
543
- can_invite_feed: oc.indexOf(FeedOwnCapability.INVITE_FEED) > -1,
544
- can_join_feed: oc.indexOf(FeedOwnCapability.JOIN_FEED) > -1,
545
- can_leave_feed: oc.indexOf(FeedOwnCapability.LEAVE_FEED) > -1,
546
- can_manage_feed_group: oc.indexOf(FeedOwnCapability.MANAGE_FEED_GROUP) > -1,
547
- can_mark_activity: oc.indexOf(FeedOwnCapability.MARK_ACTIVITY) > -1,
548
- can_pin_activity: oc.indexOf(FeedOwnCapability.PIN_ACTIVITY) > -1,
549
- can_query_feed_members: oc.indexOf(FeedOwnCapability.QUERY_FEED_MEMBERS) > -1,
550
- can_query_follows: oc.indexOf(FeedOwnCapability.QUERY_FOLLOWS) > -1,
551
- can_read_activities: oc.indexOf(FeedOwnCapability.READ_ACTIVITIES) > -1,
552
- can_read_feed: oc.indexOf(FeedOwnCapability.READ_FEED) > -1,
553
- can_update_activity: oc.indexOf(FeedOwnCapability.UPDATE_ACTIVITY) > -1,
554
- can_update_comment: oc.indexOf(FeedOwnCapability.UPDATE_COMMENT) > -1,
555
- can_update_feed_followers: oc.indexOf(FeedOwnCapability.UPDATE_FEED_FOLLOWERS) > -1,
556
- can_update_feed_members: oc.indexOf(FeedOwnCapability.UPDATE_FEED_MEMBERS) > -1
557
- }),
526
+ () => {
527
+ const capabilitiesSet = new Set(oc);
528
+ return {
529
+ can_add_activity: capabilitiesSet.has(FeedOwnCapability.ADD_ACTIVITY),
530
+ can_add_activity_bookmark: capabilitiesSet.has(FeedOwnCapability.ADD_ACTIVITY_BOOKMARK),
531
+ can_add_activity_reaction: capabilitiesSet.has(FeedOwnCapability.ADD_ACTIVITY_REACTION),
532
+ can_add_comment: capabilitiesSet.has(FeedOwnCapability.ADD_COMMENT),
533
+ can_add_comment_reaction: capabilitiesSet.has(FeedOwnCapability.ADD_COMMENT_REACTION),
534
+ can_create_feed: capabilitiesSet.has(FeedOwnCapability.CREATE_FEED),
535
+ can_delete_any_activity: capabilitiesSet.has(FeedOwnCapability.DELETE_ANY_ACTIVITY),
536
+ can_delete_any_comment: capabilitiesSet.has(FeedOwnCapability.DELETE_ANY_COMMENT),
537
+ can_delete_feed: capabilitiesSet.has(FeedOwnCapability.DELETE_FEED),
538
+ can_delete_own_activity: capabilitiesSet.has(FeedOwnCapability.DELETE_OWN_ACTIVITY),
539
+ can_delete_own_activity_bookmark: capabilitiesSet.has(FeedOwnCapability.DELETE_OWN_ACTIVITY_BOOKMARK),
540
+ can_delete_own_activity_reaction: capabilitiesSet.has(FeedOwnCapability.DELETE_OWN_ACTIVITY_REACTION),
541
+ can_delete_own_comment: capabilitiesSet.has(FeedOwnCapability.DELETE_OWN_COMMENT),
542
+ can_delete_own_comment_reaction: capabilitiesSet.has(FeedOwnCapability.DELETE_OWN_COMMENT_REACTION),
543
+ can_follow: capabilitiesSet.has(FeedOwnCapability.FOLLOW),
544
+ can_pin_activity: capabilitiesSet.has(FeedOwnCapability.PIN_ACTIVITY),
545
+ can_query_feed_members: capabilitiesSet.has(FeedOwnCapability.QUERY_FEED_MEMBERS),
546
+ can_query_follows: capabilitiesSet.has(FeedOwnCapability.QUERY_FOLLOWS),
547
+ can_read_activities: capabilitiesSet.has(FeedOwnCapability.READ_ACTIVITIES),
548
+ can_read_feed: capabilitiesSet.has(FeedOwnCapability.READ_FEED),
549
+ can_unfollow: capabilitiesSet.has(FeedOwnCapability.UNFOLLOW),
550
+ can_update_any_activity: capabilitiesSet.has(FeedOwnCapability.UPDATE_ANY_ACTIVITY),
551
+ can_update_any_comment: capabilitiesSet.has(FeedOwnCapability.UPDATE_ANY_COMMENT),
552
+ can_update_feed: capabilitiesSet.has(FeedOwnCapability.UPDATE_FEED),
553
+ can_update_feed_followers: capabilitiesSet.has(FeedOwnCapability.UPDATE_FEED_FOLLOWERS),
554
+ can_update_feed_members: capabilitiesSet.has(FeedOwnCapability.UPDATE_FEED_MEMBERS),
555
+ can_update_own_activity: capabilitiesSet.has(FeedOwnCapability.UPDATE_OWN_ACTIVITY),
556
+ can_update_own_activity_bookmark: capabilitiesSet.has(FeedOwnCapability.UPDATE_OWN_ACTIVITY_BOOKMARK),
557
+ can_update_own_comment: capabilitiesSet.has(FeedOwnCapability.UPDATE_OWN_COMMENT)
558
+ };
559
+ },
558
560
  [oc]
559
561
  );
560
562
  };
@@ -661,13 +663,29 @@ function useNotificationStatus(feedFromProps) {
661
663
  const feed = feedFromProps ?? feedFromContext;
662
664
  return useStateStore(feed?.state, selector$4);
663
665
  }
664
- const selector$3 = ({ aggregated_activities }) => ({
666
+ const selector$3 = ({
667
+ is_loading_activities,
668
+ next,
669
+ aggregated_activities = []
670
+ }) => ({
671
+ is_loading: is_loading_activities,
672
+ has_next_page: typeof next !== "undefined",
665
673
  aggregated_activities
666
674
  });
667
675
  function useAggregatedActivities(feedFromProps) {
668
676
  const feedFromContext = useFeedContext();
669
677
  const feed = feedFromProps ?? feedFromContext;
670
- return useStateStore(feed?.state, selector$3);
678
+ const data = useStateStore(feed?.state, selector$3);
679
+ const loadNextPage = useStableCallback(async () => {
680
+ if (!feed || !data?.has_next_page || data?.is_loading) {
681
+ return;
682
+ }
683
+ await feed.getNextPage();
684
+ });
685
+ return useMemo(
686
+ () => data ? { ...data, loadNextPage } : void 0,
687
+ [data, loadNextPage]
688
+ );
671
689
  }
672
690
  const useIsAggregatedActivityRead = ({
673
691
  feed: feedFromProps,
@@ -675,19 +693,11 @@ const useIsAggregatedActivityRead = ({
675
693
  }) => {
676
694
  const feedFromContext = useFeedContext();
677
695
  const feed = feedFromProps ?? feedFromContext;
678
- const {
679
- read_activities: readActivities
680
- /* last_read_at: lastReadAt */
681
- } = useNotificationStatus(feed) ?? {};
696
+ const { read_activities: readActivities, last_read_at: lastReadAt } = useNotificationStatus(feed) ?? {};
682
697
  const group = aggregatedActivity.group;
683
698
  return useMemo(
684
- () => (
685
- // FIXME: This part of the condition does not work as marking individual groups as read also updates the last_read_at. Should be uncommented once it's fixed on the backend.
686
- // (lastReadAt &&
687
- // aggregatedActivity.updated_at.getTime() <= lastReadAt.getTime()) ||
688
- (readActivities ?? []).includes(group)
689
- ),
690
- [readActivities, group]
699
+ () => lastReadAt && aggregatedActivity.updated_at.getTime() <= lastReadAt.getTime() || (readActivities ?? []).includes(group),
700
+ [lastReadAt, aggregatedActivity.updated_at, readActivities, group]
691
701
  );
692
702
  };
693
703
  const useIsAggregatedActivitySeen = ({