@streamscloud/embeddable 13.3.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 (145) hide show
  1. package/dist/external-api/data-providers/internal-media-center-data-provider.svelte.js +6 -6
  2. package/dist/external-api/data-providers/mocks/index.d.ts +5 -0
  3. package/dist/external-api/data-providers/mocks/index.js +5 -0
  4. package/dist/{media-center/categories-following → external-api/data-providers/mocks}/mock-categories-following-handler.svelte.d.ts +1 -1
  5. package/dist/external-api/data-providers/mocks/mock-content-management-handler.svelte.d.ts +29 -0
  6. package/dist/external-api/data-providers/mocks/mock-content-management-handler.svelte.js +61 -0
  7. package/dist/{media-center/membership → external-api/data-providers/mocks}/mock-membership-handler.svelte.d.ts +1 -1
  8. package/dist/{media-center/navigation → external-api/data-providers/mocks}/mock-navigation-handler.svelte.d.ts +1 -2
  9. package/dist/{posts/social-interactions → external-api/data-providers/mocks}/mock-post-social-interactions-handler.svelte.d.ts +1 -2
  10. package/dist/{posts/social-interactions → external-api/data-providers/mocks}/mock-post-social-interactions-handler.svelte.js +17 -6
  11. package/dist/external-api/data-providers/mocks/operations.generated.d.ts +115 -0
  12. package/dist/external-api/data-providers/mocks/operations.generated.js +377 -0
  13. package/dist/external-api/data-providers/mocks/operations.graphql +18 -0
  14. package/dist/media-center/config/types.d.ts +7 -1
  15. package/dist/media-center/content-management/index.d.ts +1 -0
  16. package/dist/media-center/content-management/index.js +1 -0
  17. package/dist/media-center/content-management/types.d.ts +24 -0
  18. package/dist/media-center/content-management/types.js +1 -0
  19. package/dist/media-center/index.d.ts +2 -1
  20. package/dist/media-center/media-center/cmp.media-center-proxy.svelte +2 -2
  21. package/dist/media-center/media-center/discover/data-loading.d.ts +3 -0
  22. package/dist/media-center/media-center/discover/data-loading.js +13 -2
  23. package/dist/media-center/media-center/discover/discover-view-handler.svelte.d.ts +23 -0
  24. package/dist/media-center/media-center/discover/discover-view-handler.svelte.js +88 -0
  25. package/dist/media-center/media-center/discover/discover-view.svelte +79 -14
  26. package/dist/media-center/media-center/discover/discover-view.svelte.d.ts +2 -2
  27. package/dist/media-center/media-center/footer/media-center-footer.svelte +1 -1
  28. package/dist/media-center/media-center/handlers/index.d.ts +1 -0
  29. package/dist/media-center/media-center/handlers/index.js +1 -0
  30. package/dist/media-center/media-center/handlers/media-center-content-handler.svelte.d.ts +62 -0
  31. package/dist/media-center/media-center/handlers/media-center-content-handler.svelte.js +144 -0
  32. package/dist/media-center/media-center/header/media-center-header-mobile.svelte +10 -7
  33. package/dist/media-center/media-center/header/media-center-header.svelte +1 -1
  34. package/dist/media-center/media-center/media-center-context.svelte.d.ts +3 -2
  35. package/dist/media-center/media-center/media-center-context.svelte.js +30 -11
  36. package/dist/media-center/media-center/media-center-view.svelte +31 -13
  37. package/dist/media-center/media-center/menu/menu.svelte +13 -2
  38. package/dist/media-center/media-center/menu/menu.svelte.d.ts +1 -0
  39. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.d.ts +7 -0
  40. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.js +23 -8
  41. package/dist/media-center/media-center/moments/moments-feed-handler.svelte.d.ts +19 -2
  42. package/dist/media-center/media-center/moments/moments-feed-handler.svelte.js +51 -6
  43. package/dist/media-center/media-center/moments/moments-state.svelte.d.ts +2 -0
  44. package/dist/media-center/media-center/moments/moments-state.svelte.js +16 -1
  45. package/dist/media-center/media-center/posts-feed/posts-feed-handler.svelte.d.ts +24 -4
  46. package/dist/media-center/media-center/posts-feed/posts-feed-handler.svelte.js +90 -9
  47. package/dist/media-center/media-center/streams-feed/streams-feed-handler.svelte.d.ts +18 -3
  48. package/dist/media-center/media-center/streams-feed/streams-feed-handler.svelte.js +64 -9
  49. package/dist/posts/controls/index.d.ts +2 -1
  50. package/dist/posts/controls/index.js +2 -1
  51. package/dist/posts/controls/post-actions-generator.svelte.d.ts +20 -0
  52. package/dist/posts/controls/post-actions-generator.svelte.js +27 -0
  53. package/dist/posts/controls/post-actions-handler.svelte.d.ts +26 -0
  54. package/dist/posts/controls/post-actions-handler.svelte.js +56 -0
  55. package/dist/posts/index.d.ts +1 -0
  56. package/dist/posts/model/types.d.ts +1 -0
  57. package/dist/posts/post-viewer/cmp.post-viewer.svelte +6 -7
  58. package/dist/posts/post-viewer/cmp.post-viewer.svelte.d.ts +2 -2
  59. package/dist/posts/post-viewer/mapper.js +1 -0
  60. package/dist/posts/posts-player/cmp.posts-player.svelte +2 -1
  61. package/dist/posts/posts-player/cmp.posts-player.svelte.d.ts +2 -0
  62. package/dist/posts/posts-player/index.d.ts +2 -0
  63. package/dist/posts/posts-player/index.js +2 -1
  64. package/dist/posts/posts-player/posts-player-proxy.svelte +2 -1
  65. package/dist/posts/posts-player/posts-player-proxy.svelte.d.ts +3 -1
  66. package/dist/posts/posts-player/posts-player-view.svelte +127 -32
  67. package/dist/posts/posts-player/types.d.ts +8 -0
  68. package/dist/posts/sharing/index.d.ts +1 -0
  69. package/dist/posts/sharing/index.js +1 -0
  70. package/dist/posts/sharing/types.d.ts +5 -0
  71. package/dist/posts/sharing/types.js +1 -0
  72. package/dist/posts/social-interactions/types.d.ts +0 -1
  73. package/dist/streams/controls/index.d.ts +1 -0
  74. package/dist/streams/controls/index.js +1 -0
  75. package/dist/streams/controls/stream-actions-generator.svelte.d.ts +31 -0
  76. package/dist/streams/controls/stream-actions-generator.svelte.js +42 -0
  77. package/dist/streams/index.d.ts +1 -0
  78. package/dist/streams/index.js +1 -0
  79. package/dist/streams/layout/cmp.layout.svelte +4 -1
  80. package/dist/streams/layout/cmp.layout.svelte.d.ts +1 -0
  81. package/dist/streams/layout/element-views/cmp.short-video-stream-element.svelte +1 -0
  82. package/dist/streams/layout/models/mapper.js +1 -0
  83. package/dist/streams/sharing/index.d.ts +1 -0
  84. package/dist/streams/sharing/index.js +1 -0
  85. package/dist/streams/sharing/types.d.ts +5 -0
  86. package/dist/streams/sharing/types.js +1 -0
  87. package/dist/streams/stream-page-viewer/cmp.stream-page-viewer.svelte +43 -1
  88. package/dist/streams/stream-page-viewer/cmp.stream-page-viewer.svelte.d.ts +9 -0
  89. package/dist/streams/streams-player/cmp.streams-player.svelte +2 -1
  90. package/dist/streams/streams-player/cmp.streams-player.svelte.d.ts +2 -0
  91. package/dist/streams/streams-player/index.d.ts +2 -0
  92. package/dist/streams/streams-player/index.js +2 -1
  93. package/dist/streams/streams-player/streams-player-proxy.svelte +2 -1
  94. package/dist/streams/streams-player/streams-player-proxy.svelte.d.ts +2 -0
  95. package/dist/streams/streams-player/streams-player-view.svelte +147 -34
  96. package/dist/streams/streams-player/types.d.ts +7 -0
  97. package/dist/ui/card-actions/card-action-container.d.ts +2 -0
  98. package/dist/ui/card-actions/card-action-container.js +17 -0
  99. package/dist/ui/card-actions/cmp.card-action.svelte +28 -0
  100. package/dist/ui/card-actions/cmp.card-action.svelte.d.ts +10 -0
  101. package/dist/ui/card-actions/cmp.card-actions.svelte +71 -0
  102. package/dist/ui/card-actions/cmp.card-actions.svelte.d.ts +9 -0
  103. package/dist/ui/card-actions/index.d.ts +4 -0
  104. package/dist/ui/card-actions/index.js +3 -0
  105. package/dist/ui/card-actions/types.d.ts +9 -0
  106. package/dist/ui/card-actions/types.js +1 -0
  107. package/dist/ui/player/button/cmp.responsive-player-buttons-group.svelte +53 -0
  108. package/dist/ui/player/button/cmp.responsive-player-buttons-group.svelte.d.ts +10 -0
  109. package/dist/ui/player/button/index.d.ts +1 -0
  110. package/dist/ui/player/button/index.js +1 -0
  111. package/dist/{content-player → ui/player/content-player}/cmp.content-player.svelte +7 -29
  112. package/dist/{content-player → ui/player/content-player}/cmp.content-player.svelte.d.ts +6 -1
  113. package/dist/ui/player/content-player/content-player-config.svelte.d.ts +29 -0
  114. package/dist/ui/player/content-player/content-player-config.svelte.js +27 -0
  115. package/dist/{content-player → ui/player/content-player}/content-player-settings.svelte.d.ts +3 -3
  116. package/dist/{content-player → ui/player/content-player}/content-player-settings.svelte.js +2 -2
  117. package/dist/{content-player → ui/player/content-player}/controls-and-attachments.svelte +18 -65
  118. package/dist/{content-player → ui/player/content-player}/controls-and-attachments.svelte.d.ts +6 -0
  119. package/dist/{content-player → ui/player/content-player}/overview-panel.svelte +1 -1
  120. package/dist/{content-player → ui/player/content-player}/ui-manager.svelte.d.ts +3 -2
  121. package/dist/{content-player → ui/player/content-player}/ui-manager.svelte.js +3 -2
  122. package/dist/ui/player/providers/chunks-player-buffer/player-chunk-item.svelte.d.ts +0 -2
  123. package/dist/ui/player/providers/chunks-player-buffer/player-chunk-item.svelte.js +1 -3
  124. package/dist/ui/player/providers/chunks-player-buffer/player-chunk.svelte.d.ts +3 -2
  125. package/dist/ui/player/providers/chunks-player-buffer/player-chunk.svelte.js +11 -5
  126. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.d.ts +3 -0
  127. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.js +74 -8
  128. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.d.ts +2 -0
  129. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.js +15 -4
  130. package/dist/ui/player/providers/default-feed-player-buffer.svelte.d.ts +1 -0
  131. package/dist/ui/player/providers/default-feed-player-buffer.svelte.js +27 -5
  132. package/dist/ui/player/providers/types.d.ts +1 -0
  133. package/dist/ui/shadow-dom/cmp.shadow-root.svelte +9 -4
  134. package/dist/ui/shadow-dom/colors.scss +2 -0
  135. package/package.json +6 -2
  136. package/dist/content-player/content-player-config.svelte.d.ts +0 -51
  137. package/dist/content-player/content-player-config.svelte.js +0 -48
  138. package/dist/posts/controls/cmp.controls.svelte +0 -120
  139. package/dist/posts/controls/cmp.controls.svelte.d.ts +0 -16
  140. /package/dist/{media-center/categories-following → external-api/data-providers/mocks}/mock-categories-following-handler.svelte.js +0 -0
  141. /package/dist/{media-center/membership → external-api/data-providers/mocks}/mock-membership-handler.svelte.js +0 -0
  142. /package/dist/{media-center/navigation → external-api/data-providers/mocks}/mock-navigation-handler.svelte.js +0 -0
  143. /package/dist/{content-player → ui/player/content-player}/index.d.ts +0 -0
  144. /package/dist/{content-player → ui/player/content-player}/index.js +0 -0
  145. /package/dist/{content-player → ui/player/content-player}/overview-panel.svelte.d.ts +0 -0
@@ -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>
@@ -296,10 +298,19 @@ const styles = $derived.by(() => {
296
298
  border-radius: 0.25rem;
297
299
  padding: 0.3125rem 0.375rem;
298
300
  font-size: 0.5rem;
301
+ line-height: 1.2;
299
302
  font-weight: 600;
300
303
  margin-top: -1rem;
301
304
  margin-left: 0.25rem;
302
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
+ }
303
314
  .menu-item__collapser {
304
315
  --icon--color: var(--sc-mc-color--text-primary);
305
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 = {
@@ -1,18 +1,21 @@
1
+ import { PostType } from '../../../core/enums';
1
2
  import { initBufferFromProvider } from '../../../ui/player/providers/service';
2
3
  import { MomentsState } from './moments-state.svelte';
3
- import { MediaCenterSettingsHandler } from '../handlers';
4
+ import { MediaCenterContentHandler, MediaCenterSettingsHandler } from '../handlers';
4
5
  export class MomentsFeedHandler {
5
6
  momentsState;
6
7
  _active = $state(false);
7
8
  _momentsPlayerProps = $state.raw(null);
8
9
  _dataProvider;
9
10
  _mediaCenterSettingsHandler;
11
+ _mediaCenterContentHandler;
10
12
  _closeOrchestrator;
11
13
  _callbacks;
12
14
  constructor(data) {
13
15
  const { dataProvider, mediaCenterSettingsHandler, closeOrchestrator, on } = data;
14
16
  this.momentsState = new MomentsState(dataProvider);
15
17
  this._mediaCenterSettingsHandler = mediaCenterSettingsHandler;
18
+ this._mediaCenterContentHandler = data.mediaCenterContentHandler;
16
19
  this._dataProvider = dataProvider;
17
20
  this._closeOrchestrator = closeOrchestrator;
18
21
  this._callbacks = on;
@@ -29,12 +32,26 @@ export class MomentsFeedHandler {
29
32
  get hasMoments() {
30
33
  return this.momentsState.allMoments.length > 0;
31
34
  }
35
+ get feedBuffer() {
36
+ if (!this._momentsPlayerProps) {
37
+ return null;
38
+ }
39
+ const buffer = this._momentsPlayerProps.dataProvider.type === 'buffer' ? this._momentsPlayerProps.dataProvider.buffer : null;
40
+ return buffer;
41
+ }
42
+ get managementActions() {
43
+ return {
44
+ editPost: this._mediaCenterContentHandler.editPost,
45
+ editArticle: null,
46
+ deletePost: this._mediaCenterContentHandler.deletePost
47
+ };
48
+ }
32
49
  deactivate = () => {
33
50
  this._active = false;
34
51
  this._momentsPlayerProps = null;
35
52
  };
36
53
  activate = async (data) => {
37
- if (data?.initialMomentId && this.tryRestoreState(data.initialMomentId)) {
54
+ if (data?.tryRestoreState && data?.initialMomentId && this.tryRestoreState(data.initialMomentId)) {
38
55
  // Already active with the requested buffer
39
56
  return;
40
57
  }
@@ -46,7 +63,8 @@ export class MomentsFeedHandler {
46
63
  onEndReached: this._callbacks.playerReachedEnd
47
64
  }))
48
65
  },
49
- socialInteractionsHandler: this._dataProvider.handlers?.socialInteractionsHandler,
66
+ socialInteractionsHandler: this._dataProvider.handlers?.postSocialInteractionsHandler,
67
+ sharingHandler: this._dataProvider.handlers?.postSharingHandler,
50
68
  analyticsHandler: this._dataProvider.handlers?.analyticsHandler,
51
69
  playerSettings: this._mediaCenterSettingsHandler.playerSettings,
52
70
  closeOrchestrator: this._closeOrchestrator,
@@ -60,14 +78,41 @@ export class MomentsFeedHandler {
60
78
  };
61
79
  this._active = true;
62
80
  };
81
+ onPostCreated = (data) => {
82
+ if (!this._active || !data.isPublished || data.post.postType !== PostType.Moment) {
83
+ return;
84
+ }
85
+ // Reactivate to include the new moment
86
+ this.activate();
87
+ };
88
+ onPostModified = (data) => {
89
+ if (!this._active) {
90
+ return false;
91
+ }
92
+ const postStillInTheFeed = data.isPublished && data.post.postType === PostType.Moment;
93
+ if (postStillInTheFeed) {
94
+ this.activate({ initialMomentId: data.post.id });
95
+ }
96
+ else {
97
+ this.onPostDeleted({ id: data.post.id });
98
+ }
99
+ };
100
+ onPostDeleted = (data) => {
101
+ const nextMomentId = this.momentsState.removeMomentById(data.id);
102
+ if (nextMomentId) {
103
+ this.activate({ initialMomentId: nextMomentId });
104
+ }
105
+ else {
106
+ this._callbacks.playerReachedEnd();
107
+ }
108
+ };
63
109
  tryRestoreState = (initialMomentId) => {
64
110
  if (!this._active || !this._momentsPlayerProps) {
65
111
  return false;
66
112
  }
67
- const buffer = this._momentsPlayerProps.dataProvider.type === 'buffer' ? this._momentsPlayerProps.dataProvider.buffer : null;
68
- if (!buffer) {
113
+ if (!this.feedBuffer) {
69
114
  return false;
70
115
  }
71
- return buffer.tryActivateItemById(initialMomentId);
116
+ return this.feedBuffer.tryActivateItemById(initialMomentId);
72
117
  };
73
118
  }
@@ -4,6 +4,7 @@ import type { IChunksPlayerDataProvider } from '../../../ui/player/providers';
4
4
  export declare class MomentsState {
5
5
  private readonly dataProvider;
6
6
  private momentsSeenLocally;
7
+ private removedMomentsIds;
7
8
  constructor(dataProvider: IMediaCenterDataProvider);
8
9
  get allMoments(): {
9
10
  id: string;
@@ -16,6 +17,7 @@ export declare class MomentsState {
16
17
  isSeen: boolean;
17
18
  }[];
18
19
  markMomentAsSeen: (momentId: string) => void;
20
+ removeMomentById: (id: string) => string | null;
19
21
  generatePlayerDataProvider: (data: {
20
22
  initialId: string | null | undefined;
21
23
  onEndReached: () => void;
@@ -3,11 +3,12 @@ import {} from '../../../posts/posts-player';
3
3
  export class MomentsState {
4
4
  dataProvider;
5
5
  momentsSeenLocally = $state.raw([]);
6
+ removedMomentsIds = $state.raw([]);
6
7
  constructor(dataProvider) {
7
8
  this.dataProvider = dataProvider;
8
9
  }
9
10
  get allMoments() {
10
- return this.dataProvider.model?.moments ?? [];
11
+ return (this.dataProvider.model?.moments ?? []).filter((m) => !this.removedMomentsIds.includes(m.id));
11
12
  }
12
13
  get unwatchedMoments() {
13
14
  return this.allMoments.filter((s) => !s.isSeen && !this.momentsSeenLocally.includes(s.id));
@@ -17,6 +18,20 @@ export class MomentsState {
17
18
  this.momentsSeenLocally = [...this.momentsSeenLocally, momentId];
18
19
  }
19
20
  };
21
+ removeMomentById = (id) => {
22
+ const currentIndex = this.allMoments.findIndex((m) => m.id === id);
23
+ let nextMomentId = null;
24
+ if (currentIndex !== -1) {
25
+ if (currentIndex < this.allMoments.length - 1) {
26
+ nextMomentId = this.allMoments[currentIndex + 1].id;
27
+ }
28
+ else if (currentIndex > 0) {
29
+ nextMomentId = this.allMoments[currentIndex - 1].id;
30
+ }
31
+ }
32
+ this.removedMomentsIds = [...this.removedMomentsIds, id];
33
+ return nextMomentId;
34
+ };
20
35
  generatePlayerDataProvider = (data) => {
21
36
  const { initialId, onEndReached } = data;
22
37
  const collectionCapacity = 5;
@@ -1,9 +1,9 @@
1
1
  import type { IMediaCenterDataProvider } from '../../config/types';
2
2
  import type { MediaCenterState } from '../../navigation';
3
- import type { PostPlayerModel, PostsPlayerProps } from '../../../posts/posts-player/types';
3
+ import type { PostManagementActions, PostPlayerModel, PostsPlayerProps } from '../../../posts/posts-player/types';
4
4
  import type { ICloseOrchestrator } from '../../../ui/player/close-orchestrator';
5
- import type { IPlayerDataProvider } from '../../../ui/player/providers';
6
- import { MediaCenterSettingsHandler } from '../handlers';
5
+ import type { IPlayerBuffer, IPlayerDataProvider } from '../../../ui/player/providers';
6
+ import { MediaCenterContentHandler, MediaCenterSettingsHandler } from '../handlers';
7
7
  import type { PostsFeedFilter, PostsFeedProviderInit } from './types';
8
8
  export declare class PostsFeedHandler {
9
9
  private _state;
@@ -11,11 +11,13 @@ export declare class PostsFeedHandler {
11
11
  private _feedPlayerData;
12
12
  private _dataProvider;
13
13
  private _mediaCenterSettingsHandler;
14
+ private _mediaCenterContentHandler;
14
15
  private _closeOrchestrator;
15
16
  private _callbacks;
16
17
  constructor(data: {
17
18
  dataProvider: IMediaCenterDataProvider;
18
19
  mediaCenterSettingsHandler: MediaCenterSettingsHandler;
20
+ mediaCenterContentHandler: MediaCenterContentHandler;
19
21
  closeOrchestrator: ICloseOrchestrator;
20
22
  on: Callbacks;
21
23
  });
@@ -23,15 +25,33 @@ export declare class PostsFeedHandler {
23
25
  get active(): boolean;
24
26
  get loading(): boolean;
25
27
  get feedPlayerProps(): PostsPlayerProps | null;
28
+ get feedBuffer(): IPlayerBuffer<PostPlayerModel> | null;
29
+ get managementActions(): PostManagementActions;
30
+ get canReload(): boolean;
26
31
  deactivate: () => void;
27
- activateWithExistingProvider: (data: {
32
+ activateWithDataProvider: (data: {
28
33
  dataProvider: IPlayerDataProvider<PostPlayerModel>;
29
34
  onPostActivated?: (id: string) => void;
30
35
  }) => Promise<void>;
31
36
  activate: (options: Partial<{
32
37
  filter: PostsFeedFilter;
33
38
  init: PostsFeedProviderInit;
39
+ tryRestoreState?: boolean;
34
40
  }>) => Promise<void>;
41
+ onPostCreated: (data: {
42
+ post: PostPlayerModel;
43
+ categories: string[];
44
+ isPublished: boolean;
45
+ }) => false | undefined;
46
+ onPostModified: (data: {
47
+ post: PostPlayerModel;
48
+ categories: string[];
49
+ isPublished: boolean;
50
+ }) => false | undefined;
51
+ onPostDeleted: (data: {
52
+ id: string;
53
+ }) => false | undefined;
54
+ private checkIfEditedPostAffectsFeed;
35
55
  private tryRestoreState;
36
56
  private makePostsPlayerProps;
37
57
  }
@@ -1,6 +1,7 @@
1
+ import { PostType } from '../../..';
1
2
  import { Utils } from '../../../core/utils';
2
3
  import { initBufferFromProvider } from '../../../ui/player/providers/service';
3
- import { MediaCenterSettingsHandler } from '../handlers';
4
+ import { MediaCenterContentHandler, MediaCenterSettingsHandler } from '../handlers';
4
5
  import { FeedProvidersGenerator } from './feed-providers-generator';
5
6
  export class PostsFeedHandler {
6
7
  _state = $state('inactive');
@@ -8,12 +9,14 @@ export class PostsFeedHandler {
8
9
  _feedPlayerData = $state.raw(null);
9
10
  _dataProvider;
10
11
  _mediaCenterSettingsHandler;
12
+ _mediaCenterContentHandler;
11
13
  _closeOrchestrator;
12
14
  _callbacks;
13
15
  constructor(data) {
14
- const { dataProvider, mediaCenterSettingsHandler, closeOrchestrator, on } = data;
16
+ const { dataProvider, mediaCenterSettingsHandler, mediaCenterContentHandler, closeOrchestrator, on } = data;
15
17
  this._providersGenerator = new FeedProvidersGenerator(dataProvider);
16
18
  this._mediaCenterSettingsHandler = mediaCenterSettingsHandler;
19
+ this._mediaCenterContentHandler = mediaCenterContentHandler;
17
20
  this._dataProvider = dataProvider;
18
21
  this._closeOrchestrator = closeOrchestrator;
19
22
  this._callbacks = on;
@@ -30,11 +33,44 @@ export class PostsFeedHandler {
30
33
  get feedPlayerProps() {
31
34
  return this._feedPlayerData?.props || null;
32
35
  }
36
+ get feedBuffer() {
37
+ if (!this._feedPlayerData) {
38
+ return null;
39
+ }
40
+ const buffer = this._feedPlayerData.props.dataProvider.type === 'buffer' ? this._feedPlayerData.props.dataProvider.buffer : null;
41
+ return buffer;
42
+ }
43
+ get managementActions() {
44
+ return {
45
+ editPost: this._mediaCenterContentHandler.editPost,
46
+ editArticle: this._mediaCenterContentHandler.editArticle,
47
+ deletePost: this._mediaCenterContentHandler.deletePost
48
+ };
49
+ }
50
+ get canReload() {
51
+ switch (this._state) {
52
+ case 'ready': {
53
+ if (!this.feedBuffer) {
54
+ return true;
55
+ }
56
+ return this.feedBuffer.currentIndex > 0;
57
+ }
58
+ case 'inactive': {
59
+ return true;
60
+ }
61
+ case 'loading': {
62
+ return false;
63
+ }
64
+ default: {
65
+ Utils.assertUnreachable(this._state);
66
+ }
67
+ }
68
+ }
33
69
  deactivate = () => {
34
70
  this._state = 'inactive';
35
71
  this._feedPlayerData = null;
36
72
  };
37
- activateWithExistingProvider = async (data) => {
73
+ activateWithDataProvider = async (data) => {
38
74
  const { dataProvider, onPostActivated } = data;
39
75
  const on = {
40
76
  postActivated: (id) => {
@@ -57,8 +93,8 @@ export class PostsFeedHandler {
57
93
  }
58
94
  };
59
95
  activate = async (options) => {
60
- const { filter, init } = options;
61
- if (init?.initialPostId && this.tryRestoreState(init.initialPostId, filter)) {
96
+ const { filter, init, tryRestoreState } = options;
97
+ if (tryRestoreState && init?.initialPostId && this.tryRestoreState(init.initialPostId, filter)) {
62
98
  // Already active with the requested buffer
63
99
  return;
64
100
  }
@@ -79,21 +115,66 @@ export class PostsFeedHandler {
79
115
  this._state = 'ready';
80
116
  }
81
117
  };
118
+ onPostCreated = (data) => {
119
+ if (this._state !== 'ready') {
120
+ return false;
121
+ }
122
+ if (!this.checkIfEditedPostAffectsFeed(data)) {
123
+ return;
124
+ }
125
+ this.activate({
126
+ filter: this._feedPlayerData?.filter,
127
+ init: { initialPostId: data.post.id, prefetchedItems: [data.post] }
128
+ });
129
+ };
130
+ onPostModified = (data) => {
131
+ if (this._state !== 'ready') {
132
+ return false;
133
+ }
134
+ const postStillInTheFeed = this.checkIfEditedPostAffectsFeed(data);
135
+ if (postStillInTheFeed) {
136
+ this.activate({
137
+ filter: this._feedPlayerData?.filter,
138
+ init: { initialPostId: data.post.id, prefetchedItems: [data.post] }
139
+ });
140
+ }
141
+ else {
142
+ this.onPostDeleted({ id: data.post.id });
143
+ }
144
+ };
145
+ onPostDeleted = (data) => {
146
+ if (this._state !== 'ready') {
147
+ return false;
148
+ }
149
+ this.feedBuffer?.removeItemById(data.id);
150
+ };
151
+ checkIfEditedPostAffectsFeed = (data) => {
152
+ const { post, categories, isPublished } = data;
153
+ if (!isPublished) {
154
+ // Unpublished posts never affect the feed
155
+ return false;
156
+ }
157
+ if (post.postType === PostType.Moment) {
158
+ // Moments are processed separately
159
+ return false;
160
+ }
161
+ return !this._feedPlayerData?.filter.categoryId || categories.includes(this._feedPlayerData.filter.categoryId);
162
+ };
82
163
  tryRestoreState = (initialPostId, filter) => {
83
164
  if (this._state !== 'ready' || !this._feedPlayerData || !Utils.areEqual(this._feedPlayerData.filter, filter)) {
84
165
  return false;
85
166
  }
86
- const buffer = this._feedPlayerData.props.dataProvider.type === 'buffer' ? this._feedPlayerData.props.dataProvider.buffer : null;
87
- if (!buffer) {
167
+ if (!this.feedBuffer) {
88
168
  return false;
89
169
  }
90
- return buffer.tryActivateItemById(initialPostId);
170
+ return this.feedBuffer.tryActivateItemById(initialPostId);
91
171
  };
92
172
  makePostsPlayerProps = (data) => {
93
173
  const { dataProvider, on } = data;
94
174
  return {
95
175
  dataProvider: { type: 'buffer', buffer: initBufferFromProvider(dataProvider) },
96
- socialInteractionsHandler: this._dataProvider.handlers?.socialInteractionsHandler,
176
+ socialInteractionsHandler: this._dataProvider.handlers?.postSocialInteractionsHandler,
177
+ sharingHandler: this._dataProvider.handlers?.postSharingHandler,
97
178
  analyticsHandler: this._dataProvider.handlers?.analyticsHandler,
98
179
  playerSettings: this._mediaCenterSettingsHandler.playerSettings,
99
180
  closeOrchestrator: this._closeOrchestrator,
@@ -1,8 +1,9 @@
1
1
  import type { IMediaCenterDataProvider } from '../../config/types';
2
2
  import type { MediaCenterState } from '../../navigation';
3
- import type { StreamsPlayerProps, IStreamsPlayerDataProvider } from '../../../streams/streams-player/types';
3
+ import { StreamsPlayerBuffer } from '../../../streams/streams-player/streams-player-buffer.svelte';
4
+ import type { StreamsPlayerProps, IStreamsPlayerDataProvider, StreamManagementActions, StreamPlayerModel } from '../../../streams/streams-player/types';
4
5
  import type { ICloseOrchestrator } from '../../../ui/player/close-orchestrator';
5
- import { MediaCenterSettingsHandler } from '../handlers';
6
+ import { MediaCenterContentHandler, MediaCenterSettingsHandler } from '../handlers';
6
7
  import type { StreamsFeedFilter, StreamsFeedProviderInit } from './types';
7
8
  export declare class StreamsFeedHandler {
8
9
  private _state;
@@ -10,11 +11,13 @@ export declare class StreamsFeedHandler {
10
11
  private _feedPlayerData;
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,8 +25,11 @@ export declare class StreamsFeedHandler {
22
25
  get active(): boolean;
23
26
  get loading(): boolean;
24
27
  get feedPlayerProps(): StreamsPlayerProps | null;
28
+ get feedBuffer(): StreamsPlayerBuffer | null;
29
+ get managementActions(): StreamManagementActions | undefined;
30
+ get canReload(): boolean;
25
31
  deactivate: () => void;
26
- activateWithExistingProvider: (data: {
32
+ activateWithDataProvider: (data: {
27
33
  dataProvider: IStreamsPlayerDataProvider;
28
34
  onStreamActivated?: (data: {
29
35
  id: string;
@@ -34,7 +40,16 @@ export declare class StreamsFeedHandler {
34
40
  activate: (options: Partial<{
35
41
  filter: StreamsFeedFilter;
36
42
  init: StreamsFeedProviderInit;
43
+ tryRestoreState?: boolean;
37
44
  }>) => Promise<void>;
45
+ onStreamModified: (data: {
46
+ stream: StreamPlayerModel;
47
+ categories: string[];
48
+ isPublished: boolean;
49
+ }) => false | undefined;
50
+ onStreamPageDeleted: (data: {
51
+ id: string;
52
+ }) => false | undefined;
38
53
  private tryRestoreState;
39
54
  private makeStreamsPlayerProps;
40
55
  }