@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,104 @@
1
+ export const MOCK_PAGE_CONFIG = {
2
+ panels: [
3
+ {
4
+ _id: '687e7d03f8d920eec4c8e90f',
5
+ slug: 'panel-6879b0f23af9e9c90b42a24b-401769973-espnStats-generated',
6
+ panel_name: 'Stats',
7
+ panel_type: 'espnStats',
8
+ icon_name: 'stats',
9
+ },
10
+ {
11
+ _id: '687e7d03f8d920eec4c8e910',
12
+ slug: 'panel-6879b0f23af9e9c90b42a24b-401769973-espnKeyPlays-generated',
13
+ panel_name: 'Key Plays',
14
+ panel_type: 'espnKeyPlays',
15
+ icon_name: 'keyPlays',
16
+ },
17
+ {
18
+ _id: '687e7d03f8d920eec4c8e911',
19
+ slug: 'panel-6879b0f23af9e9c90b42a24b-401769973-espnBet-generated',
20
+ panel_name: 'Bets',
21
+ panel_type: 'espnBet',
22
+ icon_name: 'bets',
23
+ },
24
+ {
25
+ _id: '687e7d03f8d920eec4c8e912',
26
+ slug: 'panel-6879b0f23af9e9c90b42a24b-401769973-espnFantasy-generated',
27
+ panel_name: 'Fantasy',
28
+ panel_type: 'espnFantasy',
29
+ icon_name: 'fantasy',
30
+ },
31
+ {
32
+ _id: '687e7d03f8d920eec4c8e913',
33
+ slug: 'panel-6879b0f23af9e9c90b42a24b-401769973-espnShop-generated',
34
+ panel_name: 'Espn Shop',
35
+ panel_type: 'espnShop',
36
+ icon_name: 'espnShop',
37
+ },
38
+ ],
39
+ page: {
40
+ _id: '687e7d05f8d920eec4c8e924',
41
+ slug: '401769973-1a5f0227-a13e-396c-8cea-8961bc288666',
42
+ type: 'channel',
43
+ name: 'NHL Test Game',
44
+ metadata: {
45
+ external_field_1: '401769973',
46
+ external_field_2: '2512ac76-a335-39cb-af51-b9afffc6571d',
47
+ external_field_3: '1a5f0227-a13e-396c-8cea-8961bc288666',
48
+ external_field_4: 'event',
49
+ external_field_5: '{"leagueId":"3040"}',
50
+ },
51
+ },
52
+ insights: {
53
+ _id: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkIjp7Il9pZCI6IjY2NGI5YzU3ZDU5YTdhNDMxNTQyZDgxNCIsImNyZWF0ZWQiOjE3MTYyMzEyNTguOTQ3LCJzbHVnIjoiZXNwbiIsInVpZCI6InNpdGVfdG9rZW4ifSwiaWF0IjoxNzE2MjMxMjU4fQ.Qtl9F3Cvk1wASCK0sycxwQcuih1exjTngfjqhb19oQA',
54
+ },
55
+ site: {
56
+ _id: '664b9c57d59a7a431542d814',
57
+ domainUrl: 'www.maestro.io/espn',
58
+ package: {
59
+ version: '4.06.0',
60
+ id: 'maestro',
61
+ },
62
+ },
63
+ theme: {
64
+ _id: '66db3b75f682a8c91436c8fc',
65
+ button: {
66
+ borderRadius: 'rounded',
67
+ textCapitalization: 'uppercase',
68
+ },
69
+ colors: {
70
+ accentPrimary: '#fbc010FF',
71
+ accentSecondary: '#AD850A',
72
+ accentTertiary: '#FFFFFF',
73
+ alertConfirmation: '#43D48F',
74
+ alertError: '#FF0000',
75
+ alertWarning: '#F4D73D',
76
+ highlightPrimary: '#F3F7FF',
77
+ highlightSecondary: '#9DA0A6',
78
+ highlightTertiary: '#0C0D0D',
79
+ surface1: '#000000',
80
+ surface2: '#0D0D0D',
81
+ surface3: '#1A1A1A',
82
+ surface4: '#262626',
83
+ surface5: '#404040',
84
+ surface6: '#4D4D4D',
85
+ text100: '#FFF2F2',
86
+ text200: '#CCC2C2',
87
+ text300: '#999191',
88
+ text400: '#666161',
89
+ text500: '#0D0C0C',
90
+ },
91
+ name: 'Landing Page',
92
+ siteId: '664b9c57d59a7a431542d814',
93
+ type: 'custom',
94
+ typography: {
95
+ body: 'helvetica-lt-std-roman',
96
+ headline: 'industry-demi',
97
+ },
98
+ creator: '664b9c6b70e9a56febd2dbab',
99
+ owner: '664b9c6b70e9a56febd2dbab',
100
+ created: 1725643637480,
101
+ modified: 1733600558188,
102
+ tags: [],
103
+ },
104
+ };
@@ -0,0 +1,76 @@
1
+ import ITheme from '@/models/ITheme';
2
+ type PlatformConfig = {
3
+ analytics: {
4
+ enabled: boolean;
5
+ beacon_interval: number;
6
+ };
7
+ };
8
+ export interface GlobalConfig {
9
+ shards: string[];
10
+ bbd: PlatformConfig;
11
+ }
12
+ interface PageConfigPanel<TRendererData = unknown, TBlockData = any> {
13
+ _id: string;
14
+ slug: string;
15
+ panel_name?: string;
16
+ panel_type?: string;
17
+ icon_name?: string;
18
+ renderer?: {
19
+ block_data?: TBlockData;
20
+ icon_name?: string;
21
+ id?: string;
22
+ panel_name?: string;
23
+ panel_type?: string;
24
+ supported_platforms?: {
25
+ android?: boolean;
26
+ bbd?: boolean;
27
+ roku?: boolean;
28
+ tvos?: boolean;
29
+ } & TRendererData;
30
+ };
31
+ }
32
+ export type PageMetadata = {
33
+ /**
34
+ * Event ID or Airing ID
35
+ */
36
+ external_field_1?: string;
37
+ /**
38
+ * Sport guid
39
+ */
40
+ external_field_2?: string;
41
+ /**
42
+ * League guid
43
+ */
44
+ external_field_3?: string;
45
+ /**
46
+ * External field 1 identifier. Can be either 'airing' or 'event'.
47
+ */
48
+ external_field_4?: 'airing' | 'event';
49
+ /**
50
+ * A stringified JSON object containing additional metadata.
51
+ */
52
+ external_field_5?: string;
53
+ };
54
+ export interface PageConfig {
55
+ panels: PageConfigPanel[];
56
+ page: {
57
+ _id: string;
58
+ slug: string;
59
+ type: string;
60
+ name?: string;
61
+ metadata?: PageMetadata;
62
+ };
63
+ insights: {
64
+ _id: string | null;
65
+ };
66
+ site: {
67
+ _id: string;
68
+ domainUrl: string;
69
+ package: {
70
+ version: string;
71
+ id: string;
72
+ };
73
+ };
74
+ theme?: ITheme | null;
75
+ }
76
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,46 @@
1
+ import { HttpMethod } from './NetworkManager/NetworkManager';
2
+ import NetworkManagerFactory from './NetworkManager/NetworkManagerFactory';
3
+ /**
4
+ * Service for handling shop-related API calls
5
+ */
6
+ class ShopService {
7
+ constructor(eventId) {
8
+ Object.defineProperty(this, "networkManager", {
9
+ enumerable: true,
10
+ configurable: true,
11
+ writable: true,
12
+ value: void 0
13
+ });
14
+ Object.defineProperty(this, "eventId", {
15
+ enumerable: true,
16
+ configurable: true,
17
+ writable: true,
18
+ value: void 0
19
+ });
20
+ this.eventId = eventId;
21
+ this.networkManager = NetworkManagerFactory.createForService({
22
+ externalBaseURL: 'https://site.api.espn.com',
23
+ serviceType: 'shop',
24
+ });
25
+ }
26
+ /**
27
+ * Start polling shop data
28
+ *
29
+ * @param interval - The polling interval in milliseconds
30
+ * @param onData - Callback for successful data fetch with headers
31
+ * @param onError - Callback for errors
32
+ * @returns Object with a stop function to stop polling
33
+ */
34
+ pollShopData(interval, onData, onError) {
35
+ return this.networkManager.pollExternalApiRequestWithHeaders({
36
+ endpoint: `/apis/site/v2/events/${this.eventId}/shop`,
37
+ interval,
38
+ method: HttpMethod.GET,
39
+ params: {},
40
+ headers: {},
41
+ onData,
42
+ onError,
43
+ });
44
+ }
45
+ }
46
+ export default ShopService;
@@ -0,0 +1,9 @@
1
+ import { Observable } from '../../helpers/Observable';
2
+ import { PageConfig } from './types';
3
+ export default class PageService {
4
+ configObservable: Observable<PageConfig | null>;
5
+ private client;
6
+ constructor();
7
+ fetchPageConfig(siteId: string, eventId: string): Promise<PageConfig | null>;
8
+ static isPanelAvailable(pageConfig: PageConfig | null, panelType: string): boolean | undefined;
9
+ }
@@ -6,5 +6,7 @@ export default class StaticService {
6
6
  constructor();
7
7
  fetchPageConfig(siteId: string, eventId: string): Promise<PageConfig | null>;
8
8
  static isPanelAvailable(pageConfig: PageConfig | null, panelType: string): boolean | undefined;
9
- fetchGlobalConfig(): Promise<GlobalConfig | null>;
9
+ pollGlobalConfig(onData: (data: GlobalConfig) => void): {
10
+ stop: () => void;
11
+ };
10
12
  }
@@ -0,0 +1,59 @@
1
+ import { Observable } from '../../helpers/Observable';
2
+ import AxiosNetworkClient from '@/external/AxiosNetworkClient';
3
+ import { captureException } from '@/sentry';
4
+ import NetworkManager from '../NetworkManager/NetworkManager';
5
+ export default class StaticService {
6
+ constructor() {
7
+ Object.defineProperty(this, "configObservable", {
8
+ enumerable: true,
9
+ configurable: true,
10
+ writable: true,
11
+ value: new Observable(null)
12
+ });
13
+ Object.defineProperty(this, "client", {
14
+ enumerable: true,
15
+ configurable: true,
16
+ writable: true,
17
+ value: void 0
18
+ });
19
+ this.client = new NetworkManager({
20
+ externalNetworkClient: new AxiosNetworkClient({
21
+ backoff: 2,
22
+ baseURL: 'https://static-prod.us-central1-espn-prod.gcp.maestro.io',
23
+ delay: 1000,
24
+ retries: 5,
25
+ }),
26
+ });
27
+ }
28
+ fetchPageConfig(siteId, eventId) {
29
+ try {
30
+ return this.client.externalApiRequest({
31
+ endpoint: `/pages/sites/${siteId}/metadata/${eventId}.json`,
32
+ });
33
+ }
34
+ catch (err) {
35
+ captureException(err, { siteId, eventId });
36
+ console.error(`Failed to fetch page configuration for site ${siteId} and event ${eventId}:`, err instanceof Error ? err.message : String(err));
37
+ return Promise.resolve(null);
38
+ }
39
+ }
40
+ static isPanelAvailable(pageConfig, panelType) {
41
+ return pageConfig?.panels?.some((panel) => panel.panel_type === panelType &&
42
+ panel.renderer?.supported_platforms?.bbd !== false);
43
+ }
44
+ pollGlobalConfig(onData) {
45
+ // random interval from 4 - 6 minutes
46
+ const interval = 240000 + Math.floor(Math.random() * 120000);
47
+ return this.client.pollExternalApiRequest({
48
+ endpoint: `/config/global.json`,
49
+ interval,
50
+ onData,
51
+ onError: (err) => {
52
+ captureException(err, {
53
+ context: 'StaticService.pollGlobalConfig',
54
+ });
55
+ console.error(`Failed to poll global configuration`, err instanceof Error ? err.message : String(err));
56
+ },
57
+ });
58
+ }
59
+ }
@@ -0,0 +1,2 @@
1
+ import StaticService from './StaticService';
2
+ export default StaticService;
@@ -0,0 +1,104 @@
1
+ export const MOCK_PAGE_CONFIG = {
2
+ panels: [
3
+ {
4
+ _id: '687e7d03f8d920eec4c8e90f',
5
+ slug: 'panel-6879b0f23af9e9c90b42a24b-401769973-espnStats-generated',
6
+ panel_name: 'Stats',
7
+ panel_type: 'espnStats',
8
+ icon_name: 'stats',
9
+ },
10
+ {
11
+ _id: '687e7d03f8d920eec4c8e910',
12
+ slug: 'panel-6879b0f23af9e9c90b42a24b-401769973-espnKeyPlays-generated',
13
+ panel_name: 'Key Plays',
14
+ panel_type: 'espnKeyPlays',
15
+ icon_name: 'keyPlays',
16
+ },
17
+ {
18
+ _id: '687e7d03f8d920eec4c8e911',
19
+ slug: 'panel-6879b0f23af9e9c90b42a24b-401769973-espnBet-generated',
20
+ panel_name: 'Bets',
21
+ panel_type: 'espnBet',
22
+ icon_name: 'bets',
23
+ },
24
+ {
25
+ _id: '687e7d03f8d920eec4c8e912',
26
+ slug: 'panel-6879b0f23af9e9c90b42a24b-401769973-espnFantasy-generated',
27
+ panel_name: 'Fantasy',
28
+ panel_type: 'espnFantasy',
29
+ icon_name: 'fantasy',
30
+ },
31
+ {
32
+ _id: '687e7d03f8d920eec4c8e913',
33
+ slug: 'panel-6879b0f23af9e9c90b42a24b-401769973-espnShop-generated',
34
+ panel_name: 'Espn Shop',
35
+ panel_type: 'espnShop',
36
+ icon_name: 'espnShop',
37
+ },
38
+ ],
39
+ page: {
40
+ _id: '687e7d05f8d920eec4c8e924',
41
+ slug: '401769973-1a5f0227-a13e-396c-8cea-8961bc288666',
42
+ type: 'channel',
43
+ name: 'NHL Test Game',
44
+ metadata: {
45
+ external_field_1: '401769973',
46
+ external_field_2: '2512ac76-a335-39cb-af51-b9afffc6571d',
47
+ external_field_3: '1a5f0227-a13e-396c-8cea-8961bc288666',
48
+ external_field_4: 'event',
49
+ external_field_5: '{"leagueId":"3040"}',
50
+ },
51
+ },
52
+ insights: {
53
+ _id: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkIjp7Il9pZCI6IjY2NGI5YzU3ZDU5YTdhNDMxNTQyZDgxNCIsImNyZWF0ZWQiOjE3MTYyMzEyNTguOTQ3LCJzbHVnIjoiZXNwbiIsInVpZCI6InNpdGVfdG9rZW4ifSwiaWF0IjoxNzE2MjMxMjU4fQ.Qtl9F3Cvk1wASCK0sycxwQcuih1exjTngfjqhb19oQA',
54
+ },
55
+ site: {
56
+ _id: '664b9c57d59a7a431542d814',
57
+ domainUrl: 'www.maestro.io/espn',
58
+ package: {
59
+ version: '4.06.0',
60
+ id: 'maestro',
61
+ },
62
+ },
63
+ theme: {
64
+ _id: '66db3b75f682a8c91436c8fc',
65
+ button: {
66
+ borderRadius: 'rounded',
67
+ textCapitalization: 'uppercase',
68
+ },
69
+ colors: {
70
+ accentPrimary: '#fbc010FF',
71
+ accentSecondary: '#AD850A',
72
+ accentTertiary: '#FFFFFF',
73
+ alertConfirmation: '#43D48F',
74
+ alertError: '#FF0000',
75
+ alertWarning: '#F4D73D',
76
+ highlightPrimary: '#F3F7FF',
77
+ highlightSecondary: '#9DA0A6',
78
+ highlightTertiary: '#0C0D0D',
79
+ surface1: '#000000',
80
+ surface2: '#0D0D0D',
81
+ surface3: '#1A1A1A',
82
+ surface4: '#262626',
83
+ surface5: '#404040',
84
+ surface6: '#4D4D4D',
85
+ text100: '#FFF2F2',
86
+ text200: '#CCC2C2',
87
+ text300: '#999191',
88
+ text400: '#666161',
89
+ text500: '#0D0C0C',
90
+ },
91
+ name: 'Landing Page',
92
+ siteId: '664b9c57d59a7a431542d814',
93
+ type: 'custom',
94
+ typography: {
95
+ body: 'helvetica-lt-std-roman',
96
+ headline: 'industry-demi',
97
+ },
98
+ creator: '664b9c6b70e9a56febd2dbab',
99
+ owner: '664b9c6b70e9a56febd2dbab',
100
+ created: 1725643637480,
101
+ modified: 1733600558188,
102
+ tags: [],
103
+ },
104
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -6,6 +6,7 @@ import IMaestroEventDelegate from '@/interfaces/IMaestroEventDelegate';
6
6
  */
7
7
  declare class StatsService {
8
8
  networkManager: IStatsNetworkManager;
9
+ overrideUrl: string | null;
9
10
  constructor(delegate: IMaestroEventDelegate);
10
11
  /**
11
12
  * Get stats using a full sync URL (for timecode support)
@@ -0,0 +1,147 @@
1
+ import { HttpMethod } from './NetworkManager/NetworkManager';
2
+ import NetworkManagerFactory from './NetworkManager/NetworkManagerFactory';
3
+ import SDK from '..';
4
+ import { captureException } from '@/sentry';
5
+ /**
6
+ * Service for handling stats-related API calls
7
+ */
8
+ class StatsService {
9
+ constructor(delegate) {
10
+ Object.defineProperty(this, "networkManager", {
11
+ enumerable: true,
12
+ configurable: true,
13
+ writable: true,
14
+ value: void 0
15
+ });
16
+ Object.defineProperty(this, "overrideUrl", {
17
+ enumerable: true,
18
+ configurable: true,
19
+ writable: true,
20
+ value: null
21
+ });
22
+ this.networkManager = NetworkManagerFactory.createStatsNetworkManager(delegate.getStatsAPIBaseURL());
23
+ }
24
+ /**
25
+ * Get stats using a full sync URL (for timecode support)
26
+ *
27
+ * @param timeCode - The timecode in milliseconds, or null for 'latest'
28
+ * @returns Promise with the stats data
29
+ */
30
+ async getStatsByUrl(timeCode) {
31
+ return this.networkManager.externalApiRequest({
32
+ endpoint: this.getSyncEndpoint(timeCode),
33
+ method: HttpMethod.GET,
34
+ params: {},
35
+ headers: {},
36
+ });
37
+ }
38
+ /**
39
+ * Start polling using a full sync URL (for timecode support)
40
+ *
41
+ * @param timeCode - The timecode in milliseconds, or null for 'latest'
42
+ * @param interval - The polling interval in milliseconds
43
+ * @param onData - Callback for successful data fetch
44
+ * @param onError - Callback for errors
45
+ * @returns Object with a stop function to stop polling
46
+ */
47
+ pollStatsByUrl(timeCode, interval, onData, onError) {
48
+ return this.networkManager.pollExternalApiRequest({
49
+ endpoint: this.getSyncEndpoint(timeCode),
50
+ interval,
51
+ method: HttpMethod.GET,
52
+ params: {},
53
+ headers: {},
54
+ onData,
55
+ onError,
56
+ });
57
+ }
58
+ /**
59
+ * Build sync URL for timecode-based stats fetching with enhanced logging
60
+ * Enhanced with comprehensive validation and fallback strategies
61
+ *
62
+ * @param timeCode - The timecode in milliseconds, or null for 'latest'
63
+ * @returns Complete sync URL for the fauxcast stats endpoint
64
+ * @throws Error if page config is not available or required fields are missing
65
+ */
66
+ getSyncEndpoint(timeCode) {
67
+ // Apply overrideUrl if set
68
+ if (this.overrideUrl) {
69
+ console.log('[StatsService] Using overrideUrl:', this.overrideUrl);
70
+ return this.overrideUrl;
71
+ }
72
+ const pageConfig = SDK.getPageConfig();
73
+ if (!pageConfig) {
74
+ throw new Error('Page config is null or undefined');
75
+ }
76
+ const metadata = pageConfig.page.metadata;
77
+ if (!metadata?.external_field_1 || !metadata?.external_field_5) {
78
+ throw new Error('Missing eventId or leagueId in page config metadata. Cannot build sync URL. ' +
79
+ `Required fields: external_field_1 (eventId), external_field_5 (leagueId). Available fields: ${Object.keys(metadata || {}).join(', ')}`);
80
+ }
81
+ const eventId = metadata.external_field_1;
82
+ let leagueId;
83
+ try {
84
+ if (metadata.external_field_5) {
85
+ const leagueData = JSON.parse(metadata.external_field_5);
86
+ leagueId = leagueData.leagueId;
87
+ if (!leagueId) {
88
+ throw new Error('leagueId not found in parsed JSON');
89
+ }
90
+ }
91
+ else {
92
+ throw new Error('external_field_5 is empty or undefined');
93
+ }
94
+ }
95
+ catch (parseError) {
96
+ const error = new Error(`Failed to parse leagueId from external_field_5. Raw value: ${metadata.external_field_5}`);
97
+ captureException(error, {
98
+ rawValue: metadata.external_field_5,
99
+ parseError,
100
+ });
101
+ throw error;
102
+ }
103
+ if (!eventId.trim() || !leagueId.trim()) {
104
+ throw new Error('EventId or leagueId is empty string in page config metadata');
105
+ }
106
+ const formattedTimeCode = this.formatTimeCodeForAPI(timeCode);
107
+ return `/${leagueId}/${eventId}/en/us/${formattedTimeCode}`;
108
+ }
109
+ /**
110
+ * Format timecode for API consumption
111
+ * @param timeCode - Timecode in milliseconds or null
112
+ * @returns ISO date string, "pre.json" for pre-game, or "latest" for post-game
113
+ */
114
+ formatTimeCodeForAPI(timeCode) {
115
+ if (!timeCode || timeCode === 0) {
116
+ return 'latest';
117
+ }
118
+ if (typeof timeCode !== 'number' ||
119
+ isNaN(timeCode) ||
120
+ !isFinite(timeCode)) {
121
+ console.warn('Invalid timecode provided, using "latest":', timeCode);
122
+ return 'latest';
123
+ }
124
+ try {
125
+ const date = new Date(timeCode);
126
+ if (isNaN(date.getTime())) {
127
+ console.warn('Invalid date from timecode, using "latest":', timeCode);
128
+ return 'latest';
129
+ }
130
+ // For future timecodes, use "latest" since we can't fetch future data
131
+ const now = Date.now();
132
+ const timeDiff = now - timeCode;
133
+ if (timeDiff < 0) {
134
+ return 'latest';
135
+ }
136
+ // Return ISO date string without milliseconds to match API format
137
+ const isoString = date.toISOString().replace(/\.\d{3}Z$/, 'Z');
138
+ return isoString;
139
+ }
140
+ catch (error) {
141
+ captureException(error, { timeCode });
142
+ console.warn('Error formatting timecode, using "latest":', timeCode, error);
143
+ return 'latest';
144
+ }
145
+ }
146
+ }
147
+ export default StatsService;
@@ -0,0 +1,47 @@
1
+ import { BORDER_RADIUS, TEXT_CAPITALIZATION, THEME_MODES, THEME_TYPES, } from '@/models/ITheme';
2
+ const FONT_FAMILY = 'BentonSans-Medium';
3
+ export const DARK_THEME = {
4
+ _id: '6274067af74b66a544018dac',
5
+ button: {
6
+ borderRadius: BORDER_RADIUS.rounded,
7
+ textCapitalization: TEXT_CAPITALIZATION.uppercase,
8
+ },
9
+ colors: {
10
+ // Accent colors
11
+ accentPrimary: '#FFFFFF',
12
+ // Secondary accent colors
13
+ accentSecondary: '#3C3F47',
14
+ // Tertiary accent colors
15
+ accentTertiary: '#0C0C0E',
16
+ // Surface Colors
17
+ surface1: '#080A0C',
18
+ surface2: '#12141A',
19
+ surface3: '#1B1E26',
20
+ surface4: '#242833',
21
+ surface5: '#363C4D',
22
+ surface6: '#3E4759',
23
+ // Highlight colors
24
+ highlightPrimary: '#FFFFFF',
25
+ highlightSecondary: '#9A9EA9',
26
+ highlightTertiary: '#0A0C0F',
27
+ // Alert colors
28
+ alertConfirmation: '#43D48F',
29
+ alertWarning: '#F58B00',
30
+ alertError: '#FF0000',
31
+ // Text colors
32
+ text100: '#F8F9FA',
33
+ text200: '#C2C5CB',
34
+ text300: '#8D919D',
35
+ text400: '#5C606B',
36
+ text500: '#0C0C0E',
37
+ },
38
+ creator: '016901e60000000000000000',
39
+ name: 'Dark Mode',
40
+ type: THEME_TYPES.CLASSIC,
41
+ mode: THEME_MODES.DARK,
42
+ owner: '016901e60000000000000000',
43
+ typography: {
44
+ body: FONT_FAMILY,
45
+ headline: FONT_FAMILY,
46
+ },
47
+ };