@streamscloud/embeddable 12.2.0 → 13.0.1

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 (162) hide show
  1. package/dist/content-player/content-player-config.svelte.d.ts +2 -13
  2. package/dist/content-player/content-player-config.svelte.js +1 -1
  3. package/dist/content-player/content-player-settings.svelte.d.ts +16 -0
  4. package/dist/content-player/content-player-settings.svelte.js +27 -0
  5. package/dist/content-player/index.d.ts +1 -0
  6. package/dist/content-player/index.js +1 -0
  7. package/dist/core/theme/index.d.ts +1 -0
  8. package/dist/core/theme/theme-store.svelte.d.ts +3 -2
  9. package/dist/external-api/data-providers/index.d.ts +6 -0
  10. package/dist/external-api/data-providers/index.js +6 -0
  11. package/dist/external-api/data-providers/internal-media-center-data-provider.svelte.d.ts +15 -0
  12. package/dist/{media-center/config/internal-media-center-config.js → external-api/data-providers/internal-media-center-data-provider.svelte.js} +33 -17
  13. package/dist/{posts/handlers → external-api/data-providers}/internal-post-analytics-handler.d.ts +1 -1
  14. package/dist/{short-videos → external-api}/data-providers/internal-short-video-player-items-provider.js +1 -1
  15. package/dist/{streams/streams-player → external-api/data-providers}/internal-stream-analytics-handler.d.ts +1 -1
  16. package/dist/{streams/streams-player → external-api/data-providers}/internal-streams-player-data-provider.d.ts +1 -1
  17. package/dist/{streams/streams-player → external-api/data-providers}/internal-streams-player-data-provider.js +1 -1
  18. package/dist/{media-center/config → external-api/data-providers}/operations.generated.d.ts +6 -0
  19. package/dist/{media-center/config → external-api/data-providers}/operations.generated.js +13 -0
  20. package/dist/{media-center/config → external-api/data-providers}/operations.graphql +6 -0
  21. package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/mapper.d.ts +1 -1
  22. package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/mapper.js +2 -2
  23. package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/operations.generated.d.ts +1 -1
  24. package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/posts-loader.d.ts +2 -2
  25. package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/posts-loader.js +1 -1
  26. package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/mapper.d.ts +1 -1
  27. package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/mapper.js +1 -1
  28. package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/operations.generated.d.ts +1 -1
  29. package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/stream-pages-loader.d.ts +1 -1
  30. package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/stream-pages-loader.js +2 -2
  31. package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/streams-loader.d.ts +2 -2
  32. package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/streams-loader.js +1 -1
  33. package/dist/external-api/index.d.ts +3 -0
  34. package/dist/external-api/index.js +3 -0
  35. package/dist/external-api/media-page/index.d.ts +83 -0
  36. package/dist/external-api/media-page/index.js +82 -0
  37. package/dist/{short-videos → external-api}/short-videos-player/index.d.ts +27 -12
  38. package/dist/{short-videos → external-api}/short-videos-player/index.js +35 -28
  39. package/dist/external-api/streams-player/index.d.ts +105 -0
  40. package/dist/external-api/streams-player/index.js +110 -0
  41. package/dist/media-center/config/types.d.ts +28 -27
  42. package/dist/media-center/index.d.ts +3 -1
  43. package/dist/media-center/media-center/cmp.media-center-proxy.svelte +4 -4
  44. package/dist/media-center/media-center/cmp.media-center-proxy.svelte.d.ts +7 -4
  45. package/dist/media-center/media-center/discover/community-features-localization.d.ts +8 -0
  46. package/dist/media-center/media-center/discover/community-features-localization.js +31 -0
  47. package/dist/media-center/media-center/discover/community-features.svelte +171 -0
  48. package/dist/media-center/media-center/discover/community-features.svelte.d.ts +11 -0
  49. package/dist/media-center/media-center/discover/data-loading.d.ts +3 -3
  50. package/dist/media-center/media-center/discover/data-loading.js +5 -5
  51. package/dist/media-center/media-center/discover/discover-header.svelte +7 -56
  52. package/dist/media-center/media-center/discover/discover-view-handler.svelte.d.ts +3 -3
  53. package/dist/media-center/media-center/discover/discover-view-handler.svelte.js +4 -4
  54. package/dist/media-center/media-center/feed/feed-handler.svelte.d.ts +5 -3
  55. package/dist/media-center/media-center/feed/feed-handler.svelte.js +18 -10
  56. package/dist/media-center/media-center/feed/feed-providers-generator.d.ts +11 -5
  57. package/dist/media-center/media-center/feed/feed-providers-generator.js +13 -9
  58. package/dist/media-center/media-center/footer/index.d.ts +1 -0
  59. package/dist/media-center/media-center/footer/index.js +1 -0
  60. package/dist/media-center/media-center/handlers/categories-handler.svelte.d.ts +3 -5
  61. package/dist/media-center/media-center/handlers/categories-handler.svelte.js +16 -13
  62. package/dist/media-center/media-center/handlers/media-center-settings-handler.svelte.d.ts +18 -7
  63. package/dist/media-center/media-center/handlers/media-center-settings-handler.svelte.js +18 -25
  64. package/dist/media-center/media-center/{header-footer → header}/index.d.ts +0 -1
  65. package/dist/media-center/media-center/{header-footer → header}/index.js +0 -1
  66. package/dist/media-center/media-center/{header-footer → header}/media-center-header.svelte +138 -31
  67. package/dist/media-center/media-center/{header-footer → header}/media-center-header.svelte.d.ts +2 -0
  68. package/dist/media-center/media-center/index.d.ts +1 -0
  69. package/dist/media-center/media-center/index.js +1 -0
  70. package/dist/media-center/media-center/media-center-context.svelte.d.ts +15 -9
  71. package/dist/media-center/media-center/media-center-context.svelte.js +57 -19
  72. package/dist/media-center/media-center/media-center-settings.svelte.d.ts +11 -0
  73. package/dist/media-center/media-center/media-center-settings.svelte.js +23 -0
  74. package/dist/media-center/media-center/media-center-view.svelte +11 -3
  75. package/dist/media-center/media-center/media-center-view.svelte.d.ts +2 -0
  76. package/dist/media-center/media-center/menu/category-following-wrapper.svelte.d.ts +1 -1
  77. package/dist/media-center/media-center/menu/menu.svelte +15 -14
  78. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.d.ts +3 -3
  79. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.js +4 -4
  80. package/dist/media-center/media-center/moments/cmp.moments-circle.svelte +22 -9
  81. package/dist/media-center/media-center/moments/index.d.ts +1 -0
  82. package/dist/media-center/media-center/moments/index.js +1 -0
  83. package/dist/media-center/media-center/moments/moments-feed-handler.svelte.d.ts +26 -0
  84. package/dist/media-center/media-center/moments/moments-feed-handler.svelte.js +49 -0
  85. package/dist/media-center/media-center/moments/moments-state.svelte.d.ts +20 -0
  86. package/dist/media-center/media-center/moments/moments-state.svelte.js +82 -0
  87. package/dist/media-center/media-center/streams-in-category/streams-in-category-panel-handler.svelte.d.ts +3 -3
  88. package/dist/media-center/media-center/streams-in-category/streams-in-category-panel-handler.svelte.js +4 -4
  89. package/dist/media-center/media-center/types.d.ts +3 -3
  90. package/dist/media-center/membership/index.d.ts +1 -0
  91. package/dist/media-center/membership/index.js +1 -0
  92. package/dist/media-center/membership/mock-membership-handler.svelte.d.ts +10 -0
  93. package/dist/media-center/membership/mock-membership-handler.svelte.js +21 -0
  94. package/dist/media-center/membership/types.d.ts +10 -0
  95. package/dist/media-center/membership/types.js +1 -0
  96. package/dist/media-center/navigation/index.d.ts +2 -0
  97. package/dist/media-center/navigation/index.js +1 -0
  98. package/dist/media-center/navigation/media-center-state.d.ts +19 -0
  99. package/dist/media-center/navigation/media-center-state.js +1 -0
  100. package/dist/media-center/navigation/mock-navigation-handler.svelte.d.ts +6 -0
  101. package/dist/media-center/navigation/mock-navigation-handler.svelte.js +6 -0
  102. package/dist/media-center/navigation/types.d.ts +5 -0
  103. package/dist/media-center/navigation/types.js +1 -0
  104. package/dist/media-page/cmp.media-page.svelte +10 -4
  105. package/dist/media-page/cmp.media-page.svelte.d.ts +6 -5
  106. package/dist/media-page/index.d.ts +40 -58
  107. package/dist/media-page/index.js +129 -16
  108. package/dist/posts/posts-player/index.d.ts +31 -33
  109. package/dist/posts/posts-player/index.js +90 -35
  110. package/dist/posts/posts-player/posts-player-view.svelte +1 -1
  111. package/dist/posts/posts-player/types.d.ts +2 -1
  112. package/dist/streams/layout/styles-transformer.d.ts +1 -1
  113. package/dist/streams/streams-player/index.d.ts +17 -83
  114. package/dist/streams/streams-player/index.js +84 -64
  115. package/dist/streams/streams-player/streams-player-buffer.svelte.js +2 -1
  116. package/dist/streams/streams-player/streams-player-view.svelte +1 -1
  117. package/dist/streams/streams-player/types.d.ts +3 -1
  118. package/dist/ui/button/cmp.options-button.svelte +123 -0
  119. package/dist/ui/button/cmp.options-button.svelte.d.ts +20 -0
  120. package/dist/ui/button/index.d.ts +1 -0
  121. package/dist/ui/button/index.js +1 -0
  122. package/dist/ui/button/resources/button-theme.svelte +16 -2
  123. package/dist/ui/player/colors/index.d.ts +1 -1
  124. package/dist/ui/player/colors/index.js +1 -1
  125. package/dist/ui/player/colors/player-colors.d.ts +14 -1
  126. package/dist/ui/player/colors/player-colors.js +24 -1
  127. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.d.ts +1 -0
  128. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.js +7 -1
  129. package/dist/ui/player/providers/default-feed-player-buffer.svelte.d.ts +1 -0
  130. package/dist/ui/player/providers/default-feed-player-buffer.svelte.js +7 -1
  131. package/dist/ui/player/providers/types.d.ts +3 -1
  132. package/dist/ui/shadow-dom/cmp.shadow-root.svelte +6 -4
  133. package/dist/ui/shadow-dom/colors.scss +6 -4
  134. package/package.json +5 -1
  135. package/dist/content-player/content-player-settings.d.ts +0 -12
  136. package/dist/content-player/content-player-settings.js +0 -23
  137. package/dist/media-center/config/internal-media-center-config.d.ts +0 -14
  138. package/dist/media-center/media-center/discover/discover-header-localization.d.ts +0 -6
  139. package/dist/media-center/media-center/discover/discover-header-localization.js +0 -15
  140. package/dist/posts/handlers/index.d.ts +0 -1
  141. package/dist/posts/handlers/index.js +0 -1
  142. package/dist/short-videos/data-providers/index.d.ts +0 -1
  143. package/dist/short-videos/data-providers/index.js +0 -1
  144. /package/dist/{media-center/config → external-api/data-providers}/internal-media-center-analytics-handler.d.ts +0 -0
  145. /package/dist/{media-center/config → external-api/data-providers}/internal-media-center-analytics-handler.js +0 -0
  146. /package/dist/{posts/handlers → external-api/data-providers}/internal-post-analytics-handler.js +0 -0
  147. /package/dist/{short-videos → external-api}/data-providers/internal-short-video-player-items-provider.d.ts +0 -0
  148. /package/dist/{streams/streams-player → external-api/data-providers}/internal-stream-analytics-handler.js +0 -0
  149. /package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/index.d.ts +0 -0
  150. /package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/index.js +0 -0
  151. /package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/operations.generated.js +0 -0
  152. /package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/operations.graphql +0 -0
  153. /package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/index.d.ts +0 -0
  154. /package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/index.js +0 -0
  155. /package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/operations.generated.js +0 -0
  156. /package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/operations.graphql +0 -0
  157. /package/dist/media-center/media-center/{header-footer → footer}/media-center-footer.svelte +0 -0
  158. /package/dist/media-center/media-center/{header-footer → footer}/media-center-footer.svelte.d.ts +0 -0
  159. /package/dist/media-center/media-center/{header-footer → header}/media-center-header-localization.d.ts +0 -0
  160. /package/dist/media-center/media-center/{header-footer → header}/media-center-header-localization.js +0 -0
  161. /package/dist/media-center/media-center/{header-footer → header}/media-center-header-mobile.svelte +0 -0
  162. /package/dist/media-center/media-center/{header-footer → header}/media-center-header-mobile.svelte.d.ts +0 -0
@@ -12,7 +12,7 @@ import IconChevronRightFilled from '@fluentui/svg-icons/icons/chevron_right_20_f
12
12
  import { slide } from 'svelte/transition';
13
13
  let { context, on } = $props();
14
14
  const localization = $derived(new MenuLocalization(context.locale));
15
- const target = $derived.by(() => context.targetData);
15
+ const target = $derived.by(() => context.model);
16
16
  const generateCategoriesMap = () => {
17
17
  const expanded = {};
18
18
  context.categoriesHandler.categoriesGrouped.forEach((c) => {
@@ -23,15 +23,15 @@ const generateCategoriesMap = () => {
23
23
  return expanded;
24
24
  };
25
25
  const categoriesExpandedMap = $state(generateCategoriesMap());
26
+ const indicateActiveCategory = $derived(context.mediaCenterMode !== 'moments');
26
27
  const handleCategoryExpaned = (e, categoryId) => {
27
28
  e.stopPropagation();
28
29
  categoriesExpandedMap[categoryId] = !categoriesExpandedMap[categoryId];
29
30
  };
30
31
  const styles = $derived.by(() => {
31
- var _a;
32
32
  const values = [];
33
- if ((_a = context.playerColors) === null || _a === void 0 ? void 0 : _a.menuBackground) {
34
- values.push(`--media-center-menu--background-color: ${context.playerColors.menuBackground}`);
33
+ if (context.mediaCenterColors.menuBackground) {
34
+ values.push(`--media-center-menu--background-color: ${context.mediaCenterColors.menuBackground}`);
35
35
  }
36
36
  return values.join(';');
37
37
  });
@@ -49,14 +49,14 @@ const styles = $derived.by(() => {
49
49
  {target.name}
50
50
  </LineClamp>
51
51
  </div>
52
- {#if target.membersCount}
52
+ {#if target.communityFeatures && target.communityFeatures.membersCount}
53
53
  <LineClamp maxLines={1} locale={context.locale}>
54
54
  <div class="media-center-target__members">
55
55
  <span class="media-center-target__members-count">
56
- {compactNumber(target.membersCount, { locale: localization.locale })}
56
+ {compactNumber(target.communityFeatures.membersCount, { locale: localization.locale })}
57
57
  </span>
58
58
  <span class="media-center-target__members-label">
59
- {localization.membersLabel(target.membersCount)}
59
+ {localization.membersLabel(target.communityFeatures.membersCount)}
60
60
  </span>
61
61
  </div>
62
62
  </LineClamp>
@@ -71,7 +71,7 @@ const styles = $derived.by(() => {
71
71
  <div class="media-center-menu__tree">
72
72
  <div class="media-center-menu__tree-item">
73
73
  <div class="menu-item" class:menu-item--active={!context.categoriesHandler.selectedCategoryId}>
74
- <div class="menu-item__value" onclick={() => context.playRootFeed()} onkeydown={() => {}} role="button" tabindex="0">
74
+ <div class="menu-item__content" onclick={() => context.playRootFeed()} onkeydown={() => {}} role="button" tabindex="0">
75
75
  <div class="menu-item__text" class:menu-item__text--active={!context.categoriesHandler.selectedCategoryId}>
76
76
  {context.mediaCenterMode === 'discover' ? localization.discoverLabel : localization.feedLabel}
77
77
  </div>
@@ -82,12 +82,14 @@ const styles = $derived.by(() => {
82
82
  <div
83
83
  class="menu-item"
84
84
  class:menu-item--child={category.type === 'child'}
85
- class:menu-item--active={context.categoriesHandler.selectedCategoryId === category.value.id}>
86
- <div class="menu-item__value" onclick={() => on.categorySelected(category.value.id)} onkeydown={() => {}} role="button" tabindex="0">
85
+ class:menu-item--active={context.categoriesHandler.selectedCategoryId === category.value.id && indicateActiveCategory}>
86
+ <div class="menu-item__content" onclick={() => on.categorySelected(category.value.id)} onkeydown={() => {}} role="button" tabindex="0">
87
87
  <div class="menu-item__image">
88
88
  <ImageRound src={category.value.image} noBorders={true} />
89
89
  </div>
90
- <div class="menu-item__text" class:menu-item__text--active={context.categoriesHandler.selectedCategoryId === category.value.id}>
90
+ <div
91
+ class="menu-item__text"
92
+ class:menu-item__text--active={context.categoriesHandler.selectedCategoryId === category.value.id && indicateActiveCategory}>
91
93
  {category.value.name}
92
94
  </div>
93
95
  {#if category.value.tag}
@@ -96,7 +98,7 @@ const styles = $derived.by(() => {
96
98
  </div>
97
99
  {/if}
98
100
  </div>
99
- <ButtonWrapper categoryId={category.value.id} followingHandler={context.categoryFollowingHandler} invertedOrientation={true}>
101
+ <ButtonWrapper categoryId={category.value.id} followingHandler={context.categoriesFollowingHandler} invertedOrientation={true}>
100
102
  <button
101
103
  type="button"
102
104
  class="menu-item__collapser"
@@ -255,7 +257,7 @@ const styles = $derived.by(() => {
255
257
  --_menu-item--text--font-size: 0.875rem;
256
258
  --_menu-item--image--size: 1.375rem;
257
259
  }
258
- .menu-item__value {
260
+ .menu-item__content {
259
261
  display: flex;
260
262
  align-items: center;
261
263
  flex: 1;
@@ -291,7 +293,6 @@ const styles = $derived.by(() => {
291
293
  }
292
294
  .menu-item__tag {
293
295
  height: min-content;
294
- width: min-content;
295
296
  border-radius: 0.25rem;
296
297
  padding: 0.3125rem 0.375rem;
297
298
  font-size: 0.5rem;
@@ -1,10 +1,10 @@
1
- import type { IMediaCenterConfig } from '../..';
1
+ import type { IMediaCenterDataProvider } from '../..';
2
2
  import type { StreamPlayerModel } from '../../../streams/streams-player/types';
3
3
  export declare class PopularStreamsPanelHandler {
4
- private readonly config;
4
+ private readonly dataProvider;
5
5
  private _state;
6
6
  private _streams;
7
- constructor(config: IMediaCenterConfig);
7
+ constructor(dataProvider: IMediaCenterDataProvider);
8
8
  get streamSectionItems(): StreamPlayerModel[];
9
9
  init: () => Promise<void>;
10
10
  }
@@ -1,9 +1,9 @@
1
1
  export class PopularStreamsPanelHandler {
2
- config;
2
+ dataProvider;
3
3
  _state = $state('not-initialized');
4
4
  _streams = $state.raw([]);
5
- constructor(config) {
6
- this.config = config;
5
+ constructor(dataProvider) {
6
+ this.dataProvider = dataProvider;
7
7
  }
8
8
  get streamSectionItems() {
9
9
  return this._streams;
@@ -12,7 +12,7 @@ export class PopularStreamsPanelHandler {
12
12
  if (this._state === 'not-initialized') {
13
13
  this._state = 'loading';
14
14
  try {
15
- const streamsResponse = await this.config.streamPlayer.getStreamsCursor({ filter: {}, limit: 2 });
15
+ const streamsResponse = await this.dataProvider.streamPlayer.getStreamsCursor({ filter: {}, limit: 2 });
16
16
  this._streams = streamsResponse.items;
17
17
  }
18
18
  finally {
@@ -1,22 +1,30 @@
1
- <script lang="ts">import { Theme } from '../../../core/theme';
2
- import { ImageRound } from '../../../ui/image';
1
+ <script lang="ts">import { ImageRound } from '../../../ui/image';
3
2
  let { context } = $props();
3
+ const handler = context.momentsFeedHandler;
4
4
  const styles = $derived.by(() => {
5
- var _a;
6
5
  const values = [];
7
- if ((_a = context.playerColors) === null || _a === void 0 ? void 0 : _a.brand) {
8
- values.push(`--moments-circle--brand-color: ${context.playerColors.brand}`);
6
+ if (context.mediaCenterColors.brand) {
7
+ values.push(`--moments-circle--brand-color: ${context.mediaCenterColors.brand}`);
9
8
  }
10
9
  return values.join(';');
11
10
  });
12
11
  const handleClick = () => {
13
- Theme.toggle();
12
+ if (!handler.hasMoments) {
13
+ return;
14
+ }
15
+ context.playMoments();
14
16
  };
15
17
  </script>
16
18
 
17
- <div class="moments-circle" style={styles} onclick={handleClick} onkeydown={() => {}} role="none">
18
- {#if context.targetData}
19
- <ImageRound src={context.targetData.image} />
19
+ <div
20
+ class="moments-circle"
21
+ class:moments-circle--clickable={handler.hasMoments}
22
+ class:moments-circle--has-unwatched={handler.hasUnwatchedMoments}
23
+ style={styles}
24
+ onclick={handleClick}
25
+ role="none">
26
+ {#if context.model}
27
+ <ImageRound src={context.model.image} noBorders={!handler.hasUnwatchedMoments} />
20
28
  {/if}
21
29
  </div>
22
30
 
@@ -39,7 +47,12 @@ const handleClick = () => {
39
47
  height: 6.25%rem;
40
48
  min-height: 6.25%rem;
41
49
  max-height: 6.25%rem;
50
+ }
51
+ .moments-circle--has-unwatched {
42
52
  --image--rounded--inner--border-width: 1px;
43
53
  --image--rounded--outer--border-color: var(--_moments-circle--brand-color);
44
54
  --image--rounded--outer--border-width: 2px;
55
+ }
56
+ .moments-circle--clickable {
57
+ cursor: pointer;
45
58
  }</style>
@@ -1 +1,2 @@
1
1
  export { default as MomentsCircle } from './cmp.moments-circle.svelte';
2
+ export { MomentsFeedHandler } from './moments-feed-handler.svelte';
@@ -1 +1,2 @@
1
1
  export { default as MomentsCircle } from './cmp.moments-circle.svelte';
2
+ export { MomentsFeedHandler } from './moments-feed-handler.svelte';
@@ -0,0 +1,26 @@
1
+ import type { IMediaCenterDataProvider } from '../..';
2
+ import type { PostsPlayerProps } from '../../../posts/posts-player/types';
3
+ import type { ICloseOrchestrator } from '../../../ui/player/close-orchestrator';
4
+ import { MomentsState } from './moments-state.svelte';
5
+ import { MediaCenterSettingsHandler } from '../handlers';
6
+ export declare class MomentsFeedHandler {
7
+ momentsState: MomentsState;
8
+ private _active;
9
+ private _momentsPlayerProps;
10
+ private _dataProvider;
11
+ private _mediaCenterSettingsHandler;
12
+ private _closeOrchestrator;
13
+ private _onPlayerReachedEnd;
14
+ constructor(data: {
15
+ dataProvider: IMediaCenterDataProvider;
16
+ mediaCenterSettingsHandler: MediaCenterSettingsHandler;
17
+ closeOrchestrator: ICloseOrchestrator;
18
+ onPlayerReachedEnd: () => void;
19
+ });
20
+ get active(): boolean;
21
+ get momentsPlayerProps(): PostsPlayerProps | null;
22
+ get hasUnwatchedMoments(): boolean;
23
+ get hasMoments(): boolean;
24
+ deactivate: () => void;
25
+ activateMoments: () => Promise<void>;
26
+ }
@@ -0,0 +1,49 @@
1
+ import { initBufferFromProvider } from '../../../ui/player/providers/service';
2
+ import { MomentsState } from './moments-state.svelte';
3
+ import { MediaCenterSettingsHandler } from '../handlers';
4
+ export class MomentsFeedHandler {
5
+ momentsState;
6
+ _active = $state(false);
7
+ _momentsPlayerProps = $state.raw(null);
8
+ _dataProvider;
9
+ _mediaCenterSettingsHandler;
10
+ _closeOrchestrator;
11
+ _onPlayerReachedEnd;
12
+ constructor(data) {
13
+ const { dataProvider, mediaCenterSettingsHandler, closeOrchestrator, onPlayerReachedEnd } = data;
14
+ this.momentsState = new MomentsState(dataProvider);
15
+ this._mediaCenterSettingsHandler = mediaCenterSettingsHandler;
16
+ this._dataProvider = dataProvider;
17
+ this._closeOrchestrator = closeOrchestrator;
18
+ this._onPlayerReachedEnd = onPlayerReachedEnd;
19
+ }
20
+ get active() {
21
+ return this._active;
22
+ }
23
+ get momentsPlayerProps() {
24
+ return this._momentsPlayerProps;
25
+ }
26
+ get hasUnwatchedMoments() {
27
+ return this.momentsState.unwatchedMoments.length > 0;
28
+ }
29
+ get hasMoments() {
30
+ return this.momentsState.allMoments.length > 0;
31
+ }
32
+ deactivate = () => {
33
+ this._active = false;
34
+ };
35
+ activateMoments = async () => {
36
+ this._momentsPlayerProps = {
37
+ dataProvider: { type: 'buffer', buffer: initBufferFromProvider(this.momentsState.generatePlayerDataProvider(this._onPlayerReachedEnd)) },
38
+ socialInteractionsHandler: this._dataProvider.handlers?.socialInteractionsHandler,
39
+ analyticsHandler: this._dataProvider.handlers?.analyticsHandler,
40
+ playerSettings: this._mediaCenterSettingsHandler.playerSettings,
41
+ closeOrchestrator: this._closeOrchestrator,
42
+ on: {
43
+ postActivated: (id) => this.momentsState.markMomentAsSeen(id),
44
+ backgroundImageLoaded: this._mediaCenterSettingsHandler.backgroundImageLoadedHandler
45
+ }
46
+ };
47
+ this._active = true;
48
+ };
49
+ }
@@ -0,0 +1,20 @@
1
+ import type { IMediaCenterDataProvider } from '../..';
2
+ import { type PostPlayerModel } from '../../../posts/posts-player';
3
+ import type { IChunksPlayerDataProvider } from '../../../ui/player/providers';
4
+ export declare class MomentsState {
5
+ private readonly dataProvider;
6
+ private momentsSeenLocally;
7
+ constructor(dataProvider: IMediaCenterDataProvider);
8
+ get allMoments(): {
9
+ id: string;
10
+ cover: string;
11
+ isSeen: boolean;
12
+ }[];
13
+ get unwatchedMoments(): {
14
+ id: string;
15
+ cover: string;
16
+ isSeen: boolean;
17
+ }[];
18
+ markMomentAsSeen: (momentId: string) => void;
19
+ generatePlayerDataProvider: (onEndReached: () => void) => IChunksPlayerDataProvider<PostPlayerModel>;
20
+ }
@@ -0,0 +1,82 @@
1
+ import { PostType } from '../../../core/enums';
2
+ import {} from '../../../posts/posts-player';
3
+ export class MomentsState {
4
+ dataProvider;
5
+ momentsSeenLocally = $state.raw([]);
6
+ constructor(dataProvider) {
7
+ this.dataProvider = dataProvider;
8
+ }
9
+ get allMoments() {
10
+ return this.dataProvider.model?.moments ?? [];
11
+ }
12
+ get unwatchedMoments() {
13
+ return this.allMoments.filter((s) => !s.isSeen && !this.momentsSeenLocally.includes(s.id));
14
+ }
15
+ markMomentAsSeen = (momentId) => {
16
+ if (!this.momentsSeenLocally.includes(momentId)) {
17
+ this.momentsSeenLocally = [...this.momentsSeenLocally, momentId];
18
+ }
19
+ };
20
+ generatePlayerDataProvider = (onEndReached) => {
21
+ const collectionCapacity = 5;
22
+ const sortedMoments = [...this.allMoments].sort((a, b) => {
23
+ const aUnwatched = !a.isSeen && !this.momentsSeenLocally.includes(a.id);
24
+ const bUnwatched = !b.isSeen && !this.momentsSeenLocally.includes(b.id);
25
+ if (aUnwatched === bUnwatched) {
26
+ return 0;
27
+ }
28
+ return aUnwatched ? -1 : 1;
29
+ });
30
+ const ids = sortedMoments.map((m) => m.id);
31
+ const idOrder = new Map();
32
+ ids.forEach((id, idx) => idOrder.set(id, idx));
33
+ const chunksCount = Math.ceil(sortedMoments.length / collectionCapacity);
34
+ const prefetchedChunks = [];
35
+ for (let i = 1; i <= chunksCount; i++) {
36
+ prefetchedChunks.push({
37
+ id: i.toString()
38
+ });
39
+ }
40
+ return {
41
+ kind: 'chunks',
42
+ initialData: {
43
+ prefetchedChunks
44
+ },
45
+ loadMoreChunks: () => {
46
+ return Promise.resolve([]);
47
+ },
48
+ loadChunkItems: async (chunkId, continuationToken) => {
49
+ const emptyResult = {
50
+ items: [],
51
+ continuationToken: null
52
+ };
53
+ if (continuationToken === null) {
54
+ return emptyResult;
55
+ }
56
+ const idsStart = (parseInt(chunkId) - 1) * collectionCapacity;
57
+ const idsEnd = Math.min(idsStart + collectionCapacity, ids.length);
58
+ const momentsInChunk = ids.slice(idsStart, idsEnd);
59
+ if (momentsInChunk.length === 0) {
60
+ return emptyResult;
61
+ }
62
+ const moments = await this.dataProvider.postsPlayer.getPostsCursor({
63
+ filter: {
64
+ types: [PostType.Moment],
65
+ includeIds: momentsInChunk
66
+ },
67
+ limit: collectionCapacity
68
+ });
69
+ const items = moments.items.sort((a, b) => {
70
+ const ia = idOrder.get(a.id) ?? Number.MAX_SAFE_INTEGER;
71
+ const ib = idOrder.get(b.id) ?? Number.MAX_SAFE_INTEGER;
72
+ return ia - ib;
73
+ });
74
+ return {
75
+ items,
76
+ continuationToken: null
77
+ };
78
+ },
79
+ onEndReached
80
+ };
81
+ };
82
+ }
@@ -1,14 +1,14 @@
1
- import type { IMediaCenterConfig } from '../../../short-videos/short-videos-player';
1
+ import type { IMediaCenterDataProvider } from '../../config/types';
2
2
  import type { StreamPlayerModel } from '../../../streams/streams-player';
3
3
  import type { MediaCenterCategoryData } from '../types';
4
4
  export declare class StreamsInCategoryPanelHandler {
5
- private readonly config;
5
+ private readonly dataProvider;
6
6
  private _activated;
7
7
  private _state;
8
8
  private _categoryId;
9
9
  private _categoryName;
10
10
  private _streams;
11
- constructor(config: IMediaCenterConfig);
11
+ constructor(dataProvider: IMediaCenterDataProvider);
12
12
  get streamSectionItems(): StreamPlayerModel[];
13
13
  get categoryId(): string;
14
14
  get categoryName(): string;
@@ -1,12 +1,12 @@
1
1
  export class StreamsInCategoryPanelHandler {
2
- config;
2
+ dataProvider;
3
3
  _activated = $state(false);
4
4
  _state = $state('loading');
5
5
  _categoryId = $state.raw('');
6
6
  _categoryName = $state.raw('');
7
7
  _streams = $state.raw([]);
8
- constructor(config) {
9
- this.config = config;
8
+ constructor(dataProvider) {
9
+ this.dataProvider = dataProvider;
10
10
  }
11
11
  get streamSectionItems() {
12
12
  return this._streams;
@@ -33,7 +33,7 @@ export class StreamsInCategoryPanelHandler {
33
33
  this._activated = true;
34
34
  this._state = 'loading';
35
35
  try {
36
- const streamsResponse = await this.config.streamPlayer.getStreamsCursor({ filter: { categoryId: categoryData.id }, limit: 5 });
36
+ const streamsResponse = await this.dataProvider.streamPlayer.getStreamsCursor({ filter: { categoryId: categoryData.id }, limit: 5 });
37
37
  this._categoryName = categoryData.parentName ? `${categoryData.parentName} - ${categoryData.name}` : categoryData.name;
38
38
  this._categoryId = categoryData.id;
39
39
  this._streams = streamsResponse.items;
@@ -2,7 +2,7 @@ import type { Locale } from '../../core/locale';
2
2
  import type { PostPlayerModel, PostsPlayerProps } from '../../posts/posts-player/types';
3
3
  import type { IStreamsPlayerDataProvider, StreamAmplificationParameters, StreamsPlayerProps } from '../../streams/streams-player/types';
4
4
  import type { IPlayerDataProvider } from '../../ui/player/providers';
5
- export type MediaCenterMode = 'feed' | 'discover';
5
+ export type MediaCenterMode = 'feed' | 'discover' | 'moments';
6
6
  export type MediaCenterCategoryData = {
7
7
  id: string;
8
8
  name: string;
@@ -26,7 +26,7 @@ export type MediaCenterModeProps = {
26
26
  }) => void;
27
27
  };
28
28
  } | {
29
- mode: 'discover';
29
+ mode: 'default';
30
30
  };
31
31
  export type PlayerProps = {
32
32
  type: 'posts';
@@ -35,7 +35,7 @@ export type PlayerProps = {
35
35
  type: 'streams';
36
36
  props: StreamsPlayerProps;
37
37
  };
38
- export type MediaCenterSettings = {
38
+ export type IMediaCenterSettings = {
39
39
  locale?: Locale;
40
40
  showStreamsCloudWatermark?: boolean;
41
41
  disableBackground?: boolean;
@@ -0,0 +1 @@
1
+ export type { IMediaCenterMembershipHandler } from './types';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ import type { IMediaCenterMembershipHandler } from './types';
2
+ export declare class MockMembershipHandler implements IMediaCenterMembershipHandler {
3
+ private isJoined;
4
+ getIsJoined: () => Promise<{
5
+ readonly isJoined: boolean;
6
+ }>;
7
+ join: () => void;
8
+ leave: () => void;
9
+ viewMembersList: () => void;
10
+ }
@@ -0,0 +1,21 @@
1
+ export class MockMembershipHandler {
2
+ isJoined = $state(false);
3
+ getIsJoined = () => {
4
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
5
+ const handler = this;
6
+ return Promise.resolve({
7
+ get isJoined() {
8
+ return handler.isJoined;
9
+ }
10
+ });
11
+ };
12
+ join = () => {
13
+ this.isJoined = true;
14
+ };
15
+ leave = () => {
16
+ this.isJoined = false;
17
+ };
18
+ viewMembersList = () => {
19
+ console.warn('MockMembershipHandler.viewMembersList called');
20
+ };
21
+ }
@@ -0,0 +1,10 @@
1
+ export interface IMediaCenterMembershipHandler {
2
+ getIsJoined: () => PromiseLike<{
3
+ readonly isJoined: boolean;
4
+ }>;
5
+ join: () => PromiseLike<void>;
6
+ leave: () => PromiseLike<void>;
7
+ viewMembersList: () => PromiseLike<void>;
8
+ }
9
+ type PromiseLike<T> = T | Promise<T>;
10
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ export type { IMediaCenterNavigationHandler } from './types';
2
+ export type { MediaCenterState } from './media-center-state';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,19 @@
1
+ export type MediaCenterState = PostsFeedState | StreamsFeedState | DiscoverState | MomentsState;
2
+ export type PostsFeedState = {
3
+ mode: 'posts-feed';
4
+ postId: string;
5
+ categoryId: string | null;
6
+ };
7
+ export type StreamsFeedState = {
8
+ mode: 'streams-feed';
9
+ streamId: string;
10
+ categoryId: string | null;
11
+ };
12
+ export type DiscoverState = {
13
+ mode: 'discover';
14
+ categoryId: string | null;
15
+ };
16
+ export type MomentsState = {
17
+ mode: 'moments';
18
+ momentId: string;
19
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ import type { MediaCenterState } from './media-center-state';
2
+ import type { IMediaCenterNavigationHandler } from './types';
3
+ export declare class MockNavigationHandler implements IMediaCenterNavigationHandler {
4
+ initialState: undefined;
5
+ onChange: (state: MediaCenterState) => void;
6
+ }
@@ -0,0 +1,6 @@
1
+ export class MockNavigationHandler {
2
+ initialState = undefined;
3
+ onChange = (state) => {
4
+ console.warn(state);
5
+ };
6
+ }
@@ -0,0 +1,5 @@
1
+ import type { MediaCenterState } from './media-center-state';
2
+ export interface IMediaCenterNavigationHandler {
3
+ initialState?: MediaCenterState;
4
+ onChange: (state: MediaCenterState) => void;
5
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -8,18 +8,24 @@
8
8
  });
9
9
  };
10
10
  import { MediaCenterProxy } from '../media-center/media-center';
11
+ import { MediaCenterSettings } from '../media-center/media-center/media-center-settings.svelte';
11
12
  import { CloseOrchestrator } from '../ui/player/close-orchestrator';
12
13
  import { createShadowRoot } from '../ui/shadow-dom';
13
14
  import { mount, unmount } from 'svelte';
14
- let { config, settings, modeProps } = $props();
15
+ let { dataProvider, settings, dynamicActions } = $props();
16
+ const settingsHolder = new MediaCenterSettings(settings);
17
+ $effect(() => {
18
+ settingsHolder.patch(settings);
19
+ });
15
20
  const initHost = (node) => {
16
21
  const shadowRoot = createShadowRoot(node);
17
22
  const mounted = mount(MediaCenterProxy, {
18
23
  target: shadowRoot,
19
24
  props: {
20
- config,
21
- settings,
22
- modeProps,
25
+ dataProvider,
26
+ settings: settingsHolder,
27
+ modeProps: { mode: 'default' },
28
+ dynamicActions,
23
29
  closeOrchestrator: new CloseOrchestrator({
24
30
  closeFn: () => __awaiter(void 0, void 0, void 0, function* () {
25
31
  yield unmount(mounted);
@@ -1,9 +1,10 @@
1
- import type { IMediaCenterConfig } from '../media-center';
2
- import type { MediaCenterModeProps, MediaCenterSettings } from '../media-center/media-center/types';
1
+ import type { IMediaCenterDataProvider } from '../media-center';
2
+ import type { IMediaCenterSettings } from '../media-center/media-center/types';
3
+ import { type Snippet } from 'svelte';
3
4
  type Props = {
4
- config: IMediaCenterConfig;
5
- settings?: MediaCenterSettings;
6
- modeProps: MediaCenterModeProps;
5
+ dataProvider: IMediaCenterDataProvider;
6
+ settings?: IMediaCenterSettings;
7
+ dynamicActions?: Snippet;
7
8
  };
8
9
  declare const Cmp: import("svelte").Component<Props, {}, "">;
9
10
  type Cmp = ReturnType<typeof Cmp>;