@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,144 @@
1
+ export class MediaCenterContentHandler {
2
+ dataProvider;
3
+ postCreatedListeners = [];
4
+ postDeletedListeners = [];
5
+ postModifiedListeners = [];
6
+ streamModifiedListeners = [];
7
+ streamDeletedListeners = [];
8
+ streamPageDeletedListeners = [];
9
+ constructor(dataProvider) {
10
+ this.dataProvider = dataProvider;
11
+ $effect(() => {
12
+ if (this.dataProvider.handlers?.contentManagementHandler) {
13
+ this.dataProvider.handlers.contentManagementHandler.onHandlerMounted({
14
+ postCreated: (result) => {
15
+ const { post, categories, isPublished } = result;
16
+ this.postCreatedListeners.forEach((callback) => {
17
+ callback({ post, categories, isPublished });
18
+ });
19
+ }
20
+ });
21
+ }
22
+ });
23
+ }
24
+ get editPost() {
25
+ const originalFn = this.dataProvider.handlers?.contentManagementHandler?.editPost;
26
+ if (!originalFn) {
27
+ return null;
28
+ }
29
+ return async (...args) => {
30
+ const result = await originalFn(...args);
31
+ if (result) {
32
+ this.postModifiedListeners.forEach((callback) => {
33
+ callback({
34
+ post: result.post,
35
+ categories: result.categories,
36
+ isPublished: result.isPublished
37
+ });
38
+ });
39
+ }
40
+ return result;
41
+ };
42
+ }
43
+ get deletePost() {
44
+ const originalFn = this.dataProvider.handlers?.contentManagementHandler?.deletePost;
45
+ if (!originalFn) {
46
+ return null;
47
+ }
48
+ return async (...args) => {
49
+ const result = await originalFn(...args);
50
+ if (result) {
51
+ this.postDeletedListeners.forEach((callback) => {
52
+ callback({ id: args[0] });
53
+ });
54
+ }
55
+ return result;
56
+ };
57
+ }
58
+ get editArticle() {
59
+ const originalFn = this.dataProvider.handlers?.contentManagementHandler?.editArticle;
60
+ if (!originalFn) {
61
+ return null;
62
+ }
63
+ return async (...args) => {
64
+ const result = await originalFn(...args);
65
+ if (result) {
66
+ this.postModifiedListeners.forEach((callback) => {
67
+ callback({
68
+ post: result.post,
69
+ categories: result.categories,
70
+ isPublished: result.isPublished
71
+ });
72
+ });
73
+ }
74
+ return result;
75
+ };
76
+ }
77
+ get editStream() {
78
+ const originalFn = this.dataProvider.handlers?.contentManagementHandler?.editStream;
79
+ if (!originalFn) {
80
+ return null;
81
+ }
82
+ return async (...args) => {
83
+ const result = await originalFn(...args);
84
+ if (result) {
85
+ this.streamModifiedListeners.forEach((callback) => {
86
+ callback({
87
+ stream: result.stream,
88
+ categories: result.categories,
89
+ isPublished: result.isPublished
90
+ });
91
+ });
92
+ }
93
+ return result;
94
+ };
95
+ }
96
+ get deleteStream() {
97
+ const originalFn = this.dataProvider.handlers?.contentManagementHandler?.deleteStream;
98
+ if (!originalFn) {
99
+ return null;
100
+ }
101
+ return async (...args) => {
102
+ const result = await originalFn(...args);
103
+ if (result) {
104
+ this.streamDeletedListeners.forEach((callback) => {
105
+ callback({ id: args[0] });
106
+ });
107
+ }
108
+ return result;
109
+ };
110
+ }
111
+ get deleteStreamPage() {
112
+ const originalFn = this.dataProvider.handlers?.contentManagementHandler?.deleteStreamPage;
113
+ if (!originalFn) {
114
+ return null;
115
+ }
116
+ return async (...args) => {
117
+ const result = await originalFn(...args);
118
+ if (result) {
119
+ this.streamPageDeletedListeners.forEach((callback) => {
120
+ callback({ id: args[0] });
121
+ });
122
+ }
123
+ return result;
124
+ };
125
+ }
126
+ addPostCreatedListener = (...callbacks) => {
127
+ this.postCreatedListeners.push(...callbacks);
128
+ };
129
+ addPostModifiedListener = (...callbacks) => {
130
+ this.postModifiedListeners.push(...callbacks);
131
+ };
132
+ addPostDeletedListener = (...callbacks) => {
133
+ this.postDeletedListeners.push(...callbacks);
134
+ };
135
+ addStreamModifiedListener = (...callbacks) => {
136
+ this.streamModifiedListeners.push(...callbacks);
137
+ };
138
+ addStreamDeletedListener = (...callbacks) => {
139
+ this.streamDeletedListeners.push(...callbacks);
140
+ };
141
+ addStreamPageDeletedListener = (...callbacks) => {
142
+ this.streamPageDeletedListeners.push(...callbacks);
143
+ };
144
+ }
@@ -20,13 +20,13 @@ const headerMounted = (node) => {
20
20
  </script>
21
21
 
22
22
  <div class="media-center-header-mobile" class:media-center-header-mobile--static={context.mediaCenterMode === 'discover'} use:headerMounted>
23
- {#if context.closeOrchestrator.closeTriggerVisible}
24
- <button type="button" class="media-center-header-mobile__button" onclick={context.closeOrchestrator.requestClose}>
25
- <Icon src={IconDismiss} />
26
- </button>
27
- {:else}
28
- <span><!--just a stub--></span>
29
- {/if}
23
+ <button
24
+ type="button"
25
+ class="media-center-header-mobile__button"
26
+ class:media-center-header-mobile__button--hidden={!context.closeOrchestrator.closeTriggerVisible}
27
+ onclick={context.closeOrchestrator.requestClose}>
28
+ <Icon src={IconDismiss} />
29
+ </button>
30
30
  {#if context.mediaCenterMode === 'discover'}
31
31
  <div class="media-center-header-mobile__title">
32
32
  {localization.discoverLabel}
@@ -78,4 +78,7 @@ const headerMounted = (node) => {
78
78
  --icon--color: var(--sc-mc-color--icon-overlay);
79
79
  --icon--filter: var(--sc-mc-color--icon-overlay-shadow);
80
80
  line-height: 0;
81
+ }
82
+ .media-center-header-mobile__button--hidden {
83
+ visibility: hidden;
81
84
  }</style>
@@ -146,7 +146,7 @@ const styles = $derived.by(() => {
146
146
  type="button"
147
147
  class="control-button"
148
148
  class:control-button--active={context.postsFeedHandler.activated || context.streamsFeedHandler.activated}
149
- onclick={() => context.playRootFeed()}>
149
+ onclick={() => context.activateDefaultFeed()}>
150
150
  <span class="control-button__icon" class:control-button__icon--active={context.postsFeedHandler.activated || context.streamsFeedHandler.activated}>
151
151
  <Icon src={IconPhone} />
152
152
  </span>
@@ -2,7 +2,7 @@ import type { IMediaCenterDataProvider } from '../config/types';
2
2
  import type { MediaCenterState } from '../navigation';
3
3
  import type { ICloseOrchestrator } from '../../ui/player/close-orchestrator';
4
4
  import { DiscoverViewHandler } from './discover';
5
- import { CategoriesHandler, MediaCenterSettingsHandler } from './handlers';
5
+ import { CategoriesHandler, MediaCenterContentHandler, MediaCenterSettingsHandler } from './handlers';
6
6
  import type { MediaCenterSettings } from './media-center-settings.svelte';
7
7
  import { PopularStreamsPanelHandler } from './menu';
8
8
  import { MomentsFeedHandler } from './moments';
@@ -23,6 +23,7 @@ export declare class MediaCenterContext {
23
23
  popularStreamsHandler: PopularStreamsPanelHandler;
24
24
  streamsInCategoryHandler: StreamsInCategoryPanelHandler;
25
25
  settingsHandler: MediaCenterSettingsHandler;
26
+ contentManagementHandler: MediaCenterContentHandler;
26
27
  closeOrchestrator: ICloseOrchestrator;
27
28
  private _dataProvider;
28
29
  private _currentState;
@@ -54,7 +55,7 @@ export declare class MediaCenterContext {
54
55
  playPostsFeed: (options: Parameters<PostsFeedHandler["activate"]>[0]) => Promise<void>;
55
56
  playStreamsFeed: (options: Parameters<StreamsFeedHandler["activate"]>[0]) => Promise<void>;
56
57
  playMoments: (options?: Parameters<MomentsFeedHandler["activate"]>[0]) => Promise<void>;
57
- playRootFeed: () => Promise<void>;
58
+ activateDefaultFeed: () => Promise<void>;
58
59
  tryActivateStreamsInCategory: (categoryId: string) => Promise<void>;
59
60
  restoreState: (state: MediaCenterState) => Promise<void>;
60
61
  handleNavigationStateChanged: (state: MediaCenterState) => void;
@@ -1,6 +1,6 @@
1
1
  import { Utils } from '../../core/utils';
2
2
  import { DiscoverViewHandler } from './discover';
3
- import { CategoriesHandler, MediaCenterSettingsHandler } from './handlers';
3
+ import { CategoriesHandler, MediaCenterContentHandler, MediaCenterSettingsHandler } from './handlers';
4
4
  import { PopularStreamsPanelHandler } from './menu';
5
5
  import { MomentsFeedHandler } from './moments';
6
6
  import { PostsFeedHandler } from './posts-feed';
@@ -34,6 +34,7 @@ export class MediaCenterContext {
34
34
  popularStreamsHandler;
35
35
  streamsInCategoryHandler;
36
36
  settingsHandler;
37
+ contentManagementHandler;
37
38
  closeOrchestrator;
38
39
  _dataProvider;
39
40
  _currentState = null;
@@ -43,15 +44,18 @@ export class MediaCenterContext {
43
44
  this.closeOrchestrator = closeOrchestrator;
44
45
  this.closeOrchestrator.setCloseTriggerAttached(true);
45
46
  this.settingsHandler = new MediaCenterSettingsHandler({ settings, dataProvider });
47
+ this.contentManagementHandler = new MediaCenterContentHandler(dataProvider);
46
48
  this.postsFeedHandler = new PostsFeedHandler({
47
49
  dataProvider,
48
50
  mediaCenterSettingsHandler: this.settingsHandler,
51
+ mediaCenterContentHandler: this.contentManagementHandler,
49
52
  closeOrchestrator,
50
53
  on: { playerReachedEnd: this.backToDiscover, navigationStateChanged: this.handleNavigationStateChanged }
51
54
  });
52
55
  this.streamsFeedHandler = new StreamsFeedHandler({
53
56
  dataProvider,
54
57
  mediaCenterSettingsHandler: this.settingsHandler,
58
+ mediaCenterContentHandler: this.contentManagementHandler,
55
59
  closeOrchestrator,
56
60
  on: { playerReachedEnd: this.backToDiscover, navigationStateChanged: this.handleNavigationStateChanged }
57
61
  });
@@ -62,9 +66,16 @@ export class MediaCenterContext {
62
66
  this.momentsFeedHandler = new MomentsFeedHandler({
63
67
  dataProvider,
64
68
  mediaCenterSettingsHandler: this.settingsHandler,
69
+ mediaCenterContentHandler: this.contentManagementHandler,
65
70
  closeOrchestrator,
66
71
  on: { playerReachedEnd: this.backToDiscover, navigationStateChanged: this.handleNavigationStateChanged }
67
72
  });
73
+ this.contentManagementHandler.addPostCreatedListener(this.discoverHandler.onPostCreated, this.postsFeedHandler.onPostCreated, this.momentsFeedHandler.onPostCreated);
74
+ this.contentManagementHandler.addPostModifiedListener(this.discoverHandler.onPostModified, this.postsFeedHandler.onPostModified, this.momentsFeedHandler.onPostModified);
75
+ this.contentManagementHandler.addPostDeletedListener(this.discoverHandler.onPostDeleted, this.postsFeedHandler.onPostDeleted, this.momentsFeedHandler.onPostDeleted);
76
+ this.contentManagementHandler.addStreamModifiedListener(this.discoverHandler.onStreamModified, this.streamsFeedHandler.onStreamModified, this.popularStreamsHandler.onStreamModified);
77
+ this.contentManagementHandler.addStreamDeletedListener(this.discoverHandler.onStreamDeleted, this.popularStreamsHandler.onStreamDeleted);
78
+ this.contentManagementHandler.addStreamPageDeletedListener(this.streamsFeedHandler.onStreamPageDeleted);
68
79
  $effect(() => {
69
80
  if (this.initialized) {
70
81
  void settings.state;
@@ -130,13 +141,21 @@ export class MediaCenterContext {
130
141
  };
131
142
  backToDiscover = () => this.activateDiscover({ categoryId: this.categoriesHandler.selectedCategoryId });
132
143
  playPostsFeed = async (options) => {
144
+ const categoryId = options.filter?.categoryId ?? null;
145
+ if (categoryId === this.categoriesHandler.selectedCategoryId && !this.postsFeedHandler.canReload) {
146
+ return;
147
+ }
133
148
  this.deactivateAllBut('posts-feed');
134
- this.categoriesHandler.selectedCategoryId = options.filter?.categoryId ?? null;
149
+ this.categoriesHandler.selectedCategoryId = categoryId;
135
150
  this.postsFeedHandler.activate(options);
136
151
  };
137
152
  playStreamsFeed = async (options) => {
153
+ const categoryId = options.filter?.categoryId ?? null;
154
+ if (categoryId === this.categoriesHandler.selectedCategoryId && !this.streamsFeedHandler.canReload) {
155
+ return;
156
+ }
138
157
  this.deactivateAllBut('streams-feed');
139
- this.categoriesHandler.selectedCategoryId = options.filter?.categoryId ?? null;
158
+ this.categoriesHandler.selectedCategoryId = categoryId;
140
159
  this.streamsFeedHandler.activate(options);
141
160
  };
142
161
  playMoments = async (options) => {
@@ -146,14 +165,13 @@ export class MediaCenterContext {
146
165
  this.deactivateAllBut('moments');
147
166
  this.momentsFeedHandler.activate(options);
148
167
  };
149
- playRootFeed = async () => {
168
+ activateDefaultFeed = async () => {
150
169
  this.categoriesHandler.selectedCategoryId = null;
151
- if (this.streamsFeedHandler.active) {
152
- this.streamsFeedHandler.activate({});
170
+ if (this.mediaCenterMode === 'streams-feed') {
171
+ this.playStreamsFeed({ filter: { categoryId: null } });
153
172
  }
154
173
  else {
155
- this.deactivateAllBut('posts-feed');
156
- this.postsFeedHandler.activate({});
174
+ this.playPostsFeed({ filter: { categoryId: null } });
157
175
  }
158
176
  };
159
177
  tryActivateStreamsInCategory = async (categoryId) => {
@@ -169,19 +187,20 @@ export class MediaCenterContext {
169
187
  this._currentState = state;
170
188
  switch (state.mode) {
171
189
  case 'posts-feed':
172
- await this.playPostsFeed({ filter: { categoryId: state.categoryId }, init: { initialPostId: state.postId } });
190
+ await this.playPostsFeed({ filter: { categoryId: state.categoryId }, init: { initialPostId: state.postId }, tryRestoreState: true });
173
191
  break;
174
192
  case 'streams-feed':
175
193
  await this.playStreamsFeed({
176
194
  filter: { categoryId: state.categoryId },
177
- init: { initialStreamId: state.streamId, initialStreamPageId: state.streamPageId }
195
+ init: { initialStreamId: state.streamId, initialStreamPageId: state.streamPageId },
196
+ tryRestoreState: true
178
197
  });
179
198
  break;
180
199
  case 'discover':
181
200
  await this.activateDiscover({ categoryId: state.categoryId });
182
201
  break;
183
202
  case 'moments':
184
- await this.playMoments({ initialMomentId: state.momentId });
203
+ await this.playMoments({ initialMomentId: state.momentId, tryRestoreState: true });
185
204
  break;
186
205
  }
187
206
  };
@@ -27,9 +27,6 @@ const selectCategory = (categoryId) => __awaiter(void 0, void 0, void 0, functio
27
27
  }
28
28
  switch (context.mediaCenterMode) {
29
29
  case 'posts-feed':
30
- if (!context.postsFeedHandler.feedPlayerProps) {
31
- return;
32
- }
33
30
  if (context.categoriesHandler.selectedCategoryId === categoryId) {
34
31
  return;
35
32
  }
@@ -48,11 +45,26 @@ const selectCategory = (categoryId) => __awaiter(void 0, void 0, void 0, functio
48
45
  Utils.assertUnreachable(context.mediaCenterMode);
49
46
  }
50
47
  });
51
- const activateSelectedShortVideoPlayer = (shortVideo) => {
52
- context.playPostsFeed({ init: { prefetchedItems: [shortVideo] } });
48
+ const resetMediaCenterMode = () => {
49
+ if (!context.mediaCenterMode) {
50
+ return;
51
+ }
52
+ switch (context.mediaCenterMode) {
53
+ case 'streams-feed':
54
+ context.playStreamsFeed({ filter: { categoryId: null } });
55
+ break;
56
+ case 'discover':
57
+ context.activateDiscover({ categoryId: null });
58
+ break;
59
+ default:
60
+ context.playPostsFeed({ filter: { categoryId: null } });
61
+ }
53
62
  };
54
- const activateSelectedStreamPlayer = (stream) => {
55
- context.playStreamsFeed({ init: { prefetchedStreams: [stream] } });
63
+ const activateSelectedShortVideoPlayer = (shortVideo, categoryId) => {
64
+ context.playPostsFeed({ init: { prefetchedItems: [shortVideo] }, filter: { categoryId } });
65
+ };
66
+ const activateSelectedStreamPlayer = (stream, categoryId) => {
67
+ context.playStreamsFeed({ init: { prefetchedStreams: [stream] }, filter: { categoryId } });
56
68
  };
57
69
  const activateSelectedStreamOfCategoryPlayer = (id, prefetchedStreams, categoryId) => {
58
70
  context.playStreamsFeed({ filter: { categoryId }, init: { prefetchedStreams, initialStreamId: id } });
@@ -138,24 +150,24 @@ const swipeToOpen = (node) => {
138
150
  <div class="media-center__content-container" use:swipeToOpen>
139
151
  {#if context.mediaCenterMode === 'posts-feed' && context.postsFeedHandler.feedPlayerProps}
140
152
  <div class="media-center__content" class:media-center__content--faded={context.overlayIsActive} transition:fade={{ duration: 300 }}>
141
- <PostsPlayerView {...context.postsFeedHandler.feedPlayerProps} />
153
+ <PostsPlayerView {...context.postsFeedHandler.feedPlayerProps} managementActions={context.postsFeedHandler.managementActions} />
142
154
  </div>
143
155
  {:else if context.mediaCenterMode === 'streams-feed' && context.streamsFeedHandler.feedPlayerProps}
144
156
  <div class="media-center__content" class:media-center__content--faded={context.overlayIsActive} transition:fade={{ duration: 300 }}>
145
- <StreamsPlayerView {...context.streamsFeedHandler.feedPlayerProps} />
157
+ <StreamsPlayerView {...context.streamsFeedHandler.feedPlayerProps} managementActions={context.streamsFeedHandler.managementActions} />
146
158
  </div>
147
159
  {:else if context.mediaCenterMode === 'discover'}
148
160
  <div class="media-center__content" transition:fade={{ duration: 300 }}>
149
161
  <DiscoverPanel
150
162
  context={context}
151
163
  on={{
152
- shortVideoSelected: (shortVideo) => activateSelectedShortVideoPlayer(shortVideo),
153
- streamSelected: (stream) => activateSelectedStreamPlayer(stream)
164
+ shortVideoSelected: activateSelectedShortVideoPlayer,
165
+ streamSelected: activateSelectedStreamPlayer
154
166
  }} />
155
167
  </div>
156
168
  {:else if context.mediaCenterMode === 'moments' && context.momentsFeedHandler.momentsPlayerProps}
157
169
  <div class="media-center__content" class:media-center__content--faded={context.overlayIsActive} transition:fade={{ duration: 300 }}>
158
- <PostsPlayerView {...context.momentsFeedHandler.momentsPlayerProps} />
170
+ <PostsPlayerView {...context.momentsFeedHandler.momentsPlayerProps} managementActions={context.momentsFeedHandler.managementActions} />
159
171
  </div>
160
172
  {/if}
161
173
  </div>
@@ -163,7 +175,13 @@ const swipeToOpen = (node) => {
163
175
  {#if context.menuActive}
164
176
  <div class="menu-overlay" class:menu-overlay--mobile={isMobileView} onclick={context.hideMenu} onkeydown={() => {}} role="none">
165
177
  <div class="menu-overlay__panel">
166
- <Menu context={context} on={{ categorySelected: selectCategory, streamSelected: activateSelectedStreamPlayer }} />
178
+ <Menu
179
+ context={context}
180
+ on={{
181
+ categorySelected: selectCategory,
182
+ streamSelected: (stream) => activateSelectedStreamPlayer(stream, null),
183
+ resetModeRequested: resetMediaCenterMode
184
+ }} />
167
185
  </div>
168
186
  </div>
169
187
  {/if}
@@ -71,7 +71,7 @@ const styles = $derived.by(() => {
71
71
  <div class="media-center-menu__tree">
72
72
  <div class="media-center-menu__tree-item">
73
73
  <div class="menu-item" class:menu-item--active={!context.categoriesHandler.selectedCategoryId}>
74
- <div class="menu-item__content" onclick={() => context.playRootFeed()} onkeydown={() => {}} role="button" tabindex="0">
74
+ <div class="menu-item__content" onclick={() => on.resetModeRequested()} onkeydown={() => {}} role="button" tabindex="0">
75
75
  <div class="menu-item__text" class:menu-item__text--active={!context.categoriesHandler.selectedCategoryId}>
76
76
  {context.mediaCenterMode === 'discover' ? localization.discoverLabel : localization.feedLabel}
77
77
  </div>
@@ -94,7 +94,9 @@ const styles = $derived.by(() => {
94
94
  </div>
95
95
  {#if category.value.tag}
96
96
  <div class="menu-item__tag" style="background-color: {category.value.tag.backgroundColor}; color: {category.value.tag.fontColor};">
97
- {category.value.tag.text}
97
+ <div class="menu-item__tag-text">
98
+ {category.value.tag.text}
99
+ </div>
98
100
  </div>
99
101
  {/if}
100
102
  </div>
@@ -239,16 +241,14 @@ const styles = $derived.by(() => {
239
241
  display: flex;
240
242
  -webkit-user-drag: none;
241
243
  user-select: none;
242
- }
243
- .menu-item :global([contenteditable]) {
244
- user-select: text;
245
- }
246
- .menu-item {
247
244
  height: 2.25rem;
248
245
  padding-left: var(--_media-center-menu--items--padding-inline);
249
246
  --_menu-item--text--font-size: 0.9375rem;
250
247
  --_menu-item--image--size: 1.5rem;
251
248
  }
249
+ .menu-item :global([contenteditable]) {
250
+ user-select: text;
251
+ }
252
252
  .menu-item--active {
253
253
  background-color: hsl(from var(--_media-center-menu--background-color) h s calc(l + 5)/alpha);
254
254
  border-radius: 0.25rem;
@@ -298,10 +298,19 @@ const styles = $derived.by(() => {
298
298
  border-radius: 0.25rem;
299
299
  padding: 0.3125rem 0.375rem;
300
300
  font-size: 0.5rem;
301
+ line-height: 1.2;
301
302
  font-weight: 600;
302
303
  margin-top: -1rem;
303
304
  margin-left: 0.25rem;
304
305
  }
306
+ .menu-item__tag-text {
307
+ display: -webkit-box;
308
+ line-clamp: 2;
309
+ -webkit-line-clamp: 2;
310
+ -webkit-box-orient: vertical;
311
+ overflow: hidden;
312
+ text-overflow: ellipsis;
313
+ }
305
314
  .menu-item__collapser {
306
315
  --icon--color: var(--sc-mc-color--text-primary);
307
316
  --icon--size: 1rem;
@@ -5,6 +5,7 @@ type Props = {
5
5
  on: {
6
6
  categorySelected: (categoryId: string) => void;
7
7
  streamSelected: (stream: StreamPlayerModel) => void;
8
+ resetModeRequested: () => void;
8
9
  };
9
10
  };
10
11
  declare const Menu: import("svelte").Component<Props, {}, "">;
@@ -7,4 +7,11 @@ export declare class PopularStreamsPanelHandler {
7
7
  constructor(dataProvider: IMediaCenterDataProvider);
8
8
  get streamSectionItems(): StreamPlayerModel[];
9
9
  init: () => Promise<void>;
10
+ onStreamModified: (data: {
11
+ stream: StreamPlayerModel;
12
+ }) => void;
13
+ onStreamDeleted: (data: {
14
+ id: string;
15
+ }) => void;
16
+ private loadStreams;
10
17
  }
@@ -10,14 +10,29 @@ export class PopularStreamsPanelHandler {
10
10
  }
11
11
  init = async () => {
12
12
  if (this._state === 'not-initialized') {
13
- this._state = 'loading';
14
- try {
15
- const streamsResponse = await this.dataProvider.streamPlayer.getStreamsCursor({ filter: {}, limit: 2 });
16
- this._streams = streamsResponse.items;
17
- }
18
- finally {
19
- this._state = 'ready';
20
- }
13
+ await this.loadStreams();
14
+ }
15
+ };
16
+ onStreamModified = (data) => {
17
+ const { stream } = data;
18
+ if (this._streams.some((s) => s.id === stream.id)) {
19
+ this.loadStreams();
20
+ }
21
+ };
22
+ onStreamDeleted = (data) => {
23
+ const { id } = data;
24
+ if (this._streams.some((s) => s.id === id)) {
25
+ this.loadStreams();
26
+ }
27
+ };
28
+ loadStreams = async () => {
29
+ this._state = 'loading';
30
+ try {
31
+ const streamsResponse = await this.dataProvider.streamPlayer.getStreamsCursor({ filter: {}, limit: 2 });
32
+ this._streams = streamsResponse.items;
33
+ }
34
+ finally {
35
+ this._state = 'ready';
21
36
  }
22
37
  };
23
38
  }
@@ -1,20 +1,23 @@
1
1
  import type { IMediaCenterDataProvider } from '../../config/types';
2
2
  import type { MediaCenterState } from '../../navigation';
3
- import type { PostsPlayerProps } from '../../../posts/posts-player/types';
3
+ import type { PostPlayerModel, PostsPlayerProps, PostManagementActions } from '../../../posts/posts-player/types';
4
4
  import type { ICloseOrchestrator } from '../../../ui/player/close-orchestrator';
5
+ import type { IPlayerBuffer } from '../../../ui/player/providers';
5
6
  import { MomentsState } from './moments-state.svelte';
6
- import { MediaCenterSettingsHandler } from '../handlers';
7
+ import { MediaCenterContentHandler, MediaCenterSettingsHandler } from '../handlers';
7
8
  export declare class MomentsFeedHandler {
8
9
  momentsState: MomentsState;
9
10
  private _active;
10
11
  private _momentsPlayerProps;
11
12
  private _dataProvider;
12
13
  private _mediaCenterSettingsHandler;
14
+ private _mediaCenterContentHandler;
13
15
  private _closeOrchestrator;
14
16
  private _callbacks;
15
17
  constructor(data: {
16
18
  dataProvider: IMediaCenterDataProvider;
17
19
  mediaCenterSettingsHandler: MediaCenterSettingsHandler;
20
+ mediaCenterContentHandler: MediaCenterContentHandler;
18
21
  closeOrchestrator: ICloseOrchestrator;
19
22
  on: Callbacks;
20
23
  });
@@ -22,10 +25,24 @@ export declare class MomentsFeedHandler {
22
25
  get momentsPlayerProps(): PostsPlayerProps | null;
23
26
  get hasUnwatchedMoments(): boolean;
24
27
  get hasMoments(): boolean;
28
+ get feedBuffer(): IPlayerBuffer<PostPlayerModel> | null;
29
+ get managementActions(): PostManagementActions;
25
30
  deactivate: () => void;
26
31
  activate: (data?: {
27
32
  initialMomentId?: string | null;
33
+ tryRestoreState?: boolean;
28
34
  }) => Promise<void>;
35
+ onPostCreated: (data: {
36
+ post: PostPlayerModel;
37
+ isPublished: boolean;
38
+ }) => void;
39
+ onPostModified: (data: {
40
+ post: PostPlayerModel;
41
+ isPublished: boolean;
42
+ }) => false | undefined;
43
+ onPostDeleted: (data: {
44
+ id: string;
45
+ }) => void;
29
46
  private tryRestoreState;
30
47
  }
31
48
  type Callbacks = {