@streamscloud/streams-api-client 3.4.0 → 4.0.0-beta.3

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,30 @@
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
+ };
25
+ }
26
+ return undefined;
27
+ };
13
28
  const getIds = (parameters, dataType) => [
14
29
  ...new Set(parameters
15
30
  .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,9 @@ 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
+ };
40
+ };
@@ -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,10 @@ const mapToSiteShortVideoModels = (posts) => {
19
19
  return shortVideo;
20
20
  });
21
21
  };
22
+ const mapToFilter = (filter) => {
23
+ return {
24
+ categoryId: filter.categoryId,
25
+ };
26
+ };
22
27
 
23
- export { mapToSiteShortVideoModels };
28
+ export { mapToFilter, mapToSiteShortVideoModels };
@@ -8,3 +8,6 @@ export interface ShortVideoModel {
8
8
  products: Product[];
9
9
  ad?: Ad;
10
10
  }
11
+ export type ShortVideosFilter = {
12
+ categoryId?: string;
13
+ };
@@ -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 | 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',
@@ -149,10 +149,18 @@ export type Ad = {
149
149
  price?: number;
150
150
  priceInfo?: string;
151
151
  currency?: Currency;
152
- ctaButton: CtaButton;
152
+ ctaButton?: CtaButton;
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
+ };
156
164
  export type Post = {
157
165
  ad?: Ad;
158
166
  allProducts: Product[];
@@ -251,7 +259,7 @@ export declare enum ProfileType {
251
259
  }
252
260
  export type Product = {
253
261
  id: string;
254
- link: string;
262
+ link?: string;
255
263
  media: Media[];
256
264
  priceAndAvailability: PriceAndAvailability;
257
265
  shortDescription?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@streamscloud/streams-api-client",
3
- "version": "3.4.0",
3
+ "version": "4.0.0-beta.3",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",