@streamscloud/embeddable 8.3.0 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/dist/content-player/cmp.content-player.svelte +1 -1
  2. package/dist/content-player/content-player-config.svelte.d.ts +4 -4
  3. package/dist/content-player/controls-and-attachments.svelte +1 -1
  4. package/dist/content-player/header.svelte +1 -1
  5. package/dist/core/document.event-handlers.d.ts +1 -0
  6. package/dist/core/document.event-handlers.js +3 -0
  7. package/dist/media-center/config/internal-media-center-analytics-handler.d.ts +4 -3
  8. package/dist/media-center/config/internal-media-center-analytics-handler.js +1 -0
  9. package/dist/media-center/config/internal-media-center-config.d.ts +1 -1
  10. package/dist/media-center/config/internal-media-center-config.js +38 -48
  11. package/dist/media-center/config/operations.generated.d.ts +0 -104
  12. package/dist/media-center/config/operations.generated.js +0 -323
  13. package/dist/media-center/config/operations.graphql +0 -24
  14. package/dist/media-center/config/types.d.ts +14 -14
  15. package/dist/media-center/config/types.js +1 -1
  16. package/dist/media-center/media-center/cmp.media-center.svelte +101 -24
  17. package/dist/media-center/media-center/cmp.media-center.svelte.d.ts +5 -5
  18. package/dist/media-center/media-center/discover-panel-handler.svelte.d.ts +5 -4
  19. package/dist/media-center/media-center/discover-panel-handler.svelte.js +2 -1
  20. package/dist/media-center/media-center/discover-panel.svelte +1 -1
  21. package/dist/media-center/media-center/discover-panel.svelte.d.ts +4 -3
  22. package/dist/media-center/media-center/post-player-provider-generator.d.ts +8 -0
  23. package/dist/media-center/media-center/{short-video-resources-generator.js → post-player-provider-generator.js} +9 -3
  24. package/dist/media-center/media-center/streams-in-category-panel-handler.svelte.d.ts +5 -2
  25. package/dist/media-center/media-center/streams-in-category-panel-handler.svelte.js +5 -0
  26. package/dist/media-center/media-center/streams-in-category-panel.svelte +2 -2
  27. package/dist/media-center/media-center/streams-in-category-panel.svelte.d.ts +3 -2
  28. package/dist/media-center/media-center/streams-player-provider-generator.d.ts +8 -0
  29. package/dist/media-center/media-center/streams-player-provider-generator.js +36 -0
  30. package/dist/media-center/media-center/types.d.ts +1 -7
  31. package/dist/posts/controls/cmp.controls.svelte +1 -1
  32. package/dist/posts/data-loaders/index.d.ts +1 -0
  33. package/dist/posts/data-loaders/index.js +1 -0
  34. package/dist/posts/data-loaders/mapper.d.ts +3 -0
  35. package/dist/{short-videos/short-videos-player → posts/data-loaders}/mapper.js +2 -2
  36. package/dist/{short-videos/short-videos-player → posts/data-loaders}/operations.generated.d.ts +6 -6
  37. package/dist/{short-videos/short-videos-player → posts/data-loaders}/operations.generated.js +7 -10
  38. package/dist/posts/data-loaders/operations.graphql +17 -0
  39. package/dist/posts/data-loaders/posts-loader.d.ts +19 -0
  40. package/dist/posts/data-loaders/posts-loader.js +28 -0
  41. package/dist/posts/handlers/index.d.ts +1 -0
  42. package/dist/posts/handlers/index.js +1 -0
  43. package/dist/{short-videos/short-videos-player/internal-short-video-analytics-handler.d.ts → posts/handlers/internal-post-analytics-handler.d.ts} +3 -2
  44. package/dist/{short-videos/short-videos-player/internal-short-video-analytics-handler.js → posts/handlers/internal-post-analytics-handler.js} +2 -1
  45. package/dist/{short-videos/short-videos-player/cmp.short-videos-player.svelte → posts/posts-player/cmp.posts-player.svelte} +3 -3
  46. package/dist/posts/posts-player/cmp.posts-player.svelte.d.ts +4 -0
  47. package/dist/posts/posts-player/index.d.ts +55 -20
  48. package/dist/posts/posts-player/index.js +48 -32
  49. package/dist/posts/posts-player/posts-player-view.svelte +65 -15
  50. package/dist/posts/posts-player/posts-player-view.svelte.d.ts +5 -1
  51. package/dist/posts/posts-player/types.d.ts +9 -3
  52. package/dist/short-videos/data-providers/index.d.ts +1 -0
  53. package/dist/short-videos/data-providers/index.js +1 -0
  54. package/dist/short-videos/data-providers/internal-short-video-player-items-provider.d.ts +17 -0
  55. package/dist/short-videos/{short-videos-player/internal-short-video-player-provider.js → data-providers/internal-short-video-player-items-provider.js} +13 -33
  56. package/dist/short-videos/short-videos-player/index.d.ts +14 -64
  57. package/dist/short-videos/short-videos-player/index.js +77 -31
  58. package/dist/streams/data-loaders/index.d.ts +2 -0
  59. package/dist/streams/data-loaders/index.js +2 -0
  60. package/dist/streams/{stream-player → data-loaders}/mapper.d.ts +1 -1
  61. package/dist/streams/{stream-player → data-loaders}/operations.generated.d.ts +27 -24
  62. package/dist/streams/{stream-player → data-loaders}/operations.generated.js +18 -17
  63. package/dist/streams/{stream-player → data-loaders}/operations.graphql +6 -3
  64. package/dist/streams/data-loaders/stream-pages-loader.d.ts +10 -0
  65. package/dist/streams/data-loaders/stream-pages-loader.js +33 -0
  66. package/dist/streams/data-loaders/streams-loader.d.ts +19 -0
  67. package/dist/streams/data-loaders/streams-loader.js +28 -0
  68. package/dist/streams/{stream-player → streams-player}/index.d.ts +21 -22
  69. package/dist/streams/{stream-player → streams-player}/index.js +9 -7
  70. package/dist/streams/streams-player/internal-streams-player-data-provider.d.ts +16 -0
  71. package/dist/streams/streams-player/internal-streams-player-data-provider.js +55 -0
  72. package/dist/streams/{stream-player → streams-player}/stream-overview.svelte +18 -15
  73. package/dist/streams/{stream-player → streams-player}/stream-overview.svelte.d.ts +2 -2
  74. package/dist/streams/streams-player/streams-player-buffer.svelte.d.ts +8 -0
  75. package/dist/streams/streams-player/streams-player-buffer.svelte.js +15 -0
  76. package/dist/streams/{stream-player/stream-player-view.svelte → streams-player/streams-player-view.svelte} +69 -55
  77. package/dist/streams/streams-player/streams-player-view.svelte.d.ts +8 -0
  78. package/dist/streams/{stream-player → streams-player}/types.d.ts +9 -7
  79. package/dist/ui/{player-button → player/button}/cmp.player-button.svelte +1 -1
  80. package/dist/ui/{player-button → player/button}/cmp.player-button.svelte.d.ts +1 -1
  81. package/dist/ui/{player-button → player/button}/cmp.player-buttons-group.svelte +1 -1
  82. package/dist/ui/{player-button → player/button}/types.d.ts +1 -1
  83. package/dist/ui/player/button/types.js +1 -0
  84. package/dist/ui/player/providers/chunks-player-buffer/index.d.ts +2 -0
  85. package/dist/ui/player/providers/chunks-player-buffer/index.js +2 -0
  86. package/dist/ui/player/providers/chunks-player-buffer/player-chunk-item.svelte.d.ts +11 -0
  87. package/dist/ui/player/providers/chunks-player-buffer/player-chunk-item.svelte.js +11 -0
  88. package/dist/ui/player/providers/chunks-player-buffer/player-chunk.svelte.d.ts +31 -0
  89. package/dist/ui/player/providers/chunks-player-buffer/player-chunk.svelte.js +67 -0
  90. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.d.ts +23 -0
  91. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.js +119 -0
  92. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.d.ts +20 -0
  93. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.js +47 -0
  94. package/dist/ui/player/providers/default-feed-player-buffer.svelte.d.ts +27 -0
  95. package/dist/ui/player/providers/default-feed-player-buffer.svelte.js +78 -0
  96. package/dist/ui/player/providers/index.d.ts +3 -0
  97. package/dist/ui/player/providers/index.js +2 -0
  98. package/dist/ui/player/providers/types.d.ts +49 -0
  99. package/dist/ui/{player-slider → player/slider}/cmp.player-slider.svelte +7 -20
  100. package/dist/ui/{player-slider → player/slider}/cmp.player-slider.svelte.d.ts +4 -4
  101. package/dist/ui/{player-slider → player/slider}/index.d.ts +0 -2
  102. package/dist/ui/{player-slider → player/slider}/index.js +0 -1
  103. package/dist/ui/player/slider/types.d.ts +16 -0
  104. package/dist/ui/swipe-indicator/cmp.swipe-indicator.svelte +7 -8
  105. package/package.json +4 -4
  106. package/dist/media-center/media-center/short-video-resources-generator.d.ts +0 -8
  107. package/dist/short-videos/short-videos-player/cmp.short-videos-player.svelte.d.ts +0 -4
  108. package/dist/short-videos/short-videos-player/internal-short-video-player-provider.d.ts +0 -18
  109. package/dist/short-videos/short-videos-player/mapper.d.ts +0 -3
  110. package/dist/short-videos/short-videos-player/operations.graphql +0 -17
  111. package/dist/short-videos/short-videos-player/short-videos-player-view.svelte +0 -82
  112. package/dist/short-videos/short-videos-player/short-videos-player-view.svelte.d.ts +0 -8
  113. package/dist/short-videos/short-videos-player/types.d.ts +0 -26
  114. package/dist/streams/stream-player/internal-stream-player-data-provider.d.ts +0 -12
  115. package/dist/streams/stream-player/internal-stream-player-data-provider.js +0 -48
  116. package/dist/streams/stream-player/stream-player-buffer.svelte.d.ts +0 -28
  117. package/dist/streams/stream-player/stream-player-buffer.svelte.js +0 -79
  118. package/dist/streams/stream-player/stream-player-view.svelte.d.ts +0 -8
  119. package/dist/ui/player-button/types.js +0 -1
  120. package/dist/ui/player-slider/player-buffer.svelte.d.ts +0 -31
  121. package/dist/ui/player-slider/player-buffer.svelte.js +0 -76
  122. package/dist/ui/player-slider/types.d.ts +0 -26
  123. /package/dist/streams/{stream-player → data-loaders}/mapper.js +0 -0
  124. /package/dist/streams/{stream-player → streams-player}/internal-stream-analytics-handler.d.ts +0 -0
  125. /package/dist/streams/{stream-player → streams-player}/internal-stream-analytics-handler.js +0 -0
  126. /package/dist/streams/{stream-player → streams-player}/stream-player-localization.d.ts +0 -0
  127. /package/dist/streams/{stream-player → streams-player}/stream-player-localization.js +0 -0
  128. /package/dist/{short-videos/short-videos-player → streams/streams-player}/types.js +0 -0
  129. /package/dist/ui/{player-button → player/button}/cmp.player-buttons-group.svelte.d.ts +0 -0
  130. /package/dist/ui/{player-button → player/button}/index.d.ts +0 -0
  131. /package/dist/ui/{player-button → player/button}/index.js +0 -0
  132. /package/dist/{streams/stream-player → ui/player/providers}/types.js +0 -0
  133. /package/dist/ui/{player-slider → player/slider}/prevent-slider-scroll.d.ts +0 -0
  134. /package/dist/ui/{player-slider → player/slider}/prevent-slider-scroll.js +0 -0
  135. /package/dist/ui/{player-slider → player/slider}/types.js +0 -0
  136. /package/dist/ui/{player-slider → player/slider}/wheel-gestures-adapter.d.ts +0 -0
  137. /package/dist/ui/{player-slider → player/slider}/wheel-gestures-adapter.js +0 -0
@@ -1,6 +1,6 @@
1
1
  import { ProfileType } from '../../core/enums';
2
- import { mapToPostModel } from '../../posts/post-viewer';
3
- export const mapToShortVideoPlayerModel = (payload) => {
2
+ import { mapToPostModel } from '../post-viewer';
3
+ export const mapToPostPlayerModel = (payload) => {
4
4
  const viewerModel = mapToPostModel(payload);
5
5
  return {
6
6
  ...viewerModel,
@@ -1,11 +1,11 @@
1
1
  import type * as SchemaTypes from '../../../gql/types';
2
2
  import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';
3
- export type GetShortVideosQueryVariables = SchemaTypes.Exact<{
3
+ export type GetPostsQueryVariables = SchemaTypes.Exact<{
4
4
  input: SchemaTypes.EmbedPostsInput;
5
5
  image_scale?: SchemaTypes.InputMaybe<SchemaTypes.ImageScale>;
6
6
  }>;
7
- export type GetShortVideosQuery = {
8
- shortVideos: {
7
+ export type GetPostsQuery = {
8
+ posts: {
9
9
  continuationToken: string | null;
10
10
  items: Array<{
11
11
  id: string;
@@ -86,7 +86,7 @@ export type GetShortVideosQuery = {
86
86
  }>;
87
87
  };
88
88
  };
89
- export type ShortVideosPlayerPayloadFragment = {
89
+ export type PostsPlayerPayloadFragment = {
90
90
  id: string;
91
91
  enableSocialInteractions: boolean;
92
92
  ownerProfile: {
@@ -163,5 +163,5 @@ export type ShortVideosPlayerPayloadFragment = {
163
163
  } | null;
164
164
  };
165
165
  };
166
- export declare const ShortVideosPlayerPayloadFragmentDoc: DocumentNode<ShortVideosPlayerPayloadFragment, unknown>;
167
- export declare const GetShortVideosDocument: DocumentNode<GetShortVideosQuery, GetShortVideosQueryVariables>;
166
+ export declare const PostsPlayerPayloadFragmentDoc: DocumentNode<PostsPlayerPayloadFragment, unknown>;
167
+ export declare const GetPostsDocument: DocumentNode<GetPostsQuery, GetPostsQueryVariables>;
@@ -1,9 +1,9 @@
1
- export const ShortVideosPlayerPayloadFragmentDoc = {
1
+ export const PostsPlayerPayloadFragmentDoc = {
2
2
  kind: 'Document',
3
3
  definitions: [
4
4
  {
5
5
  kind: 'FragmentDefinition',
6
- name: { kind: 'Name', value: 'ShortVideosPlayerPayloadFragment' },
6
+ name: { kind: 'Name', value: 'PostsPlayerPayloadFragment' },
7
7
  typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Post' } },
8
8
  selectionSet: {
9
9
  kind: 'SelectionSet',
@@ -227,13 +227,13 @@ export const ShortVideosPlayerPayloadFragmentDoc = {
227
227
  }
228
228
  ]
229
229
  };
230
- export const GetShortVideosDocument = {
230
+ export const GetPostsDocument = {
231
231
  kind: 'Document',
232
232
  definitions: [
233
233
  {
234
234
  kind: 'OperationDefinition',
235
235
  operation: 'query',
236
- name: { kind: 'Name', value: 'GetShortVideos' },
236
+ name: { kind: 'Name', value: 'GetPosts' },
237
237
  variableDefinitions: [
238
238
  {
239
239
  kind: 'VariableDefinition',
@@ -252,7 +252,7 @@ export const GetShortVideosDocument = {
252
252
  selections: [
253
253
  {
254
254
  kind: 'Field',
255
- alias: { kind: 'Name', value: 'shortVideos' },
255
+ alias: { kind: 'Name', value: 'posts' },
256
256
  name: { kind: 'Name', value: 'embedPosts' },
257
257
  arguments: [{ kind: 'Argument', name: { kind: 'Name', value: 'input' }, value: { kind: 'Variable', name: { kind: 'Name', value: 'input' } } }],
258
258
  selectionSet: {
@@ -261,10 +261,7 @@ export const GetShortVideosDocument = {
261
261
  {
262
262
  kind: 'Field',
263
263
  name: { kind: 'Name', value: 'items' },
264
- selectionSet: {
265
- kind: 'SelectionSet',
266
- selections: [{ kind: 'FragmentSpread', name: { kind: 'Name', value: 'ShortVideosPlayerPayloadFragment' } }]
267
- }
264
+ selectionSet: { kind: 'SelectionSet', selections: [{ kind: 'FragmentSpread', name: { kind: 'Name', value: 'PostsPlayerPayloadFragment' } }] }
268
265
  },
269
266
  { kind: 'Field', name: { kind: 'Name', value: 'continuationToken' } }
270
267
  ]
@@ -477,7 +474,7 @@ export const GetShortVideosDocument = {
477
474
  },
478
475
  {
479
476
  kind: 'FragmentDefinition',
480
- name: { kind: 'Name', value: 'ShortVideosPlayerPayloadFragment' },
477
+ name: { kind: 'Name', value: 'PostsPlayerPayloadFragment' },
481
478
  typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Post' } },
482
479
  selectionSet: {
483
480
  kind: 'SelectionSet',
@@ -0,0 +1,17 @@
1
+ # noinspection GraphQLSchemaValidation
2
+ query GetPosts($input: EmbedPostsInput!, $image_scale: ImageScale = ORIGINAL_ENCODED) {
3
+ posts: embedPosts(input: $input) {
4
+ items {
5
+ ...PostsPlayerPayloadFragment
6
+ }
7
+ continuationToken
8
+ }
9
+ }
10
+
11
+ fragment PostsPlayerPayloadFragment on Post {
12
+ ...PostViewerPayloadFragment
13
+ ownerProfile {
14
+ id
15
+ type
16
+ }
17
+ }
@@ -0,0 +1,19 @@
1
+ import { PostType, Status } from '../../core/enums';
2
+ import type { PostPlayerModel } from '../posts-player/types';
3
+ import type { Client } from '@urql/core';
4
+ export declare const getPostsCursor: (input: {
5
+ filter: {
6
+ types: PostType[];
7
+ ids?: string[];
8
+ categoryId?: string;
9
+ excludeIds?: string[];
10
+ mediaPageId?: string;
11
+ statuses?: Status[];
12
+ };
13
+ limit: number;
14
+ continuationToken?: string | null;
15
+ graphql: Client;
16
+ }) => Promise<{
17
+ items: PostPlayerModel[];
18
+ continuationToken: string | null;
19
+ }>;
@@ -0,0 +1,28 @@
1
+ import { PostType, Status } from '../../core/enums';
2
+ import { mapToPostPlayerModel } from './mapper';
3
+ import { GetPostsDocument } from './operations.generated';
4
+ export const getPostsCursor = async (input) => {
5
+ const { filter, limit, continuationToken, graphql } = input;
6
+ const { ids, mediaPageId, categoryId, excludeIds, types, statuses } = filter;
7
+ const payload = await graphql
8
+ .query(GetPostsDocument, {
9
+ input: {
10
+ filter: {
11
+ ids,
12
+ mediaPageId,
13
+ types,
14
+ statuses,
15
+ categoryId,
16
+ excludeIds
17
+ },
18
+ limit,
19
+ continuationToken
20
+ }
21
+ })
22
+ .toPromise();
23
+ const posts = payload.data?.posts?.items || [];
24
+ return {
25
+ items: posts.map(mapToPostPlayerModel),
26
+ continuationToken: payload.data?.posts?.continuationToken || null
27
+ };
28
+ };
@@ -0,0 +1 @@
1
+ export { InternalPostAnalyticsHandler } from './internal-post-analytics-handler';
@@ -0,0 +1 @@
1
+ export { InternalPostAnalyticsHandler } from './internal-post-analytics-handler';
@@ -1,7 +1,8 @@
1
- import type { IShortVideoAnalyticsHandler } from './types';
2
- export declare class InternalShortVideoAnalyticsHandler implements IShortVideoAnalyticsHandler {
1
+ import type { IPostAnalyticsHandler } from '../posts-player';
2
+ export declare class InternalPostAnalyticsHandler implements IPostAnalyticsHandler {
3
3
  constructor(graphqlOrigin: string | undefined);
4
4
  setOrganizationId: (organizationId: string) => void;
5
+ trackPostOpened: (postId: string, ownerId: string) => void;
5
6
  trackShortVideoView: (videoId: string) => void;
6
7
  trackShortVideoProductImpression: (productId: string, videoId: string) => void;
7
8
  trackShortVideoProductClick: (productId: string, videoId: string) => void;
@@ -1,12 +1,13 @@
1
1
  import { getOrCreateProfileId } from '../../core/analytics.profile-id';
2
2
  import { constructGraphQLUrl } from '../../core/graphql';
3
3
  import { AppEventsTracker } from '@streamscloud/streams-analytics-collector';
4
- export class InternalShortVideoAnalyticsHandler {
4
+ export class InternalPostAnalyticsHandler {
5
5
  constructor(graphqlOrigin) {
6
6
  AppEventsTracker.setEndpoint(constructGraphQLUrl(graphqlOrigin));
7
7
  AppEventsTracker.setProfileId(getOrCreateProfileId());
8
8
  }
9
9
  setOrganizationId = (organizationId) => AppEventsTracker.setOrganizationId(organizationId);
10
+ trackPostOpened = (postId, ownerId) => AppEventsTracker.trackPostOpened(postId, ownerId);
10
11
  trackShortVideoView = (videoId) => AppEventsTracker.trackShortVideoView(videoId);
11
12
  trackShortVideoProductImpression = (productId, videoId) => AppEventsTracker.trackShortVideoProductImpression(productId, videoId);
12
13
  trackShortVideoProductClick = (productId, videoId) => AppEventsTracker.trackShortVideoProductClick(productId, videoId);
@@ -1,10 +1,10 @@
1
1
  <script lang="ts">import { createShadowRoot } from '../../ui/shadow-dom';
2
- import { default as ShortVideoPlayerView } from './short-videos-player-view.svelte';
2
+ import { default as PostsPlayerView } from './posts-player-view.svelte';
3
3
  import { mount, unmount } from 'svelte';
4
4
  let { dataProvider, socialInteractionsHandler, playerSettings, analyticsHandler, on } = $props();
5
5
  const initHost = (node) => {
6
6
  const shadowRoot = createShadowRoot(node);
7
- const mounted = mount(ShortVideoPlayerView, {
7
+ const mounted = mount(PostsPlayerView, {
8
8
  target: shadowRoot,
9
9
  props: {
10
10
  dataProvider,
@@ -23,5 +23,5 @@ const initHost = (node) => {
23
23
  </script>
24
24
 
25
25
  {#key dataProvider}
26
- <div class="short-videos-player-host" use:initHost></div>
26
+ <div class="posts-player-host" use:initHost></div>
27
27
  {/key}
@@ -0,0 +1,4 @@
1
+ import type { PostPlayerProps } from './types';
2
+ declare const Cmp: import("svelte").Component<PostPlayerProps, {}, "">;
3
+ type Cmp = ReturnType<typeof Cmp>;
4
+ export default Cmp;
@@ -1,73 +1,108 @@
1
+ import { type IMediaCenterConfig } from '../../media-center/config/types';
1
2
  import type { IPostSocialInteractionsHandler } from '../social-interactions';
2
- import type { IPlayerItemsProvider } from '../../ui/player-slider';
3
+ import { default as PostsPlayer } from './cmp.posts-player.svelte';
3
4
  import type { IPostAnalyticsHandler, PostPlayerModel, PostPlayerSettings } from './types';
4
- export { type PostPlayerModel };
5
- export type { IPlayerItemsProvider, IPostAnalyticsHandler };
5
+ export { PostsPlayer, type PostPlayerModel };
6
+ export type { IMediaCenterConfig, IPostAnalyticsHandler };
7
+ export { mapToPostPlayerModel } from '../data-loaders/mapper';
6
8
  /**
7
9
  * Opens the posts player modal.
8
10
  *
9
- * This version works only with a posts provider and removes legacy IDs/GraphQL modes.
10
- *
11
11
  * @param init Configuration options.
12
12
  *
13
- * Required
14
- * @param {IPlayerItemsProvider<PostPlayerModel>} init.postsProvider
13
+ * Data provider (required)
14
+ * @param init.postsProvider
15
15
  * Provider that supplies post items to the player.
16
16
  *
17
- * Optional
17
+ * Media center (optional)
18
+ * @param {IMediaCenterConfig} [init.mediaCenterConfig]
19
+ * Optional media-center config passed to MediaCenter.
20
+ *
21
+ * Analytics (optional)
18
22
  * @param {IPostAnalyticsHandler} [init.analyticsHandler]
19
- * Analytics events handler.
23
+ * Custom analytics handler for posts player events.
24
+ *
25
+ * Social interactions (optional)
20
26
  * @param {IPostSocialInteractionsHandler} [init.socialInteractionsHandler]
21
27
  * Handler for social interactions (like, share, etc.).
22
- * @param {ContentPlayerSettings} [init.playerSettings]
23
- * Player UI and behavior settings.
24
28
  *
25
- * Fields of ContentPlayerSettings:
29
+ * Player settings
30
+ * @param {PostPlayerSettings} [init.playerSettings]
31
+ * Player UI and behavior settings.
32
+ * Fields of PostPlayerSettings:
26
33
  * - {boolean} [disableBackground]
27
34
  * If true, hides the player's background image.
28
35
  * - {boolean} [hideCloseButton]
29
36
  * If true, hides the close button.
30
- * - {Locale} [locale='en']
31
- * Localization for the player UI. Supported values: 'en' | 'no'.
32
- * If omitted, the default locale 'en' is used.
37
+ * - {'en'|'no'} [locale='en']
38
+ * Localization for the player UI. Default is 'en'; use 'no' for Norwegian.
33
39
  * - {boolean} [showStreamsCloudWatermark]
34
40
  * If true, shows the StreamsCloud watermark.
35
41
  *
36
42
  * Events
37
- * @param {{ playerClosed?: () => void }} [init.on]
43
+ * @param {{ playerClosed?: () => void; postActivated?: (id: string) => void }} [init.on]
38
44
  * Optional event handlers.
39
45
  * @param {() => void} [init.on.playerClosed]
40
46
  * Called after the player is fully closed (after unmount and removal from the DOM).
47
+ * @param {(id: string) => void} [init.on.postActivated]
48
+ * Called when a post becomes active (receives the post's id).
41
49
  *
42
50
  * @returns {void}
43
51
  *
44
52
  * @example
45
53
  * ```ts
46
- * import { openPostsPlayer } from '@streamscloud/embeddable/short-videos-player';
54
+ * import { openPostsPlayer } from '@streamscloud/embeddable/posts-player';
47
55
  *
48
56
  * openPostsPlayer({
49
57
  * postsProvider: myPostsProvider,
58
+ * mediaCenterConfig: myMediaCenterConfig,
50
59
  * analyticsHandler: myAnalyticsHandler,
51
60
  * socialInteractionsHandler: mySocialHandler,
52
61
  * playerSettings: {
62
+ * // Default locale is 'en'; set 'no' to switch to Norwegian:
63
+ * locale: 'no',
53
64
  * disableBackground: false,
54
65
  * hideCloseButton: false,
55
- * // Locale is 'en' by default; set 'no' to switch to Norwegian:
56
- * locale: 'no',
57
66
  * showStreamsCloudWatermark: true,
58
67
  * },
59
68
  * on: {
60
69
  * playerClosed: () => console.log('Player closed'),
70
+ * postActivated: (id) => console.log('Activated post', id),
61
71
  * },
62
72
  * });
63
73
  * ```
64
74
  */
65
75
  export declare function openPostsPlayer(init: {
66
- postsProvider: IPlayerItemsProvider<PostPlayerModel>;
76
+ postsProvider: IPostsPlayerDataProvider;
77
+ mediaCenterConfig?: IMediaCenterConfig;
67
78
  analyticsHandler?: IPostAnalyticsHandler;
68
79
  socialInteractionsHandler?: IPostSocialInteractionsHandler;
69
80
  playerSettings?: PostPlayerSettings;
70
81
  on?: {
71
82
  playerClosed?: () => void;
83
+ postActivated?: (id: string) => void;
72
84
  };
73
85
  }): void;
86
+ export type IPostsPlayerDataProvider<TChunk extends WithId = WithId> = {
87
+ kind: 'feed';
88
+ initialData: {
89
+ prefetchedItems: PostPlayerModel[];
90
+ startIndex: number;
91
+ startMediaIndex?: number;
92
+ };
93
+ loadMore(): Promise<PostPlayerModel[]>;
94
+ } | {
95
+ kind: 'chunks';
96
+ initialData: {
97
+ prefetchedChunks: TChunk[];
98
+ startItemIndex?: number;
99
+ };
100
+ loadMoreChunks: () => Promise<TChunk[]>;
101
+ loadChunkItems: (chunkId: string, continuationToken: string | null | undefined) => Promise<{
102
+ items: PostPlayerModel[];
103
+ continuationToken: string | null;
104
+ }>;
105
+ };
106
+ type WithId = {
107
+ id: string;
108
+ };
@@ -1,84 +1,100 @@
1
+ import {} from '../../media-center/config/types';
2
+ import { MediaCenter } from '../../media-center/media-center';
1
3
  import { ModalShadowHost } from '../../ui/shadow-dom';
2
- import { default as PostPlayerView } from './posts-player-view.svelte';
4
+ import { default as PostsPlayer } from './cmp.posts-player.svelte';
3
5
  import { mount, unmount } from 'svelte';
4
- export {};
6
+ export { PostsPlayer };
7
+ export { mapToPostPlayerModel } from '../data-loaders/mapper';
5
8
  /**
6
9
  * Opens the posts player modal.
7
10
  *
8
- * This version works only with a posts provider and removes legacy IDs/GraphQL modes.
9
- *
10
11
  * @param init Configuration options.
11
12
  *
12
- * Required
13
- * @param {IPlayerItemsProvider<PostPlayerModel>} init.postsProvider
13
+ * Data provider (required)
14
+ * @param init.postsProvider
14
15
  * Provider that supplies post items to the player.
15
16
  *
16
- * Optional
17
+ * Media center (optional)
18
+ * @param {IMediaCenterConfig} [init.mediaCenterConfig]
19
+ * Optional media-center config passed to MediaCenter.
20
+ *
21
+ * Analytics (optional)
17
22
  * @param {IPostAnalyticsHandler} [init.analyticsHandler]
18
- * Analytics events handler.
23
+ * Custom analytics handler for posts player events.
24
+ *
25
+ * Social interactions (optional)
19
26
  * @param {IPostSocialInteractionsHandler} [init.socialInteractionsHandler]
20
27
  * Handler for social interactions (like, share, etc.).
21
- * @param {ContentPlayerSettings} [init.playerSettings]
22
- * Player UI and behavior settings.
23
28
  *
24
- * Fields of ContentPlayerSettings:
29
+ * Player settings
30
+ * @param {PostPlayerSettings} [init.playerSettings]
31
+ * Player UI and behavior settings.
32
+ * Fields of PostPlayerSettings:
25
33
  * - {boolean} [disableBackground]
26
34
  * If true, hides the player's background image.
27
35
  * - {boolean} [hideCloseButton]
28
36
  * If true, hides the close button.
29
- * - {Locale} [locale='en']
30
- * Localization for the player UI. Supported values: 'en' | 'no'.
31
- * If omitted, the default locale 'en' is used.
37
+ * - {'en'|'no'} [locale='en']
38
+ * Localization for the player UI. Default is 'en'; use 'no' for Norwegian.
32
39
  * - {boolean} [showStreamsCloudWatermark]
33
40
  * If true, shows the StreamsCloud watermark.
34
41
  *
35
42
  * Events
36
- * @param {{ playerClosed?: () => void }} [init.on]
43
+ * @param {{ playerClosed?: () => void; postActivated?: (id: string) => void }} [init.on]
37
44
  * Optional event handlers.
38
45
  * @param {() => void} [init.on.playerClosed]
39
46
  * Called after the player is fully closed (after unmount and removal from the DOM).
47
+ * @param {(id: string) => void} [init.on.postActivated]
48
+ * Called when a post becomes active (receives the post's id).
40
49
  *
41
50
  * @returns {void}
42
51
  *
43
52
  * @example
44
53
  * ```ts
45
- * import { openPostsPlayer } from '@streamscloud/embeddable/short-videos-player';
54
+ * import { openPostsPlayer } from '@streamscloud/embeddable/posts-player';
46
55
  *
47
56
  * openPostsPlayer({
48
57
  * postsProvider: myPostsProvider,
58
+ * mediaCenterConfig: myMediaCenterConfig,
49
59
  * analyticsHandler: myAnalyticsHandler,
50
60
  * socialInteractionsHandler: mySocialHandler,
51
61
  * playerSettings: {
62
+ * // Default locale is 'en'; set 'no' to switch to Norwegian:
63
+ * locale: 'no',
52
64
  * disableBackground: false,
53
65
  * hideCloseButton: false,
54
- * // Locale is 'en' by default; set 'no' to switch to Norwegian:
55
- * locale: 'no',
56
66
  * showStreamsCloudWatermark: true,
57
67
  * },
58
68
  * on: {
59
69
  * playerClosed: () => console.log('Player closed'),
70
+ * postActivated: (id) => console.log('Activated post', id),
60
71
  * },
61
72
  * });
62
73
  * ```
63
74
  */
64
75
  export function openPostsPlayer(init) {
65
- const { postsProvider, socialInteractionsHandler, playerSettings, on } = init;
66
- const dataProvider = postsProvider;
67
- const analyticsHandler = init.analyticsHandler;
76
+ const { postsProvider: dataProvider, mediaCenterConfig, analyticsHandler, socialInteractionsHandler, playerSettings, on } = init;
68
77
  const shadowHost = new ModalShadowHost();
69
- const mounted = mount(PostPlayerView, {
78
+ const mounted = mount(MediaCenter, {
70
79
  target: shadowHost.shadowRoot,
71
80
  props: {
72
- dataProvider,
73
- socialInteractionsHandler,
74
- playerSettings,
75
- analyticsHandler,
76
- on: {
77
- playerClosed: async () => {
78
- await unmount(mounted);
79
- shadowHost.remove();
80
- if (on?.playerClosed) {
81
- on.playerClosed();
81
+ config: mediaCenterConfig || null,
82
+ playerProps: {
83
+ mode: 'posts',
84
+ props: {
85
+ dataProvider,
86
+ socialInteractionsHandler,
87
+ analyticsHandler,
88
+ playerSettings,
89
+ on: {
90
+ playerClosed: async () => {
91
+ await unmount(mounted);
92
+ shadowHost.remove();
93
+ if (on?.playerClosed) {
94
+ on.playerClosed();
95
+ }
96
+ },
97
+ postActivated: on?.postActivated
82
98
  }
83
99
  }
84
100
  }
@@ -7,13 +7,15 @@
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
+ import { PostType } from '../..';
10
11
  import { ContentPlayer, ContentPlayerConfig } from '../../content-player';
11
12
  import { ContentPlayerSettings } from '../../content-player/content-player-settings';
12
13
  import { preloadImage } from '../../core/image-preloader';
14
+ import { Utils } from '../../core/utils';
13
15
  import { getPostCoverImage } from '../model';
14
- import { PlayerBuffer } from '../../ui/player-slider';
16
+ import { DefaultChunksPlayerBuffer, DefaultFeedPlayerBuffer } from '../../ui/player/providers';
15
17
  import { untrack } from 'svelte';
16
- let { dataProvider, socialInteractionsHandler, playerSettings, analyticsHandler, on } = $props();
18
+ let { dataProvider, socialInteractionsHandler, playerSettings, analyticsHandler, on, mediaCenterData } = $props();
17
19
  $effect(() => {
18
20
  void dataProvider;
19
21
  untrack(() => {
@@ -21,32 +23,76 @@ $effect(() => {
21
23
  initBuffer(dataProvider);
22
24
  });
23
25
  });
26
+ $effect(() => contentPlayerConfig.updateMediaCenterData(mediaCenterData));
24
27
  const initBuffer = (dataProvider) => __awaiter(void 0, void 0, void 0, function* () {
25
- new PlayerBuffer(dataProvider, {
26
- preloaded: (instance) => __awaiter(void 0, void 0, void 0, function* () {
27
- if (instance.loaded.length) {
28
- const coverUrl = getPostCoverImage(instance.loaded[0]);
29
- yield preloadImage(coverUrl);
30
- contentPlayerConfig.setBackgroundImageUrl(coverUrl);
31
- }
32
- contentPlayerConfig.playerBuffer = instance;
33
- })
34
- });
28
+ switch (dataProvider.kind) {
29
+ case 'feed':
30
+ new DefaultFeedPlayerBuffer(dataProvider, {
31
+ preloaded: (instance) => __awaiter(void 0, void 0, void 0, function* () {
32
+ if (instance.loaded.length) {
33
+ const coverUrl = getPostCoverImage(instance.loaded[0]);
34
+ yield preloadImage(coverUrl);
35
+ contentPlayerConfig.setBackgroundImageUrl(coverUrl);
36
+ }
37
+ contentPlayerConfig.playerBuffer = instance;
38
+ })
39
+ });
40
+ break;
41
+ case 'chunks':
42
+ new DefaultChunksPlayerBuffer(dataProvider, {
43
+ preloaded: (instance) => __awaiter(void 0, void 0, void 0, function* () {
44
+ if (instance.loaded.length) {
45
+ const coverUrl = getPostCoverImage(instance.loaded[0]);
46
+ yield preloadImage(coverUrl);
47
+ contentPlayerConfig.setBackgroundImageUrl(coverUrl);
48
+ }
49
+ contentPlayerConfig.playerBuffer = instance;
50
+ })
51
+ });
52
+ break;
53
+ default:
54
+ Utils.assertUnreachable(dataProvider);
55
+ }
35
56
  });
57
+ const getLoadedItemById = (id) => {
58
+ if (!contentPlayerConfig.playerBuffer) {
59
+ return null;
60
+ }
61
+ return contentPlayerConfig.playerBuffer.loaded.find((item) => item.id === id) || null;
62
+ };
36
63
  const contentPlayerConfig = new ContentPlayerConfig({
37
64
  playerBuffer: null,
38
65
  mappers: {
39
66
  postModelFromCurrentItem: (item) => item
40
67
  },
41
68
  socialInteractionsHandler,
69
+ mediaCenterData,
42
70
  settings: new ContentPlayerSettings(playerSettings),
43
71
  callbacks: {
44
- close: on === null || on === void 0 ? void 0 : on.playerClosed
72
+ close: on === null || on === void 0 ? void 0 : on.playerClosed,
73
+ productClick: (id, postId) => {
74
+ var _a;
75
+ if (((_a = getLoadedItemById(postId)) === null || _a === void 0 ? void 0 : _a.postType) === PostType.ShortVideo) {
76
+ analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackShortVideoProductClick(id, postId);
77
+ }
78
+ },
79
+ productImpression: (id, postId) => {
80
+ var _a;
81
+ if (((_a = getLoadedItemById(postId)) === null || _a === void 0 ? void 0 : _a.postType) === PostType.ShortVideo) {
82
+ analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackShortVideoProductImpression(id, postId);
83
+ }
84
+ },
85
+ adClick: (id) => {
86
+ analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackAdClick(id);
87
+ },
88
+ adImpression: (id) => {
89
+ analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackAdImpression(id);
90
+ }
45
91
  },
46
92
  playerSliderCallbacks: {
47
93
  itemActivated: (id) => {
48
94
  var _a;
49
- const post = (_a = contentPlayerConfig.playerBuffer) === null || _a === void 0 ? void 0 : _a.loaded.find((x) => x.id === id);
95
+ const post = getLoadedItemById(id);
50
96
  if (!post) {
51
97
  return;
52
98
  }
@@ -54,9 +100,13 @@ const contentPlayerConfig = new ContentPlayerConfig({
54
100
  if (post.analyticsOrganizationId) {
55
101
  analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.setOrganizationId(post.analyticsOrganizationId);
56
102
  }
57
- if (post.analyticsOrganizationId) {
103
+ if (post.postType === PostType.ShortVideo) {
104
+ analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackShortVideoView(id);
105
+ }
106
+ else if (post.analyticsOrganizationId) {
58
107
  analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackPostOpened(id, post.analyticsOrganizationId);
59
108
  }
109
+ (_a = on === null || on === void 0 ? void 0 : on.postActivated) === null || _a === void 0 ? void 0 : _a.call(on, id);
60
110
  }
61
111
  }
62
112
  });
@@ -1,4 +1,8 @@
1
+ import type { MediaCenterData } from '../../media-center/model/types';
1
2
  import type { PostPlayerProps } from './types';
2
- declare const PostsPlayerView: import("svelte").Component<PostPlayerProps, {}, "">;
3
+ type $$ComponentProps = PostPlayerProps & {
4
+ mediaCenterData?: MediaCenterData;
5
+ };
6
+ declare const PostsPlayerView: import("svelte").Component<$$ComponentProps, {}, "">;
3
7
  type PostsPlayerView = ReturnType<typeof PostsPlayerView>;
4
8
  export default PostsPlayerView;
@@ -1,21 +1,27 @@
1
1
  import type { IContentPlayerSettingsInitializer } from '../../content-player/content-player-settings';
2
2
  import type { IPostModel } from '..';
3
3
  import type { IPostSocialInteractionsHandler } from '../social-interactions';
4
- import type { IPlayerItemsProvider } from '../../ui/player-slider';
4
+ import type { IPlayerDataProvider } from '../../ui/player/providers';
5
5
  export interface IPostAnalyticsHandler {
6
6
  setOrganizationId: (organizationId: string) => void;
7
7
  trackPostOpened: (postId: string, ownerId: string) => void;
8
+ trackShortVideoView: (videoId: string) => void;
9
+ trackShortVideoProductImpression: (productId: string, videoId: string) => void;
10
+ trackShortVideoProductClick: (productId: string, videoId: string) => void;
11
+ trackAdClick: (adId: string) => void;
12
+ trackAdImpression: (adId: string) => void;
8
13
  }
9
14
  export type PostPlayerModel = IPostModel & {
10
15
  analyticsOrganizationId: string | null;
11
16
  };
12
17
  export type PostPlayerProps = {
13
- dataProvider: IPlayerItemsProvider<PostPlayerModel>;
18
+ dataProvider: IPlayerDataProvider<PostPlayerModel>;
14
19
  socialInteractionsHandler?: IPostSocialInteractionsHandler;
15
20
  analyticsHandler?: IPostAnalyticsHandler;
16
21
  playerSettings?: PostPlayerSettings;
17
22
  on?: {
18
23
  playerClosed?: () => void;
24
+ postActivated?: (id: string) => void;
19
25
  };
20
26
  };
21
- export type PostPlayerSettings = Pick<IContentPlayerSettingsInitializer, 'disableBackground' | 'hideCloseButton' | 'locale' | 'showStreamsCloudWatermark'>;
27
+ export type PostPlayerSettings = IContentPlayerSettingsInitializer;