@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.
Files changed (137) hide show
  1. package/dist/content-player/cmp.content-player.svelte +1 -1
  2. package/dist/content-player/content-player-config.svelte.d.ts +4 -4
  3. package/dist/content-player/controls-and-attachments.svelte +1 -1
  4. package/dist/content-player/header.svelte +1 -1
  5. package/dist/core/document.event-handlers.d.ts +1 -0
  6. package/dist/core/document.event-handlers.js +3 -0
  7. package/dist/media-center/config/internal-media-center-analytics-handler.d.ts +4 -3
  8. package/dist/media-center/config/internal-media-center-analytics-handler.js +1 -0
  9. package/dist/media-center/config/internal-media-center-config.d.ts +1 -1
  10. package/dist/media-center/config/internal-media-center-config.js +38 -48
  11. package/dist/media-center/config/operations.generated.d.ts +0 -104
  12. package/dist/media-center/config/operations.generated.js +0 -323
  13. package/dist/media-center/config/operations.graphql +0 -24
  14. package/dist/media-center/config/types.d.ts +14 -14
  15. package/dist/media-center/config/types.js +1 -1
  16. package/dist/media-center/media-center/cmp.media-center.svelte +101 -24
  17. package/dist/media-center/media-center/cmp.media-center.svelte.d.ts +5 -5
  18. package/dist/media-center/media-center/discover-panel-handler.svelte.d.ts +5 -4
  19. package/dist/media-center/media-center/discover-panel-handler.svelte.js +2 -1
  20. package/dist/media-center/media-center/discover-panel.svelte +1 -1
  21. package/dist/media-center/media-center/discover-panel.svelte.d.ts +4 -3
  22. package/dist/media-center/media-center/post-player-provider-generator.d.ts +8 -0
  23. package/dist/media-center/media-center/{short-video-resources-generator.js → post-player-provider-generator.js} +9 -3
  24. package/dist/media-center/media-center/streams-in-category-panel-handler.svelte.d.ts +5 -2
  25. package/dist/media-center/media-center/streams-in-category-panel-handler.svelte.js +5 -0
  26. package/dist/media-center/media-center/streams-in-category-panel.svelte +2 -2
  27. package/dist/media-center/media-center/streams-in-category-panel.svelte.d.ts +3 -2
  28. package/dist/media-center/media-center/streams-player-provider-generator.d.ts +8 -0
  29. package/dist/media-center/media-center/streams-player-provider-generator.js +36 -0
  30. package/dist/media-center/media-center/types.d.ts +1 -7
  31. package/dist/posts/controls/cmp.controls.svelte +1 -1
  32. package/dist/posts/data-loaders/index.d.ts +1 -0
  33. package/dist/posts/data-loaders/index.js +1 -0
  34. package/dist/posts/data-loaders/mapper.d.ts +3 -0
  35. package/dist/{short-videos/short-videos-player → posts/data-loaders}/mapper.js +2 -2
  36. package/dist/{short-videos/short-videos-player → posts/data-loaders}/operations.generated.d.ts +6 -6
  37. package/dist/{short-videos/short-videos-player → posts/data-loaders}/operations.generated.js +7 -10
  38. package/dist/posts/data-loaders/operations.graphql +17 -0
  39. package/dist/posts/data-loaders/posts-loader.d.ts +19 -0
  40. package/dist/posts/data-loaders/posts-loader.js +28 -0
  41. package/dist/posts/handlers/index.d.ts +1 -0
  42. package/dist/posts/handlers/index.js +1 -0
  43. package/dist/{short-videos/short-videos-player/internal-short-video-analytics-handler.d.ts → posts/handlers/internal-post-analytics-handler.d.ts} +3 -2
  44. package/dist/{short-videos/short-videos-player/internal-short-video-analytics-handler.js → posts/handlers/internal-post-analytics-handler.js} +2 -1
  45. package/dist/{short-videos/short-videos-player/cmp.short-videos-player.svelte → posts/posts-player/cmp.posts-player.svelte} +3 -3
  46. package/dist/posts/posts-player/cmp.posts-player.svelte.d.ts +4 -0
  47. package/dist/posts/posts-player/index.d.ts +55 -20
  48. package/dist/posts/posts-player/index.js +48 -32
  49. package/dist/posts/posts-player/posts-player-view.svelte +65 -15
  50. package/dist/posts/posts-player/posts-player-view.svelte.d.ts +5 -1
  51. package/dist/posts/posts-player/types.d.ts +9 -3
  52. package/dist/short-videos/data-providers/index.d.ts +1 -0
  53. package/dist/short-videos/data-providers/index.js +1 -0
  54. package/dist/short-videos/data-providers/internal-short-video-player-items-provider.d.ts +17 -0
  55. package/dist/short-videos/{short-videos-player/internal-short-video-player-provider.js → data-providers/internal-short-video-player-items-provider.js} +13 -33
  56. package/dist/short-videos/short-videos-player/index.d.ts +14 -64
  57. package/dist/short-videos/short-videos-player/index.js +77 -31
  58. package/dist/streams/data-loaders/index.d.ts +2 -0
  59. package/dist/streams/data-loaders/index.js +2 -0
  60. package/dist/streams/{stream-player → data-loaders}/mapper.d.ts +1 -1
  61. package/dist/streams/{stream-player → data-loaders}/operations.generated.d.ts +27 -24
  62. package/dist/streams/{stream-player → data-loaders}/operations.generated.js +18 -17
  63. package/dist/streams/{stream-player → data-loaders}/operations.graphql +6 -3
  64. package/dist/streams/data-loaders/stream-pages-loader.d.ts +10 -0
  65. package/dist/streams/data-loaders/stream-pages-loader.js +33 -0
  66. package/dist/streams/data-loaders/streams-loader.d.ts +19 -0
  67. package/dist/streams/data-loaders/streams-loader.js +28 -0
  68. package/dist/streams/{stream-player → streams-player}/index.d.ts +21 -22
  69. package/dist/streams/{stream-player → streams-player}/index.js +9 -7
  70. package/dist/streams/streams-player/internal-streams-player-data-provider.d.ts +16 -0
  71. package/dist/streams/streams-player/internal-streams-player-data-provider.js +55 -0
  72. package/dist/streams/{stream-player → streams-player}/stream-overview.svelte +18 -15
  73. package/dist/streams/{stream-player → streams-player}/stream-overview.svelte.d.ts +2 -2
  74. package/dist/streams/streams-player/streams-player-buffer.svelte.d.ts +8 -0
  75. package/dist/streams/streams-player/streams-player-buffer.svelte.js +15 -0
  76. package/dist/streams/{stream-player/stream-player-view.svelte → streams-player/streams-player-view.svelte} +69 -55
  77. package/dist/streams/streams-player/streams-player-view.svelte.d.ts +8 -0
  78. package/dist/streams/{stream-player → streams-player}/types.d.ts +9 -7
  79. package/dist/ui/{player-button → player/button}/cmp.player-button.svelte +1 -1
  80. package/dist/ui/{player-button → player/button}/cmp.player-button.svelte.d.ts +1 -1
  81. package/dist/ui/{player-button → player/button}/cmp.player-buttons-group.svelte +1 -1
  82. package/dist/ui/{player-button → player/button}/types.d.ts +1 -1
  83. package/dist/ui/player/button/types.js +1 -0
  84. package/dist/ui/player/providers/chunks-player-buffer/index.d.ts +2 -0
  85. package/dist/ui/player/providers/chunks-player-buffer/index.js +2 -0
  86. package/dist/ui/player/providers/chunks-player-buffer/player-chunk-item.svelte.d.ts +11 -0
  87. package/dist/ui/player/providers/chunks-player-buffer/player-chunk-item.svelte.js +11 -0
  88. package/dist/ui/player/providers/chunks-player-buffer/player-chunk.svelte.d.ts +31 -0
  89. package/dist/ui/player/providers/chunks-player-buffer/player-chunk.svelte.js +67 -0
  90. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.d.ts +23 -0
  91. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.js +119 -0
  92. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.d.ts +20 -0
  93. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.js +47 -0
  94. package/dist/ui/player/providers/default-feed-player-buffer.svelte.d.ts +27 -0
  95. package/dist/ui/player/providers/default-feed-player-buffer.svelte.js +78 -0
  96. package/dist/ui/player/providers/index.d.ts +3 -0
  97. package/dist/ui/player/providers/index.js +2 -0
  98. package/dist/ui/player/providers/types.d.ts +49 -0
  99. package/dist/ui/{player-slider → player/slider}/cmp.player-slider.svelte +7 -20
  100. package/dist/ui/{player-slider → player/slider}/cmp.player-slider.svelte.d.ts +4 -4
  101. package/dist/ui/{player-slider → player/slider}/index.d.ts +0 -2
  102. package/dist/ui/{player-slider → player/slider}/index.js +0 -1
  103. package/dist/ui/player/slider/types.d.ts +16 -0
  104. package/dist/ui/swipe-indicator/cmp.swipe-indicator.svelte +7 -8
  105. package/package.json +4 -4
  106. package/dist/media-center/media-center/short-video-resources-generator.d.ts +0 -8
  107. package/dist/short-videos/short-videos-player/cmp.short-videos-player.svelte.d.ts +0 -4
  108. package/dist/short-videos/short-videos-player/internal-short-video-player-provider.d.ts +0 -18
  109. package/dist/short-videos/short-videos-player/mapper.d.ts +0 -3
  110. package/dist/short-videos/short-videos-player/operations.graphql +0 -17
  111. package/dist/short-videos/short-videos-player/short-videos-player-view.svelte +0 -82
  112. package/dist/short-videos/short-videos-player/short-videos-player-view.svelte.d.ts +0 -8
  113. package/dist/short-videos/short-videos-player/types.d.ts +0 -26
  114. package/dist/streams/stream-player/internal-stream-player-data-provider.d.ts +0 -12
  115. package/dist/streams/stream-player/internal-stream-player-data-provider.js +0 -48
  116. package/dist/streams/stream-player/stream-player-buffer.svelte.d.ts +0 -28
  117. package/dist/streams/stream-player/stream-player-buffer.svelte.js +0 -79
  118. package/dist/streams/stream-player/stream-player-view.svelte.d.ts +0 -8
  119. package/dist/ui/player-button/types.js +0 -1
  120. package/dist/ui/player-slider/player-buffer.svelte.d.ts +0 -31
  121. package/dist/ui/player-slider/player-buffer.svelte.js +0 -76
  122. package/dist/ui/player-slider/types.d.ts +0 -26
  123. /package/dist/streams/{stream-player → data-loaders}/mapper.js +0 -0
  124. /package/dist/streams/{stream-player → streams-player}/internal-stream-analytics-handler.d.ts +0 -0
  125. /package/dist/streams/{stream-player → streams-player}/internal-stream-analytics-handler.js +0 -0
  126. /package/dist/streams/{stream-player → streams-player}/stream-player-localization.d.ts +0 -0
  127. /package/dist/streams/{stream-player → streams-player}/stream-player-localization.js +0 -0
  128. /package/dist/{short-videos/short-videos-player → streams/streams-player}/types.js +0 -0
  129. /package/dist/ui/{player-button → player/button}/cmp.player-buttons-group.svelte.d.ts +0 -0
  130. /package/dist/ui/{player-button → player/button}/index.d.ts +0 -0
  131. /package/dist/ui/{player-button → player/button}/index.js +0 -0
  132. /package/dist/{streams/stream-player → ui/player/providers}/types.js +0 -0
  133. /package/dist/ui/{player-slider → player/slider}/prevent-slider-scroll.d.ts +0 -0
  134. /package/dist/ui/{player-slider → player/slider}/prevent-slider-scroll.js +0 -0
  135. /package/dist/ui/{player-slider → player/slider}/types.js +0 -0
  136. /package/dist/ui/{player-slider → player/slider}/wheel-gestures-adapter.d.ts +0 -0
  137. /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 { mapToStreamPlayerModel } from './mapper';
5
- import type { IStreamAnalyticsHandler, IStreamPlayerDataProvider, StreamAmplificationParameters, StreamPlayerModel, StreamPlayerSettings } from './types';
6
- export { type StreamPlayerModel, type StreamPageViewerModel, mapToStreamPlayerModel };
7
- export type { IStreamPlayerDataProvider, IStreamAnalyticsHandler, IMediaCenterConfig };
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 stream player modal.
9
+ * Opens the streams player modal.
10
10
  *
11
11
  * Two overloads (mutually exclusive; enforced by TypeScript):
12
- * - Provider mode: openStreamPlayer({ dataProvider, mediaCenterConfig?, analyticsHandler?, ...common })
13
- * - Internal provider mode: openStreamPlayer({ initiator, graphqlOrigin?, mediaPageId?, ...common })
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 {IStreamPlayerDataProvider} init.dataProvider
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
- * openStreamPlayer({
95
- * streamId: 'stream_123',
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 openStreamPlayer(init: {
113
- streamId: string;
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?: StreamPlayerSettings;
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 openStreamPlayer(init: {
129
- streamId: string;
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?: StreamPlayerSettings;
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 { InternalStreamPlayerDataProvider } from './internal-stream-player-data-provider';
8
- import { mapToStreamPlayerModel } from './mapper';
7
+ import { InternalStreamsPlayerDataProvider } from './internal-streams-player-data-provider';
9
8
  import { mount, unmount } from 'svelte';
10
- export { mapToStreamPlayerModel };
11
- export function openStreamPlayer(init) {
12
- const { streamId, graphqlOrigin, postSocialInteractionsHandler, initiator, amplificationParameters, playerSettings, on } = init;
13
- const dataProvider = init.dataProvider ?? new InternalStreamPlayerDataProvider({ graphqlOrigin, initiator });
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
- <InfiniteScrolling loadMore={buffer.loadMore}>
46
- <div class="stream-overview-pages__grid">
47
- {#each buffer.loaded as item, index (item.id)}
48
- <button
49
- type="button"
50
- class="stream-overview-pages__page"
51
- class:stream-overview-pages__page--active={activePageId === item.id}
52
- onclick={() => on.setCurrentItem(index)}>
53
- <ProportionalContainer ratio={9 / 16}>
54
- <Image src={item.cover} />
55
- </ProportionalContainer>
56
- </button>
57
- {/each}
58
- </div>
59
- </InfiniteScrolling>
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: StreamPlayerBuffer;
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 { streamId, dataProvider, analyticsHandler, postSocialInteractionsHandler, amplificationParameters, playerSettings, on, mediaCenterData } = $props();
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 streamId;
32
+ void dataProvider;
34
33
  untrack(() => {
35
34
  buffer = null;
36
35
  contentPlayerConfig.playerBuffer = null;
37
- initNewStream(streamId);
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 initNewStream = (streamId) => __awaiter(void 0, void 0, void 0, function* () {
66
- var _a, _b;
67
- const stream = yield dataProvider.getStream(streamId);
68
- if (!stream) {
69
- toastrWarning(localization.streamNotFound);
70
- (_a = on === null || on === void 0 ? void 0 : on.playerClosed) === null || _a === void 0 ? void 0 : _a.call(on);
71
- return;
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
- buffer = instance;
92
- contentPlayerConfig.playerBuffer = instance;
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) => analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.reportPageVideoViews(itemId, streamId)
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.setIndex(index);
139
+ buffer.setActiveChunkItemIndex(index);
142
140
  };
143
141
  const onPageActivated = (id) => {
144
- const page = buffer === null || buffer === void 0 ? void 0 : buffer.loaded.find((x) => x.id === id);
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, streamId);
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 = buffer === null || buffer === void 0 ? void 0 : buffer.loaded.findIndex((p) => p.id === id);
152
- if (currentIndex !== undefined && currentIndex > maxPageIndexViewed) {
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
- analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackStreamProductClicked(productId, streamId);
160
+ executeWithStreamId((streamId) => {
161
+ analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackStreamProductClicked(productId, streamId);
162
+ });
159
163
  };
160
164
  const onStreamProductImpression = (productId) => {
161
- analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackStreamProductImpression(productId, streamId);
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
- analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackShortVideoProgress(pageId, videoId, progress, streamId);
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 StreamPlayerProps = {
19
- streamId: string;
20
- dataProvider: IStreamPlayerDataProvider;
18
+ export type StreamsPlayerProps = {
19
+ dataProvider: IStreamsPlayerDataProvider;
21
20
  postSocialInteractionsHandler?: IPostSocialInteractionsHandler;
22
21
  analyticsHandler?: IStreamAnalyticsHandler;
23
22
  amplificationParameters?: StreamAmplificationParameters;
24
- playerSettings?: StreamPlayerSettings;
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 StreamPlayerSettings = Pick<IContentPlayerSettingsInitializer, 'disableBackground' | 'hideCloseButton' | 'locale' | 'showStreamsCloudWatermark'>;
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 IStreamPlayerDataProvider {
40
- getStream: (streamId: string) => Promise<StreamPlayerModel | null>;
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;
@@ -1,4 +1,4 @@
1
- <script lang="ts">import { Icon, IconColor } from '../icon';
1
+ <script lang="ts">import { Icon, IconColor } from '../../icon';
2
2
  let { icon, iconColor, scaleEffect = false, disabled = false, on } = $props();
3
3
  </script>
4
4
 
@@ -1,4 +1,4 @@
1
- import { IconColor } from '../icon';
1
+ import { IconColor } from '../../icon';
2
2
  type Props = {
3
3
  icon: string;
4
4
  iconColor?: IconColor;
@@ -1,4 +1,4 @@
1
- <script lang="ts">import { Icon } from '../icon';
1
+ <script lang="ts">import { Icon } from '../../icon';
2
2
  let { scaleEffect = false, actions } = $props();
3
3
  </script>
4
4
 
@@ -1,4 +1,4 @@
1
- import { IconColor } from '../icon';
1
+ import { IconColor } from '../../icon';
2
2
  export type PlayerButtonsGroupAction = {
3
3
  icon: string;
4
4
  iconColor?: IconColor;
@@ -0,0 +1 @@
1
+ import { IconColor } from '../../icon';
@@ -0,0 +1,2 @@
1
+ export { PlayerChunk } from './player-chunk.svelte';
2
+ export { PlayerChunksManager } from './player-chunks-manager.svelte';
@@ -0,0 +1,2 @@
1
+ export { PlayerChunk } from './player-chunk.svelte';
2
+ export { PlayerChunksManager } from './player-chunks-manager.svelte';
@@ -0,0 +1,11 @@
1
+ import type { WithId } from '../types';
2
+ export declare class PlayerChunkItem<T extends WithId> {
3
+ model: T;
4
+ chunkId: string;
5
+ indexWithinChunk: number;
6
+ constructor(init: {
7
+ model: T;
8
+ indexWithinChunk: number;
9
+ chunkId: string;
10
+ });
11
+ }
@@ -0,0 +1,11 @@
1
+ export class PlayerChunkItem {
2
+ model;
3
+ chunkId;
4
+ indexWithinChunk;
5
+ constructor(init) {
6
+ const { model, indexWithinChunk, chunkId } = init;
7
+ this.model = model;
8
+ this.indexWithinChunk = indexWithinChunk;
9
+ this.chunkId = chunkId;
10
+ }
11
+ }
@@ -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
+ }