@maestro_io/maestro-web-sdk 3.3.1 → 4.0.0-beta.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 (269) hide show
  1. package/dist/f8820fca3a2a7957f753167da0884f9d.png +0 -0
  2. package/dist/maestro-web-sdk.esm.js +12 -12
  3. package/dist/maestro-web-sdk.esm.js.map +1 -1
  4. package/dist/maestro-web-sdk.umd.js +12 -12
  5. package/dist/maestro-web-sdk.umd.js.map +1 -1
  6. package/dist/package.json +87 -0
  7. package/dist/src/__mocks__/sentry.d.ts +4 -0
  8. package/dist/src/components/atoms/BaseButton/BaseButton.js +11 -0
  9. package/dist/src/components/atoms/BaseButton/index.js +2 -0
  10. package/dist/src/components/atoms/Image/index.js +34 -0
  11. package/dist/src/components/atoms/Rive/index.js +53 -0
  12. package/dist/src/components/atoms/SvgIcon/BetGeneralIcon.js +9 -0
  13. package/dist/src/components/atoms/SvgIcon/BetsIcon.js +11 -0
  14. package/dist/src/components/atoms/SvgIcon/BetsWarningIcon.js +11 -0
  15. package/dist/src/components/atoms/SvgIcon/CheckmarkIcon.js +6 -0
  16. package/dist/src/components/atoms/SvgIcon/CollapseIcon.js +6 -0
  17. package/dist/src/components/atoms/SvgIcon/ExpandIcon.js +6 -0
  18. package/dist/src/components/atoms/SvgIcon/FantasyIcon.js +15 -0
  19. package/dist/src/components/atoms/SvgIcon/FlameIcon.js +11 -0
  20. package/dist/src/components/atoms/SvgIcon/Icon.js +44 -0
  21. package/dist/src/components/atoms/SvgIcon/KeyPlaysIcon.js +10 -0
  22. package/dist/src/components/atoms/SvgIcon/MobilePhoneIcon.js +11 -0
  23. package/dist/src/components/atoms/SvgIcon/PlayIcon.js +8 -0
  24. package/dist/src/components/atoms/SvgIcon/ShopIcon.js +7 -0
  25. package/dist/src/components/atoms/SvgIcon/StatsIcon.js +12 -0
  26. package/dist/src/components/atoms/SvgIcon/TimesIcon.js +6 -0
  27. package/dist/src/components/atoms/SvgIcon/WarningIcon.js +8 -0
  28. package/dist/src/components/atoms/SvgIcon/index.js +2 -0
  29. package/dist/src/components/core/App/App.js +35 -0
  30. package/dist/src/components/core/App/index.js +2 -0
  31. package/dist/src/components/core/OverlayContainer.js +58 -0
  32. package/dist/src/components/core/PanelManager/PanelManager.js +86 -0
  33. package/dist/src/components/core/PanelManager/index.js +2 -0
  34. package/dist/src/components/core/ScrollableContainer/FocusableItem.js +38 -0
  35. package/dist/src/components/core/ScrollableContainer/ScrollableContainer.js +168 -0
  36. package/dist/src/components/core/ScrollableContainer/index.js +2 -0
  37. package/dist/src/components/molecules/ActionButton/ActionButton.js +10 -0
  38. package/dist/src/components/molecules/ActionButton/index.js +2 -0
  39. package/dist/src/components/molecules/HeadshotImage/HeadshotImage.js +50 -0
  40. package/dist/src/components/molecules/HeadshotImage/index.js +2 -0
  41. package/dist/src/components/molecules/Overlay/Overlay.js +139 -0
  42. package/dist/src/components/molecules/Overlay/index.js +2 -0
  43. package/dist/src/components/molecules/PanelNavButton/PanelNavButton.js +27 -0
  44. package/dist/src/components/molecules/PanelNavButton/index.js +2 -0
  45. package/dist/src/components/molecules/SegmentButton/SegmentButton.js +10 -0
  46. package/dist/src/components/molecules/SegmentButton/index.js +2 -0
  47. package/dist/src/components/molecules/TabLoadError/TabLoadError.js +14 -0
  48. package/dist/src/components/molecules/TabLoadError/index.js +2 -0
  49. package/dist/src/components/molecules/WatchButton/WatchButton.js +15 -0
  50. package/dist/src/components/molecules/WatchButton/index.js +2 -0
  51. package/dist/src/components/organisms/PanelNavigation/PanelNavigation.js +60 -0
  52. package/dist/src/components/organisms/PanelNavigation/index.js +2 -0
  53. package/dist/src/components/organisms/SegmentController/SegmentController.js +76 -0
  54. package/dist/src/components/organisms/SegmentController/index.js +2 -0
  55. package/dist/src/development/MaestroEventDelegate.js +109 -0
  56. package/dist/src/development/TimeSeek.js +218 -0
  57. package/dist/src/development/development.js +33 -0
  58. package/dist/src/external/AxiosNetworkClient.js +110 -0
  59. package/dist/src/external/LocalStorageCacheManager.js +213 -0
  60. package/dist/src/external/ReactRenderer.js +53 -0
  61. package/dist/src/external/mocks/MockExternalNetworkClient.js +187 -0
  62. package/dist/src/external/ports/cacheManager.js +1 -0
  63. package/dist/src/external/ports/networkClient.js +1 -0
  64. package/dist/src/external/ports/renderer.d.ts +1 -2
  65. package/dist/src/external/ports/renderer.js +1 -0
  66. package/dist/src/external/spatial-navigation/__mocks__/withFocusable.d.ts +8 -0
  67. package/dist/src/external/spatial-navigation/__mocks__/withFocusable.js +7 -0
  68. package/dist/src/external/spatial-navigation/index.js +3 -0
  69. package/dist/src/external/spatial-navigation/measureLayout.js +30 -0
  70. package/dist/src/external/spatial-navigation/spatialNavigation.js +876 -0
  71. package/dist/src/external/spatial-navigation/utils.js +6 -0
  72. package/dist/src/external/spatial-navigation/visualDebugger.js +76 -0
  73. package/dist/src/external/spatial-navigation/withFocusable.js +245 -0
  74. package/dist/src/helpers/Observable.js +37 -0
  75. package/dist/src/helpers/strings.js +14 -0
  76. package/dist/src/helpers/url.js +12 -0
  77. package/dist/src/index.d.ts +5 -5
  78. package/dist/src/index.js +165 -0
  79. package/dist/src/interfaces/IMaestroEvent.d.ts +12 -0
  80. package/dist/src/interfaces/IMaestroEvent.js +18 -0
  81. package/dist/src/interfaces/IMaestroEventDelegate.js +1 -0
  82. package/dist/src/interfaces/IMaestroManager.js +1 -0
  83. package/dist/src/interfaces/IUserSettings.js +20 -0
  84. package/dist/src/models/IModel.js +1 -0
  85. package/dist/src/models/IPanel.js +40 -0
  86. package/dist/src/models/ITheme.js +20 -0
  87. package/dist/src/models/IWinningBet.js +1 -0
  88. package/dist/src/modules/bets/interfaces/IBets.js +1 -0
  89. package/dist/src/modules/bets/mocks.js +573 -0
  90. package/dist/src/modules/bets/types/BetsAnalyticsTypes.js +1 -0
  91. package/dist/src/modules/bets/view/BetsView.js +143 -0
  92. package/dist/src/modules/bets/view/HotProps/HotPropsView.js +150 -0
  93. package/dist/src/modules/bets/view/SixPack/SixPackView.js +110 -0
  94. package/dist/src/modules/bets/view/UserBets/BetResult/BetResult.js +6 -0
  95. package/dist/src/modules/bets/view/UserBets/BetsCard/BetsCard.js +149 -0
  96. package/dist/src/modules/bets/view/UserBets/BetsCard/BetsCardEvent.js +34 -0
  97. package/dist/src/modules/bets/view/UserBets/BetsCard/BetsCardFooter.js +18 -0
  98. package/dist/src/modules/bets/view/UserBets/Boost/Boost.js +6 -0
  99. package/dist/src/modules/bets/view/UserBets/OutcomeBadge/OutcomeBadge.js +9 -0
  100. package/dist/src/modules/bets/view/UserBets/Parlay/Parlay.js +13 -0
  101. package/dist/src/modules/bets/view/UserBets/Straight/Straight.js +6 -0
  102. package/dist/src/modules/bets/view/UserBets/Teaser/Teaser.js +13 -0
  103. package/dist/src/modules/bets/view/UserBets/UserBetsView.js +107 -0
  104. package/dist/src/modules/bets/view/components/Bet/Bet.js +32 -0
  105. package/dist/src/modules/bets/view/components/BetPill/BetPill.js +6 -0
  106. package/dist/src/modules/bets/view/components/BetsCard/BetsCard.js +15 -0
  107. package/dist/src/modules/bets/view/components/BetsCard/BetsCardHeader.js +20 -0
  108. package/dist/src/modules/bets/view/components/GamblingDisclaimer/GamblingDisclaimer.js +14 -0
  109. package/dist/src/modules/bets/view/components/LocationWarning/LocationWarning.js +16 -0
  110. package/dist/src/modules/bets/view/components/PromoCodeBanner/PromoCodeBanner.js +78 -0
  111. package/dist/src/modules/bets/view/components/PromoCodeBanner/index.js +1 -0
  112. package/dist/src/modules/bets/view-model/BetsViewModel.js +974 -0
  113. package/dist/src/modules/fantasy/components/ExpandedAthleteList/ExpandedAthletesList.js +107 -0
  114. package/dist/src/modules/fantasy/components/ExpandedAthleteList/index.js +1 -0
  115. package/dist/src/modules/fantasy/components/LeagueCard/LeagueCard.js +20 -0
  116. package/dist/src/modules/fantasy/components/LeagueCard/index.js +2 -0
  117. package/dist/src/modules/fantasy/components/TopPlayerCard/TopPlayerCard.js +29 -0
  118. package/dist/src/modules/fantasy/components/TopPlayerCard/index.js +2 -0
  119. package/dist/src/modules/fantasy/mocks.js +3682 -0
  120. package/dist/src/modules/fantasy/types.js +6 -0
  121. package/dist/src/modules/fantasy/view/ActiveAthletesMarquee/ActiveAthletesMarquee.js +74 -0
  122. package/dist/src/modules/fantasy/view/ActiveAthletesMarquee/index.js +2 -0
  123. package/dist/src/modules/fantasy/view/ErrorBoundary.d.ts +13 -0
  124. package/dist/src/modules/fantasy/view/FantasyItemView.js +74 -0
  125. package/dist/src/modules/fantasy/view/FantasyView.js +133 -0
  126. package/dist/src/modules/fantasy/view/InactiveLeague/DraftDateCountdown.js +95 -0
  127. package/dist/src/modules/fantasy/view/InactiveLeague/InactiveLeague.js +13 -0
  128. package/dist/src/modules/fantasy/view/InactiveLeague/index.js +2 -0
  129. package/dist/src/modules/fantasy/view/LoginView/LoginView.js +27 -0
  130. package/dist/src/modules/fantasy/view/LoginView/index.js +2 -0
  131. package/dist/src/modules/fantasy/view/MatchupPair/DoubleAthleteCard/DoubleAthleteCard.js +25 -0
  132. package/dist/src/modules/fantasy/view/MatchupPair/DoubleAthleteCard/index.js +2 -0
  133. package/dist/src/modules/fantasy/view/MatchupPair/ExpandedDoubleAthleteCards.js +9 -0
  134. package/dist/src/modules/fantasy/view/MatchupPair/MatchupPair.js +118 -0
  135. package/dist/src/modules/fantasy/view/MatchupPair/index.js +2 -0
  136. package/dist/src/modules/fantasy/view/MatchupSingle/ExpandedSingleAthleteCards.js +9 -0
  137. package/dist/src/modules/fantasy/view/MatchupSingle/MatchupSingle.js +108 -0
  138. package/dist/src/modules/fantasy/view/MatchupSingle/SingleAthleteCard/SingleAthleteCard.js +18 -0
  139. package/dist/src/modules/fantasy/view/MatchupSingle/SingleAthleteCard/index.js +2 -0
  140. package/dist/src/modules/fantasy/view/MatchupSingle/index.js +2 -0
  141. package/dist/src/modules/fantasy/view/PromoView/PromoView.js +12 -0
  142. package/dist/src/modules/fantasy/view/PromoView/index.js +2 -0
  143. package/dist/src/modules/fantasy/view/index.js +2 -0
  144. package/dist/src/modules/fantasy/view-model/FantasyViewModel.FantasyPolling.js +132 -0
  145. package/dist/src/modules/fantasy/view-model/FantasyViewModel.LeagueManagerPolling.js +141 -0
  146. package/dist/src/modules/fantasy/view-model/FantasyViewModel.js +534 -0
  147. package/dist/src/modules/key-plays/constants.js +292 -0
  148. package/dist/src/modules/key-plays/interfaces/IKeyPlays.js +14 -0
  149. package/dist/src/modules/key-plays/interfaces/IKeyPlaysResponse.js +1 -0
  150. package/dist/src/modules/key-plays/view/KeyPlayCardScoreTagView.js +16 -0
  151. package/dist/src/modules/key-plays/view/KeyPlayCardView.js +144 -0
  152. package/dist/src/modules/key-plays/view/KeyPlayErrorStateView.js +65 -0
  153. package/dist/src/modules/key-plays/view/KeyPlaysView.js +151 -0
  154. package/dist/src/modules/key-plays/view-model/KeyPlaysViewModel.js +246 -0
  155. package/dist/src/modules/shop/mocks.js +390 -0
  156. package/dist/src/modules/shop/types.js +7 -0
  157. package/dist/src/modules/shop/view/ProductDetailView/ProductDetailView.js +56 -0
  158. package/dist/src/modules/shop/view/ProductDetailView/index.js +2 -0
  159. package/dist/src/modules/shop/view/ShopView.js +182 -0
  160. package/dist/src/modules/shop/view/components/BrowseCard/BrowseCard.js +23 -0
  161. package/dist/src/modules/shop/view/components/BrowseCard/index.js +2 -0
  162. package/dist/src/modules/shop/view/components/ProductSummaryCard/ProductSummaryCard.js +26 -0
  163. package/dist/src/modules/shop/view/components/ProductSummaryCard/index.js +1 -0
  164. package/dist/src/modules/shop/view/components/ShopPromoView/ShopPromoView.js +19 -0
  165. package/dist/src/modules/shop/view/components/ShopPromoView/index.js +1 -0
  166. package/dist/src/modules/shop/view/components/ShopSection/ShopSection.d.ts +1 -0
  167. package/dist/src/modules/shop/view/components/ShopSection/ShopSection.js +61 -0
  168. package/dist/src/modules/shop/view/components/ShopSection/ShopSectionItem.d.ts +18 -0
  169. package/dist/src/modules/shop/view/components/ShopSection/ShopSectionItem.js +22 -0
  170. package/dist/src/modules/shop/view/components/ShopSection/index.js +1 -0
  171. package/dist/src/modules/shop/view/index.js +2 -0
  172. package/dist/src/modules/shop/view-model/ShopViewModel.ShopPolling.js +111 -0
  173. package/dist/src/modules/shop/view-model/ShopViewModel.js +353 -0
  174. package/dist/src/modules/stats/interfaces/IStats.js +1 -0
  175. package/dist/src/modules/stats/mocks.js +746 -0
  176. package/dist/src/modules/stats/utils/driveSummaryUtils.js +48 -0
  177. package/dist/src/modules/stats/utils/renderTeamStatistic.js +16 -0
  178. package/dist/src/modules/stats/utils.js +62 -0
  179. package/dist/src/modules/stats/view/ActiveAthletes/ActiveAthletes.js +98 -0
  180. package/dist/src/modules/stats/view/ActiveAthletes/CollapsedAthletes/CollapsedAthletes.js +27 -0
  181. package/dist/src/modules/stats/view/ActiveAthletes/ExpandedAthletes/ExpandedAthletes.js +89 -0
  182. package/dist/src/modules/stats/view/ActiveAthletes/index.js +2 -0
  183. package/dist/src/modules/stats/view/DriveSummary/DrivePlayCard.js +70 -0
  184. package/dist/src/modules/stats/view/DriveSummary/DriveSummary.js +87 -0
  185. package/dist/src/modules/stats/view/DriveSummary/ExpandedItems/DriveSummaryExpanded.js +129 -0
  186. package/dist/src/modules/stats/view/DriveSummary/Header/DriveSummaryHeader.js +26 -0
  187. package/dist/src/modules/stats/view/DriveSummary/MainStat/MainStat.js +24 -0
  188. package/dist/src/modules/stats/view/DriveSummary/index.js +2 -0
  189. package/dist/src/modules/stats/view/GameLeaders/GameLeaders.js +48 -0
  190. package/dist/src/modules/stats/view/GameLeaders/index.js +2 -0
  191. package/dist/src/modules/stats/view/MatchPredictor/DonutChart/DonutChart.js +55 -0
  192. package/dist/src/modules/stats/view/MatchPredictor/DonutChart/index.js +1 -0
  193. package/dist/src/modules/stats/view/MatchPredictor/MatchPredictorView.js +60 -0
  194. package/dist/src/modules/stats/view/MatchPredictor/index.js +2 -0
  195. package/dist/src/modules/stats/view/Penalties/Penalties.js +6 -0
  196. package/dist/src/modules/stats/view/Penalties/index.js +2 -0
  197. package/dist/src/modules/stats/view/RecentGames/RecentGames.js +23 -0
  198. package/dist/src/modules/stats/view/RecentGames/index.js +2 -0
  199. package/dist/src/modules/stats/view/ScoringSummary/ExpandedScores/ExpandedScores.js +121 -0
  200. package/dist/src/modules/stats/view/ScoringSummary/ExpandedScores/index.js +2 -0
  201. package/dist/src/modules/stats/view/ScoringSummary/ScoreItem/ScoreItem.js +62 -0
  202. package/dist/src/modules/stats/view/ScoringSummary/ScoreItem/index.js +2 -0
  203. package/dist/src/modules/stats/view/ScoringSummary/ScoresSection/ScoresSection.js +23 -0
  204. package/dist/src/modules/stats/view/ScoringSummary/ScoresSection/index.js +2 -0
  205. package/dist/src/modules/stats/view/ScoringSummary/ScoringSummary.js +106 -0
  206. package/dist/src/modules/stats/view/ScoringSummary/index.js +2 -0
  207. package/dist/src/modules/stats/view/StatsItemView.js +92 -0
  208. package/dist/src/modules/stats/view/StatsQRCode/StatsQRCodeView.js +36 -0
  209. package/dist/src/modules/stats/view/StatsQRCode/index.js +1 -0
  210. package/dist/src/modules/stats/view/StatsView.js +137 -0
  211. package/dist/src/modules/stats/view/TeamStats/TeamStatsView.js +43 -0
  212. package/dist/src/modules/stats/view/TeamStats/index.js +1 -0
  213. package/dist/src/modules/stats/view/Teams/StatsCarousel.js +83 -0
  214. package/dist/src/modules/stats/view/Teams/StatsProgressBar.js +19 -0
  215. package/dist/src/modules/stats/view/Teams/Teams.js +27 -0
  216. package/dist/src/modules/stats/view/Teams/index.js +2 -0
  217. package/dist/src/modules/stats/view/WinProbability/WinProbability.js +28 -0
  218. package/dist/src/modules/stats/view/WinProbability/index.js +2 -0
  219. package/dist/src/modules/stats/view/components/AthletesStatistics/AthletesStatistics.js +89 -0
  220. package/dist/src/modules/stats/view/components/AthletesStatistics/StatisticTable.js +12 -0
  221. package/dist/src/modules/stats/view/components/AthletesStatistics/index.js +2 -0
  222. package/dist/src/modules/stats/view/index.js +2 -0
  223. package/dist/src/modules/stats/view-model/StatsViewModel.d.ts +5 -0
  224. package/dist/src/modules/stats/view-model/StatsViewModel.js +989 -0
  225. package/dist/src/sentry.js +31 -0
  226. package/dist/src/services/AnalyticsService/AnalyticsService.d.ts +12 -7
  227. package/dist/src/services/AnalyticsService/AnalyticsService.js +402 -0
  228. package/dist/src/services/AnalyticsService/types.js +1 -0
  229. package/dist/src/services/BetsService.js +122 -0
  230. package/dist/src/services/FantasyService.js +92 -0
  231. package/dist/src/services/GlobalService/GlobalService.d.ts +9 -0
  232. package/dist/src/services/GlobalService/PageService.d.ts +9 -0
  233. package/dist/src/services/GlobalService/index.d.ts +2 -0
  234. package/dist/src/services/GlobalService/mocks.d.ts +2 -0
  235. package/dist/src/services/GlobalService/types.d.ts +11 -0
  236. package/dist/src/services/InsightsService/InsightsPayloadBuilder.d.ts +1 -2
  237. package/dist/src/services/InsightsService/InsightsPayloadBuilder.js +386 -0
  238. package/dist/src/services/InsightsService/InsightsService.js +74 -0
  239. package/dist/src/services/NetworkManager/NetworkManager.js +457 -0
  240. package/dist/src/services/NetworkManager/NetworkManagerFactory.js +101 -0
  241. package/dist/src/services/NetworkManager/errors.js +45 -0
  242. package/dist/src/services/NetworkManager/types.js +10 -0
  243. package/dist/src/services/PageService/PageService.d.ts +9 -0
  244. package/dist/src/services/PageService/PageService.js +39 -0
  245. package/dist/src/services/PageService/index.d.ts +2 -0
  246. package/dist/src/services/PageService/index.js +2 -0
  247. package/dist/src/services/PageService/mocks.d.ts +2 -0
  248. package/dist/src/services/PageService/mocks.js +104 -0
  249. package/dist/src/services/PageService/types.d.ts +76 -0
  250. package/dist/src/services/PageService/types.js +1 -0
  251. package/dist/src/services/ShopService.js +46 -0
  252. package/dist/src/services/StaticService/PageService.d.ts +9 -0
  253. package/dist/src/services/StaticService/StaticService.d.ts +3 -1
  254. package/dist/src/services/StaticService/StaticService.js +59 -0
  255. package/dist/src/services/StaticService/index.js +2 -0
  256. package/dist/src/services/StaticService/mocks.js +104 -0
  257. package/dist/src/services/StaticService/types.js +1 -0
  258. package/dist/src/services/StatsService.d.ts +1 -0
  259. package/dist/src/services/StatsService.js +147 -0
  260. package/dist/src/services/ThemeManager/constants.js +47 -0
  261. package/dist/src/services/UserSettingsManager.js +155 -0
  262. package/dist/src/test-polyfills.js +15 -0
  263. package/dist/src/types/OverlayTypes.js +4 -0
  264. package/dist/src/view-models/MaestroEventViewModel.d.ts +1 -2
  265. package/dist/src/view-models/MaestroEventViewModel.js +307 -0
  266. package/dist/src/view-models/OverlayViewModel.js +222 -0
  267. package/dist/src/view-models/PanelManagerViewModel.js +212 -0
  268. package/dist/src/view-models/ViewModel.js +32 -0
  269. package/package.json +1 -1
@@ -0,0 +1,92 @@
1
+ import React from 'react';
2
+ import Teams from './Teams';
3
+ import ActiveAthletes from './ActiveAthletes';
4
+ import GameLeaders from './GameLeaders';
5
+ import RecentGames from './RecentGames';
6
+ import WinProbability from './WinProbability';
7
+ import StatsQRCodeView from './StatsQRCode/StatsQRCodeView';
8
+ import MatchPredictorView from './MatchPredictor';
9
+ import TeamStats from './TeamStats';
10
+ import { DEFAULT_SCROLLABLE_CONTAINER_CONTEXT, SCROLLABLE_CONTEXT_TYPE, } from '@/components/core/ScrollableContainer/ScrollableContainer';
11
+ import FocusableItem from '@/components/core/ScrollableContainer/FocusableItem';
12
+ import DriveSummary from './DriveSummary';
13
+ import SDK from '@/index';
14
+ import ScoringSummary from './ScoringSummary';
15
+ import Penalties from './Penalties';
16
+ class StatsItemView extends React.Component {
17
+ constructor() {
18
+ super(...arguments);
19
+ Object.defineProperty(this, "context", {
20
+ enumerable: true,
21
+ configurable: true,
22
+ writable: true,
23
+ value: DEFAULT_SCROLLABLE_CONTAINER_CONTEXT
24
+ });
25
+ Object.defineProperty(this, "onBecameFocused", {
26
+ enumerable: true,
27
+ configurable: true,
28
+ writable: true,
29
+ value: (layout) => {
30
+ this.context.scrollToFocusedElement(layout);
31
+ }
32
+ });
33
+ Object.defineProperty(this, "onArrowPress", {
34
+ enumerable: true,
35
+ configurable: true,
36
+ writable: true,
37
+ value: (d) => {
38
+ if (d === 'left') {
39
+ SDK.getMaestroEventViewModel().deliverFocus();
40
+ }
41
+ }
42
+ });
43
+ Object.defineProperty(this, "onEnterPress", {
44
+ enumerable: true,
45
+ configurable: true,
46
+ writable: true,
47
+ value: (item) => () => {
48
+ this.props.onEnterPress(item);
49
+ }
50
+ });
51
+ }
52
+ renderItem() {
53
+ const item = this.props.item;
54
+ switch (item.type) {
55
+ case 'penalties':
56
+ return (React.createElement(Penalties, { onBecameFocused: this.onBecameFocused, onEnterPress: this.onEnterPress(item), item: item }));
57
+ case 'scoringSummary':
58
+ return (React.createElement(ScoringSummary, { onBecameFocused: this.onBecameFocused, onEnterPress: this.onEnterPress(item), item: item }));
59
+ case 'driveSummary':
60
+ return (React.createElement(DriveSummary, { onBecameFocused: this.onBecameFocused, onItemEnterPress: this.onEnterPress(item), onArrowPress: this.onArrowPress, focusKey: `drive-summary-${item.id}`, item: item }));
61
+ case 'headerTeam':
62
+ return (React.createElement(Teams, { onArrowPress: this.onArrowPress, onBecameFocused: this.onBecameFocused, onEnterPress: this.onEnterPress(item), item: item }));
63
+ case 'activeAthletes':
64
+ return (React.createElement(ActiveAthletes, { onBecameFocused: this.onBecameFocused, onEnterPress: this.onEnterPress(item), item: item }));
65
+ case 'gameLeaders':
66
+ return (React.createElement(GameLeaders, { item: item, onEnterPress: this.onEnterPress(item) }));
67
+ case 'recentGames':
68
+ return (React.createElement(RecentGames, { onArrowPress: this.onArrowPress, onBecameFocused: this.onBecameFocused, onEnterPress: this.onEnterPress(item), item: item }));
69
+ case 'winProbability':
70
+ return (React.createElement(WinProbability, { onArrowPress: this.onArrowPress, onBecameFocused: this.onBecameFocused, onEnterPress: this.onEnterPress(item), item: item }));
71
+ case 'promotion':
72
+ return (React.createElement(StatsQRCodeView, { onBecameFocused: this.onBecameFocused, onEnterPress: this.onEnterPress(item), onArrowPress: this.onArrowPress, promotion: item }));
73
+ case 'matchPredictor':
74
+ return (React.createElement(MatchPredictorView, { onBecameFocused: this.onBecameFocused, onEnterPress: this.onEnterPress(item), onArrowPress: this.onArrowPress, item: item }));
75
+ case 'teamStats':
76
+ return (React.createElement(TeamStats, { onArrowPress: this.onArrowPress, onBecameFocused: this.onBecameFocused, onEnterPress: this.onEnterPress(item), item: item }));
77
+ default:
78
+ console.warn('Unknown stats item type:', JSON.stringify(item));
79
+ return null;
80
+ }
81
+ }
82
+ render() {
83
+ return React.createElement(FocusableItem, null, this.renderItem());
84
+ }
85
+ }
86
+ Object.defineProperty(StatsItemView, "contextTypes", {
87
+ enumerable: true,
88
+ configurable: true,
89
+ writable: true,
90
+ value: SCROLLABLE_CONTEXT_TYPE
91
+ });
92
+ export default StatsItemView;
@@ -0,0 +1,36 @@
1
+ import React from 'react';
2
+ import './StatsQRCodeView.styles.css';
3
+ import { withFocusable, } from '@/external/spatial-navigation';
4
+ import Image from '@/components/atoms/Image';
5
+ const StatsQRCodeView = (props) => {
6
+ const { focused, promotion } = props;
7
+ return (React.createElement("div", { className: "stats-qr-code-view focus-ring", "data-focused": focused, style: {
8
+ backgroundImage: `url(${promotion.backgroundImage})`,
9
+ } },
10
+ React.createElement("table", { className: "stats-qr-table" },
11
+ React.createElement("tbody", null,
12
+ React.createElement("tr", null,
13
+ React.createElement("td", { className: "stats-qr-header-cell" },
14
+ React.createElement("table", { className: "stats-qr-logo-table" },
15
+ React.createElement("tbody", null,
16
+ React.createElement("tr", null,
17
+ React.createElement("td", { className: "stats-qr-logo-cell" },
18
+ React.createElement(Image, { src: promotion.logo, alt: "ESPN Logo", crossOrigin: "anonymous", className: "stats-qr-logo" }))),
19
+ React.createElement("tr", null,
20
+ React.createElement("td", { className: "stats-qr-tagline-cell" },
21
+ React.createElement("div", { className: "stats-qr-tagline" },
22
+ React.createElement("p", { className: "T20" }, promotion.title)))))))),
23
+ React.createElement("tr", null,
24
+ React.createElement("td", { className: "stats-qr-content-cell" },
25
+ React.createElement("table", { className: "stats-qr-content-table" },
26
+ React.createElement("tbody", null,
27
+ React.createElement("tr", null,
28
+ React.createElement("td", { className: "stats-qr-code-cell" },
29
+ React.createElement("div", { className: "stats-qr-code-container" },
30
+ React.createElement(Image, { src: promotion.qrCode, alt: "QR Code", crossOrigin: "anonymous", className: "stats-qr-code" })))),
31
+ React.createElement("tr", null,
32
+ React.createElement("td", { className: "stats-qr-description-cell" },
33
+ React.createElement("div", { className: "stats-qr-description" },
34
+ React.createElement("p", { className: "T20" }, promotion.description))))))))))));
35
+ };
36
+ export default withFocusable()(StatsQRCodeView);
@@ -0,0 +1 @@
1
+ export { default } from './StatsQRCodeView';
@@ -0,0 +1,137 @@
1
+ import React, { Component } from 'react';
2
+ import './StatsView.styles.css';
3
+ import ScrollableContainer from '@/components/core/ScrollableContainer';
4
+ import SDK from '@/index';
5
+ import StatsItemView from './StatsItemView';
6
+ import TabLoadErrorView from '@/components/molecules/TabLoadError';
7
+ import { captureException } from '@/sentry';
8
+ const STICKY_HEADER_HEIGHT = 32; // Match KeyPlaysView
9
+ class StatsView extends Component {
10
+ constructor(props) {
11
+ super(props);
12
+ Object.defineProperty(this, "container", {
13
+ enumerable: true,
14
+ configurable: true,
15
+ writable: true,
16
+ value: null
17
+ });
18
+ Object.defineProperty(this, "statsDataUnsub", {
19
+ enumerable: true,
20
+ configurable: true,
21
+ writable: true,
22
+ value: null
23
+ });
24
+ Object.defineProperty(this, "isDataLoadingUnsub", {
25
+ enumerable: true,
26
+ configurable: true,
27
+ writable: true,
28
+ value: null
29
+ });
30
+ Object.defineProperty(this, "errorStateListener", {
31
+ enumerable: true,
32
+ configurable: true,
33
+ writable: true,
34
+ value: null
35
+ });
36
+ Object.defineProperty(this, "vm", {
37
+ enumerable: true,
38
+ configurable: true,
39
+ writable: true,
40
+ value: void 0
41
+ });
42
+ Object.defineProperty(this, "clearTabLoadFailure", {
43
+ enumerable: true,
44
+ configurable: true,
45
+ writable: true,
46
+ value: () => {
47
+ this.viewModel.clearTabLoadFailure();
48
+ }
49
+ });
50
+ Object.defineProperty(this, "onArrowPress", {
51
+ enumerable: true,
52
+ configurable: true,
53
+ writable: true,
54
+ value: (d) => {
55
+ if (d === 'left') {
56
+ SDK.getMaestroEventViewModel().deliverFocus();
57
+ }
58
+ }
59
+ });
60
+ Object.defineProperty(this, "renderItems", {
61
+ enumerable: true,
62
+ configurable: true,
63
+ writable: true,
64
+ value: () => {
65
+ const { statsItems } = this.state;
66
+ if (this.state.errorState === 'tabLoadFailure') {
67
+ return (React.createElement(TabLoadErrorView, { onEnterPress: this.clearTabLoadFailure, onArrowPress: this.onArrowPress }));
68
+ }
69
+ try {
70
+ return statsItems.map((item) => (React.createElement(StatsItemView, { key: item.type, item: item, onEnterPress: this.onEnterPress })));
71
+ }
72
+ catch (error) {
73
+ captureException(error, { statsItems });
74
+ console.error('Error rendering stats components:', error);
75
+ return null;
76
+ }
77
+ }
78
+ });
79
+ Object.defineProperty(this, "onEnterPress", {
80
+ enumerable: true,
81
+ configurable: true,
82
+ writable: true,
83
+ value: (item) => {
84
+ this.viewModel.onEngage(item.type);
85
+ }
86
+ });
87
+ this.vm = SDK.getMaestroEventViewModel().statsViewModel;
88
+ this.state = {
89
+ container: null,
90
+ isDataLoading: this.viewModel.isDataLoading.value,
91
+ statsItems: this.viewModel.statsItems.value,
92
+ errorState: this.viewModel.errorState.value,
93
+ };
94
+ }
95
+ get viewModel() {
96
+ if (!this.vm) {
97
+ throw new Error('StatsViewModel is not initialized');
98
+ }
99
+ return this.vm;
100
+ }
101
+ componentDidMount() {
102
+ this.setState({
103
+ container: this.container,
104
+ });
105
+ this.statsDataUnsub = this.viewModel.statsItems.subscribe((value) => {
106
+ this.setState({ statsItems: value });
107
+ });
108
+ this.isDataLoadingUnsub = this.viewModel.isDataLoading.subscribe((value) => {
109
+ this.setState({ isDataLoading: value });
110
+ });
111
+ this.errorStateListener = this.viewModel.errorState.subscribe((value) => {
112
+ this.setState({ errorState: value });
113
+ });
114
+ this.setState({
115
+ container: this.container,
116
+ });
117
+ // Initialize the view model
118
+ this.viewModel.init();
119
+ }
120
+ componentWillUnmount() {
121
+ this.statsDataUnsub && this.statsDataUnsub();
122
+ this.isDataLoadingUnsub && this.isDataLoadingUnsub();
123
+ this.errorStateListener && this.errorStateListener();
124
+ // Clean up the view model
125
+ this.viewModel.cleanup();
126
+ }
127
+ render() {
128
+ const { container } = this.state;
129
+ return (React.createElement(ScrollableContainer, { scrollableContainerRef: container, containerTopOffset: STICKY_HEADER_HEIGHT },
130
+ React.createElement("div", { ref: (el) => {
131
+ this.container = el;
132
+ }, className: "stats-view" },
133
+ this.renderItems(),
134
+ React.createElement("div", { className: "stats-bottom-padding" }))));
135
+ }
136
+ }
137
+ export default StatsView;
@@ -0,0 +1,43 @@
1
+ import React from 'react';
2
+ import './TeamStatsView.styles.css';
3
+ import Image from '@/components/atoms/Image';
4
+ import { withFocusable, } from '@/external/spatial-navigation';
5
+ import { renderTeamStatistic } from '../../utils/renderTeamStatistic';
6
+ const TeamStatsView = (props) => {
7
+ const { item } = props;
8
+ const { homeTeam, awayTeam, statistics } = item;
9
+ return (React.createElement("section", { className: "team-stats-view focus-ring", "data-focused": props.focused, style: {
10
+ '--home-team': `#${homeTeam.color}`,
11
+ '--away-team': `#${awayTeam.color}`,
12
+ } },
13
+ React.createElement("div", { className: "team-stats-header" },
14
+ React.createElement("div", { className: "team-stats-team away-team" },
15
+ React.createElement("div", { className: "team-stats-team-inner" },
16
+ awayTeam.logo && (React.createElement(Image, { src: awayTeam.logo, alt: awayTeam.displayName, crossOrigin: "anonymous", className: "team-logo" })),
17
+ React.createElement("div", { className: "team-swatch away-swatch" }),
18
+ React.createElement("span", { className: "team-abbreviation" }, awayTeam.abbreviation))),
19
+ React.createElement("h2", { className: "stats-title T05_ALT" }, "Team Stats"),
20
+ React.createElement("div", { className: "team-stats-team home-team" },
21
+ React.createElement("div", { className: "team-stats-team-inner" },
22
+ React.createElement("span", { className: "team-abbreviation" }, homeTeam.abbreviation),
23
+ React.createElement("div", { className: "team-swatch home-swatch" }),
24
+ homeTeam.logo && (React.createElement(Image, { src: homeTeam.logo, alt: homeTeam.displayName, crossOrigin: "anonymous", className: "team-logo" }))))),
25
+ React.createElement("div", { className: "team-stats-content" }, statistics.map((statistic) => {
26
+ return renderTeamStatistic({
27
+ statisticName: statistic.displayName,
28
+ firstDisplayValue: statistic.awayTeamDisplayValue,
29
+ secondDisplayValue: statistic.homeTeamDisplayValue,
30
+ awayProgressValue: statistic.awayTeamValue,
31
+ homeProgressValue: statistic.homeTeamValue,
32
+ key: statistic.displayName,
33
+ classNames: {
34
+ container: 'team-stat-item',
35
+ header: 'stat-header',
36
+ firstValue: 'stat-value T30 away-value FONT_BOLD',
37
+ secondValue: 'stat-value T30 home-value FONT_BOLD',
38
+ statisticName: 'stat-name T02',
39
+ },
40
+ });
41
+ }))));
42
+ };
43
+ export default withFocusable()(TeamStatsView);
@@ -0,0 +1 @@
1
+ export { default } from './TeamStatsView';
@@ -0,0 +1,83 @@
1
+ import React, { Children } from 'react';
2
+ class StatsCarousel extends React.Component {
3
+ constructor(props) {
4
+ super(props);
5
+ Object.defineProperty(this, "interval", {
6
+ enumerable: true,
7
+ configurable: true,
8
+ writable: true,
9
+ value: null
10
+ });
11
+ Object.defineProperty(this, "trackRef", {
12
+ enumerable: true,
13
+ configurable: true,
14
+ writable: true,
15
+ value: null
16
+ });
17
+ this.state = {
18
+ currentIndex: 0,
19
+ isTransitioning: true,
20
+ };
21
+ this.setTrackRef = this.setTrackRef.bind(this);
22
+ }
23
+ setTrackRef(el) {
24
+ this.trackRef = el;
25
+ }
26
+ componentDidMount() {
27
+ this.startInterval();
28
+ }
29
+ componentWillUnmount() {
30
+ this.clearInterval();
31
+ }
32
+ componentDidUpdate(_prevProps, prevState) {
33
+ // If we just jumped to the clone, reset to the real first slide (no transition)
34
+ if (prevState.currentIndex !== this.state.currentIndex &&
35
+ this.state.currentIndex === this.props.itemsLength) {
36
+ this.setState({ isTransitioning: false, currentIndex: 0 }, () => {
37
+ // Use requestAnimationFrame to re-enable transition after DOM update
38
+ if (typeof window !== 'undefined' && window.requestAnimationFrame) {
39
+ window.requestAnimationFrame(() => {
40
+ this.setState({ isTransitioning: true });
41
+ });
42
+ }
43
+ else {
44
+ // Fallback for environments without requestAnimationFrame
45
+ setTimeout(() => {
46
+ this.setState({ isTransitioning: true });
47
+ }, 0);
48
+ }
49
+ });
50
+ }
51
+ }
52
+ startInterval() {
53
+ this.clearInterval();
54
+ this.interval = window.setInterval(() => {
55
+ this.setState((state) => ({ currentIndex: state.currentIndex + 1 }));
56
+ }, 6000);
57
+ }
58
+ clearInterval() {
59
+ if (this.interval) {
60
+ clearInterval(this.interval);
61
+ this.interval = null;
62
+ }
63
+ }
64
+ render() {
65
+ const { children } = this.props;
66
+ const { currentIndex, isTransitioning } = this.state;
67
+ const childrenArray = Children.toArray(children);
68
+ return (React.createElement("div", { className: "carousel", style: { overflow: 'hidden', width: '100%' } },
69
+ React.createElement("div", { className: "carousel-track", ref: this.setTrackRef, style: {
70
+ whiteSpace: 'nowrap',
71
+ transition: isTransitioning ? 'transform 0.5s ease' : 'none',
72
+ transform: 'translateX(-' + currentIndex * 100 + '%)',
73
+ } }, childrenArray.map((child) => child))));
74
+ }
75
+ }
76
+ const CarouselSlider = (props) => {
77
+ return (React.createElement("div", { className: "carousel-slide", style: {
78
+ width: '100%',
79
+ display: 'inline-block',
80
+ verticalAlign: 'top',
81
+ } }, props.children));
82
+ };
83
+ export { StatsCarousel, CarouselSlider };
@@ -0,0 +1,19 @@
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-solid", style: {
8
+ width: `${awayTeamPercentage}%`,
9
+ } }),
10
+ React.createElement("div", { className: "progress-stripes", style: {
11
+ left: `${awayTeamPercentage}%`,
12
+ width: `${100 - awayTeamPercentage}%`,
13
+ } }),
14
+ React.createElement("div", { className: "progress-divider", style: {
15
+ left: `${awayTeamPercentage}%`,
16
+ display: awayTeamPercentage === 0 ? 'none' : 'block',
17
+ } }))));
18
+ };
19
+ export default StatsProgressBar;
@@ -0,0 +1,27 @@
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
+ const Teams = (props) => {
6
+ const item = props.item;
7
+ const teams = [item.awayTeam, item.homeTeam];
8
+ return (React.createElement("section", { className: "stats-teams-view focus-ring", "data-focused": props.focused, style: {
9
+ '--home-team': `#${item.homeTeam.color}`,
10
+ '--away-team': `#${item.awayTeam.color}`,
11
+ }, "data-live": item.isLive },
12
+ React.createElement("div", { className: "stats-teams-view-header" }, teams.map((team) => (React.createElement("div", { key: team.id, className: "stats-team" },
13
+ React.createElement(Image, { src: team.logo, alt: team.name, crossOrigin: "anonymous" }),
14
+ React.createElement("div", null,
15
+ React.createElement("span", { className: item.isLive ? 'T05_ALT FONT_BOLD' : 'T30 FONT_BOLD' }, team.abbreviation),
16
+ React.createElement("p", { className: "T02" }, team.record)))))),
17
+ item.isLive && (React.createElement("div", { className: "statistics" },
18
+ React.createElement("table", { className: "statistics-table" },
19
+ React.createElement("thead", null,
20
+ React.createElement("tr", null,
21
+ React.createElement("th", { className: "T10" }),
22
+ item.linescoresHeader.map((header) => (React.createElement("th", { key: header, className: "T10" }, header))))),
23
+ React.createElement("tbody", null, teams.map((team) => (React.createElement("tr", { key: team.id },
24
+ React.createElement("td", { className: "T30 FONT_BOLD" }, team.name),
25
+ team.linescores.map((lineScore, index) => (React.createElement("td", { key: `${lineScore}-${index}`, className: "T10" }, lineScore))))))))))));
26
+ };
27
+ export default withFocusable()(Teams);
@@ -0,0 +1,2 @@
1
+ import Teams from './Teams';
2
+ export default Teams;
@@ -0,0 +1,28 @@
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
+ const item = props.item;
7
+ return (React.createElement("section", { className: "win-probability focus-ring", "data-focused": props.focused },
8
+ React.createElement("h5", { className: "T05_ALT" }, "Win Probability"),
9
+ React.createElement("div", { className: "win-probability-card" }, [item.awayTeam, item.homeTeam].map((team, index) => {
10
+ return (React.createElement("div", { className: "team", key: team.id },
11
+ React.createElement(Image, { src: team.logo, alt: `${team.abbreviation} logo`, crossOrigin: "anonymous" }),
12
+ React.createElement("div", { className: "info" },
13
+ React.createElement("span", { className: "T60" }, team.winPercentage ? `${team.winPercentage}%` : '–'),
14
+ React.createElement("div", { className: "name T01" },
15
+ index === 0 ? React.createElement(AwayTeamChartLine, null) : React.createElement(HomeTeamChartLine, null),
16
+ React.createElement("span", null, team.abbreviation)))));
17
+ })),
18
+ React.createElement(Image, { src: item.chartImageUrl, alt: "Win Probability Chart", crossOrigin: "anonymous" })));
19
+ };
20
+ const AwayTeamChartLine = () => {
21
+ return (React.createElement("svg", { width: "25", height: "4", viewBox: "0 0 25 4", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
22
+ React.createElement("path", { d: "M2.33337 2H22.3334", stroke: "white", strokeWidth: "4", strokeLinecap: "round" })));
23
+ };
24
+ const HomeTeamChartLine = () => {
25
+ return (React.createElement("svg", { width: "25", height: "4", viewBox: "0 0 25 4", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
26
+ React.createElement("path", { d: "M2.66992 2H22.6699", stroke: "white", strokeWidth: "4", strokeLinecap: "round", strokeDasharray: "2 7" })));
27
+ };
28
+ export default withFocusable()(WinProbability);
@@ -0,0 +1,2 @@
1
+ import WinProbability from './WinProbability';
2
+ export default WinProbability;
@@ -0,0 +1,89 @@
1
+ import React, { Component } 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
+ import { BASE_64_KEY_PLAY_THUMBNAIL_FALLBACK } from '@/modules/key-plays/constants';
7
+ class AthletesStatistics extends Component {
8
+ constructor(props) {
9
+ super(props);
10
+ Object.defineProperty(this, "mounted", {
11
+ enumerable: true,
12
+ configurable: true,
13
+ writable: true,
14
+ value: true
15
+ });
16
+ Object.defineProperty(this, "onAwayAthleteImageLoad", {
17
+ enumerable: true,
18
+ configurable: true,
19
+ writable: true,
20
+ value: () => {
21
+ if (!this.mounted)
22
+ return;
23
+ this.setState({ awayAthleteImageLoaded: true });
24
+ }
25
+ });
26
+ Object.defineProperty(this, "onHomeAthleteImageLoad", {
27
+ enumerable: true,
28
+ configurable: true,
29
+ writable: true,
30
+ value: () => {
31
+ if (!this.mounted)
32
+ return;
33
+ this.setState({ homeAthleteImageLoaded: true });
34
+ }
35
+ });
36
+ Object.defineProperty(this, "renderAthleteImage", {
37
+ enumerable: true,
38
+ configurable: true,
39
+ writable: true,
40
+ value: (athlete, isAway) => {
41
+ const imageLoaded = isAway
42
+ ? this.state.awayAthleteImageLoaded
43
+ : this.state.homeAthleteImageLoaded;
44
+ const onLoad = isAway
45
+ ? this.onAwayAthleteImageLoad
46
+ : this.onHomeAthleteImageLoad;
47
+ return (React.createElement("div", { className: "image-wrapper T02" },
48
+ !imageLoaded && (React.createElement(Image, { src: BASE_64_KEY_PLAY_THUMBNAIL_FALLBACK, crossOrigin: "anonymous", alt: "Player Headshot Loading", className: "cardImage" })),
49
+ React.createElement(Image, { src: athlete.headshot, alt: `${this.props.item.displayName} ${athlete.displayName} Headshot Image`, crossOrigin: "anonymous", onLoad: onLoad, className: "cardImage", style: {
50
+ display: imageLoaded ? 'block' : 'none',
51
+ } }),
52
+ React.createElement("div", { className: "athlete-position-badge" },
53
+ ' ',
54
+ React.createElement("span", null, athlete.position))));
55
+ }
56
+ });
57
+ this.state = {
58
+ awayAthleteImageLoaded: false,
59
+ homeAthleteImageLoaded: false,
60
+ };
61
+ }
62
+ componentWillUnmount() {
63
+ this.mounted = false;
64
+ }
65
+ render() {
66
+ const { item, focused } = this.props;
67
+ return (React.createElement("div", { className: "athletes-statistics focus-ring", "data-focused": focused },
68
+ !!item.displayName && (React.createElement("span", { className: "T05_ALT" }, item.displayName)),
69
+ React.createElement("div", { className: "leaders-wrapper" }, [item.awayAthlete, item.homeAthlete].map((athlete, index) => {
70
+ const isAway = index === 0;
71
+ return (React.createElement("div", { className: "leader", key: athlete.id + item.displayName },
72
+ this.renderAthleteImage(athlete, isAway),
73
+ React.createElement("div", { className: "leader-info" },
74
+ React.createElement("div", { className: "main-statistic T05_ALT" },
75
+ athlete.shortName,
76
+ ' ',
77
+ React.createElement("span", { className: "athlete-number T02" },
78
+ "#",
79
+ athlete.jersey)),
80
+ Array.isArray(athlete.statistics) &&
81
+ !!athlete.statistics.length && (React.createElement("div", { className: "main-statistic T30 FONT_BOLD" },
82
+ athlete.statistics[0].displayValue,
83
+ ' ',
84
+ React.createElement("span", { className: "athlete-points T02" }, athlete.statistics[0].abbreviation))))));
85
+ })),
86
+ React.createElement(StatisticsTable, { item: item })));
87
+ }
88
+ }
89
+ export default withFocusable()(AthletesStatistics);
@@ -0,0 +1,12 @@
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.item.awayAthlete.statistics.slice(1).map((statistic, index) => {
5
+ return (React.createElement("tr", { key: statistic.abbreviation },
6
+ React.createElement("td", null, statistic.displayValue),
7
+ React.createElement("td", null, statistic.abbreviation),
8
+ React.createElement("td", null, props.item.homeAthlete.statistics[index + 1].displayValue ||
9
+ '0')));
10
+ }))));
11
+ };
12
+ export default StatisticsTable;
@@ -0,0 +1,2 @@
1
+ import AthletesStatistics from './AthletesStatistics';
2
+ export default AthletesStatistics;
@@ -0,0 +1,2 @@
1
+ export { default } from './StatsView';
2
+ export { default as TeamStatsView } from './TeamStats';
@@ -152,6 +152,11 @@ export declare class StatsViewModel extends ViewModel {
152
152
  constructor(eventId: string, delegate: IMaestroEventDelegate, options?: {
153
153
  useMockData?: boolean;
154
154
  });
155
+ /**
156
+ * Sets panel-specific data configuration
157
+ * @param panelData - Object containing panel configuration
158
+ */
159
+ setPanelData(panelData: Record<string, any>): void;
155
160
  /**
156
161
  * Initialize the ViewModel and start data fetching
157
162
  */