@streamscloud/embeddable 14.0.0-rc.0 → 14.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/dist/core/analytics.profile-id.d.ts +5 -0
  2. package/dist/core/{analytics.installation-id.js → analytics.profile-id.js} +10 -20
  3. package/dist/external-api/data-providers/internal-media-center-analytics-handler.d.ts +14 -14
  4. package/dist/external-api/data-providers/internal-media-center-analytics-handler.js +19 -170
  5. package/dist/external-api/data-providers/internal-media-center-data-provider.svelte.js +6 -6
  6. package/dist/external-api/data-providers/internal-post-analytics-handler.d.ts +7 -7
  7. package/dist/external-api/data-providers/internal-post-analytics-handler.js +11 -72
  8. package/dist/external-api/data-providers/internal-stream-analytics-handler.d.ts +13 -12
  9. package/dist/external-api/data-providers/internal-stream-analytics-handler.js +18 -162
  10. package/dist/external-api/data-providers/mocks/index.d.ts +5 -0
  11. package/dist/external-api/data-providers/mocks/index.js +5 -0
  12. package/dist/{media-center/categories-following → external-api/data-providers/mocks}/mock-categories-following-handler.svelte.d.ts +1 -1
  13. package/dist/external-api/data-providers/mocks/mock-content-management-handler.svelte.d.ts +29 -0
  14. package/dist/external-api/data-providers/mocks/mock-content-management-handler.svelte.js +61 -0
  15. package/dist/{media-center/membership → external-api/data-providers/mocks}/mock-membership-handler.svelte.d.ts +1 -1
  16. package/dist/{media-center/navigation → external-api/data-providers/mocks}/mock-navigation-handler.svelte.d.ts +1 -2
  17. package/dist/{posts/social-interactions → external-api/data-providers/mocks}/mock-post-social-interactions-handler.svelte.d.ts +1 -2
  18. package/dist/{posts/social-interactions → external-api/data-providers/mocks}/mock-post-social-interactions-handler.svelte.js +17 -6
  19. package/dist/external-api/data-providers/mocks/operations.generated.d.ts +115 -0
  20. package/dist/external-api/data-providers/mocks/operations.generated.js +377 -0
  21. package/dist/external-api/data-providers/mocks/operations.graphql +18 -0
  22. package/dist/external-api/data-providers/post-data-loaders/mapper.js +3 -1
  23. package/dist/media-center/config/types.d.ts +7 -1
  24. package/dist/media-center/content-management/index.d.ts +1 -0
  25. package/dist/media-center/content-management/index.js +1 -0
  26. package/dist/media-center/content-management/types.d.ts +24 -0
  27. package/dist/media-center/content-management/types.js +1 -0
  28. package/dist/media-center/index.d.ts +2 -1
  29. package/dist/media-center/media-center/cmp.media-center-proxy.svelte +2 -2
  30. package/dist/media-center/media-center/discover/data-loading.d.ts +3 -0
  31. package/dist/media-center/media-center/discover/data-loading.js +13 -2
  32. package/dist/media-center/media-center/discover/discover-view-handler.svelte.d.ts +23 -0
  33. package/dist/media-center/media-center/discover/discover-view-handler.svelte.js +88 -0
  34. package/dist/media-center/media-center/discover/discover-view.svelte +90 -47
  35. package/dist/media-center/media-center/discover/discover-view.svelte.d.ts +2 -2
  36. package/dist/media-center/media-center/footer/media-center-footer.svelte +1 -1
  37. package/dist/media-center/media-center/handlers/index.d.ts +1 -0
  38. package/dist/media-center/media-center/handlers/index.js +1 -0
  39. package/dist/media-center/media-center/handlers/media-center-content-handler.svelte.d.ts +62 -0
  40. package/dist/media-center/media-center/handlers/media-center-content-handler.svelte.js +144 -0
  41. package/dist/media-center/media-center/header/media-center-header-mobile.svelte +10 -7
  42. package/dist/media-center/media-center/header/media-center-header.svelte +1 -1
  43. package/dist/media-center/media-center/media-center-context.svelte.d.ts +3 -2
  44. package/dist/media-center/media-center/media-center-context.svelte.js +30 -11
  45. package/dist/media-center/media-center/media-center-view.svelte +31 -13
  46. package/dist/media-center/media-center/menu/menu.svelte +16 -7
  47. package/dist/media-center/media-center/menu/menu.svelte.d.ts +1 -0
  48. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.d.ts +7 -0
  49. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.js +23 -8
  50. package/dist/media-center/media-center/moments/moments-feed-handler.svelte.d.ts +19 -2
  51. package/dist/media-center/media-center/moments/moments-feed-handler.svelte.js +51 -6
  52. package/dist/media-center/media-center/moments/moments-state.svelte.d.ts +2 -0
  53. package/dist/media-center/media-center/moments/moments-state.svelte.js +16 -1
  54. package/dist/media-center/media-center/posts-feed/posts-feed-handler.svelte.d.ts +24 -4
  55. package/dist/media-center/media-center/posts-feed/posts-feed-handler.svelte.js +90 -9
  56. package/dist/media-center/media-center/streams-feed/streams-feed-handler.svelte.d.ts +18 -3
  57. package/dist/media-center/media-center/streams-feed/streams-feed-handler.svelte.js +64 -9
  58. package/dist/media-center/media-center/streams-in-category/streams-in-category-panel.svelte +2 -6
  59. package/dist/posts/controls/index.d.ts +2 -1
  60. package/dist/posts/controls/index.js +2 -1
  61. package/dist/posts/controls/post-actions-generator.svelte.d.ts +20 -0
  62. package/dist/posts/controls/post-actions-generator.svelte.js +27 -0
  63. package/dist/posts/controls/post-actions-handler.svelte.d.ts +26 -0
  64. package/dist/posts/controls/post-actions-handler.svelte.js +56 -0
  65. package/dist/posts/index.d.ts +1 -0
  66. package/dist/posts/model/types.d.ts +1 -0
  67. package/dist/posts/post-viewer/cmp.post-viewer.svelte +6 -7
  68. package/dist/posts/post-viewer/cmp.post-viewer.svelte.d.ts +2 -2
  69. package/dist/posts/post-viewer/mapper.js +1 -0
  70. package/dist/posts/posts-player/cmp.posts-player.svelte +2 -1
  71. package/dist/posts/posts-player/cmp.posts-player.svelte.d.ts +2 -0
  72. package/dist/posts/posts-player/index.d.ts +2 -0
  73. package/dist/posts/posts-player/index.js +2 -1
  74. package/dist/posts/posts-player/posts-player-proxy.svelte +2 -1
  75. package/dist/posts/posts-player/posts-player-proxy.svelte.d.ts +3 -1
  76. package/dist/posts/posts-player/posts-player-view.svelte +132 -34
  77. package/dist/posts/posts-player/types.d.ts +13 -3
  78. package/dist/posts/sharing/index.d.ts +1 -0
  79. package/dist/posts/sharing/index.js +1 -0
  80. package/dist/posts/sharing/types.d.ts +5 -0
  81. package/dist/posts/sharing/types.js +1 -0
  82. package/dist/posts/social-interactions/types.d.ts +0 -1
  83. package/dist/streams/controls/index.d.ts +1 -0
  84. package/dist/streams/controls/index.js +1 -0
  85. package/dist/streams/controls/stream-actions-generator.svelte.d.ts +31 -0
  86. package/dist/streams/controls/stream-actions-generator.svelte.js +42 -0
  87. package/dist/streams/index.d.ts +1 -0
  88. package/dist/streams/index.js +1 -0
  89. package/dist/streams/layout/cmp.layout.svelte +4 -1
  90. package/dist/streams/layout/cmp.layout.svelte.d.ts +1 -0
  91. package/dist/streams/layout/element-views/cmp.short-video-stream-element.svelte +1 -0
  92. package/dist/streams/layout/models/mapper.js +1 -0
  93. package/dist/streams/sharing/index.d.ts +1 -0
  94. package/dist/streams/sharing/index.js +1 -0
  95. package/dist/streams/sharing/types.d.ts +5 -0
  96. package/dist/streams/sharing/types.js +1 -0
  97. package/dist/streams/stream-page-viewer/cmp.stream-page-viewer.svelte +43 -1
  98. package/dist/streams/stream-page-viewer/cmp.stream-page-viewer.svelte.d.ts +9 -0
  99. package/dist/streams/streams-player/cmp.streams-player.svelte +2 -1
  100. package/dist/streams/streams-player/cmp.streams-player.svelte.d.ts +2 -0
  101. package/dist/streams/streams-player/index.d.ts +2 -0
  102. package/dist/streams/streams-player/index.js +2 -1
  103. package/dist/streams/streams-player/streams-player-proxy.svelte +2 -1
  104. package/dist/streams/streams-player/streams-player-proxy.svelte.d.ts +2 -0
  105. package/dist/streams/streams-player/streams-player-view.svelte +150 -34
  106. package/dist/streams/streams-player/types.d.ts +8 -0
  107. package/dist/ui/button/resources/button-theme.svelte +2 -4
  108. package/dist/ui/card-actions/card-action-container.d.ts +2 -0
  109. package/dist/ui/card-actions/card-action-container.js +17 -0
  110. package/dist/ui/card-actions/cmp.card-action.svelte +28 -0
  111. package/dist/ui/card-actions/cmp.card-action.svelte.d.ts +10 -0
  112. package/dist/ui/card-actions/cmp.card-actions.svelte +71 -0
  113. package/dist/ui/card-actions/cmp.card-actions.svelte.d.ts +9 -0
  114. package/dist/ui/card-actions/index.d.ts +4 -0
  115. package/dist/ui/card-actions/index.js +3 -0
  116. package/dist/ui/card-actions/types.d.ts +9 -0
  117. package/dist/ui/card-actions/types.js +1 -0
  118. package/dist/ui/icon/cmp.icon.svelte +1 -1
  119. package/dist/ui/player/button/cmp.player-button.svelte +1 -3
  120. package/dist/ui/player/button/cmp.player-buttons-group.svelte +1 -3
  121. package/dist/ui/player/button/cmp.responsive-player-buttons-group.svelte +53 -0
  122. package/dist/ui/player/button/cmp.responsive-player-buttons-group.svelte.d.ts +10 -0
  123. package/dist/ui/player/button/index.d.ts +1 -0
  124. package/dist/ui/player/button/index.js +1 -0
  125. package/dist/{content-player → ui/player/content-player}/cmp.content-player.svelte +7 -29
  126. package/dist/{content-player → ui/player/content-player}/cmp.content-player.svelte.d.ts +11 -15
  127. package/dist/ui/player/content-player/content-player-config.svelte.d.ts +29 -0
  128. package/dist/ui/player/content-player/content-player-config.svelte.js +27 -0
  129. package/dist/{content-player → ui/player/content-player}/content-player-settings.svelte.d.ts +3 -3
  130. package/dist/{content-player → ui/player/content-player}/content-player-settings.svelte.js +2 -2
  131. package/dist/{content-player → ui/player/content-player}/controls-and-attachments.svelte +18 -65
  132. package/dist/{content-player → ui/player/content-player}/controls-and-attachments.svelte.d.ts +11 -14
  133. package/dist/{content-player → ui/player/content-player}/overview-panel.svelte +2 -4
  134. package/dist/{content-player → ui/player/content-player}/overview-panel.svelte.d.ts +5 -14
  135. package/dist/{content-player → ui/player/content-player}/ui-manager.svelte.d.ts +3 -2
  136. package/dist/{content-player → ui/player/content-player}/ui-manager.svelte.js +3 -2
  137. package/dist/ui/player/providers/chunks-player-buffer/player-chunk-item.svelte.d.ts +0 -2
  138. package/dist/ui/player/providers/chunks-player-buffer/player-chunk-item.svelte.js +1 -3
  139. package/dist/ui/player/providers/chunks-player-buffer/player-chunk.svelte.d.ts +3 -2
  140. package/dist/ui/player/providers/chunks-player-buffer/player-chunk.svelte.js +11 -5
  141. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.d.ts +3 -0
  142. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.js +74 -8
  143. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.d.ts +2 -0
  144. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.js +15 -4
  145. package/dist/ui/player/providers/default-feed-player-buffer.svelte.d.ts +1 -0
  146. package/dist/ui/player/providers/default-feed-player-buffer.svelte.js +27 -5
  147. package/dist/ui/player/providers/types.d.ts +1 -0
  148. package/dist/ui/player/slider/cmp.player-slider.svelte.d.ts +5 -14
  149. package/dist/ui/player/slider-horizontal/cmp.slider.svelte +2 -6
  150. package/dist/ui/player/slider-horizontal/cmp.slider.svelte.d.ts +5 -12
  151. package/dist/ui/shadow-dom/cmp.shadow-root.svelte +11 -6
  152. package/dist/ui/shadow-dom/colors.scss +2 -0
  153. package/package.json +7 -3
  154. package/dist/content-player/content-player-config.svelte.d.ts +0 -51
  155. package/dist/content-player/content-player-config.svelte.js +0 -48
  156. package/dist/core/analytics.installation-id.d.ts +0 -5
  157. package/dist/external-api/data-providers/mapper.d.ts +0 -3
  158. package/dist/external-api/data-providers/mapper.js +0 -18
  159. package/dist/posts/controls/cmp.controls.svelte +0 -120
  160. package/dist/posts/controls/cmp.controls.svelte.d.ts +0 -16
  161. /package/dist/{media-center/categories-following → external-api/data-providers/mocks}/mock-categories-following-handler.svelte.js +0 -0
  162. /package/dist/{media-center/membership → external-api/data-providers/mocks}/mock-membership-handler.svelte.js +0 -0
  163. /package/dist/{media-center/navigation → external-api/data-providers/mocks}/mock-navigation-handler.svelte.js +0 -0
  164. /package/dist/{content-player → ui/player/content-player}/index.d.ts +0 -0
  165. /package/dist/{content-player → ui/player/content-player}/index.js +0 -0
@@ -1,18 +1,21 @@
1
+ import { PostType } from '../../../core/enums';
1
2
  import { initBufferFromProvider } from '../../../ui/player/providers/service';
2
3
  import { MomentsState } from './moments-state.svelte';
3
- import { MediaCenterSettingsHandler } from '../handlers';
4
+ import { MediaCenterContentHandler, MediaCenterSettingsHandler } from '../handlers';
4
5
  export class MomentsFeedHandler {
5
6
  momentsState;
6
7
  _active = $state(false);
7
8
  _momentsPlayerProps = $state.raw(null);
8
9
  _dataProvider;
9
10
  _mediaCenterSettingsHandler;
11
+ _mediaCenterContentHandler;
10
12
  _closeOrchestrator;
11
13
  _callbacks;
12
14
  constructor(data) {
13
15
  const { dataProvider, mediaCenterSettingsHandler, closeOrchestrator, on } = data;
14
16
  this.momentsState = new MomentsState(dataProvider);
15
17
  this._mediaCenterSettingsHandler = mediaCenterSettingsHandler;
18
+ this._mediaCenterContentHandler = data.mediaCenterContentHandler;
16
19
  this._dataProvider = dataProvider;
17
20
  this._closeOrchestrator = closeOrchestrator;
18
21
  this._callbacks = on;
@@ -29,12 +32,26 @@ export class MomentsFeedHandler {
29
32
  get hasMoments() {
30
33
  return this.momentsState.allMoments.length > 0;
31
34
  }
35
+ get feedBuffer() {
36
+ if (!this._momentsPlayerProps) {
37
+ return null;
38
+ }
39
+ const buffer = this._momentsPlayerProps.dataProvider.type === 'buffer' ? this._momentsPlayerProps.dataProvider.buffer : null;
40
+ return buffer;
41
+ }
42
+ get managementActions() {
43
+ return {
44
+ editPost: this._mediaCenterContentHandler.editPost,
45
+ editArticle: null,
46
+ deletePost: this._mediaCenterContentHandler.deletePost
47
+ };
48
+ }
32
49
  deactivate = () => {
33
50
  this._active = false;
34
51
  this._momentsPlayerProps = null;
35
52
  };
36
53
  activate = async (data) => {
37
- if (data?.initialMomentId && this.tryRestoreState(data.initialMomentId)) {
54
+ if (data?.tryRestoreState && data?.initialMomentId && this.tryRestoreState(data.initialMomentId)) {
38
55
  // Already active with the requested buffer
39
56
  return;
40
57
  }
@@ -46,7 +63,8 @@ export class MomentsFeedHandler {
46
63
  onEndReached: this._callbacks.playerReachedEnd
47
64
  }))
48
65
  },
49
- socialInteractionsHandler: this._dataProvider.handlers?.socialInteractionsHandler,
66
+ socialInteractionsHandler: this._dataProvider.handlers?.postSocialInteractionsHandler,
67
+ sharingHandler: this._dataProvider.handlers?.postSharingHandler,
50
68
  analyticsHandler: this._dataProvider.handlers?.analyticsHandler,
51
69
  playerSettings: this._mediaCenterSettingsHandler.playerSettings,
52
70
  closeOrchestrator: this._closeOrchestrator,
@@ -60,14 +78,41 @@ export class MomentsFeedHandler {
60
78
  };
61
79
  this._active = true;
62
80
  };
81
+ onPostCreated = (data) => {
82
+ if (!this._active || !data.isPublished || data.post.postType !== PostType.Moment) {
83
+ return;
84
+ }
85
+ // Reactivate to include the new moment
86
+ this.activate();
87
+ };
88
+ onPostModified = (data) => {
89
+ if (!this._active) {
90
+ return false;
91
+ }
92
+ const postStillInTheFeed = data.isPublished && data.post.postType === PostType.Moment;
93
+ if (postStillInTheFeed) {
94
+ this.activate({ initialMomentId: data.post.id });
95
+ }
96
+ else {
97
+ this.onPostDeleted({ id: data.post.id });
98
+ }
99
+ };
100
+ onPostDeleted = (data) => {
101
+ const nextMomentId = this.momentsState.removeMomentById(data.id);
102
+ if (nextMomentId) {
103
+ this.activate({ initialMomentId: nextMomentId });
104
+ }
105
+ else {
106
+ this._callbacks.playerReachedEnd();
107
+ }
108
+ };
63
109
  tryRestoreState = (initialMomentId) => {
64
110
  if (!this._active || !this._momentsPlayerProps) {
65
111
  return false;
66
112
  }
67
- const buffer = this._momentsPlayerProps.dataProvider.type === 'buffer' ? this._momentsPlayerProps.dataProvider.buffer : null;
68
- if (!buffer) {
113
+ if (!this.feedBuffer) {
69
114
  return false;
70
115
  }
71
- return buffer.tryActivateItemById(initialMomentId);
116
+ return this.feedBuffer.tryActivateItemById(initialMomentId);
72
117
  };
73
118
  }
@@ -4,6 +4,7 @@ import type { IChunksPlayerDataProvider } from '../../../ui/player/providers';
4
4
  export declare class MomentsState {
5
5
  private readonly dataProvider;
6
6
  private momentsSeenLocally;
7
+ private removedMomentsIds;
7
8
  constructor(dataProvider: IMediaCenterDataProvider);
8
9
  get allMoments(): {
9
10
  id: string;
@@ -16,6 +17,7 @@ export declare class MomentsState {
16
17
  isSeen: boolean;
17
18
  }[];
18
19
  markMomentAsSeen: (momentId: string) => void;
20
+ removeMomentById: (id: string) => string | null;
19
21
  generatePlayerDataProvider: (data: {
20
22
  initialId: string | null | undefined;
21
23
  onEndReached: () => void;
@@ -3,11 +3,12 @@ import {} from '../../../posts/posts-player';
3
3
  export class MomentsState {
4
4
  dataProvider;
5
5
  momentsSeenLocally = $state.raw([]);
6
+ removedMomentsIds = $state.raw([]);
6
7
  constructor(dataProvider) {
7
8
  this.dataProvider = dataProvider;
8
9
  }
9
10
  get allMoments() {
10
- return this.dataProvider.model?.moments ?? [];
11
+ return (this.dataProvider.model?.moments ?? []).filter((m) => !this.removedMomentsIds.includes(m.id));
11
12
  }
12
13
  get unwatchedMoments() {
13
14
  return this.allMoments.filter((s) => !s.isSeen && !this.momentsSeenLocally.includes(s.id));
@@ -17,6 +18,20 @@ export class MomentsState {
17
18
  this.momentsSeenLocally = [...this.momentsSeenLocally, momentId];
18
19
  }
19
20
  };
21
+ removeMomentById = (id) => {
22
+ const currentIndex = this.allMoments.findIndex((m) => m.id === id);
23
+ let nextMomentId = null;
24
+ if (currentIndex !== -1) {
25
+ if (currentIndex < this.allMoments.length - 1) {
26
+ nextMomentId = this.allMoments[currentIndex + 1].id;
27
+ }
28
+ else if (currentIndex > 0) {
29
+ nextMomentId = this.allMoments[currentIndex - 1].id;
30
+ }
31
+ }
32
+ this.removedMomentsIds = [...this.removedMomentsIds, id];
33
+ return nextMomentId;
34
+ };
20
35
  generatePlayerDataProvider = (data) => {
21
36
  const { initialId, onEndReached } = data;
22
37
  const collectionCapacity = 5;
@@ -1,9 +1,9 @@
1
1
  import type { IMediaCenterDataProvider } from '../../config/types';
2
2
  import type { MediaCenterState } from '../../navigation';
3
- import type { PostPlayerModel, PostsPlayerProps } from '../../../posts/posts-player/types';
3
+ import type { PostManagementActions, PostPlayerModel, PostsPlayerProps } from '../../../posts/posts-player/types';
4
4
  import type { ICloseOrchestrator } from '../../../ui/player/close-orchestrator';
5
- import type { IPlayerDataProvider } from '../../../ui/player/providers';
6
- import { MediaCenterSettingsHandler } from '../handlers';
5
+ import type { IPlayerBuffer, IPlayerDataProvider } from '../../../ui/player/providers';
6
+ import { MediaCenterContentHandler, MediaCenterSettingsHandler } from '../handlers';
7
7
  import type { PostsFeedFilter, PostsFeedProviderInit } from './types';
8
8
  export declare class PostsFeedHandler {
9
9
  private _state;
@@ -11,11 +11,13 @@ export declare class PostsFeedHandler {
11
11
  private _feedPlayerData;
12
12
  private _dataProvider;
13
13
  private _mediaCenterSettingsHandler;
14
+ private _mediaCenterContentHandler;
14
15
  private _closeOrchestrator;
15
16
  private _callbacks;
16
17
  constructor(data: {
17
18
  dataProvider: IMediaCenterDataProvider;
18
19
  mediaCenterSettingsHandler: MediaCenterSettingsHandler;
20
+ mediaCenterContentHandler: MediaCenterContentHandler;
19
21
  closeOrchestrator: ICloseOrchestrator;
20
22
  on: Callbacks;
21
23
  });
@@ -23,15 +25,33 @@ export declare class PostsFeedHandler {
23
25
  get active(): boolean;
24
26
  get loading(): boolean;
25
27
  get feedPlayerProps(): PostsPlayerProps | null;
28
+ get feedBuffer(): IPlayerBuffer<PostPlayerModel> | null;
29
+ get managementActions(): PostManagementActions;
30
+ get canReload(): boolean;
26
31
  deactivate: () => void;
27
- activateWithExistingProvider: (data: {
32
+ activateWithDataProvider: (data: {
28
33
  dataProvider: IPlayerDataProvider<PostPlayerModel>;
29
34
  onPostActivated?: (id: string) => void;
30
35
  }) => Promise<void>;
31
36
  activate: (options: Partial<{
32
37
  filter: PostsFeedFilter;
33
38
  init: PostsFeedProviderInit;
39
+ tryRestoreState?: boolean;
34
40
  }>) => Promise<void>;
41
+ onPostCreated: (data: {
42
+ post: PostPlayerModel;
43
+ categories: string[];
44
+ isPublished: boolean;
45
+ }) => false | undefined;
46
+ onPostModified: (data: {
47
+ post: PostPlayerModel;
48
+ categories: string[];
49
+ isPublished: boolean;
50
+ }) => false | undefined;
51
+ onPostDeleted: (data: {
52
+ id: string;
53
+ }) => false | undefined;
54
+ private checkIfEditedPostAffectsFeed;
35
55
  private tryRestoreState;
36
56
  private makePostsPlayerProps;
37
57
  }
@@ -1,6 +1,7 @@
1
+ import { PostType } from '../../..';
1
2
  import { Utils } from '../../../core/utils';
2
3
  import { initBufferFromProvider } from '../../../ui/player/providers/service';
3
- import { MediaCenterSettingsHandler } from '../handlers';
4
+ import { MediaCenterContentHandler, MediaCenterSettingsHandler } from '../handlers';
4
5
  import { FeedProvidersGenerator } from './feed-providers-generator';
5
6
  export class PostsFeedHandler {
6
7
  _state = $state('inactive');
@@ -8,12 +9,14 @@ export class PostsFeedHandler {
8
9
  _feedPlayerData = $state.raw(null);
9
10
  _dataProvider;
10
11
  _mediaCenterSettingsHandler;
12
+ _mediaCenterContentHandler;
11
13
  _closeOrchestrator;
12
14
  _callbacks;
13
15
  constructor(data) {
14
- const { dataProvider, mediaCenterSettingsHandler, closeOrchestrator, on } = data;
16
+ const { dataProvider, mediaCenterSettingsHandler, mediaCenterContentHandler, closeOrchestrator, on } = data;
15
17
  this._providersGenerator = new FeedProvidersGenerator(dataProvider);
16
18
  this._mediaCenterSettingsHandler = mediaCenterSettingsHandler;
19
+ this._mediaCenterContentHandler = mediaCenterContentHandler;
17
20
  this._dataProvider = dataProvider;
18
21
  this._closeOrchestrator = closeOrchestrator;
19
22
  this._callbacks = on;
@@ -30,11 +33,44 @@ export class PostsFeedHandler {
30
33
  get feedPlayerProps() {
31
34
  return this._feedPlayerData?.props || null;
32
35
  }
36
+ get feedBuffer() {
37
+ if (!this._feedPlayerData) {
38
+ return null;
39
+ }
40
+ const buffer = this._feedPlayerData.props.dataProvider.type === 'buffer' ? this._feedPlayerData.props.dataProvider.buffer : null;
41
+ return buffer;
42
+ }
43
+ get managementActions() {
44
+ return {
45
+ editPost: this._mediaCenterContentHandler.editPost,
46
+ editArticle: this._mediaCenterContentHandler.editArticle,
47
+ deletePost: this._mediaCenterContentHandler.deletePost
48
+ };
49
+ }
50
+ get canReload() {
51
+ switch (this._state) {
52
+ case 'ready': {
53
+ if (!this.feedBuffer) {
54
+ return true;
55
+ }
56
+ return this.feedBuffer.currentIndex > 0;
57
+ }
58
+ case 'inactive': {
59
+ return true;
60
+ }
61
+ case 'loading': {
62
+ return false;
63
+ }
64
+ default: {
65
+ Utils.assertUnreachable(this._state);
66
+ }
67
+ }
68
+ }
33
69
  deactivate = () => {
34
70
  this._state = 'inactive';
35
71
  this._feedPlayerData = null;
36
72
  };
37
- activateWithExistingProvider = async (data) => {
73
+ activateWithDataProvider = async (data) => {
38
74
  const { dataProvider, onPostActivated } = data;
39
75
  const on = {
40
76
  postActivated: (id) => {
@@ -57,8 +93,8 @@ export class PostsFeedHandler {
57
93
  }
58
94
  };
59
95
  activate = async (options) => {
60
- const { filter, init } = options;
61
- if (init?.initialPostId && this.tryRestoreState(init.initialPostId, filter)) {
96
+ const { filter, init, tryRestoreState } = options;
97
+ if (tryRestoreState && init?.initialPostId && this.tryRestoreState(init.initialPostId, filter)) {
62
98
  // Already active with the requested buffer
63
99
  return;
64
100
  }
@@ -79,21 +115,66 @@ export class PostsFeedHandler {
79
115
  this._state = 'ready';
80
116
  }
81
117
  };
118
+ onPostCreated = (data) => {
119
+ if (this._state !== 'ready') {
120
+ return false;
121
+ }
122
+ if (!this.checkIfEditedPostAffectsFeed(data)) {
123
+ return;
124
+ }
125
+ this.activate({
126
+ filter: this._feedPlayerData?.filter,
127
+ init: { initialPostId: data.post.id, prefetchedItems: [data.post] }
128
+ });
129
+ };
130
+ onPostModified = (data) => {
131
+ if (this._state !== 'ready') {
132
+ return false;
133
+ }
134
+ const postStillInTheFeed = this.checkIfEditedPostAffectsFeed(data);
135
+ if (postStillInTheFeed) {
136
+ this.activate({
137
+ filter: this._feedPlayerData?.filter,
138
+ init: { initialPostId: data.post.id, prefetchedItems: [data.post] }
139
+ });
140
+ }
141
+ else {
142
+ this.onPostDeleted({ id: data.post.id });
143
+ }
144
+ };
145
+ onPostDeleted = (data) => {
146
+ if (this._state !== 'ready') {
147
+ return false;
148
+ }
149
+ this.feedBuffer?.removeItemById(data.id);
150
+ };
151
+ checkIfEditedPostAffectsFeed = (data) => {
152
+ const { post, categories, isPublished } = data;
153
+ if (!isPublished) {
154
+ // Unpublished posts never affect the feed
155
+ return false;
156
+ }
157
+ if (post.postType === PostType.Moment) {
158
+ // Moments are processed separately
159
+ return false;
160
+ }
161
+ return !this._feedPlayerData?.filter.categoryId || categories.includes(this._feedPlayerData.filter.categoryId);
162
+ };
82
163
  tryRestoreState = (initialPostId, filter) => {
83
164
  if (this._state !== 'ready' || !this._feedPlayerData || !Utils.areEqual(this._feedPlayerData.filter, filter)) {
84
165
  return false;
85
166
  }
86
- const buffer = this._feedPlayerData.props.dataProvider.type === 'buffer' ? this._feedPlayerData.props.dataProvider.buffer : null;
87
- if (!buffer) {
167
+ if (!this.feedBuffer) {
88
168
  return false;
89
169
  }
90
- return buffer.tryActivateItemById(initialPostId);
170
+ return this.feedBuffer.tryActivateItemById(initialPostId);
91
171
  };
92
172
  makePostsPlayerProps = (data) => {
93
173
  const { dataProvider, on } = data;
94
174
  return {
95
175
  dataProvider: { type: 'buffer', buffer: initBufferFromProvider(dataProvider) },
96
- socialInteractionsHandler: this._dataProvider.handlers?.socialInteractionsHandler,
176
+ socialInteractionsHandler: this._dataProvider.handlers?.postSocialInteractionsHandler,
177
+ sharingHandler: this._dataProvider.handlers?.postSharingHandler,
97
178
  analyticsHandler: this._dataProvider.handlers?.analyticsHandler,
98
179
  playerSettings: this._mediaCenterSettingsHandler.playerSettings,
99
180
  closeOrchestrator: this._closeOrchestrator,
@@ -1,8 +1,9 @@
1
1
  import type { IMediaCenterDataProvider } from '../../config/types';
2
2
  import type { MediaCenterState } from '../../navigation';
3
- import type { StreamsPlayerProps, IStreamsPlayerDataProvider } from '../../../streams/streams-player/types';
3
+ import { StreamsPlayerBuffer } from '../../../streams/streams-player/streams-player-buffer.svelte';
4
+ import type { StreamsPlayerProps, IStreamsPlayerDataProvider, StreamManagementActions, StreamPlayerModel } from '../../../streams/streams-player/types';
4
5
  import type { ICloseOrchestrator } from '../../../ui/player/close-orchestrator';
5
- import { MediaCenterSettingsHandler } from '../handlers';
6
+ import { MediaCenterContentHandler, MediaCenterSettingsHandler } from '../handlers';
6
7
  import type { StreamsFeedFilter, StreamsFeedProviderInit } from './types';
7
8
  export declare class StreamsFeedHandler {
8
9
  private _state;
@@ -10,11 +11,13 @@ export declare class StreamsFeedHandler {
10
11
  private _feedPlayerData;
11
12
  private _dataProvider;
12
13
  private _mediaCenterSettingsHandler;
14
+ private _mediaCenterContentHandler;
13
15
  private _closeOrchestrator;
14
16
  private _callbacks;
15
17
  constructor(data: {
16
18
  dataProvider: IMediaCenterDataProvider;
17
19
  mediaCenterSettingsHandler: MediaCenterSettingsHandler;
20
+ mediaCenterContentHandler: MediaCenterContentHandler;
18
21
  closeOrchestrator: ICloseOrchestrator;
19
22
  on: Callbacks;
20
23
  });
@@ -22,8 +25,11 @@ export declare class StreamsFeedHandler {
22
25
  get active(): boolean;
23
26
  get loading(): boolean;
24
27
  get feedPlayerProps(): StreamsPlayerProps | null;
28
+ get feedBuffer(): StreamsPlayerBuffer | null;
29
+ get managementActions(): StreamManagementActions | undefined;
30
+ get canReload(): boolean;
25
31
  deactivate: () => void;
26
- activateWithExistingProvider: (data: {
32
+ activateWithDataProvider: (data: {
27
33
  dataProvider: IStreamsPlayerDataProvider;
28
34
  onStreamActivated?: (data: {
29
35
  id: string;
@@ -34,7 +40,16 @@ export declare class StreamsFeedHandler {
34
40
  activate: (options: Partial<{
35
41
  filter: StreamsFeedFilter;
36
42
  init: StreamsFeedProviderInit;
43
+ tryRestoreState?: boolean;
37
44
  }>) => Promise<void>;
45
+ onStreamModified: (data: {
46
+ stream: StreamPlayerModel;
47
+ categories: string[];
48
+ isPublished: boolean;
49
+ }) => false | undefined;
50
+ onStreamPageDeleted: (data: {
51
+ id: string;
52
+ }) => false | undefined;
38
53
  private tryRestoreState;
39
54
  private makeStreamsPlayerProps;
40
55
  }
@@ -1,6 +1,6 @@
1
1
  import { Utils } from '../../../core/utils';
2
2
  import { StreamsPlayerBuffer } from '../../../streams/streams-player/streams-player-buffer.svelte';
3
- import { MediaCenterSettingsHandler } from '../handlers';
3
+ import { MediaCenterContentHandler, MediaCenterSettingsHandler } from '../handlers';
4
4
  import { FeedProvidersGenerator } from './feed-providers-generator';
5
5
  export class StreamsFeedHandler {
6
6
  _state = $state('inactive');
@@ -8,12 +8,14 @@ export class StreamsFeedHandler {
8
8
  _feedPlayerData = $state.raw(null);
9
9
  _dataProvider;
10
10
  _mediaCenterSettingsHandler;
11
+ _mediaCenterContentHandler;
11
12
  _closeOrchestrator;
12
13
  _callbacks;
13
14
  constructor(data) {
14
- const { dataProvider, mediaCenterSettingsHandler, closeOrchestrator, on } = data;
15
+ const { dataProvider, mediaCenterSettingsHandler, mediaCenterContentHandler, closeOrchestrator, on } = data;
15
16
  this._providersGenerator = new FeedProvidersGenerator(dataProvider);
16
17
  this._mediaCenterSettingsHandler = mediaCenterSettingsHandler;
18
+ this._mediaCenterContentHandler = mediaCenterContentHandler;
17
19
  this._dataProvider = dataProvider;
18
20
  this._closeOrchestrator = closeOrchestrator;
19
21
  this._callbacks = on;
@@ -30,11 +32,43 @@ export class StreamsFeedHandler {
30
32
  get feedPlayerProps() {
31
33
  return this._feedPlayerData?.props || null;
32
34
  }
35
+ get feedBuffer() {
36
+ if (!this._feedPlayerData) {
37
+ return null;
38
+ }
39
+ const buffer = this._feedPlayerData.props.dataProvider.type === 'buffer' ? this._feedPlayerData.props.dataProvider.buffer : null;
40
+ return buffer;
41
+ }
42
+ get managementActions() {
43
+ return {
44
+ editStream: this._mediaCenterContentHandler.editStream,
45
+ deleteStreamPage: this._mediaCenterContentHandler.deleteStreamPage
46
+ };
47
+ }
48
+ get canReload() {
49
+ switch (this._state) {
50
+ case 'ready': {
51
+ if (!this.feedBuffer) {
52
+ return true;
53
+ }
54
+ return this.feedBuffer.currentIndex > 0;
55
+ }
56
+ case 'inactive': {
57
+ return true;
58
+ }
59
+ case 'loading': {
60
+ return false;
61
+ }
62
+ default: {
63
+ Utils.assertUnreachable(this._state);
64
+ }
65
+ }
66
+ }
33
67
  deactivate = () => {
34
68
  this._state = 'inactive';
35
69
  this._feedPlayerData = null;
36
70
  };
37
- activateWithExistingProvider = async (data) => {
71
+ activateWithDataProvider = async (data) => {
38
72
  const { dataProvider, onStreamActivated } = data;
39
73
  const on = {
40
74
  streamActivated: (data) => {
@@ -60,8 +94,8 @@ export class StreamsFeedHandler {
60
94
  }
61
95
  };
62
96
  activate = async (options) => {
63
- const { filter, init } = options;
64
- if (init?.initialStreamPageId && this.tryRestoreState(init.initialStreamPageId, filter)) {
97
+ const { filter, init, tryRestoreState } = options;
98
+ if (tryRestoreState && init?.initialStreamPageId && this.tryRestoreState(init.initialStreamPageId, filter)) {
65
99
  // Already active with the requested buffer
66
100
  return;
67
101
  }
@@ -83,22 +117,43 @@ export class StreamsFeedHandler {
83
117
  this._state = 'ready';
84
118
  }
85
119
  };
120
+ onStreamModified = (data) => {
121
+ if (this._state !== 'ready') {
122
+ return false;
123
+ }
124
+ const streamStillInTheFeed = data.isPublished && (!this._feedPlayerData?.filter.categoryId || data.categories.includes(this._feedPlayerData.filter.categoryId));
125
+ if (streamStillInTheFeed) {
126
+ this.activate({
127
+ filter: this._feedPlayerData?.filter,
128
+ init: { initialStreamId: data.stream.id, prefetchedStreams: [data.stream] }
129
+ });
130
+ }
131
+ else {
132
+ this.feedBuffer?.removeChunkById(data.stream.id);
133
+ }
134
+ };
135
+ onStreamPageDeleted = (data) => {
136
+ if (this._state !== 'ready') {
137
+ return false;
138
+ }
139
+ this.feedBuffer?.removeItemById(data.id);
140
+ };
86
141
  tryRestoreState = (initialStreamPageId, filter) => {
87
142
  if (this._state !== 'ready' || !this._feedPlayerData || !Utils.areEqual(this._feedPlayerData.filter, filter)) {
88
143
  return false;
89
144
  }
90
- const buffer = this._feedPlayerData.props.dataProvider.type === 'buffer' ? this._feedPlayerData.props.dataProvider.buffer : null;
91
- if (!buffer) {
145
+ if (!this.feedBuffer) {
92
146
  return false;
93
147
  }
94
- return buffer.tryActivateItemById(initialStreamPageId);
148
+ return this.feedBuffer.tryActivateItemById(initialStreamPageId);
95
149
  };
96
150
  makeStreamsPlayerProps = (data) => {
97
151
  const { dataProvider, on } = data;
98
152
  return {
99
153
  dataProvider: { type: 'buffer', buffer: new StreamsPlayerBuffer(dataProvider) },
100
154
  analyticsHandler: this._dataProvider.handlers?.analyticsHandler,
101
- postSocialInteractionsHandler: this._dataProvider.handlers?.socialInteractionsHandler,
155
+ postSocialInteractionsHandler: this._dataProvider.handlers?.postSocialInteractionsHandler,
156
+ sharingHandler: this._dataProvider.handlers?.streamSharingHandler,
102
157
  playerSettings: this._mediaCenterSettingsHandler.playerSettings,
103
158
  closeOrchestrator: this._closeOrchestrator,
104
159
  on: {
@@ -80,23 +80,19 @@ let { handler, on } = $props();
80
80
  gap: 2rem 1.25rem;
81
81
  grid-template-columns: repeat(5, minmax(0, 1fr));
82
82
  /* Set 'container-type: inline-size;' to reference container*/
83
+ /* Set 'container-type: inline-size;' to reference container*/
84
+ /* Set 'container-type: inline-size;' to reference container*/
83
85
  }
84
86
  @container (width < 992px) {
85
87
  .streams-in-category__section-content {
86
88
  grid-template-columns: repeat(4, minmax(0, 1fr));
87
89
  }
88
90
  }
89
- .streams-in-category__section-content {
90
- /* Set 'container-type: inline-size;' to reference container*/
91
- }
92
91
  @container (width < 768px) {
93
92
  .streams-in-category__section-content {
94
93
  grid-template-columns: repeat(3, minmax(0, 1fr));
95
94
  }
96
95
  }
97
- .streams-in-category__section-content {
98
- /* Set 'container-type: inline-size;' to reference container*/
99
- }
100
96
  @container (width < 576px) {
101
97
  .streams-in-category__section-content {
102
98
  grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -1 +1,2 @@
1
- export { default as PostControls } from './cmp.controls.svelte';
1
+ export { PostActionsGenerator } from './post-actions-generator.svelte';
2
+ export { PostActionsHandler } from './post-actions-handler.svelte';
@@ -1 +1,2 @@
1
- export { default as PostControls } from './cmp.controls.svelte';
1
+ export { PostActionsGenerator } from './post-actions-generator.svelte';
2
+ export { PostActionsHandler } from './post-actions-handler.svelte';
@@ -0,0 +1,20 @@
1
+ import type { PostModel } from '../model';
2
+ import type { IPostSharingHandler } from '../sharing';
3
+ import type { IPostSocialInteractionsHandler } from '../social-interactions';
4
+ import { PostActionsHandler } from './post-actions-handler.svelte';
5
+ export declare class PostActionsGenerator {
6
+ private socialInteractionsHandler;
7
+ private sharingHandler;
8
+ private callbacks;
9
+ private handlers;
10
+ constructor(init: {
11
+ socialInteractionsHandler: IPostSocialInteractionsHandler | undefined;
12
+ sharingHandler: IPostSharingHandler | undefined;
13
+ on: PostActionCallbacks;
14
+ });
15
+ getPostActionsHandler: (model: PostModel) => PostActionsHandler;
16
+ }
17
+ type PostActionCallbacks = {
18
+ attachmentClicked: () => void;
19
+ };
20
+ export {};
@@ -0,0 +1,27 @@
1
+ import { PostActionsHandler } from './post-actions-handler.svelte';
2
+ export class PostActionsGenerator {
3
+ socialInteractionsHandler;
4
+ sharingHandler;
5
+ callbacks;
6
+ handlers = new Map();
7
+ constructor(init) {
8
+ this.socialInteractionsHandler = init.socialInteractionsHandler ?? null;
9
+ this.sharingHandler = init.sharingHandler ?? null;
10
+ this.callbacks = init.on;
11
+ }
12
+ getPostActionsHandler = (model) => {
13
+ let handler = this.handlers.get(model.id);
14
+ if (!handler) {
15
+ handler = new PostActionsHandler({
16
+ post: model,
17
+ socialInteractionsHandler: this.socialInteractionsHandler,
18
+ callbacks: {
19
+ attachmentClicked: this.callbacks.attachmentClicked,
20
+ shareClicked: this.sharingHandler ? () => this.sharingHandler?.share(model.id) : undefined
21
+ }
22
+ });
23
+ this.handlers.set(model.id, handler);
24
+ }
25
+ return handler;
26
+ };
27
+ }
@@ -0,0 +1,26 @@
1
+ import type { PostModel } from '../model';
2
+ import type { IPostSocialInteractionsHandler } from '../social-interactions';
3
+ import { IconColor } from '../../ui/icon';
4
+ export declare class PostActionsHandler {
5
+ readonly actions: PostAction[];
6
+ private post;
7
+ private socialInteractionsHandler;
8
+ private callbacks;
9
+ private isLikedStore;
10
+ constructor(init: {
11
+ post: PostModel;
12
+ socialInteractionsHandler: IPostSocialInteractionsHandler | null;
13
+ callbacks: PostActionCallbacks;
14
+ });
15
+ private initIsLikedStore;
16
+ }
17
+ type PostAction = {
18
+ icon: string;
19
+ iconColor?: IconColor;
20
+ callback: () => void;
21
+ };
22
+ type PostActionCallbacks = {
23
+ attachmentClicked: () => void;
24
+ shareClicked?: () => void;
25
+ };
26
+ export {};