@maestro_io/maestro-web-sdk 2.1.2 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/dist/MaestroEventDelegate.d.ts +1 -0
  2. package/dist/components/atoms/Rive/index.d.ts +1 -0
  3. package/dist/components/atoms/SvgIcon/Icon.d.ts +0 -2
  4. package/dist/components/core/ScrollableContainer/ScrollableContainer.d.ts +3 -1
  5. package/dist/components/molecules/ActionButton/ActionButton.d.ts +1 -0
  6. package/dist/components/molecules/PanelNavButton/PanelNavButton.d.ts +1 -0
  7. package/dist/components/organisms/SegmentController/SegmentController.d.ts +2 -2
  8. package/dist/external/spatial-navigation/index.d.ts +2 -3
  9. package/dist/external/spatial-navigation/spatialNavigation.d.ts +3 -5
  10. package/dist/external/spatial-navigation/withFocusable.d.ts +1 -0
  11. package/dist/interfaces/IMaestroEvent.d.ts +14 -0
  12. package/dist/interfaces/IMaestroEventDelegate.d.ts +19 -6
  13. package/dist/maestro-web-sdk.umd.js +3 -3
  14. package/dist/maestro-web-sdk.umd.js.map +1 -1
  15. package/dist/models/IPanel.d.ts +1 -2
  16. package/dist/modules/bets/view/HotProps/HotPropsView.d.ts +7 -6
  17. package/dist/modules/bets/view/SixPack/SixPackView.d.ts +2 -2
  18. package/dist/modules/bets/view/TabLoadFailureView.d.ts +1 -0
  19. package/dist/modules/bets/view/UserBets/BetsCard/BetsCard.d.ts +7 -6
  20. package/dist/modules/bets/view/components/Bet/Bet.d.ts +1 -0
  21. package/dist/modules/bets/view/components/PromoCodeBanner/PromoCodeBanner.d.ts +2 -2
  22. package/dist/modules/key-plays/view/KeyPlayCardView.d.ts +0 -4
  23. package/dist/modules/stats/interfaces/IStats.d.ts +44 -15
  24. package/dist/modules/stats/utils/driveSummaryUtils.d.ts +18 -0
  25. package/dist/modules/stats/utils/renderTeamStatistic.d.ts +21 -0
  26. package/dist/modules/stats/view/ActiveAthletes/ActiveAthletes.d.ts +21 -0
  27. package/dist/modules/stats/view/ActiveAthletes/CollapsedAthletes/CollapsedAthletes.d.ts +5 -0
  28. package/dist/modules/stats/view/ActiveAthletes/ExpandedAthletes/ExpandedAthletes.d.ts +10 -0
  29. package/dist/modules/stats/view/ActiveAthletes/index.d.ts +2 -0
  30. package/dist/modules/stats/view/DriveSummary/DrivePlayCard.d.ts +26 -0
  31. package/dist/modules/stats/view/DriveSummary/DriveSummary.d.ts +24 -0
  32. package/dist/modules/stats/view/DriveSummary/index.d.ts +2 -0
  33. package/dist/modules/stats/view/GameLeaders/GameLeaders.d.ts +15 -25
  34. package/dist/modules/stats/view/MatchPredictor/MatchPredictorView.d.ts +13 -47
  35. package/dist/modules/stats/view/RecentGames/RecentGames.d.ts +11 -21
  36. package/dist/modules/stats/view/StatsItemView.d.ts +19 -0
  37. package/dist/modules/stats/view/StatsQRCode/StatsQRCodeView.d.ts +1 -0
  38. package/dist/modules/stats/view/StatsView.d.ts +3 -3
  39. package/dist/modules/stats/view/TeamStats/TeamStatsView.d.ts +52 -0
  40. package/dist/modules/stats/view/TeamStats/index.d.ts +2 -0
  41. package/dist/modules/stats/view/Teams/Teams.d.ts +11 -26
  42. package/dist/modules/stats/view/WinProbability/WinProbability.d.ts +11 -21
  43. package/dist/modules/stats/view/components/AthletesStatistics/AthletesStatistics.d.ts +19 -3
  44. package/dist/modules/stats/view/components/AthletesStatistics/StatisticTable.d.ts +2 -8
  45. package/dist/modules/stats/view/index.d.ts +1 -0
  46. package/dist/modules/stats/view-model/StatsViewModel.d.ts +149 -5
  47. package/dist/services/StatsService.d.ts +36 -0
  48. package/dist/view-models/MaestroEventViewModel.d.ts +7 -0
  49. package/package.json +1 -1
  50. package/dist/MaestroEventDelegate.js +0 -60
  51. package/dist/components/atoms/BaseButton/BaseButton.js +0 -11
  52. package/dist/components/atoms/BaseButton/index.js +0 -2
  53. package/dist/components/atoms/Image/index.js +0 -30
  54. package/dist/components/atoms/Rive/index.js +0 -52
  55. package/dist/components/atoms/SvgIcon/BetGeneralIcon.js +0 -9
  56. package/dist/components/atoms/SvgIcon/BetsIcon.js +0 -11
  57. package/dist/components/atoms/SvgIcon/BetsWarningIcon.js +0 -11
  58. package/dist/components/atoms/SvgIcon/CheckmarkIcon.js +0 -6
  59. package/dist/components/atoms/SvgIcon/CollapseIcon.js +0 -6
  60. package/dist/components/atoms/SvgIcon/ExpandIcon.js +0 -6
  61. package/dist/components/atoms/SvgIcon/FantasyIcon.d.ts +0 -6
  62. package/dist/components/atoms/SvgIcon/FantasyIcon.js +0 -8
  63. package/dist/components/atoms/SvgIcon/FlameIcon.js +0 -11
  64. package/dist/components/atoms/SvgIcon/Icon.js +0 -42
  65. package/dist/components/atoms/SvgIcon/KeyPlaysIcon.js +0 -10
  66. package/dist/components/atoms/SvgIcon/MobilePhoneIcon.js +0 -11
  67. package/dist/components/atoms/SvgIcon/PlayIcon.js +0 -8
  68. package/dist/components/atoms/SvgIcon/StatsIcon.js +0 -12
  69. package/dist/components/atoms/SvgIcon/TimesIcon.js +0 -6
  70. package/dist/components/atoms/SvgIcon/WarningIcon.js +0 -8
  71. package/dist/components/atoms/SvgIcon/index.js +0 -2
  72. package/dist/components/core/App/App.js +0 -41
  73. package/dist/components/core/App/index.js +0 -2
  74. package/dist/components/core/OverlayContainer.js +0 -58
  75. package/dist/components/core/PanelManager/PanelManager.js +0 -80
  76. package/dist/components/core/PanelManager/index.js +0 -2
  77. package/dist/components/core/ScrollableContainer/FocusableItem.js +0 -38
  78. package/dist/components/core/ScrollableContainer/ScrollableContainer.js +0 -166
  79. package/dist/components/core/ScrollableContainer/index.js +0 -2
  80. package/dist/components/molecules/ActionButton/ActionButton.js +0 -10
  81. package/dist/components/molecules/ActionButton/index.js +0 -2
  82. package/dist/components/molecules/Overlay/Overlay.js +0 -139
  83. package/dist/components/molecules/Overlay/index.js +0 -2
  84. package/dist/components/molecules/PanelNavButton/PanelNavButton.js +0 -40
  85. package/dist/components/molecules/PanelNavButton/index.js +0 -2
  86. package/dist/components/molecules/SegmentButton/SegmentButton.js +0 -10
  87. package/dist/components/molecules/SegmentButton/index.js +0 -2
  88. package/dist/components/molecules/WatchButton/WatchButton.js +0 -15
  89. package/dist/components/molecules/WatchButton/index.js +0 -2
  90. package/dist/components/organisms/PanelNavigation/PanelNavigation.js +0 -72
  91. package/dist/components/organisms/PanelNavigation/index.js +0 -2
  92. package/dist/components/organisms/SegmentController/SegmentController.js +0 -69
  93. package/dist/components/organisms/SegmentController/index.js +0 -2
  94. package/dist/external/AxiosNetworkClient.js +0 -83
  95. package/dist/external/LocalStorageCacheManager.js +0 -213
  96. package/dist/external/ReactRenderer.js +0 -86
  97. package/dist/external/mocks/MockExternalNetworkClient.js +0 -161
  98. package/dist/external/ports/cacheManager.js +0 -1
  99. package/dist/external/ports/networkClient.js +0 -1
  100. package/dist/external/ports/renderer.js +0 -1
  101. package/dist/external/spatial-navigation/index.js +0 -4
  102. package/dist/external/spatial-navigation/measureLayout.js +0 -30
  103. package/dist/external/spatial-navigation/spatialNavigation.js +0 -875
  104. package/dist/external/spatial-navigation/utils.js +0 -6
  105. package/dist/external/spatial-navigation/visualDebugger.js +0 -76
  106. package/dist/external/spatial-navigation/withFocusable.js +0 -238
  107. package/dist/helpers/Observable.js +0 -37
  108. package/dist/helpers/deliver-focus.d.ts +0 -5
  109. package/dist/helpers/deliver-focus.js +0 -12
  110. package/dist/index.js +0 -192
  111. package/dist/interfaces/IMaestroEvent.js +0 -6
  112. package/dist/interfaces/IMaestroEventDelegate.js +0 -1
  113. package/dist/interfaces/IMaestroManager.js +0 -1
  114. package/dist/models/IModel.js +0 -1
  115. package/dist/models/IPanel.js +0 -53
  116. package/dist/models/ITheme.js +0 -20
  117. package/dist/models/IWinningBet.js +0 -1
  118. package/dist/modules/bets/interfaces/IBets.js +0 -1
  119. package/dist/modules/bets/mocks.js +0 -572
  120. package/dist/modules/bets/view/BetsView.js +0 -116
  121. package/dist/modules/bets/view/HotProps/HotPropsView.js +0 -139
  122. package/dist/modules/bets/view/SixPack/SixPackView.js +0 -103
  123. package/dist/modules/bets/view/TabLoadFailureView.js +0 -12
  124. package/dist/modules/bets/view/UserBets/BetResult/BetResult.js +0 -6
  125. package/dist/modules/bets/view/UserBets/BetsCard/BetsCard.js +0 -122
  126. package/dist/modules/bets/view/UserBets/BetsCard/BetsCardEvent.js +0 -34
  127. package/dist/modules/bets/view/UserBets/BetsCard/BetsCardFooter.js +0 -22
  128. package/dist/modules/bets/view/UserBets/Boost/Boost.js +0 -6
  129. package/dist/modules/bets/view/UserBets/OutcomeBadge/OutcomeBadge.js +0 -9
  130. package/dist/modules/bets/view/UserBets/Parlay/Parlay.js +0 -13
  131. package/dist/modules/bets/view/UserBets/Straight/Straight.js +0 -6
  132. package/dist/modules/bets/view/UserBets/Teaser/Teaser.js +0 -13
  133. package/dist/modules/bets/view/UserBets/UserBetsView.js +0 -114
  134. package/dist/modules/bets/view/components/Bet/Bet.js +0 -32
  135. package/dist/modules/bets/view/components/BetPill/BetPill.js +0 -6
  136. package/dist/modules/bets/view/components/BetsCard/BetsCard.js +0 -15
  137. package/dist/modules/bets/view/components/BetsCard/BetsCardHeader.js +0 -20
  138. package/dist/modules/bets/view/components/GamblingDisclaimer/GamblingDisclaimer.js +0 -14
  139. package/dist/modules/bets/view/components/LocationWarning/LocationWarning.js +0 -16
  140. package/dist/modules/bets/view/components/PromoCodeBanner/PromoCodeBanner.js +0 -63
  141. package/dist/modules/bets/view/components/PromoCodeBanner/index.js +0 -1
  142. package/dist/modules/bets/view-model/BetsViewModel.js +0 -767
  143. package/dist/modules/key-plays/constants.js +0 -292
  144. package/dist/modules/key-plays/interfaces/IKeyPlays.js +0 -14
  145. package/dist/modules/key-plays/interfaces/IKeyPlaysResponse.js +0 -1
  146. package/dist/modules/key-plays/view/KeyPlayCardScoreTagView.js +0 -13
  147. package/dist/modules/key-plays/view/KeyPlayCardView.js +0 -142
  148. package/dist/modules/key-plays/view/KeyPlayErrorStateView.js +0 -58
  149. package/dist/modules/key-plays/view/KeyPlaysView.js +0 -167
  150. package/dist/modules/key-plays/view-model/KeyPlaysViewModel.js +0 -182
  151. package/dist/modules/stats/interfaces/IStats.js +0 -1
  152. package/dist/modules/stats/mocks.js +0 -546
  153. package/dist/modules/stats/utils.js +0 -62
  154. package/dist/modules/stats/view/GameLeaders/GameLeaders.js +0 -9
  155. package/dist/modules/stats/view/GameLeaders/index.js +0 -2
  156. package/dist/modules/stats/view/MatchPredictor/DonutChart/DonutChart.js +0 -55
  157. package/dist/modules/stats/view/MatchPredictor/DonutChart/index.js +0 -1
  158. package/dist/modules/stats/view/MatchPredictor/MatchPredictorView.js +0 -66
  159. package/dist/modules/stats/view/MatchPredictor/index.js +0 -2
  160. package/dist/modules/stats/view/RecentGames/RecentGames.js +0 -22
  161. package/dist/modules/stats/view/RecentGames/index.js +0 -2
  162. package/dist/modules/stats/view/StatsQRCode/StatsQRCodeView.js +0 -38
  163. package/dist/modules/stats/view/StatsQRCode/index.js +0 -1
  164. package/dist/modules/stats/view/StatsView.js +0 -87
  165. package/dist/modules/stats/view/Teams/StatsCarousel.js +0 -14
  166. package/dist/modules/stats/view/Teams/StatsProgressBar.js +0 -14
  167. package/dist/modules/stats/view/Teams/Teams.js +0 -35
  168. package/dist/modules/stats/view/Teams/index.js +0 -2
  169. package/dist/modules/stats/view/WinProbability/WinProbability.js +0 -27
  170. package/dist/modules/stats/view/WinProbability/index.js +0 -2
  171. package/dist/modules/stats/view/components/AthletesStatistics/AthletesStatistics.js +0 -28
  172. package/dist/modules/stats/view/components/AthletesStatistics/StatisticTable.js +0 -11
  173. package/dist/modules/stats/view/components/AthletesStatistics/index.js +0 -2
  174. package/dist/modules/stats/view/index.js +0 -1
  175. package/dist/modules/stats/view-model/StatsViewModel.js +0 -90
  176. package/dist/services/BetsService.js +0 -102
  177. package/dist/services/NetworkManager/NetworkManager.js +0 -410
  178. package/dist/services/NetworkManager/errors.js +0 -45
  179. package/dist/services/ThemeManager/constants.js +0 -47
  180. package/dist/test-polyfills.js +0 -15
  181. package/dist/types/OverlayTypes.js +0 -4
  182. package/dist/view-models/MaestroEventViewModel.js +0 -156
  183. package/dist/view-models/OverlayViewModel.js +0 -222
  184. package/dist/view-models/PanelManagerViewModel.js +0 -80
  185. package/dist/view-models/ViewModel.js +0 -32
  186. package/dist/view-models/index.js +0 -59
@@ -1,66 +0,0 @@
1
- import React, { Component } from 'react';
2
- import './MatchPredictorView.styles.css';
3
- import { withFocusable, } from '@/external/spatial-navigation';
4
- import DonutChart from './DonutChart/DonutChart';
5
- import Image from '@/components/atoms/Image';
6
- class MatchPredictorView extends Component {
7
- constructor() {
8
- super(...arguments);
9
- Object.defineProperty(this, "state", {
10
- enumerable: true,
11
- configurable: true,
12
- writable: true,
13
- value: {
14
- shouldRenderPredictorImage: Boolean(this.props.predictor.imageUrl),
15
- }
16
- });
17
- Object.defineProperty(this, "handleImageError", {
18
- enumerable: true,
19
- configurable: true,
20
- writable: true,
21
- value: () => {
22
- this.setState({ shouldRenderPredictorImage: false });
23
- }
24
- });
25
- }
26
- render() {
27
- const { predictor, teams } = this.props;
28
- const { shouldRenderPredictorImage } = this.state;
29
- // Get team data
30
- const homeTeam = teams[predictor.homeTeam.team.$key];
31
- const awayTeam = teams[predictor.awayTeam.team.$key];
32
- // Parse percentages
33
- const homePercentage = parseFloat(predictor.homeTeam.gameProjection);
34
- const awayPercentage = parseFloat(predictor.awayTeam.gameProjection);
35
- return (React.createElement("section", { className: "match-predictor-view focus-ring", "data-focused": this.props.focused },
36
- React.createElement("div", { className: "match-predictor-header" },
37
- React.createElement("h2", { className: "T05_ALT" }, predictor.header)),
38
- React.createElement("div", { className: "match-predictor-percentages" },
39
- React.createElement("div", { className: "team-percentage away-team" },
40
- React.createElement("span", { className: "percentage-value T70" },
41
- awayPercentage,
42
- "%"),
43
- React.createElement("div", { className: "team-info" },
44
- React.createElement("div", { className: "legend-item away" },
45
- React.createElement("div", { className: "legend-pattern away-pattern" }),
46
- React.createElement("span", { className: "T02" }, awayTeam?.abbreviation)))),
47
- React.createElement("div", { className: "team-percentage home-team" },
48
- React.createElement("span", { className: "percentage-value T70" },
49
- homePercentage,
50
- "%"),
51
- React.createElement("div", { className: "team-info" },
52
- React.createElement("div", { className: "legend-item home" },
53
- React.createElement("div", { className: "legend-pattern home-pattern" }),
54
- React.createElement("span", { className: "T02" }, homeTeam?.abbreviation))))),
55
- React.createElement("div", { className: "donut-chart-container" }, shouldRenderPredictorImage && predictor.imageUrl ? (React.createElement("div", { className: "actual-chart" },
56
- React.createElement(Image, { src: predictor.imageUrl, alt: "Match Predictor Chart", className: "predictor-chart-image", onError: this.handleImageError }))) : (React.createElement("div", { className: "svg-chart-fallback" },
57
- React.createElement("div", { className: "svg-donut-container" },
58
- React.createElement(DonutChart, { awayPercentage: awayPercentage, homePercentage: homePercentage }),
59
- React.createElement("div", { className: "donut-center" },
60
- React.createElement("div", { className: "center-team-logos" },
61
- React.createElement("div", { className: "center-logo away-center-logo" }, awayTeam?.logo ? (React.createElement(Image, { src: awayTeam.logo, alt: awayTeam.displayName, className: "center-logo-image" })) : (React.createElement("span", { className: "center-logo-fallback T30" }, awayTeam?.abbreviation))),
62
- React.createElement("div", { className: "center-divider" }),
63
- React.createElement("div", { className: "center-logo home-center-logo" }, homeTeam?.logo ? (React.createElement(Image, { src: homeTeam.logo, alt: homeTeam.displayName, className: "center-logo-image" })) : (React.createElement("span", { className: "center-logo-fallback T30" }, homeTeam?.abbreviation)))))))))));
64
- }
65
- }
66
- export default withFocusable()(MatchPredictorView);
@@ -1,2 +0,0 @@
1
- import MatchPredictorView from './MatchPredictorView';
2
- export default MatchPredictorView;
@@ -1,22 +0,0 @@
1
- import { withFocusable, } from '@/external/spatial-navigation';
2
- import React from 'react';
3
- import './RecentGames.styles.css';
4
- import Image from '@/components/atoms/Image';
5
- const RecentGames = (props) => {
6
- return (React.createElement("section", { className: "recent-games focus-ring", "data-focused": props.focused },
7
- React.createElement("h5", { className: "T05_ALT" }, "Recent Games"),
8
- React.createElement("div", { className: "recent-games-teams" }, [props.awayTeam, props.homeTeam].map((team, index) => (React.createElement("div", { className: "team-container", key: team.name || team.logo || index },
9
- React.createElement(Image, { src: team.logo, alt: team.name || '', crossOrigin: "anonymous" }),
10
- React.createElement("span", { className: "T05_ALT" }, team.name))))),
11
- React.createElement("div", { className: "recent-games-list-group" }, [props.awayTeam, props.homeTeam].map((team, index) => (React.createElement("div", { className: "recent-games-list", key: team.name || team.logo || index }, team.events.map((event) => (React.createElement("div", { className: "recent-game-item T10", key: event.teamLogo +
12
- event.score +
13
- event.gameResult +
14
- event.homeAway },
15
- React.createElement("div", { className: "recent-game-item-team" },
16
- React.createElement("span", null, event.homeAway === 'home' ? 'VS' : '@'),
17
- React.createElement(Image, { src: event.teamLogo, alt: `${team.name} event ${event.score}`, crossOrigin: "anonymous" })),
18
- React.createElement("div", { className: "recent-game-item-result" },
19
- React.createElement("span", { "data-result": event.gameResult }, event.gameResult),
20
- event.score))))))))));
21
- };
22
- export default withFocusable()(RecentGames);
@@ -1,2 +0,0 @@
1
- import RecentGames from './RecentGames';
2
- export default RecentGames;
@@ -1,38 +0,0 @@
1
- import React from 'react';
2
- import './StatsQRCodeView.styles.css';
3
- import { withFocusable, } from '@/external/spatial-navigation';
4
- import FocusableItem from '@/components/core/ScrollableContainer/FocusableItem';
5
- import Image from '@/components/atoms/Image';
6
- const StatsQRCodeView = (props) => {
7
- const { focused, promotion } = props;
8
- return (React.createElement(FocusableItem, null,
9
- React.createElement("div", { className: "stats-qr-code-view focus-ring", "data-focused": focused, style: {
10
- backgroundImage: `url(${promotion.backgroundImage})`,
11
- } },
12
- React.createElement("table", { className: "stats-qr-table" },
13
- React.createElement("tbody", null,
14
- React.createElement("tr", null,
15
- React.createElement("td", { className: "stats-qr-header-cell" },
16
- React.createElement("table", { className: "stats-qr-logo-table" },
17
- React.createElement("tbody", null,
18
- React.createElement("tr", null,
19
- React.createElement("td", { className: "stats-qr-logo-cell" },
20
- React.createElement(Image, { src: promotion.logo, alt: "ESPN Logo", crossOrigin: "anonymous", className: "stats-qr-logo" }))),
21
- React.createElement("tr", null,
22
- React.createElement("td", { className: "stats-qr-tagline-cell" },
23
- React.createElement("div", { className: "stats-qr-tagline" },
24
- React.createElement("p", { className: "T20" }, promotion.title)))))))),
25
- React.createElement("tr", null,
26
- React.createElement("td", { className: "stats-qr-content-cell" },
27
- React.createElement("table", { className: "stats-qr-content-table" },
28
- React.createElement("tbody", null,
29
- React.createElement("tr", null,
30
- React.createElement("td", { className: "stats-qr-code-cell" },
31
- React.createElement("div", { className: "stats-qr-code-container" },
32
- React.createElement(Image, { src: promotion.qrCode, alt: "QR Code", crossOrigin: "anonymous", className: "stats-qr-code" })))),
33
- React.createElement("tr", null,
34
- React.createElement("td", { className: "stats-qr-description-cell" },
35
- React.createElement("div", { className: "stats-qr-description" },
36
- React.createElement("p", { className: "T02" }, promotion.description)))))))))))));
37
- };
38
- export default withFocusable()(StatsQRCodeView);
@@ -1 +0,0 @@
1
- export { default } from './StatsQRCodeView';
@@ -1,87 +0,0 @@
1
- import React, { Component } from 'react';
2
- import './StatsView.styles.css';
3
- import ScrollableContainer from '@/components/core/ScrollableContainer';
4
- import MatchPredictorView from './MatchPredictor';
5
- import SDK from '@/index';
6
- import StatsQRCodeView from './StatsQRCode';
7
- class StatsView extends Component {
8
- constructor(props) {
9
- super(props);
10
- Object.defineProperty(this, "container", {
11
- enumerable: true,
12
- configurable: true,
13
- writable: true,
14
- value: null
15
- });
16
- Object.defineProperty(this, "statsDataUnsub", {
17
- enumerable: true,
18
- configurable: true,
19
- writable: true,
20
- value: null
21
- });
22
- Object.defineProperty(this, "isDataLoadingUnsub", {
23
- enumerable: true,
24
- configurable: true,
25
- writable: true,
26
- value: null
27
- });
28
- Object.defineProperty(this, "vm", {
29
- enumerable: true,
30
- configurable: true,
31
- writable: true,
32
- value: void 0
33
- });
34
- Object.defineProperty(this, "renderStatsComponents", {
35
- enumerable: true,
36
- configurable: true,
37
- writable: true,
38
- value: () => {
39
- const { statsData } = this.state;
40
- if (!statsData) {
41
- return React.createElement("div", { className: "stats-loading T02" }, "Loading...");
42
- }
43
- try {
44
- return (React.createElement("div", null,
45
- statsData.predictor && (React.createElement(MatchPredictorView, { predictor: statsData.predictor, teams: statsData.entities.teams })),
46
- statsData.promotion && (React.createElement(StatsQRCodeView, { promotion: statsData.promotion }))));
47
- }
48
- catch (error) {
49
- console.error('Error rendering stats components:', error);
50
- return null;
51
- }
52
- }
53
- });
54
- this.vm = SDK.getMaestroEventViewModel().statsViewModel;
55
- this.state = {
56
- container: null,
57
- statsData: this.vm.statsData.value,
58
- isDataLoading: this.vm.isDataLoading.value,
59
- };
60
- }
61
- componentDidMount() {
62
- this.setState({
63
- container: this.container,
64
- });
65
- this.statsDataUnsub = this.vm.statsData.subscribe((value) => {
66
- this.setState({ statsData: value });
67
- });
68
- this.isDataLoadingUnsub = this.vm.isDataLoading.subscribe((value) => {
69
- this.setState({ isDataLoading: value });
70
- });
71
- // Initialize the view model
72
- this.vm.init();
73
- }
74
- componentWillUnmount() {
75
- this.statsDataUnsub && this.statsDataUnsub();
76
- this.isDataLoadingUnsub && this.isDataLoadingUnsub();
77
- // Clean up the view model
78
- this.vm.cleanup();
79
- }
80
- render() {
81
- return (React.createElement(ScrollableContainer, { scrollableContainerRef: this.state.container, containerTopOffset: 40 },
82
- React.createElement("div", { className: "stats-view", ref: (e) => (this.container = e) },
83
- this.renderStatsComponents(),
84
- React.createElement("div", { className: "stats-bottom-padding" }))));
85
- }
86
- }
87
- export default StatsView;
@@ -1,14 +0,0 @@
1
- import React from 'react';
2
- const StatsCarousel = (props) => {
3
- return (React.createElement("div", { className: "carousel" },
4
- React.createElement("div", { className: "carousel-track", style: {
5
- width: `${props.itemsLength * 100}%`,
6
- animation: `carousel-slide ${props.itemsLength * 6}s steps(${props.itemsLength}) infinite`,
7
- } }, props.children)));
8
- };
9
- const CarouselSlider = (props) => {
10
- return (React.createElement("div", { className: "carousel-slide", style: {
11
- width: `${100 / props.itemsLength}%`,
12
- } }, props.children));
13
- };
14
- export { StatsCarousel, CarouselSlider };
@@ -1,14 +0,0 @@
1
- import React from 'react';
2
- const StatsProgressBar = (props) => {
3
- const total = props.homeTeamValue + props.awayTeamValue;
4
- const awayTeamPercentage = total === 0 ? 0 : Math.round((props.awayTeamValue / total) * 100);
5
- return (React.createElement("div", { className: "progress-bar" },
6
- React.createElement("div", { className: "progress-fill" },
7
- React.createElement("div", { className: "progress-divider", style: {
8
- right: `${awayTeamPercentage}%`,
9
- } }),
10
- React.createElement("div", { className: "progress-stripes", style: {
11
- width: `${awayTeamPercentage}%`,
12
- } }))));
13
- };
14
- export default StatsProgressBar;
@@ -1,35 +0,0 @@
1
- import React from 'react';
2
- import './TeamsView.styles.css';
3
- import Image from '@/components/atoms/Image';
4
- import { withFocusable, } from '@/external/spatial-navigation';
5
- import { CarouselSlider, StatsCarousel } from './StatsCarousel';
6
- import StatsProgressBar from './StatsProgressBar';
7
- const Teams = (props) => {
8
- const teams = [props.homeTeam, props.awayTeam];
9
- return (React.createElement("section", { className: "stats-teams-view focus-ring", "data-focused": props.focused, style: {
10
- '--home-team': `#${props.homeTeam.color}`,
11
- '--away-team': `#${props.awayTeam.color}`,
12
- }, "data-live": props.isLive },
13
- React.createElement("div", { className: "stats-teams-view-header" }, teams.map((team) => (React.createElement("div", { key: team.id, className: "stats-team" },
14
- React.createElement(Image, { src: team.logo, alt: team.name, crossOrigin: "anonymous" }),
15
- React.createElement("div", null,
16
- React.createElement("span", { className: props.isLive ? 'T05_ALT' : 'T30' }, team.abbreviation),
17
- React.createElement("p", { className: "T02" }, team.record)))))),
18
- props.isLive && (React.createElement("div", { className: "statistics" },
19
- React.createElement("table", { className: "statistics-table" },
20
- React.createElement("thead", null,
21
- React.createElement("tr", null,
22
- React.createElement("th", { className: "T10" }),
23
- props.linescoresHeader.map((header) => (React.createElement("th", { key: header, className: "T10" }, header))))),
24
- React.createElement("tbody", null, teams.map((team) => (React.createElement("tr", { key: team.id },
25
- React.createElement("td", { className: "T30" }, team.name),
26
- team.linescores.map((lineScore, index) => (React.createElement("td", { key: `${lineScore}-${index}`, className: "T10" }, lineScore)))))))),
27
- props.statistics && props.statistics.length > 0 && (React.createElement(StatsCarousel, { itemsLength: props.statistics.length }, props.statistics.map((statistic) => (React.createElement(CarouselSlider, { itemsLength: props.statistics.length, key: statistic.displayName },
28
- React.createElement("div", { className: "score-statistics" },
29
- React.createElement("div", { className: "score-statistics-header" },
30
- React.createElement("span", { className: "T30" }, statistic.homeTeamValue),
31
- React.createElement("span", { className: "statistic-name T02" }, statistic.displayName),
32
- React.createElement("span", { className: "T30" }, statistic.awayTeamValue)),
33
- React.createElement(StatsProgressBar, { awayTeamValue: statistic.awayTeamValue, homeTeamValue: statistic.homeTeamValue })))))))))));
34
- };
35
- export default withFocusable()(Teams);
@@ -1,2 +0,0 @@
1
- import Teams from './Teams';
2
- export default Teams;
@@ -1,27 +0,0 @@
1
- import React from 'react';
2
- import './WinProbability.styles.css';
3
- import { withFocusable, } from '@/external/spatial-navigation';
4
- import Image from '@/components/atoms/Image';
5
- const WinProbability = (props) => {
6
- return (React.createElement("section", { className: "win-probability focus-ring", "data-focused": props.focused },
7
- React.createElement("h5", { className: "T05_ALT" }, "Win Probability"),
8
- React.createElement("div", { className: "win-probability-card" }, [props.awayTeam, props.homeTeam].map((team, index) => {
9
- return (React.createElement("div", { className: "team", key: team.id },
10
- React.createElement(Image, { src: team.logo, alt: `${team.abbreviation} logo`, crossOrigin: "anonymous" }),
11
- React.createElement("div", { className: "info" },
12
- React.createElement("span", { className: "T60" }, team.winPercentage ? `${team.winPercentage}%` : '–'),
13
- React.createElement("div", { className: "name T01" },
14
- index === 0 ? React.createElement(AwayTeamChartLine, null) : React.createElement(HomeTeamChartLine, null),
15
- React.createElement("span", null, team.abbreviation)))));
16
- })),
17
- React.createElement(Image, { src: props.chartImageUrl, alt: "Win Probability Chart", crossOrigin: "anonymous" })));
18
- };
19
- const AwayTeamChartLine = () => {
20
- return (React.createElement("svg", { width: "25", height: "4", viewBox: "0 0 25 4", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
21
- React.createElement("path", { d: "M2.33337 2H22.3334", stroke: "white", strokeWidth: "4", strokeLinecap: "round" })));
22
- };
23
- const HomeTeamChartLine = () => {
24
- return (React.createElement("svg", { width: "25", height: "4", viewBox: "0 0 25 4", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
25
- React.createElement("path", { d: "M2.66992 2H22.6699", stroke: "white", strokeWidth: "4", strokeLinecap: "round", strokeDasharray: "2 7" })));
26
- };
27
- export default withFocusable()(WinProbability);
@@ -1,2 +0,0 @@
1
- import WinProbability from './WinProbability';
2
- export default WinProbability;
@@ -1,28 +0,0 @@
1
- import React from 'react';
2
- import StatisticsTable from './StatisticTable';
3
- import Image from '@/components/atoms/Image';
4
- import { withFocusable, } from '@/external/spatial-navigation';
5
- import './AthleteStatistics.styles.css';
6
- const AthletesStatistics = (props) => {
7
- const item = props.item;
8
- return (React.createElement("div", { className: "athletes-statistics focus-ring", key: item.displayName, "data-focused": props.focused },
9
- React.createElement("span", { className: "T05_ALT" }, item.displayName),
10
- React.createElement("div", { className: "leaders-wrapper" }, [item.awayAthlete, item.homeAthlete].map((athlete) => {
11
- return (React.createElement("div", { className: "leader", key: athlete.id + item.displayName },
12
- React.createElement("div", { className: "image-wrapper T02", "data-position": athlete.position },
13
- React.createElement(Image, { src: athlete.headshot, alt: `${item.displayName} ${athlete.displayName} Headshot Image` })),
14
- React.createElement("div", { className: "leader-info" },
15
- React.createElement("div", { className: "main-statistic T05_ALT" },
16
- athlete.shortName,
17
- ' ',
18
- React.createElement("span", { className: "athlete-number T02" },
19
- "#",
20
- athlete.jersey)),
21
- athlete.mainStatistic && (React.createElement("div", { className: "main-statistic T30" },
22
- athlete.mainStatistic.displayValue,
23
- ' ',
24
- React.createElement("span", { className: "athlete-points T02" }, athlete.mainStatistic.abbreviation))))));
25
- })),
26
- React.createElement(StatisticsTable, { statistics: item.statistics || [] })));
27
- };
28
- export default withFocusable()(AthletesStatistics);
@@ -1,11 +0,0 @@
1
- import React from 'react';
2
- const StatisticsTable = (props) => {
3
- return (React.createElement("table", { className: "athletes-statistics-table T10" },
4
- React.createElement("tbody", null, props.statistics.map((statistic) => {
5
- return (React.createElement("tr", { key: statistic.abbreviation },
6
- React.createElement("td", null, statistic.awayAthleteValue),
7
- React.createElement("td", null, statistic.abbreviation),
8
- React.createElement("td", null, statistic.homeAthleteValue)));
9
- }))));
10
- };
11
- export default StatisticsTable;
@@ -1,2 +0,0 @@
1
- import AthletesStatistics from './AthletesStatistics';
2
- export default AthletesStatistics;
@@ -1 +0,0 @@
1
- export { default } from './StatsView';
@@ -1,90 +0,0 @@
1
- import { Observable } from '../../../helpers/Observable';
2
- import { ViewModel } from '../../../view-models/ViewModel';
3
- import { MOCK_STATS_API_PRE_GAME_RESPONSE } from '../mocks';
4
- // TODO: Implement actual ViewModel
5
- export class StatsViewModel extends ViewModel {
6
- constructor(_eventId, // TODO: Will be used when implementing real API calls
7
- options = {}) {
8
- super();
9
- // Observable properties
10
- Object.defineProperty(this, "statsData", {
11
- enumerable: true,
12
- configurable: true,
13
- writable: true,
14
- value: new Observable(null)
15
- });
16
- Object.defineProperty(this, "isDataLoading", {
17
- enumerable: true,
18
- configurable: true,
19
- writable: true,
20
- value: new Observable(true)
21
- });
22
- Object.defineProperty(this, "hasEverSuccessfullyLoaded", {
23
- enumerable: true,
24
- configurable: true,
25
- writable: true,
26
- value: new Observable(false)
27
- });
28
- // Properties
29
- Object.defineProperty(this, "useMockData", {
30
- enumerable: true,
31
- configurable: true,
32
- writable: true,
33
- value: false
34
- });
35
- Object.defineProperty(this, "initialized", {
36
- enumerable: true,
37
- configurable: true,
38
- writable: true,
39
- value: false
40
- });
41
- // TODO: Store eventId when implementing real API calls
42
- // this.eventId = _eventId;
43
- this.useMockData = options.useMockData || false;
44
- }
45
- /**
46
- * Initialize the ViewModel and start data fetching
47
- */
48
- async init() {
49
- await this.fetchNewData();
50
- this.initialized = true;
51
- }
52
- /**
53
- * Clean up resources when the ViewModel is no longer needed
54
- */
55
- cleanup() {
56
- this.initialized = false;
57
- }
58
- /**
59
- * Fetch new stats data immediately (one-time)
60
- */
61
- async fetchNewData() {
62
- this.isDataLoading.value = true;
63
- try {
64
- // Handle mock data if enabled
65
- if (this.useMockData) {
66
- await this.fetchMockData();
67
- return;
68
- }
69
- // TODO: Implement real API call when stats service is available
70
- // For now, fall back to mock data
71
- await this.fetchMockData();
72
- this.isDataLoading.value = false;
73
- }
74
- catch (error) {
75
- console.error('Error fetching stats data:', error);
76
- this.isDataLoading.value = false;
77
- }
78
- }
79
- /**
80
- * Fetch mock data for testing
81
- */
82
- async fetchMockData() {
83
- // Simulate network delay
84
- await new Promise((resolve) => setTimeout(resolve, 100));
85
- this.statsData.value = MOCK_STATS_API_PRE_GAME_RESPONSE;
86
- this.hasEverSuccessfullyLoaded.value = true;
87
- this.isDataLoading.value = false;
88
- }
89
- }
90
- export default StatsViewModel;
@@ -1,102 +0,0 @@
1
- import NetworkManager, { HttpMethod } from './NetworkManager/NetworkManager';
2
- /**
3
- * Service for handling bets-related API calls
4
- */
5
- class BetsService {
6
- constructor(delegate) {
7
- Object.defineProperty(this, "networkManager", {
8
- enumerable: true,
9
- configurable: true,
10
- writable: true,
11
- value: void 0
12
- });
13
- this.networkManager = NetworkManager.getInstance({
14
- externalBaseURL: delegate.getBettingAPIBaseURL(),
15
- });
16
- }
17
- /**
18
- * Get non-personalized bets for an event
19
- *
20
- * @param eventID - The ID of the event
21
- * @returns Promise with the bets data
22
- */
23
- async getNonPersonalizedBets(eventID) {
24
- return this.networkManager.externalApiRequest({
25
- endpoint: this.nonPersonalizedBetsEndpoint(eventID),
26
- method: HttpMethod.GET,
27
- params: {},
28
- headers: {},
29
- });
30
- }
31
- /**
32
- * Get personalized bets for an event
33
- *
34
- * @param eventID - The ID of the event
35
- * @param swid - The ESPN SWID parameter
36
- * @param jwt - The authorization JWT
37
- * @returns Promise with the personalized bets data
38
- */
39
- async getPersonalizedBets(eventID, swid, jwt) {
40
- return this.networkManager.externalApiRequest({
41
- endpoint: this.personalizedBetsEndpoint(eventID),
42
- method: HttpMethod.GET,
43
- params: { swid },
44
- headers: { 'x-p13n-auth': jwt },
45
- });
46
- }
47
- /**
48
- * Start polling for non-personalized bets
49
- *
50
- * @param eventID - The ID of the event
51
- * @param interval - The polling interval in milliseconds
52
- * @param onData - Callback for successful data fetch
53
- * @param onError - Callback for errors
54
- * @returns Object with a stop function to stop polling
55
- */
56
- pollNonPersonalizedBets(eventID, interval, onData, onError) {
57
- return this.networkManager.pollExternalApiRequest({
58
- endpoint: this.nonPersonalizedBetsEndpoint(eventID),
59
- interval,
60
- method: HttpMethod.GET,
61
- params: {},
62
- headers: {},
63
- onData,
64
- onError,
65
- });
66
- }
67
- /**
68
- * Start polling for personalized bets
69
- *
70
- * @param eventID - The ID of the event
71
- * @param swid - The ESPN SWID parameter
72
- * @param jwt - The authorization JWT
73
- * @param interval - The polling interval in milliseconds
74
- * @param onData - Callback for successful data fetch
75
- * @param onError - Callback for errors
76
- * @returns Object with a stop function to stop polling
77
- */
78
- pollPersonalizedBets(eventID, swid, jwt, interval, onData, onError) {
79
- return this.networkManager.pollExternalApiRequest({
80
- endpoint: this.personalizedBetsEndpoint(eventID),
81
- interval,
82
- method: HttpMethod.GET,
83
- params: { swid },
84
- headers: { 'x-p13n-auth': jwt },
85
- onData,
86
- onError,
87
- });
88
- }
89
- /**
90
- * Get the endpoint for non-personalized bets
91
- */
92
- nonPersonalizedBetsEndpoint(eventID) {
93
- return `/site/v2/events/${eventID}/odds`;
94
- }
95
- /**
96
- * Get the endpoint for personalized bets
97
- */
98
- personalizedBetsEndpoint(eventID) {
99
- return `/personalized/site/v2/events/${eventID}/odds`;
100
- }
101
- }
102
- export default BetsService;