@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,18 @@
1
+ # noinspection GraphQLSchemaValidation
2
+ query GetPost($id: String!, $image_scale: ImageScale = ORIGINAL_ENCODED) {
3
+ posts: embedPosts(input: { filter: { ids: [$id] } }) {
4
+ items {
5
+ ...PostsPlayerPayloadFragment
6
+ categoryIds
7
+ status
8
+ }
9
+ }
10
+ }
11
+
12
+ query GetStream($id: String!) {
13
+ embedStream(input: { id: $id }) {
14
+ ...StreamPlayerPayloadFragment
15
+ categoryIds
16
+ status
17
+ }
18
+ }
@@ -1,7 +1,9 @@
1
+ import { ProfileType } from '../../../core/enums';
1
2
  import { mapToPostModel } from '../../../posts/post-viewer';
2
3
  export const mapToPostPlayerModel = (payload) => {
3
4
  const viewerModel = mapToPostModel(payload);
4
5
  return {
5
- ...viewerModel
6
+ ...viewerModel,
7
+ analyticsOrganizationId: payload.ownerProfile.type === ProfileType.Organization ? payload.ownerProfile.id : null
6
8
  };
7
9
  };
@@ -1,10 +1,13 @@
1
1
  import { PostType } from '../../core/enums';
2
2
  import type { ThemeValue } from '../../core/theme';
3
3
  import type { IContentCategoryFollowingHandler } from '../categories-following';
4
+ import type { IMediaCenterContentManagementHandler } from '../content-management';
4
5
  import type { IMediaCenterMembershipHandler } from '../membership';
5
6
  import type { IMediaCenterNavigationHandler } from '../navigation';
6
7
  import type { IPostAnalyticsHandler, PostPlayerModel } from '../../posts/posts-player/types';
8
+ import type { IPostSharingHandler } from '../../posts/sharing';
7
9
  import type { IPostSocialInteractionsHandler } from '../../posts/social-interactions';
10
+ import type { IStreamSharingHandler } from '../../streams/sharing';
8
11
  import type { StreamPageViewerModel } from '../../streams/stream-page-viewer/types';
9
12
  import type { IStreamAnalyticsHandler, StreamPlayerModel } from '../../streams/streams-player/types';
10
13
  import type { PlayerColors } from '../../ui/player/colors';
@@ -16,7 +19,10 @@ export interface IMediaCenterDataProvider {
16
19
  categoriesFollowingHandler?: IContentCategoryFollowingHandler;
17
20
  membershipHandler?: IMediaCenterMembershipHandler;
18
21
  navigationHandler?: IMediaCenterNavigationHandler;
19
- socialInteractionsHandler?: IPostSocialInteractionsHandler;
22
+ postSocialInteractionsHandler?: IPostSocialInteractionsHandler;
23
+ postSharingHandler?: IPostSharingHandler;
24
+ streamSharingHandler?: IStreamSharingHandler;
25
+ contentManagementHandler?: IMediaCenterContentManagementHandler;
20
26
  };
21
27
  postsPlayer: {
22
28
  getPostsCursor: (input: {
@@ -0,0 +1 @@
1
+ export type { IMediaCenterContentManagementHandler } from './types';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,24 @@
1
+ import type { PostPlayerModel } from '../../posts/posts-player/types';
2
+ import type { StreamPlayerModel } from '../../streams/streams-player/types';
3
+ export interface IMediaCenterContentManagementHandler {
4
+ onHandlerMounted: (api: {
5
+ postCreated: (result: PostEditResult) => void;
6
+ }) => void;
7
+ editPost: ((postId: string) => Promise<PostEditResult | null>) | null;
8
+ editArticle: ((postId: string) => Promise<PostEditResult | null>) | null;
9
+ deletePost: ((postId: string) => Promise<boolean>) | null;
10
+ editStream: ((streamId: string) => Promise<StreamEditResult | null>) | null;
11
+ deleteStream: ((streamId: string) => Promise<boolean>) | null;
12
+ deleteStreamPage: ((streamPageId: string) => Promise<boolean>) | null;
13
+ }
14
+ type PostEditResult = {
15
+ post: PostPlayerModel;
16
+ categories: string[];
17
+ isPublished: boolean;
18
+ };
19
+ type StreamEditResult = {
20
+ stream: StreamPlayerModel;
21
+ categories: string[];
22
+ isPublished: boolean;
23
+ };
24
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -1,4 +1,5 @@
1
1
  export type { IMediaCenterDataProvider } from './config/types';
2
- export type { IContentCategoryFollowingHandler } from './categories-following/types';
2
+ export type { IContentCategoryFollowingHandler } from './categories-following';
3
3
  export type { IMediaCenterMembershipHandler } from './membership';
4
4
  export type { IMediaCenterNavigationHandler, MediaCenterState } from './navigation';
5
+ export type { IMediaCenterContentManagementHandler } from './content-management';
@@ -15,13 +15,13 @@ const context = new MediaCenterContext({
15
15
  initialized: (instance) => {
16
16
  switch (modeProps.mode) {
17
17
  case 'posts':
18
- instance.postsFeedHandler.activateWithExistingProvider({
18
+ instance.postsFeedHandler.activateWithDataProvider({
19
19
  dataProvider: modeProps.props.dataProvider,
20
20
  onPostActivated: modeProps.props.onPostActivated
21
21
  });
22
22
  break;
23
23
  case 'streams':
24
- instance.streamsFeedHandler.activateWithExistingProvider({
24
+ instance.streamsFeedHandler.activateWithDataProvider({
25
25
  dataProvider: modeProps.props.dataProvider,
26
26
  onStreamActivated: modeProps.props.onStreamActivated
27
27
  });
@@ -2,7 +2,10 @@ import type { IMediaCenterDataProvider } from '../../config/types';
2
2
  import { StreamsInCategory, ShortVideosInCategory } from './types.svelte';
3
3
  export declare class DiscoverDataLoader {
4
4
  private readonly dataProvider;
5
+ readonly minItemsPerLoad = 5;
5
6
  constructor(dataProvider: IMediaCenterDataProvider);
6
7
  loadStreams: (holder: StreamsInCategory) => Promise<void>;
8
+ reloadStreams: (holder: StreamsInCategory) => Promise<void>;
7
9
  loadShortVideos: (holder: ShortVideosInCategory) => Promise<void>;
10
+ reloadShortVideos: (holder: ShortVideosInCategory) => Promise<void>;
8
11
  }
@@ -2,6 +2,7 @@ import { PostType } from '../../..';
2
2
  import { StreamsInCategory, ShortVideosInCategory } from './types.svelte';
3
3
  export class DiscoverDataLoader {
4
4
  dataProvider;
5
+ minItemsPerLoad = 5;
5
6
  constructor(dataProvider) {
6
7
  this.dataProvider = dataProvider;
7
8
  }
@@ -11,12 +12,17 @@ export class DiscoverDataLoader {
11
12
  }
12
13
  const streamsResponse = await this.dataProvider.streamPlayer.getStreamsCursor({
13
14
  filter: { categoryId: holder.categoryId ?? undefined },
14
- limit: 5,
15
+ limit: this.minItemsPerLoad,
15
16
  continuationToken: holder.continuationToken
16
17
  });
17
18
  holder.streams = [...holder.streams, ...streamsResponse.items];
18
19
  holder.continuationToken = streamsResponse.continuationToken;
19
20
  };
21
+ reloadStreams = async (holder) => {
22
+ holder.continuationToken = undefined;
23
+ holder.streams = [];
24
+ await this.loadStreams(holder);
25
+ };
20
26
  loadShortVideos = async (holder) => {
21
27
  if (holder.continuationToken === null) {
22
28
  return;
@@ -26,10 +32,15 @@ export class DiscoverDataLoader {
26
32
  categoryId: holder.categoryId,
27
33
  types: [PostType.ShortVideo]
28
34
  },
29
- limit: 5,
35
+ limit: this.minItemsPerLoad,
30
36
  continuationToken: holder.continuationToken
31
37
  });
32
38
  holder.shortVideos = [...holder.shortVideos, ...shortVideosResponse.items];
33
39
  holder.continuationToken = shortVideosResponse.continuationToken;
34
40
  };
41
+ reloadShortVideos = async (holder) => {
42
+ holder.continuationToken = undefined;
43
+ holder.shortVideos = [];
44
+ await this.loadShortVideos(holder);
45
+ };
35
46
  }
@@ -1,5 +1,7 @@
1
1
  import type { IMediaCenterDataProvider } from '../../config/types';
2
2
  import type { MediaCenterState } from '../../navigation';
3
+ import type { PostPlayerModel } from '../../../posts/posts-player/types';
4
+ import type { StreamPlayerModel } from '../../../streams/streams-player/types';
3
5
  import { ShortVideosInCategory, StreamsInCategory } from './types.svelte';
4
6
  export declare class DiscoverViewHandler {
5
7
  private _state;
@@ -29,6 +31,27 @@ export declare class DiscoverViewHandler {
29
31
  }[];
30
32
  }) => Promise<void>;
31
33
  deactivate: () => void;
34
+ onPostCreated: (data: {
35
+ post: PostPlayerModel;
36
+ categories: string[];
37
+ isPublished: boolean;
38
+ }) => void;
39
+ onPostModified: (data: {
40
+ post: PostPlayerModel;
41
+ categories: string[];
42
+ isPublished: boolean;
43
+ }) => void;
44
+ onPostDeleted: (data: {
45
+ id: string;
46
+ }) => void;
47
+ onStreamModified: (data: {
48
+ stream: StreamPlayerModel;
49
+ categories: string[];
50
+ isPublished: boolean;
51
+ }) => void;
52
+ onStreamDeleted: (data: {
53
+ id: string;
54
+ }) => void;
32
55
  }
33
56
  type Callbacks = {
34
57
  navigationStateChanged: (state: MediaCenterState) => void;
@@ -1,4 +1,5 @@
1
1
  import { Deferred } from '../../../core/deferred';
2
+ import { PostType } from '../../../core/enums';
2
3
  import { DiscoverDataLoader } from './data-loading';
3
4
  import { ShortVideosInCategory, StreamsInCategory } from './types.svelte';
4
5
  export class DiscoverViewHandler {
@@ -111,4 +112,91 @@ export class DiscoverViewHandler {
111
112
  this._state = 'inactive';
112
113
  this._shortVideosLoadingDeferred = null;
113
114
  };
115
+ onPostCreated = (data) => {
116
+ if (!data.isPublished || data.post.postType !== PostType.ShortVideo) {
117
+ return;
118
+ }
119
+ const affectedHolders = this._shortVideosInCategoryCache.filter((x) => data.categories.includes(x.categoryId) && x.continuationToken !== undefined);
120
+ for (const holder of affectedHolders) {
121
+ holder.shortVideos = [data.post, ...holder.shortVideos];
122
+ }
123
+ };
124
+ onPostModified = (data) => {
125
+ const { post, categories, isPublished } = data;
126
+ for (const holder of this._shortVideosInCategory.filter((h) => h.continuationToken !== undefined)) {
127
+ const index = holder.shortVideos.findIndex((x) => x.id === post.id);
128
+ const isInCategory = categories.includes(holder.categoryId);
129
+ if (index !== -1) {
130
+ // Post exists in holder
131
+ if (isInCategory && isPublished) {
132
+ // Post remains in category and is published - update it
133
+ const clone = [...holder.shortVideos];
134
+ clone[index] = post;
135
+ holder.shortVideos = clone;
136
+ }
137
+ else {
138
+ // Post no longer in category or unpublished - remove it
139
+ holder.shortVideos = holder.shortVideos.filter((x) => x.id !== post.id);
140
+ if (holder.shortVideos.length < this._dataLoader.minItemsPerLoad) {
141
+ this._dataLoader.loadShortVideos(holder);
142
+ }
143
+ }
144
+ }
145
+ else {
146
+ // Post doesn't exist in holder
147
+ if (isInCategory && isPublished) {
148
+ // Post should be in this category - reset and reload
149
+ holder.continuationToken = undefined;
150
+ this._dataLoader.reloadShortVideos(holder);
151
+ }
152
+ }
153
+ }
154
+ };
155
+ onPostDeleted = (data) => {
156
+ for (const holder of this._shortVideosInCategoryCache) {
157
+ holder.shortVideos = holder.shortVideos.filter((x) => x.id !== data.id);
158
+ if (holder.shortVideos.length < this._dataLoader.minItemsPerLoad) {
159
+ this._dataLoader.loadShortVideos(holder);
160
+ }
161
+ }
162
+ };
163
+ onStreamModified = (data) => {
164
+ const { stream, categories, isPublished } = data;
165
+ for (const holder of this._streamsInCategoryCache.filter((h) => h.continuationToken !== undefined)) {
166
+ const index = holder.streams.findIndex((x) => x.id === stream.id);
167
+ const isInCategory = holder.categoryId === null || categories.includes(holder.categoryId);
168
+ if (index !== -1) {
169
+ // Stream exists in holder
170
+ if (isInCategory && isPublished) {
171
+ // Stream remains in category and is published - update it
172
+ const clone = [...holder.streams];
173
+ clone[index] = stream;
174
+ holder.streams = clone;
175
+ }
176
+ else {
177
+ // Stream no longer in category or unpublished - remove it
178
+ holder.streams = holder.streams.filter((x) => x.id !== stream.id);
179
+ if (holder.streams.length < this._dataLoader.minItemsPerLoad) {
180
+ this._dataLoader.loadStreams(holder);
181
+ }
182
+ }
183
+ }
184
+ else {
185
+ // Stream doesn't exist in holder
186
+ if (isInCategory && isPublished) {
187
+ // Stream should be in this category - reset and reload
188
+ holder.continuationToken = undefined;
189
+ this._dataLoader.loadStreams(holder);
190
+ }
191
+ }
192
+ }
193
+ };
194
+ onStreamDeleted = (data) => {
195
+ for (const holder of this._streamsInCategoryCache) {
196
+ holder.streams = holder.streams.filter((x) => x.id !== data.id);
197
+ if (holder.streams.length < this._dataLoader.minItemsPerLoad) {
198
+ this._dataLoader.loadStreams(holder);
199
+ }
200
+ }
201
+ };
114
202
  }
@@ -1,12 +1,71 @@
1
- <script lang="ts">import { getPostCoverImage } from '../../../posts/model';
1
+ <script lang="ts">var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { getPostCoverImage } from '../../../posts/model';
2
11
  import { ShortVideoCard } from '../../../short-videos/short-video-card';
3
12
  import { StreamCard } from '../../../streams/stream-card';
13
+ import { cardActionContainer, CardActions } from '../../../ui/card-actions';
14
+ import { IconColor } from '../../../ui/icon';
4
15
  import { InfiniteScrolling } from '../../../ui/infinite-scrolling';
5
16
  import { default as Header } from './discover-header.svelte';
6
17
  import { DiscoverViewLocalization } from './discover-view-localization';
18
+ import IconDelete from '@fluentui/svg-icons/icons/delete_20_regular.svg?raw';
19
+ import IconEdit from '@fluentui/svg-icons/icons/edit_20_regular.svg?raw';
7
20
  let { context, on } = $props();
8
21
  const handler = $derived(context.discoverHandler);
9
22
  const localization = $derived(new DiscoverViewLocalization(context.locale));
23
+ const generateShortVideoActions = (id) => {
24
+ const actions = [];
25
+ if (context.contentManagementHandler.editPost) {
26
+ actions.push({
27
+ icon: IconEdit,
28
+ callback: () => __awaiter(void 0, void 0, void 0, function* () {
29
+ var _a, _b;
30
+ (_b = (_a = context.contentManagementHandler).editPost) === null || _b === void 0 ? void 0 : _b.call(_a, id);
31
+ })
32
+ });
33
+ }
34
+ if (context.contentManagementHandler.deletePost) {
35
+ actions.push({
36
+ icon: IconDelete,
37
+ iconColor: IconColor.Red,
38
+ callback: () => __awaiter(void 0, void 0, void 0, function* () {
39
+ var _a, _b;
40
+ (_b = (_a = context.contentManagementHandler).deletePost) === null || _b === void 0 ? void 0 : _b.call(_a, id);
41
+ })
42
+ });
43
+ }
44
+ return actions;
45
+ };
46
+ const genereateStreamActions = (id) => {
47
+ const actions = [];
48
+ if (context.contentManagementHandler.editStream) {
49
+ actions.push({
50
+ icon: IconEdit,
51
+ callback: () => {
52
+ var _a, _b;
53
+ (_b = (_a = context.contentManagementHandler).editStream) === null || _b === void 0 ? void 0 : _b.call(_a, id);
54
+ }
55
+ });
56
+ }
57
+ if (context.contentManagementHandler.deleteStream) {
58
+ actions.push({
59
+ icon: IconDelete,
60
+ iconColor: IconColor.Red,
61
+ callback: () => __awaiter(void 0, void 0, void 0, function* () {
62
+ var _a, _b;
63
+ (_b = (_a = context.contentManagementHandler).deleteStream) === null || _b === void 0 ? void 0 : _b.call(_a, id);
64
+ })
65
+ });
66
+ }
67
+ return actions;
68
+ };
10
69
  </script>
11
70
 
12
71
  <div class="media-center-discover">
@@ -17,9 +76,12 @@ const localization = $derived(new DiscoverViewLocalization(context.locale));
17
76
  <div class="media-center-discover__section-header">
18
77
  {localization.latestStreamsSectionTitle}
19
78
  </div>
20
- <div class="media-center-discover__section-content media-center-discover__section-content--5">
79
+ <div class="media-center-discover__section-content media-center-discover__section-content--5 media-center-discover__section-content--not-alone">
21
80
  {#each handler.streamsHolder.streams as item (item.id)}
22
- <StreamCard stream={item} on={{ click: () => on.streamSelected(item) }}></StreamCard>
81
+ <div use:cardActionContainer>
82
+ <StreamCard stream={item} on={{ click: () => on.streamSelected(item, handler.streamsHolder?.categoryId ?? null) }}></StreamCard>
83
+ <CardActions actions={genereateStreamActions(item.id)} />
84
+ </div>
23
85
  {/each}
24
86
  </div>
25
87
  </div>
@@ -39,17 +101,20 @@ const localization = $derived(new DiscoverViewLocalization(context.locale));
39
101
  class:media-center-discover__section-content--4={index % 2 === 0}
40
102
  class:media-center-discover__section-content--not-alone={handler.shortVideosHolders.length > 1}>
41
103
  {#each holder.shortVideos as item (item.id)}
42
- <ShortVideoCard
43
- shortVideo={{
44
- id: item.id,
45
- text: item.text,
46
- cover: getPostCoverImage(item),
47
- displayDate: item.displayDate,
48
- viewsCount: item.viewsCount,
49
- products: item.products
50
- }}
51
- locale={context.locale}
52
- on={{ click: () => on.shortVideoSelected(item) }} />
104
+ <div use:cardActionContainer>
105
+ <ShortVideoCard
106
+ shortVideo={{
107
+ id: item.id,
108
+ text: item.text,
109
+ cover: getPostCoverImage(item),
110
+ displayDate: item.displayDate,
111
+ viewsCount: item.viewsCount,
112
+ products: item.products
113
+ }}
114
+ locale={context.locale}
115
+ on={{ click: () => on.shortVideoSelected(item, holder.categoryId) }} />
116
+ <CardActions actions={generateShortVideoActions(item.id)} />
117
+ </div>
53
118
  {/each}
54
119
  </div>
55
120
  </div>
@@ -81,6 +146,7 @@ const localization = $derived(new DiscoverViewLocalization(context.locale));
81
146
  overflow-y: auto;
82
147
  --_cross-browser-scrollbar--thumb-color: transparent;
83
148
  --_cross-browser-scrollbar--track-color: transparent;
149
+ /* Set 'container-type: inline-size;' to reference container*/
84
150
  }
85
151
  .media-center-discover:hover {
86
152
  --_cross-browser-scrollbar--thumb-color: var(--scrollbar--thumb-color, #7d7d7d);
@@ -104,9 +170,6 @@ const localization = $derived(new DiscoverViewLocalization(context.locale));
104
170
  scrollbar-width: thin;
105
171
  }
106
172
  }
107
- .media-center-discover {
108
- /* Set 'container-type: inline-size;' to reference container*/
109
- }
110
173
  @container (width < 576px) {
111
174
  .media-center-discover {
112
175
  padding-inline: 0.9375rem;
@@ -118,23 +181,19 @@ const localization = $derived(new DiscoverViewLocalization(context.locale));
118
181
  margin: 0 auto;
119
182
  padding-bottom: 1.25rem;
120
183
  /* Set 'container-type: inline-size;' to reference container*/
184
+ /* Set 'container-type: inline-size;' to reference container*/
185
+ /* Set 'container-type: inline-size;' to reference container*/
121
186
  }
122
187
  @container (width < 992px) {
123
188
  .media-center-discover__content {
124
189
  padding-bottom: 1rem;
125
190
  }
126
191
  }
127
- .media-center-discover__content {
128
- /* Set 'container-type: inline-size;' to reference container*/
129
- }
130
192
  @container (width < 768px) {
131
193
  .media-center-discover__content {
132
194
  padding-bottom: 0.8125rem;
133
195
  }
134
196
  }
135
- .media-center-discover__content {
136
- /* Set 'container-type: inline-size;' to reference container*/
137
- }
138
197
  @container (width < 576px) {
139
198
  .media-center-discover__content {
140
199
  padding-bottom: 0.625rem;
@@ -145,23 +204,19 @@ const localization = $derived(new DiscoverViewLocalization(context.locale));
145
204
  flex-direction: column;
146
205
  gap: 3rem;
147
206
  /* Set 'container-type: inline-size;' to reference container*/
207
+ /* Set 'container-type: inline-size;' to reference container*/
208
+ /* Set 'container-type: inline-size;' to reference container*/
148
209
  }
149
210
  @container (width < 992px) {
150
211
  .media-center-discover__feed {
151
212
  gap: 2.5rem;
152
213
  }
153
214
  }
154
- .media-center-discover__feed {
155
- /* Set 'container-type: inline-size;' to reference container*/
156
- }
157
215
  @container (width < 768px) {
158
216
  .media-center-discover__feed {
159
217
  gap: 2rem;
160
218
  }
161
219
  }
162
- .media-center-discover__feed {
163
- /* Set 'container-type: inline-size;' to reference container*/
164
- }
165
220
  @container (width < 576px) {
166
221
  .media-center-discover__feed {
167
222
  gap: 1.5rem;
@@ -198,13 +253,13 @@ const localization = $derived(new DiscoverViewLocalization(context.locale));
198
253
  .media-center-discover__section-content--4 {
199
254
  gap: 1.25rem;
200
255
  grid-template-columns: repeat(4, minmax(0, 1fr));
256
+ /* Set 'container-type: inline-size;' to reference container*/
257
+ /* Set 'container-type: inline-size;' to reference container*/
258
+ /* Set 'container-type: inline-size;' to reference container*/
201
259
  }
202
260
  .media-center-discover__section-content--4 :global(> :nth-child(n + 5)) {
203
261
  display: var(--_section-content--more-items--display);
204
262
  }
205
- .media-center-discover__section-content--4 {
206
- /* Set 'container-type: inline-size;' to reference container*/
207
- }
208
263
  @container (width < 992px) {
209
264
  .media-center-discover__section-content--4 {
210
265
  gap: 1rem;
@@ -214,9 +269,6 @@ const localization = $derived(new DiscoverViewLocalization(context.locale));
214
269
  display: var(--_section-content--more-items--display);
215
270
  }
216
271
  }
217
- .media-center-discover__section-content--4 {
218
- /* Set 'container-type: inline-size;' to reference container*/
219
- }
220
272
  @container (width < 768px) {
221
273
  .media-center-discover__section-content--4 {
222
274
  gap: 0.75rem;
@@ -229,9 +281,6 @@ const localization = $derived(new DiscoverViewLocalization(context.locale));
229
281
  display: var(--_section-content--more-items--display);
230
282
  }
231
283
  }
232
- .media-center-discover__section-content--4 {
233
- /* Set 'container-type: inline-size;' to reference container*/
234
- }
235
284
  @container (width < 576px) {
236
285
  .media-center-discover__section-content--4 {
237
286
  gap: 0.625rem;
@@ -240,13 +289,13 @@ const localization = $derived(new DiscoverViewLocalization(context.locale));
240
289
  .media-center-discover__section-content--5 {
241
290
  gap: 1.875rem;
242
291
  grid-template-columns: repeat(5, minmax(0, 1fr));
292
+ /* Set 'container-type: inline-size;' to reference container*/
293
+ /* Set 'container-type: inline-size;' to reference container*/
294
+ /* Set 'container-type: inline-size;' to reference container*/
243
295
  }
244
296
  .media-center-discover__section-content--5 :global(> :nth-child(n + 6)) {
245
297
  display: var(--_section-content--more-items--display);
246
298
  }
247
- .media-center-discover__section-content--5 {
248
- /* Set 'container-type: inline-size;' to reference container*/
249
- }
250
299
  @container (width < 992px) {
251
300
  .media-center-discover__section-content--5 {
252
301
  gap: 1.5rem;
@@ -256,9 +305,6 @@ const localization = $derived(new DiscoverViewLocalization(context.locale));
256
305
  display: var(--_section-content--more-items--display);
257
306
  }
258
307
  }
259
- .media-center-discover__section-content--5 {
260
- /* Set 'container-type: inline-size;' to reference container*/
261
- }
262
308
  @container (width < 768px) {
263
309
  .media-center-discover__section-content--5 {
264
310
  gap: 1.125rem;
@@ -268,9 +314,6 @@ const localization = $derived(new DiscoverViewLocalization(context.locale));
268
314
  display: var(--_section-content--more-items--display);
269
315
  }
270
316
  }
271
- .media-center-discover__section-content--5 {
272
- /* Set 'container-type: inline-size;' to reference container*/
273
- }
274
317
  @container (width < 576px) {
275
318
  .media-center-discover__section-content--5 {
276
319
  gap: 0.9375rem;
@@ -4,8 +4,8 @@ import type { MediaCenterContext } from '../media-center-context.svelte';
4
4
  type Props = {
5
5
  context: MediaCenterContext;
6
6
  on: {
7
- shortVideoSelected: (shortVideo: PostPlayerModel) => void;
8
- streamSelected: (stream: StreamPlayerModel) => void;
7
+ shortVideoSelected: (shortVideo: PostPlayerModel, categoryId: string | null) => void;
8
+ streamSelected: (stream: StreamPlayerModel, categoryId: string | null) => void;
9
9
  };
10
10
  };
11
11
  declare const DiscoverView: import("svelte").Component<Props, {}, "">;
@@ -12,7 +12,7 @@ let { context } = $props();
12
12
  type="button"
13
13
  class="media-center-footer__button"
14
14
  class:media-center-footer__button--active={context.postsFeedHandler.activated || context.streamsFeedHandler.activated}
15
- onclick={() => context.playRootFeed()}>
15
+ onclick={() => context.activateDefaultFeed()}>
16
16
  <Icon src={IconPhone} />
17
17
  </button>
18
18
  <div class="media-center-footer__spacer"></div>
@@ -1,3 +1,4 @@
1
1
  export { CategoriesHandler } from './categories-handler.svelte';
2
2
  export type { MediaCenterCategoryModel, MediaCenterSubCategoryModel, MediaCenterCategoryTagModel } from './categories-handler.svelte';
3
3
  export { MediaCenterSettingsHandler } from './media-center-settings-handler.svelte';
4
+ export { MediaCenterContentHandler } from './media-center-content-handler.svelte';
@@ -1,2 +1,3 @@
1
1
  export { CategoriesHandler } from './categories-handler.svelte';
2
2
  export { MediaCenterSettingsHandler } from './media-center-settings-handler.svelte';
3
+ export { MediaCenterContentHandler } from './media-center-content-handler.svelte';
@@ -0,0 +1,62 @@
1
+ import type { IMediaCenterDataProvider } from '../../config/types';
2
+ import type { PostPlayerModel } from '../../../posts/posts-player/types';
3
+ import type { StreamPlayerModel } from '../../../streams/streams-player/types';
4
+ export declare class MediaCenterContentHandler {
5
+ private readonly dataProvider;
6
+ private postCreatedListeners;
7
+ private postDeletedListeners;
8
+ private postModifiedListeners;
9
+ private streamModifiedListeners;
10
+ private streamDeletedListeners;
11
+ private streamPageDeletedListeners;
12
+ constructor(dataProvider: IMediaCenterDataProvider);
13
+ get editPost(): ((postId: string) => Promise<{
14
+ post: PostPlayerModel;
15
+ categories: string[];
16
+ isPublished: boolean;
17
+ } | null>) | null;
18
+ get deletePost(): ((postId: string) => Promise<boolean>) | null;
19
+ get editArticle(): ((postId: string) => Promise<{
20
+ post: PostPlayerModel;
21
+ categories: string[];
22
+ isPublished: boolean;
23
+ } | null>) | null;
24
+ get editStream(): ((streamId: string) => Promise<{
25
+ stream: StreamPlayerModel;
26
+ categories: string[];
27
+ isPublished: boolean;
28
+ } | null>) | null;
29
+ get deleteStream(): ((streamId: string) => Promise<boolean>) | null;
30
+ get deleteStreamPage(): ((streamPageId: string) => Promise<boolean>) | null;
31
+ addPostCreatedListener: (...callbacks: PostCreatedCallback[]) => void;
32
+ addPostModifiedListener: (...callbacks: PostModifiedCallback[]) => void;
33
+ addPostDeletedListener: (...callbacks: PostDeletedCallback[]) => void;
34
+ addStreamModifiedListener: (...callbacks: StreamModifiedCallback[]) => void;
35
+ addStreamDeletedListener: (...callbacks: StreamDeletedCallback[]) => void;
36
+ addStreamPageDeletedListener: (...callbacks: StreamPageDeletedCallback[]) => void;
37
+ }
38
+ type PostCreatedCallback = (data: {
39
+ post: PostPlayerModel;
40
+ categories: string[];
41
+ isPublished: boolean;
42
+ }) => void;
43
+ type PostModifiedCallback = (data: {
44
+ post: PostPlayerModel;
45
+ categories: string[];
46
+ isPublished: boolean;
47
+ }) => void;
48
+ type PostDeletedCallback = (data: {
49
+ id: string;
50
+ }) => void;
51
+ type StreamModifiedCallback = (data: {
52
+ stream: StreamPlayerModel;
53
+ categories: string[];
54
+ isPublished: boolean;
55
+ }) => void;
56
+ type StreamDeletedCallback = (data: {
57
+ id: string;
58
+ }) => void;
59
+ type StreamPageDeletedCallback = (data: {
60
+ id: string;
61
+ }) => void;
62
+ export {};