@stream-io/feeds-client 0.2.13 → 0.2.14

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 (43) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/cjs/index.js +2 -1
  3. package/dist/cjs/index.js.map +1 -1
  4. package/dist/cjs/react-bindings.js +1 -1
  5. package/dist/es/index.mjs +3 -2
  6. package/dist/es/react-bindings.mjs +1 -1
  7. package/dist/{index-RzB4c4g6.js → index-B08vVRSZ.js} +89 -11
  8. package/dist/index-B08vVRSZ.js.map +1 -0
  9. package/dist/{index-gvcJhGPH.mjs → index-B3HHiF9S.mjs} +89 -11
  10. package/dist/index-B3HHiF9S.mjs.map +1 -0
  11. package/dist/tsconfig.tsbuildinfo +1 -1
  12. package/dist/types/common/real-time/StableWSConnection.d.ts +3 -3
  13. package/dist/types/common/real-time/StableWSConnection.d.ts.map +1 -1
  14. package/dist/types/feed/event-handlers/{notification-feed/handle-notification-feed-updated.d.ts → aggregated-feed/handle-aggregated-feed-updated.d.ts} +10 -4
  15. package/dist/types/feed/event-handlers/aggregated-feed/handle-aggregated-feed-updated.d.ts.map +1 -0
  16. package/dist/types/feed/event-handlers/aggregated-feed/index.d.ts +2 -0
  17. package/dist/types/feed/event-handlers/aggregated-feed/index.d.ts.map +1 -0
  18. package/dist/types/feed/event-handlers/index.d.ts +1 -1
  19. package/dist/types/feed/event-handlers/index.d.ts.map +1 -1
  20. package/dist/types/feed/feed.d.ts +2 -2
  21. package/dist/types/feed/feed.d.ts.map +1 -1
  22. package/dist/types/feeds-client/feeds-client.d.ts +2 -2
  23. package/dist/types/gen/model-decoders/event-decoder-mapping.d.ts.map +1 -1
  24. package/dist/types/gen/models/index.d.ts +17 -1
  25. package/dist/types/gen/models/index.d.ts.map +1 -1
  26. package/dist/types/utils/unique-array-merge.d.ts +1 -0
  27. package/dist/types/utils/unique-array-merge.d.ts.map +1 -1
  28. package/package.json +1 -1
  29. package/src/feed/event-handlers/{notification-feed/handle-notification-feed-updated.test.ts → aggregated-feed/handle-aggregated-feed-updated.test.ts} +227 -1
  30. package/src/feed/event-handlers/{notification-feed/handle-notification-feed-updated.ts → aggregated-feed/handle-aggregated-feed-updated.ts} +71 -15
  31. package/src/feed/event-handlers/aggregated-feed/index.ts +1 -0
  32. package/src/feed/event-handlers/index.ts +1 -1
  33. package/src/feed/feed.ts +2 -0
  34. package/src/gen/model-decoders/decoders.ts +14 -0
  35. package/src/gen/model-decoders/event-decoder-mapping.ts +3 -0
  36. package/src/gen/models/index.ts +26 -2
  37. package/src/utils/unique-array-merge.ts +30 -0
  38. package/dist/index-RzB4c4g6.js.map +0 -1
  39. package/dist/index-gvcJhGPH.mjs.map +0 -1
  40. package/dist/types/feed/event-handlers/notification-feed/handle-notification-feed-updated.d.ts.map +0 -1
  41. package/dist/types/feed/event-handlers/notification-feed/index.d.ts +0 -2
  42. package/dist/types/feed/event-handlers/notification-feed/index.d.ts.map +0 -1
  43. package/src/feed/event-handlers/notification-feed/index.ts +0 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver).
4
4
 
5
+ ## [0.2.14](https://github.com/GetStream/stream-feeds-js/compare/@stream-io/feeds-client-0.2.13...@stream-io/feeds-client-0.2.14) (2025-10-02)
6
+
7
+
8
+ ### Features
9
+
10
+ * stories feed implementation ([#132](https://github.com/GetStream/stream-feeds-js/issues/132)) ([99fac15](https://github.com/GetStream/stream-feeds-js/commit/99fac15fd256ec41750433a9e3d2fbb8744dc7aa))
11
+
5
12
  ## [0.2.13](https://github.com/GetStream/stream-feeds-js/compare/@stream-io/feeds-client-0.2.12...@stream-io/feeds-client-0.2.13) (2025-09-30)
6
13
 
7
14
 
package/dist/cjs/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const stateStore = require("@stream-io/state-store");
4
- const index = require("../index-RzB4c4g6.js");
4
+ const index = require("../index-B08vVRSZ.js");
5
5
  const loggerInternal = require("@stream-io/logger");
6
6
  class SearchController {
7
7
  constructor({ config, sources } = {}) {
@@ -383,6 +383,7 @@ exports.isImageFile = index.isImageFile;
383
383
  exports.isReactionResponse = index.isReactionResponse;
384
384
  exports.isVideoFile = index.isVideoFile;
385
385
  exports.isVoteAnswer = index.isVoteAnswer;
386
+ exports.replaceUniqueArrayMerge = index.replaceUniqueArrayMerge;
386
387
  exports.shouldUpdateState = index.shouldUpdateState;
387
388
  exports.uniqueArrayMerge = index.uniqueArrayMerge;
388
389
  exports.updateEntityInArray = index.updateEntityInArray;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","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":["StateStore","debounceMs","debounce"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","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":["StateStore","debounceMs","debounce"],"mappings":";;;;;AAqBO,MAAM,iBAAiB;AAAA,EAS5B,YAAY,EAAE,QAAQ,QAAA,IAAqC,CAAA,GAAI;AAiC/D,SAAA,YAAY,CAAC,WAAyB;AACpC,WAAK,MAAM,YAAY;AAAA,QACrB,SAAS,CAAC,GAAG,KAAK,SAAS,MAAM;AAAA,MAAA,CAClC;AAAA,IACH;AAEA,SAAA,YAAY,CAAC,eACX,KAAK,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU;AAEhD,SAAA,eAAe,CAAC,eAAqC;AACnD,YAAM,aAAa,KAAK,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU;AACnE,UAAI,WAAW,WAAW,KAAK,QAAQ,OAAQ;AAC/C,WAAK,MAAM,YAAY,EAAE,SAAS,YAAY;AAAA,IAChD;AAEA,SAAA,iBAAiB,CAAC,eAAqC;AACrD,YAAM,SAAS,KAAK,UAAU,UAAU;AACxC,UAAI,CAAC,UAAU,OAAO,SAAU;AAChC,UAAI,KAAK,OAAO,wBAAwB;AACtC,aAAK,QAAQ,QAAQ,CAAC,MAAM;AAC1B,cAAI,EAAE,SAAS,YAAY;AACzB,cAAE,WAAA;AAAA,UACJ;AAAA,QACF,CAAC;AAAA,MACH;AACA,aAAO,SAAA;AACP,WAAK,MAAM,YAAY,EAAE,SAAS,CAAC,GAAG,KAAK,OAAO,GAAG;AAAA,IACvD;AAEA,SAAA,mBAAmB,CAAC,eAAqC;AACvD,YAAM,SAAS,KAAK,UAAU,UAAU;AACxC,UAAI,CAAC,QAAQ,SAAU;AACvB,UAAI,KAAK,cAAc,WAAW,EAAG;AACrC,aAAO,WAAA;AACP,WAAK,MAAM,YAAY,EAAE,SAAS,CAAC,GAAG,KAAK,OAAO,GAAG;AAAA,IACvD;AAEA,SAAA,WAAW,MAAM;AACf,UAAI,CAAC,KAAK,cAAc,QAAQ;AAC9B,cAAM,oBAAoB,KAAK,OAAO,yBAClC,KAAK,QAAQ,MAAM,GAAG,CAAC,IACvB,KAAK;AACT,0BAAkB,QAAQ,CAAC,MAAM,EAAE,UAAU;AAAA,MAC/C;AACA,UAAI,KAAK,SAAU;AACnB,WAAK,MAAM,YAAY,EAAE,UAAU,MAAM;AAAA,IAC3C;AAEA,SAAA,SAAS,OAAO,gBAAyB;AACvC,YAAM,kBAAkB,KAAK;AAC7B,WAAK,MAAM,YAAY;AAAA,QACrB;AAAA,MAAA,CACD;AACD,YAAM,QAAQ;AAAA,QACZ,gBAAgB,IAAI,CAAC,WAAW,OAAO,OAAO,WAAW,CAAC;AAAA,MAAA;AAAA,IAE9D;AAEA,SAAA,sBAAsB,MAAM;AAC1B,WAAK,cAAc,QAAQ,CAAC,MAAM,EAAE,sBAAsB;AAAA,IAC5D;AAEA,SAAA,QAAQ,MAAM;AACZ,WAAK,oBAAA;AACL,WAAK,QAAQ;AAAA,QAAQ,CAAC,WACpB,OAAO,MAAM,KAAK,EAAE,GAAG,OAAO,cAAc,UAAU,OAAO,SAAA,CAAU;AAAA,MAAA;AAEzE,WAAK,MAAM,KAAK,CAAC,aAAa;AAAA,QAC5B,GAAG;AAAA,QACH,UAAU;AAAA,QACV,mBAAmB,CAAA;AAAA,QACnB,aAAa;AAAA,MAAA,EACb;AAAA,IACJ;AAEA,SAAA,OAAO,MAAM;AACX,WAAK,oBAAA;AACL,WAAK,QAAQ;AAAA,QAAQ,CAAC,WACpB,OAAO,MAAM,KAAK,EAAE,GAAG,OAAO,cAAc,UAAU,OAAO,SAAA,CAAU;AAAA,MAAA;AAEzE,WAAK,MAAM,KAAK,CAAC,aAAa;AAAA,QAC5B,GAAG;AAAA,QACH,UAAU;AAAA,QACV,mBAAmB,CAAA;AAAA,QACnB,aAAa;AAAA,MAAA,EACb;AAAA,IACJ;AAtHE,SAAK,QAAQ,IAAIA,sBAAkC;AAAA,MACjD,UAAU;AAAA,MACV,aAAa;AAAA,MACb,SAAS,WAAW,CAAA;AAAA,IAAC,CACtB;AACD,SAAK,iBAAiB,IAAIA,WAAAA,WAA0C,EAAE;AACtE,SAAK,SAAS,EAAE,wBAAwB,MAAM,GAAG,OAAA;AAAA,EACnD;AAAA,EACA,IAAI,UAAU;AACZ,WAAO,KAAK,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO;AAAA,EACrD;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK,MAAM,eAAA,EAAiB;AAAA,EACrC;AAAA,EAEA,IAAI,gBAAgB;AAClB,WAAO,KAAK,MAAM,iBAAiB,QAAQ,OAAO,CAAC,MAAM,EAAE,QAAQ;AAAA,EACrE;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK,MAAM,eAAA,EAAiB;AAAA,EACrC;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,KAAK,MAAM,eAAA,EAAiB;AAAA,EACrC;AAAA,EAEA,IAAI,oBAAiD;AACnD,WAAO,KAAK,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,EACvC;AAyFF;ACjGA,MAAM,gCAA+D;AAAA,EACnE,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,wBAAwB;AAAA,EACxB,uBAAuB;AACzB;AAEA,MAAe,qBAAoD;AAAA,EAOvD,YAAY,SAA+B;AA4DrD,SAAA,WAAW,MAAM;AACf,UAAI,KAAK,SAAU;AACnB,WAAK,MAAM,YAAY,EAAE,UAAU,MAAM;AAAA,IAC3C;AAEA,SAAA,aAAa,MAAM;AACjB,UAAI,CAAC,KAAK,SAAU;AACpB,WAAK,MAAM,YAAY,EAAE,UAAU,OAAO;AAAA,IAC5C;AAEA,SAAA,kBAAkB,CAAC,oBAA6B;AAC9C,YAAM,oBAAoB,OAAO,oBAAoB;AACrD,YAAM,eAAe,mBAAmB,KAAK;AAC7C,aAAO,CAAC,EACN,KAAK,YACL,CAAC,KAAK,cACL,KAAK,WAAW,uBAChB,KAAK,0BAA0B;AAAA,IAEpC;AA9EE,UAAM,EAAE,UAAU,wBAAwB,0BAA0B;AAAA,MAClE,GAAG;AAAA,MACH,GAAG;AAAA,IAAA;AAEL,SAAK,WAAW;AAChB,SAAK,yBAAyB;AAC9B,SAAK,wBAAwB;AAC7B,SAAK,QAAQ,IAAIA,sBAAiC,KAAK,YAAY;AAAA,EACrE;AAAA,EAEA,IAAI,iBAAiB;AACnB,WAAO,KAAK,MAAM,eAAA,EAAiB;AAAA,EACrC;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK,MAAM,eAAA,EAAiB;AAAA,EACrC;AAAA,EAEA,IAAI,aAAa;AACf,WAAO,MAAM,QAAQ,KAAK,MAAM,eAAA,EAAiB,KAAK;AAAA,EACxD;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK,MAAM,eAAA,EAAiB;AAAA,EACrC;AAAA,EAEA,IAAI,YAAY;AACd,WAAO,KAAK,MAAM,eAAA,EAAiB;AAAA,EACrC;AAAA,EAEA,IAAI,eAAe;AACjB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,MACV,WAAW;AAAA,MACX,OAAO;AAAA,MACP,gBAAgB;AAAA,MAChB,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aAAa;AAAA,IAAA;AAAA,EAEjB;AAAA,EAEA,IAAI,QAAQ;AACV,WAAO,KAAK,MAAM,eAAA,EAAiB;AAAA,EACrC;AAAA,EAEA,IAAI,OAAO;AACT,WAAO,KAAK,MAAM,eAAA,EAAiB;AAAA,EACrC;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,MAAM,eAAA,EAAiB;AAAA,EACrC;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,KAAK,MAAM,eAAA,EAAiB;AAAA,EACrC;AAAA,EAuBU,yBACR,iBACsB;AACtB,UAAM,eAAe,KAAK;AAC1B,UAAM,WAAW,KAAK;AAEtB,UAAM,QAAQ,KAAK,wBAAwB,aAAa,QAAQ;AAChE,WAAO;AAAA,MACL,GAAG,KAAK;AAAA,MACR;AAAA,MACA,UAAU,KAAK;AAAA,MACf,WAAW,KAAK,wBAAwB,OAAO,CAAC;AAAA,MAChD,aAAa;AAAA,IAAA;AAAA,EAEjB;AAAA,EAEU,mBACR,aACA,aACsB;AACtB,UAAM,UAAU,KAAK,MAAM,eAAA;AAC3B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,gBAAgB;AAAA;AAAA,MAChB,GAAG;AAAA,MACH,WAAW;AAAA,MACX,OAAO,cACH,YAAY,QACZ,CAAC,GAAI,KAAK,SAAS,CAAA,GAAK,GAAI,YAAY,SAAS,CAAA,CAAG;AAAA,IAAA;AAAA,EAE5D;AAAA,EAEU,qBAAqB,iBAA0B;AACvD,UAAM,oBAAoB,OAAO,oBAAoB;AACrD,UAAM,eAAe,mBAAmB,KAAK;AAE7C,QAAI,mBAAmB;AACrB,WAAK,MAAM,KAAK,KAAK,yBAAyB,mBAAmB,EAAE,CAAC;AAAA,IACtE,OAAO;AACL,WAAK,MAAM,YAAY,EAAE,WAAW,MAAM;AAAA,IAC5C;AAEA,WAAO,EAAE,cAAc,kBAAA;AAAA,EACzB;AAAA,EAEU,+BAA+B,QAA6B;AACpE,UAAM,EAAE,OAAO,KAAA,IAAS;AAExB,UAAM,cAA6C,CAAA;AACnD,QAAI,OAAO,UAAU,eAAe,KAAK,QAAQ,MAAM,GAAG;AACxD,kBAAY,OAAO;AACnB,kBAAY,UAAU,CAAC,CAAC;AAAA,IAC1B,OAAO;AACL,kBAAY,UAAU,KAAK,UAAU,KAAK,MAAM;AAChD,kBAAY,UAAU,MAAM,WAAW,KAAK;AAAA,IAC9C;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,aAAa;AACX,SAAK,MAAM,KAAK,KAAK,YAAY;AAAA,EACnC;AAAA,EAEA,wBAAwB;AACtB,SAAK,WAAA;AACL,SAAK,SAAA;AAAA,EACP;AACF;AAEO,MAAe,yBACZ,qBAEV;AAAA,EAGE,YAAY,SAA+B;AACzC,UAAM,EAAE,WAAA,IAAe,EAAE,GAAG,+BAA+B,GAAG,QAAA;AAC9D,UAAM,OAAO;AAQf,SAAA,qBAAqB,CAAC,EAAE,YAAAC,kBAAkC;AACxD,WAAK,kBAAkBC,MAAAA,SAAS,KAAK,aAAa,KAAK,IAAI,GAAGD,WAAU;AAAA,IAC1E;AAuBA,SAAA,SAAS,CAAC,gBAAyB,KAAK,gBAAgB,WAAW;AAhCjE,SAAK,mBAAmB,EAAE,YAAY;AAAA,EACxC;AAAA,EAUA,MAAM,aAAa,iBAA0B;AAC3C,QAAI,CAAC,KAAK,gBAAgB,eAAe,EAAG;AAE5C,UAAM,EAAE,mBAAmB,aAAA,IACzB,KAAK,qBAAqB,eAAe;AAE3C,QAAI,cAA6C,CAAA;AACjD,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,MAAM,YAAY;AAC7C,UAAI,CAAC,QAAS;AAEd,YAAM,EAAE,UAAU;AAClB,oBAAc,KAAK,+BAA+B,OAAO;AACzD,kBAAY,QAAQ,MAAM,KAAK,mBAAmB,KAAK;AAAA,IACzD,SAAS,GAAG;AACV,kBAAY,iBAAiB;AAAA,IAC/B,UAAA;AACE,WAAK,MAAM,KAAK,KAAK,mBAAmB,aAAa,iBAAiB,CAAC;AAAA,IACzE;AAAA,EACF;AAAA,EAIA,uBAAuB;AACrB,SAAK,gBAAgB,OAAA;AAAA,EACvB;AACF;AAEO,MAAe,6BACZ,qBAEV;AAAA,EAGE,YAAY,SAA+B;AACzC,UAAM,EAAE,WAAA,IAAe,EAAE,GAAG,+BAA+B,GAAG,QAAA;AAC9D,UAAM,OAAO;AAQf,SAAA,qBAAqB,CAAC,EAAE,YAAAA,kBAAkC;AACxD,WAAK,kBAAkBC,MAAAA,SAAS,KAAK,aAAa,KAAK,IAAI,GAAGD,WAAU;AAAA,IAC1E;AAuBA,SAAA,SAAS,CAAC,gBAAyB,KAAK,gBAAgB,WAAW;AAhCjE,SAAK,mBAAmB,EAAE,YAAY;AAAA,EACxC;AAAA,EAUA,aAAa,iBAA0B;AACrC,QAAI,CAAC,KAAK,gBAAgB,eAAe,EAAG;AAE5C,UAAM,EAAE,mBAAmB,aAAA,IACzB,KAAK,qBAAqB,eAAe;AAE3C,QAAI,cAA6C,CAAA;AACjD,QAAI;AACF,YAAM,UAAU,KAAK,MAAM,YAAY;AACvC,UAAI,CAAC,QAAS;AAEd,YAAM,EAAE,UAAU;AAClB,oBAAc,KAAK,+BAA+B,OAAO;AACzD,kBAAY,QAAQ,KAAK,mBAAmB,KAAK;AAAA,IACnD,SAAS,GAAG;AACV,kBAAY,iBAAiB;AAAA,IAC/B,UAAA;AACE,WAAK,MAAM,KAAK,KAAK,mBAAmB,aAAa,iBAAiB,CAAC;AAAA,IACzE;AAAA,EACF;AAAA,EAIA,uBAAuB;AACrB,SAAK,gBAAgB,OAAA;AAAA,EACvB;AACF;AClTO,MAAM,6BAA6B,iBAAmC;AAAA,EAI3E,YAAY,QAAqB,SAA+B;AAC9D,UAAM,OAAO;AAJf,SAAS,OAAO;AAKd,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAgB,MAAM,aAAqB;AACzC,UAAM,EAAE,gBAAgB,cAAA,IACtB,KAAK,OAAO,MAAM,eAAA;AACpB,QAAI,CAAC,cAAe,QAAO,EAAE,OAAO,CAAA,EAAC;AAErC,UAAM,EAAE,YAAY,OAAO,KAAA,IAAS,MAAM,KAAK,OAAO,gBAAgB;AAAA,MACpE,MAAM,CAAC,EAAE,WAAW,IAAI,OAAO,cAAc;AAAA,MAC7C,GAAI,CAAC,KAAK,0BAA0B,YAAY,SAAS,IACrD,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,cAAY,EAAE,IACjD,CAAA;AAAA,MACJ,OAAO;AAAA,MACP,MAAM,KAAK,QAAQ;AAAA,IAAA,CACpB;AAED,WAAO,EAAE,OAAO,KAAA;AAAA,EAClB;AAAA,EAEU,mBAAmB,OAA2B;AACtD,WAAO;AAAA,EACT;AACF;ACzBO,MAAM,yBAAyB,iBAAuB;AAAA,EAK3D,YAAY,QAAqB,SAAmC;AAClE,UAAM,OAAO;AACb,SAAK,SAAS;AACd,SAAK,cAAc,SAAS;AAC5B,SAAK,OAAO,GAAG,KAAK,WAAW;AAAA,EACjC;AAAA,EAEA,MAAgB,MAAM,aAAqB;AACzC,UAAM,EAAE,gBAAgB,cAAA,IACtB,KAAK,OAAO,MAAM,eAAA;AACpB,QAAI,CAAC,cAAe,QAAO,EAAE,OAAO,CAAA,EAAC;AAErC,UAAM,EAAE,OAAO,OAAO,KAAA,IAAS,MAAM,KAAK,OAAO,WAAW;AAAA,MAC1D,QAAQ;AAAA,QACN,GAAI,KAAK,cAAc,EAAE,UAAU,KAAK,YAAA,IAAgB,CAAA;AAAA,QACxD,GAAI,CAAC,KAAK,0BAA0B,YAAY,SAAS,IACrD;AAAA,UACE,KAAK;AAAA,YACH,EAAE,MAAM,EAAE,eAAe,cAAY;AAAA,YACrC,EAAE,aAAa,EAAE,eAAe,cAAY;AAAA,YAC5C,EAAE,mBAAmB,EAAE,eAAe,cAAY;AAAA,UAAE;AAAA,QACtD,IAEF,CAAA;AAAA,MAAC;AAAA,MAEP,MAAM,KAAK,QAAQ;AAAA,IAAA,CACpB;AAED,WAAO,EAAE,OAAO,KAAA;AAAA,EAClB;AAAA,EAEU,mBAAmB,OAAe;AAC1C,WAAO;AAAA,EACT;AACF;AC3CO,MAAM,yBAAyB,iBAA+B;AAAA,EAInE,YAAY,QAAqB,SAA+B;AAC9D,UAAM,OAAO;AAJf,SAAS,OAAO;AAKd,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAgB,MAAM,aAAqB;AACzC,UAAM,EAAE,gBAAgB,cAAA,IACtB,KAAK,OAAO,MAAM,eAAA;AACpB,QAAI,CAAC,cAAe,QAAO,EAAE,OAAO,CAAA,EAAC;AAErC,UAAM,EAAE,OAAO,MAAA,IAAU,MAAM,KAAK,OAAO,WAAW;AAAA,MACpD,SAAS;AAAA,QACP,mBAAmB;AAAA,UACjB,GAAI,CAAC,KAAK,0BAA0B,YAAY,SAAS,IACrD;AAAA,YACE,MAAM;AAAA,cACJ,eAAe;AAAA,YAAA;AAAA,UACjB,IAEF,CAAA;AAAA,QAAC;AAAA,MACP;AAAA,IACF,CACD;AAED,WAAO,EAAE,OAAO,MAAM,OAAA;AAAA,EACxB;AAAA,EAEU,mBAAmB,OAAuB;AAClD,WAAO;AAAA,EACT;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const require$$0 = require("react");
4
4
  require("@stream-io/state-store");
5
- const index = require("../index-RzB4c4g6.js");
5
+ const index = require("../index-B08vVRSZ.js");
6
6
  require("@stream-io/logger");
7
7
  require("axios");
8
8
  var shim = { exports: {} };
package/dist/es/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import { StateStore } from "@stream-io/state-store";
2
2
  export * from "@stream-io/state-store";
3
- import { d as debounce } from "../index-gvcJhGPH.mjs";
4
- import { C, f, a, b, F, S, c, e, o, q, p, m, j, g, k, h, l, i, s, u, n } from "../index-gvcJhGPH.mjs";
3
+ import { d as debounce } from "../index-B3HHiF9S.mjs";
4
+ import { C, f, a, b, F, S, c, e, o, q, p, m, j, g, k, h, l, i, r, s, u, n } from "../index-B3HHiF9S.mjs";
5
5
  import { LogLevelEnum, restoreDefaults } from "@stream-io/logger";
6
6
  class SearchController {
7
7
  constructor({ config, sources } = {}) {
@@ -391,6 +391,7 @@ export {
391
391
  h as isReactionResponse,
392
392
  l as isVideoFile,
393
393
  i as isVoteAnswer,
394
+ r as replaceUniqueArrayMerge,
394
395
  restoreDefaults,
395
396
  s as shouldUpdateState,
396
397
  u as uniqueArrayMerge,
@@ -1,6 +1,6 @@
1
1
  import require$$0, { useCallback, useMemo, useState, useEffect, createContext, useContext, useRef } from "react";
2
2
  import "@stream-io/state-store";
3
- import { F as FeedsClient, j as isCommentResponse, e as checkHasAnotherPage, b as FeedOwnCapability } from "../index-gvcJhGPH.mjs";
3
+ import { F as FeedsClient, j as isCommentResponse, e as checkHasAnotherPage, b as FeedOwnCapability } from "../index-B3HHiF9S.mjs";
4
4
  import "@stream-io/logger";
5
5
  import "axios";
6
6
  var shim = { exports: {} };
@@ -1264,6 +1264,17 @@ decoders.SingleFollowResponse = (input) => {
1264
1264
  };
1265
1265
  return decode(typeMappings, input);
1266
1266
  };
1267
+ decoders.StoriesFeedUpdatedEvent = (input) => {
1268
+ const typeMappings = {
1269
+ created_at: { type: "DatetimeType", isSingle: true },
1270
+ received_at: { type: "DatetimeType", isSingle: true },
1271
+ aggregated_activities: {
1272
+ type: "AggregatedActivityResponse",
1273
+ isSingle: false
1274
+ }
1275
+ };
1276
+ return decode(typeMappings, input);
1277
+ };
1267
1278
  decoders.SubmitActionResponse = (input) => {
1268
1279
  const typeMappings = {
1269
1280
  item: { type: "ReviewQueueItemResponse", isSingle: true }
@@ -3711,7 +3722,7 @@ const getRateLimitFromResponseHeader = (response_headers) => {
3711
3722
  };
3712
3723
  return result;
3713
3724
  };
3714
- const version = "0.2.13";
3725
+ const version = "0.2.14";
3715
3726
  class ApiClient {
3716
3727
  constructor(apiKey, tokenManager, connectionIdManager, options) {
3717
3728
  this.apiKey = apiKey;
@@ -3922,6 +3933,7 @@ const eventDecoderMapping = {
3922
3933
  "feeds.poll.vote_casted": (data) => decoders.PollVoteCastedFeedEvent(data),
3923
3934
  "feeds.poll.vote_changed": (data) => decoders.PollVoteChangedFeedEvent(data),
3924
3935
  "feeds.poll.vote_removed": (data) => decoders.PollVoteRemovedFeedEvent(data),
3936
+ "feeds.stories_feed.updated": (data) => decoders.StoriesFeedUpdatedEvent(data),
3925
3937
  "health.check": (data) => decoders.HealthCheckEvent(data),
3926
3938
  "moderation.custom_action": (data) => decoders.ModerationCustomActionEvent(data),
3927
3939
  "moderation.flagged": (data) => decoders.ModerationFlaggedEvent(data),
@@ -4450,6 +4462,27 @@ const uniqueArrayMerge = (existingArray, arrayToMerge, getKey) => {
4450
4462
  });
4451
4463
  return existingArray.concat(filteredArrayToMerge);
4452
4464
  };
4465
+ const replaceUniqueArrayMerge = (existingArray, arrayToMerge, getKey) => {
4466
+ const existingMap = /* @__PURE__ */ new Map();
4467
+ (existingArray ?? []).forEach((item) => {
4468
+ existingMap.set(getKey(item), item);
4469
+ });
4470
+ const result = [];
4471
+ arrayToMerge.forEach((item) => {
4472
+ existingMap.set(getKey(item), item);
4473
+ });
4474
+ existingArray.forEach((originalItem) => {
4475
+ const updatedItem = existingMap.get(getKey(originalItem));
4476
+ if (updatedItem) {
4477
+ result.push(updatedItem);
4478
+ existingMap.delete(getKey(originalItem));
4479
+ }
4480
+ });
4481
+ existingMap.forEach((item) => {
4482
+ result.push(item);
4483
+ });
4484
+ return result;
4485
+ };
4453
4486
  const Constants = {
4454
4487
  DEFAULT_COMMENT_PAGINATION: "first"
4455
4488
  };
@@ -5593,15 +5626,29 @@ const addAggregatedActivitiesToState = (newAggregatedActivities, aggregatedActiv
5593
5626
  aggregated_activities: []
5594
5627
  };
5595
5628
  }
5596
- result.aggregated_activities = position === "start" ? uniqueArrayMerge(
5597
- newAggregatedActivities,
5598
- aggregatedActivities ?? [],
5599
- (a) => a.group
5600
- ) : uniqueArrayMerge(
5601
- aggregatedActivities ?? [],
5602
- newAggregatedActivities,
5603
- (a) => a.group
5604
- );
5629
+ switch (position) {
5630
+ case "start":
5631
+ result.aggregated_activities = uniqueArrayMerge(
5632
+ newAggregatedActivities,
5633
+ aggregatedActivities ?? [],
5634
+ (a) => a.group
5635
+ );
5636
+ break;
5637
+ case "end":
5638
+ result.aggregated_activities = uniqueArrayMerge(
5639
+ aggregatedActivities ?? [],
5640
+ newAggregatedActivities,
5641
+ (a) => a.group
5642
+ );
5643
+ break;
5644
+ case "replace":
5645
+ result.aggregated_activities = replaceUniqueArrayMerge(
5646
+ aggregatedActivities ?? [],
5647
+ newAggregatedActivities,
5648
+ (a) => a.group
5649
+ );
5650
+ break;
5651
+ }
5605
5652
  return result;
5606
5653
  };
5607
5654
  const updateNotificationStatus = (newNotificationStatus, currentNotificationStatus) => {
@@ -5668,6 +5715,35 @@ function handleNotificationFeedUpdated(event) {
5668
5715
  });
5669
5716
  }
5670
5717
  }
5718
+ function updateStoriesFeedFromEvent(aggregatedActivities, event) {
5719
+ if (!aggregatedActivities) {
5720
+ return {
5721
+ changed: false
5722
+ };
5723
+ }
5724
+ if (event.aggregated_activities) {
5725
+ const result = addAggregatedActivitiesToState(
5726
+ event.aggregated_activities,
5727
+ aggregatedActivities,
5728
+ "replace"
5729
+ );
5730
+ return result;
5731
+ }
5732
+ return {
5733
+ changed: false
5734
+ };
5735
+ }
5736
+ function handleStoriesFeedUpdated(event) {
5737
+ const result = updateStoriesFeedFromEvent(
5738
+ this.currentState.aggregated_activities,
5739
+ event
5740
+ );
5741
+ if (result.changed) {
5742
+ this.state.partialNext({
5743
+ aggregated_activities: result.data?.aggregated_activities
5744
+ });
5745
+ }
5746
+ }
5671
5747
  function handleWatchStarted() {
5672
5748
  this.state.partialNext({ watch: true });
5673
5749
  }
@@ -5710,6 +5786,7 @@ const _Feed = class _Feed extends FeedApi {
5710
5786
  "feeds.feed_member.removed": handleFeedMemberRemoved.bind(this),
5711
5787
  "feeds.feed_member.updated": handleFeedMemberUpdated.bind(this),
5712
5788
  "feeds.notification_feed.updated": handleNotificationFeedUpdated.bind(this),
5789
+ "feeds.stories_feed.updated": handleStoriesFeedUpdated.bind(this),
5713
5790
  // the poll events should be removed from here
5714
5791
  "feeds.poll.closed": _Feed.noop,
5715
5792
  "feeds.poll.deleted": _Feed.noop,
@@ -6778,7 +6855,8 @@ exports.isImageFile = isImageFile;
6778
6855
  exports.isReactionResponse = isReactionResponse;
6779
6856
  exports.isVideoFile = isVideoFile;
6780
6857
  exports.isVoteAnswer = isVoteAnswer;
6858
+ exports.replaceUniqueArrayMerge = replaceUniqueArrayMerge;
6781
6859
  exports.shouldUpdateState = shouldUpdateState;
6782
6860
  exports.uniqueArrayMerge = uniqueArrayMerge;
6783
6861
  exports.updateEntityInArray = updateEntityInArray;
6784
- //# sourceMappingURL=index-RzB4c4g6.js.map
6862
+ //# sourceMappingURL=index-B08vVRSZ.js.map