@streamscloud/embeddable 8.3.0 → 10.0.0
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.
- package/dist/content-player/cmp.content-player.svelte +1 -1
- package/dist/content-player/content-player-config.svelte.d.ts +4 -4
- package/dist/content-player/controls-and-attachments.svelte +1 -1
- package/dist/content-player/header.svelte +1 -1
- package/dist/core/document.event-handlers.d.ts +1 -0
- package/dist/core/document.event-handlers.js +3 -0
- package/dist/media-center/config/internal-media-center-analytics-handler.d.ts +4 -3
- package/dist/media-center/config/internal-media-center-analytics-handler.js +1 -0
- package/dist/media-center/config/internal-media-center-config.d.ts +1 -1
- package/dist/media-center/config/internal-media-center-config.js +38 -48
- package/dist/media-center/config/operations.generated.d.ts +0 -104
- package/dist/media-center/config/operations.generated.js +0 -323
- package/dist/media-center/config/operations.graphql +0 -24
- package/dist/media-center/config/types.d.ts +14 -14
- package/dist/media-center/config/types.js +1 -1
- package/dist/media-center/media-center/cmp.media-center.svelte +101 -24
- package/dist/media-center/media-center/cmp.media-center.svelte.d.ts +5 -5
- package/dist/media-center/media-center/discover-panel-handler.svelte.d.ts +5 -4
- package/dist/media-center/media-center/discover-panel-handler.svelte.js +2 -1
- package/dist/media-center/media-center/discover-panel.svelte +1 -1
- package/dist/media-center/media-center/discover-panel.svelte.d.ts +4 -3
- package/dist/media-center/media-center/post-player-provider-generator.d.ts +8 -0
- package/dist/media-center/media-center/{short-video-resources-generator.js → post-player-provider-generator.js} +9 -3
- package/dist/media-center/media-center/streams-in-category-panel-handler.svelte.d.ts +5 -2
- package/dist/media-center/media-center/streams-in-category-panel-handler.svelte.js +5 -0
- package/dist/media-center/media-center/streams-in-category-panel.svelte +2 -2
- package/dist/media-center/media-center/streams-in-category-panel.svelte.d.ts +3 -2
- package/dist/media-center/media-center/streams-player-provider-generator.d.ts +8 -0
- package/dist/media-center/media-center/streams-player-provider-generator.js +36 -0
- package/dist/media-center/media-center/types.d.ts +1 -7
- package/dist/posts/controls/cmp.controls.svelte +1 -1
- package/dist/posts/data-loaders/index.d.ts +1 -0
- package/dist/posts/data-loaders/index.js +1 -0
- package/dist/posts/data-loaders/mapper.d.ts +3 -0
- package/dist/{short-videos/short-videos-player → posts/data-loaders}/mapper.js +2 -2
- package/dist/{short-videos/short-videos-player → posts/data-loaders}/operations.generated.d.ts +6 -6
- package/dist/{short-videos/short-videos-player → posts/data-loaders}/operations.generated.js +7 -10
- package/dist/posts/data-loaders/operations.graphql +17 -0
- package/dist/posts/data-loaders/posts-loader.d.ts +19 -0
- package/dist/posts/data-loaders/posts-loader.js +28 -0
- package/dist/posts/handlers/index.d.ts +1 -0
- package/dist/posts/handlers/index.js +1 -0
- package/dist/{short-videos/short-videos-player/internal-short-video-analytics-handler.d.ts → posts/handlers/internal-post-analytics-handler.d.ts} +3 -2
- package/dist/{short-videos/short-videos-player/internal-short-video-analytics-handler.js → posts/handlers/internal-post-analytics-handler.js} +2 -1
- package/dist/{short-videos/short-videos-player/cmp.short-videos-player.svelte → posts/posts-player/cmp.posts-player.svelte} +3 -3
- package/dist/posts/posts-player/cmp.posts-player.svelte.d.ts +4 -0
- package/dist/posts/posts-player/index.d.ts +55 -20
- package/dist/posts/posts-player/index.js +48 -32
- package/dist/posts/posts-player/posts-player-view.svelte +65 -15
- package/dist/posts/posts-player/posts-player-view.svelte.d.ts +5 -1
- package/dist/posts/posts-player/types.d.ts +9 -3
- package/dist/short-videos/data-providers/index.d.ts +1 -0
- package/dist/short-videos/data-providers/index.js +1 -0
- package/dist/short-videos/data-providers/internal-short-video-player-items-provider.d.ts +17 -0
- package/dist/short-videos/{short-videos-player/internal-short-video-player-provider.js → data-providers/internal-short-video-player-items-provider.js} +13 -33
- package/dist/short-videos/short-videos-player/index.d.ts +14 -64
- package/dist/short-videos/short-videos-player/index.js +77 -31
- package/dist/streams/data-loaders/index.d.ts +2 -0
- package/dist/streams/data-loaders/index.js +2 -0
- package/dist/streams/{stream-player → data-loaders}/mapper.d.ts +1 -1
- package/dist/streams/{stream-player → data-loaders}/operations.generated.d.ts +27 -24
- package/dist/streams/{stream-player → data-loaders}/operations.generated.js +18 -17
- package/dist/streams/{stream-player → data-loaders}/operations.graphql +6 -3
- package/dist/streams/data-loaders/stream-pages-loader.d.ts +10 -0
- package/dist/streams/data-loaders/stream-pages-loader.js +33 -0
- package/dist/streams/data-loaders/streams-loader.d.ts +19 -0
- package/dist/streams/data-loaders/streams-loader.js +28 -0
- package/dist/streams/{stream-player → streams-player}/index.d.ts +21 -22
- package/dist/streams/{stream-player → streams-player}/index.js +9 -7
- package/dist/streams/streams-player/internal-streams-player-data-provider.d.ts +16 -0
- package/dist/streams/streams-player/internal-streams-player-data-provider.js +55 -0
- package/dist/streams/{stream-player → streams-player}/stream-overview.svelte +18 -15
- package/dist/streams/{stream-player → streams-player}/stream-overview.svelte.d.ts +2 -2
- package/dist/streams/streams-player/streams-player-buffer.svelte.d.ts +8 -0
- package/dist/streams/streams-player/streams-player-buffer.svelte.js +15 -0
- package/dist/streams/{stream-player/stream-player-view.svelte → streams-player/streams-player-view.svelte} +69 -55
- package/dist/streams/streams-player/streams-player-view.svelte.d.ts +8 -0
- package/dist/streams/{stream-player → streams-player}/types.d.ts +9 -7
- package/dist/ui/{player-button → player/button}/cmp.player-button.svelte +1 -1
- package/dist/ui/{player-button → player/button}/cmp.player-button.svelte.d.ts +1 -1
- package/dist/ui/{player-button → player/button}/cmp.player-buttons-group.svelte +1 -1
- package/dist/ui/{player-button → player/button}/types.d.ts +1 -1
- package/dist/ui/player/button/types.js +1 -0
- package/dist/ui/player/providers/chunks-player-buffer/index.d.ts +2 -0
- package/dist/ui/player/providers/chunks-player-buffer/index.js +2 -0
- package/dist/ui/player/providers/chunks-player-buffer/player-chunk-item.svelte.d.ts +11 -0
- package/dist/ui/player/providers/chunks-player-buffer/player-chunk-item.svelte.js +11 -0
- package/dist/ui/player/providers/chunks-player-buffer/player-chunk.svelte.d.ts +31 -0
- package/dist/ui/player/providers/chunks-player-buffer/player-chunk.svelte.js +67 -0
- package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.d.ts +23 -0
- package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.js +119 -0
- package/dist/ui/player/providers/default-chunks-player-buffer.svelte.d.ts +20 -0
- package/dist/ui/player/providers/default-chunks-player-buffer.svelte.js +47 -0
- package/dist/ui/player/providers/default-feed-player-buffer.svelte.d.ts +27 -0
- package/dist/ui/player/providers/default-feed-player-buffer.svelte.js +78 -0
- package/dist/ui/player/providers/index.d.ts +3 -0
- package/dist/ui/player/providers/index.js +2 -0
- package/dist/ui/player/providers/types.d.ts +49 -0
- package/dist/ui/{player-slider → player/slider}/cmp.player-slider.svelte +7 -20
- package/dist/ui/{player-slider → player/slider}/cmp.player-slider.svelte.d.ts +4 -4
- package/dist/ui/{player-slider → player/slider}/index.d.ts +0 -2
- package/dist/ui/{player-slider → player/slider}/index.js +0 -1
- package/dist/ui/player/slider/types.d.ts +16 -0
- package/dist/ui/swipe-indicator/cmp.swipe-indicator.svelte +7 -8
- package/package.json +4 -4
- package/dist/media-center/media-center/short-video-resources-generator.d.ts +0 -8
- package/dist/short-videos/short-videos-player/cmp.short-videos-player.svelte.d.ts +0 -4
- package/dist/short-videos/short-videos-player/internal-short-video-player-provider.d.ts +0 -18
- package/dist/short-videos/short-videos-player/mapper.d.ts +0 -3
- package/dist/short-videos/short-videos-player/operations.graphql +0 -17
- package/dist/short-videos/short-videos-player/short-videos-player-view.svelte +0 -82
- package/dist/short-videos/short-videos-player/short-videos-player-view.svelte.d.ts +0 -8
- package/dist/short-videos/short-videos-player/types.d.ts +0 -26
- package/dist/streams/stream-player/internal-stream-player-data-provider.d.ts +0 -12
- package/dist/streams/stream-player/internal-stream-player-data-provider.js +0 -48
- package/dist/streams/stream-player/stream-player-buffer.svelte.d.ts +0 -28
- package/dist/streams/stream-player/stream-player-buffer.svelte.js +0 -79
- package/dist/streams/stream-player/stream-player-view.svelte.d.ts +0 -8
- package/dist/ui/player-button/types.js +0 -1
- package/dist/ui/player-slider/player-buffer.svelte.d.ts +0 -31
- package/dist/ui/player-slider/player-buffer.svelte.js +0 -76
- package/dist/ui/player-slider/types.d.ts +0 -26
- /package/dist/streams/{stream-player → data-loaders}/mapper.js +0 -0
- /package/dist/streams/{stream-player → streams-player}/internal-stream-analytics-handler.d.ts +0 -0
- /package/dist/streams/{stream-player → streams-player}/internal-stream-analytics-handler.js +0 -0
- /package/dist/streams/{stream-player → streams-player}/stream-player-localization.d.ts +0 -0
- /package/dist/streams/{stream-player → streams-player}/stream-player-localization.js +0 -0
- /package/dist/{short-videos/short-videos-player → streams/streams-player}/types.js +0 -0
- /package/dist/ui/{player-button → player/button}/cmp.player-buttons-group.svelte.d.ts +0 -0
- /package/dist/ui/{player-button → player/button}/index.d.ts +0 -0
- /package/dist/ui/{player-button → player/button}/index.js +0 -0
- /package/dist/{streams/stream-player → ui/player/providers}/types.js +0 -0
- /package/dist/ui/{player-slider → player/slider}/prevent-slider-scroll.d.ts +0 -0
- /package/dist/ui/{player-slider → player/slider}/prevent-slider-scroll.js +0 -0
- /package/dist/ui/{player-slider → player/slider}/types.js +0 -0
- /package/dist/ui/{player-slider → player/slider}/wheel-gestures-adapter.d.ts +0 -0
- /package/dist/ui/{player-slider → player/slider}/wheel-gestures-adapter.js +0 -0
|
@@ -1,25 +1,21 @@
|
|
|
1
1
|
import { type IMediaCenterConfig } from '../../media-center/config/types';
|
|
2
2
|
import type { IPostSocialInteractionsHandler } from '../../posts/social-interactions';
|
|
3
3
|
import type { StreamPageViewerModel } from '../stream-page-viewer/types';
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
export {
|
|
7
|
-
export type {
|
|
4
|
+
import type { IStreamAnalyticsHandler, IStreamsPlayerDataProvider, StreamAmplificationParameters, StreamPlayerModel, StreamsPlayerSettings } from './types';
|
|
5
|
+
export { type StreamPlayerModel, type StreamPageViewerModel };
|
|
6
|
+
export { mapToStreamPlayerModel } from '../data-loaders/mapper';
|
|
7
|
+
export type { IStreamsPlayerDataProvider, IStreamAnalyticsHandler, IMediaCenterConfig };
|
|
8
8
|
/**
|
|
9
|
-
* Opens the
|
|
9
|
+
* Opens the streams player modal.
|
|
10
10
|
*
|
|
11
11
|
* Two overloads (mutually exclusive; enforced by TypeScript):
|
|
12
|
-
* - Provider mode:
|
|
13
|
-
* - Internal provider mode:
|
|
12
|
+
* - Provider mode: openStreamsPlayer({ dataProvider, mediaCenterConfig?, analyticsHandler? })
|
|
13
|
+
* - Internal provider mode: openStreamsPlayer({ ids, initiator, graphqlOrigin?, initialId?, mediaPageId? })
|
|
14
14
|
*
|
|
15
15
|
* @param init Configuration options.
|
|
16
16
|
*
|
|
17
|
-
* Common (required)
|
|
18
|
-
* @param {string} init.streamId
|
|
19
|
-
* The ID of the stream to open.
|
|
20
|
-
*
|
|
21
17
|
* Provider mode (overload 1)
|
|
22
|
-
* @param {
|
|
18
|
+
* @param {IStreamsPlayerDataProvider} init.dataProvider
|
|
23
19
|
* Provider that supplies the stream data to the player.
|
|
24
20
|
* @param {IMediaCenterConfig} [init.mediaCenterConfig]
|
|
25
21
|
* Optional media-center config.
|
|
@@ -28,10 +24,14 @@ export type { IStreamPlayerDataProvider, IStreamAnalyticsHandler, IMediaCenterCo
|
|
|
28
24
|
* If omitted in provider mode, analytics is not auto-initialized.
|
|
29
25
|
*
|
|
30
26
|
* Internal provider mode (overload 2)
|
|
27
|
+
* @param {string[]} init.ids
|
|
28
|
+
* List of stream IDs to display.
|
|
31
29
|
* @param {string} init.initiator
|
|
32
30
|
* Initiator identifier (used for tracking/analytics and GraphQL).
|
|
33
31
|
* @param {string} [init.graphqlOrigin]
|
|
34
32
|
* Optional GraphQL origin (base URL). If omitted, the default origin is determined internally.
|
|
33
|
+
* @param {string} [init.initialId]
|
|
34
|
+
* ID of the stream to open first (optional).
|
|
35
35
|
* @param {string} [init.mediaPageId]
|
|
36
36
|
* Optional media page ID used to construct an internal media-center config.
|
|
37
37
|
*
|
|
@@ -69,7 +69,6 @@ export type { IStreamPlayerDataProvider, IStreamAnalyticsHandler, IMediaCenterCo
|
|
|
69
69
|
* import { openStreamPlayer } from '@streamscloud/embeddable/stream-player';
|
|
70
70
|
*
|
|
71
71
|
* openStreamPlayer({
|
|
72
|
-
* streamId: 'stream_123',
|
|
73
72
|
* dataProvider: myStreamProvider,
|
|
74
73
|
* mediaCenterConfig: myMediaCenterProvider,
|
|
75
74
|
* analyticsHandler: myAnalyticsHandler,
|
|
@@ -91,8 +90,8 @@ export type { IStreamPlayerDataProvider, IStreamAnalyticsHandler, IMediaCenterCo
|
|
|
91
90
|
* ```ts
|
|
92
91
|
* import { openStreamPlayer } from '@streamscloud/embeddable/stream-player';
|
|
93
92
|
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
93
|
+
* openStreamsPlayer({
|
|
94
|
+
* ids: ['stream_123'],
|
|
96
95
|
* initiator: 'marketing-campaign',
|
|
97
96
|
* graphqlOrigin: 'https://api.example.com',
|
|
98
97
|
* mediaPageId: 'media-page-123',
|
|
@@ -109,14 +108,13 @@ export type { IStreamPlayerDataProvider, IStreamAnalyticsHandler, IMediaCenterCo
|
|
|
109
108
|
* });
|
|
110
109
|
* ```
|
|
111
110
|
*/
|
|
112
|
-
export declare function
|
|
113
|
-
|
|
114
|
-
dataProvider: IStreamPlayerDataProvider;
|
|
111
|
+
export declare function openStreamsPlayer(init: {
|
|
112
|
+
dataProvider: IStreamsPlayerDataProvider;
|
|
115
113
|
mediaCenterConfig?: IMediaCenterConfig;
|
|
116
114
|
postSocialInteractionsHandler?: IPostSocialInteractionsHandler;
|
|
117
115
|
analyticsHandler?: IStreamAnalyticsHandler;
|
|
118
116
|
amplificationParameters?: StreamAmplificationParameters;
|
|
119
|
-
playerSettings?:
|
|
117
|
+
playerSettings?: StreamsPlayerSettings;
|
|
120
118
|
on?: {
|
|
121
119
|
streamActivated?: (data: {
|
|
122
120
|
title: string;
|
|
@@ -125,13 +123,14 @@ export declare function openStreamPlayer(init: {
|
|
|
125
123
|
playerClosed?: () => void;
|
|
126
124
|
};
|
|
127
125
|
}): void;
|
|
128
|
-
export declare function
|
|
129
|
-
|
|
126
|
+
export declare function openStreamsPlayer(init: {
|
|
127
|
+
ids: string[];
|
|
130
128
|
initiator: string;
|
|
131
129
|
graphqlOrigin?: string;
|
|
130
|
+
initialId?: string;
|
|
132
131
|
mediaPageId?: string;
|
|
133
132
|
amplificationParameters?: StreamAmplificationParameters;
|
|
134
|
-
playerSettings?:
|
|
133
|
+
playerSettings?: StreamsPlayerSettings;
|
|
135
134
|
on?: {
|
|
136
135
|
streamActivated?: (data: {
|
|
137
136
|
title: string;
|
|
@@ -4,13 +4,16 @@ import {} from '../../media-center/config/types';
|
|
|
4
4
|
import { MediaCenter } from '../../media-center/media-center';
|
|
5
5
|
import { ModalShadowHost } from '../../ui/shadow-dom';
|
|
6
6
|
import { InternalStreamAnalyticsHandler } from './internal-stream-analytics-handler';
|
|
7
|
-
import {
|
|
8
|
-
import { mapToStreamPlayerModel } from './mapper';
|
|
7
|
+
import { InternalStreamsPlayerDataProvider } from './internal-streams-player-data-provider';
|
|
9
8
|
import { mount, unmount } from 'svelte';
|
|
10
|
-
export {
|
|
11
|
-
export
|
|
12
|
-
|
|
13
|
-
const
|
|
9
|
+
export {};
|
|
10
|
+
export { mapToStreamPlayerModel } from '../data-loaders/mapper';
|
|
11
|
+
export function openStreamsPlayer(init) {
|
|
12
|
+
const { ids, initialId, graphqlOrigin, postSocialInteractionsHandler, initiator, amplificationParameters, playerSettings, on } = init;
|
|
13
|
+
let dataProvider = init.dataProvider;
|
|
14
|
+
if (!dataProvider && ids?.length) {
|
|
15
|
+
dataProvider = new InternalStreamsPlayerDataProvider({ ids, initialId, graphqlOrigin, initiator });
|
|
16
|
+
}
|
|
14
17
|
if (!dataProvider) {
|
|
15
18
|
toastrWarning('Data provider is not specified.');
|
|
16
19
|
return;
|
|
@@ -32,7 +35,6 @@ export function openStreamPlayer(init) {
|
|
|
32
35
|
playerProps: {
|
|
33
36
|
mode: 'stream',
|
|
34
37
|
props: {
|
|
35
|
-
streamId,
|
|
36
38
|
dataProvider,
|
|
37
39
|
analyticsHandler,
|
|
38
40
|
amplificationParameters,
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { IStreamsPlayerDataProvider } from './types';
|
|
2
|
+
export declare class InternalStreamsPlayerDataProvider implements IStreamsPlayerDataProvider {
|
|
3
|
+
initialData: IStreamsPlayerDataProvider['initialData'];
|
|
4
|
+
private ids;
|
|
5
|
+
private idOrder;
|
|
6
|
+
private graphql;
|
|
7
|
+
private dataLoader;
|
|
8
|
+
constructor(input: {
|
|
9
|
+
ids: string[];
|
|
10
|
+
initiator?: string;
|
|
11
|
+
graphqlOrigin?: string;
|
|
12
|
+
initialId?: string;
|
|
13
|
+
});
|
|
14
|
+
loadMoreStreams: IStreamsPlayerDataProvider['loadMoreStreams'];
|
|
15
|
+
getStreamPages: IStreamsPlayerDataProvider['getStreamPages'];
|
|
16
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { ContinuationToken } from '../../core/continuation-token';
|
|
2
|
+
import { CursorDataLoader } from '../../core/data-loaders';
|
|
3
|
+
import { createLocalGQLClient } from '../../core/graphql';
|
|
4
|
+
import { getStreamPagesCursor, getStreamsCursor } from '../data-loaders';
|
|
5
|
+
const CHUNK_SIZE = 5;
|
|
6
|
+
export class InternalStreamsPlayerDataProvider {
|
|
7
|
+
initialData;
|
|
8
|
+
ids;
|
|
9
|
+
idOrder = new Map();
|
|
10
|
+
graphql;
|
|
11
|
+
dataLoader = new CursorDataLoader({
|
|
12
|
+
loadPage: async (continuationToken) => {
|
|
13
|
+
const startIdIndex = continuationToken.value ? parseInt(continuationToken.value, 10) : 0;
|
|
14
|
+
const endIdIndex = Math.min(startIdIndex + CHUNK_SIZE, this.ids.length);
|
|
15
|
+
const idsChunk = this.ids.slice(startIdIndex, endIdIndex);
|
|
16
|
+
try {
|
|
17
|
+
const streams = await getStreamsCursor({
|
|
18
|
+
filter: { ids: idsChunk },
|
|
19
|
+
limit: idsChunk.length,
|
|
20
|
+
graphql: this.graphql
|
|
21
|
+
});
|
|
22
|
+
const items = streams.items.sort((a, b) => {
|
|
23
|
+
const ia = this.idOrder.get(a.id) ?? Number.MAX_SAFE_INTEGER;
|
|
24
|
+
const ib = this.idOrder.get(b.id) ?? Number.MAX_SAFE_INTEGER;
|
|
25
|
+
return ia - ib;
|
|
26
|
+
});
|
|
27
|
+
return {
|
|
28
|
+
items,
|
|
29
|
+
continuationToken: ContinuationToken.fromPayload(endIdIndex < this.ids.length ? endIdIndex.toString() : null)
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
constructor(input) {
|
|
38
|
+
const { ids, initialId, graphqlOrigin, initiator } = input;
|
|
39
|
+
this.graphql = createLocalGQLClient(graphqlOrigin, initiator ? { 'x-initiator': initiator } : undefined);
|
|
40
|
+
this.ids = ids;
|
|
41
|
+
if (initialId && this.ids.includes(initialId)) {
|
|
42
|
+
this.ids = [initialId, ...this.ids.filter((id) => id !== initialId)];
|
|
43
|
+
}
|
|
44
|
+
this.ids.forEach((id, index) => this.idOrder.set(id, index));
|
|
45
|
+
this.initialData = { prefetchedStreams: [] };
|
|
46
|
+
}
|
|
47
|
+
loadMoreStreams = () => this.dataLoader.loadMore();
|
|
48
|
+
getStreamPages = async (streamId, continuationToken) => {
|
|
49
|
+
return await getStreamPagesCursor({
|
|
50
|
+
streamId,
|
|
51
|
+
continuationToken,
|
|
52
|
+
graphql: this.graphql
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
}
|
|
@@ -41,22 +41,25 @@ let { model, buffer, activePageId, on, localization } = $props();
|
|
|
41
41
|
{localization.pagesCount(model.pagesCount)}
|
|
42
42
|
</div>
|
|
43
43
|
</div>
|
|
44
|
+
|
|
44
45
|
<div class="stream-overview-pages">
|
|
45
|
-
|
|
46
|
-
<
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
<
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
46
|
+
{#if buffer.activeChunk}
|
|
47
|
+
<InfiniteScrolling loadMore={buffer.activeChunk.loadMore}>
|
|
48
|
+
<div class="stream-overview-pages__grid">
|
|
49
|
+
{#each buffer.activeChunk.items as item, index (item.id)}
|
|
50
|
+
<button
|
|
51
|
+
type="button"
|
|
52
|
+
class="stream-overview-pages__page"
|
|
53
|
+
class:stream-overview-pages__page--active={activePageId === item.id}
|
|
54
|
+
onclick={() => on.setCurrentItem(index)}>
|
|
55
|
+
<ProportionalContainer ratio={9 / 16}>
|
|
56
|
+
<Image src={item.cover} />
|
|
57
|
+
</ProportionalContainer>
|
|
58
|
+
</button>
|
|
59
|
+
{/each}
|
|
60
|
+
</div>
|
|
61
|
+
</InfiniteScrolling>
|
|
62
|
+
{/if}
|
|
60
63
|
</div>
|
|
61
64
|
|
|
62
65
|
<style>@keyframes fadeIn {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type { StreamPlayerBuffer } from './stream-player-buffer.svelte';
|
|
2
1
|
import { StreamPlayerLocalization } from './stream-player-localization';
|
|
2
|
+
import type { StreamsPlayerBuffer } from './streams-player-buffer.svelte';
|
|
3
3
|
import type { StreamPlayerModel } from './types';
|
|
4
4
|
type Props = {
|
|
5
5
|
model: StreamPlayerModel;
|
|
6
|
-
buffer:
|
|
6
|
+
buffer: StreamsPlayerBuffer;
|
|
7
7
|
activePageId: string;
|
|
8
8
|
localization: StreamPlayerLocalization;
|
|
9
9
|
on: {
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { StreamPageViewerModel } from '../stream-page-viewer';
|
|
2
|
+
import { DefaultChunksPlayerBuffer } from '../../ui/player/providers';
|
|
3
|
+
import type { IStreamsPlayerDataProvider, StreamPlayerModel } from './types';
|
|
4
|
+
export declare class StreamsPlayerBuffer extends DefaultChunksPlayerBuffer<StreamPageViewerModel, StreamPlayerModel> {
|
|
5
|
+
constructor(provider: IStreamsPlayerDataProvider, on?: {
|
|
6
|
+
preloaded?: (self: StreamsPlayerBuffer) => void;
|
|
7
|
+
});
|
|
8
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { DefaultChunksPlayerBuffer } from '../../ui/player/providers';
|
|
2
|
+
export class StreamsPlayerBuffer extends DefaultChunksPlayerBuffer {
|
|
3
|
+
constructor(provider, on) {
|
|
4
|
+
super({
|
|
5
|
+
kind: 'chunks',
|
|
6
|
+
initialData: {
|
|
7
|
+
prefetchedChunks: provider.initialData.prefetchedStreams
|
|
8
|
+
},
|
|
9
|
+
loadMoreChunks: async () => {
|
|
10
|
+
return await provider.loadMoreStreams();
|
|
11
|
+
},
|
|
12
|
+
loadChunkItems: provider.getStreamPages
|
|
13
|
+
}, on);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -11,14 +11,13 @@ var _a;
|
|
|
11
11
|
import { ContentPlayer, ContentPlayerConfig } from '../../content-player';
|
|
12
12
|
import { ContentPlayerSettings } from '../../content-player/content-player-settings';
|
|
13
13
|
import { preloadImage } from '../../core/image-preloader';
|
|
14
|
-
import { toastrWarning } from '../../core/toastr';
|
|
15
14
|
import { mapToPostModel } from '../layout/models';
|
|
16
15
|
import { StreamPageViewer } from '../stream-page-viewer';
|
|
17
16
|
import { default as Overview } from './stream-overview.svelte';
|
|
18
|
-
import { StreamPlayerBuffer } from './stream-player-buffer.svelte';
|
|
19
17
|
import { StreamPlayerLocalization } from './stream-player-localization';
|
|
18
|
+
import { StreamsPlayerBuffer } from './streams-player-buffer.svelte';
|
|
20
19
|
import { untrack } from 'svelte';
|
|
21
|
-
let {
|
|
20
|
+
let { dataProvider, analyticsHandler, postSocialInteractionsHandler, amplificationParameters, playerSettings, on, mediaCenterData } = $props();
|
|
22
21
|
const localization = $derived(new StreamPlayerLocalization((_a = playerSettings === null || playerSettings === void 0 ? void 0 : playerSettings.locale) !== null && _a !== void 0 ? _a : 'en'));
|
|
23
22
|
let currentStreamModel = $state(null);
|
|
24
23
|
let activePageId = $derived.by(() => { var _a, _b; return (_b = (_a = buffer === null || buffer === void 0 ? void 0 : buffer.current) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : ''; });
|
|
@@ -30,22 +29,13 @@ let activityTimeout = null;
|
|
|
30
29
|
let trackingInterval = null;
|
|
31
30
|
let maxPageIndexViewed = 0;
|
|
32
31
|
$effect(() => {
|
|
33
|
-
void
|
|
32
|
+
void dataProvider;
|
|
34
33
|
untrack(() => {
|
|
35
34
|
buffer = null;
|
|
36
35
|
contentPlayerConfig.playerBuffer = null;
|
|
37
|
-
|
|
36
|
+
initPlayerBuffer();
|
|
38
37
|
});
|
|
39
|
-
return () => {
|
|
40
|
-
stopActivityTracking();
|
|
41
|
-
if (currentStreamModel) {
|
|
42
|
-
analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackStreamEngagementTime(currentStreamModel.id, totalEngagementTimeSeconds);
|
|
43
|
-
if (buffer && buffer.loaded.length > 0) {
|
|
44
|
-
let scrollDepth = Math.round(((maxPageIndexViewed + 1) / buffer.loaded.length) * 100);
|
|
45
|
-
analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackStreamScrollDepth(currentStreamModel.id, scrollDepth);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
};
|
|
38
|
+
return () => { };
|
|
49
39
|
});
|
|
50
40
|
$effect(() => contentPlayerConfig.updateMediaCenterData(mediaCenterData));
|
|
51
41
|
$effect(() => contentPlayerConfig.updateTrackingParams(currentStreamModel
|
|
@@ -54,6 +44,31 @@ $effect(() => contentPlayerConfig.updateTrackingParams(currentStreamModel
|
|
|
54
44
|
campaignId: amplificationParameters === null || amplificationParameters === void 0 ? void 0 : amplificationParameters.campaignId
|
|
55
45
|
}
|
|
56
46
|
: null));
|
|
47
|
+
$effect(() => {
|
|
48
|
+
const stream = buffer === null || buffer === void 0 ? void 0 : buffer.activeChunk.model;
|
|
49
|
+
untrack(() => {
|
|
50
|
+
var _a;
|
|
51
|
+
if (stream) {
|
|
52
|
+
currentStreamModel = stream;
|
|
53
|
+
if (stream.organizationId) {
|
|
54
|
+
analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.setOrganizationId(stream.organizationId);
|
|
55
|
+
}
|
|
56
|
+
(_a = on === null || on === void 0 ? void 0 : on.streamActivated) === null || _a === void 0 ? void 0 : _a.call(on, { title: stream.title, image: stream.cover });
|
|
57
|
+
analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackStreamView(stream.id);
|
|
58
|
+
startActivityTracking();
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
return () => {
|
|
62
|
+
stopActivityTracking();
|
|
63
|
+
if (currentStreamModel) {
|
|
64
|
+
analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackStreamEngagementTime(currentStreamModel.id, totalEngagementTimeSeconds);
|
|
65
|
+
let scrollDepth = Math.round(((maxPageIndexViewed + 1) / currentStreamModel.pagesCount) * 100);
|
|
66
|
+
analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackStreamScrollDepth(currentStreamModel.id, scrollDepth);
|
|
67
|
+
}
|
|
68
|
+
totalEngagementTimeSeconds = 0;
|
|
69
|
+
maxPageIndexViewed = 0;
|
|
70
|
+
};
|
|
71
|
+
});
|
|
57
72
|
const streamTrackingParams = $derived.by(() => {
|
|
58
73
|
return currentStreamModel
|
|
59
74
|
? {
|
|
@@ -62,39 +77,20 @@ const streamTrackingParams = $derived.by(() => {
|
|
|
62
77
|
}
|
|
63
78
|
: false;
|
|
64
79
|
});
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
}
|
|
73
|
-
if (stream.organizationId) {
|
|
74
|
-
analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.setOrganizationId(stream.organizationId);
|
|
75
|
-
}
|
|
76
|
-
(_b = on === null || on === void 0 ? void 0 : on.streamActivated) === null || _b === void 0 ? void 0 : _b.call(on, { title: stream.title, image: stream.cover });
|
|
77
|
-
// start tracking the stream
|
|
78
|
-
currentStreamModel = stream;
|
|
79
|
-
new StreamPlayerBuffer({
|
|
80
|
-
streamId,
|
|
81
|
-
dataProvider: dataProvider,
|
|
82
|
-
on: {
|
|
83
|
-
preloaded: (instance) => __awaiter(void 0, void 0, void 0, function* () {
|
|
84
|
-
if (instance.loaded.length) {
|
|
85
|
-
const coverUrl = instance.loaded[0].cover;
|
|
86
|
-
if (coverUrl) {
|
|
87
|
-
yield preloadImage(coverUrl);
|
|
88
|
-
}
|
|
89
|
-
contentPlayerConfig.setBackgroundImageUrl(coverUrl);
|
|
80
|
+
const initPlayerBuffer = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
81
|
+
new StreamsPlayerBuffer(dataProvider, {
|
|
82
|
+
preloaded: (instance) => __awaiter(void 0, void 0, void 0, function* () {
|
|
83
|
+
if (instance.loaded.length) {
|
|
84
|
+
const coverUrl = instance.loaded[0].cover;
|
|
85
|
+
if (coverUrl) {
|
|
86
|
+
yield preloadImage(coverUrl);
|
|
90
87
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
88
|
+
contentPlayerConfig.setBackgroundImageUrl(coverUrl);
|
|
89
|
+
}
|
|
90
|
+
buffer = instance;
|
|
91
|
+
contentPlayerConfig.playerBuffer = instance;
|
|
92
|
+
})
|
|
95
93
|
});
|
|
96
|
-
analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackStreamView(stream.id);
|
|
97
|
-
startActivityTracking();
|
|
98
94
|
});
|
|
99
95
|
const contentPlayerConfig = new ContentPlayerConfig({
|
|
100
96
|
playerBuffer: null,
|
|
@@ -131,37 +127,55 @@ const contentPlayerConfig = new ContentPlayerConfig({
|
|
|
131
127
|
},
|
|
132
128
|
playerSliderCallbacks: {
|
|
133
129
|
itemActivated: (item) => onPageActivated(item),
|
|
134
|
-
itemDeactivated: (itemId) =>
|
|
130
|
+
itemDeactivated: (itemId) => executeWithStreamId((streamId) => {
|
|
131
|
+
analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.reportPageVideoViews(itemId, streamId);
|
|
132
|
+
})
|
|
135
133
|
}
|
|
136
134
|
});
|
|
137
135
|
const handleChangePage = (index) => {
|
|
138
136
|
if (!buffer) {
|
|
139
137
|
return;
|
|
140
138
|
}
|
|
141
|
-
buffer.
|
|
139
|
+
buffer.setActiveChunkItemIndex(index);
|
|
142
140
|
};
|
|
143
141
|
const onPageActivated = (id) => {
|
|
144
|
-
const
|
|
142
|
+
const activeChunk = buffer === null || buffer === void 0 ? void 0 : buffer.activeChunk;
|
|
143
|
+
if (!activeChunk) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const page = activeChunk.items.find((x) => x.id === id);
|
|
145
147
|
contentPlayerConfig.setBackgroundImageUrl((page === null || page === void 0 ? void 0 : page.cover) || null);
|
|
146
148
|
if (page) {
|
|
147
|
-
analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackStreamPageView(id,
|
|
149
|
+
analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackStreamPageView(id, activeChunk.model.id);
|
|
148
150
|
if (page.type === 'short-video' && page.shortVideo) {
|
|
149
151
|
analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackShortVideoView(page.shortVideo.id);
|
|
150
152
|
}
|
|
151
|
-
const currentIndex =
|
|
152
|
-
if (currentIndex
|
|
153
|
+
const currentIndex = activeChunk.items.findIndex((p) => p.id === id);
|
|
154
|
+
if (currentIndex > maxPageIndexViewed) {
|
|
153
155
|
maxPageIndexViewed = currentIndex;
|
|
154
156
|
}
|
|
155
157
|
}
|
|
156
158
|
};
|
|
157
159
|
const onStreamProductClick = (productId) => {
|
|
158
|
-
|
|
160
|
+
executeWithStreamId((streamId) => {
|
|
161
|
+
analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackStreamProductClicked(productId, streamId);
|
|
162
|
+
});
|
|
159
163
|
};
|
|
160
164
|
const onStreamProductImpression = (productId) => {
|
|
161
|
-
|
|
165
|
+
executeWithStreamId((streamId) => {
|
|
166
|
+
analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackStreamProductImpression(productId, streamId);
|
|
167
|
+
});
|
|
162
168
|
};
|
|
163
169
|
const onProgress = (pageId, videoId, progress) => {
|
|
164
|
-
|
|
170
|
+
executeWithStreamId((streamId) => {
|
|
171
|
+
analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackShortVideoProgress(pageId, videoId, progress, streamId);
|
|
172
|
+
});
|
|
173
|
+
};
|
|
174
|
+
const executeWithStreamId = (action) => {
|
|
175
|
+
if (!currentStreamModel) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
action(currentStreamModel.id);
|
|
165
179
|
};
|
|
166
180
|
//#region Activity Tracking
|
|
167
181
|
const resetInactivityTimer = () => {
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { MediaCenterData } from '../../media-center/model/types';
|
|
2
|
+
import type { StreamsPlayerProps } from './types';
|
|
3
|
+
type $$ComponentProps = StreamsPlayerProps & {
|
|
4
|
+
mediaCenterData?: MediaCenterData;
|
|
5
|
+
};
|
|
6
|
+
declare const StreamsPlayerView: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
7
|
+
type StreamsPlayerView = ReturnType<typeof StreamsPlayerView>;
|
|
8
|
+
export default StreamsPlayerView;
|
|
@@ -15,13 +15,12 @@ export type StreamPlayerModel = {
|
|
|
15
15
|
};
|
|
16
16
|
pagesCount: number;
|
|
17
17
|
};
|
|
18
|
-
export type
|
|
19
|
-
|
|
20
|
-
dataProvider: IStreamPlayerDataProvider;
|
|
18
|
+
export type StreamsPlayerProps = {
|
|
19
|
+
dataProvider: IStreamsPlayerDataProvider;
|
|
21
20
|
postSocialInteractionsHandler?: IPostSocialInteractionsHandler;
|
|
22
21
|
analyticsHandler?: IStreamAnalyticsHandler;
|
|
23
22
|
amplificationParameters?: StreamAmplificationParameters;
|
|
24
|
-
playerSettings?:
|
|
23
|
+
playerSettings?: StreamsPlayerSettings;
|
|
25
24
|
on?: {
|
|
26
25
|
streamActivated?: (data: {
|
|
27
26
|
title: string;
|
|
@@ -30,14 +29,17 @@ export type StreamPlayerProps = {
|
|
|
30
29
|
playerClosed?: () => void;
|
|
31
30
|
};
|
|
32
31
|
};
|
|
33
|
-
export type
|
|
32
|
+
export type StreamsPlayerSettings = Pick<IContentPlayerSettingsInitializer, 'disableBackground' | 'hideCloseButton' | 'locale' | 'showStreamsCloudWatermark'>;
|
|
34
33
|
export type StreamAmplificationParameters = {
|
|
35
34
|
campaignId: string;
|
|
36
35
|
campaignName: string;
|
|
37
36
|
source: string;
|
|
38
37
|
};
|
|
39
|
-
export interface
|
|
40
|
-
|
|
38
|
+
export interface IStreamsPlayerDataProvider {
|
|
39
|
+
initialData: {
|
|
40
|
+
prefetchedStreams: StreamPlayerModel[];
|
|
41
|
+
};
|
|
42
|
+
loadMoreStreams: () => Promise<StreamPlayerModel[]>;
|
|
41
43
|
getStreamPages: (streamId: string, continuationToken: string | null | undefined) => Promise<{
|
|
42
44
|
items: StreamPageViewerModel[];
|
|
43
45
|
continuationToken: string | null;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import { IconColor } from '../../icon';
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { PlayerChunkItem } from './player-chunk-item.svelte';
|
|
2
|
+
import type { WithId } from '../types';
|
|
3
|
+
export declare class PlayerChunk<TItem extends WithId, TChunk extends WithId> {
|
|
4
|
+
readonly model: TChunk;
|
|
5
|
+
readonly items: TItem[];
|
|
6
|
+
readonly chunkItems: PlayerChunkItem<TItem>[];
|
|
7
|
+
readonly chunkIndex: number;
|
|
8
|
+
readonly activeChunkItem: PlayerChunkItem<TItem>;
|
|
9
|
+
readonly isEmpty: boolean;
|
|
10
|
+
isFullyLoaded: boolean;
|
|
11
|
+
private _chunkItems;
|
|
12
|
+
private _activeItemIndex;
|
|
13
|
+
private _isLoading;
|
|
14
|
+
private _itemsLoader;
|
|
15
|
+
constructor(data: {
|
|
16
|
+
chunk: TChunk;
|
|
17
|
+
chunkIndex: number;
|
|
18
|
+
provider: {
|
|
19
|
+
loadChunkItems: (chunkId: string, continuationToken: string | null | undefined) => Promise<{
|
|
20
|
+
items: TItem[];
|
|
21
|
+
continuationToken: string | null;
|
|
22
|
+
}>;
|
|
23
|
+
};
|
|
24
|
+
callbacks?: {
|
|
25
|
+
onChunkFullyLoaded: (chunk: PlayerChunk<TItem, TChunk>) => void;
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
loadMore: () => Promise<TItem[]>;
|
|
29
|
+
setActiveItemIndex: (index: number, warmUp?: boolean) => Promise<void>;
|
|
30
|
+
warmUp: () => Promise<void>;
|
|
31
|
+
}
|