@streamscloud/embeddable 14.0.0-rc.0 → 14.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 (165) hide show
  1. package/dist/core/analytics.profile-id.d.ts +5 -0
  2. package/dist/core/{analytics.installation-id.js → analytics.profile-id.js} +10 -20
  3. package/dist/external-api/data-providers/internal-media-center-analytics-handler.d.ts +14 -14
  4. package/dist/external-api/data-providers/internal-media-center-analytics-handler.js +19 -170
  5. package/dist/external-api/data-providers/internal-media-center-data-provider.svelte.js +6 -6
  6. package/dist/external-api/data-providers/internal-post-analytics-handler.d.ts +7 -7
  7. package/dist/external-api/data-providers/internal-post-analytics-handler.js +11 -72
  8. package/dist/external-api/data-providers/internal-stream-analytics-handler.d.ts +13 -12
  9. package/dist/external-api/data-providers/internal-stream-analytics-handler.js +18 -162
  10. package/dist/external-api/data-providers/mocks/index.d.ts +5 -0
  11. package/dist/external-api/data-providers/mocks/index.js +5 -0
  12. package/dist/{media-center/categories-following → external-api/data-providers/mocks}/mock-categories-following-handler.svelte.d.ts +1 -1
  13. package/dist/external-api/data-providers/mocks/mock-content-management-handler.svelte.d.ts +29 -0
  14. package/dist/external-api/data-providers/mocks/mock-content-management-handler.svelte.js +61 -0
  15. package/dist/{media-center/membership → external-api/data-providers/mocks}/mock-membership-handler.svelte.d.ts +1 -1
  16. package/dist/{media-center/navigation → external-api/data-providers/mocks}/mock-navigation-handler.svelte.d.ts +1 -2
  17. package/dist/{posts/social-interactions → external-api/data-providers/mocks}/mock-post-social-interactions-handler.svelte.d.ts +1 -2
  18. package/dist/{posts/social-interactions → external-api/data-providers/mocks}/mock-post-social-interactions-handler.svelte.js +17 -6
  19. package/dist/external-api/data-providers/mocks/operations.generated.d.ts +115 -0
  20. package/dist/external-api/data-providers/mocks/operations.generated.js +377 -0
  21. package/dist/external-api/data-providers/mocks/operations.graphql +18 -0
  22. package/dist/external-api/data-providers/post-data-loaders/mapper.js +3 -1
  23. package/dist/media-center/config/types.d.ts +7 -1
  24. package/dist/media-center/content-management/index.d.ts +1 -0
  25. package/dist/media-center/content-management/index.js +1 -0
  26. package/dist/media-center/content-management/types.d.ts +24 -0
  27. package/dist/media-center/content-management/types.js +1 -0
  28. package/dist/media-center/index.d.ts +2 -1
  29. package/dist/media-center/media-center/cmp.media-center-proxy.svelte +2 -2
  30. package/dist/media-center/media-center/discover/data-loading.d.ts +3 -0
  31. package/dist/media-center/media-center/discover/data-loading.js +13 -2
  32. package/dist/media-center/media-center/discover/discover-view-handler.svelte.d.ts +23 -0
  33. package/dist/media-center/media-center/discover/discover-view-handler.svelte.js +88 -0
  34. package/dist/media-center/media-center/discover/discover-view.svelte +90 -47
  35. package/dist/media-center/media-center/discover/discover-view.svelte.d.ts +2 -2
  36. package/dist/media-center/media-center/footer/media-center-footer.svelte +1 -1
  37. package/dist/media-center/media-center/handlers/index.d.ts +1 -0
  38. package/dist/media-center/media-center/handlers/index.js +1 -0
  39. package/dist/media-center/media-center/handlers/media-center-content-handler.svelte.d.ts +62 -0
  40. package/dist/media-center/media-center/handlers/media-center-content-handler.svelte.js +144 -0
  41. package/dist/media-center/media-center/header/media-center-header-mobile.svelte +10 -7
  42. package/dist/media-center/media-center/header/media-center-header.svelte +1 -1
  43. package/dist/media-center/media-center/media-center-context.svelte.d.ts +3 -2
  44. package/dist/media-center/media-center/media-center-context.svelte.js +30 -11
  45. package/dist/media-center/media-center/media-center-view.svelte +31 -13
  46. package/dist/media-center/media-center/menu/menu.svelte +16 -7
  47. package/dist/media-center/media-center/menu/menu.svelte.d.ts +1 -0
  48. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.d.ts +7 -0
  49. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.js +23 -8
  50. package/dist/media-center/media-center/moments/moments-feed-handler.svelte.d.ts +19 -2
  51. package/dist/media-center/media-center/moments/moments-feed-handler.svelte.js +51 -6
  52. package/dist/media-center/media-center/moments/moments-state.svelte.d.ts +2 -0
  53. package/dist/media-center/media-center/moments/moments-state.svelte.js +16 -1
  54. package/dist/media-center/media-center/posts-feed/posts-feed-handler.svelte.d.ts +24 -4
  55. package/dist/media-center/media-center/posts-feed/posts-feed-handler.svelte.js +90 -9
  56. package/dist/media-center/media-center/streams-feed/streams-feed-handler.svelte.d.ts +18 -3
  57. package/dist/media-center/media-center/streams-feed/streams-feed-handler.svelte.js +64 -9
  58. package/dist/media-center/media-center/streams-in-category/streams-in-category-panel.svelte +2 -6
  59. package/dist/posts/controls/index.d.ts +2 -1
  60. package/dist/posts/controls/index.js +2 -1
  61. package/dist/posts/controls/post-actions-generator.svelte.d.ts +20 -0
  62. package/dist/posts/controls/post-actions-generator.svelte.js +27 -0
  63. package/dist/posts/controls/post-actions-handler.svelte.d.ts +26 -0
  64. package/dist/posts/controls/post-actions-handler.svelte.js +56 -0
  65. package/dist/posts/index.d.ts +1 -0
  66. package/dist/posts/model/types.d.ts +1 -0
  67. package/dist/posts/post-viewer/cmp.post-viewer.svelte +6 -7
  68. package/dist/posts/post-viewer/cmp.post-viewer.svelte.d.ts +2 -2
  69. package/dist/posts/post-viewer/mapper.js +1 -0
  70. package/dist/posts/posts-player/cmp.posts-player.svelte +2 -1
  71. package/dist/posts/posts-player/cmp.posts-player.svelte.d.ts +2 -0
  72. package/dist/posts/posts-player/index.d.ts +2 -0
  73. package/dist/posts/posts-player/index.js +2 -1
  74. package/dist/posts/posts-player/posts-player-proxy.svelte +2 -1
  75. package/dist/posts/posts-player/posts-player-proxy.svelte.d.ts +3 -1
  76. package/dist/posts/posts-player/posts-player-view.svelte +132 -34
  77. package/dist/posts/posts-player/types.d.ts +13 -3
  78. package/dist/posts/sharing/index.d.ts +1 -0
  79. package/dist/posts/sharing/index.js +1 -0
  80. package/dist/posts/sharing/types.d.ts +5 -0
  81. package/dist/posts/sharing/types.js +1 -0
  82. package/dist/posts/social-interactions/types.d.ts +0 -1
  83. package/dist/streams/controls/index.d.ts +1 -0
  84. package/dist/streams/controls/index.js +1 -0
  85. package/dist/streams/controls/stream-actions-generator.svelte.d.ts +31 -0
  86. package/dist/streams/controls/stream-actions-generator.svelte.js +42 -0
  87. package/dist/streams/index.d.ts +1 -0
  88. package/dist/streams/index.js +1 -0
  89. package/dist/streams/layout/cmp.layout.svelte +4 -1
  90. package/dist/streams/layout/cmp.layout.svelte.d.ts +1 -0
  91. package/dist/streams/layout/element-views/cmp.short-video-stream-element.svelte +1 -0
  92. package/dist/streams/layout/models/mapper.js +1 -0
  93. package/dist/streams/sharing/index.d.ts +1 -0
  94. package/dist/streams/sharing/index.js +1 -0
  95. package/dist/streams/sharing/types.d.ts +5 -0
  96. package/dist/streams/sharing/types.js +1 -0
  97. package/dist/streams/stream-page-viewer/cmp.stream-page-viewer.svelte +43 -1
  98. package/dist/streams/stream-page-viewer/cmp.stream-page-viewer.svelte.d.ts +9 -0
  99. package/dist/streams/streams-player/cmp.streams-player.svelte +2 -1
  100. package/dist/streams/streams-player/cmp.streams-player.svelte.d.ts +2 -0
  101. package/dist/streams/streams-player/index.d.ts +2 -0
  102. package/dist/streams/streams-player/index.js +2 -1
  103. package/dist/streams/streams-player/streams-player-proxy.svelte +2 -1
  104. package/dist/streams/streams-player/streams-player-proxy.svelte.d.ts +2 -0
  105. package/dist/streams/streams-player/streams-player-view.svelte +150 -34
  106. package/dist/streams/streams-player/types.d.ts +8 -0
  107. package/dist/ui/button/resources/button-theme.svelte +2 -4
  108. package/dist/ui/card-actions/card-action-container.d.ts +2 -0
  109. package/dist/ui/card-actions/card-action-container.js +17 -0
  110. package/dist/ui/card-actions/cmp.card-action.svelte +28 -0
  111. package/dist/ui/card-actions/cmp.card-action.svelte.d.ts +10 -0
  112. package/dist/ui/card-actions/cmp.card-actions.svelte +71 -0
  113. package/dist/ui/card-actions/cmp.card-actions.svelte.d.ts +9 -0
  114. package/dist/ui/card-actions/index.d.ts +4 -0
  115. package/dist/ui/card-actions/index.js +3 -0
  116. package/dist/ui/card-actions/types.d.ts +9 -0
  117. package/dist/ui/card-actions/types.js +1 -0
  118. package/dist/ui/icon/cmp.icon.svelte +1 -1
  119. package/dist/ui/player/button/cmp.player-button.svelte +1 -3
  120. package/dist/ui/player/button/cmp.player-buttons-group.svelte +1 -3
  121. package/dist/ui/player/button/cmp.responsive-player-buttons-group.svelte +53 -0
  122. package/dist/ui/player/button/cmp.responsive-player-buttons-group.svelte.d.ts +10 -0
  123. package/dist/ui/player/button/index.d.ts +1 -0
  124. package/dist/ui/player/button/index.js +1 -0
  125. package/dist/{content-player → ui/player/content-player}/cmp.content-player.svelte +7 -29
  126. package/dist/{content-player → ui/player/content-player}/cmp.content-player.svelte.d.ts +11 -15
  127. package/dist/ui/player/content-player/content-player-config.svelte.d.ts +29 -0
  128. package/dist/ui/player/content-player/content-player-config.svelte.js +27 -0
  129. package/dist/{content-player → ui/player/content-player}/content-player-settings.svelte.d.ts +3 -3
  130. package/dist/{content-player → ui/player/content-player}/content-player-settings.svelte.js +2 -2
  131. package/dist/{content-player → ui/player/content-player}/controls-and-attachments.svelte +18 -65
  132. package/dist/{content-player → ui/player/content-player}/controls-and-attachments.svelte.d.ts +11 -14
  133. package/dist/{content-player → ui/player/content-player}/overview-panel.svelte +2 -4
  134. package/dist/{content-player → ui/player/content-player}/overview-panel.svelte.d.ts +5 -14
  135. package/dist/{content-player → ui/player/content-player}/ui-manager.svelte.d.ts +3 -2
  136. package/dist/{content-player → ui/player/content-player}/ui-manager.svelte.js +3 -2
  137. package/dist/ui/player/providers/chunks-player-buffer/player-chunk-item.svelte.d.ts +0 -2
  138. package/dist/ui/player/providers/chunks-player-buffer/player-chunk-item.svelte.js +1 -3
  139. package/dist/ui/player/providers/chunks-player-buffer/player-chunk.svelte.d.ts +3 -2
  140. package/dist/ui/player/providers/chunks-player-buffer/player-chunk.svelte.js +11 -5
  141. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.d.ts +3 -0
  142. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.js +74 -8
  143. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.d.ts +2 -0
  144. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.js +15 -4
  145. package/dist/ui/player/providers/default-feed-player-buffer.svelte.d.ts +1 -0
  146. package/dist/ui/player/providers/default-feed-player-buffer.svelte.js +27 -5
  147. package/dist/ui/player/providers/types.d.ts +1 -0
  148. package/dist/ui/player/slider/cmp.player-slider.svelte.d.ts +5 -14
  149. package/dist/ui/player/slider-horizontal/cmp.slider.svelte +2 -6
  150. package/dist/ui/player/slider-horizontal/cmp.slider.svelte.d.ts +5 -12
  151. package/dist/ui/shadow-dom/cmp.shadow-root.svelte +11 -6
  152. package/dist/ui/shadow-dom/colors.scss +2 -0
  153. package/package.json +7 -3
  154. package/dist/content-player/content-player-config.svelte.d.ts +0 -51
  155. package/dist/content-player/content-player-config.svelte.js +0 -48
  156. package/dist/core/analytics.installation-id.d.ts +0 -5
  157. package/dist/external-api/data-providers/mapper.d.ts +0 -3
  158. package/dist/external-api/data-providers/mapper.js +0 -18
  159. package/dist/posts/controls/cmp.controls.svelte +0 -120
  160. package/dist/posts/controls/cmp.controls.svelte.d.ts +0 -16
  161. /package/dist/{media-center/categories-following → external-api/data-providers/mocks}/mock-categories-following-handler.svelte.js +0 -0
  162. /package/dist/{media-center/membership → external-api/data-providers/mocks}/mock-membership-handler.svelte.js +0 -0
  163. /package/dist/{media-center/navigation → external-api/data-providers/mocks}/mock-navigation-handler.svelte.js +0 -0
  164. /package/dist/{content-player → ui/player/content-player}/index.d.ts +0 -0
  165. /package/dist/{content-player → ui/player/content-player}/index.js +0 -0
@@ -0,0 +1,5 @@
1
+ export interface IStreamSharingHandler {
2
+ share: (streamId: string) => PromiseLike<void>;
3
+ }
4
+ type PromiseLike<T> = T | Promise<T>;
5
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">import { StreamLayoutSlot, StreamPageLayout, StreamLayoutSlotContent } from '../layout';
2
+ import { ResponsivePlayerButtonsGroup } from '../../ui/player/button';
2
3
  import { StreamPageViewerLocalization } from './stream-page-viewer-localization';
3
- let { page, trackingParams, locale, on } = $props();
4
+ let { page, trackingParams, overlayControls, locale, on } = $props();
4
5
  const localization = $derived(new StreamPageViewerLocalization(locale));
5
6
  </script>
6
7
 
@@ -11,5 +12,46 @@ const localization = $derived(new StreamPageViewerLocalization(locale));
11
12
  <StreamLayoutSlotContent model={slot} trackingParams={trackingParams} on={on} locale={localization.elementsLocale} />
12
13
  </StreamLayoutSlot>
13
14
  {/each}
15
+ {#snippet controls()}
16
+ {#if overlayControls?.enabled && overlayControls.actions.length}
17
+ <div class="controls-panel">
18
+ <ResponsivePlayerButtonsGroup
19
+ actions={overlayControls.actions}
20
+ activeColor={overlayControls.colors?.active ?? null}
21
+ backgroundColor={overlayControls.colors?.inactive ?? null}
22
+ scaleEffect={true} />
23
+ </div>
24
+ {/if}
25
+ {/snippet}
14
26
  </StreamPageLayout>
15
27
  {/if}
28
+
29
+ <style>@keyframes fadeIn {
30
+ 0% {
31
+ opacity: 1;
32
+ }
33
+ 50% {
34
+ opacity: 0.4;
35
+ }
36
+ 100% {
37
+ opacity: 1;
38
+ }
39
+ }
40
+ .controls-panel {
41
+ position: absolute;
42
+ left: auto;
43
+ right: 0;
44
+ bottom: 6.25rem;
45
+ gap: 2.5rem;
46
+ display: flex;
47
+ flex-direction: column;
48
+ justify-content: flex-end;
49
+ align-items: flex-end;
50
+ padding: 0 0.625rem;
51
+ /* Set 'container-type: inline-size;' to reference container*/
52
+ }
53
+ @container (width < 576px) {
54
+ .controls-panel {
55
+ padding-right: 0;
56
+ }
57
+ }</style>
@@ -1,10 +1,19 @@
1
1
  import type { Locale } from '../../core/locale';
2
2
  import { type StreamTrackingParams } from '../layout';
3
+ import { type PlayerButtonDef } from '../../ui/player/button';
3
4
  import type { StreamPageViewerModel } from './types';
4
5
  type Props = {
5
6
  page: StreamPageViewerModel;
6
7
  trackingParams: StreamTrackingParams;
7
8
  locale: Locale;
9
+ overlayControls?: {
10
+ enabled: boolean;
11
+ colors: {
12
+ active: string | null;
13
+ inactive: string | null;
14
+ } | null;
15
+ actions: PlayerButtonDef[];
16
+ };
8
17
  on?: {
9
18
  productClick: (productId: string) => void;
10
19
  productImpression?: (productId: string) => void;
@@ -11,7 +11,7 @@ import { CloseOrchestrator } from '../../ui/player/close-orchestrator';
11
11
  import { createShadowRoot } from '../../ui/shadow-dom';
12
12
  import { default as StreamsPlayerProxy } from './streams-player-proxy.svelte';
13
13
  import { mount, unmount } from 'svelte';
14
- let { dataProvider, postSocialInteractionsHandler, amplificationParameters, playerSettings, analyticsHandler, on } = $props();
14
+ let { dataProvider, postSocialInteractionsHandler, sharingHandler, amplificationParameters, playerSettings, analyticsHandler, on } = $props();
15
15
  const initHost = (node) => {
16
16
  const shadowRoot = createShadowRoot(node);
17
17
  const mounted = mount(StreamsPlayerProxy, {
@@ -19,6 +19,7 @@ const initHost = (node) => {
19
19
  props: {
20
20
  dataProvider,
21
21
  postSocialInteractionsHandler,
22
+ sharingHandler,
22
23
  analyticsHandler,
23
24
  amplificationParameters,
24
25
  playerSettings,
@@ -1,9 +1,11 @@
1
1
  import type { Locale } from '../../core/locale';
2
2
  import type { IPostSocialInteractionsHandler } from '../../posts';
3
+ import type { IStreamSharingHandler } from '../sharing';
3
4
  import type { IStreamAnalyticsHandler, IStreamsPlayerDataProvider, StreamAmplificationParameters } from './types';
4
5
  type Props = {
5
6
  dataProvider: IStreamsPlayerDataProvider;
6
7
  postSocialInteractionsHandler?: IPostSocialInteractionsHandler;
8
+ sharingHandler?: IStreamSharingHandler;
7
9
  analyticsHandler?: IStreamAnalyticsHandler;
8
10
  amplificationParameters?: StreamAmplificationParameters;
9
11
  playerSettings?: {
@@ -1,6 +1,7 @@
1
1
  import type { Locale } from '../../core/locale';
2
2
  import { type IMediaCenterDataProvider } from '../../media-center/config/types';
3
3
  import type { IPostSocialInteractionsHandler } from '../../posts/social-interactions';
4
+ import type { IStreamSharingHandler } from '../sharing';
4
5
  import type { StreamPageViewerModel } from '../stream-page-viewer/types';
5
6
  import type { IStreamAnalyticsHandler, IStreamsPlayerDataProvider, StreamAmplificationParameters, StreamPlayerModel } from './types';
6
7
  export { type StreamPlayerModel, type StreamPageViewerModel };
@@ -75,6 +76,7 @@ export type { IStreamsPlayerDataProvider, IStreamAnalyticsHandler, IMediaCenterD
75
76
  export declare function openStreamsPlayer(init: {
76
77
  dataProvider: IStreamsPlayerDataProvider;
77
78
  postSocialInteractionsHandler?: IPostSocialInteractionsHandler;
79
+ sharingHandler?: IStreamSharingHandler;
78
80
  analyticsHandler?: IStreamAnalyticsHandler;
79
81
  amplificationParameters?: StreamAmplificationParameters;
80
82
  playerSettings?: StreamsPlayerSettings;
@@ -72,7 +72,7 @@ export {};
72
72
  * ```
73
73
  */
74
74
  export function openStreamsPlayer(init) {
75
- const { dataProvider, analyticsHandler, postSocialInteractionsHandler, amplificationParameters, playerSettings, on } = init;
75
+ const { dataProvider, analyticsHandler, postSocialInteractionsHandler, sharingHandler, amplificationParameters, playerSettings, on } = init;
76
76
  const shadowHost = new ModalShadowHost();
77
77
  let mounted = null;
78
78
  const makeCloseOrchestrator = () => new CloseOrchestrator({
@@ -93,6 +93,7 @@ export function openStreamsPlayer(init) {
93
93
  amplificationParameters,
94
94
  playerSettings,
95
95
  postSocialInteractionsHandler,
96
+ sharingHandler,
96
97
  closeOrchestrator: makeCloseOrchestrator(),
97
98
  on: {
98
99
  streamActivated: (data) => {
@@ -3,7 +3,7 @@ import {} from '../../ui/player/close-orchestrator';
3
3
  import { ShadowRoot } from '../../ui/shadow-dom';
4
4
  import { default as StreamsPlayerView } from './streams-player-view.svelte';
5
5
  import { untrack } from 'svelte';
6
- let { dataProvider, postSocialInteractionsHandler, amplificationParameters, closeOrchestrator, playerSettings, analyticsHandler, on } = $props();
6
+ let { dataProvider, postSocialInteractionsHandler, sharingHandler, amplificationParameters, closeOrchestrator, playerSettings, analyticsHandler, on } = $props();
7
7
  let backgroundImageUrl = $state(null);
8
8
  const handleBackgroundImagedLoaded = (url) => {
9
9
  backgroundImageUrl = url;
@@ -21,6 +21,7 @@ $effect(() => {
21
21
  <StreamsPlayerView
22
22
  dataProvider={{ type: 'provider', provider: dataProvider }}
23
23
  postSocialInteractionsHandler={postSocialInteractionsHandler}
24
+ sharingHandler={sharingHandler}
24
25
  analyticsHandler={analyticsHandler}
25
26
  amplificationParameters={amplificationParameters}
26
27
  playerSettings={playerSettings}
@@ -1,10 +1,12 @@
1
1
  import type { Locale } from '../../core/locale';
2
2
  import type { IPostSocialInteractionsHandler } from '../../posts/social-interactions';
3
+ import type { IStreamSharingHandler } from '../sharing';
3
4
  import { type ICloseOrchestrator } from '../../ui/player/close-orchestrator';
4
5
  import type { IStreamsPlayerDataProvider, IStreamAnalyticsHandler, StreamAmplificationParameters } from './types';
5
6
  type Props = {
6
7
  dataProvider: IStreamsPlayerDataProvider;
7
8
  postSocialInteractionsHandler?: IPostSocialInteractionsHandler;
9
+ sharingHandler?: IStreamSharingHandler;
8
10
  analyticsHandler?: IStreamAnalyticsHandler;
9
11
  amplificationParameters?: StreamAmplificationParameters;
10
12
  closeOrchestrator: ICloseOrchestrator;
@@ -8,18 +8,25 @@
8
8
  });
9
9
  };
10
10
  var _a;
11
- import { ContentPlayer, ContentPlayerConfig } from '../../content-player';
12
- import { ContentPlayerSettings } from '../../content-player/content-player-settings.svelte';
13
11
  import { preloadImage } from '../../core/image-preloader';
12
+ import { PostAttachments } from '../../posts/attachments';
13
+ import { PostModel } from '../../posts/model';
14
+ import { PostViewer } from '../../posts/post-viewer';
15
+ import { StreamActionsGenerator } from '../controls';
14
16
  import { mapToPostModel } from '../layout/models';
15
17
  import { StreamPageViewer } from '../stream-page-viewer';
18
+ import { IconColor } from '../../ui/icon';
19
+ import { ContentPlayer, ContentPlayerConfig, ContentPlayerSettings } from '../../ui/player/content-player';
16
20
  import { default as Overview } from './stream-overview.svelte';
17
21
  import { StreamPlayerLocalization } from './stream-player-localization';
18
22
  import { StreamsPlayerBuffer } from './streams-player-buffer.svelte';
23
+ import IconDelete from '@fluentui/svg-icons/icons/delete_32_regular.svg?raw';
24
+ import IconEdit from '@fluentui/svg-icons/icons/edit_32_regular.svg?raw';
19
25
  import { untrack } from 'svelte';
20
- let { dataProvider, analyticsHandler, postSocialInteractionsHandler, amplificationParameters, playerSettings, closeOrchestrator, on } = $props();
26
+ let { dataProvider, analyticsHandler, postSocialInteractionsHandler, sharingHandler, amplificationParameters, managementActions, playerSettings, closeOrchestrator, on } = $props();
21
27
  const localization = $derived(new StreamPlayerLocalization((_a = playerSettings === null || playerSettings === void 0 ? void 0 : playerSettings.locale) !== null && _a !== void 0 ? _a : 'en'));
22
28
  let currentStreamModel = $state(null);
29
+ let mappedPostsCache = new Map();
23
30
  let activePageId = $derived.by(() => { var _a, _b; return (_b = (_a = buffer === null || buffer === void 0 ? void 0 : buffer.current) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : ''; });
24
31
  let buffer = $state(null);
25
32
  let totalEngagementTimeSeconds = 0;
@@ -33,6 +40,7 @@ $effect(() => {
33
40
  untrack(() => {
34
41
  buffer = null;
35
42
  contentPlayerConfig.playerBuffer = null;
43
+ mappedPostsCache = new Map();
36
44
  initPlayerBuffer(dataProvider);
37
45
  });
38
46
  return () => { };
@@ -50,6 +58,9 @@ $effect(() => {
50
58
  var _a;
51
59
  if (stream) {
52
60
  currentStreamModel = stream;
61
+ if (stream.organizationId) {
62
+ analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.setOrganizationId(stream.organizationId);
63
+ }
53
64
  (_a = on === null || on === void 0 ? void 0 : on.streamActivated) === null || _a === void 0 ? void 0 : _a.call(on, { id: stream.id, title: stream.title, image: stream.cover });
54
65
  analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackStreamView(stream.id);
55
66
  startActivityTracking();
@@ -94,36 +105,8 @@ const initPlayerBuffer = (dataProvider) => __awaiter(void 0, void 0, void 0, fun
94
105
  });
95
106
  const contentPlayerConfig = new ContentPlayerConfig({
96
107
  playerBuffer: null,
97
- mappers: {
98
- postModelFromCurrentItem: (item) => {
99
- if (item.type === 'short-video' && item.shortVideo) {
100
- return mapToPostModel(item.shortVideo);
101
- }
102
- return null;
103
- }
104
- },
105
- socialInteractionsHandler: postSocialInteractionsHandler,
106
108
  settings: new ContentPlayerSettings(playerSettings),
107
109
  closeOrchestrator,
108
- callbacks: {
109
- videoProgress: (pageId, videoId, progress) => {
110
- onProgress(pageId, videoId, progress);
111
- },
112
- productClick: (id, videoId) => {
113
- analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackShortVideoProductClick(id, videoId);
114
- onStreamProductClick(id);
115
- },
116
- productImpression: (id, videoId) => {
117
- analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackShortVideoProductImpression(id, videoId);
118
- onStreamProductImpression(id);
119
- },
120
- adClick: (id) => {
121
- analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackAdClick(id);
122
- },
123
- adImpression: (id) => {
124
- analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackAdImpression(id);
125
- }
126
- },
127
110
  playerSliderCallbacks: {
128
111
  itemActivated: (item) => onPageActivated(item),
129
112
  itemDeactivated: (itemId) => executeWithStreamId((streamId) => {
@@ -131,6 +114,22 @@ const contentPlayerConfig = new ContentPlayerConfig({
131
114
  })
132
115
  }
133
116
  });
117
+ const streamActionsGenerator = new StreamActionsGenerator({
118
+ postSocialInteractionsHandler,
119
+ sharingHandler,
120
+ on: { attachmentClicked: () => (contentPlayerConfig.uiManager.attachmentsCollapsed = !contentPlayerConfig.uiManager.attachmentsCollapsed) }
121
+ });
122
+ const itemAsPostModel = (item) => {
123
+ if (item.type !== 'short-video' || !item.shortVideo) {
124
+ return null;
125
+ }
126
+ if (mappedPostsCache.has(item.shortVideo.id)) {
127
+ return mappedPostsCache.get(item.shortVideo.id);
128
+ }
129
+ const postModel = new PostModel(mapToPostModel(item.shortVideo));
130
+ mappedPostsCache.set(item.shortVideo.id, postModel);
131
+ return postModel;
132
+ };
134
133
  const handleChangePage = (index) => {
135
134
  if (!buffer) {
136
135
  return;
@@ -157,6 +156,23 @@ const onPageActivated = (id) => {
157
156
  }
158
157
  }
159
158
  };
159
+ const onShortVideoProgress = (pageId, videoId, progress) => {
160
+ onProgress(pageId, videoId, progress);
161
+ };
162
+ const onShortVideoProductClick = (id, videoId) => {
163
+ analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackShortVideoProductClick(id, videoId);
164
+ onStreamProductClick(id);
165
+ };
166
+ const onShortVideoProductImpression = (id, videoId) => {
167
+ analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackShortVideoProductImpression(id, videoId);
168
+ onStreamProductImpression(id);
169
+ };
170
+ const onShortVideoAdClick = (id) => {
171
+ analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackAdClick(id);
172
+ };
173
+ const onShortVideoAdImpression = (id) => {
174
+ analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackAdImpression(id);
175
+ };
160
176
  const onStreamProductClick = (productId) => {
161
177
  executeWithStreamId((streamId) => {
162
178
  analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackStreamProductClicked(productId, streamId);
@@ -178,6 +194,45 @@ const executeWithStreamId = (action) => {
178
194
  }
179
195
  action(currentStreamModel.id);
180
196
  };
197
+ const currentItemActions = $derived.by(() => {
198
+ if (!(buffer === null || buffer === void 0 ? void 0 : buffer.current) || !buffer.activeChunk) {
199
+ return [];
200
+ }
201
+ const result = [];
202
+ if (buffer.current.type === 'general') {
203
+ result.push(...streamActionsGenerator.getGeneralStreamPageActions({
204
+ streamId: buffer.activeChunk.model.id,
205
+ streamPageId: buffer.current.id
206
+ }));
207
+ }
208
+ else {
209
+ const postModel = itemAsPostModel(buffer.current);
210
+ const handler = streamActionsGenerator.getPostActionsHandler({
211
+ model: postModel,
212
+ streamId: buffer.activeChunk.model.id,
213
+ streamPageId: buffer.current.id
214
+ });
215
+ result.push(...handler.actions);
216
+ }
217
+ if (managementActions === null || managementActions === void 0 ? void 0 : managementActions.editStream) {
218
+ result.push({
219
+ icon: IconEdit,
220
+ callback: () => __awaiter(void 0, void 0, void 0, function* () {
221
+ yield managementActions.editStream(buffer.activeChunk.model.id);
222
+ })
223
+ });
224
+ }
225
+ if (managementActions === null || managementActions === void 0 ? void 0 : managementActions.deleteStreamPage) {
226
+ result.push({
227
+ icon: IconDelete,
228
+ iconColor: IconColor.Red,
229
+ callback: () => __awaiter(void 0, void 0, void 0, function* () {
230
+ yield managementActions.deleteStreamPage(buffer.current.id);
231
+ })
232
+ });
233
+ }
234
+ return result;
235
+ });
181
236
  //#region Activity Tracking
182
237
  const resetInactivityTimer = () => {
183
238
  if (!isActive) {
@@ -222,22 +277,83 @@ const stopActivityTracking = () => {
222
277
  //#edregion Activity Tracking
223
278
  </script>
224
279
 
225
- <ContentPlayer config={contentPlayerConfig}>
226
- {#snippet nonPostItemView({ item })}
280
+ {#snippet attachmentsView(data: { item: StreamPageViewerModel })}
281
+ {@const postModel = itemAsPostModel(data.item)}
282
+ {#if postModel}
283
+ <PostAttachments
284
+ model={postModel}
285
+ colors={{
286
+ background: contentPlayerConfig.playerColors.cardBackground,
287
+ price: contentPlayerConfig.playerColors.price,
288
+ salePrice: contentPlayerConfig.playerColors.salePrice,
289
+ buttonBackground: contentPlayerConfig.playerColors.cardButton
290
+ }}
291
+ trackingParams={contentPlayerConfig.trackingParams}
292
+ locale={contentPlayerConfig.settings.locale}
293
+ on={{
294
+ productClick: (id) => onShortVideoProductClick(id, postModel.id),
295
+ productImpression: (id) => onShortVideoProductImpression(id, postModel.id),
296
+ adClick: (id) => onShortVideoAdClick(id),
297
+ adImpression: (id) => onShortVideoAdImpression(id)
298
+ }} />
299
+ {/if}
300
+ {/snippet}
301
+ <ContentPlayer
302
+ config={contentPlayerConfig}
303
+ itemActions={currentItemActions}
304
+ attachmentsView={buffer?.current && itemAsPostModel(buffer.current)?.attachments ? attachmentsView : undefined}>
305
+ {#snippet itemView({ item })}
227
306
  {#if item.type === 'general'}
228
307
  <StreamPageViewer
229
308
  page={item}
230
309
  trackingParams={streamTrackingParams}
231
310
  locale={localization.locale}
311
+ overlayControls={{
312
+ enabled: contentPlayerConfig.uiManager.showControlsOverlay,
313
+ colors: {
314
+ active: contentPlayerConfig.playerColors.button,
315
+ inactive: contentPlayerConfig.playerColors.buttonInactive
316
+ },
317
+ actions: buffer?.activeChunk
318
+ ? streamActionsGenerator.getGeneralStreamPageActions({ streamId: buffer.activeChunk.model.id, streamPageId: item.id })
319
+ : []
320
+ }}
232
321
  on={{
233
322
  progress: (videoId, progress) => onProgress(item.id, videoId, progress),
234
323
  productClick: (productId) => onStreamProductClick(productId),
235
324
  productImpression: (productId) => onStreamProductImpression(productId)
236
325
  }} />
326
+ {:else}
327
+ {@const postModel = itemAsPostModel(item)}
328
+ {#if postModel}
329
+ {@const handler = buffer?.activeChunk
330
+ ? streamActionsGenerator.getPostActionsHandler({
331
+ model: postModel,
332
+ streamId: buffer.activeChunk.model.id,
333
+ streamPageId: item.id
334
+ })
335
+ : null}
336
+ <PostViewer
337
+ model={postModel}
338
+ controlsColors={{ active: contentPlayerConfig.playerColors.button, inactive: contentPlayerConfig.playerColors.buttonInactive }}
339
+ trackingParams={contentPlayerConfig.trackingParams}
340
+ enableAttachments={contentPlayerConfig.uiManager.showAttachmentsOverlay}
341
+ enableControls={contentPlayerConfig.uiManager.showControlsOverlay}
342
+ controlActions={handler?.actions ?? []}
343
+ autoplay="on-appearance"
344
+ locale={contentPlayerConfig.settings.locale}
345
+ on={{
346
+ progress: (progress) => onShortVideoProgress(item.id, postModel.id, progress),
347
+ productClick: (productId) => onShortVideoProductClick(productId, postModel.id),
348
+ productImpression: (productId) => onShortVideoProductImpression(productId, postModel.id),
349
+ adClick: (adId) => onShortVideoAdClick(adId),
350
+ adImpression: (adId) => onShortVideoAdImpression(adId)
351
+ }} />
352
+ {/if}
237
353
  {/if}
238
354
  {/snippet}
239
355
  {#snippet overviewPanelContent()}
240
- {#if contentPlayerConfig.playerBuffer && buffer && currentStreamModel}
356
+ {#if buffer}
241
357
  <Overview
242
358
  buffer={buffer}
243
359
  activePageId={activePageId}
@@ -1,6 +1,7 @@
1
1
  import type { Locale } from '../../core/locale';
2
2
  import type { ThemeValue } from '../../core/theme';
3
3
  import type { IPostSocialInteractionsHandler } from '../../posts/social-interactions';
4
+ import type { IStreamSharingHandler } from '../sharing';
4
5
  import type { StreamPageViewerModel } from '../stream-page-viewer';
5
6
  import type { ICloseOrchestrator } from '../../ui/player/close-orchestrator';
6
7
  import type { PlayerColors } from '../../ui/player/colors';
@@ -24,8 +25,10 @@ export type StreamsPlayerProps = {
24
25
  provider: IStreamsPlayerDataProvider;
25
26
  };
26
27
  postSocialInteractionsHandler?: IPostSocialInteractionsHandler;
28
+ sharingHandler?: IStreamSharingHandler;
27
29
  analyticsHandler?: IStreamAnalyticsHandler;
28
30
  amplificationParameters?: StreamAmplificationParameters;
31
+ managementActions?: StreamManagementActions;
29
32
  playerSettings?: StreamsPlayerSettings;
30
33
  closeOrchestrator: ICloseOrchestrator;
31
34
  on?: {
@@ -51,6 +54,10 @@ export type StreamAmplificationParameters = {
51
54
  campaignName: string;
52
55
  source: string;
53
56
  };
57
+ export type StreamManagementActions = {
58
+ editStream: ((id: string) => void) | null;
59
+ deleteStreamPage: ((pageId: string) => void) | null;
60
+ };
54
61
  export interface IStreamsPlayerDataProvider {
55
62
  initialData: {
56
63
  prefetchedStreams: StreamPlayerModel[];
@@ -63,6 +70,7 @@ export interface IStreamsPlayerDataProvider {
63
70
  onEndReached?: () => void;
64
71
  }
65
72
  export interface IStreamAnalyticsHandler {
73
+ setOrganizationId: (organizationId: string) => void;
66
74
  trackStreamView: (streamId: string) => void;
67
75
  trackStreamPageView: (pageId: string, streamId: string) => void;
68
76
  trackStreamProductImpression: (productId: string, streamId: string) => void;
@@ -36,6 +36,7 @@ let { style = undefined, size = ButtonSize.Standard, children } = $props();
36
36
  }
37
37
  .button-theme {
38
38
  display: contents;
39
+ /*Size*/
39
40
  }
40
41
  .button-theme--standard {
41
42
  --button--font--color: var(--sc-mc-color--text-primary);
@@ -45,15 +46,12 @@ let { style = undefined, size = ButtonSize.Standard, children } = $props();
45
46
  --button--background--disabled: #f2f2f3;
46
47
  --button--border: 1px solid #e5e7eb;
47
48
  }
48
- :global([data-theme='dark']) .button-theme--standard {
49
+ :global([data-theme="dark"]) .button-theme--standard {
49
50
  --button--background--hover: #1f2937;
50
51
  --button--background--active: #374151;
51
52
  --button--background--disabled: #374151;
52
53
  --button--border: 1px solid #4b5563;
53
54
  }
54
- .button-theme {
55
- /*Size*/
56
- }
57
55
  .button-theme--size-standard {
58
56
  --button--height: 2em;
59
57
  --button--text--font-size: 0.75em;
@@ -0,0 +1,2 @@
1
+ import type { Action } from 'svelte/action';
2
+ export declare const cardActionContainer: Action;
@@ -0,0 +1,17 @@
1
+ export const cardActionContainer = (node) => {
2
+ const handleHover = () => {
3
+ node.style.setProperty('--card-actions--opacity', '1');
4
+ };
5
+ const handleHoverOut = () => {
6
+ node.style.setProperty('--card-actions--opacity', '');
7
+ };
8
+ node.addEventListener('mouseenter', handleHover);
9
+ node.addEventListener('mouseleave', handleHoverOut);
10
+ node.style.position = 'relative';
11
+ return {
12
+ destroy() {
13
+ node.removeEventListener('mouseenter', handleHover);
14
+ node.removeEventListener('mouseleave', handleHoverOut);
15
+ }
16
+ };
17
+ };
@@ -0,0 +1,28 @@
1
+ <script lang="ts">import { Icon, IconColor } from '../icon';
2
+ let { action, on } = $props();
3
+ </script>
4
+
5
+ <button
6
+ type="button"
7
+ class="card-action"
8
+ title={action.title ?? ''}
9
+ onclick={(e) => {
10
+ if (!action.propagateClickEvent) {
11
+ e.stopPropagation();
12
+ }
13
+
14
+ action.callback?.();
15
+ on?.click?.();
16
+ }}>
17
+ <Icon src={action.icon} color={action.iconColor ?? IconColor.Text} />
18
+ </button>
19
+
20
+ <style>.card-action {
21
+ --_card-action--padding: var(--card-action-padding, 0.3125em);
22
+ padding: var(--_card-action--padding);
23
+ transition: transform 0.3s;
24
+ line-height: 0;
25
+ }
26
+ .card-action:hover {
27
+ transform: scale(1.2);
28
+ }</style>
@@ -0,0 +1,10 @@
1
+ import type { CardActionModel } from './types';
2
+ type Props = {
3
+ action: CardActionModel;
4
+ on?: {
5
+ click?: () => void;
6
+ };
7
+ };
8
+ declare const Cmp: import("svelte").Component<Props, {}, "">;
9
+ type Cmp = ReturnType<typeof Cmp>;
10
+ export default Cmp;
@@ -0,0 +1,71 @@
1
+ <script lang="ts">import { Dropdown } from '../dropdown';
2
+ import CardAction from './cmp.card-action.svelte';
3
+ import IconMoreVertical from '@fluentui/svg-icons/icons/more_vertical_20_regular.svg?raw';
4
+ let { actions, dropdownPosition = 'bottom-start' } = $props();
5
+ let toggleDropdown = $state.raw(null);
6
+ let closeDropdown = () => {
7
+ if (toggleDropdown) {
8
+ toggleDropdown(false);
9
+ }
10
+ };
11
+ </script>
12
+
13
+ {#if actions.length}
14
+ <div class="card-actions">
15
+ <Dropdown position={dropdownPosition} on={{ mounted: (v) => (toggleDropdown = v.toggleOpen) }}>
16
+ {#snippet trigger()}
17
+ <CardAction action={{ icon: IconMoreVertical, propagateClickEvent: true }} />
18
+ {/snippet}
19
+
20
+ <div class="card-actions__dropdown-content">
21
+ {#each actions as action (action)}
22
+ <CardAction action={action} on={{ click: closeDropdown }} />
23
+ {/each}
24
+ </div>
25
+ </Dropdown>
26
+ </div>
27
+ {/if}
28
+
29
+ <style>@keyframes fadeIn {
30
+ 0% {
31
+ opacity: 1;
32
+ }
33
+ 50% {
34
+ opacity: 0.4;
35
+ }
36
+ 100% {
37
+ opacity: 1;
38
+ }
39
+ }
40
+ .card-actions {
41
+ --_card-actions--opacity: var(--card-actions--opacity, 0);
42
+ --_card-actions--top-offset: var(--card-actions--top-offset, 0.3125em);
43
+ --_card-actions--left-offset: var(--card-actions--left-offset, 0.3125em);
44
+ --_card-actions--right-offset: var(--card-actions--right-offset, auto);
45
+ position: absolute;
46
+ top: var(--_card-actions--top-offset);
47
+ right: var(--_card-actions--right-offset);
48
+ left: var(--_card-actions--left-offset);
49
+ --icon--stroke-width: 0.3;
50
+ opacity: var(--_card-actions--opacity);
51
+ transition: opacity ease-in-out 0.4s;
52
+ display: flex;
53
+ background: var(--sc-mc-color--bg-card-action);
54
+ border-radius: 0.1875em;
55
+ }
56
+ .card-actions__dropdown-content {
57
+ padding: 0 0.3125em;
58
+ background: var(--sc-mc-color--bg-card-action);
59
+ }
60
+ @media (any-hover: none) {
61
+ .card-actions {
62
+ opacity: 1;
63
+ }
64
+ }
65
+
66
+ :global(.card-actions-container) {
67
+ position: relative;
68
+ }
69
+ :global(.card-actions-container):hover .card-actions {
70
+ opacity: 1;
71
+ }</style>
@@ -0,0 +1,9 @@
1
+ import { type DropdownPosition } from '../dropdown';
2
+ import type { CardActionModel } from './types';
3
+ type Props = {
4
+ actions: CardActionModel[];
5
+ dropdownPosition?: DropdownPosition;
6
+ };
7
+ declare const Cmp: import("svelte").Component<Props, {}, "">;
8
+ type Cmp = ReturnType<typeof Cmp>;
9
+ export default Cmp;
@@ -0,0 +1,4 @@
1
+ export { default as CardActions } from './cmp.card-actions.svelte';
2
+ export { default as CardAction } from './cmp.card-action.svelte';
3
+ export { cardActionContainer } from './card-action-container';
4
+ export type { CardActionModel } from './types';
@@ -0,0 +1,3 @@
1
+ export { default as CardActions } from './cmp.card-actions.svelte';
2
+ export { default as CardAction } from './cmp.card-action.svelte';
3
+ export { cardActionContainer } from './card-action-container';