@streamscloud/embeddable 13.0.1 → 13.2.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 (68) hide show
  1. package/dist/core/utils/utils.d.ts +1 -0
  2. package/dist/core/utils/utils.js +4 -0
  3. package/dist/external-api/data-providers/internal-media-center-data-provider.svelte.d.ts +2 -0
  4. package/dist/external-api/data-providers/internal-media-center-data-provider.svelte.js +4 -3
  5. package/dist/media-center/config/types.d.ts +2 -1
  6. package/dist/media-center/media-center/cmp.media-center-proxy.svelte +8 -3
  7. package/dist/media-center/media-center/discover/community-features.svelte +3 -3
  8. package/dist/media-center/media-center/discover/data-loading.js +2 -2
  9. package/dist/media-center/media-center/discover/discover-view-handler.svelte.d.ts +11 -3
  10. package/dist/media-center/media-center/discover/discover-view-handler.svelte.js +26 -13
  11. package/dist/media-center/media-center/discover/discover-view-localization.d.ts +1 -0
  12. package/dist/media-center/media-center/discover/discover-view-localization.js +6 -0
  13. package/dist/media-center/media-center/discover/discover-view.svelte +84 -60
  14. package/dist/media-center/media-center/footer/media-center-footer.svelte +1 -1
  15. package/dist/media-center/media-center/header/media-center-header.svelte +11 -7
  16. package/dist/media-center/media-center/media-center-context.svelte.d.ts +14 -10
  17. package/dist/media-center/media-center/media-center-context.svelte.js +102 -43
  18. package/dist/media-center/media-center/media-center-settings.svelte.d.ts +3 -1
  19. package/dist/media-center/media-center/media-center-settings.svelte.js +8 -14
  20. package/dist/media-center/media-center/media-center-view.svelte +22 -25
  21. package/dist/media-center/media-center/moments/moments-feed-handler.svelte.d.ts +13 -4
  22. package/dist/media-center/media-center/moments/moments-feed-handler.svelte.js +30 -6
  23. package/dist/media-center/media-center/moments/moments-state.svelte.d.ts +4 -1
  24. package/dist/media-center/media-center/moments/moments-state.svelte.js +10 -2
  25. package/dist/media-center/media-center/{feed → posts-feed}/feed-providers-generator.d.ts +4 -8
  26. package/dist/media-center/media-center/posts-feed/feed-providers-generator.js +61 -0
  27. package/dist/media-center/media-center/posts-feed/index.d.ts +1 -0
  28. package/dist/media-center/media-center/posts-feed/index.js +1 -0
  29. package/dist/media-center/media-center/posts-feed/posts-feed-handler.svelte.d.ts +42 -0
  30. package/dist/media-center/media-center/posts-feed/posts-feed-handler.svelte.js +106 -0
  31. package/dist/media-center/media-center/posts-feed/types.d.ts +8 -0
  32. package/dist/media-center/media-center/streams-feed/feed-providers-generator.d.ts +12 -0
  33. package/dist/media-center/media-center/streams-feed/feed-providers-generator.js +56 -0
  34. package/dist/media-center/media-center/streams-feed/index.d.ts +1 -0
  35. package/dist/media-center/media-center/streams-feed/index.js +1 -0
  36. package/dist/media-center/media-center/streams-feed/streams-feed-handler.svelte.d.ts +45 -0
  37. package/dist/media-center/media-center/streams-feed/streams-feed-handler.svelte.js +111 -0
  38. package/dist/media-center/media-center/streams-feed/types.d.ts +9 -0
  39. package/dist/media-center/media-center/types.d.ts +3 -1
  40. package/dist/media-center/navigation/index.d.ts +1 -1
  41. package/dist/media-center/navigation/{media-center-state.d.ts → media-center-state.types.d.ts} +4 -3
  42. package/dist/media-center/navigation/media-center-state.types.js +1 -0
  43. package/dist/media-center/navigation/mock-navigation-handler.svelte.d.ts +3 -2
  44. package/dist/media-center/navigation/mock-navigation-handler.svelte.js +5 -2
  45. package/dist/media-center/navigation/types.d.ts +1 -2
  46. package/dist/media-page/cmp.media-page.svelte +1 -1
  47. package/dist/media-page/index.d.ts +4 -1
  48. package/dist/streams/streams-player/streams-player-view.svelte +4 -4
  49. package/dist/streams/streams-player/types.d.ts +5 -0
  50. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.d.ts +1 -0
  51. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.js +10 -0
  52. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.d.ts +1 -0
  53. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.js +3 -0
  54. package/dist/ui/player/providers/default-feed-player-buffer.svelte.d.ts +1 -0
  55. package/dist/ui/player/providers/default-feed-player-buffer.svelte.js +8 -0
  56. package/dist/ui/player/providers/types.d.ts +1 -0
  57. package/dist/ui/player/slider/cmp.player-slider.svelte +1 -1
  58. package/dist/ui/shadow-dom/cmp.shadow-root.svelte +2 -0
  59. package/dist/ui/shadow-dom/colors.scss +2 -0
  60. package/package.json +9 -7
  61. package/dist/media-center/media-center/feed/feed-handler.svelte.d.ts +0 -52
  62. package/dist/media-center/media-center/feed/feed-handler.svelte.js +0 -92
  63. package/dist/media-center/media-center/feed/feed-providers-generator.js +0 -83
  64. package/dist/media-center/media-center/feed/index.d.ts +0 -1
  65. package/dist/media-center/media-center/feed/index.js +0 -1
  66. package/dist/media-center/media-center/feed/types.d.ts +0 -12
  67. /package/dist/media-center/media-center/{feed → posts-feed}/types.js +0 -0
  68. /package/dist/media-center/{navigation/media-center-state.js → media-center/streams-feed/types.js} +0 -0
@@ -1,20 +1,23 @@
1
1
  import type { IMediaCenterDataProvider } from '../config/types';
2
+ import type { MediaCenterState } from '../navigation';
2
3
  import type { ICloseOrchestrator } from '../../ui/player/close-orchestrator';
3
4
  import { DiscoverViewHandler } from './discover';
4
- import { FeedHandler } from './feed';
5
5
  import { CategoriesHandler, 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';
9
+ import { PostsFeedHandler } from './posts-feed';
10
+ import { StreamsFeedHandler } from './streams-feed';
9
11
  import { StreamsInCategoryPanelHandler } from './streams-in-category';
10
12
  import type { MediaCenterMode } from './types';
11
13
  export declare class MediaCenterContext {
12
14
  initializing: boolean;
13
15
  initialized: boolean;
14
- readonly mediaCenterMode: MediaCenterMode;
16
+ readonly mediaCenterMode: MediaCenterMode | null;
15
17
  menuActive: boolean;
16
18
  categoriesHandler: CategoriesHandler;
17
- feedHandler: FeedHandler;
19
+ postsFeedHandler: PostsFeedHandler;
20
+ streamsFeedHandler: StreamsFeedHandler;
18
21
  momentsFeedHandler: MomentsFeedHandler;
19
22
  discoverHandler: DiscoverViewHandler;
20
23
  popularStreamsHandler: PopularStreamsPanelHandler;
@@ -22,6 +25,7 @@ export declare class MediaCenterContext {
22
25
  settingsHandler: MediaCenterSettingsHandler;
23
26
  closeOrchestrator: ICloseOrchestrator;
24
27
  private _dataProvider;
28
+ private _currentState;
25
29
  constructor(data: {
26
30
  dataProvider: IMediaCenterDataProvider;
27
31
  closeOrchestrator: ICloseOrchestrator;
@@ -37,10 +41,7 @@ export declare class MediaCenterContext {
37
41
  backgroundImageUrl: string | null;
38
42
  backgroundColor?: string | null;
39
43
  };
40
- get feedPlayerProps(): import("./types").PlayerProps | null;
41
- get momentsPlayerProps(): import("../../posts/posts-player/types").PostsPlayerProps | null;
42
44
  get membershipHandler(): import("..").IMediaCenterMembershipHandler | null;
43
- get navigationHandler(): import("..").IMediaCenterNavigationHandler | null;
44
45
  get categoriesFollowingHandler(): import("..").IContentCategoryFollowingHandler | null;
45
46
  get locale(): import("../../core/locale").Locale;
46
47
  toggleMenu: () => void;
@@ -49,12 +50,15 @@ export declare class MediaCenterContext {
49
50
  activateDiscover: (options: {
50
51
  categoryId: string | null;
51
52
  }) => Promise<void>;
52
- playPostsFeed: (options: Parameters<FeedHandler["activatePostsFeed"]>[0]) => Promise<void>;
53
- playStreamsFeed: (options: Parameters<FeedHandler["activateStreamsFeed"]>[0]) => Promise<void>;
54
- playMoments: () => Promise<void>;
53
+ backToDiscover: () => Promise<void>;
54
+ playPostsFeed: (options: Parameters<PostsFeedHandler["activate"]>[0]) => Promise<void>;
55
+ playStreamsFeed: (options: Parameters<StreamsFeedHandler["activate"]>[0]) => Promise<void>;
56
+ playMoments: (options?: Parameters<MomentsFeedHandler["activate"]>[0]) => Promise<void>;
55
57
  playRootFeed: () => Promise<void>;
56
58
  tryActivateStreamsInCategory: (categoryId: string) => Promise<void>;
57
- private deactivateOtherThanFeed;
59
+ restoreState: (state: MediaCenterState) => Promise<void>;
60
+ handleNavigationStateChanged: (state: MediaCenterState) => void;
61
+ private deactivateAllBut;
58
62
  private init;
59
63
  }
60
64
  type MediaCenterContextInitializationCallbacks = {
@@ -1,9 +1,12 @@
1
+ import { Utils } from '../../core/utils';
1
2
  import { DiscoverViewHandler } from './discover';
2
- import { FeedHandler } from './feed';
3
3
  import { CategoriesHandler, MediaCenterSettingsHandler } from './handlers';
4
4
  import { PopularStreamsPanelHandler } from './menu';
5
5
  import { MomentsFeedHandler } from './moments';
6
+ import { PostsFeedHandler } from './posts-feed';
7
+ import { StreamsFeedHandler } from './streams-feed';
6
8
  import { StreamsInCategoryPanelHandler } from './streams-in-category';
9
+ import { untrack } from 'svelte';
7
10
  export class MediaCenterContext {
8
11
  initializing = $state(true);
9
12
  initialized = $state(false);
@@ -14,11 +17,18 @@ export class MediaCenterContext {
14
17
  if (this.momentsFeedHandler.active) {
15
18
  return 'moments';
16
19
  }
17
- return 'feed';
20
+ if (this.postsFeedHandler.activated) {
21
+ return 'posts-feed';
22
+ }
23
+ if (this.streamsFeedHandler.activated) {
24
+ return 'streams-feed';
25
+ }
26
+ return null;
18
27
  });
19
28
  menuActive = $state(false);
20
29
  categoriesHandler;
21
- feedHandler;
30
+ postsFeedHandler;
31
+ streamsFeedHandler;
22
32
  momentsFeedHandler;
23
33
  discoverHandler;
24
34
  popularStreamsHandler;
@@ -26,27 +36,45 @@ export class MediaCenterContext {
26
36
  settingsHandler;
27
37
  closeOrchestrator;
28
38
  _dataProvider;
39
+ _currentState = null;
29
40
  constructor(data) {
30
41
  const { dataProvider, closeOrchestrator, settings, on } = data;
31
42
  this._dataProvider = dataProvider;
32
43
  this.closeOrchestrator = closeOrchestrator;
33
44
  this.closeOrchestrator.setCloseTriggerAttached(true);
34
45
  this.settingsHandler = new MediaCenterSettingsHandler({ settings, dataProvider });
35
- this.feedHandler = new FeedHandler({
46
+ this.postsFeedHandler = new PostsFeedHandler({
36
47
  dataProvider,
37
48
  mediaCenterSettingsHandler: this.settingsHandler,
38
49
  closeOrchestrator,
39
- onPlayerReachedEnd: () => this.activateDiscover({ categoryId: this.categoriesHandler.selectedCategoryId })
50
+ on: { playerReachedEnd: this.backToDiscover, navigationStateChanged: this.handleNavigationStateChanged }
51
+ });
52
+ this.streamsFeedHandler = new StreamsFeedHandler({
53
+ dataProvider,
54
+ mediaCenterSettingsHandler: this.settingsHandler,
55
+ closeOrchestrator,
56
+ on: { playerReachedEnd: this.backToDiscover, navigationStateChanged: this.handleNavigationStateChanged }
40
57
  });
41
58
  this.categoriesHandler = new CategoriesHandler(dataProvider);
42
- this.discoverHandler = new DiscoverViewHandler(dataProvider);
59
+ this.discoverHandler = new DiscoverViewHandler({ dataProvider, on: { navigationStateChanged: this.handleNavigationStateChanged } });
43
60
  this.popularStreamsHandler = new PopularStreamsPanelHandler(dataProvider);
44
61
  this.streamsInCategoryHandler = new StreamsInCategoryPanelHandler(dataProvider);
45
62
  this.momentsFeedHandler = new MomentsFeedHandler({
46
63
  dataProvider,
47
64
  mediaCenterSettingsHandler: this.settingsHandler,
48
65
  closeOrchestrator,
49
- onPlayerReachedEnd: () => this.activateDiscover({ categoryId: this.categoriesHandler.selectedCategoryId })
66
+ on: { playerReachedEnd: this.backToDiscover, navigationStateChanged: this.handleNavigationStateChanged }
67
+ });
68
+ $effect(() => {
69
+ if (this.initialized) {
70
+ void settings.state;
71
+ untrack(() => {
72
+ if (!settings.state) {
73
+ return;
74
+ }
75
+ this.restoreState(settings.state);
76
+ });
77
+ }
50
78
  });
51
79
  this.init(dataProvider, on);
52
80
  }
@@ -57,7 +85,7 @@ export class MediaCenterContext {
57
85
  return this.settingsHandler.actualMediaCenterColors;
58
86
  }
59
87
  get loading() {
60
- return this.discoverHandler.loading || this.streamsInCategoryHandler.loading;
88
+ return this.discoverHandler.loading || this.postsFeedHandler.loading || this.streamsFeedHandler.loading || this.streamsInCategoryHandler.loading;
61
89
  }
62
90
  get overlayIsActive() {
63
91
  return this.streamsInCategoryHandler.activated;
@@ -65,18 +93,9 @@ export class MediaCenterContext {
65
93
  get backgroundWrapperProps() {
66
94
  return this.settingsHandler.backgroundWrapperProps;
67
95
  }
68
- get feedPlayerProps() {
69
- return this.feedHandler.feedPlayerProps;
70
- }
71
- get momentsPlayerProps() {
72
- return this.momentsFeedHandler.momentsPlayerProps;
73
- }
74
96
  get membershipHandler() {
75
97
  return this._dataProvider.handlers?.membershipHandler || null;
76
98
  }
77
- get navigationHandler() {
78
- return this._dataProvider.handlers?.navigationHandler || null;
79
- }
80
99
  get categoriesFollowingHandler() {
81
100
  return this._dataProvider.handlers?.categoriesFollowingHandler || null;
82
101
  }
@@ -100,61 +119,101 @@ export class MediaCenterContext {
100
119
  };
101
120
  activateDiscover = async (options) => {
102
121
  this.settingsHandler.updateBackgroundImageUrl('not-applicable');
103
- this.hideMenu();
104
- this.feedHandler.deactivate();
105
- this.momentsFeedHandler.deactivate();
106
- this.streamsInCategoryHandler.deactivate();
122
+ this.deactivateAllBut('discover');
107
123
  this.categoriesHandler.selectedCategoryId = options.categoryId;
108
124
  const childCategories = this.categoriesHandler.allCategories.filter((c) => c.parentId === this.categoriesHandler.selectedCategoryId);
109
125
  await this.discoverHandler.activate({
110
126
  activeCategoryId: this.categoriesHandler.selectedCategoryId,
127
+ activeCategoryName: this.categoriesHandler.allCategories.find((c) => c.id === this.categoriesHandler.selectedCategoryId)?.name || null,
111
128
  childCategories: childCategories.map((c) => ({ id: c.id, name: c.name }))
112
129
  });
113
130
  };
131
+ backToDiscover = () => this.activateDiscover({ categoryId: this.categoriesHandler.selectedCategoryId });
114
132
  playPostsFeed = async (options) => {
115
- this.deactivateOtherThanFeed();
133
+ this.deactivateAllBut('posts-feed');
116
134
  this.categoriesHandler.selectedCategoryId = options.filter?.categoryId ?? null;
117
- this.feedHandler.activatePostsFeed(options);
135
+ this.postsFeedHandler.activate(options);
118
136
  };
119
137
  playStreamsFeed = async (options) => {
120
- this.deactivateOtherThanFeed();
138
+ this.deactivateAllBut('streams-feed');
121
139
  this.categoriesHandler.selectedCategoryId = options.filter?.categoryId ?? null;
122
- this.feedHandler.activateStreamsFeed(options);
140
+ this.streamsFeedHandler.activate(options);
123
141
  };
124
- playMoments = async () => {
142
+ playMoments = async (options) => {
125
143
  if (!this.momentsFeedHandler.hasMoments) {
126
144
  return;
127
145
  }
128
- this.hideMenu();
129
- this.feedHandler.deactivate();
130
- this.discoverHandler.deactivate();
131
- this.streamsInCategoryHandler.deactivate();
132
- this.momentsFeedHandler.activateMoments();
146
+ this.deactivateAllBut('moments');
147
+ this.momentsFeedHandler.activate(options);
133
148
  };
134
149
  playRootFeed = async () => {
135
- this.deactivateOtherThanFeed();
136
150
  this.categoriesHandler.selectedCategoryId = null;
137
- if (this.feedPlayerProps?.type === 'streams') {
138
- this.feedHandler.activateStreamsFeed({});
151
+ if (this.streamsFeedHandler.active) {
152
+ this.streamsFeedHandler.activate({});
139
153
  }
140
154
  else {
141
- this.feedHandler.activatePostsFeed({});
155
+ this.deactivateAllBut('posts-feed');
156
+ this.postsFeedHandler.activate({});
142
157
  }
143
158
  };
144
159
  tryActivateStreamsInCategory = async (categoryId) => {
145
160
  const selectedCategoryData = this.categoriesHandler.getCategoryData(categoryId);
146
161
  await this.streamsInCategoryHandler.activate(selectedCategoryData);
147
- this.hideMenu();
148
- this.feedHandler.deactivate();
149
- this.momentsFeedHandler.deactivate();
150
- this.discoverHandler.deactivate();
162
+ this.deactivateAllBut('streams-in-category');
151
163
  this.categoriesHandler.selectedCategoryId = categoryId;
152
164
  };
153
- deactivateOtherThanFeed = () => {
165
+ restoreState = async (state) => {
166
+ if (Utils.areEqual(this._currentState, state)) {
167
+ return;
168
+ }
169
+ this._currentState = state;
170
+ switch (state.mode) {
171
+ case 'posts-feed':
172
+ await this.playPostsFeed({ filter: { categoryId: state.categoryId }, init: { initialPostId: state.postId } });
173
+ break;
174
+ case 'streams-feed':
175
+ await this.playStreamsFeed({
176
+ filter: { categoryId: state.categoryId },
177
+ init: { initialStreamId: state.streamId, initialStreamPageId: state.streamPageId }
178
+ });
179
+ break;
180
+ case 'discover':
181
+ await this.activateDiscover({ categoryId: state.categoryId });
182
+ break;
183
+ case 'moments':
184
+ await this.playMoments({ initialMomentId: state.momentId });
185
+ break;
186
+ }
187
+ };
188
+ handleNavigationStateChanged = (state) => {
189
+ if (Utils.areEqual(this._currentState, state)) {
190
+ return;
191
+ }
192
+ const navigationHandler = this._dataProvider.handlers?.navigationHandler;
193
+ if (!navigationHandler) {
194
+ return;
195
+ }
196
+ this._currentState = state;
197
+ navigationHandler.onChange(state);
198
+ };
199
+ deactivateAllBut = (...params) => {
154
200
  this.hideMenu();
155
- this.momentsFeedHandler.deactivate();
156
- this.discoverHandler.deactivate();
157
- this.streamsInCategoryHandler.deactivate();
201
+ const keep = new Set(params);
202
+ if (!keep.has('moments')) {
203
+ this.momentsFeedHandler.deactivate();
204
+ }
205
+ if (!keep.has('discover')) {
206
+ this.discoverHandler.deactivate();
207
+ }
208
+ if (!keep.has('posts-feed')) {
209
+ this.postsFeedHandler.deactivate();
210
+ }
211
+ if (!keep.has('streams-feed')) {
212
+ this.streamsFeedHandler.deactivate();
213
+ }
214
+ if (!keep.has('streams-in-category')) {
215
+ this.streamsInCategoryHandler.deactivate();
216
+ }
158
217
  };
159
218
  init = async (config, on) => {
160
219
  try {
@@ -1,11 +1,13 @@
1
1
  import type { Locale } from '../../core/locale';
2
2
  import type { ThemeValue } from '../../core/theme';
3
+ import type { MediaCenterState } from '..';
3
4
  import type { IMediaCenterSettings } from './types';
4
5
  export declare class MediaCenterSettings {
5
6
  locale: Locale;
6
7
  showStreamsCloudWatermark: boolean;
7
8
  disableBackground: boolean;
8
9
  theme: ThemeValue;
10
+ state: MediaCenterState | null;
9
11
  constructor(init: IMediaCenterSettings | undefined);
10
- patch: (data: Partial<IMediaCenterSettings> | undefined) => void;
12
+ update: (data: IMediaCenterSettings | undefined) => void;
11
13
  }
@@ -3,21 +3,15 @@ export class MediaCenterSettings {
3
3
  showStreamsCloudWatermark = $state(true);
4
4
  disableBackground = $state(false);
5
5
  theme = $state('dark');
6
+ state = $state.raw(null);
6
7
  constructor(init) {
7
- this.patch(init);
8
+ this.update(init);
8
9
  }
9
- patch = (data) => {
10
- if (data?.locale !== undefined) {
11
- this.locale = data.locale;
12
- }
13
- if (data?.showStreamsCloudWatermark !== undefined) {
14
- this.showStreamsCloudWatermark = data.showStreamsCloudWatermark;
15
- }
16
- if (data?.disableBackground !== undefined) {
17
- this.disableBackground = data.disableBackground;
18
- }
19
- if (data?.theme !== undefined) {
20
- this.theme = data.theme;
21
- }
10
+ update = (data) => {
11
+ this.locale = data?.locale ?? 'en';
12
+ this.showStreamsCloudWatermark = data?.showStreamsCloudWatermark ?? true;
13
+ this.disableBackground = data?.disableBackground ?? false;
14
+ this.theme = data?.theme ?? 'dark';
15
+ this.state = data?.state ?? null;
22
16
  };
23
17
  }
@@ -22,24 +22,21 @@ let { context, dynamicActions } = $props();
22
22
  let headerHeight = $state(0);
23
23
  let isMobileView = $state(false);
24
24
  const selectCategory = (categoryId) => __awaiter(void 0, void 0, void 0, function* () {
25
+ if (!context.mediaCenterMode) {
26
+ return;
27
+ }
25
28
  switch (context.mediaCenterMode) {
26
- case 'feed':
27
- if (!context.feedPlayerProps) {
29
+ case 'posts-feed':
30
+ if (!context.postsFeedHandler.feedPlayerProps) {
28
31
  return;
29
32
  }
30
- switch (context.feedPlayerProps.type) {
31
- case 'posts':
32
- if (context.categoriesHandler.selectedCategoryId === categoryId) {
33
- return;
34
- }
35
- context.playPostsFeed({ filter: { categoryId } });
36
- break;
37
- case 'streams':
38
- context.tryActivateStreamsInCategory(categoryId);
39
- return;
40
- default:
41
- Utils.assertUnreachable(context.feedPlayerProps);
33
+ if (context.categoriesHandler.selectedCategoryId === categoryId) {
34
+ return;
42
35
  }
36
+ context.playPostsFeed({ filter: { categoryId } });
37
+ break;
38
+ case 'streams-feed':
39
+ context.tryActivateStreamsInCategory(categoryId);
43
40
  break;
44
41
  case 'discover':
45
42
  context.activateDiscover({ categoryId });
@@ -52,13 +49,13 @@ const selectCategory = (categoryId) => __awaiter(void 0, void 0, void 0, functio
52
49
  }
53
50
  });
54
51
  const activateSelectedShortVideoPlayer = (shortVideo) => {
55
- context.playPostsFeed({ filter: { prefetchedItems: [shortVideo] } });
52
+ context.playPostsFeed({ init: { prefetchedItems: [shortVideo] } });
56
53
  };
57
54
  const activateSelectedStreamPlayer = (stream) => {
58
- context.playStreamsFeed({ filter: { prefetchedStreams: [stream] } });
55
+ context.playStreamsFeed({ init: { prefetchedStreams: [stream] } });
59
56
  };
60
57
  const activateSelectedStreamOfCategoryPlayer = (id, prefetchedStreams, categoryId) => {
61
- context.playStreamsFeed({ filter: { categoryId, prefetchedStreams, initialStreamId: id } });
58
+ context.playStreamsFeed({ filter: { categoryId }, init: { prefetchedStreams, initialStreamId: id } });
62
59
  };
63
60
  const onHeaderHeightChanged = (height) => {
64
61
  headerHeight = height;
@@ -139,13 +136,13 @@ const swipeToOpen = (node) => {
139
136
  {/if}
140
137
 
141
138
  <div class="media-center__content-container" use:swipeToOpen>
142
- {#if context.mediaCenterMode === 'feed' && context.feedPlayerProps}
139
+ {#if context.mediaCenterMode === 'posts-feed' && context.postsFeedHandler.feedPlayerProps}
140
+ <div class="media-center__content" class:media-center__content--faded={context.overlayIsActive} transition:fade={{ duration: 300 }}>
141
+ <PostsPlayerView {...context.postsFeedHandler.feedPlayerProps} />
142
+ </div>
143
+ {:else if context.mediaCenterMode === 'streams-feed' && context.streamsFeedHandler.feedPlayerProps}
143
144
  <div class="media-center__content" class:media-center__content--faded={context.overlayIsActive} transition:fade={{ duration: 300 }}>
144
- {#if context.feedPlayerProps.type === 'posts'}
145
- <PostsPlayerView {...context.feedPlayerProps.props} />
146
- {:else if context.feedPlayerProps.type === 'streams'}
147
- <StreamsPlayerView {...context.feedPlayerProps.props} />
148
- {/if}
145
+ <StreamsPlayerView {...context.streamsFeedHandler.feedPlayerProps} />
149
146
  </div>
150
147
  {:else if context.mediaCenterMode === 'discover'}
151
148
  <div class="media-center__content" transition:fade={{ duration: 300 }}>
@@ -156,9 +153,9 @@ const swipeToOpen = (node) => {
156
153
  streamSelected: (stream) => activateSelectedStreamPlayer(stream)
157
154
  }} />
158
155
  </div>
159
- {:else if context.mediaCenterMode === 'moments' && context.momentsPlayerProps}
156
+ {:else if context.mediaCenterMode === 'moments' && context.momentsFeedHandler.momentsPlayerProps}
160
157
  <div class="media-center__content" class:media-center__content--faded={context.overlayIsActive} transition:fade={{ duration: 300 }}>
161
- <PostsPlayerView {...context.momentsPlayerProps} />
158
+ <PostsPlayerView {...context.momentsFeedHandler.momentsPlayerProps} />
162
159
  </div>
163
160
  {/if}
164
161
  </div>
@@ -1,4 +1,5 @@
1
- import type { IMediaCenterDataProvider } from '../..';
1
+ import type { IMediaCenterDataProvider } from '../../config/types';
2
+ import type { MediaCenterState } from '../../navigation';
2
3
  import type { PostsPlayerProps } from '../../../posts/posts-player/types';
3
4
  import type { ICloseOrchestrator } from '../../../ui/player/close-orchestrator';
4
5
  import { MomentsState } from './moments-state.svelte';
@@ -10,17 +11,25 @@ export declare class MomentsFeedHandler {
10
11
  private _dataProvider;
11
12
  private _mediaCenterSettingsHandler;
12
13
  private _closeOrchestrator;
13
- private _onPlayerReachedEnd;
14
+ private _callbacks;
14
15
  constructor(data: {
15
16
  dataProvider: IMediaCenterDataProvider;
16
17
  mediaCenterSettingsHandler: MediaCenterSettingsHandler;
17
18
  closeOrchestrator: ICloseOrchestrator;
18
- onPlayerReachedEnd: () => void;
19
+ on: Callbacks;
19
20
  });
20
21
  get active(): boolean;
21
22
  get momentsPlayerProps(): PostsPlayerProps | null;
22
23
  get hasUnwatchedMoments(): boolean;
23
24
  get hasMoments(): boolean;
24
25
  deactivate: () => void;
25
- activateMoments: () => Promise<void>;
26
+ activate: (data?: {
27
+ initialMomentId?: string | null;
28
+ }) => Promise<void>;
29
+ private tryRestoreState;
26
30
  }
31
+ type Callbacks = {
32
+ playerReachedEnd: () => void;
33
+ navigationStateChanged: (state: MediaCenterState) => void;
34
+ };
35
+ export {};
@@ -8,14 +8,14 @@ export class MomentsFeedHandler {
8
8
  _dataProvider;
9
9
  _mediaCenterSettingsHandler;
10
10
  _closeOrchestrator;
11
- _onPlayerReachedEnd;
11
+ _callbacks;
12
12
  constructor(data) {
13
- const { dataProvider, mediaCenterSettingsHandler, closeOrchestrator, onPlayerReachedEnd } = data;
13
+ const { dataProvider, mediaCenterSettingsHandler, closeOrchestrator, on } = data;
14
14
  this.momentsState = new MomentsState(dataProvider);
15
15
  this._mediaCenterSettingsHandler = mediaCenterSettingsHandler;
16
16
  this._dataProvider = dataProvider;
17
17
  this._closeOrchestrator = closeOrchestrator;
18
- this._onPlayerReachedEnd = onPlayerReachedEnd;
18
+ this._callbacks = on;
19
19
  }
20
20
  get active() {
21
21
  return this._active;
@@ -31,19 +31,43 @@ export class MomentsFeedHandler {
31
31
  }
32
32
  deactivate = () => {
33
33
  this._active = false;
34
+ this._momentsPlayerProps = null;
34
35
  };
35
- activateMoments = async () => {
36
+ activate = async (data) => {
37
+ if (data?.initialMomentId && this.tryRestoreState(data.initialMomentId)) {
38
+ // Already active with the requested buffer
39
+ return;
40
+ }
36
41
  this._momentsPlayerProps = {
37
- dataProvider: { type: 'buffer', buffer: initBufferFromProvider(this.momentsState.generatePlayerDataProvider(this._onPlayerReachedEnd)) },
42
+ dataProvider: {
43
+ type: 'buffer',
44
+ buffer: initBufferFromProvider(this.momentsState.generatePlayerDataProvider({
45
+ initialId: data?.initialMomentId,
46
+ onEndReached: this._callbacks.playerReachedEnd
47
+ }))
48
+ },
38
49
  socialInteractionsHandler: this._dataProvider.handlers?.socialInteractionsHandler,
39
50
  analyticsHandler: this._dataProvider.handlers?.analyticsHandler,
40
51
  playerSettings: this._mediaCenterSettingsHandler.playerSettings,
41
52
  closeOrchestrator: this._closeOrchestrator,
42
53
  on: {
43
- postActivated: (id) => this.momentsState.markMomentAsSeen(id),
54
+ postActivated: (id) => {
55
+ this.momentsState.markMomentAsSeen(id);
56
+ this._callbacks.navigationStateChanged({ mode: 'moments', momentId: id });
57
+ },
44
58
  backgroundImageLoaded: this._mediaCenterSettingsHandler.backgroundImageLoadedHandler
45
59
  }
46
60
  };
47
61
  this._active = true;
48
62
  };
63
+ tryRestoreState = (initialMomentId) => {
64
+ if (!this._active || !this._momentsPlayerProps) {
65
+ return false;
66
+ }
67
+ const buffer = this._momentsPlayerProps.dataProvider.type === 'buffer' ? this._momentsPlayerProps.dataProvider.buffer : null;
68
+ if (!buffer) {
69
+ return false;
70
+ }
71
+ return buffer.tryActivateItemById(initialMomentId);
72
+ };
49
73
  }
@@ -16,5 +16,8 @@ export declare class MomentsState {
16
16
  isSeen: boolean;
17
17
  }[];
18
18
  markMomentAsSeen: (momentId: string) => void;
19
- generatePlayerDataProvider: (onEndReached: () => void) => IChunksPlayerDataProvider<PostPlayerModel>;
19
+ generatePlayerDataProvider: (data: {
20
+ initialId: string | null | undefined;
21
+ onEndReached: () => void;
22
+ }) => IChunksPlayerDataProvider<PostPlayerModel>;
20
23
  }
@@ -17,7 +17,8 @@ export class MomentsState {
17
17
  this.momentsSeenLocally = [...this.momentsSeenLocally, momentId];
18
18
  }
19
19
  };
20
- generatePlayerDataProvider = (onEndReached) => {
20
+ generatePlayerDataProvider = (data) => {
21
+ const { initialId, onEndReached } = data;
21
22
  const collectionCapacity = 5;
22
23
  const sortedMoments = [...this.allMoments].sort((a, b) => {
23
24
  const aUnwatched = !a.isSeen && !this.momentsSeenLocally.includes(a.id);
@@ -27,6 +28,13 @@ export class MomentsState {
27
28
  }
28
29
  return aUnwatched ? -1 : 1;
29
30
  });
31
+ if (initialId) {
32
+ const initialIndex = sortedMoments.findIndex((m) => m.id === initialId);
33
+ if (initialIndex >= 0) {
34
+ const [initialMoment] = sortedMoments.splice(initialIndex, 1);
35
+ sortedMoments.unshift(initialMoment);
36
+ }
37
+ }
30
38
  const ids = sortedMoments.map((m) => m.id);
31
39
  const idOrder = new Map();
32
40
  ids.forEach((id, idx) => idOrder.set(id, idx));
@@ -62,7 +70,7 @@ export class MomentsState {
62
70
  const moments = await this.dataProvider.postsPlayer.getPostsCursor({
63
71
  filter: {
64
72
  types: [PostType.Moment],
65
- includeIds: momentsInChunk
73
+ ids: momentsInChunk
66
74
  },
67
75
  limit: collectionCapacity
68
76
  });
@@ -1,17 +1,13 @@
1
1
  import type { IMediaCenterDataProvider } from '../../config/types';
2
2
  import type { PostPlayerModel } from '../../../posts/posts-player/types';
3
- import type { IStreamsPlayerDataProvider } from '../../../streams/streams-player/types';
4
3
  import type { IFeedPlayerDataProvider } from '../../../ui/player/providers';
5
- import type { PostsDataProviderFilter, StreamsDataProviderFilter } from './types';
4
+ import type { PostsFeedFilter, PostsFeedProviderInit } from './types';
6
5
  export declare class FeedProvidersGenerator {
7
6
  private dataProvider;
8
7
  constructor(dataProvider: IMediaCenterDataProvider);
9
8
  makePostPlayerItemsProvider: (data: {
10
- filter?: PostsDataProviderFilter;
9
+ filter: PostsFeedFilter | undefined;
10
+ init: PostsFeedProviderInit | undefined;
11
11
  onEndReached: () => void;
12
- }) => IFeedPlayerDataProvider<PostPlayerModel>;
13
- makeStreamsPlayerDataProvider: (data: {
14
- filter?: StreamsDataProviderFilter;
15
- onEndReached: () => void;
16
- }) => IStreamsPlayerDataProvider;
12
+ }) => Promise<IFeedPlayerDataProvider<PostPlayerModel>>;
17
13
  }