@streamscloud/embeddable 12.2.0 → 13.0.1

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 (162) hide show
  1. package/dist/content-player/content-player-config.svelte.d.ts +2 -13
  2. package/dist/content-player/content-player-config.svelte.js +1 -1
  3. package/dist/content-player/content-player-settings.svelte.d.ts +16 -0
  4. package/dist/content-player/content-player-settings.svelte.js +27 -0
  5. package/dist/content-player/index.d.ts +1 -0
  6. package/dist/content-player/index.js +1 -0
  7. package/dist/core/theme/index.d.ts +1 -0
  8. package/dist/core/theme/theme-store.svelte.d.ts +3 -2
  9. package/dist/external-api/data-providers/index.d.ts +6 -0
  10. package/dist/external-api/data-providers/index.js +6 -0
  11. package/dist/external-api/data-providers/internal-media-center-data-provider.svelte.d.ts +15 -0
  12. package/dist/{media-center/config/internal-media-center-config.js → external-api/data-providers/internal-media-center-data-provider.svelte.js} +33 -17
  13. package/dist/{posts/handlers → external-api/data-providers}/internal-post-analytics-handler.d.ts +1 -1
  14. package/dist/{short-videos → external-api}/data-providers/internal-short-video-player-items-provider.js +1 -1
  15. package/dist/{streams/streams-player → external-api/data-providers}/internal-stream-analytics-handler.d.ts +1 -1
  16. package/dist/{streams/streams-player → external-api/data-providers}/internal-streams-player-data-provider.d.ts +1 -1
  17. package/dist/{streams/streams-player → external-api/data-providers}/internal-streams-player-data-provider.js +1 -1
  18. package/dist/{media-center/config → external-api/data-providers}/operations.generated.d.ts +6 -0
  19. package/dist/{media-center/config → external-api/data-providers}/operations.generated.js +13 -0
  20. package/dist/{media-center/config → external-api/data-providers}/operations.graphql +6 -0
  21. package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/mapper.d.ts +1 -1
  22. package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/mapper.js +2 -2
  23. package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/operations.generated.d.ts +1 -1
  24. package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/posts-loader.d.ts +2 -2
  25. package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/posts-loader.js +1 -1
  26. package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/mapper.d.ts +1 -1
  27. package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/mapper.js +1 -1
  28. package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/operations.generated.d.ts +1 -1
  29. package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/stream-pages-loader.d.ts +1 -1
  30. package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/stream-pages-loader.js +2 -2
  31. package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/streams-loader.d.ts +2 -2
  32. package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/streams-loader.js +1 -1
  33. package/dist/external-api/index.d.ts +3 -0
  34. package/dist/external-api/index.js +3 -0
  35. package/dist/external-api/media-page/index.d.ts +83 -0
  36. package/dist/external-api/media-page/index.js +82 -0
  37. package/dist/{short-videos → external-api}/short-videos-player/index.d.ts +27 -12
  38. package/dist/{short-videos → external-api}/short-videos-player/index.js +35 -28
  39. package/dist/external-api/streams-player/index.d.ts +105 -0
  40. package/dist/external-api/streams-player/index.js +110 -0
  41. package/dist/media-center/config/types.d.ts +28 -27
  42. package/dist/media-center/index.d.ts +3 -1
  43. package/dist/media-center/media-center/cmp.media-center-proxy.svelte +4 -4
  44. package/dist/media-center/media-center/cmp.media-center-proxy.svelte.d.ts +7 -4
  45. package/dist/media-center/media-center/discover/community-features-localization.d.ts +8 -0
  46. package/dist/media-center/media-center/discover/community-features-localization.js +31 -0
  47. package/dist/media-center/media-center/discover/community-features.svelte +171 -0
  48. package/dist/media-center/media-center/discover/community-features.svelte.d.ts +11 -0
  49. package/dist/media-center/media-center/discover/data-loading.d.ts +3 -3
  50. package/dist/media-center/media-center/discover/data-loading.js +5 -5
  51. package/dist/media-center/media-center/discover/discover-header.svelte +7 -56
  52. package/dist/media-center/media-center/discover/discover-view-handler.svelte.d.ts +3 -3
  53. package/dist/media-center/media-center/discover/discover-view-handler.svelte.js +4 -4
  54. package/dist/media-center/media-center/feed/feed-handler.svelte.d.ts +5 -3
  55. package/dist/media-center/media-center/feed/feed-handler.svelte.js +18 -10
  56. package/dist/media-center/media-center/feed/feed-providers-generator.d.ts +11 -5
  57. package/dist/media-center/media-center/feed/feed-providers-generator.js +13 -9
  58. package/dist/media-center/media-center/footer/index.d.ts +1 -0
  59. package/dist/media-center/media-center/footer/index.js +1 -0
  60. package/dist/media-center/media-center/handlers/categories-handler.svelte.d.ts +3 -5
  61. package/dist/media-center/media-center/handlers/categories-handler.svelte.js +16 -13
  62. package/dist/media-center/media-center/handlers/media-center-settings-handler.svelte.d.ts +18 -7
  63. package/dist/media-center/media-center/handlers/media-center-settings-handler.svelte.js +18 -25
  64. package/dist/media-center/media-center/{header-footer → header}/index.d.ts +0 -1
  65. package/dist/media-center/media-center/{header-footer → header}/index.js +0 -1
  66. package/dist/media-center/media-center/{header-footer → header}/media-center-header.svelte +138 -31
  67. package/dist/media-center/media-center/{header-footer → header}/media-center-header.svelte.d.ts +2 -0
  68. package/dist/media-center/media-center/index.d.ts +1 -0
  69. package/dist/media-center/media-center/index.js +1 -0
  70. package/dist/media-center/media-center/media-center-context.svelte.d.ts +15 -9
  71. package/dist/media-center/media-center/media-center-context.svelte.js +57 -19
  72. package/dist/media-center/media-center/media-center-settings.svelte.d.ts +11 -0
  73. package/dist/media-center/media-center/media-center-settings.svelte.js +23 -0
  74. package/dist/media-center/media-center/media-center-view.svelte +11 -3
  75. package/dist/media-center/media-center/media-center-view.svelte.d.ts +2 -0
  76. package/dist/media-center/media-center/menu/category-following-wrapper.svelte.d.ts +1 -1
  77. package/dist/media-center/media-center/menu/menu.svelte +15 -14
  78. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.d.ts +3 -3
  79. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.js +4 -4
  80. package/dist/media-center/media-center/moments/cmp.moments-circle.svelte +22 -9
  81. package/dist/media-center/media-center/moments/index.d.ts +1 -0
  82. package/dist/media-center/media-center/moments/index.js +1 -0
  83. package/dist/media-center/media-center/moments/moments-feed-handler.svelte.d.ts +26 -0
  84. package/dist/media-center/media-center/moments/moments-feed-handler.svelte.js +49 -0
  85. package/dist/media-center/media-center/moments/moments-state.svelte.d.ts +20 -0
  86. package/dist/media-center/media-center/moments/moments-state.svelte.js +82 -0
  87. package/dist/media-center/media-center/streams-in-category/streams-in-category-panel-handler.svelte.d.ts +3 -3
  88. package/dist/media-center/media-center/streams-in-category/streams-in-category-panel-handler.svelte.js +4 -4
  89. package/dist/media-center/media-center/types.d.ts +3 -3
  90. package/dist/media-center/membership/index.d.ts +1 -0
  91. package/dist/media-center/membership/index.js +1 -0
  92. package/dist/media-center/membership/mock-membership-handler.svelte.d.ts +10 -0
  93. package/dist/media-center/membership/mock-membership-handler.svelte.js +21 -0
  94. package/dist/media-center/membership/types.d.ts +10 -0
  95. package/dist/media-center/membership/types.js +1 -0
  96. package/dist/media-center/navigation/index.d.ts +2 -0
  97. package/dist/media-center/navigation/index.js +1 -0
  98. package/dist/media-center/navigation/media-center-state.d.ts +19 -0
  99. package/dist/media-center/navigation/media-center-state.js +1 -0
  100. package/dist/media-center/navigation/mock-navigation-handler.svelte.d.ts +6 -0
  101. package/dist/media-center/navigation/mock-navigation-handler.svelte.js +6 -0
  102. package/dist/media-center/navigation/types.d.ts +5 -0
  103. package/dist/media-center/navigation/types.js +1 -0
  104. package/dist/media-page/cmp.media-page.svelte +10 -4
  105. package/dist/media-page/cmp.media-page.svelte.d.ts +6 -5
  106. package/dist/media-page/index.d.ts +40 -58
  107. package/dist/media-page/index.js +129 -16
  108. package/dist/posts/posts-player/index.d.ts +31 -33
  109. package/dist/posts/posts-player/index.js +90 -35
  110. package/dist/posts/posts-player/posts-player-view.svelte +1 -1
  111. package/dist/posts/posts-player/types.d.ts +2 -1
  112. package/dist/streams/layout/styles-transformer.d.ts +1 -1
  113. package/dist/streams/streams-player/index.d.ts +17 -83
  114. package/dist/streams/streams-player/index.js +84 -64
  115. package/dist/streams/streams-player/streams-player-buffer.svelte.js +2 -1
  116. package/dist/streams/streams-player/streams-player-view.svelte +1 -1
  117. package/dist/streams/streams-player/types.d.ts +3 -1
  118. package/dist/ui/button/cmp.options-button.svelte +123 -0
  119. package/dist/ui/button/cmp.options-button.svelte.d.ts +20 -0
  120. package/dist/ui/button/index.d.ts +1 -0
  121. package/dist/ui/button/index.js +1 -0
  122. package/dist/ui/button/resources/button-theme.svelte +16 -2
  123. package/dist/ui/player/colors/index.d.ts +1 -1
  124. package/dist/ui/player/colors/index.js +1 -1
  125. package/dist/ui/player/colors/player-colors.d.ts +14 -1
  126. package/dist/ui/player/colors/player-colors.js +24 -1
  127. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.d.ts +1 -0
  128. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.js +7 -1
  129. package/dist/ui/player/providers/default-feed-player-buffer.svelte.d.ts +1 -0
  130. package/dist/ui/player/providers/default-feed-player-buffer.svelte.js +7 -1
  131. package/dist/ui/player/providers/types.d.ts +3 -1
  132. package/dist/ui/shadow-dom/cmp.shadow-root.svelte +6 -4
  133. package/dist/ui/shadow-dom/colors.scss +6 -4
  134. package/package.json +5 -1
  135. package/dist/content-player/content-player-settings.d.ts +0 -12
  136. package/dist/content-player/content-player-settings.js +0 -23
  137. package/dist/media-center/config/internal-media-center-config.d.ts +0 -14
  138. package/dist/media-center/media-center/discover/discover-header-localization.d.ts +0 -6
  139. package/dist/media-center/media-center/discover/discover-header-localization.js +0 -15
  140. package/dist/posts/handlers/index.d.ts +0 -1
  141. package/dist/posts/handlers/index.js +0 -1
  142. package/dist/short-videos/data-providers/index.d.ts +0 -1
  143. package/dist/short-videos/data-providers/index.js +0 -1
  144. /package/dist/{media-center/config → external-api/data-providers}/internal-media-center-analytics-handler.d.ts +0 -0
  145. /package/dist/{media-center/config → external-api/data-providers}/internal-media-center-analytics-handler.js +0 -0
  146. /package/dist/{posts/handlers → external-api/data-providers}/internal-post-analytics-handler.js +0 -0
  147. /package/dist/{short-videos → external-api}/data-providers/internal-short-video-player-items-provider.d.ts +0 -0
  148. /package/dist/{streams/streams-player → external-api/data-providers}/internal-stream-analytics-handler.js +0 -0
  149. /package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/index.d.ts +0 -0
  150. /package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/index.js +0 -0
  151. /package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/operations.generated.js +0 -0
  152. /package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/operations.graphql +0 -0
  153. /package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/index.d.ts +0 -0
  154. /package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/index.js +0 -0
  155. /package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/operations.generated.js +0 -0
  156. /package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/operations.graphql +0 -0
  157. /package/dist/media-center/media-center/{header-footer → footer}/media-center-footer.svelte +0 -0
  158. /package/dist/media-center/media-center/{header-footer → footer}/media-center-footer.svelte.d.ts +0 -0
  159. /package/dist/media-center/media-center/{header-footer → header}/media-center-header-localization.d.ts +0 -0
  160. /package/dist/media-center/media-center/{header-footer → header}/media-center-header-localization.js +0 -0
  161. /package/dist/media-center/media-center/{header-footer → header}/media-center-header-mobile.svelte +0 -0
  162. /package/dist/media-center/media-center/{header-footer → header}/media-center-header-mobile.svelte.d.ts +0 -0
@@ -0,0 +1,171 @@
1
+ <script lang="ts">var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { compactNumber } from '../../../core/utils/compact-number';
11
+ import { OptionsButton, ButtonSize, ButtonStyle, Button } from '../../../ui/button';
12
+ import { CommunityFeaturesLocalization } from './community-features-localization';
13
+ let { target, membershipHandler, locale } = $props();
14
+ const localization = $derived(new CommunityFeaturesLocalization(locale));
15
+ let uiState = $state('idle');
16
+ let isJoinedStore = $state.raw({ isJoined: false });
17
+ $effect(() => {
18
+ if (!membershipHandler) {
19
+ isJoinedStore = { isJoined: false };
20
+ }
21
+ else {
22
+ updateIsJoinedStore(membershipHandler);
23
+ }
24
+ });
25
+ const updateIsJoinedStore = (membershipHandler) => __awaiter(void 0, void 0, void 0, function* () {
26
+ uiState = 'loading';
27
+ try {
28
+ isJoinedStore = yield membershipHandler.getIsJoined();
29
+ }
30
+ finally {
31
+ uiState = 'idle';
32
+ }
33
+ });
34
+ const onLeaveMembershipClick = () => __awaiter(void 0, void 0, void 0, function* () {
35
+ if (!membershipHandler) {
36
+ return;
37
+ }
38
+ uiState = 'submitting';
39
+ try {
40
+ yield membershipHandler.leave();
41
+ yield updateIsJoinedStore(membershipHandler);
42
+ }
43
+ finally {
44
+ uiState = 'idle';
45
+ }
46
+ });
47
+ const onJoinMembershipClick = () => __awaiter(void 0, void 0, void 0, function* () {
48
+ if (!membershipHandler) {
49
+ return;
50
+ }
51
+ uiState = 'submitting';
52
+ try {
53
+ yield membershipHandler.join();
54
+ yield updateIsJoinedStore(membershipHandler);
55
+ }
56
+ finally {
57
+ uiState = 'idle';
58
+ }
59
+ });
60
+ </script>
61
+
62
+ {#if target.communityFeatures && (target.communityFeatures.membersCount > 0 || membershipHandler)}
63
+ <div class="community-features">
64
+ <button
65
+ type="button"
66
+ class="members"
67
+ disabled={!membershipHandler || target.communityFeatures.membersCount === 0}
68
+ onclick={() => membershipHandler?.viewMembersList()}>
69
+ <span class="members__count">
70
+ {compactNumber(target.communityFeatures.membersCount, { locale })}
71
+ </span>
72
+ <span class="members__label">
73
+ {localization.membersLabel(target.communityFeatures.membersCount)}
74
+ </span>
75
+ </button>
76
+ {#if membershipHandler && uiState !== 'loading'}
77
+ <div class="actions">
78
+ {#if isJoinedStore.isJoined}
79
+ <OptionsButton size={ButtonSize.Small} style={ButtonStyle.Standard} optionsPosition="bottom-end" disabled={uiState === 'submitting'}>
80
+ {localization.memberButtonLabel}
81
+ {#snippet rightOptions()}
82
+ <div class="leave-actions">
83
+ <button type="button" class="leave-actions__button" onclick={onLeaveMembershipClick}>
84
+ {localization.leaveButtonLabel}
85
+ </button>
86
+ </div>
87
+ {/snippet}
88
+ </OptionsButton>
89
+ {:else}
90
+ <Button size={ButtonSize.Small} style={ButtonStyle.Standard} on={{ click: onJoinMembershipClick }} disabled={uiState === 'submitting'}>
91
+ {localization.joinButtonLabel}
92
+ </Button>
93
+ {/if}
94
+ </div>
95
+ {/if}
96
+ </div>
97
+ {/if}
98
+
99
+ <style>@keyframes fadeIn {
100
+ 0% {
101
+ opacity: 1;
102
+ }
103
+ 50% {
104
+ opacity: 0.4;
105
+ }
106
+ 100% {
107
+ opacity: 1;
108
+ }
109
+ }
110
+ .community-features {
111
+ display: flex;
112
+ flex-wrap: nowrap;
113
+ margin-top: 0.625rem;
114
+ gap: 8.125rem;
115
+ align-items: center;
116
+ /* Set 'container-type: inline-size;' to reference container*/
117
+ }
118
+ @container (width < 576px) {
119
+ .community-features {
120
+ margin-top: 0.125rem;
121
+ }
122
+ }
123
+
124
+ .members {
125
+ display: flex;
126
+ align-items: center;
127
+ gap: 0.625rem;
128
+ /* Set 'container-type: inline-size;' to reference container*/
129
+ }
130
+ @container (width < 576px) {
131
+ .members {
132
+ align-items: flex-end;
133
+ gap: 0.25rem;
134
+ }
135
+ }
136
+ .members__count {
137
+ font-size: 0.9375rem;
138
+ line-height: 1;
139
+ font-weight: 500;
140
+ /* Set 'container-type: inline-size;' to reference container*/
141
+ }
142
+ @container (width < 576px) {
143
+ .members__count {
144
+ font-weight: 600;
145
+ }
146
+ }
147
+ .members__label {
148
+ font-size: 0.75rem;
149
+ line-height: 1;
150
+ font-weight: 400;
151
+ color: var(--sc-mc-color--text-secondary);
152
+ /* Set 'container-type: inline-size;' to reference container*/
153
+ }
154
+ @container (width < 576px) {
155
+ .members__label {
156
+ font-weight: 600;
157
+ }
158
+ }
159
+
160
+ .actions {
161
+ --button--min-width: 7.5rem;
162
+ }
163
+
164
+ .leave-actions {
165
+ background: var(--sc-mc-color--bg-button);
166
+ border-radius: 0.25rem;
167
+ }
168
+ .leave-actions__button {
169
+ padding: 0.3125rem 0.9375rem;
170
+ font-size: 0.75rem;
171
+ }</style>
@@ -0,0 +1,11 @@
1
+ import type { Locale } from '../../../core/locale';
2
+ import type { MediaCenterModel } from '../../config/types';
3
+ import type { IMediaCenterMembershipHandler } from '../../membership';
4
+ type Props = {
5
+ target: MediaCenterModel;
6
+ membershipHandler: IMediaCenterMembershipHandler | null;
7
+ locale: Locale;
8
+ };
9
+ declare const CommunityFeatures: import("svelte").Component<Props, {}, "">;
10
+ type CommunityFeatures = ReturnType<typeof CommunityFeatures>;
11
+ export default CommunityFeatures;
@@ -1,8 +1,8 @@
1
- import type { IMediaCenterConfig } from '../../config/types';
1
+ import type { IMediaCenterDataProvider } from '../../config/types';
2
2
  import { StreamsInCategory, ShortVideosInCategory } from './types.svelte';
3
3
  export declare class DiscoverDataLoader {
4
- private readonly config;
5
- constructor(config: IMediaCenterConfig);
4
+ private readonly dataProvider;
5
+ constructor(dataProvider: IMediaCenterDataProvider);
6
6
  loadStreams: (holder: StreamsInCategory) => Promise<void>;
7
7
  loadShortVideos: (holder: ShortVideosInCategory) => Promise<void>;
8
8
  }
@@ -1,15 +1,15 @@
1
1
  import { PostType } from '../../..';
2
2
  import { StreamsInCategory, ShortVideosInCategory } from './types.svelte';
3
3
  export class DiscoverDataLoader {
4
- config;
5
- constructor(config) {
6
- this.config = config;
4
+ dataProvider;
5
+ constructor(dataProvider) {
6
+ this.dataProvider = dataProvider;
7
7
  }
8
8
  loadStreams = async (holder) => {
9
9
  if (holder.continuationToken === null) {
10
10
  return;
11
11
  }
12
- const streamsResponse = await this.config.streamPlayer.getStreamsCursor({
12
+ const streamsResponse = await this.dataProvider.streamPlayer.getStreamsCursor({
13
13
  filter: { categoryId: holder.categoryId ?? undefined },
14
14
  limit: 6,
15
15
  continuationToken: holder.continuationToken
@@ -21,7 +21,7 @@ export class DiscoverDataLoader {
21
21
  if (holder.continuationToken === null) {
22
22
  return;
23
23
  }
24
- const shortVideosResponse = await this.config.postsPlayer.getPostsCursor({
24
+ const shortVideosResponse = await this.dataProvider.postsPlayer.getPostsCursor({
25
25
  filter: {
26
26
  categoryId: holder.categoryId,
27
27
  types: [PostType.ShortVideo]
@@ -1,15 +1,13 @@
1
- <script lang="ts">import { compactNumber } from '../../../core/utils/compact-number';
2
- import { ImageRounded } from '../../../ui/image';
1
+ <script lang="ts">import { ImageRounded } from '../../../ui/image';
3
2
  import { LineClamp } from '../../../ui/line-clamp';
4
3
  import { ProportionalContainer } from '../../../ui/proportional-container';
5
- import { DiscoverHeaderLocalization } from './discover-header-localization';
4
+ import { default as CommunityFeatures } from './community-features.svelte';
6
5
  import { MomentsCircle } from '../moments';
7
6
  let { context } = $props();
8
- const localization = $derived(new DiscoverHeaderLocalization(context.locale));
9
7
  </script>
10
8
 
11
- {#if context.targetData}
12
- {@const target = context.targetData}
9
+ {#if context.model}
10
+ {@const target = context.model}
13
11
  <div class="header">
14
12
  <div class="header__avatar">
15
13
  <MomentsCircle context={context} />
@@ -17,14 +15,7 @@ const localization = $derived(new DiscoverHeaderLocalization(context.locale));
17
15
  <div class="header__info">
18
16
  <p class="header__name">{target.name}</p>
19
17
  <p class="header__handle">@{target.handle}</p>
20
- <div class="header__members">
21
- <span class="header__members-count">
22
- {compactNumber(target.membersCount, { locale: context.locale })}
23
- </span>
24
- <span class="header__members-label">
25
- {localization.membersLabel(target.membersCount)}
26
- </span>
27
- </div>
18
+ <CommunityFeatures target={target} membershipHandler={context.membershipHandler} locale={context.locale} />
28
19
 
29
20
  {#if target.description}
30
21
  <p class="header__description">
@@ -48,14 +39,7 @@ const localization = $derived(new DiscoverHeaderLocalization(context.locale));
48
39
  </div>
49
40
  <div class="header-mobile__texts">
50
41
  <p class="header-mobile__name">{target.name}</p>
51
- <div class="header-mobile__members">
52
- <span class="header-mobile__members-count">
53
- {compactNumber(target.membersCount, { locale: localization.locale })}
54
- </span>
55
- <span class="header-mobile__members-label">
56
- {localization.membersLabel(target.membersCount)}
57
- </span>
58
- </div>
42
+ <CommunityFeatures target={target} membershipHandler={context.membershipHandler} locale={context.locale} />
59
43
  </div>
60
44
  </div>
61
45
  {#if target.description}
@@ -111,28 +95,11 @@ const localization = $derived(new DiscoverHeaderLocalization(context.locale));
111
95
  font-weight: 400;
112
96
  color: var(--sc-mc-color--text-brand);
113
97
  }
114
- .header__members {
115
- margin-top: 0.625rem;
116
- display: flex;
117
- align-items: center;
118
- gap: 0.625rem;
119
- }
120
- .header__members-count {
121
- font-size: 0.9375rem;
122
- line-height: 1;
123
- font-weight: 500;
124
- }
125
- .header__members-label {
126
- font-size: 0.75rem;
127
- line-height: 1;
128
- font-weight: 400;
129
- color: var(--sc-mc-color--text-secondary);
130
- }
131
98
  .header__description {
132
99
  margin-top: 0.875rem;
133
100
  font-size: 0.9375rem;
134
101
  max-width: 37.5rem;
135
- --line-clamp--line-clamp: 6;
102
+ --line-clamp--line-clamp: 5;
136
103
  }
137
104
  .header__side-banner-container {
138
105
  width: 29.375rem;
@@ -188,22 +155,6 @@ const localization = $derived(new DiscoverHeaderLocalization(context.locale));
188
155
  letter-spacing: -0.0103125rem;
189
156
  }
190
157
  }
191
- .header-mobile__members {
192
- display: flex;
193
- align-items: flex-end;
194
- gap: 0.25rem;
195
- }
196
- .header-mobile__members-count {
197
- font-size: 0.9375rem;
198
- line-height: 1;
199
- font-weight: 600;
200
- }
201
- .header-mobile__members-label {
202
- font-size: 0.75rem;
203
- line-height: 1;
204
- font-weight: 600;
205
- color: var(--sc-mc-color--text-secondary);
206
- }
207
158
  .header-mobile__description {
208
159
  font-size: 1rem;
209
160
  font-weight: 500;
@@ -1,7 +1,7 @@
1
- import type { IMediaCenterConfig } from '../../config/types';
1
+ import type { IMediaCenterDataProvider } from '../../config/types';
2
2
  import { ShortVideosInCategory, StreamsInCategory } from './types.svelte';
3
3
  export declare class DiscoverViewHandler {
4
- private readonly config;
4
+ private readonly dataProvider;
5
5
  private _activated;
6
6
  private _state;
7
7
  private _streamsInCategoryCache;
@@ -10,7 +10,7 @@ export declare class DiscoverViewHandler {
10
10
  private _shortVideosInCategory;
11
11
  private _dataLoader;
12
12
  private _shortVideosLoadingDeferred;
13
- constructor(config: IMediaCenterConfig);
13
+ constructor(dataProvider: IMediaCenterDataProvider);
14
14
  get activated(): boolean;
15
15
  get active(): boolean;
16
16
  get loading(): boolean;
@@ -2,7 +2,7 @@ import { Deferred } from '../../../core/deferred';
2
2
  import { DiscoverDataLoader } from './data-loading';
3
3
  import { ShortVideosInCategory, StreamsInCategory } from './types.svelte';
4
4
  export class DiscoverViewHandler {
5
- config;
5
+ dataProvider;
6
6
  _activated = $state(false);
7
7
  _state = $state('loading');
8
8
  _streamsInCategoryCache = $state.raw([]);
@@ -11,9 +11,9 @@ export class DiscoverViewHandler {
11
11
  _shortVideosInCategory = $state.raw([]);
12
12
  _dataLoader;
13
13
  _shortVideosLoadingDeferred = null;
14
- constructor(config) {
15
- this.config = config;
16
- this._dataLoader = new DiscoverDataLoader(this.config);
14
+ constructor(dataProvider) {
15
+ this.dataProvider = dataProvider;
16
+ this._dataLoader = new DiscoverDataLoader(this.dataProvider);
17
17
  }
18
18
  get activated() {
19
19
  return this._activated;
@@ -1,4 +1,4 @@
1
- import type { IMediaCenterConfig } from '../..';
1
+ import type { IMediaCenterDataProvider } from '../..';
2
2
  import type { PostPlayerModel } from '../../../posts/posts-player';
3
3
  import type { IStreamsPlayerDataProvider } from '../../../streams/streams-player';
4
4
  import type { ICloseOrchestrator } from '../../../ui/player/close-orchestrator';
@@ -10,13 +10,15 @@ export declare class FeedHandler {
10
10
  private _active;
11
11
  private _providersGenerator;
12
12
  private _feedPlayerProps;
13
- private _externalHandlers;
13
+ private _dataProvider;
14
14
  private _mediaCenterSettingsHandler;
15
15
  private _closeOrchestrator;
16
+ private _onPlayerReachedEnd;
16
17
  constructor(data: {
17
- config: IMediaCenterConfig;
18
+ dataProvider: IMediaCenterDataProvider;
18
19
  mediaCenterSettingsHandler: MediaCenterSettingsHandler;
19
20
  closeOrchestrator: ICloseOrchestrator;
21
+ onPlayerReachedEnd: () => void;
20
22
  });
21
23
  get active(): boolean;
22
24
  get feedPlayerProps(): PlayerProps | null;
@@ -6,15 +6,17 @@ export class FeedHandler {
6
6
  _active = $state(false);
7
7
  _providersGenerator;
8
8
  _feedPlayerProps = $state.raw(null);
9
- _externalHandlers;
9
+ _dataProvider;
10
10
  _mediaCenterSettingsHandler;
11
11
  _closeOrchestrator;
12
+ _onPlayerReachedEnd;
12
13
  constructor(data) {
13
- const { config, mediaCenterSettingsHandler, closeOrchestrator } = data;
14
- this._providersGenerator = new FeedProvidersGenerator(config);
14
+ const { dataProvider, mediaCenterSettingsHandler, closeOrchestrator, onPlayerReachedEnd } = data;
15
+ this._providersGenerator = new FeedProvidersGenerator(dataProvider);
15
16
  this._mediaCenterSettingsHandler = mediaCenterSettingsHandler;
16
- this._externalHandlers = config.handlers;
17
+ this._dataProvider = dataProvider;
17
18
  this._closeOrchestrator = closeOrchestrator;
19
+ this._onPlayerReachedEnd = onPlayerReachedEnd;
18
20
  }
19
21
  get active() {
20
22
  return this._active;
@@ -28,10 +30,13 @@ export class FeedHandler {
28
30
  activatePostsFeed = async (options) => {
29
31
  const { dataProvider, filter, onPostActivated } = options;
30
32
  if (dataProvider) {
33
+ if (!dataProvider.onEndReached) {
34
+ dataProvider.onEndReached = this._onPlayerReachedEnd;
35
+ }
31
36
  this._feedPlayerProps = this.makePostsPlayerProps({ dataProvider, onPostActivated });
32
37
  }
33
38
  else {
34
- const dataProvider = this._providersGenerator.makePostPlayerItemsProvider(filter);
39
+ const dataProvider = this._providersGenerator.makePostPlayerItemsProvider({ filter, onEndReached: this._onPlayerReachedEnd });
35
40
  this._feedPlayerProps = this.makePostsPlayerProps({ dataProvider, onPostActivated });
36
41
  }
37
42
  this._active = true;
@@ -39,10 +44,13 @@ export class FeedHandler {
39
44
  activateStreamsFeed = async (options) => {
40
45
  const { dataProvider, filter, onStreamActivated } = options;
41
46
  if (dataProvider) {
47
+ if (!dataProvider.onEndReached) {
48
+ dataProvider.onEndReached = this._onPlayerReachedEnd;
49
+ }
42
50
  this._feedPlayerProps = this.makeStreamsPlayerProps({ dataProvider, onStreamActivated });
43
51
  }
44
52
  else {
45
- const dataProvider = this._providersGenerator.makeStreamsPlayerDataProvider(filter);
53
+ const dataProvider = this._providersGenerator.makeStreamsPlayerDataProvider({ filter, onEndReached: this._onPlayerReachedEnd });
46
54
  this._feedPlayerProps = this.makeStreamsPlayerProps({ dataProvider, onStreamActivated });
47
55
  }
48
56
  this._active = true;
@@ -53,8 +61,8 @@ export class FeedHandler {
53
61
  type: 'posts',
54
62
  props: {
55
63
  dataProvider: { type: 'buffer', buffer: initBufferFromProvider(dataProvider) },
56
- socialInteractionsHandler: this._externalHandlers?.socialInteractionsHandler,
57
- analyticsHandler: this._externalHandlers?.analyticsHandler,
64
+ socialInteractionsHandler: this._dataProvider.handlers?.socialInteractionsHandler,
65
+ analyticsHandler: this._dataProvider.handlers?.analyticsHandler,
58
66
  playerSettings: this._mediaCenterSettingsHandler.playerSettings,
59
67
  closeOrchestrator: this._closeOrchestrator,
60
68
  on: {
@@ -70,8 +78,8 @@ export class FeedHandler {
70
78
  type: 'streams',
71
79
  props: {
72
80
  dataProvider: { type: 'buffer', buffer: new StreamsPlayerBuffer(dataProvider) },
73
- analyticsHandler: this._externalHandlers?.analyticsHandler,
74
- postSocialInteractionsHandler: this._externalHandlers?.socialInteractionsHandler,
81
+ analyticsHandler: this._dataProvider.handlers?.analyticsHandler,
82
+ postSocialInteractionsHandler: this._dataProvider.handlers?.socialInteractionsHandler,
75
83
  playerSettings: this._mediaCenterSettingsHandler.playerSettings,
76
84
  closeOrchestrator: this._closeOrchestrator,
77
85
  on: {
@@ -1,11 +1,17 @@
1
- import type { IMediaCenterConfig } from '../../config/types';
1
+ import type { IMediaCenterDataProvider } from '../../config/types';
2
2
  import type { PostPlayerModel } from '../../../posts/posts-player/types';
3
3
  import type { IStreamsPlayerDataProvider } from '../../../streams/streams-player/types';
4
4
  import type { IFeedPlayerDataProvider } from '../../../ui/player/providers';
5
5
  import type { PostsDataProviderFilter, StreamsDataProviderFilter } from './types';
6
6
  export declare class FeedProvidersGenerator {
7
- private config;
8
- constructor(config: IMediaCenterConfig);
9
- makePostPlayerItemsProvider: (filter?: PostsDataProviderFilter) => IFeedPlayerDataProvider<PostPlayerModel>;
10
- makeStreamsPlayerDataProvider: (filter?: StreamsDataProviderFilter) => IStreamsPlayerDataProvider;
7
+ private dataProvider;
8
+ constructor(dataProvider: IMediaCenterDataProvider);
9
+ makePostPlayerItemsProvider: (data: {
10
+ filter?: PostsDataProviderFilter;
11
+ onEndReached: () => void;
12
+ }) => IFeedPlayerDataProvider<PostPlayerModel>;
13
+ makeStreamsPlayerDataProvider: (data: {
14
+ filter?: StreamsDataProviderFilter;
15
+ onEndReached: () => void;
16
+ }) => IStreamsPlayerDataProvider;
11
17
  }
@@ -2,15 +2,16 @@ import { ContinuationToken } from '../../../core/continuation-token';
2
2
  import { CursorDataLoader } from '../../../core/data-loaders';
3
3
  import { PostType } from '../../../core/enums';
4
4
  export class FeedProvidersGenerator {
5
- config;
6
- constructor(config) {
7
- this.config = config;
5
+ dataProvider;
6
+ constructor(dataProvider) {
7
+ this.dataProvider = dataProvider;
8
8
  }
9
- makePostPlayerItemsProvider = (filter) => {
9
+ makePostPlayerItemsProvider = (data) => {
10
+ const { filter, onEndReached } = data;
10
11
  const { categoryId, prefetchedItems: initialPrefetchedItems = [], initialPostId } = filter || {};
11
12
  const loader = new CursorDataLoader({
12
13
  loadPage: async (continuationToken) => {
13
- const result = await this.config.postsPlayer.getPostsCursor({
14
+ const result = await this.dataProvider.postsPlayer.getPostsCursor({
14
15
  filter: {
15
16
  types: [PostType.Article, PostType.Media, PostType.ShortVideo, PostType.Video],
16
17
  categoryId,
@@ -39,14 +40,16 @@ export class FeedProvidersGenerator {
39
40
  prefetchedItems,
40
41
  startIndex: prefetchedItems.length ? 0 : -1
41
42
  },
42
- loadMore: loader.loadMore
43
+ loadMore: loader.loadMore,
44
+ onEndReached
43
45
  };
44
46
  };
45
- makeStreamsPlayerDataProvider = (filter) => {
47
+ makeStreamsPlayerDataProvider = (data) => {
48
+ const { filter, onEndReached } = data;
46
49
  const { categoryId, prefetchedStreams: initialPrefetchedStreams = [], initialStreamId } = filter || {};
47
50
  const loader = new CursorDataLoader({
48
51
  loadPage: async (continuationToken) => {
49
- const result = await this.config.streamPlayer.getStreamsCursor({
52
+ const result = await this.dataProvider.streamPlayer.getStreamsCursor({
50
53
  filter: {
51
54
  categoryId,
52
55
  excludeIds: initialPrefetchedStreams.length ? initialPrefetchedStreams.map((i) => i.id) : undefined
@@ -73,7 +76,8 @@ export class FeedProvidersGenerator {
73
76
  prefetchedStreams
74
77
  },
75
78
  loadMoreStreams: loader.loadMore,
76
- getStreamPages: this.config.streamPlayer.getStreamPages
79
+ getStreamPages: this.dataProvider.streamPlayer.getStreamPages,
80
+ onEndReached
77
81
  };
78
82
  };
79
83
  }
@@ -0,0 +1 @@
1
+ export { default as MediaCenterFooter } from './media-center-footer.svelte';
@@ -0,0 +1 @@
1
+ export { default as MediaCenterFooter } from './media-center-footer.svelte';
@@ -1,9 +1,11 @@
1
- import type { MediaCenterConfigModel } from '../../config/types';
1
+ import type { IMediaCenterDataProvider } from '../../config/types';
2
2
  import type { MediaCenterCategoryData } from '../types';
3
3
  export declare class CategoriesHandler {
4
+ private readonly dataProvider;
4
5
  private _allCateogories;
5
6
  private _tagAssociations;
6
7
  private _selectedCategoryId;
8
+ constructor(dataProvider: IMediaCenterDataProvider);
7
9
  get allCategories(): {
8
10
  id: string;
9
11
  name: string;
@@ -14,10 +16,6 @@ export declare class CategoriesHandler {
14
16
  get selectedCategoryId(): string | null;
15
17
  set selectedCategoryId(value: string | null);
16
18
  getCategoryData: (categoryId: string) => MediaCenterCategoryData | null;
17
- init: (data: {
18
- categories: MediaCenterConfigModel["contentCategories"];
19
- tagAssociations: MediaCenterConfigModel["categoryTagAssociations"];
20
- }) => Promise<void>;
21
19
  }
22
20
  export type MediaCenterCategoryModel = {
23
21
  id: string;
@@ -1,7 +1,21 @@
1
1
  export class CategoriesHandler {
2
- _allCateogories = $state.raw([]);
3
- _tagAssociations = $state.raw(new Map());
2
+ dataProvider;
3
+ _allCateogories = $derived.by(() => this.dataProvider.model?.contentCategories ?? []);
4
+ _tagAssociations = $derived.by(() => {
5
+ const newTagAssociations = new Map();
6
+ if (this.dataProvider.model?.categoryTagAssociations) {
7
+ for (const assoc of this.dataProvider.model.categoryTagAssociations) {
8
+ if (assoc.tag) {
9
+ newTagAssociations.set(assoc.id, assoc.tag);
10
+ }
11
+ }
12
+ }
13
+ return newTagAssociations;
14
+ });
4
15
  _selectedCategoryId = $state.raw(null);
16
+ constructor(dataProvider) {
17
+ this.dataProvider = dataProvider;
18
+ }
5
19
  get allCategories() {
6
20
  return this._allCateogories;
7
21
  }
@@ -40,15 +54,4 @@ export class CategoriesHandler {
40
54
  };
41
55
  return selectedCategoryData;
42
56
  };
43
- init = async (data) => {
44
- const { categories, tagAssociations } = data;
45
- this._allCateogories = categories;
46
- const newTagAssociations = new Map();
47
- for (const assoc of tagAssociations) {
48
- if (assoc.tag) {
49
- newTagAssociations.set(assoc.id, assoc.tag);
50
- }
51
- }
52
- this._tagAssociations = newTagAssociations;
53
- };
54
57
  }
@@ -1,12 +1,24 @@
1
- import type { PlayerColors } from '../../../ui/player/colors';
2
- import type { MediaCenterSettings } from '../types';
1
+ import type { Locale } from '../../../core/locale';
2
+ import { type ThemeValue } from '../../../core/theme';
3
+ import type { IMediaCenterDataProvider } from '../../config/types';
4
+ import { PlayerColors } from '../../../ui/player/colors';
5
+ import type { MediaCenterSettings } from '../media-center-settings.svelte';
3
6
  export declare class MediaCenterSettingsHandler {
4
7
  private _backgroundImageUrl;
8
+ private _mediaCenterSettings;
9
+ private _dataProvider;
5
10
  private _contentPlayerSettings;
6
- private _colorsMap;
7
- constructor(settings?: MediaCenterSettings);
8
- get playerSettings(): MediaCenterSettingsWithColors;
9
- get locale(): import("../../../core/locale").Locale;
11
+ constructor(init: {
12
+ readonly dataProvider: IMediaCenterDataProvider;
13
+ settings: MediaCenterSettings;
14
+ });
15
+ get playerSettings(): {
16
+ locale?: Locale;
17
+ showStreamsCloudWatermark?: boolean;
18
+ playerColors?: Record<ThemeValue, PlayerColors>;
19
+ };
20
+ get actualMediaCenterColors(): PlayerColors;
21
+ get locale(): Locale;
10
22
  get backgroundWrapperProps(): {
11
23
  backgroundDisabled: boolean;
12
24
  backgroundImageUrl: string | null;
@@ -14,7 +26,6 @@ export declare class MediaCenterSettingsHandler {
14
26
  };
15
27
  get backgroundImageLoadedHandler(): ((url: string | null) => void) | undefined;
16
28
  updateBackgroundImageUrl: (url: string | null | "not-applicable") => void;
17
- updatePlayerColors: (colors: PlayerColors) => void;
18
29
  }
19
30
  export type MediaCenterSettingsWithColors = MediaCenterSettings & {
20
31
  playerColors?: PlayerColors;