@maestro_io/maestro-web-sdk 2.1.1 → 2.1.2

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 (171) hide show
  1. package/dist/MaestroEventDelegate.js +60 -0
  2. package/dist/components/atoms/BaseButton/BaseButton.js +11 -0
  3. package/dist/components/atoms/BaseButton/index.js +2 -0
  4. package/dist/components/atoms/Image/index.js +30 -0
  5. package/dist/components/atoms/Rive/index.js +52 -0
  6. package/dist/components/atoms/SvgIcon/BetGeneralIcon.js +9 -0
  7. package/dist/components/atoms/SvgIcon/BetsIcon.js +11 -0
  8. package/dist/components/atoms/SvgIcon/BetsWarningIcon.js +11 -0
  9. package/dist/components/atoms/SvgIcon/CheckmarkIcon.js +6 -0
  10. package/dist/components/atoms/SvgIcon/CollapseIcon.js +6 -0
  11. package/dist/components/atoms/SvgIcon/ExpandIcon.js +6 -0
  12. package/dist/components/atoms/SvgIcon/FantasyIcon.js +8 -0
  13. package/dist/components/atoms/SvgIcon/FlameIcon.js +11 -0
  14. package/dist/components/atoms/SvgIcon/Icon.js +42 -0
  15. package/dist/components/atoms/SvgIcon/KeyPlaysIcon.js +10 -0
  16. package/dist/components/atoms/SvgIcon/MobilePhoneIcon.js +11 -0
  17. package/dist/components/atoms/SvgIcon/PlayIcon.js +8 -0
  18. package/dist/components/atoms/SvgIcon/StatsIcon.js +12 -0
  19. package/dist/components/atoms/SvgIcon/TimesIcon.js +6 -0
  20. package/dist/components/atoms/SvgIcon/WarningIcon.js +8 -0
  21. package/dist/components/atoms/SvgIcon/index.js +2 -0
  22. package/dist/components/core/App/App.js +41 -0
  23. package/dist/components/core/App/index.js +2 -0
  24. package/dist/components/core/OverlayContainer.js +58 -0
  25. package/dist/components/core/PanelManager/PanelManager.js +80 -0
  26. package/dist/components/core/PanelManager/index.js +2 -0
  27. package/dist/components/core/ScrollableContainer/FocusableItem.js +38 -0
  28. package/dist/components/core/ScrollableContainer/ScrollableContainer.js +166 -0
  29. package/dist/components/core/ScrollableContainer/index.js +2 -0
  30. package/dist/components/molecules/ActionButton/ActionButton.js +10 -0
  31. package/dist/components/molecules/ActionButton/index.js +2 -0
  32. package/dist/components/molecules/Overlay/Overlay.js +139 -0
  33. package/dist/components/molecules/Overlay/index.js +2 -0
  34. package/dist/components/molecules/PanelNavButton/PanelNavButton.js +40 -0
  35. package/dist/components/molecules/PanelNavButton/index.js +2 -0
  36. package/dist/components/molecules/SegmentButton/SegmentButton.js +10 -0
  37. package/dist/components/molecules/SegmentButton/index.js +2 -0
  38. package/dist/components/molecules/WatchButton/WatchButton.js +15 -0
  39. package/dist/components/molecules/WatchButton/index.js +2 -0
  40. package/dist/components/organisms/PanelNavigation/PanelNavigation.js +72 -0
  41. package/dist/components/organisms/PanelNavigation/index.js +2 -0
  42. package/dist/components/organisms/SegmentController/SegmentController.js +69 -0
  43. package/dist/components/organisms/SegmentController/index.d.ts +1 -1
  44. package/dist/components/organisms/SegmentController/index.js +2 -0
  45. package/dist/external/AxiosNetworkClient.js +83 -0
  46. package/dist/external/LocalStorageCacheManager.js +213 -0
  47. package/dist/external/ReactRenderer.d.ts +2 -2
  48. package/dist/external/ReactRenderer.js +86 -0
  49. package/dist/external/mocks/MockExternalNetworkClient.js +161 -0
  50. package/dist/external/ports/cacheManager.js +1 -0
  51. package/dist/external/ports/networkClient.js +1 -0
  52. package/dist/external/ports/renderer.js +1 -0
  53. package/dist/external/spatial-navigation/index.d.ts +1 -1
  54. package/dist/external/spatial-navigation/index.js +4 -0
  55. package/dist/external/spatial-navigation/measureLayout.js +30 -0
  56. package/dist/external/spatial-navigation/spatialNavigation.js +875 -0
  57. package/dist/external/spatial-navigation/utils.js +6 -0
  58. package/dist/external/spatial-navigation/visualDebugger.js +76 -0
  59. package/dist/external/spatial-navigation/withFocusable.js +238 -0
  60. package/dist/helpers/Observable.js +37 -0
  61. package/dist/helpers/deliver-focus.js +12 -0
  62. package/dist/index.d.ts +4 -4
  63. package/dist/index.js +192 -0
  64. package/dist/interfaces/IMaestroEvent.js +6 -0
  65. package/dist/interfaces/IMaestroEventDelegate.js +1 -0
  66. package/dist/interfaces/IMaestroManager.js +1 -0
  67. package/dist/maestro-web-sdk.umd.js +3 -3
  68. package/dist/maestro-web-sdk.umd.js.map +1 -1
  69. package/dist/models/IModel.js +1 -0
  70. package/dist/models/IPanel.js +53 -0
  71. package/dist/models/ITheme.js +20 -0
  72. package/dist/models/IWinningBet.js +1 -0
  73. package/dist/modules/bets/interfaces/IBets.js +1 -0
  74. package/dist/modules/bets/mocks.js +572 -0
  75. package/dist/modules/bets/view/BetsView.js +116 -0
  76. package/dist/modules/bets/view/HotProps/HotPropsView.js +139 -0
  77. package/dist/modules/bets/view/SixPack/SixPackView.js +103 -0
  78. package/dist/modules/bets/view/TabLoadFailureView.js +12 -0
  79. package/dist/modules/bets/view/UserBets/BetResult/BetResult.js +6 -0
  80. package/dist/modules/bets/view/UserBets/BetsCard/BetsCard.js +122 -0
  81. package/dist/modules/bets/view/UserBets/BetsCard/BetsCardEvent.js +34 -0
  82. package/dist/modules/bets/view/UserBets/BetsCard/BetsCardFooter.js +22 -0
  83. package/dist/modules/bets/view/UserBets/Boost/Boost.js +6 -0
  84. package/dist/modules/bets/view/UserBets/OutcomeBadge/OutcomeBadge.js +9 -0
  85. package/dist/modules/bets/view/UserBets/Parlay/Parlay.js +13 -0
  86. package/dist/modules/bets/view/UserBets/Straight/Straight.js +6 -0
  87. package/dist/modules/bets/view/UserBets/Teaser/Teaser.js +13 -0
  88. package/dist/modules/bets/view/UserBets/UserBetsView.js +114 -0
  89. package/dist/modules/bets/view/components/Bet/Bet.js +32 -0
  90. package/dist/modules/bets/view/components/BetPill/BetPill.js +6 -0
  91. package/dist/modules/bets/view/components/BetsCard/BetsCard.js +15 -0
  92. package/dist/modules/bets/view/components/BetsCard/BetsCardHeader.js +20 -0
  93. package/dist/modules/bets/view/components/GamblingDisclaimer/GamblingDisclaimer.js +14 -0
  94. package/dist/modules/bets/view/components/LocationWarning/LocationWarning.js +16 -0
  95. package/dist/modules/bets/view/components/PromoCodeBanner/PromoCodeBanner.js +63 -0
  96. package/dist/modules/bets/view/components/PromoCodeBanner/index.d.ts +1 -1
  97. package/dist/modules/bets/view/components/PromoCodeBanner/index.js +1 -0
  98. package/dist/modules/bets/view-model/BetsViewModel.js +767 -0
  99. package/dist/modules/key-plays/constants.js +292 -0
  100. package/dist/modules/key-plays/interfaces/IKeyPlays.d.ts +4 -4
  101. package/dist/modules/key-plays/interfaces/IKeyPlays.js +14 -0
  102. package/dist/modules/key-plays/interfaces/IKeyPlaysResponse.js +1 -0
  103. package/dist/modules/key-plays/view/KeyPlayCardScoreTagView.js +13 -0
  104. package/dist/modules/key-plays/view/KeyPlayCardView.js +142 -0
  105. package/dist/modules/key-plays/view/KeyPlayErrorStateView.js +58 -0
  106. package/dist/modules/key-plays/view/KeyPlaysView.js +167 -0
  107. package/dist/modules/key-plays/view-model/KeyPlaysViewModel.js +182 -0
  108. package/dist/modules/stats/interfaces/IStats.d.ts +163 -0
  109. package/dist/modules/stats/interfaces/IStats.js +1 -0
  110. package/dist/modules/stats/mocks.d.ts +2 -0
  111. package/dist/modules/stats/mocks.js +546 -0
  112. package/dist/modules/stats/utils.d.ts +39 -0
  113. package/dist/modules/stats/utils.js +62 -0
  114. package/dist/modules/stats/view/GameLeaders/GameLeaders.d.ts +29 -0
  115. package/dist/modules/stats/view/GameLeaders/GameLeaders.js +9 -0
  116. package/dist/modules/stats/view/GameLeaders/index.d.ts +2 -0
  117. package/dist/modules/stats/view/GameLeaders/index.js +2 -0
  118. package/dist/modules/stats/view/MatchPredictor/DonutChart/DonutChart.d.ts +17 -0
  119. package/dist/modules/stats/view/MatchPredictor/DonutChart/DonutChart.js +55 -0
  120. package/dist/modules/stats/view/MatchPredictor/DonutChart/index.d.ts +2 -0
  121. package/dist/modules/stats/view/MatchPredictor/DonutChart/index.js +1 -0
  122. package/dist/modules/stats/view/MatchPredictor/MatchPredictorView.d.ts +52 -0
  123. package/dist/modules/stats/view/MatchPredictor/MatchPredictorView.js +66 -0
  124. package/dist/modules/stats/view/MatchPredictor/index.d.ts +3 -0
  125. package/dist/modules/stats/view/MatchPredictor/index.js +2 -0
  126. package/dist/modules/stats/view/RecentGames/RecentGames.d.ts +62 -0
  127. package/dist/modules/stats/view/RecentGames/RecentGames.js +22 -0
  128. package/dist/modules/stats/view/RecentGames/index.d.ts +2 -0
  129. package/dist/modules/stats/view/RecentGames/index.js +2 -0
  130. package/dist/modules/stats/view/StatsQRCode/StatsQRCodeView.d.ts +51 -0
  131. package/dist/modules/stats/view/StatsQRCode/StatsQRCodeView.js +38 -0
  132. package/dist/modules/stats/view/StatsQRCode/index.d.ts +2 -0
  133. package/dist/modules/stats/view/StatsQRCode/index.js +1 -0
  134. package/dist/modules/stats/view/StatsView.d.ts +20 -0
  135. package/dist/modules/stats/view/StatsView.js +87 -0
  136. package/dist/modules/stats/view/Teams/StatsCarousel.d.ts +8 -0
  137. package/dist/modules/stats/view/Teams/StatsCarousel.js +14 -0
  138. package/dist/modules/stats/view/Teams/StatsProgressBar.d.ts +7 -0
  139. package/dist/modules/stats/view/Teams/StatsProgressBar.js +14 -0
  140. package/dist/modules/stats/view/Teams/Teams.d.ts +67 -0
  141. package/dist/modules/stats/view/Teams/Teams.js +35 -0
  142. package/dist/modules/stats/view/Teams/index.d.ts +2 -0
  143. package/dist/modules/stats/view/Teams/index.js +2 -0
  144. package/dist/modules/stats/view/WinProbability/WinProbability.d.ts +62 -0
  145. package/dist/modules/stats/view/WinProbability/WinProbability.js +27 -0
  146. package/dist/modules/stats/view/WinProbability/index.d.ts +2 -0
  147. package/dist/modules/stats/view/WinProbability/index.js +2 -0
  148. package/dist/modules/stats/view/components/AthletesStatistics/AthletesStatistics.d.ts +51 -0
  149. package/dist/modules/stats/view/components/AthletesStatistics/AthletesStatistics.js +28 -0
  150. package/dist/modules/stats/view/components/AthletesStatistics/StatisticTable.d.ts +10 -0
  151. package/dist/modules/stats/view/components/AthletesStatistics/StatisticTable.js +11 -0
  152. package/dist/modules/stats/view/components/AthletesStatistics/index.d.ts +2 -0
  153. package/dist/modules/stats/view/components/AthletesStatistics/index.js +2 -0
  154. package/dist/modules/stats/view/index.d.ts +1 -0
  155. package/dist/modules/stats/view/index.js +1 -0
  156. package/dist/modules/stats/view-model/StatsViewModel.d.ts +31 -0
  157. package/dist/modules/stats/view-model/StatsViewModel.js +90 -0
  158. package/dist/services/BetsService.js +102 -0
  159. package/dist/services/NetworkManager/NetworkManager.js +410 -0
  160. package/dist/services/NetworkManager/errors.js +45 -0
  161. package/dist/services/ThemeManager/constants.js +47 -0
  162. package/dist/test-polyfills.d.ts +1 -0
  163. package/dist/test-polyfills.js +15 -0
  164. package/dist/types/OverlayTypes.js +4 -0
  165. package/dist/view-models/MaestroEventViewModel.d.ts +2 -0
  166. package/dist/view-models/MaestroEventViewModel.js +156 -0
  167. package/dist/view-models/OverlayViewModel.js +222 -0
  168. package/dist/view-models/PanelManagerViewModel.js +80 -0
  169. package/dist/view-models/ViewModel.js +32 -0
  170. package/dist/view-models/index.js +59 -0
  171. package/package.json +1 -1
@@ -0,0 +1,156 @@
1
+ import { Observable } from '../helpers/Observable';
2
+ import { ViewModel } from './ViewModel';
3
+ import KeyPlaysViewModel from '../modules/key-plays/view-model/KeyPlaysViewModel';
4
+ import BetsViewModel from '../modules/bets/view-model/BetsViewModel';
5
+ import SpatialNavigation from '@/external/spatial-navigation/spatialNavigation';
6
+ import StatsViewModel from '../modules/stats/view-model/StatsViewModel';
7
+ export class MaestroEventViewModel extends ViewModel {
8
+ constructor(eventId = '', delegate) {
9
+ super();
10
+ Object.defineProperty(this, "_eventId", {
11
+ enumerable: true,
12
+ configurable: true,
13
+ writable: true,
14
+ value: new Observable('')
15
+ });
16
+ Object.defineProperty(this, "_title", {
17
+ enumerable: true,
18
+ configurable: true,
19
+ writable: true,
20
+ value: new Observable('')
21
+ });
22
+ Object.defineProperty(this, "_isLive", {
23
+ enumerable: true,
24
+ configurable: true,
25
+ writable: true,
26
+ value: new Observable(false)
27
+ });
28
+ Object.defineProperty(this, "_isShowingPanel", {
29
+ enumerable: true,
30
+ configurable: true,
31
+ writable: true,
32
+ value: new Observable(false)
33
+ });
34
+ Object.defineProperty(this, "delegate", {
35
+ enumerable: true,
36
+ configurable: true,
37
+ writable: true,
38
+ value: void 0
39
+ });
40
+ Object.defineProperty(this, "keyPlaysViewModel", {
41
+ enumerable: true,
42
+ configurable: true,
43
+ writable: true,
44
+ value: new KeyPlaysViewModel()
45
+ });
46
+ Object.defineProperty(this, "betsViewModel", {
47
+ enumerable: true,
48
+ configurable: true,
49
+ writable: true,
50
+ value: void 0
51
+ });
52
+ Object.defineProperty(this, "statsViewModel", {
53
+ enumerable: true,
54
+ configurable: true,
55
+ writable: true,
56
+ value: void 0
57
+ });
58
+ this._eventId.value = eventId;
59
+ this.delegate = delegate;
60
+ this.betsViewModel = new BetsViewModel(eventId, delegate);
61
+ this.statsViewModel = new StatsViewModel(eventId, { useMockData: true });
62
+ SpatialNavigation.init();
63
+ }
64
+ deinit() {
65
+ this.betsViewModel.cleanup();
66
+ this.statsViewModel.cleanup();
67
+ SpatialNavigation.destroy();
68
+ }
69
+ updateKeyPlaysData(data) {
70
+ return this.keyPlaysViewModel.setKeyPlays(data);
71
+ }
72
+ startFocusManagement() {
73
+ SpatialNavigation.setFocus('');
74
+ SpatialNavigation.resume();
75
+ setTimeout(() => {
76
+ SpatialNavigation.setFocus('PANEL_NAV_BUTTON_0');
77
+ }, 0);
78
+ return Promise.resolve();
79
+ }
80
+ didStartPlayingClip(index) {
81
+ this.keyPlaysViewModel.lastPlayedClipIndex.value = index;
82
+ this.keyPlaysViewModel.currentClipPlaybackProgress.value = 0;
83
+ this.keyPlaysViewModel.currentlyPlayingClipIndex.value = index;
84
+ this.keyPlaysViewModel.clearLoadFailureStatus(index);
85
+ }
86
+ didStopPlayingClip(index) {
87
+ this.keyPlaysViewModel.lastPlayedClipIndex.value = index;
88
+ this.keyPlaysViewModel.currentlyPlayingClipIndex.value = null;
89
+ this.keyPlaysViewModel.currentClipPlaybackProgress.value = null;
90
+ }
91
+ didFailToPlayClip(index) {
92
+ this.keyPlaysViewModel.handleKeyPlayLoadFailure(index);
93
+ }
94
+ didUpdatePlaybackProgressOfClip(index, to) {
95
+ this.keyPlaysViewModel.currentClipPlaybackProgress.value = to;
96
+ this.keyPlaysViewModel.clearLoadFailureStatus(index);
97
+ }
98
+ didShowPanel() {
99
+ this.isShowingPanel = true;
100
+ // Analytics call ?
101
+ return Promise.resolve();
102
+ }
103
+ async didHidePanel() {
104
+ this.isShowingPanel = false;
105
+ SpatialNavigation.pause();
106
+ // Analytics call?
107
+ }
108
+ didShowOverlay() {
109
+ throw new Error('Method not implemented.');
110
+ }
111
+ didHideOverlay() {
112
+ throw new Error('Method not implemented.');
113
+ }
114
+ currentEventDoesNotSupportKeyPlays() {
115
+ this.keyPlaysViewModel.errorState.value = 'unsupportedEvent';
116
+ }
117
+ getCurrentEventID() {
118
+ return this.eventId.value;
119
+ }
120
+ getCurrentlyPlayingClipIndex() {
121
+ return this.keyPlaysViewModel.currentlyPlayingClipIndex.value;
122
+ }
123
+ getLastPlayedClipIndex() {
124
+ return this.keyPlaysViewModel.lastPlayedClipIndex.value;
125
+ }
126
+ getCurrentClipPlaybackProgress() {
127
+ return this.keyPlaysViewModel.currentClipPlaybackProgress.value;
128
+ }
129
+ getKeyPlaysCount() {
130
+ return this.keyPlaysViewModel.allItems.length;
131
+ }
132
+ get eventId() {
133
+ return this._eventId;
134
+ }
135
+ get title() {
136
+ return this._title;
137
+ }
138
+ get isLive() {
139
+ return this._isLive;
140
+ }
141
+ get isShowingPanel() {
142
+ return this._isShowingPanel.value;
143
+ }
144
+ set isShowingPanel(value) {
145
+ this._isShowingPanel.value = value;
146
+ }
147
+ simulateUseCase(useCase, panelType, testData) {
148
+ switch (panelType) {
149
+ case 'bets':
150
+ this.betsViewModel.simulateUseCase(useCase, testData);
151
+ break;
152
+ default:
153
+ throw new Error(`Unsupported panel type: ${panelType}`);
154
+ }
155
+ }
156
+ }
@@ -0,0 +1,222 @@
1
+ import { Observable } from '../helpers/Observable';
2
+ import { ViewModel } from './ViewModel';
3
+ import { OverlayType, } from '../types/OverlayTypes';
4
+ const AUTO_DISMISS_TIMEOUT = 10400; // 10.4 seconds
5
+ export class OverlayViewModel extends ViewModel {
6
+ constructor(analyticsService) {
7
+ super();
8
+ Object.defineProperty(this, "_isVisible", {
9
+ enumerable: true,
10
+ configurable: true,
11
+ writable: true,
12
+ value: new Observable(false)
13
+ });
14
+ Object.defineProperty(this, "_currentOverlay", {
15
+ enumerable: true,
16
+ configurable: true,
17
+ writable: true,
18
+ value: new Observable(null)
19
+ });
20
+ Object.defineProperty(this, "_autoDismiss", {
21
+ enumerable: true,
22
+ configurable: true,
23
+ writable: true,
24
+ value: new Observable(true)
25
+ });
26
+ Object.defineProperty(this, "_overlayQueue", {
27
+ enumerable: true,
28
+ configurable: true,
29
+ writable: true,
30
+ value: new Observable([])
31
+ });
32
+ Object.defineProperty(this, "_hasTrackedView", {
33
+ enumerable: true,
34
+ configurable: true,
35
+ writable: true,
36
+ value: new Observable(false)
37
+ });
38
+ Object.defineProperty(this, "autoDismissTimeout", {
39
+ enumerable: true,
40
+ configurable: true,
41
+ writable: true,
42
+ value: null
43
+ });
44
+ Object.defineProperty(this, "analyticsService", {
45
+ enumerable: true,
46
+ configurable: true,
47
+ writable: true,
48
+ value: void 0
49
+ });
50
+ this.analyticsService = analyticsService;
51
+ }
52
+ get isVisible() {
53
+ return this._isVisible;
54
+ }
55
+ get currentOverlay() {
56
+ return this._currentOverlay;
57
+ }
58
+ get autoDismiss() {
59
+ return this._autoDismiss;
60
+ }
61
+ get overlayQueue() {
62
+ return this._overlayQueue;
63
+ }
64
+ get overlayTitle() {
65
+ const overlay = this._currentOverlay.value;
66
+ if (!overlay)
67
+ return '';
68
+ switch (overlay.type) {
69
+ case OverlayType.WinningBet:
70
+ return 'You won your bet!';
71
+ case OverlayType.FantasyPlayerEvent:
72
+ return overlay.fantasy?.title ?? 'Fantasy Update';
73
+ default:
74
+ return '';
75
+ }
76
+ }
77
+ get overlayMetadata() {
78
+ const overlay = this._currentOverlay.value;
79
+ if (!overlay)
80
+ return '';
81
+ switch (overlay.type) {
82
+ case OverlayType.WinningBet:
83
+ return (overlay.winningBet?.notificationText ??
84
+ 'Click OK to view your winning bets.');
85
+ case OverlayType.FantasyPlayerEvent:
86
+ return overlay.fantasy?.metadata ?? 'New Player Activity';
87
+ default:
88
+ return '';
89
+ }
90
+ }
91
+ showOverlay(overlayEvent) {
92
+ // If an overlay is already visible, queue this one
93
+ if (this._isVisible.value) {
94
+ const currentQueue = this._overlayQueue.value;
95
+ this._overlayQueue.value = [...currentQueue, overlayEvent];
96
+ return;
97
+ }
98
+ // Show the overlay
99
+ this._currentOverlay.value = overlayEvent;
100
+ this._isVisible.value = true;
101
+ this._hasTrackedView.value = false;
102
+ this._autoDismiss.value = true;
103
+ // Set up auto-dismiss
104
+ this.setupAutoDismiss();
105
+ }
106
+ hideOverlay() {
107
+ // Clear auto-dismiss timeout
108
+ if (this.autoDismissTimeout) {
109
+ clearTimeout(this.autoDismissTimeout);
110
+ this.autoDismissTimeout = null;
111
+ }
112
+ // Check if there are queued overlays
113
+ const queue = this._overlayQueue.value;
114
+ if (queue.length > 0) {
115
+ // Show next overlay in queue
116
+ const nextOverlay = queue[0];
117
+ const remainingQueue = queue.slice(1);
118
+ this._overlayQueue.value = remainingQueue;
119
+ this._currentOverlay.value = nextOverlay;
120
+ this._hasTrackedView.value = false;
121
+ this._autoDismiss.value = true; // Reset auto-dismiss for queued overlay
122
+ // Keep _isVisible as true since we're showing another overlay
123
+ // Set up auto-dismiss for next overlay
124
+ this.setupAutoDismiss();
125
+ }
126
+ else {
127
+ // No more overlays, hide completely
128
+ this._isVisible.value = false;
129
+ this._currentOverlay.value = null;
130
+ }
131
+ }
132
+ handleOverlayClick() {
133
+ const overlay = this._currentOverlay.value;
134
+ if (!overlay)
135
+ return;
136
+ // Track click event
137
+ this.trackOverlayClicked();
138
+ // Handle overlay-specific actions
139
+ switch (overlay.type) {
140
+ case OverlayType.WinningBet:
141
+ this._autoDismiss.value = false;
142
+ // TODO: Navigate to bets panel and deep link to specific bet
143
+ break;
144
+ case OverlayType.FantasyPlayerEvent:
145
+ // Fantasy overlay handled
146
+ break;
147
+ }
148
+ // Hide current overlay
149
+ this.hideOverlay();
150
+ }
151
+ trackOverlayViewed() {
152
+ if (this._hasTrackedView.value)
153
+ return;
154
+ const overlay = this._currentOverlay.value;
155
+ if (!overlay)
156
+ return;
157
+ this._hasTrackedView.value = true;
158
+ const event = {
159
+ eventName: 'overlayViewed',
160
+ attributes: {
161
+ template: 'espn_bet',
162
+ templateId: '',
163
+ instanceName: this.overlayTitle,
164
+ instanceId: this.getInstanceId(overlay),
165
+ fullscreen: false,
166
+ overlayType: overlay.type,
167
+ },
168
+ };
169
+ this.analyticsService.track(event);
170
+ }
171
+ trackOverlayClicked() {
172
+ const overlay = this._currentOverlay.value;
173
+ if (!overlay)
174
+ return;
175
+ const event = {
176
+ eventName: 'overlayClicked',
177
+ attributes: {
178
+ template: 'espn_bet',
179
+ templateId: '',
180
+ instanceName: this.overlayTitle,
181
+ instanceId: this.getInstanceId(overlay),
182
+ fullscreen: false,
183
+ overlayType: overlay.type,
184
+ },
185
+ };
186
+ this.analyticsService.track(event);
187
+ }
188
+ handleOverlayViewed(_overlayType) {
189
+ // Track that the overlay was viewed
190
+ this.trackOverlayViewed();
191
+ }
192
+ handleOverlayAction(_overlayType) {
193
+ // Track that the overlay was clicked/actioned
194
+ this.trackOverlayClicked();
195
+ }
196
+ cleanup() {
197
+ if (this.autoDismissTimeout) {
198
+ clearTimeout(this.autoDismissTimeout);
199
+ this.autoDismissTimeout = null;
200
+ }
201
+ }
202
+ setupAutoDismiss() {
203
+ if (this.autoDismissTimeout) {
204
+ clearTimeout(this.autoDismissTimeout);
205
+ }
206
+ this.autoDismissTimeout = setTimeout(() => {
207
+ if (this._autoDismiss.value) {
208
+ this.hideOverlay();
209
+ }
210
+ }, AUTO_DISMISS_TIMEOUT);
211
+ }
212
+ getInstanceId(overlay) {
213
+ switch (overlay.type) {
214
+ case OverlayType.WinningBet:
215
+ return overlay.winningBet?.serverID ?? '';
216
+ case OverlayType.FantasyPlayerEvent:
217
+ return overlay.fantasy?.athleteId ?? '';
218
+ default:
219
+ return '';
220
+ }
221
+ }
222
+ }
@@ -0,0 +1,80 @@
1
+ import { Observable } from '../helpers/Observable';
2
+ import { MaestroPanelType } from '../models/IPanel';
3
+ export class PanelManagerViewModel {
4
+ constructor() {
5
+ Object.defineProperty(this, "_panels", {
6
+ enumerable: true,
7
+ configurable: true,
8
+ writable: true,
9
+ value: new Observable([
10
+ MaestroPanelType.KEY_PLAYS,
11
+ MaestroPanelType.STATS,
12
+ MaestroPanelType.FANTASY,
13
+ MaestroPanelType.BETS,
14
+ ])
15
+ });
16
+ Object.defineProperty(this, "_currentPanel", {
17
+ enumerable: true,
18
+ configurable: true,
19
+ writable: true,
20
+ value: new Observable(MaestroPanelType.KEY_PLAYS)
21
+ });
22
+ Object.defineProperty(this, "_newlyFocusedPanel", {
23
+ enumerable: true,
24
+ configurable: true,
25
+ writable: true,
26
+ value: new Observable(null)
27
+ });
28
+ }
29
+ // Getter for panels
30
+ get panels() {
31
+ return this._panels.value;
32
+ }
33
+ // Getter for panels observable
34
+ get panelsObservable() {
35
+ return this._panels;
36
+ }
37
+ // Getter for currentPanel
38
+ get currentPanel() {
39
+ return this._currentPanel.value;
40
+ }
41
+ // Setter for currentPanel
42
+ set currentPanel(value) {
43
+ this._currentPanel.value = value;
44
+ }
45
+ // Getter for currentPanel as Observable
46
+ get currentPanelObservable() {
47
+ return this._currentPanel;
48
+ }
49
+ // Getter for newlyFocusedPanel
50
+ get newlyFocusedPanel() {
51
+ return this._newlyFocusedPanel.value;
52
+ }
53
+ // Setter for newlyFocusedPanel
54
+ set newlyFocusedPanel(value) {
55
+ this._newlyFocusedPanel.value = value;
56
+ }
57
+ // Get the index of a specific panel type
58
+ getIndex(forPanelType) {
59
+ const index = this.panels.findIndex((p) => p === forPanelType);
60
+ return index !== -1 ? index : null;
61
+ }
62
+ // Get the panel type at a specific index
63
+ getPanelType(atIndex) {
64
+ return this.panels[atIndex] || null;
65
+ }
66
+ // Computed property for panel to the left
67
+ get panelTypeToLeft() {
68
+ const currentIndex = this.getIndex(this.currentPanel);
69
+ if (currentIndex === null || currentIndex === 0)
70
+ return null;
71
+ return this.getPanelType(currentIndex - 1);
72
+ }
73
+ // Computed property for panel to the right
74
+ get panelTypeToRight() {
75
+ const currentIndex = this.getIndex(this.currentPanel);
76
+ if (currentIndex === null || currentIndex === this.panels.length - 1)
77
+ return null;
78
+ return this.getPanelType(currentIndex + 1);
79
+ }
80
+ }
@@ -0,0 +1,32 @@
1
+ import { Observable } from '../helpers/Observable';
2
+ /**
3
+ * Base view model that implements reactive properties
4
+ */
5
+ export class ViewModel {
6
+ constructor() {
7
+ Object.defineProperty(this, "_isLoading", {
8
+ enumerable: true,
9
+ configurable: true,
10
+ writable: true,
11
+ value: new Observable(false)
12
+ });
13
+ Object.defineProperty(this, "_error", {
14
+ enumerable: true,
15
+ configurable: true,
16
+ writable: true,
17
+ value: new Observable(null)
18
+ });
19
+ }
20
+ get isLoading() {
21
+ return this._isLoading;
22
+ }
23
+ get error() {
24
+ return this._error;
25
+ }
26
+ setLoading(loading) {
27
+ this._isLoading.value = loading;
28
+ }
29
+ setError(error) {
30
+ this._error.value = error;
31
+ }
32
+ }
@@ -0,0 +1,59 @@
1
+ import { MaestroEventViewModel } from './MaestroEventViewModel';
2
+ import { PanelManagerViewModel } from './PanelManagerViewModel';
3
+ import { OverlayViewModel } from './OverlayViewModel';
4
+ import KeyPlaysViewModel from '../modules/key-plays/view-model/KeyPlaysViewModel';
5
+ /**
6
+ * Aggregates all View Models
7
+ */
8
+ export class MaestroViewModels {
9
+ constructor(eventViewModel) {
10
+ Object.defineProperty(this, "eventViewModel", {
11
+ enumerable: true,
12
+ configurable: true,
13
+ writable: true,
14
+ value: void 0
15
+ });
16
+ Object.defineProperty(this, "panelManagerViewModel", {
17
+ enumerable: true,
18
+ configurable: true,
19
+ writable: true,
20
+ value: void 0
21
+ });
22
+ Object.defineProperty(this, "keyPlaysViewModel", {
23
+ enumerable: true,
24
+ configurable: true,
25
+ writable: true,
26
+ value: void 0
27
+ });
28
+ Object.defineProperty(this, "overlayViewModel", {
29
+ enumerable: true,
30
+ configurable: true,
31
+ writable: true,
32
+ value: void 0
33
+ });
34
+ this.eventViewModel = eventViewModel;
35
+ this.panelManagerViewModel = new PanelManagerViewModel();
36
+ this.keyPlaysViewModel = new KeyPlaysViewModel();
37
+ const analyticsService = {
38
+ track: (event) => {
39
+ // TODO: Implement real analytics
40
+ console.log('Overlay analytics:', event);
41
+ },
42
+ };
43
+ // Create overlay view model - SDK handles all UI directly
44
+ this.overlayViewModel = new OverlayViewModel(analyticsService);
45
+ }
46
+ /**
47
+ * Creates view models from an event ID
48
+ */
49
+ static async fromEventId(eventId, delegate) {
50
+ try {
51
+ const eventViewModel = new MaestroEventViewModel(eventId, delegate);
52
+ return new MaestroViewModels(eventViewModel);
53
+ }
54
+ catch (error) {
55
+ console.error('Error creating view models from event ID', error);
56
+ return null;
57
+ }
58
+ }
59
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@maestro_io/maestro-web-sdk",
3
3
  "private": false,
4
- "version": "2.1.1",
4
+ "version": "2.1.2",
5
5
  "type": "commonjs",
6
6
  "license": "MIT",
7
7
  "main": "dist/maestro-web-sdk.umd.js",