@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
@@ -18,27 +18,3 @@ query GetMediaPageConfig($mediaPageId: String!) {
18
18
  }
19
19
  }
20
20
  }
21
-
22
- # noinspection GraphQLSchemaValidation
23
- query GetShortVideos($input: EmbedPostsInput!, $image_scale: ImageScale = ORIGINAL_ENCODED) {
24
- shortVideos: embedPosts(input: $input) {
25
- items {
26
- ...ShortVideosPlayerPayloadFragment
27
- }
28
- continuationToken
29
- }
30
- }
31
-
32
- query GetStreams($input: EmbedStreamsInput!) {
33
- streams: embedStreams(input: $input) {
34
- items {
35
- id
36
- cover {
37
- url
38
- }
39
- title
40
- subTitle
41
- }
42
- continuationToken
43
- }
44
- }
@@ -1,24 +1,27 @@
1
+ import { PostType } from '../../core/enums';
1
2
  import type { IContentCategoryFollowingHandler } from '../categories-following';
3
+ import type { IPostAnalyticsHandler, PostPlayerModel } from '../../posts/posts-player/types';
2
4
  import type { IPostSocialInteractionsHandler } from '../../posts/social-interactions';
3
- import type { IShortVideoAnalyticsHandler, ShortVideoPlayerModel } from '../../short-videos/short-videos-player/types';
4
- import type { IStreamPlayerDataProvider, IStreamAnalyticsHandler } from '../../streams/stream-player/types';
5
+ import type { StreamPageViewerModel } from '../../streams/stream-page-viewer';
6
+ import type { IStreamAnalyticsHandler, StreamPlayerModel } from '../../streams/streams-player/types';
5
7
  export interface IMediaCenterConfig {
6
8
  getConfig: () => Promise<MediaCenterConfigModel | null>;
7
9
  handlers?: {
8
- analyticsHandler?: IShortVideoAnalyticsHandler & IStreamAnalyticsHandler;
10
+ analyticsHandler?: IPostAnalyticsHandler & IStreamAnalyticsHandler;
9
11
  socialInteractionsHandler?: IPostSocialInteractionsHandler;
10
12
  categoriesFollowingHandler?: IContentCategoryFollowingHandler;
11
13
  };
12
- shortVideosPlayer: {
13
- getShortVideosCursor: (input: {
14
+ postsPlayer: {
15
+ getPostsCursor: (input: {
14
16
  filter: {
17
+ types: PostType[];
15
18
  categoryId?: string;
16
19
  excludeIds?: string[];
17
20
  };
18
21
  limit: number;
19
22
  continuationToken?: string | null;
20
23
  }) => Promise<{
21
- items: ShortVideoPlayerModel[];
24
+ items: PostPlayerModel[];
22
25
  continuationToken: string | null;
23
26
  }>;
24
27
  };
@@ -31,10 +34,13 @@ export interface IMediaCenterConfig {
31
34
  limit: number;
32
35
  continuationToken?: string | null;
33
36
  }) => Promise<{
34
- items: MediaCenterStreamPreviewModel[];
37
+ items: StreamPlayerModel[];
38
+ continuationToken: string | null;
39
+ }>;
40
+ getStreamPages: (streamId: string, continuationToken: string | null | undefined) => Promise<{
41
+ items: StreamPageViewerModel[];
35
42
  continuationToken: string | null;
36
43
  }>;
37
- streamPlayerDataProvider: IStreamPlayerDataProvider;
38
44
  };
39
45
  }
40
46
  export type MediaCenterConfigModel = {
@@ -46,12 +52,6 @@ export type MediaCenterConfigModel = {
46
52
  }[];
47
53
  targetData: MediaCenterTargetDataModel;
48
54
  };
49
- export type MediaCenterStreamPreviewModel = {
50
- id: string;
51
- title: string;
52
- subTitle: string | null;
53
- cover: string | null;
54
- };
55
55
  export type MediaCenterTargetDataModel = {
56
56
  id: string;
57
57
  name: string;
@@ -1 +1 @@
1
- export {};
1
+ import { PostType } from '../../core/enums';
@@ -9,23 +9,26 @@
9
9
  };
10
10
  import { horizontalWheelScroll } from '../../core/actions';
11
11
  import { Utils } from '../../core/utils';
12
- import { default as ShortVideosPlayerView } from '../../short-videos/short-videos-player/short-videos-player-view.svelte';
13
- import { default as StreamPlayerView } from '../../streams/stream-player/stream-player-view.svelte';
12
+ import { default as PostsPlayerView } from '../../posts/posts-player/posts-player-view.svelte';
13
+ import { default as StreamsPlayerView } from '../../streams/streams-player/streams-player-view.svelte';
14
14
  import { Icon } from '../../ui/icon';
15
15
  import { Loading } from '../../ui/loading';
16
- import { PlayerButton } from '../../ui/player-button';
16
+ import { PlayerButton } from '../../ui/player/button';
17
17
  import { default as DesktopCategoriesSelector } from './desktop-categories-selector.svelte';
18
18
  import { DiscoverPanelHandler } from './discover-panel-handler.svelte';
19
19
  import { default as DiscoverPanel } from './discover-panel.svelte';
20
20
  import { MediaCenterHandler } from './media-center-handler.svelte';
21
21
  import { MediaCenterLocalization } from './media-center-localization';
22
22
  import { default as MobileControlsPanel } from './mobile-controls-panel.svelte';
23
- import { makeShortVideosProvider } from './short-video-resources-generator';
23
+ import { makePostPlayerItemsProvider } from './post-player-provider-generator';
24
24
  import { StreamsInCategoryPanelHandler } from './streams-in-category-panel-handler.svelte';
25
25
  import { default as StreamsInCategoryPanel } from './streams-in-category-panel.svelte';
26
+ import { makeStreamsPlayerDataProvider } from './streams-player-provider-generator';
26
27
  import IconLineHorizontal3 from '@fluentui/svg-icons/icons/line_horizontal_3_20_regular.svg?raw';
27
28
  import IconScreenSearch from '@fluentui/svg-icons/icons/screen_search_20_regular.svg?raw';
29
+ import { tick } from 'svelte';
28
30
  import { fade } from 'svelte/transition';
31
+ const SCROLL_MASK_OFFSET = 32;
29
32
  let { config, playerProps, locale = 'en' } = $props();
30
33
  const localization = $derived(new MediaCenterLocalization(locale));
31
34
  const commonPlayerSettings = {
@@ -42,23 +45,24 @@ let isMobileView = $state(false);
42
45
  const overlayActivated = $derived(discoverHandler.activated || streamsInCategoryHandler.activated);
43
46
  let mobileControlsPanelActive = $state(false);
44
47
  let extraMobileControlsPanelActions = $state.raw([]);
48
+ let scrollAreaRef = $state(null);
45
49
  const selectCategory = (categoryId) => __awaiter(void 0, void 0, void 0, function* () {
46
- var _a, _b;
50
+ var _a, _b, _c;
47
51
  const selectedCategoryData = handler.getCategoryData(categoryId);
48
52
  if (!config || !selectedCategoryData) {
49
53
  return;
50
54
  }
51
55
  hideMobileControlsPanel();
52
56
  switch (mediaCenterMode) {
53
- case 'short-videos':
57
+ case 'posts':
54
58
  if (handler.selectedCategoryId === categoryId) {
55
59
  discoverHandler.deactivate();
56
60
  return;
57
61
  }
58
62
  handler.selectedCategoryId = categoryId;
59
63
  computedPlayerProps = {
60
- mode: 'short-videos',
61
- props: Object.assign({ dataProvider: makeShortVideosProvider({ config, categoryId }), socialInteractionsHandler: (_a = config.handlers) === null || _a === void 0 ? void 0 : _a.socialInteractionsHandler, analyticsHandler: (_b = config.handlers) === null || _b === void 0 ? void 0 : _b.analyticsHandler }, commonPlayerSettings)
64
+ mode: 'posts',
65
+ props: Object.assign({ dataProvider: makePostPlayerItemsProvider({ config, categoryId }), socialInteractionsHandler: (_a = config.handlers) === null || _a === void 0 ? void 0 : _a.socialInteractionsHandler, analyticsHandler: (_b = config.handlers) === null || _b === void 0 ? void 0 : _b.analyticsHandler }, commonPlayerSettings)
62
66
  };
63
67
  discoverHandler.deactivate();
64
68
  break;
@@ -76,22 +80,68 @@ const selectCategory = (categoryId) => __awaiter(void 0, void 0, void 0, functio
76
80
  default:
77
81
  Utils.assertUnreachable(mediaCenterMode);
78
82
  }
83
+ // Scroll to selected category if it's hidden
84
+ yield scrollToSelectedCategory((_c = selectedCategoryData.parentId) !== null && _c !== void 0 ? _c : selectedCategoryData.id);
85
+ });
86
+ /**
87
+ * Scrolls the scroll area to make the selected category button visible
88
+ * @param categoryId - ID of the selected category
89
+ */
90
+ const scrollToSelectedCategory = (categoryId) => __awaiter(void 0, void 0, void 0, function* () {
91
+ if (!scrollAreaRef) {
92
+ return;
93
+ }
94
+ // Wait for DOM to update with the new active state
95
+ yield tick();
96
+ // Find the selected category button element
97
+ const selectedButton = scrollAreaRef.querySelector(`[id="${categoryId}"]`);
98
+ if (!selectedButton) {
99
+ return;
100
+ }
101
+ // Get scroll area and button dimensions
102
+ const scrollAreaRect = scrollAreaRef.getBoundingClientRect();
103
+ const buttonRect = selectedButton.getBoundingClientRect();
104
+ // Calculate button position relative to scroll area
105
+ const buttonLeftRelative = buttonRect.left - scrollAreaRect.left + scrollAreaRef.scrollLeft;
106
+ const buttonRightRelative = buttonLeftRelative + buttonRect.width;
107
+ // Calculate visible area boundaries (accounting for mask gradients)
108
+ const hasLeftMask = scrollAreaRef.scrollLeft > 0;
109
+ const hasRightMask = scrollAreaRef.scrollLeft < scrollAreaRef.scrollWidth - scrollAreaRect.width - 1;
110
+ const visibleLeft = scrollAreaRef.scrollLeft + (hasLeftMask ? SCROLL_MASK_OFFSET : 0);
111
+ const visibleRight = scrollAreaRef.scrollLeft + scrollAreaRect.width - (hasRightMask ? SCROLL_MASK_OFFSET : 0);
112
+ // Check if button is hidden or partially hidden
113
+ const isHiddenLeft = buttonLeftRelative < visibleLeft;
114
+ const isHiddenRight = buttonRightRelative > visibleRight;
115
+ if (isHiddenLeft) {
116
+ const targetScroll = buttonLeftRelative - SCROLL_MASK_OFFSET;
117
+ scrollAreaRef.scrollTo({
118
+ left: targetScroll,
119
+ behavior: 'smooth'
120
+ });
121
+ }
122
+ else if (isHiddenRight) {
123
+ const targetScroll = buttonRightRelative - scrollAreaRect.width + SCROLL_MASK_OFFSET;
124
+ scrollAreaRef.scrollTo({
125
+ left: targetScroll,
126
+ behavior: 'smooth'
127
+ });
128
+ }
79
129
  });
80
130
  const activateSelectedShortVideoPlayer = (shortVideo) => {
81
131
  var _a, _b;
82
132
  if (!config) {
83
133
  return;
84
134
  }
85
- mediaCenterMode = 'short-videos';
135
+ mediaCenterMode = 'posts';
86
136
  computedPlayerProps = {
87
- mode: 'short-videos',
88
- props: Object.assign({ dataProvider: makeShortVideosProvider({ config, prefetchedItems: [shortVideo] }), socialInteractionsHandler: (_a = config.handlers) === null || _a === void 0 ? void 0 : _a.socialInteractionsHandler, analyticsHandler: (_b = config.handlers) === null || _b === void 0 ? void 0 : _b.analyticsHandler }, commonPlayerSettings)
137
+ mode: 'posts',
138
+ props: Object.assign({ dataProvider: makePostPlayerItemsProvider({ config, prefetchedItems: [shortVideo] }), socialInteractionsHandler: (_a = config.handlers) === null || _a === void 0 ? void 0 : _a.socialInteractionsHandler, analyticsHandler: (_b = config.handlers) === null || _b === void 0 ? void 0 : _b.analyticsHandler }, commonPlayerSettings)
89
139
  };
90
140
  handler.selectedCategoryId = null;
91
141
  discoverHandler.deactivate();
92
142
  streamsInCategoryHandler.deactivate();
93
143
  };
94
- const activateSelectedStreamPlayer = (id) => {
144
+ const activateSelectedStreamPlayer = (stream) => {
95
145
  var _a, _b;
96
146
  if (!config) {
97
147
  return;
@@ -99,7 +149,21 @@ const activateSelectedStreamPlayer = (id) => {
99
149
  mediaCenterMode = 'stream';
100
150
  computedPlayerProps = {
101
151
  mode: 'stream',
102
- props: Object.assign({ streamId: id, dataProvider: config.streamPlayer.streamPlayerDataProvider, analyticsHandler: (_a = config.handlers) === null || _a === void 0 ? void 0 : _a.analyticsHandler, postSocialInteractionsHandler: (_b = config.handlers) === null || _b === void 0 ? void 0 : _b.socialInteractionsHandler }, commonPlayerSettings)
152
+ props: Object.assign({ dataProvider: makeStreamsPlayerDataProvider({ config, prefetchedStreams: [stream] }), analyticsHandler: (_a = config.handlers) === null || _a === void 0 ? void 0 : _a.analyticsHandler, postSocialInteractionsHandler: (_b = config.handlers) === null || _b === void 0 ? void 0 : _b.socialInteractionsHandler }, commonPlayerSettings)
153
+ };
154
+ handler.selectedCategoryId = null;
155
+ discoverHandler.deactivate();
156
+ streamsInCategoryHandler.deactivate();
157
+ };
158
+ const activateSelectedStreamOfCategoryPlayer = (id, prefetchedStreams, categoryId) => {
159
+ var _a, _b;
160
+ if (!config) {
161
+ return;
162
+ }
163
+ mediaCenterMode = 'stream';
164
+ computedPlayerProps = {
165
+ mode: 'stream',
166
+ props: Object.assign({ dataProvider: makeStreamsPlayerDataProvider({ config, prefetchedStreams: prefetchedStreams, initialStreamId: id, categoryId }), analyticsHandler: (_a = config.handlers) === null || _a === void 0 ? void 0 : _a.analyticsHandler, postSocialInteractionsHandler: (_b = config.handlers) === null || _b === void 0 ? void 0 : _b.socialInteractionsHandler }, commonPlayerSettings)
103
167
  };
104
168
  handler.selectedCategoryId = null;
105
169
  discoverHandler.deactivate();
@@ -134,6 +198,8 @@ const updateScrollShadows = (scrollArea) => {
134
198
  scrollArea.classList.toggle('has-both-masks', scrollHasRight && scrollHasLeft);
135
199
  };
136
200
  const onScrollMounted = (node) => {
201
+ scrollAreaRef = node;
202
+ scrollAreaRef.style.setProperty('--scroll-area--mask-offset', `${SCROLL_MASK_OFFSET}px`);
137
203
  const scrollResizeObserver = new ResizeObserver(() => {
138
204
  updateScrollShadows(node);
139
205
  });
@@ -178,7 +244,7 @@ const onWidthAnchorMounted = (node) => {
178
244
  class="media-center-controls-panel__button"
179
245
  class:media-center-controls-panel__button--active={discoverHandler.activated}
180
246
  onclick={toggleDiscover}>
181
- <span class="media-center-controls-panel__button-icon">
247
+ <span class="media-center-controls-panel__button-icon" class:media-center-controls-panel__button-icon--active={discoverHandler.activated}>
182
248
  <Icon src={IconScreenSearch} />
183
249
  </span>
184
250
  <span class="media-center-controls-panel__button-value">
@@ -189,6 +255,7 @@ const onWidthAnchorMounted = (node) => {
189
255
  {#each handler.categories as category (category.id)}
190
256
  <button
191
257
  type="button"
258
+ id={category.id}
192
259
  class="media-center-controls-panel__button"
193
260
  class:media-center-controls-panel__button--active={!discoverHandler.activated && handler.controlsPanelSelectedCategory?.id === category.id}
194
261
  data-child-name={(!discoverHandler.activated &&
@@ -210,8 +277,8 @@ const onWidthAnchorMounted = (node) => {
210
277
  </div>
211
278
  {/if}
212
279
  {/snippet}
213
- {#if computedPlayerProps.mode === 'short-videos'}
214
- <ShortVideosPlayerView
280
+ {#if computedPlayerProps.mode === 'posts'}
281
+ <PostsPlayerView
215
282
  {...computedPlayerProps.props}
216
283
  mediaCenterData={{
217
284
  controlsPanel: handler.categories.length ? controlsPanel : undefined,
@@ -220,7 +287,7 @@ const onWidthAnchorMounted = (node) => {
220
287
  callbacks: { onHeaderHeightChanged, onExtraActionsForMobileControlsPanelDetermined }
221
288
  }} />
222
289
  {:else if computedPlayerProps.mode === 'stream'}
223
- <StreamPlayerView
290
+ <StreamsPlayerView
224
291
  {...computedPlayerProps.props}
225
292
  mediaCenterData={{
226
293
  controlsPanel: handler.categories.length ? controlsPanel : undefined,
@@ -238,13 +305,18 @@ const onWidthAnchorMounted = (node) => {
238
305
  <DiscoverPanel
239
306
  handler={discoverHandler}
240
307
  localization={localization}
241
- on={{ shortVideoSelected: (shortVideo) => activateSelectedShortVideoPlayer(shortVideo), streamSelected: (id) => activateSelectedStreamPlayer(id) }} />
308
+ on={{
309
+ shortVideoSelected: (shortVideo) => activateSelectedShortVideoPlayer(shortVideo),
310
+ streamSelected: (stream) => activateSelectedStreamPlayer(stream)
311
+ }} />
242
312
  </div>
243
313
  {/if}
244
314
 
245
315
  {#if streamsInCategoryHandler.active}
246
316
  <div class="media-center-overlay" style={`top:${headerHeight}px`} transition:fade={{ duration: 300 }}>
247
- <StreamsInCategoryPanel handler={streamsInCategoryHandler} on={{ streamSelected: (id) => activateSelectedStreamPlayer(id) }} />
317
+ <StreamsInCategoryPanel
318
+ handler={streamsInCategoryHandler}
319
+ on={{ streamSelected: (id, categoryId, streams) => activateSelectedStreamOfCategoryPlayer(id, streams, categoryId) }} />
248
320
  </div>
249
321
  {/if}
250
322
 
@@ -304,15 +376,17 @@ const onWidthAnchorMounted = (node) => {
304
376
  scrollbar-width: none;
305
377
  padding: 0.5rem 0.625rem;
306
378
  padding-left: 0;
379
+ --_scroll-area--mask-offset--left: var(--scroll-area--mask-offset);
380
+ --_scroll-area--mask-offset--right: calc(100% - var(--scroll-area--mask-offset));
307
381
  }
308
382
  :global(.media-center-controls-panel__scroll-area.has-left-mask) {
309
- mask-image: linear-gradient(to right, rgba(0, 0, 0, 0) 0, rgb(0, 0, 0) 32px, rgb(0, 0, 0) 100%);
383
+ mask-image: linear-gradient(to right, rgba(0, 0, 0, 0) 0, rgb(0, 0, 0) var(--_scroll-area--mask-offset--left), rgb(0, 0, 0) 100%);
310
384
  }
311
385
  :global(.media-center-controls-panel__scroll-area.has-right-mask) {
312
- mask-image: linear-gradient(to right, rgb(0, 0, 0) 0, rgb(0, 0, 0) calc(100% - 32px), rgba(0, 0, 0, 0) 100%);
386
+ mask-image: linear-gradient(to right, rgb(0, 0, 0) 0, rgb(0, 0, 0) var(--_scroll-area--mask-offset--right), rgba(0, 0, 0, 0) 100%);
313
387
  }
314
388
  :global(.media-center-controls-panel__scroll-area.has-both-masks) {
315
- mask-image: linear-gradient(to right, rgba(0, 0, 0, 0) 0, rgb(0, 0, 0) 32px, rgb(0, 0, 0) calc(100% - 32px), rgba(0, 0, 0, 0) 100%);
389
+ mask-image: linear-gradient(to right, rgba(0, 0, 0, 0) 0, rgb(0, 0, 0) var(--_scroll-area--mask-offset--left), rgb(0, 0, 0) var(--_scroll-area--mask-offset--right), rgba(0, 0, 0, 0) 100%);
316
390
  }
317
391
  .media-center-controls-panel__button {
318
392
  position: relative;
@@ -340,7 +414,6 @@ const onWidthAnchorMounted = (node) => {
340
414
  .media-center-controls-panel__button--active {
341
415
  background-color: rgba(255, 255, 255, 0.9);
342
416
  color: #000000;
343
- --icon--color: #000000;
344
417
  }
345
418
  .media-center-controls-panel__button:hover:not(.media-center-controls-panel__button--active) {
346
419
  background-color: rgba(0, 0, 0, 0.9);
@@ -364,8 +437,12 @@ const onWidthAnchorMounted = (node) => {
364
437
  pointer-events: none;
365
438
  }
366
439
  .media-center-controls-panel__button-icon {
367
- --icon--color: #ffffff;
368
440
  --icon--size: 1.0625rem;
441
+ --icon--color: #ffffff;
442
+ line-height: 0;
443
+ }
444
+ .media-center-controls-panel__button-icon--active {
445
+ --icon--color: #000000;
369
446
  }
370
447
  .media-center-controls-panel__button-value {
371
448
  font-size: 0.875rem;
@@ -1,13 +1,13 @@
1
1
  import type { Locale } from '../../core/locale';
2
2
  import type { IMediaCenterConfig } from '../config/types';
3
- import type { ShortVideoPlayerProps } from '../../short-videos/short-videos-player/types';
4
- import type { StreamPlayerProps } from '../../streams/stream-player/types';
3
+ import type { PostPlayerProps } from '../../posts/posts-player/types';
4
+ import type { StreamsPlayerProps } from '../../streams/streams-player/types';
5
5
  type PlayerProps = {
6
- mode: 'short-videos';
7
- props: ShortVideoPlayerProps;
6
+ mode: 'posts';
7
+ props: PostPlayerProps;
8
8
  } | {
9
9
  mode: 'stream';
10
- props: StreamPlayerProps;
10
+ props: StreamsPlayerProps;
11
11
  };
12
12
  type Props = {
13
13
  config: IMediaCenterConfig | null;
@@ -1,7 +1,8 @@
1
1
  import type { TrackingParams } from '../../marketing-tracking';
2
+ import type { IMediaCenterConfig } from '..';
3
+ import type { PostPlayerModel } from '../../posts/posts-player';
2
4
  import type { ProductCardModel } from '../../products/product-card';
3
- import type { IMediaCenterConfig, ShortVideoPlayerModel } from '../../short-videos/short-videos-player';
4
- import type { MediaCenterStreamModel } from './types';
5
+ import type { StreamPlayerModel } from '../../streams/streams-player';
5
6
  export declare class DiscoverPanelHandler {
6
7
  private readonly config;
7
8
  private _activated;
@@ -10,7 +11,7 @@ export declare class DiscoverPanelHandler {
10
11
  private _shortVideos;
11
12
  private _products;
12
13
  constructor(config: IMediaCenterConfig | null);
13
- get streamSectionItems(): MediaCenterStreamModel[];
14
+ get streamSectionItems(): StreamPlayerModel[];
14
15
  get shortVideoSectionItems(): ShortVideoSectionItemType[];
15
16
  get activated(): boolean;
16
17
  get active(): boolean;
@@ -22,7 +23,7 @@ export declare class DiscoverPanelHandler {
22
23
  }
23
24
  type ShortVideoSectionItemType = {
24
25
  kind: 'video';
25
- data: ShortVideoPlayerModel;
26
+ data: PostPlayerModel;
26
27
  } | {
27
28
  kind: 'product';
28
29
  data: ProductCardModel;
@@ -1,3 +1,4 @@
1
+ import { PostType } from '../../core/enums';
1
2
  export class DiscoverPanelHandler {
2
3
  config;
3
4
  _activated = $state(false);
@@ -65,7 +66,7 @@ export class DiscoverPanelHandler {
65
66
  if (this._state === 'not-initialized') {
66
67
  this._state = 'loading';
67
68
  try {
68
- const shortVideosResponse = await this.config.shortVideosPlayer.getShortVideosCursor({ filter: {}, limit: 5 });
69
+ const shortVideosResponse = await this.config.postsPlayer.getPostsCursor({ filter: { types: [PostType.ShortVideo] }, limit: 5 });
69
70
  const streamsResponse = await this.config.streamPlayer.getStreamsCursor({ filter: {}, limit: 5 });
70
71
  this._shortVideos = shortVideosResponse.items;
71
72
  this._products = this._uniqueById(shortVideosResponse.items.flatMap((i) => i.products)).slice(0, 2);
@@ -16,7 +16,7 @@ let { handler, localization, on } = $props();
16
16
  </div>
17
17
  <div class="media-center-overview__section-content">
18
18
  {#each handler.streamSectionItems as item (item.id)}
19
- <StreamCard stream={item} on={{ click: () => on.streamSelected(item.id) }}></StreamCard>
19
+ <StreamCard stream={item} on={{ click: () => on.streamSelected(item) }}></StreamCard>
20
20
  {/each}
21
21
  </div>
22
22
  </div>
@@ -1,12 +1,13 @@
1
- import type { ShortVideoPlayerModel } from '../../short-videos/short-videos-player';
1
+ import type { PostPlayerModel } from '../../posts/posts-player';
2
+ import type { StreamPlayerModel } from '../../streams/streams-player';
2
3
  import { DiscoverPanelHandler } from './discover-panel-handler.svelte';
3
4
  import { MediaCenterLocalization } from './media-center-localization';
4
5
  type Props = {
5
6
  handler: DiscoverPanelHandler;
6
7
  localization: MediaCenterLocalization;
7
8
  on: {
8
- shortVideoSelected: (shortVideo: ShortVideoPlayerModel) => void;
9
- streamSelected: (id: string) => void;
9
+ shortVideoSelected: (shortVideo: PostPlayerModel) => void;
10
+ streamSelected: (stream: StreamPlayerModel) => void;
10
11
  };
11
12
  };
12
13
  declare const DiscoverPanel: import("svelte").Component<Props, {}, "">;
@@ -0,0 +1,8 @@
1
+ import type { PostPlayerModel } from '../../posts/posts-player';
2
+ import type { IFeedPlayerDataProvider } from '../../ui/player/providers';
3
+ import type { IMediaCenterConfig } from '../config/types';
4
+ export declare const makePostPlayerItemsProvider: (data: {
5
+ config: IMediaCenterConfig;
6
+ categoryId?: string;
7
+ prefetchedItems?: PostPlayerModel[];
8
+ }) => IFeedPlayerDataProvider<PostPlayerModel>;
@@ -1,11 +1,16 @@
1
1
  import { ContinuationToken } from '../../core/continuation-token';
2
2
  import { CursorDataLoader } from '../../core/data-loaders';
3
- export const makeShortVideosProvider = (data) => {
3
+ import { PostType } from '../../core/enums';
4
+ export const makePostPlayerItemsProvider = (data) => {
4
5
  const { config, categoryId, prefetchedItems = [] } = data;
5
6
  const loader = new CursorDataLoader({
6
7
  loadPage: async (continuationToken) => {
7
- const result = await config.shortVideosPlayer.getShortVideosCursor({
8
- filter: { categoryId, excludeIds: prefetchedItems.length ? prefetchedItems.map((i) => i.id) : undefined },
8
+ const result = await config.postsPlayer.getPostsCursor({
9
+ filter: {
10
+ types: [PostType.Article, PostType.Media, PostType.ShortVideo, PostType.Video],
11
+ categoryId,
12
+ excludeIds: prefetchedItems.length ? prefetchedItems.map((i) => i.id) : undefined
13
+ },
9
14
  continuationToken: continuationToken.toNextChunkString(),
10
15
  limit: 20
11
16
  });
@@ -17,6 +22,7 @@ export const makeShortVideosProvider = (data) => {
17
22
  }
18
23
  });
19
24
  return {
25
+ kind: 'feed',
20
26
  initialData: {
21
27
  prefetchedItems,
22
28
  startIndex: prefetchedItems.length ? 0 : -1
@@ -1,13 +1,16 @@
1
1
  import type { IMediaCenterConfig } from '../../short-videos/short-videos-player';
2
- import type { MediaCenterCategoryData, MediaCenterStreamModel } from './types';
2
+ import type { StreamPlayerModel } from '../../streams/streams-player';
3
+ import type { MediaCenterCategoryData } from './types';
3
4
  export declare class StreamsInCategoryPanelHandler {
4
5
  private readonly config;
5
6
  private _activated;
6
7
  private _state;
8
+ private _categoryId;
7
9
  private _categoryName;
8
10
  private _streams;
9
11
  constructor(config: IMediaCenterConfig | null);
10
- get streamSectionItems(): MediaCenterStreamModel[];
12
+ get streamSectionItems(): StreamPlayerModel[];
13
+ get categoryId(): string;
11
14
  get categoryName(): string;
12
15
  get activated(): boolean;
13
16
  get active(): boolean;
@@ -2,6 +2,7 @@ export class StreamsInCategoryPanelHandler {
2
2
  config;
3
3
  _activated = $state(false);
4
4
  _state = $state('loading');
5
+ _categoryId = $state.raw('');
5
6
  _categoryName = $state.raw('');
6
7
  _streams = $state.raw([]);
7
8
  constructor(config) {
@@ -10,6 +11,9 @@ export class StreamsInCategoryPanelHandler {
10
11
  get streamSectionItems() {
11
12
  return this._streams;
12
13
  }
14
+ get categoryId() {
15
+ return this._categoryId;
16
+ }
13
17
  get categoryName() {
14
18
  return this._categoryName;
15
19
  }
@@ -31,6 +35,7 @@ export class StreamsInCategoryPanelHandler {
31
35
  try {
32
36
  const streamsResponse = await this.config.streamPlayer.getStreamsCursor({ filter: { categoryId: category.id }, limit: 5 });
33
37
  this._categoryName = category.parentName ? `${category.parentName} - ${category.name}` : category.name;
38
+ this._categoryId = category.id;
34
39
  this._streams = streamsResponse.items;
35
40
  }
36
41
  finally {
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">import { StreamCard } from '../../streams/stream-card';
2
- import { StreamsInCategoryPanelHandler } from './streams-in-category-panel-handler.svelte.js';
2
+ import { StreamsInCategoryPanelHandler } from './streams-in-category-panel-handler.svelte';
3
3
  let { handler, on } = $props();
4
4
  </script>
5
5
 
@@ -12,7 +12,7 @@ let { handler, on } = $props();
12
12
  </div>
13
13
  <div class="streams-in-category__section-content">
14
14
  {#each handler.streamSectionItems as item (item.id)}
15
- <StreamCard stream={item} on={{ click: () => on.streamSelected(item.id) }}></StreamCard>
15
+ <StreamCard stream={item} on={{ click: () => on.streamSelected(item.id, handler.categoryId, handler.streamSectionItems) }}></StreamCard>
16
16
  {/each}
17
17
  </div>
18
18
  </div>
@@ -1,8 +1,9 @@
1
- import { StreamsInCategoryPanelHandler } from './streams-in-category-panel-handler.svelte.js';
1
+ import type { StreamPlayerModel } from '../../streams/streams-player';
2
+ import { StreamsInCategoryPanelHandler } from './streams-in-category-panel-handler.svelte';
2
3
  type Props = {
3
4
  handler: StreamsInCategoryPanelHandler;
4
5
  on: {
5
- streamSelected: (id: string) => void;
6
+ streamSelected: (streamId: string, categoryId: string, streams: StreamPlayerModel[]) => void;
6
7
  };
7
8
  };
8
9
  declare const StreamsInCategoryPanel: import("svelte").Component<Props, {}, "">;
@@ -0,0 +1,8 @@
1
+ import type { IStreamsPlayerDataProvider, StreamPlayerModel } from '../../streams/streams-player/types';
2
+ import type { IMediaCenterConfig } from '../config/types';
3
+ export declare const makeStreamsPlayerDataProvider: (data: {
4
+ config: IMediaCenterConfig;
5
+ initialStreamId?: string;
6
+ categoryId?: string;
7
+ prefetchedStreams?: StreamPlayerModel[];
8
+ }) => IStreamsPlayerDataProvider;
@@ -0,0 +1,36 @@
1
+ import { ContinuationToken } from '../../core/continuation-token';
2
+ import { CursorDataLoader } from '../../core/data-loaders';
3
+ export const makeStreamsPlayerDataProvider = (data) => {
4
+ const { config, categoryId, prefetchedStreams: initialPrefetchedStreams = [], initialStreamId } = data;
5
+ const loader = new CursorDataLoader({
6
+ loadPage: async (continuationToken) => {
7
+ const result = await config.streamPlayer.getStreamsCursor({
8
+ filter: {
9
+ categoryId,
10
+ excludeIds: initialPrefetchedStreams.length ? initialPrefetchedStreams.map((i) => i.id) : undefined
11
+ },
12
+ continuationToken: continuationToken.toNextChunkString(),
13
+ limit: 20
14
+ });
15
+ const items = result.items;
16
+ return {
17
+ items: items,
18
+ continuationToken: ContinuationToken.fromPayload(result.continuationToken)
19
+ };
20
+ }
21
+ });
22
+ let prefetchedStreams = initialPrefetchedStreams;
23
+ if (initialStreamId) {
24
+ const targetStream = prefetchedStreams.find((stream) => stream.id === initialStreamId);
25
+ if (targetStream) {
26
+ prefetchedStreams = [targetStream, ...prefetchedStreams.filter((stream) => stream.id !== initialStreamId)];
27
+ }
28
+ }
29
+ return {
30
+ initialData: {
31
+ prefetchedStreams
32
+ },
33
+ loadMoreStreams: loader.loadMore,
34
+ getStreamPages: config.streamPlayer.getStreamPages
35
+ };
36
+ };
@@ -1,10 +1,4 @@
1
- export type MediaCenterMode = 'short-videos' | 'stream';
2
- export type MediaCenterStreamModel = {
3
- id: string;
4
- title: string;
5
- subTitle: string | null;
6
- cover: string | null;
7
- };
1
+ export type MediaCenterMode = 'stream' | 'posts';
8
2
  export type MediaCenterCategoryData = {
9
3
  id: string;
10
4
  name: string;
@@ -9,7 +9,7 @@
9
9
  };
10
10
  import { IconColor } from '../../ui/icon';
11
11
  import { MediaVolumeManager } from '../../ui/media-playback';
12
- import { PlayerButton, PlayerButtonsGroup } from '../../ui/player-button';
12
+ import { PlayerButton, PlayerButtonsGroup } from '../../ui/player/button';
13
13
  import IconHeartFilled from '@fluentui/svg-icons/icons/heart_20_filled.svg?raw';
14
14
  import IconHeart from '@fluentui/svg-icons/icons/heart_28_regular.svg?raw';
15
15
  import IconShare from '@fluentui/svg-icons/icons/share_28_regular.svg?raw';
@@ -0,0 +1 @@
1
+ export { getPostsCursor } from './posts-loader';
@@ -0,0 +1 @@
1
+ export { getPostsCursor } from './posts-loader';
@@ -0,0 +1,3 @@
1
+ import type { PostPlayerModel } from '../posts-player/types';
2
+ import type { PostsPlayerPayloadFragment } from './operations.generated';
3
+ export declare const mapToPostPlayerModel: (payload: PostsPlayerPayloadFragment) => PostPlayerModel;