@streamscloud/streams-api-client 3.4.1 → 4.0.0-beta.5

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.
@@ -27,9 +27,9 @@ const getComponentData = (componentsData, parameters) => {
27
27
  return result;
28
28
  };
29
29
  const getModels = (content, ids) => ids.length
30
- ? content
30
+ ? content.chosen
31
31
  .filter((x) => ids.includes(x.id))
32
32
  .sort((a, b) => ids.indexOf(a.id) - ids.indexOf(b.id))
33
- : [];
33
+ : content.dynamicallyLoaded.splice(0, 1);
34
34
 
35
35
  export { createComponentDataProvider, getComponentData };
@@ -29,7 +29,14 @@ const createComponentsDataFetcher = (client) => {
29
29
  };
30
30
  };
31
31
  const loadContent = async (dataLoader, contentParameters) => {
32
- return contentParameters.ids.length ? await dataLoader.load(contentParameters.ids) : [];
32
+ const chosenPromise = loadChosen(contentParameters, dataLoader);
33
+ const dynamicDataPromise = loadDynamicData(contentParameters, dataLoader);
34
+ return {
35
+ chosen: await chosenPromise,
36
+ dynamicallyLoaded: await dynamicDataPromise
37
+ };
33
38
  };
39
+ const loadChosen = async (contentParameters, dataLoader) => contentParameters.ids.length ? dataLoader.load(contentParameters.ids) : [];
40
+ const loadDynamicData = async (contentParameters, dataLoader) => contentParameters.page ? (await dataLoader.loadBatch(contentParameters.page.limit, contentParameters.page.filter, contentParameters.ids)) : [];
34
41
 
35
42
  export { createComponentsDataFetcher };
@@ -1,2 +1,2 @@
1
- import type { ComponentsDataParameters, DataParameters } from './types';
2
- export declare const getComponentsDataParameters: (parameters: DataParameters[]) => ComponentsDataParameters;
1
+ import { type ComponentsDataParameters, type DataParameters, type DynamicLoadingConfig } from './types';
2
+ export declare const getComponentsDataParameters: (parameters: DataParameters[], dynamicLoadingConfig?: DynamicLoadingConfig) => ComponentsDataParameters;
@@ -1,15 +1,31 @@
1
- const getComponentsDataParameters = (parameters) => {
1
+ import { DataType } from './types.js';
2
+
3
+ const getComponentsDataParameters = (parameters, dynamicLoadingConfig) => {
2
4
  const result = {};
3
5
  const params = parameters
4
6
  .flatMap((x) => Object.entries(x).filter(([_, v]) => Array.isArray(v)).map(([t, v]) => ({ type: t, value: v })));
5
7
  const dataTypes = [...new Set(params.map(x => x.type))];
6
8
  for (const dataType of dataTypes) {
9
+ const filter = getFilter(dataType, dynamicLoadingConfig);
7
10
  result[dataType] = {
8
11
  ids: getIds(params, dataType),
12
+ page: filter ? { limit: parameters.length, filter } : undefined
9
13
  };
10
14
  }
11
15
  return result;
12
16
  };
17
+ const getFilter = (dataType, dynamicLoadingConfig) => {
18
+ if (!dynamicLoadingConfig) {
19
+ return undefined;
20
+ }
21
+ if (dataType === DataType.ShortVideo && dynamicLoadingConfig.posts.enabled) {
22
+ return {
23
+ categoryId: dynamicLoadingConfig.posts.categoryId ?? undefined,
24
+ types: dynamicLoadingConfig.posts.types ?? undefined
25
+ };
26
+ }
27
+ return undefined;
28
+ };
13
29
  const getIds = (parameters, dataType) => [
14
30
  ...new Set(parameters
15
31
  .filter((x) => x.type === dataType && typeof Array.isArray(x.value))
@@ -1,4 +1,4 @@
1
- import { ShortVideoModel, StreamModel } from '../data-loaders';
1
+ import { ShortVideoModel, ShortVideosFilter, StreamModel, StreamsFilter } from '../data-loaders';
2
2
  export declare const DataType: {
3
3
  ShortVideo: string;
4
4
  Stream: string;
@@ -8,9 +8,19 @@ export type ComponentsDataParameters = {
8
8
  };
9
9
  export type ContentParameters = {
10
10
  ids: string[];
11
+ page?: DataPageParameters;
11
12
  };
13
+ export type DataPageParameters = {
14
+ limit: number;
15
+ filter: DataFilterParameters;
16
+ };
17
+ export type DataFilterParameters = ShortVideosFilter | StreamsFilter;
12
18
  export type ComponentsData = {
13
- [key: string]: ComponentDataModel[];
19
+ [key: string]: Content;
20
+ };
21
+ export type Content = {
22
+ chosen: ComponentDataModel[];
23
+ dynamicallyLoaded: ComponentDataModel[];
14
24
  };
15
25
  export type ComponentDataModel = ShortVideoModel | StreamModel;
16
26
  export type DataParameters = {
@@ -22,3 +32,10 @@ export type ComponentData = {
22
32
  export type ComponentDataProvider = {
23
33
  getData: (parameters?: DataParameters) => ComponentData;
24
34
  };
35
+ export type DynamicLoadingConfig = {
36
+ posts: {
37
+ enabled: boolean;
38
+ categoryId?: string;
39
+ types?: string[];
40
+ };
41
+ };
@@ -1,2 +1,2 @@
1
- export { getShortVideosDataLoader, type ShortVideoModel } from './short-videos-data-loader';
2
- export { getStreamsDataLoader, type StreamModel } from './streams-data-loader';
1
+ export { getShortVideosDataLoader, type ShortVideoModel, type ShortVideosFilter } from './short-videos-data-loader';
2
+ export { getStreamsDataLoader, type StreamModel, type StreamsFilter } from './streams-data-loader';
@@ -1,2 +1,2 @@
1
1
  export { getShortVideosDataLoader } from './loader';
2
- export type { ShortVideoModel } from './types';
2
+ export type { ShortVideoModel, ShortVideosFilter } from './types';
@@ -1,4 +1,4 @@
1
- import { ShortVideoModel } from './types';
2
- import { EmbedContentApiClient } from '../../services';
3
- import { DataLoader } from '../types';
1
+ import { ShortVideoModel } from "./types";
2
+ import { EmbedContentApiClient } from "../../services";
3
+ import { DataLoader } from "../types";
4
4
  export declare const getShortVideosDataLoader: (client: EmbedContentApiClient) => DataLoader<ShortVideoModel>;
@@ -1,10 +1,20 @@
1
- import { mapToSiteShortVideoModels } from './mapper.js';
1
+ import { mapToFilter, mapToSiteShortVideoModels } from './mapper.js';
2
2
 
3
3
  const getShortVideosDataLoader = (client) => ({
4
4
  async load(ids) {
5
5
  const posts = await client.getPosts(ids);
6
6
  if (!posts) {
7
- console.error('Failed to fetch site short video posts: Null-payload received', posts);
7
+ console.error("Failed to fetch short video posts: Null-payload received", posts);
8
+ return [];
9
+ }
10
+ return mapToSiteShortVideoModels(posts);
11
+ },
12
+ async loadBatch(limit, filter, excludeIds) {
13
+ const postsFilter = mapToFilter(filter);
14
+ postsFilter.excludeIds = excludeIds;
15
+ const posts = await client.getPostsBy(limit, postsFilter);
16
+ if (!posts) {
17
+ console.error("Failed to fetch short video posts: Null-payload received", posts);
8
18
  return [];
9
19
  }
10
20
  return mapToSiteShortVideoModels(posts);
@@ -1,3 +1,5 @@
1
1
  import type { ShortVideoModel } from './types';
2
- import { Post } from '../../services/types';
2
+ import { Post, PostsFilter } from '../../services/types';
3
+ import { Filter } from '../types';
3
4
  export declare const mapToSiteShortVideoModels: (posts: Post[]) => ShortVideoModel[];
5
+ export declare const mapToFilter: (filter: Filter) => PostsFilter;
@@ -19,5 +19,11 @@ const mapToSiteShortVideoModels = (posts) => {
19
19
  return shortVideo;
20
20
  });
21
21
  };
22
+ const mapToFilter = (filter) => {
23
+ return {
24
+ categoryId: Array.isArray(filter.categoryId) ? undefined : filter.categoryId,
25
+ types: Array.isArray(filter.types) ? filter.types : undefined,
26
+ };
27
+ };
22
28
 
23
- export { mapToSiteShortVideoModels };
29
+ export { mapToFilter, mapToSiteShortVideoModels };
@@ -8,3 +8,7 @@ export interface ShortVideoModel {
8
8
  products: Product[];
9
9
  ad?: Ad;
10
10
  }
11
+ export type ShortVideosFilter = {
12
+ categoryId?: string;
13
+ types?: string[];
14
+ };
@@ -1,2 +1,2 @@
1
1
  export { getStreamsDataLoader } from './loader';
2
- export type { StreamModel } from './types';
2
+ export type { StreamModel, StreamsFilter } from './types';
@@ -1,4 +1,4 @@
1
- import { mapToStreamModels } from './mapper.js';
1
+ import { mapToFilter, mapToStreamModels } from './mapper.js';
2
2
 
3
3
  const getStreamsDataLoader = (client) => ({
4
4
  async load(ids) {
@@ -9,6 +9,16 @@ const getStreamsDataLoader = (client) => ({
9
9
  }
10
10
  return mapToStreamModels(streams);
11
11
  },
12
+ async loadBatch(limit, filter, excludeIds) {
13
+ const streamsFilter = mapToFilter(filter);
14
+ streamsFilter.excludeIds = excludeIds;
15
+ const streams = await client.getStreamsBy(limit, streamsFilter);
16
+ if (!streams) {
17
+ console.error('Failed to fetch site short video posts: Null-payload received', streams);
18
+ return [];
19
+ }
20
+ return mapToStreamModels(streams);
21
+ }
12
22
  });
13
23
 
14
24
  export { getStreamsDataLoader };
@@ -1,3 +1,5 @@
1
1
  import { StreamModel } from './types';
2
- import type { Stream } from '../../services/types';
2
+ import type { Stream, StreamsFilter } from '../../services/types';
3
+ import { Filter } from '../types';
3
4
  export declare const mapToStreamModels: (streams: Stream[]) => StreamModel[];
5
+ export declare const mapToFilter: (filter: Filter) => StreamsFilter;
@@ -10,5 +10,10 @@ const mapToStreamModels = (streams) => {
10
10
  return stream;
11
11
  });
12
12
  };
13
+ const mapToFilter = (filter) => {
14
+ return {
15
+ categoryId: filter.categoryId,
16
+ };
17
+ };
13
18
 
14
- export { mapToStreamModels };
19
+ export { mapToFilter, mapToStreamModels };
@@ -5,3 +5,6 @@ export interface StreamModel {
5
5
  subTitle: string;
6
6
  publishedAt: string;
7
7
  }
8
+ export type StreamsFilter = {
9
+ categoryId?: string;
10
+ };
@@ -1,3 +1,7 @@
1
1
  export interface DataLoader<T> {
2
2
  load: (ids: string[]) => Promise<T[]>;
3
+ loadBatch: (limit: number, filter: Filter, excludeIds?: string[]) => Promise<T[]>;
3
4
  }
5
+ export type Filter = {
6
+ [key: string]: string | string[] | undefined;
7
+ };
@@ -1,9 +1,11 @@
1
- import type { Post, Stream } from './types';
1
+ import type { Post, PostsFilter, Stream, StreamsFilter } from './types';
2
2
  export declare class EmbedContentApiClient {
3
3
  private readonly gqlEndpoint;
4
4
  private readonly clientId;
5
5
  constructor(gqlEndpoint: string, clientId: string);
6
6
  getPosts(ids: string[]): Promise<Post[] | undefined>;
7
+ getPostsBy(limit: number, filter?: PostsFilter): Promise<Post[] | undefined>;
7
8
  getStreams(ids: string[]): Promise<Stream[] | undefined>;
9
+ getStreamsBy(limit: number, filter?: StreamsFilter): Promise<Stream[] | undefined>;
8
10
  private queryGql;
9
11
  }
@@ -18,6 +18,15 @@ class EmbedContentApiClient {
18
18
  });
19
19
  return response.embedPosts?.items;
20
20
  }
21
+ async getPostsBy(limit, filter) {
22
+ const response = await this.queryGql(EmbedPostsQuery, {
23
+ input: {
24
+ filter,
25
+ limit
26
+ }
27
+ });
28
+ return response.embedPosts?.items;
29
+ }
21
30
  async getStreams(ids) {
22
31
  const response = await this.queryGql(EmbedStreamsQuery, {
23
32
  input: {
@@ -28,6 +37,15 @@ class EmbedContentApiClient {
28
37
  });
29
38
  return response.embedStreams?.items;
30
39
  }
40
+ async getStreamsBy(limit, filter) {
41
+ const response = await this.queryGql(EmbedStreamsQuery, {
42
+ input: {
43
+ filter,
44
+ limit
45
+ }
46
+ });
47
+ return response.embedStreams?.items;
48
+ }
31
49
  queryGql = async (query, variables) => {
32
50
  const response = await fetch(this.gqlEndpoint, {
33
51
  method: 'POST',
@@ -153,6 +153,15 @@ export type Ad = {
153
153
  type: AdType;
154
154
  media: Media[];
155
155
  };
156
+ export type StreamsFilter = {
157
+ categoryId?: string;
158
+ excludeIds?: string[];
159
+ };
160
+ export type PostsFilter = {
161
+ categoryId?: string;
162
+ excludeIds?: string[];
163
+ types?: string[];
164
+ };
156
165
  export type Post = {
157
166
  ad?: Ad;
158
167
  allProducts: Product[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@streamscloud/streams-api-client",
3
- "version": "3.4.1",
3
+ "version": "4.0.0-beta.5",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",