@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.
- package/dist/core/utils/utils.d.ts +1 -0
- package/dist/core/utils/utils.js +4 -0
- package/dist/external-api/data-providers/internal-media-center-data-provider.svelte.d.ts +2 -0
- package/dist/external-api/data-providers/internal-media-center-data-provider.svelte.js +4 -3
- package/dist/media-center/config/types.d.ts +2 -1
- package/dist/media-center/media-center/cmp.media-center-proxy.svelte +8 -3
- package/dist/media-center/media-center/discover/community-features.svelte +3 -3
- package/dist/media-center/media-center/discover/data-loading.js +2 -2
- package/dist/media-center/media-center/discover/discover-view-handler.svelte.d.ts +11 -3
- package/dist/media-center/media-center/discover/discover-view-handler.svelte.js +26 -13
- package/dist/media-center/media-center/discover/discover-view-localization.d.ts +1 -0
- package/dist/media-center/media-center/discover/discover-view-localization.js +6 -0
- package/dist/media-center/media-center/discover/discover-view.svelte +84 -60
- package/dist/media-center/media-center/footer/media-center-footer.svelte +1 -1
- package/dist/media-center/media-center/header/media-center-header.svelte +11 -7
- package/dist/media-center/media-center/media-center-context.svelte.d.ts +14 -10
- package/dist/media-center/media-center/media-center-context.svelte.js +102 -43
- package/dist/media-center/media-center/media-center-settings.svelte.d.ts +3 -1
- package/dist/media-center/media-center/media-center-settings.svelte.js +8 -14
- package/dist/media-center/media-center/media-center-view.svelte +22 -25
- package/dist/media-center/media-center/moments/moments-feed-handler.svelte.d.ts +13 -4
- package/dist/media-center/media-center/moments/moments-feed-handler.svelte.js +30 -6
- package/dist/media-center/media-center/moments/moments-state.svelte.d.ts +4 -1
- package/dist/media-center/media-center/moments/moments-state.svelte.js +10 -2
- package/dist/media-center/media-center/{feed → posts-feed}/feed-providers-generator.d.ts +4 -8
- package/dist/media-center/media-center/posts-feed/feed-providers-generator.js +61 -0
- package/dist/media-center/media-center/posts-feed/index.d.ts +1 -0
- package/dist/media-center/media-center/posts-feed/index.js +1 -0
- package/dist/media-center/media-center/posts-feed/posts-feed-handler.svelte.d.ts +42 -0
- package/dist/media-center/media-center/posts-feed/posts-feed-handler.svelte.js +106 -0
- package/dist/media-center/media-center/posts-feed/types.d.ts +8 -0
- package/dist/media-center/media-center/streams-feed/feed-providers-generator.d.ts +12 -0
- package/dist/media-center/media-center/streams-feed/feed-providers-generator.js +56 -0
- package/dist/media-center/media-center/streams-feed/index.d.ts +1 -0
- package/dist/media-center/media-center/streams-feed/index.js +1 -0
- package/dist/media-center/media-center/streams-feed/streams-feed-handler.svelte.d.ts +45 -0
- package/dist/media-center/media-center/streams-feed/streams-feed-handler.svelte.js +111 -0
- package/dist/media-center/media-center/streams-feed/types.d.ts +9 -0
- package/dist/media-center/media-center/types.d.ts +3 -1
- package/dist/media-center/navigation/index.d.ts +1 -1
- package/dist/media-center/navigation/{media-center-state.d.ts → media-center-state.types.d.ts} +4 -3
- package/dist/media-center/navigation/media-center-state.types.js +1 -0
- package/dist/media-center/navigation/mock-navigation-handler.svelte.d.ts +3 -2
- package/dist/media-center/navigation/mock-navigation-handler.svelte.js +5 -2
- package/dist/media-center/navigation/types.d.ts +1 -2
- package/dist/media-page/cmp.media-page.svelte +1 -1
- package/dist/media-page/index.d.ts +4 -1
- package/dist/streams/streams-player/streams-player-view.svelte +4 -4
- package/dist/streams/streams-player/types.d.ts +5 -0
- package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.d.ts +1 -0
- package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.js +10 -0
- package/dist/ui/player/providers/default-chunks-player-buffer.svelte.d.ts +1 -0
- package/dist/ui/player/providers/default-chunks-player-buffer.svelte.js +3 -0
- package/dist/ui/player/providers/default-feed-player-buffer.svelte.d.ts +1 -0
- package/dist/ui/player/providers/default-feed-player-buffer.svelte.js +8 -0
- package/dist/ui/player/providers/types.d.ts +1 -0
- package/dist/ui/player/slider/cmp.player-slider.svelte +1 -1
- package/dist/ui/shadow-dom/cmp.shadow-root.svelte +2 -0
- package/dist/ui/shadow-dom/colors.scss +2 -0
- package/package.json +9 -7
- package/dist/media-center/media-center/feed/feed-handler.svelte.d.ts +0 -52
- package/dist/media-center/media-center/feed/feed-handler.svelte.js +0 -92
- package/dist/media-center/media-center/feed/feed-providers-generator.js +0 -83
- package/dist/media-center/media-center/feed/index.d.ts +0 -1
- package/dist/media-center/media-center/feed/index.js +0 -1
- package/dist/media-center/media-center/feed/types.d.ts +0 -12
- /package/dist/media-center/media-center/{feed → posts-feed}/types.js +0 -0
- /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
|
-
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
46
|
+
this.postsFeedHandler = new PostsFeedHandler({
|
|
36
47
|
dataProvider,
|
|
37
48
|
mediaCenterSettingsHandler: this.settingsHandler,
|
|
38
49
|
closeOrchestrator,
|
|
39
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
133
|
+
this.deactivateAllBut('posts-feed');
|
|
116
134
|
this.categoriesHandler.selectedCategoryId = options.filter?.categoryId ?? null;
|
|
117
|
-
this.
|
|
135
|
+
this.postsFeedHandler.activate(options);
|
|
118
136
|
};
|
|
119
137
|
playStreamsFeed = async (options) => {
|
|
120
|
-
this.
|
|
138
|
+
this.deactivateAllBut('streams-feed');
|
|
121
139
|
this.categoriesHandler.selectedCategoryId = options.filter?.categoryId ?? null;
|
|
122
|
-
this.
|
|
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.
|
|
129
|
-
this.
|
|
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.
|
|
138
|
-
this.
|
|
151
|
+
if (this.streamsFeedHandler.active) {
|
|
152
|
+
this.streamsFeedHandler.activate({});
|
|
139
153
|
}
|
|
140
154
|
else {
|
|
141
|
-
this.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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
|
-
|
|
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.
|
|
8
|
+
this.update(init);
|
|
8
9
|
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
31
|
-
|
|
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({
|
|
52
|
+
context.playPostsFeed({ init: { prefetchedItems: [shortVideo] } });
|
|
56
53
|
};
|
|
57
54
|
const activateSelectedStreamPlayer = (stream) => {
|
|
58
|
-
context.playStreamsFeed({
|
|
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
|
-
{
|
|
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
|
|
14
|
+
private _callbacks;
|
|
14
15
|
constructor(data: {
|
|
15
16
|
dataProvider: IMediaCenterDataProvider;
|
|
16
17
|
mediaCenterSettingsHandler: MediaCenterSettingsHandler;
|
|
17
18
|
closeOrchestrator: ICloseOrchestrator;
|
|
18
|
-
|
|
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
|
-
|
|
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
|
-
|
|
11
|
+
_callbacks;
|
|
12
12
|
constructor(data) {
|
|
13
|
-
const { dataProvider, mediaCenterSettingsHandler, closeOrchestrator,
|
|
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.
|
|
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
|
-
|
|
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: {
|
|
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) =>
|
|
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: (
|
|
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 = (
|
|
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
|
-
|
|
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 {
|
|
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
|
|
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
|
}
|