@streamscloud/embeddable 11.0.0 → 12.1.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 (174) hide show
  1. package/dist/ads/ad-card/cmp.ad-card.svelte +4 -4
  2. package/dist/ads/ad-card/cmp.ad-card.svelte.d.ts +2 -0
  3. package/dist/content-player/cmp.content-player.svelte +63 -128
  4. package/dist/content-player/content-player-config.svelte.d.ts +3 -10
  5. package/dist/content-player/content-player-config.svelte.js +3 -21
  6. package/dist/content-player/content-player-settings.d.ts +7 -21
  7. package/dist/content-player/content-player-settings.js +0 -4
  8. package/dist/content-player/controls-and-attachments.svelte +39 -5
  9. package/dist/content-player/overview-panel.svelte +14 -6
  10. package/dist/content-player/overview-panel.svelte.d.ts +5 -1
  11. package/dist/content-player/ui-manager.svelte.d.ts +0 -2
  12. package/dist/content-player/ui-manager.svelte.js +0 -2
  13. package/dist/media-center/config/internal-media-center-config.d.ts +7 -3
  14. package/dist/media-center/config/internal-media-center-config.js +28 -24
  15. package/dist/media-center/config/operations.generated.d.ts +36 -23
  16. package/dist/media-center/config/operations.generated.js +53 -33
  17. package/dist/media-center/config/operations.graphql +34 -21
  18. package/dist/media-center/config/types.d.ts +13 -2
  19. package/dist/media-center/media-center/cmp.media-center.svelte +195 -149
  20. package/dist/media-center/media-center/cmp.media-center.svelte.d.ts +2 -19
  21. package/dist/media-center/media-center/discover/data-loading.d.ts +8 -0
  22. package/dist/media-center/media-center/discover/data-loading.js +35 -0
  23. package/dist/media-center/media-center/discover/discover-header-localization.d.ts +6 -0
  24. package/dist/media-center/media-center/discover/discover-header-localization.js +15 -0
  25. package/dist/media-center/media-center/discover/discover-header.svelte +214 -0
  26. package/dist/media-center/media-center/discover/discover-header.svelte.d.ts +9 -0
  27. package/dist/media-center/media-center/discover/discover-view-handler.svelte.d.ts +28 -0
  28. package/dist/media-center/media-center/discover/discover-view-handler.svelte.js +101 -0
  29. package/dist/media-center/media-center/discover/discover-view-localization.d.ts +6 -0
  30. package/dist/media-center/media-center/discover/discover-view-localization.js +15 -0
  31. package/dist/media-center/media-center/discover/discover-view.svelte +238 -0
  32. package/dist/media-center/media-center/discover/{discover-panel.svelte.d.ts → discover-view.svelte.d.ts} +4 -4
  33. package/dist/media-center/media-center/discover/index.d.ts +2 -2
  34. package/dist/media-center/media-center/discover/index.js +2 -2
  35. package/dist/media-center/media-center/discover/types.svelte.d.ts +20 -0
  36. package/dist/media-center/media-center/discover/types.svelte.js +20 -0
  37. package/dist/media-center/media-center/feed/feed-handler.svelte.d.ts +50 -0
  38. package/dist/media-center/media-center/feed/feed-handler.svelte.js +84 -0
  39. package/dist/media-center/media-center/feed/feed-providers-generator.d.ts +11 -0
  40. package/dist/media-center/media-center/feed/feed-providers-generator.js +79 -0
  41. package/dist/media-center/media-center/feed/index.d.ts +1 -0
  42. package/dist/media-center/media-center/feed/index.js +1 -0
  43. package/dist/media-center/media-center/feed/types.d.ts +12 -0
  44. package/dist/media-center/media-center/handlers/categories-handler.svelte.d.ts +29 -10
  45. package/dist/media-center/media-center/handlers/categories-handler.svelte.js +25 -7
  46. package/dist/media-center/media-center/handlers/index.d.ts +2 -1
  47. package/dist/media-center/media-center/handlers/index.js +1 -1
  48. package/dist/media-center/media-center/handlers/media-center-settings-handler.svelte.d.ts +19 -0
  49. package/dist/media-center/media-center/handlers/media-center-settings-handler.svelte.js +26 -0
  50. package/dist/media-center/media-center/header-footer/media-center-footer.svelte +4 -8
  51. package/dist/media-center/media-center/header-footer/media-center-header-localization.d.ts +1 -0
  52. package/dist/media-center/media-center/header-footer/media-center-header-localization.js +6 -0
  53. package/dist/media-center/media-center/header-footer/media-center-header-mobile.svelte +25 -36
  54. package/dist/media-center/media-center/header-footer/media-center-header-mobile.svelte.d.ts +2 -1
  55. package/dist/media-center/media-center/header-footer/media-center-header.svelte +14 -11
  56. package/dist/media-center/media-center/header-footer/media-center-header.svelte.d.ts +1 -2
  57. package/dist/media-center/media-center/media-center-context.svelte.d.ts +31 -13
  58. package/dist/media-center/media-center/media-center-context.svelte.js +71 -35
  59. package/dist/media-center/media-center/menu/menu-localization.d.ts +2 -11
  60. package/dist/media-center/media-center/menu/menu-localization.js +6 -45
  61. package/dist/media-center/media-center/menu/menu.svelte +94 -93
  62. package/dist/media-center/media-center/menu/menu.svelte.d.ts +1 -1
  63. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.d.ts +1 -1
  64. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.js +0 -3
  65. package/dist/media-center/media-center/moments/cmp.moments-circle.svelte +41 -0
  66. package/dist/media-center/media-center/moments/cmp.moments-circle.svelte.d.ts +7 -0
  67. package/dist/media-center/media-center/moments/index.d.ts +1 -0
  68. package/dist/media-center/media-center/moments/index.js +1 -0
  69. package/dist/media-center/media-center/streams-in-category/streams-in-category-panel-handler.svelte.d.ts +1 -1
  70. package/dist/media-center/media-center/streams-in-category/streams-in-category-panel-handler.svelte.js +1 -1
  71. package/dist/media-center/media-center/types.d.ts +44 -1
  72. package/dist/media-page/index.d.ts +121 -0
  73. package/dist/media-page/index.js +43 -0
  74. package/dist/posts/attachments/cmp.attachments.svelte +1 -0
  75. package/dist/posts/controls/cmp.controls.svelte +50 -13
  76. package/dist/posts/data-loaders/operations.generated.d.ts +4 -0
  77. package/dist/posts/data-loaders/operations.generated.js +6 -2
  78. package/dist/posts/model/types.d.ts +2 -0
  79. package/dist/posts/post-viewer/cmp.post-viewer.svelte +26 -18
  80. package/dist/posts/post-viewer/mapper.js +2 -0
  81. package/dist/posts/post-viewer/operations.generated.d.ts +2 -0
  82. package/dist/posts/post-viewer/operations.generated.js +3 -1
  83. package/dist/posts/post-viewer/operations.graphql +2 -0
  84. package/dist/posts/post-viewer/post-texts.svelte +3 -3
  85. package/dist/posts/posts-player/cmp.posts-player.svelte +20 -6
  86. package/dist/posts/posts-player/cmp.posts-player.svelte.d.ts +18 -2
  87. package/dist/posts/posts-player/index.d.ts +18 -3
  88. package/dist/posts/posts-player/index.js +42 -89
  89. package/dist/posts/posts-player/posts-player-proxy.svelte +19 -0
  90. package/dist/posts/posts-player/posts-player-proxy.svelte.d.ts +22 -0
  91. package/dist/posts/posts-player/posts-player-view.svelte +20 -34
  92. package/dist/posts/posts-player/posts-player-view.svelte.d.ts +2 -6
  93. package/dist/posts/posts-player/types.d.ts +19 -6
  94. package/dist/products/product-card/cmp.product-card.svelte +5 -5
  95. package/dist/products/product-card/cmp.product-card.svelte.d.ts +1 -1
  96. package/dist/short-videos/short-video-card/cmp.short-video-card.svelte +160 -19
  97. package/dist/short-videos/short-video-card/cmp.short-video-card.svelte.d.ts +2 -1
  98. package/dist/short-videos/short-video-card/localization.d.ts +5 -0
  99. package/dist/short-videos/short-video-card/localization.js +13 -0
  100. package/dist/short-videos/short-video-card/types.d.ts +4 -0
  101. package/dist/short-videos/short-videos-player/index.js +26 -33
  102. package/dist/streams/layout/element-views/cmp.stream-element.svelte +2 -2
  103. package/dist/streams/layout/element-views/cmp.text-ref-stream-element.svelte +7 -3
  104. package/dist/streams/layout/element-views/cmp.text-ref-stream-element.svelte.d.ts +2 -0
  105. package/dist/streams/layout/element-views/cmp.text-stream-element.svelte +7 -3
  106. package/dist/streams/layout/element-views/cmp.text-stream-element.svelte.d.ts +2 -0
  107. package/dist/streams/layout/element-views/price-element-view.svelte +2 -2
  108. package/dist/streams/layout/element-views/price-stream-element-localization.d.ts +1 -1
  109. package/dist/streams/layout/element-views/price-stream-element-localization.js +2 -2
  110. package/dist/streams/layout/models/mapper.js +2 -0
  111. package/dist/streams/streams-player/index.d.ts +21 -2
  112. package/dist/streams/streams-player/index.js +49 -24
  113. package/dist/streams/streams-player/stream-overview.svelte +1 -1
  114. package/dist/streams/streams-player/streams-player-buffer.svelte.d.ts +1 -3
  115. package/dist/streams/streams-player/streams-player-buffer.svelte.js +2 -2
  116. package/dist/streams/streams-player/streams-player-view.svelte +25 -21
  117. package/dist/streams/streams-player/streams-player-view.svelte.d.ts +1 -5
  118. package/dist/streams/streams-player/types.d.ts +18 -4
  119. package/dist/ui/line-clamp/cmp.line-clamp-auto.svelte +119 -0
  120. package/dist/ui/line-clamp/cmp.line-clamp-auto.svelte.d.ts +10 -0
  121. package/dist/ui/line-clamp/cmp.line-clamp.svelte +44 -72
  122. package/dist/ui/line-clamp/cmp.line-clamp.svelte.d.ts +3 -4
  123. package/dist/ui/line-clamp/index.d.ts +1 -0
  124. package/dist/ui/line-clamp/index.js +1 -0
  125. package/dist/ui/player/button/cmp.mobile-player-buttons-group.svelte +44 -0
  126. package/dist/ui/player/button/cmp.mobile-player-buttons-group.svelte.d.ts +7 -0
  127. package/dist/ui/player/button/cmp.player-button.svelte +0 -1
  128. package/dist/ui/player/button/cmp.player-buttons-group.svelte +15 -11
  129. package/dist/ui/player/button/cmp.player-buttons-group.svelte.d.ts +1 -1
  130. package/dist/ui/player/button/index.d.ts +1 -0
  131. package/dist/ui/player/button/index.js +1 -0
  132. package/dist/ui/player/button/types.d.ts +0 -2
  133. package/dist/ui/player/close-orchestrator/close-orchestrator.svelte.d.ts +18 -0
  134. package/dist/ui/player/close-orchestrator/close-orchestrator.svelte.js +58 -0
  135. package/dist/ui/player/close-orchestrator/index.d.ts +2 -0
  136. package/dist/ui/player/close-orchestrator/index.js +1 -0
  137. package/dist/ui/player/close-orchestrator/types.d.ts +9 -0
  138. package/dist/ui/player/close-orchestrator/types.js +1 -0
  139. package/dist/ui/player/colors/index.d.ts +1 -0
  140. package/dist/ui/player/colors/index.js +1 -0
  141. package/dist/ui/player/colors/player-colors.d.ts +11 -0
  142. package/dist/ui/player/colors/player-colors.js +1 -0
  143. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.d.ts +2 -6
  144. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.js +11 -11
  145. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.d.ts +2 -3
  146. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.js +5 -5
  147. package/dist/ui/player/providers/default-feed-player-buffer.svelte.d.ts +3 -4
  148. package/dist/ui/player/providers/default-feed-player-buffer.svelte.js +16 -9
  149. package/dist/ui/player/providers/service.d.ts +2 -0
  150. package/dist/ui/player/providers/service.js +13 -0
  151. package/dist/ui/player/providers/types.d.ts +1 -0
  152. package/dist/ui/with-background/cmp.with-background.svelte +86 -0
  153. package/dist/ui/with-background/cmp.with-background.svelte.d.ts +10 -0
  154. package/dist/ui/with-background/index.d.ts +1 -0
  155. package/dist/ui/with-background/index.js +1 -0
  156. package/package.json +5 -1
  157. package/dist/content-player/fade-mixins.scss +0 -12
  158. package/dist/content-player/header.svelte +0 -15
  159. package/dist/content-player/header.svelte.d.ts +0 -28
  160. package/dist/media-center/media-center/discover/discover-panel-handler.svelte.d.ts +0 -31
  161. package/dist/media-center/media-center/discover/discover-panel-handler.svelte.js +0 -94
  162. package/dist/media-center/media-center/discover/discover-panel-localization.d.ts +0 -19
  163. package/dist/media-center/media-center/discover/discover-panel-localization.js +0 -78
  164. package/dist/media-center/media-center/discover/discover-panel.svelte +0 -142
  165. package/dist/media-center/media-center/handlers/feed-handler.svelte.d.ts +0 -6
  166. package/dist/media-center/media-center/handlers/feed-handler.svelte.js +0 -12
  167. package/dist/media-center/media-center/providers/index.d.ts +0 -2
  168. package/dist/media-center/media-center/providers/index.js +0 -2
  169. package/dist/media-center/media-center/providers/post-player-provider-generator.d.ts +0 -8
  170. package/dist/media-center/media-center/providers/post-player-provider-generator.js +0 -32
  171. package/dist/media-center/media-center/providers/streams-player-provider-generator.d.ts +0 -8
  172. package/dist/media-center/media-center/providers/streams-player-provider-generator.js +0 -36
  173. package/dist/media-center/model/types.d.ts +0 -17
  174. /package/dist/media-center/{model → media-center/feed}/types.js +0 -0
@@ -7,137 +7,91 @@
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- var _a;
11
10
  import { Utils } from '../../core/utils';
12
11
  import { default as PostsPlayerView } from '../../posts/posts-player/posts-player-view.svelte';
13
12
  import { default as StreamsPlayerView } from '../../streams/streams-player/streams-player-view.svelte';
14
13
  import { Loading } from '../../ui/loading';
14
+ import { WithBackground } from '../../ui/with-background';
15
15
  import { DiscoverPanel } from './discover';
16
16
  import { MediaCenterHeader, MediaCenterFooter, MediaCenterHeaderMobile } from './header-footer';
17
- import { MediaCenterContext } from './media-center-context.svelte.js';
17
+ import { MediaCenterContext } from './media-center-context.svelte';
18
18
  import { Menu } from './menu';
19
- import { makePostPlayerItemsProvider, makeStreamsPlayerDataProvider } from './providers';
20
19
  import { StreamsInCategoryPanel } from './streams-in-category';
21
20
  import { fade } from 'svelte/transition';
22
- let { config, playerProps, locale = 'en' } = $props();
23
- const enhancedPlayerSettings = () => {
24
- const playerSettings = playerProps.mode === 'discover' ? {} : Object.assign({}, playerProps.props.playerSettings);
25
- playerSettings.playerColors = context.playerColors;
26
- return playerSettings;
27
- };
28
- const commonPlayerProps = () => {
29
- return {
30
- playerSettings: enhancedPlayerSettings(),
31
- on: playerProps.mode !== 'discover' ? playerProps === null || playerProps === void 0 ? void 0 : playerProps.props.on : undefined
32
- };
33
- };
34
- const mapToMediaCenterMode = (propsMode) => {
35
- switch (propsMode) {
36
- case 'posts':
37
- return 'posts-feed';
38
- case 'streams':
39
- return 'streams-feed';
40
- case 'discover':
41
- return 'discover';
42
- default:
43
- return Utils.assertUnreachable(propsMode);
44
- }
45
- };
46
- let mediaCenterMode = $state(mapToMediaCenterMode(playerProps.mode));
21
+ let { config, modeProps, settings, closeOrchestrator } = $props();
47
22
  const context = new MediaCenterContext({
48
23
  config,
49
- followingHandler: (_a = config === null || config === void 0 ? void 0 : config.handlers) === null || _a === void 0 ? void 0 : _a.categoriesFollowingHandler,
24
+ closeOrchestrator,
25
+ settings,
50
26
  on: {
51
- initialized: () => {
52
- switch (mediaCenterMode) {
53
- case 'posts-feed':
54
- context.activateFeed({ categoryId: null });
27
+ initialized: (instance) => {
28
+ switch (modeProps.mode) {
29
+ case 'posts':
30
+ instance.playPostsFeed({
31
+ dataProvider: modeProps.props.dataProvider,
32
+ onPostActivated: modeProps.props.onPostActivated
33
+ });
55
34
  break;
56
- case 'streams-feed':
57
- context.activateFeed({ categoryId: null });
35
+ case 'streams':
36
+ instance.playStreamsFeed({
37
+ dataProvider: modeProps.props.dataProvider,
38
+ onStreamActivated: modeProps.props.onStreamActivated
39
+ });
58
40
  break;
59
41
  case 'discover':
60
- context.activateDiscover();
42
+ instance.activateDiscover({ categoryId: null });
61
43
  break;
62
44
  default:
63
- Utils.assertUnreachable(mediaCenterMode);
45
+ Utils.assertUnreachable(modeProps);
64
46
  }
47
+ },
48
+ failed: () => {
49
+ console.error('Media Center initialization failed');
50
+ closeOrchestrator.requestClose();
65
51
  }
66
52
  }
67
53
  });
68
54
  let headerHeight = $state(0);
69
- let computedPlayerProps = $state.raw(playerProps);
70
55
  let isMobileView = $state(false);
71
- let closeFn = $state.raw(null);
72
56
  const selectCategory = (categoryId) => __awaiter(void 0, void 0, void 0, function* () {
73
- var _a, _b;
74
- if (!config) {
75
- return;
76
- }
77
- switch (mediaCenterMode) {
78
- case 'posts-feed':
79
- if (context.categoriesHandler.selectedCategoryId === categoryId) {
80
- context.activateFeed();
57
+ switch (context.mediaCenterMode) {
58
+ case 'feed':
59
+ if (!context.feedPlayerProps) {
81
60
  return;
82
61
  }
83
- computedPlayerProps = {
84
- mode: 'posts',
85
- 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 }, commonPlayerProps())
86
- };
87
- context.activateFeed({ categoryId });
88
- break;
89
- case 'streams-feed':
90
- context.tryActivateStreamsInCategory(categoryId);
62
+ switch (context.feedPlayerProps.type) {
63
+ case 'posts':
64
+ if (context.categoriesHandler.selectedCategoryId === categoryId) {
65
+ return;
66
+ }
67
+ context.playPostsFeed({ filter: { categoryId } });
68
+ break;
69
+ case 'streams':
70
+ context.tryActivateStreamsInCategory(categoryId);
71
+ return;
72
+ default:
73
+ Utils.assertUnreachable(context.feedPlayerProps);
74
+ }
91
75
  break;
92
76
  case 'discover':
93
- console.warn('Apply category filter for discover mode is not implemented yet');
77
+ context.activateDiscover({ categoryId });
94
78
  break;
95
79
  default:
96
- Utils.assertUnreachable(mediaCenterMode);
80
+ Utils.assertUnreachable(context.mediaCenterMode);
97
81
  }
98
82
  });
99
83
  const activateSelectedShortVideoPlayer = (shortVideo) => {
100
- var _a, _b;
101
- if (!config) {
102
- return;
103
- }
104
- mediaCenterMode = 'posts-feed';
105
- computedPlayerProps = {
106
- mode: 'posts',
107
- 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 }, commonPlayerProps())
108
- };
109
- context.activateFeed({ categoryId: null });
84
+ context.playPostsFeed({ filter: { prefetchedItems: [shortVideo] } });
110
85
  };
111
86
  const activateSelectedStreamPlayer = (stream) => {
112
- var _a, _b;
113
- if (!config) {
114
- return;
115
- }
116
- mediaCenterMode = 'streams-feed';
117
- computedPlayerProps = {
118
- mode: 'streams',
119
- 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 }, commonPlayerProps())
120
- };
121
- context.activateFeed({ categoryId: null });
87
+ context.playStreamsFeed({ filter: { prefetchedStreams: [stream] } });
122
88
  };
123
89
  const activateSelectedStreamOfCategoryPlayer = (id, prefetchedStreams, categoryId) => {
124
- var _a, _b;
125
- if (!config) {
126
- return;
127
- }
128
- mediaCenterMode = 'streams-feed';
129
- computedPlayerProps = {
130
- mode: 'streams',
131
- 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 }, commonPlayerProps())
132
- };
133
- context.activateFeed();
90
+ context.playStreamsFeed({ filter: { categoryId, prefetchedStreams, initialStreamId: id } });
134
91
  };
135
92
  const onHeaderHeightChanged = (height) => {
136
93
  headerHeight = height;
137
94
  };
138
- const handlePlayerInitialized = (data) => {
139
- closeFn = data.closePlayerFn;
140
- };
141
95
  const onWidthAnchorMounted = (node) => {
142
96
  const resizeObserver = new ResizeObserver(() => {
143
97
  isMobileView = node.clientWidth <= 576;
@@ -149,74 +103,122 @@ const onWidthAnchorMounted = (node) => {
149
103
  }
150
104
  };
151
105
  };
106
+ const swipeToOpen = (node) => {
107
+ let startX = 0;
108
+ let startY = 0;
109
+ let isTracking = false;
110
+ let hasOpened = false;
111
+ let threshold = 60;
112
+ const MIN_DISTANCE = 10;
113
+ function handleTouchStart(e) {
114
+ if (e.touches.length !== 1) {
115
+ return;
116
+ }
117
+ const touch = e.touches[0];
118
+ startX = touch.clientX;
119
+ startY = touch.clientY;
120
+ isTracking = true;
121
+ hasOpened = false;
122
+ }
123
+ function handleTouchMove(e) {
124
+ if (!isTracking || hasOpened) {
125
+ return;
126
+ }
127
+ const touch = e.touches[0];
128
+ const dx = touch.clientX - startX;
129
+ const dy = touch.clientY - startY;
130
+ if (Math.abs(dx) < MIN_DISTANCE && Math.abs(dy) < MIN_DISTANCE) {
131
+ return;
132
+ }
133
+ if (Math.abs(dy) > Math.abs(dx)) {
134
+ isTracking = false;
135
+ return;
136
+ }
137
+ if (dx < 0) {
138
+ isTracking = false;
139
+ return;
140
+ }
141
+ if (dx > threshold) {
142
+ hasOpened = true;
143
+ context.showMenu();
144
+ }
145
+ }
146
+ function handleTouchEnd() {
147
+ isTracking = false;
148
+ }
149
+ node.addEventListener('touchstart', handleTouchStart, { passive: true });
150
+ node.addEventListener('touchmove', handleTouchMove, { passive: true });
151
+ node.addEventListener('touchend', handleTouchEnd);
152
+ return {
153
+ destroy() {
154
+ node.removeEventListener('touchstart', handleTouchStart);
155
+ node.removeEventListener('touchmove', handleTouchMove);
156
+ node.removeEventListener('touchend', handleTouchEnd);
157
+ }
158
+ };
159
+ };
152
160
  </script>
153
161
 
154
162
  {#if context.initializing}
155
163
  <Loading positionFixedCenter={true} timeout={600} />
164
+ {:else if !context.initialized}
165
+ Not initialized placeholder
156
166
  {:else}
157
- {#snippet mobileFooter()}
158
- <MediaCenterFooter context={context} />
159
- {/snippet}
160
- {#snippet header()}
161
- {#if !isMobileView}
162
- <MediaCenterHeader context={context} closeFn={closeFn} locale={locale} on={{ headerHeightChanged: onHeaderHeightChanged }} />
163
- {:else}
164
- <MediaCenterHeaderMobile context={context} closeFn={closeFn} on={{ headerHeightChanged: onHeaderHeightChanged }} />
165
- {/if}
166
- {/snippet}
167
- {#if computedPlayerProps.mode === 'posts'}
168
- <PostsPlayerView
169
- {...computedPlayerProps.props}
170
- playerSettings={enhancedPlayerSettings()}
171
- mediaCenterData={{
172
- header: context.mediaCenterEffective ? header : undefined,
173
- mobileFooter: isMobileView ? mobileFooter : undefined,
174
- overlayIsActive: context.overlayIsActive,
175
- callbacks: { onPlayerInitialized: handlePlayerInitialized }
176
- }} />
177
- {:else if computedPlayerProps.mode === 'streams'}
178
- <StreamsPlayerView
179
- {...computedPlayerProps.props}
180
- playerSettings={enhancedPlayerSettings()}
181
- mediaCenterData={{
182
- header: context.mediaCenterEffective ? header : undefined,
183
- mobileFooter: isMobileView ? mobileFooter : undefined,
184
- overlayIsActive: context.overlayIsActive,
185
- callbacks: { onPlayerInitialized: handlePlayerInitialized }
186
- }} />
187
- {/if}
188
- {#if context.loading}
189
- <Loading positionFixedCenter={true} timeout={600} />
190
- {/if}
167
+ <WithBackground {...context.backgroundWrapperProps}>
168
+ <div class="media-center" use:onWidthAnchorMounted>
169
+ {#if !isMobileView}
170
+ <MediaCenterHeader context={context} locale={settings?.locale} on={{ headerHeightChanged: onHeaderHeightChanged }} />
171
+ {:else}
172
+ <MediaCenterHeaderMobile context={context} on={{ headerHeightChanged: onHeaderHeightChanged }} />
173
+ {/if}
191
174
 
192
- {#if context.discoverHandler.active}
193
- <div class="media-center-overlay" class:media-center-overlay--mobile={isMobileView} style={`top:${headerHeight}px`} transition:fade={{ duration: 300 }}>
194
- <DiscoverPanel
195
- context={context}
196
- locale={locale}
197
- on={{
198
- shortVideoSelected: (shortVideo) => activateSelectedShortVideoPlayer(shortVideo),
199
- streamSelected: (stream) => activateSelectedStreamPlayer(stream)
200
- }} />
201
- </div>
202
- {/if}
175
+ <div class="media-center__content-container">
176
+ {#if context.mediaCenterMode === 'feed' && context.feedPlayerProps}
177
+ <div class="media-center__content" class:media-center__content--faded={context.overlayIsActive} transition:fade={{ duration: 300 }}>
178
+ {#if context.feedPlayerProps.type === 'posts'}
179
+ <PostsPlayerView {...context.feedPlayerProps.props} />
180
+ {:else if context.feedPlayerProps.type === 'streams'}
181
+ <StreamsPlayerView {...context.feedPlayerProps.props} />
182
+ {/if}
183
+ </div>
184
+ {:else if context.mediaCenterMode === 'discover'}
185
+ <div class="media-center__content" transition:fade={{ duration: 300 }}>
186
+ <DiscoverPanel
187
+ context={context}
188
+ locale={settings?.locale}
189
+ on={{
190
+ shortVideoSelected: (shortVideo) => activateSelectedShortVideoPlayer(shortVideo),
191
+ streamSelected: (stream) => activateSelectedStreamPlayer(stream)
192
+ }} />
193
+ </div>
194
+ {/if}
195
+ </div>
196
+ {#if context.loading}
197
+ <Loading positionFixedCenter={true} timeout={600} />
198
+ {/if}
203
199
 
204
- {#if context.streamsInCategoryHandler.active}
205
- <div class="media-center-overlay" class:media-center-overlay--mobile={isMobileView} style={`top:${headerHeight}px`} transition:fade={{ duration: 300 }}>
206
- <StreamsInCategoryPanel
207
- handler={context.streamsInCategoryHandler}
208
- on={{ streamSelected: (id, categoryId, streams) => activateSelectedStreamOfCategoryPlayer(id, streams, categoryId) }} />
209
- </div>
210
- {/if}
200
+ {#if context.streamsInCategoryHandler.active}
201
+ <div class="media-center-overlay" class:media-center-overlay--mobile={isMobileView} style={`top:${headerHeight}px`} transition:fade={{ duration: 300 }}>
202
+ <StreamsInCategoryPanel
203
+ handler={context.streamsInCategoryHandler}
204
+ on={{ streamSelected: (id, categoryId, streams) => activateSelectedStreamOfCategoryPlayer(id, streams, categoryId) }} />
205
+ </div>
206
+ {/if}
211
207
 
212
- {#if context.menuActive}
213
- <div class="menu-overlay" class:menu-overlay--mobile={isMobileView} onclick={context.hideMenu} onkeydown={() => {}} role="none">
214
- <div class="menu-overlay__panel">
215
- <Menu context={context} locale={locale} on={{ categorySelected: selectCategory, streamSelected: activateSelectedStreamPlayer }} />
216
- </div>
208
+ {#if context.menuActive}
209
+ <div class="menu-overlay" class:menu-overlay--mobile={isMobileView} onclick={context.hideMenu} onkeydown={() => {}} role="none">
210
+ <div class="menu-overlay__panel">
211
+ <Menu context={context} locale={settings?.locale} on={{ categorySelected: selectCategory, streamSelected: activateSelectedStreamPlayer }} />
212
+ </div>
213
+ </div>
214
+ {:else}
215
+ <div class="menu-swipe-area" use:swipeToOpen>&nbsp;</div>
216
+ {/if}
217
+ {#if isMobileView}
218
+ <MediaCenterFooter context={context} />
219
+ {/if}
217
220
  </div>
218
- {/if}
219
- <div class="media-center-width-anchor" use:onWidthAnchorMounted></div>
221
+ </WithBackground>
220
222
  {/if}
221
223
 
222
224
  <style>@keyframes fadeIn {
@@ -230,6 +232,34 @@ const onWidthAnchorMounted = (node) => {
230
232
  opacity: 1;
231
233
  }
232
234
  }
235
+ .media-center {
236
+ width: 100%;
237
+ min-width: 100%;
238
+ max-width: 100%;
239
+ height: 100%;
240
+ min-height: 100%;
241
+ max-height: 100%;
242
+ display: flex;
243
+ flex-direction: column;
244
+ position: relative;
245
+ }
246
+ .media-center__content-container {
247
+ flex: 1;
248
+ min-height: 0;
249
+ position: relative;
250
+ }
251
+ .media-center__content {
252
+ position: absolute;
253
+ inset: 0;
254
+ min-height: 0;
255
+ display: flex;
256
+ flex-direction: column;
257
+ }
258
+ .media-center__content--faded {
259
+ opacity: 0;
260
+ transition: opacity 0.3s ease-in-out;
261
+ }
262
+
233
263
  .media-center-overlay {
234
264
  position: absolute;
235
265
  inset: 0;
@@ -277,4 +307,20 @@ const onWidthAnchorMounted = (node) => {
277
307
  width: 17.5rem;
278
308
  height: 100%;
279
309
  max-height: 100%;
310
+ }
311
+
312
+ .menu-swipe-area {
313
+ display: none;
314
+ position: absolute;
315
+ top: 0;
316
+ left: 0;
317
+ width: 1.875rem;
318
+ height: 100%;
319
+ z-index: 1;
320
+ /* Set 'container-type: inline-size;' to reference container*/
321
+ }
322
+ @container (width < 576px) {
323
+ .menu-swipe-area {
324
+ display: block;
325
+ }
280
326
  }</style>
@@ -1,21 +1,4 @@
1
- import type { Locale } from '../../core/locale';
2
- import type { IMediaCenterConfig } from '../config/types';
3
- import type { PostPlayerProps } from '../../posts/posts-player/types';
4
- import type { StreamsPlayerProps } from '../../streams/streams-player/types';
5
- type PlayerProps = {
6
- mode: 'posts';
7
- props: PostPlayerProps;
8
- } | {
9
- mode: 'streams';
10
- props: StreamsPlayerProps;
11
- } | {
12
- mode: 'discover';
13
- };
14
- type Props = {
15
- config: IMediaCenterConfig | null;
16
- playerProps: PlayerProps;
17
- locale?: Locale;
18
- };
19
- declare const Cmp: import("svelte").Component<Props, {}, "">;
1
+ import type { MediaCenterProps } from './types';
2
+ declare const Cmp: import("svelte").Component<MediaCenterProps, {}, "">;
20
3
  type Cmp = ReturnType<typeof Cmp>;
21
4
  export default Cmp;
@@ -0,0 +1,8 @@
1
+ import type { IMediaCenterConfig } from '../../config/types';
2
+ import { StreamsInCategory, ShortVideosInCategory } from './types.svelte';
3
+ export declare class DiscoverDataLoader {
4
+ private readonly config;
5
+ constructor(config: IMediaCenterConfig);
6
+ loadStreams: (holder: StreamsInCategory) => Promise<void>;
7
+ loadShortVideos: (holder: ShortVideosInCategory) => Promise<void>;
8
+ }
@@ -0,0 +1,35 @@
1
+ import { PostType } from '../../..';
2
+ import { StreamsInCategory, ShortVideosInCategory } from './types.svelte';
3
+ export class DiscoverDataLoader {
4
+ config;
5
+ constructor(config) {
6
+ this.config = config;
7
+ }
8
+ loadStreams = async (holder) => {
9
+ if (holder.continuationToken === null) {
10
+ return;
11
+ }
12
+ const streamsResponse = await this.config.streamPlayer.getStreamsCursor({
13
+ filter: { categoryId: holder.categoryId ?? undefined },
14
+ limit: 6,
15
+ continuationToken: holder.continuationToken
16
+ });
17
+ holder.streams = [...holder.streams, ...streamsResponse.items];
18
+ holder.continuationToken = streamsResponse.continuationToken;
19
+ };
20
+ loadShortVideos = async (holder) => {
21
+ if (holder.continuationToken === null) {
22
+ return;
23
+ }
24
+ const shortVideosResponse = await this.config.postsPlayer.getPostsCursor({
25
+ filter: {
26
+ categoryId: holder.categoryId,
27
+ types: [PostType.ShortVideo]
28
+ },
29
+ limit: 6,
30
+ continuationToken: holder.continuationToken
31
+ });
32
+ holder.shortVideos = [...holder.shortVideos, ...shortVideosResponse.items];
33
+ holder.continuationToken = shortVideosResponse.continuationToken;
34
+ };
35
+ }
@@ -0,0 +1,6 @@
1
+ import { type Locale } from '../../../core/locale';
2
+ export declare class DiscoverHeaderLocalization {
3
+ membersLabel: (count: number) => string;
4
+ locale: Locale;
5
+ constructor(locale: Locale);
6
+ }
@@ -0,0 +1,15 @@
1
+ import {} from '../../../core/locale';
2
+ export class DiscoverHeaderLocalization {
3
+ membersLabel;
4
+ locale;
5
+ constructor(locale) {
6
+ this.membersLabel = loc.membersLabel[locale];
7
+ this.locale = locale;
8
+ }
9
+ }
10
+ const loc = {
11
+ membersLabel: {
12
+ en: (count) => (count === 1 ? `Member` : `Members`),
13
+ no: (count) => (count === 1 ? `Medlem` : `Medlemmer`)
14
+ }
15
+ };