@maestro_io/maestro-web-sdk 3.3.1 → 4.0.0-beta.1

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 (370) 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 +91 -0
  7. package/dist/src/__mocks__/sentry.d.ts +4 -0
  8. package/dist/src/components/atoms/BaseButton/BaseButton.d.ts +1 -1
  9. package/dist/src/components/atoms/BaseButton/BaseButton.js +11 -0
  10. package/dist/src/components/atoms/BaseButton/index.js +2 -0
  11. package/dist/src/components/atoms/Image/index.d.ts +1 -1
  12. package/dist/src/components/atoms/Image/index.js +34 -0
  13. package/dist/src/components/atoms/Rive/index.d.ts +141 -11
  14. package/dist/src/components/atoms/Rive/index.js +53 -0
  15. package/dist/src/components/atoms/SvgIcon/BetGeneralIcon.d.ts +1 -2
  16. package/dist/src/components/atoms/SvgIcon/BetGeneralIcon.js +9 -0
  17. package/dist/src/components/atoms/SvgIcon/BetsIcon.d.ts +1 -1
  18. package/dist/src/components/atoms/SvgIcon/BetsIcon.js +11 -0
  19. package/dist/src/components/atoms/SvgIcon/BetsWarningIcon.d.ts +1 -1
  20. package/dist/src/components/atoms/SvgIcon/BetsWarningIcon.js +11 -0
  21. package/dist/src/components/atoms/SvgIcon/CheckmarkIcon.d.ts +1 -2
  22. package/dist/src/components/atoms/SvgIcon/CheckmarkIcon.js +6 -0
  23. package/dist/src/components/atoms/SvgIcon/CollapseIcon.d.ts +1 -2
  24. package/dist/src/components/atoms/SvgIcon/CollapseIcon.js +6 -0
  25. package/dist/src/components/atoms/SvgIcon/ExpandIcon.d.ts +1 -2
  26. package/dist/src/components/atoms/SvgIcon/ExpandIcon.js +6 -0
  27. package/dist/src/components/atoms/SvgIcon/FantasyIcon.d.ts +1 -1
  28. package/dist/src/components/atoms/SvgIcon/FantasyIcon.js +15 -0
  29. package/dist/src/components/atoms/SvgIcon/FlameIcon.d.ts +1 -1
  30. package/dist/src/components/atoms/SvgIcon/FlameIcon.js +11 -0
  31. package/dist/src/components/atoms/SvgIcon/Icon.d.ts +5 -5
  32. package/dist/src/components/atoms/SvgIcon/Icon.js +44 -0
  33. package/dist/src/components/atoms/SvgIcon/KeyPlaysIcon.d.ts +1 -1
  34. package/dist/src/components/atoms/SvgIcon/KeyPlaysIcon.js +10 -0
  35. package/dist/src/components/atoms/SvgIcon/MobilePhoneIcon.d.ts +1 -1
  36. package/dist/src/components/atoms/SvgIcon/MobilePhoneIcon.js +11 -0
  37. package/dist/src/components/atoms/SvgIcon/PlayIcon.d.ts +1 -1
  38. package/dist/src/components/atoms/SvgIcon/PlayIcon.js +8 -0
  39. package/dist/src/components/atoms/SvgIcon/ShopIcon.d.ts +1 -1
  40. package/dist/src/components/atoms/SvgIcon/ShopIcon.js +7 -0
  41. package/dist/src/components/atoms/SvgIcon/StatsIcon.d.ts +1 -1
  42. package/dist/src/components/atoms/SvgIcon/StatsIcon.js +12 -0
  43. package/dist/src/components/atoms/SvgIcon/TimesIcon.d.ts +1 -2
  44. package/dist/src/components/atoms/SvgIcon/TimesIcon.js +6 -0
  45. package/dist/src/components/atoms/SvgIcon/WarningIcon.d.ts +1 -1
  46. package/dist/src/components/atoms/SvgIcon/WarningIcon.js +8 -0
  47. package/dist/src/components/atoms/SvgIcon/index.js +2 -0
  48. package/dist/src/components/core/App/App.d.ts +1 -1
  49. package/dist/src/components/core/App/App.js +35 -0
  50. package/dist/src/components/core/App/index.js +2 -0
  51. package/dist/src/components/core/OverlayContainer.js +58 -0
  52. package/dist/src/components/core/PanelManager/PanelManager.d.ts +1 -1
  53. package/dist/src/components/core/PanelManager/PanelManager.js +86 -0
  54. package/dist/src/components/core/PanelManager/index.js +2 -0
  55. package/dist/src/components/core/ScrollableContainer/FocusableItem.js +38 -0
  56. package/dist/src/components/core/ScrollableContainer/ScrollableContainer.d.ts +8 -7
  57. package/dist/src/components/core/ScrollableContainer/ScrollableContainer.js +169 -0
  58. package/dist/src/components/core/ScrollableContainer/index.js +2 -0
  59. package/dist/src/components/molecules/ActionButton/ActionButton.d.ts +53 -7
  60. package/dist/src/components/molecules/ActionButton/ActionButton.js +10 -0
  61. package/dist/src/components/molecules/ActionButton/index.js +2 -0
  62. package/dist/src/components/molecules/HeadshotImage/HeadshotImage.d.ts +1 -1
  63. package/dist/src/components/molecules/HeadshotImage/HeadshotImage.js +50 -0
  64. package/dist/src/components/molecules/HeadshotImage/index.js +2 -0
  65. package/dist/src/components/molecules/Overlay/Overlay.d.ts +1 -1
  66. package/dist/src/components/molecules/Overlay/Overlay.js +139 -0
  67. package/dist/src/components/molecules/Overlay/index.js +2 -0
  68. package/dist/src/components/molecules/PanelNavButton/PanelNavButton.d.ts +53 -7
  69. package/dist/src/components/molecules/PanelNavButton/PanelNavButton.js +27 -0
  70. package/dist/src/components/molecules/PanelNavButton/index.js +2 -0
  71. package/dist/src/components/molecules/SegmentButton/SegmentButton.js +10 -0
  72. package/dist/src/components/molecules/SegmentButton/index.js +2 -0
  73. package/dist/src/components/molecules/TabLoadError/TabLoadError.d.ts +53 -7
  74. package/dist/src/components/molecules/TabLoadError/TabLoadError.js +14 -0
  75. package/dist/src/components/molecules/TabLoadError/index.js +2 -0
  76. package/dist/src/components/molecules/WatchButton/WatchButton.d.ts +1 -1
  77. package/dist/src/components/molecules/WatchButton/WatchButton.js +15 -0
  78. package/dist/src/components/molecules/WatchButton/index.js +2 -0
  79. package/dist/src/components/organisms/PanelNavigation/PanelNavigation.d.ts +1 -1
  80. package/dist/src/components/organisms/PanelNavigation/PanelNavigation.js +60 -0
  81. package/dist/src/components/organisms/PanelNavigation/index.js +2 -0
  82. package/dist/src/components/organisms/SegmentController/SegmentController.d.ts +5 -4
  83. package/dist/src/components/organisms/SegmentController/SegmentController.js +76 -0
  84. package/dist/src/components/organisms/SegmentController/index.js +2 -0
  85. package/dist/src/development/MaestroEventDelegate.js +109 -0
  86. package/dist/src/development/TimeSeek.d.ts +1 -1
  87. package/dist/src/development/TimeSeek.js +218 -0
  88. package/dist/src/development/development.js +36 -0
  89. package/dist/src/external/AxiosNetworkClient.js +110 -0
  90. package/dist/src/external/LocalStorageCacheManager.js +213 -0
  91. package/dist/src/external/ReactRenderer.js +65 -0
  92. package/dist/src/external/mocks/MockExternalNetworkClient.js +187 -0
  93. package/dist/src/external/ports/cacheManager.js +1 -0
  94. package/dist/src/external/ports/networkClient.js +1 -0
  95. package/dist/src/external/ports/renderer.d.ts +1 -2
  96. package/dist/src/external/ports/renderer.js +1 -0
  97. package/dist/src/external/spatial-navigation/__mocks__/withFocusable.d.ts +8 -0
  98. package/dist/src/external/spatial-navigation/__mocks__/withFocusable.js +7 -0
  99. package/dist/src/external/spatial-navigation/index.js +3 -0
  100. package/dist/src/external/spatial-navigation/measureLayout.js +30 -0
  101. package/dist/src/external/spatial-navigation/spatialNavigation.js +876 -0
  102. package/dist/src/external/spatial-navigation/utils.js +6 -0
  103. package/dist/src/external/spatial-navigation/visualDebugger.js +76 -0
  104. package/dist/src/external/spatial-navigation/withFocusable.d.ts +53 -7
  105. package/dist/src/external/spatial-navigation/withFocusable.js +245 -0
  106. package/dist/src/helpers/Observable.js +37 -0
  107. package/dist/src/helpers/strings.js +14 -0
  108. package/dist/src/helpers/url.js +12 -0
  109. package/dist/src/index.d.ts +5 -5
  110. package/dist/src/index.js +165 -0
  111. package/dist/src/interfaces/IMaestroEvent.js +18 -0
  112. package/dist/src/interfaces/IMaestroEventDelegate.js +1 -0
  113. package/dist/src/interfaces/IMaestroManager.js +1 -0
  114. package/dist/src/interfaces/IUserSettings.js +20 -0
  115. package/dist/src/models/IModel.js +1 -0
  116. package/dist/src/models/IPanel.js +40 -0
  117. package/dist/src/models/ITheme.js +20 -0
  118. package/dist/src/models/IWinningBet.js +1 -0
  119. package/dist/src/modules/bets/interfaces/IBets.js +1 -0
  120. package/dist/src/modules/bets/mocks.js +573 -0
  121. package/dist/src/modules/bets/types/BetsAnalyticsTypes.js +1 -0
  122. package/dist/src/modules/bets/view/BetsView.d.ts +3 -3
  123. package/dist/src/modules/bets/view/BetsView.js +143 -0
  124. package/dist/src/modules/bets/view/HotProps/HotPropsView.d.ts +53 -7
  125. package/dist/src/modules/bets/view/HotProps/HotPropsView.js +150 -0
  126. package/dist/src/modules/bets/view/SixPack/SixPackView.d.ts +5 -4
  127. package/dist/src/modules/bets/view/SixPack/SixPackView.js +110 -0
  128. package/dist/src/modules/bets/view/UserBets/BetResult/BetResult.d.ts +1 -1
  129. package/dist/src/modules/bets/view/UserBets/BetResult/BetResult.js +6 -0
  130. package/dist/src/modules/bets/view/UserBets/BetsCard/BetsCard.d.ts +53 -7
  131. package/dist/src/modules/bets/view/UserBets/BetsCard/BetsCard.js +149 -0
  132. package/dist/src/modules/bets/view/UserBets/BetsCard/BetsCardEvent.d.ts +5 -4
  133. package/dist/src/modules/bets/view/UserBets/BetsCard/BetsCardEvent.js +34 -0
  134. package/dist/src/modules/bets/view/UserBets/BetsCard/BetsCardFooter.d.ts +1 -2
  135. package/dist/src/modules/bets/view/UserBets/BetsCard/BetsCardFooter.js +18 -0
  136. package/dist/src/modules/bets/view/UserBets/Boost/Boost.d.ts +1 -2
  137. package/dist/src/modules/bets/view/UserBets/Boost/Boost.js +6 -0
  138. package/dist/src/modules/bets/view/UserBets/OutcomeBadge/OutcomeBadge.d.ts +1 -2
  139. package/dist/src/modules/bets/view/UserBets/OutcomeBadge/OutcomeBadge.js +9 -0
  140. package/dist/src/modules/bets/view/UserBets/Parlay/Parlay.d.ts +1 -2
  141. package/dist/src/modules/bets/view/UserBets/Parlay/Parlay.js +13 -0
  142. package/dist/src/modules/bets/view/UserBets/Straight/Straight.d.ts +1 -2
  143. package/dist/src/modules/bets/view/UserBets/Straight/Straight.js +6 -0
  144. package/dist/src/modules/bets/view/UserBets/Teaser/Teaser.d.ts +1 -2
  145. package/dist/src/modules/bets/view/UserBets/Teaser/Teaser.js +13 -0
  146. package/dist/src/modules/bets/view/UserBets/UserBetsView.d.ts +3 -3
  147. package/dist/src/modules/bets/view/UserBets/UserBetsView.js +107 -0
  148. package/dist/src/modules/bets/view/components/Bet/Bet.d.ts +99 -11
  149. package/dist/src/modules/bets/view/components/Bet/Bet.js +32 -0
  150. package/dist/src/modules/bets/view/components/BetPill/BetPill.d.ts +1 -1
  151. package/dist/src/modules/bets/view/components/BetPill/BetPill.js +6 -0
  152. package/dist/src/modules/bets/view/components/BetsCard/BetsCard.js +15 -0
  153. package/dist/src/modules/bets/view/components/BetsCard/BetsCardHeader.d.ts +1 -1
  154. package/dist/src/modules/bets/view/components/BetsCard/BetsCardHeader.js +20 -0
  155. package/dist/src/modules/bets/view/components/GamblingDisclaimer/GamblingDisclaimer.d.ts +1 -1
  156. package/dist/src/modules/bets/view/components/GamblingDisclaimer/GamblingDisclaimer.js +14 -0
  157. package/dist/src/modules/bets/view/components/LocationWarning/LocationWarning.d.ts +1 -1
  158. package/dist/src/modules/bets/view/components/LocationWarning/LocationWarning.js +16 -0
  159. package/dist/src/modules/bets/view/components/PromoCodeBanner/PromoCodeBanner.d.ts +5 -4
  160. package/dist/src/modules/bets/view/components/PromoCodeBanner/PromoCodeBanner.js +78 -0
  161. package/dist/src/modules/bets/view/components/PromoCodeBanner/index.js +1 -0
  162. package/dist/src/modules/bets/view-model/BetsViewModel.js +974 -0
  163. package/dist/src/modules/fantasy/components/ExpandedAthleteList/ExpandedAthletesList.d.ts +1 -1
  164. package/dist/src/modules/fantasy/components/ExpandedAthleteList/ExpandedAthletesList.js +107 -0
  165. package/dist/src/modules/fantasy/components/ExpandedAthleteList/index.js +1 -0
  166. package/dist/src/modules/fantasy/components/LeagueCard/LeagueCard.d.ts +53 -7
  167. package/dist/src/modules/fantasy/components/LeagueCard/LeagueCard.js +20 -0
  168. package/dist/src/modules/fantasy/components/LeagueCard/index.js +2 -0
  169. package/dist/src/modules/fantasy/components/TopPlayerCard/TopPlayerCard.d.ts +53 -7
  170. package/dist/src/modules/fantasy/components/TopPlayerCard/TopPlayerCard.js +29 -0
  171. package/dist/src/modules/fantasy/components/TopPlayerCard/index.js +2 -0
  172. package/dist/src/modules/fantasy/mocks.js +3682 -0
  173. package/dist/src/modules/fantasy/types.js +6 -0
  174. package/dist/src/modules/fantasy/view/ActiveAthletesMarquee/ActiveAthletesMarquee.d.ts +1 -1
  175. package/dist/src/modules/fantasy/view/ActiveAthletesMarquee/ActiveAthletesMarquee.js +74 -0
  176. package/dist/src/modules/fantasy/view/ActiveAthletesMarquee/index.js +2 -0
  177. package/dist/src/modules/fantasy/view/ErrorBoundary.d.ts +13 -0
  178. package/dist/src/modules/fantasy/view/FantasyItemView.d.ts +6 -5
  179. package/dist/src/modules/fantasy/view/FantasyItemView.js +74 -0
  180. package/dist/src/modules/fantasy/view/FantasyView.d.ts +3 -3
  181. package/dist/src/modules/fantasy/view/FantasyView.js +133 -0
  182. package/dist/src/modules/fantasy/view/InactiveLeague/DraftDateCountdown.d.ts +1 -1
  183. package/dist/src/modules/fantasy/view/InactiveLeague/DraftDateCountdown.js +95 -0
  184. package/dist/src/modules/fantasy/view/InactiveLeague/InactiveLeague.d.ts +53 -7
  185. package/dist/src/modules/fantasy/view/InactiveLeague/InactiveLeague.js +13 -0
  186. package/dist/src/modules/fantasy/view/InactiveLeague/index.js +2 -0
  187. package/dist/src/modules/fantasy/view/LoginView/LoginView.d.ts +53 -7
  188. package/dist/src/modules/fantasy/view/LoginView/LoginView.js +27 -0
  189. package/dist/src/modules/fantasy/view/LoginView/index.js +2 -0
  190. package/dist/src/modules/fantasy/view/MatchupPair/DoubleAthleteCard/DoubleAthleteCard.d.ts +53 -7
  191. package/dist/src/modules/fantasy/view/MatchupPair/DoubleAthleteCard/DoubleAthleteCard.js +25 -0
  192. package/dist/src/modules/fantasy/view/MatchupPair/DoubleAthleteCard/index.js +2 -0
  193. package/dist/src/modules/fantasy/view/MatchupPair/ExpandedDoubleAthleteCards.d.ts +1 -1
  194. package/dist/src/modules/fantasy/view/MatchupPair/ExpandedDoubleAthleteCards.js +9 -0
  195. package/dist/src/modules/fantasy/view/MatchupPair/MatchupPair.d.ts +53 -7
  196. package/dist/src/modules/fantasy/view/MatchupPair/MatchupPair.js +118 -0
  197. package/dist/src/modules/fantasy/view/MatchupPair/index.js +2 -0
  198. package/dist/src/modules/fantasy/view/MatchupSingle/ExpandedSingleAthleteCards.d.ts +1 -1
  199. package/dist/src/modules/fantasy/view/MatchupSingle/ExpandedSingleAthleteCards.js +9 -0
  200. package/dist/src/modules/fantasy/view/MatchupSingle/MatchupSingle.d.ts +53 -7
  201. package/dist/src/modules/fantasy/view/MatchupSingle/MatchupSingle.js +108 -0
  202. package/dist/src/modules/fantasy/view/MatchupSingle/SingleAthleteCard/SingleAthleteCard.d.ts +53 -7
  203. package/dist/src/modules/fantasy/view/MatchupSingle/SingleAthleteCard/SingleAthleteCard.js +18 -0
  204. package/dist/src/modules/fantasy/view/MatchupSingle/SingleAthleteCard/index.js +2 -0
  205. package/dist/src/modules/fantasy/view/MatchupSingle/index.js +2 -0
  206. package/dist/src/modules/fantasy/view/PromoView/PromoView.d.ts +53 -7
  207. package/dist/src/modules/fantasy/view/PromoView/PromoView.js +12 -0
  208. package/dist/src/modules/fantasy/view/PromoView/index.js +2 -0
  209. package/dist/src/modules/fantasy/view/index.js +2 -0
  210. package/dist/src/modules/fantasy/view-model/FantasyViewModel.FantasyPolling.js +132 -0
  211. package/dist/src/modules/fantasy/view-model/FantasyViewModel.LeagueManagerPolling.js +141 -0
  212. package/dist/src/modules/fantasy/view-model/FantasyViewModel.js +534 -0
  213. package/dist/src/modules/key-plays/constants.js +292 -0
  214. package/dist/src/modules/key-plays/interfaces/IKeyPlays.js +14 -0
  215. package/dist/src/modules/key-plays/interfaces/IKeyPlaysResponse.js +1 -0
  216. package/dist/src/modules/key-plays/view/KeyPlayCardScoreTagView.d.ts +1 -1
  217. package/dist/src/modules/key-plays/view/KeyPlayCardScoreTagView.js +16 -0
  218. package/dist/src/modules/key-plays/view/KeyPlayCardView.d.ts +7 -6
  219. package/dist/src/modules/key-plays/view/KeyPlayCardView.js +139 -0
  220. package/dist/src/modules/key-plays/view/KeyPlayErrorStateView.d.ts +1 -1
  221. package/dist/src/modules/key-plays/view/KeyPlayErrorStateView.js +65 -0
  222. package/dist/src/modules/key-plays/view/KeyPlaysView.d.ts +3 -3
  223. package/dist/src/modules/key-plays/view/KeyPlaysView.js +151 -0
  224. package/dist/src/modules/key-plays/view-model/KeyPlaysViewModel.js +247 -0
  225. package/dist/src/modules/shop/mocks.js +390 -0
  226. package/dist/src/modules/shop/types.js +7 -0
  227. package/dist/src/modules/shop/view/ProductDetailView/ProductDetailView.d.ts +1 -2
  228. package/dist/src/modules/shop/view/ProductDetailView/ProductDetailView.js +56 -0
  229. package/dist/src/modules/shop/view/ProductDetailView/index.js +2 -0
  230. package/dist/src/modules/shop/view/ShopView.d.ts +3 -3
  231. package/dist/src/modules/shop/view/ShopView.js +182 -0
  232. package/dist/src/modules/shop/view/components/BrowseCard/BrowseCard.d.ts +54 -8
  233. package/dist/src/modules/shop/view/components/BrowseCard/BrowseCard.js +23 -0
  234. package/dist/src/modules/shop/view/components/BrowseCard/index.js +2 -0
  235. package/dist/src/modules/shop/view/components/ProductSummaryCard/ProductSummaryCard.d.ts +53 -7
  236. package/dist/src/modules/shop/view/components/ProductSummaryCard/ProductSummaryCard.js +26 -0
  237. package/dist/src/modules/shop/view/components/ProductSummaryCard/index.js +1 -0
  238. package/dist/src/modules/shop/view/components/ShopPromoView/ShopPromoView.d.ts +1 -2
  239. package/dist/src/modules/shop/view/components/ShopPromoView/ShopPromoView.js +19 -0
  240. package/dist/src/modules/shop/view/components/ShopPromoView/index.js +1 -0
  241. package/dist/src/modules/shop/view/components/ShopSection/ShopSection.d.ts +6 -4
  242. package/dist/src/modules/shop/view/components/ShopSection/ShopSection.js +61 -0
  243. package/dist/src/modules/shop/view/components/ShopSection/ShopSectionItem.d.ts +18 -0
  244. package/dist/src/modules/shop/view/components/ShopSection/ShopSectionItem.js +22 -0
  245. package/dist/src/modules/shop/view/components/ShopSection/index.js +1 -0
  246. package/dist/src/modules/shop/view/index.js +2 -0
  247. package/dist/src/modules/shop/view-model/ShopViewModel.ShopPolling.js +111 -0
  248. package/dist/src/modules/shop/view-model/ShopViewModel.js +353 -0
  249. package/dist/src/modules/stats/interfaces/IStats.js +1 -0
  250. package/dist/src/modules/stats/mocks.js +746 -0
  251. package/dist/src/modules/stats/utils/driveSummaryUtils.js +48 -0
  252. package/dist/src/modules/stats/utils/renderTeamStatistic.d.ts +1 -2
  253. package/dist/src/modules/stats/utils/renderTeamStatistic.js +16 -0
  254. package/dist/src/modules/stats/utils.js +62 -0
  255. package/dist/src/modules/stats/view/ActiveAthletes/ActiveAthletes.d.ts +2 -2
  256. package/dist/src/modules/stats/view/ActiveAthletes/ActiveAthletes.js +98 -0
  257. package/dist/src/modules/stats/view/ActiveAthletes/CollapsedAthletes/CollapsedAthletes.d.ts +1 -2
  258. package/dist/src/modules/stats/view/ActiveAthletes/CollapsedAthletes/CollapsedAthletes.js +27 -0
  259. package/dist/src/modules/stats/view/ActiveAthletes/ExpandedAthletes/ExpandedAthletes.d.ts +1 -1
  260. package/dist/src/modules/stats/view/ActiveAthletes/ExpandedAthletes/ExpandedAthletes.js +89 -0
  261. package/dist/src/modules/stats/view/ActiveAthletes/index.js +2 -0
  262. package/dist/src/modules/stats/view/DriveSummary/DrivePlayCard.d.ts +53 -7
  263. package/dist/src/modules/stats/view/DriveSummary/DrivePlayCard.js +70 -0
  264. package/dist/src/modules/stats/view/DriveSummary/DriveSummary.d.ts +1 -1
  265. package/dist/src/modules/stats/view/DriveSummary/DriveSummary.js +87 -0
  266. package/dist/src/modules/stats/view/DriveSummary/ExpandedItems/DriveSummaryExpanded.d.ts +1 -1
  267. package/dist/src/modules/stats/view/DriveSummary/ExpandedItems/DriveSummaryExpanded.js +129 -0
  268. package/dist/src/modules/stats/view/DriveSummary/Header/DriveSummaryHeader.d.ts +1 -2
  269. package/dist/src/modules/stats/view/DriveSummary/Header/DriveSummaryHeader.js +26 -0
  270. package/dist/src/modules/stats/view/DriveSummary/MainStat/MainStat.d.ts +1 -2
  271. package/dist/src/modules/stats/view/DriveSummary/MainStat/MainStat.js +24 -0
  272. package/dist/src/modules/stats/view/DriveSummary/index.js +2 -0
  273. package/dist/src/modules/stats/view/GameLeaders/GameLeaders.d.ts +5 -4
  274. package/dist/src/modules/stats/view/GameLeaders/GameLeaders.js +48 -0
  275. package/dist/src/modules/stats/view/GameLeaders/index.js +2 -0
  276. package/dist/src/modules/stats/view/MatchPredictor/DonutChart/DonutChart.d.ts +2 -2
  277. package/dist/src/modules/stats/view/MatchPredictor/DonutChart/DonutChart.js +55 -0
  278. package/dist/src/modules/stats/view/MatchPredictor/DonutChart/index.js +1 -0
  279. package/dist/src/modules/stats/view/MatchPredictor/MatchPredictorView.d.ts +53 -7
  280. package/dist/src/modules/stats/view/MatchPredictor/MatchPredictorView.js +60 -0
  281. package/dist/src/modules/stats/view/MatchPredictor/index.js +2 -0
  282. package/dist/src/modules/stats/view/Penalties/Penalties.d.ts +1 -2
  283. package/dist/src/modules/stats/view/Penalties/Penalties.js +6 -0
  284. package/dist/src/modules/stats/view/Penalties/index.js +2 -0
  285. package/dist/src/modules/stats/view/RecentGames/RecentGames.d.ts +53 -7
  286. package/dist/src/modules/stats/view/RecentGames/RecentGames.js +23 -0
  287. package/dist/src/modules/stats/view/RecentGames/index.js +2 -0
  288. package/dist/src/modules/stats/view/ScoringSummary/ExpandedScores/ExpandedScores.d.ts +1 -1
  289. package/dist/src/modules/stats/view/ScoringSummary/ExpandedScores/ExpandedScores.js +121 -0
  290. package/dist/src/modules/stats/view/ScoringSummary/ExpandedScores/index.js +2 -0
  291. package/dist/src/modules/stats/view/ScoringSummary/ScoreItem/ScoreItem.d.ts +53 -7
  292. package/dist/src/modules/stats/view/ScoringSummary/ScoreItem/ScoreItem.js +62 -0
  293. package/dist/src/modules/stats/view/ScoringSummary/ScoreItem/index.js +2 -0
  294. package/dist/src/modules/stats/view/ScoringSummary/ScoresSection/ScoresSection.d.ts +1 -2
  295. package/dist/src/modules/stats/view/ScoringSummary/ScoresSection/ScoresSection.js +23 -0
  296. package/dist/src/modules/stats/view/ScoringSummary/ScoresSection/index.js +2 -0
  297. package/dist/src/modules/stats/view/ScoringSummary/ScoringSummary.d.ts +2 -2
  298. package/dist/src/modules/stats/view/ScoringSummary/ScoringSummary.js +106 -0
  299. package/dist/src/modules/stats/view/ScoringSummary/index.js +2 -0
  300. package/dist/src/modules/stats/view/StatsItemView.d.ts +6 -5
  301. package/dist/src/modules/stats/view/StatsItemView.js +92 -0
  302. package/dist/src/modules/stats/view/StatsQRCode/StatsQRCodeView.d.ts +53 -7
  303. package/dist/src/modules/stats/view/StatsQRCode/StatsQRCodeView.js +36 -0
  304. package/dist/src/modules/stats/view/StatsQRCode/index.js +1 -0
  305. package/dist/src/modules/stats/view/StatsView.d.ts +3 -3
  306. package/dist/src/modules/stats/view/StatsView.js +137 -0
  307. package/dist/src/modules/stats/view/TeamStats/TeamStatsView.d.ts +53 -7
  308. package/dist/src/modules/stats/view/TeamStats/TeamStatsView.js +43 -0
  309. package/dist/src/modules/stats/view/TeamStats/index.js +1 -0
  310. package/dist/src/modules/stats/view/Teams/StatsCarousel.d.ts +2 -2
  311. package/dist/src/modules/stats/view/Teams/StatsCarousel.js +83 -0
  312. package/dist/src/modules/stats/view/Teams/StatsProgressBar.d.ts +1 -2
  313. package/dist/src/modules/stats/view/Teams/StatsProgressBar.js +19 -0
  314. package/dist/src/modules/stats/view/Teams/Teams.d.ts +53 -7
  315. package/dist/src/modules/stats/view/Teams/Teams.js +43 -0
  316. package/dist/src/modules/stats/view/Teams/index.js +2 -0
  317. package/dist/src/modules/stats/view/WinProbability/WinProbability.d.ts +53 -7
  318. package/dist/src/modules/stats/view/WinProbability/WinProbability.js +28 -0
  319. package/dist/src/modules/stats/view/WinProbability/index.js +2 -0
  320. package/dist/src/modules/stats/view/components/AthletesStatistics/AthletesStatistics.d.ts +53 -7
  321. package/dist/src/modules/stats/view/components/AthletesStatistics/AthletesStatistics.js +89 -0
  322. package/dist/src/modules/stats/view/components/AthletesStatistics/StatisticTable.d.ts +1 -2
  323. package/dist/src/modules/stats/view/components/AthletesStatistics/StatisticTable.js +12 -0
  324. package/dist/src/modules/stats/view/components/AthletesStatistics/index.js +2 -0
  325. package/dist/src/modules/stats/view/index.js +2 -0
  326. package/dist/src/modules/stats/view-model/StatsViewModel.js +966 -0
  327. package/dist/src/sentry.js +31 -0
  328. package/dist/src/services/AnalyticsService/AnalyticsService.d.ts +12 -7
  329. package/dist/src/services/AnalyticsService/AnalyticsService.js +402 -0
  330. package/dist/src/services/AnalyticsService/types.js +1 -0
  331. package/dist/src/services/BetsService.js +122 -0
  332. package/dist/src/services/FantasyService.js +92 -0
  333. package/dist/src/services/GlobalService/GlobalService.d.ts +9 -0
  334. package/dist/src/services/GlobalService/PageService.d.ts +9 -0
  335. package/dist/src/services/GlobalService/index.d.ts +2 -0
  336. package/dist/src/services/GlobalService/mocks.d.ts +2 -0
  337. package/dist/src/services/GlobalService/types.d.ts +11 -0
  338. package/dist/src/services/InsightsService/InsightsPayloadBuilder.d.ts +1 -2
  339. package/dist/src/services/InsightsService/InsightsPayloadBuilder.js +386 -0
  340. package/dist/src/services/InsightsService/InsightsService.js +74 -0
  341. package/dist/src/services/NetworkManager/NetworkManager.js +457 -0
  342. package/dist/src/services/NetworkManager/NetworkManagerFactory.js +101 -0
  343. package/dist/src/services/NetworkManager/errors.js +45 -0
  344. package/dist/src/services/NetworkManager/types.js +10 -0
  345. package/dist/src/services/PageService/PageService.d.ts +9 -0
  346. package/dist/src/services/PageService/PageService.js +39 -0
  347. package/dist/src/services/PageService/index.d.ts +2 -0
  348. package/dist/src/services/PageService/index.js +2 -0
  349. package/dist/src/services/PageService/mocks.d.ts +2 -0
  350. package/dist/src/services/PageService/mocks.js +104 -0
  351. package/dist/src/services/PageService/types.d.ts +76 -0
  352. package/dist/src/services/PageService/types.js +1 -0
  353. package/dist/src/services/ShopService.js +46 -0
  354. package/dist/src/services/StaticService/PageService.d.ts +9 -0
  355. package/dist/src/services/StaticService/StaticService.d.ts +3 -1
  356. package/dist/src/services/StaticService/StaticService.js +59 -0
  357. package/dist/src/services/StaticService/index.js +2 -0
  358. package/dist/src/services/StaticService/mocks.js +104 -0
  359. package/dist/src/services/StaticService/types.js +1 -0
  360. package/dist/src/services/StatsService.js +136 -0
  361. package/dist/src/services/ThemeManager/constants.js +47 -0
  362. package/dist/src/services/UserSettingsManager.js +155 -0
  363. package/dist/src/test-polyfills.js +15 -0
  364. package/dist/src/types/OverlayTypes.js +4 -0
  365. package/dist/src/view-models/MaestroEventViewModel.d.ts +0 -2
  366. package/dist/src/view-models/MaestroEventViewModel.js +280 -0
  367. package/dist/src/view-models/OverlayViewModel.js +222 -0
  368. package/dist/src/view-models/PanelManagerViewModel.js +212 -0
  369. package/dist/src/view-models/ViewModel.js +32 -0
  370. package/package.json +13 -9
@@ -0,0 +1,155 @@
1
+ import { Observable } from '@/helpers/Observable';
2
+ import { DEFAULT_USER_SETTINGS, } from '@/interfaces/IUserSettings';
3
+ import { MaestroPanelType } from '@/models/IPanel';
4
+ const PANEL_TYPE_SETTINGS_KEY_MAP = {
5
+ [MaestroPanelType.BETS]: 'bets',
6
+ [MaestroPanelType.STATS]: 'stats',
7
+ [MaestroPanelType.KEY_PLAYS]: 'keyPlays',
8
+ [MaestroPanelType.FANTASY]: 'fantasy',
9
+ [MaestroPanelType.SHOP]: 'shop',
10
+ };
11
+ /**
12
+ * UserSettingsManager - Singleton service for managing user settings
13
+ * Uses Observable pattern for reactive updates across the SDK
14
+ */
15
+ export class UserSettingsManager {
16
+ constructor() {
17
+ Object.defineProperty(this, "_settings", {
18
+ enumerable: true,
19
+ configurable: true,
20
+ writable: true,
21
+ value: void 0
22
+ });
23
+ this._settings = new Observable(DEFAULT_USER_SETTINGS);
24
+ }
25
+ /**
26
+ * Get the singleton instance of UserSettingsManager
27
+ */
28
+ static getInstance() {
29
+ if (!UserSettingsManager.instance) {
30
+ UserSettingsManager.instance = new UserSettingsManager();
31
+ }
32
+ return UserSettingsManager.instance;
33
+ }
34
+ /**
35
+ * Get the current settings as an Observable
36
+ */
37
+ get settings() {
38
+ return this._settings;
39
+ }
40
+ /**
41
+ * Get the current settings value (snapshot)
42
+ */
43
+ getCurrentSettings() {
44
+ return this._settings.value;
45
+ }
46
+ /**
47
+ * Update user settings with validation and merge logic
48
+ * @param userSettings - New settings to apply
49
+ */
50
+ updateSettings(userSettings) {
51
+ if (!this.validateSettings(userSettings)) {
52
+ console.warn('Invalid user settings provided, using default setting');
53
+ return;
54
+ }
55
+ const mergedSettings = this.mergeSettings(this._settings.value, userSettings);
56
+ this._settings.value = mergedSettings;
57
+ }
58
+ /**
59
+ * Get settings for a specific panel type
60
+ * @param panelType - Panel type to get settings for
61
+ */
62
+ getPanelSettings(panelType) {
63
+ return this._settings.value.panels?.[panelType];
64
+ }
65
+ /**
66
+ * Check if a panel should be hidden
67
+ * @param panelType - Panel type to check
68
+ */
69
+ isPanelHidden(panelType) {
70
+ const panelKey = this.mapPanelTypeToSettingsKey(panelType);
71
+ if (!panelKey)
72
+ return false;
73
+ const panelSettings = this.getPanelSettings(panelKey);
74
+ return panelSettings?.hidePanel === true;
75
+ }
76
+ /**
77
+ * Check if wagers should be hidden for betting panel
78
+ */
79
+ shouldHideWagers() {
80
+ const betsSettings = this.getPanelSettings('bets');
81
+ return betsSettings?.hideWagers === true;
82
+ }
83
+ /**
84
+ * Reset settings to defaults
85
+ */
86
+ resetToDefaults() {
87
+ this._settings.value = DEFAULT_USER_SETTINGS;
88
+ }
89
+ /**
90
+ * Validate settings structure and values
91
+ * @param settings - Settings to validate
92
+ */
93
+ validateSettings(settings) {
94
+ if (!settings || typeof settings !== 'object') {
95
+ return false;
96
+ }
97
+ // Validate panels object if present
98
+ if (settings.panels && typeof settings.panels !== 'object') {
99
+ return false;
100
+ }
101
+ // Validate individual panel settings
102
+ if (settings.panels) {
103
+ for (const [panelKey, panelSettings] of Object.entries(settings.panels)) {
104
+ if (panelSettings && typeof panelSettings !== 'object') {
105
+ return false;
106
+ }
107
+ // Validate boolean properties
108
+ if (panelSettings) {
109
+ for (const [key, value] of Object.entries(panelSettings)) {
110
+ if (value !== undefined && typeof value !== 'boolean') {
111
+ console.warn(`Invalid setting value for ${panelKey}.${key}: expected boolean, got ${typeof value}`);
112
+ return false;
113
+ }
114
+ }
115
+ }
116
+ }
117
+ }
118
+ return true;
119
+ }
120
+ /**
121
+ * Merge user settings with current settings (deep merge)
122
+ * @param currentSettings - Current settings
123
+ * @param userSettings - New settings to merge
124
+ */
125
+ mergeSettings(currentSettings, userSettings) {
126
+ const merged = {
127
+ panels: {
128
+ ...currentSettings.panels,
129
+ },
130
+ };
131
+ if (userSettings.panels) {
132
+ for (const [panelKey, panelSettings] of Object.entries(userSettings.panels)) {
133
+ if (panelSettings) {
134
+ const currentPanelSettings = merged.panels[panelKey];
135
+ const mergedPanelSettings = { ...currentPanelSettings };
136
+ // Filter out undefined values and only merge defined ones
137
+ for (const [settingKey, settingValue] of Object.entries(panelSettings)) {
138
+ if (settingValue !== undefined) {
139
+ mergedPanelSettings[settingKey] = settingValue;
140
+ }
141
+ }
142
+ merged.panels[panelKey] = mergedPanelSettings;
143
+ }
144
+ }
145
+ }
146
+ return merged;
147
+ }
148
+ /**
149
+ * Map MaestroPanelType to settings key
150
+ * @param panelType - Panel type from MaestroPanelType enum
151
+ */
152
+ mapPanelTypeToSettingsKey(panelType) {
153
+ return PANEL_TYPE_SETTINGS_KEY_MAP[panelType] || null;
154
+ }
155
+ }
@@ -0,0 +1,15 @@
1
+ // This file must be the first import in test files
2
+ // Handle globalThis for Node.js < 12
3
+ if (typeof globalThis === 'undefined') {
4
+ global.globalThis = global;
5
+ }
6
+ // Polyfill for FinalizationRegistry in Node.js < 14.6.0
7
+ const globalWithFR = globalThis;
8
+ if (typeof globalWithFR.FinalizationRegistry === 'undefined') {
9
+ globalWithFR.FinalizationRegistry = class FinalizationRegistry {
10
+ constructor(_callback) { }
11
+ register(_target, _heldValue, _unregisterToken) { }
12
+ unregister(_unregisterToken) { }
13
+ };
14
+ }
15
+ export {};
@@ -0,0 +1,4 @@
1
+ export const OverlayType = {
2
+ WinningBet: 'winningBet',
3
+ FantasyPlayerEvent: 'fantasyPlayerEvent',
4
+ };
@@ -10,7 +10,6 @@ import IMaestroKeyPlaysResponse from '../modules/key-plays/interfaces/IKeyPlaysR
10
10
  import { MaestroPanelType } from '@/models/IPanel';
11
11
  import { IUserSettings } from '../interfaces/IUserSettings';
12
12
  import { PanelManagerViewModel } from './PanelManagerViewModel';
13
- import AnalyticsService from '@/services/AnalyticsService/AnalyticsService';
14
13
  import FantasyViewModel from '@/modules/fantasy/view-model/FantasyViewModel';
15
14
  import ShopViewModel from '@/modules/shop/view-model/ShopViewModel';
16
15
  export declare class MaestroEventViewModel extends ViewModel implements IMaestroEvent {
@@ -27,7 +26,6 @@ export declare class MaestroEventViewModel extends ViewModel implements IMaestro
27
26
  shopViewModel: ShopViewModel | null;
28
27
  panelManagerViewModel: PanelManagerViewModel;
29
28
  navigation: SpatialNavigation;
30
- analyticsService: AnalyticsService;
31
29
  constructor(eventId: string | undefined, delegate: IMaestroEventDelegate);
32
30
  setActivePanel(panelType: MaestroPanelType): void;
33
31
  updatePlayerTimeCode(timestamp: number): void;
@@ -0,0 +1,280 @@
1
+ import { Observable } from '../helpers/Observable';
2
+ import { ViewModel } from './ViewModel';
3
+ import KeyPlaysViewModel from '../modules/key-plays/view-model/KeyPlaysViewModel';
4
+ import BetsViewModel from '../modules/bets/view-model/BetsViewModel';
5
+ import SpatialNavigation from '@/external/spatial-navigation/spatialNavigation';
6
+ import StatsViewModel from '../modules/stats/view-model/StatsViewModel';
7
+ import { UserSettingsManager } from '../services/UserSettingsManager';
8
+ import { PanelManagerViewModel } from './PanelManagerViewModel';
9
+ import SDK from '..';
10
+ import StaticService from '@/services/StaticService';
11
+ import FantasyViewModel from '@/modules/fantasy/view-model/FantasyViewModel';
12
+ import ShopViewModel from '@/modules/shop/view-model/ShopViewModel';
13
+ export class MaestroEventViewModel extends ViewModel {
14
+ constructor(eventId = '', delegate) {
15
+ super();
16
+ Object.defineProperty(this, "_eventId", {
17
+ enumerable: true,
18
+ configurable: true,
19
+ writable: true,
20
+ value: new Observable('')
21
+ });
22
+ Object.defineProperty(this, "_title", {
23
+ enumerable: true,
24
+ configurable: true,
25
+ writable: true,
26
+ value: new Observable('')
27
+ });
28
+ Object.defineProperty(this, "_isLive", {
29
+ enumerable: true,
30
+ configurable: true,
31
+ writable: true,
32
+ value: new Observable(false)
33
+ });
34
+ Object.defineProperty(this, "_isShowingPanel", {
35
+ enumerable: true,
36
+ configurable: true,
37
+ writable: true,
38
+ value: new Observable(false)
39
+ });
40
+ Object.defineProperty(this, "playerTimeCode", {
41
+ enumerable: true,
42
+ configurable: true,
43
+ writable: true,
44
+ value: null
45
+ });
46
+ Object.defineProperty(this, "delegate", {
47
+ enumerable: true,
48
+ configurable: true,
49
+ writable: true,
50
+ value: void 0
51
+ });
52
+ Object.defineProperty(this, "keyPlaysViewModel", {
53
+ enumerable: true,
54
+ configurable: true,
55
+ writable: true,
56
+ value: void 0
57
+ });
58
+ Object.defineProperty(this, "fantasyViewModel", {
59
+ enumerable: true,
60
+ configurable: true,
61
+ writable: true,
62
+ value: void 0
63
+ });
64
+ Object.defineProperty(this, "betsViewModel", {
65
+ enumerable: true,
66
+ configurable: true,
67
+ writable: true,
68
+ value: void 0
69
+ });
70
+ Object.defineProperty(this, "statsViewModel", {
71
+ enumerable: true,
72
+ configurable: true,
73
+ writable: true,
74
+ value: void 0
75
+ });
76
+ Object.defineProperty(this, "shopViewModel", {
77
+ enumerable: true,
78
+ configurable: true,
79
+ writable: true,
80
+ value: void 0
81
+ });
82
+ Object.defineProperty(this, "panelManagerViewModel", {
83
+ enumerable: true,
84
+ configurable: true,
85
+ writable: true,
86
+ value: void 0
87
+ });
88
+ Object.defineProperty(this, "navigation", {
89
+ enumerable: true,
90
+ configurable: true,
91
+ writable: true,
92
+ value: void 0
93
+ });
94
+ this._eventId.value = eventId;
95
+ this.delegate = delegate;
96
+ const pageConfig = SDK.getPageConfig();
97
+ // Conditionally instantiate view models based on page configuration
98
+ this.keyPlaysViewModel = StaticService.isPanelAvailable(pageConfig, 'espnKeyPlays')
99
+ ? new KeyPlaysViewModel()
100
+ : null;
101
+ this.betsViewModel = StaticService.isPanelAvailable(pageConfig, 'espnBet')
102
+ ? new BetsViewModel(eventId, delegate)
103
+ : null;
104
+ this.statsViewModel = StaticService.isPanelAvailable(pageConfig, 'espnStats')
105
+ ? new StatsViewModel(eventId, delegate)
106
+ : null;
107
+ this.fantasyViewModel = StaticService.isPanelAvailable(pageConfig, 'espnFantasy')
108
+ ? new FantasyViewModel(eventId, delegate)
109
+ : null;
110
+ this.shopViewModel = StaticService.isPanelAvailable(pageConfig, 'espnShop')
111
+ ? new ShopViewModel(eventId)
112
+ : null;
113
+ this.panelManagerViewModel = new PanelManagerViewModel();
114
+ this.navigation = new SpatialNavigation({
115
+ throttle: 150,
116
+ throttleKeypresses: true,
117
+ });
118
+ }
119
+ setActivePanel(panelType) {
120
+ const index = this.panelManagerViewModel.getIndex(panelType);
121
+ if (index === null) {
122
+ console.warn(`Panel type "${panelType}" not found.`);
123
+ return;
124
+ }
125
+ if (!this.navigation.paused) {
126
+ console.warn('Cannot set active panel while navigation is not paused. Doing so will cause focus issues.');
127
+ return;
128
+ }
129
+ this.panelManagerViewModel.setActivePanel(panelType);
130
+ this.navigation.focusKey = `PANEL_NAV_BUTTON_${index}`;
131
+ }
132
+ updatePlayerTimeCode(timestamp) {
133
+ const timestampDate = new Date(timestamp);
134
+ if (isNaN(timestampDate.getTime())) {
135
+ console.warn('Invalid timestamp provided:', timestamp);
136
+ console.warn('Make sure the timestamp is a valid number. \nhttps://developers.maestro.io/sdk/web/maestro-event-interface/state/updatePlayerTimeCode');
137
+ return;
138
+ }
139
+ this.playerTimeCode = timestamp;
140
+ this.keyPlaysViewModel?.onUpdatePlayerTimeCode(this.playerTimeCode);
141
+ this.statsViewModel?.onUpdatePlayerTimeCode(this.playerTimeCode);
142
+ }
143
+ getPlayerTimeCode() {
144
+ return this.playerTimeCode;
145
+ }
146
+ async deinit() {
147
+ this.betsViewModel?.cleanup();
148
+ this.statsViewModel?.cleanup();
149
+ this.fantasyViewModel?.cleanup();
150
+ this.shopViewModel?.cleanup();
151
+ this.navigation.destroy();
152
+ try {
153
+ await this.didHidePanel();
154
+ }
155
+ catch (error) {
156
+ console.error('Error during didHidePanel in deinit:', error);
157
+ }
158
+ }
159
+ updateKeyPlaysData(data) {
160
+ if (!this.keyPlaysViewModel) {
161
+ return Promise.resolve();
162
+ }
163
+ return this.keyPlaysViewModel.setKeyPlays(data, this.playerTimeCode);
164
+ }
165
+ updateUserSettings(settings) {
166
+ return new Promise((resolve) => {
167
+ UserSettingsManager.getInstance().updateSettings(settings);
168
+ resolve();
169
+ });
170
+ }
171
+ startFocusManagement() {
172
+ this.navigation.setCurrentFocusedKey(this.navigation.focusKey || 'PANEL_NAV_BUTTON_0', {});
173
+ setTimeout(() => {
174
+ this.navigation.resume();
175
+ }, 0);
176
+ return Promise.resolve();
177
+ }
178
+ didStartPlayingClip(index) {
179
+ if (!this.keyPlaysViewModel)
180
+ return;
181
+ this.keyPlaysViewModel.lastPlayedClipIndex.value = index;
182
+ this.keyPlaysViewModel.currentClipPlaybackProgress.value = 0;
183
+ this.keyPlaysViewModel.currentlyPlayingClipIndex.value = index;
184
+ this.keyPlaysViewModel.clearLoadFailureStatus(index);
185
+ }
186
+ didStopPlayingClip(index) {
187
+ if (!this.keyPlaysViewModel)
188
+ return;
189
+ this.keyPlaysViewModel.lastPlayedClipIndex.value = index;
190
+ this.keyPlaysViewModel.currentlyPlayingClipIndex.value = null;
191
+ this.keyPlaysViewModel.currentClipPlaybackProgress.value = null;
192
+ }
193
+ didFailToPlayClip(index) {
194
+ this.keyPlaysViewModel?.handleKeyPlayLoadFailure(index);
195
+ }
196
+ didUpdatePlaybackProgressOfClip(index, to) {
197
+ if (!this.keyPlaysViewModel)
198
+ return;
199
+ this.keyPlaysViewModel.currentClipPlaybackProgress.value = to;
200
+ this.keyPlaysViewModel.clearLoadFailureStatus(index);
201
+ }
202
+ async didShowPanel() {
203
+ this.isShowingPanel = true;
204
+ }
205
+ async didHidePanel() {
206
+ this.isShowingPanel = false;
207
+ this.navigation.focusKey = null;
208
+ }
209
+ didShowOverlay() {
210
+ throw new Error('Method not implemented.');
211
+ }
212
+ didHideOverlay() {
213
+ throw new Error('Method not implemented.');
214
+ }
215
+ currentEventDoesNotSupportKeyPlays() {
216
+ if (this.keyPlaysViewModel) {
217
+ this.keyPlaysViewModel.errorState.value = 'unsupportedEvent';
218
+ }
219
+ }
220
+ getCurrentEventID() {
221
+ return this.eventId.value;
222
+ }
223
+ getCurrentlyPlayingClipIndex() {
224
+ return this.keyPlaysViewModel?.currentlyPlayingClipIndex.value ?? null;
225
+ }
226
+ getLastPlayedClipIndex() {
227
+ return this.keyPlaysViewModel?.lastPlayedClipIndex.value ?? null;
228
+ }
229
+ getCurrentClipPlaybackProgress() {
230
+ return this.keyPlaysViewModel?.currentClipPlaybackProgress.value ?? null;
231
+ }
232
+ getKeyPlaysCount() {
233
+ return this.keyPlaysViewModel?.allItems.length ?? 0;
234
+ }
235
+ get eventId() {
236
+ return this._eventId;
237
+ }
238
+ get title() {
239
+ return this._title;
240
+ }
241
+ get isLive() {
242
+ return this._isLive;
243
+ }
244
+ get isShowingPanel() {
245
+ return this._isShowingPanel.value;
246
+ }
247
+ set isShowingPanel(value) {
248
+ this._isShowingPanel.value = value;
249
+ }
250
+ simulateUseCase(useCase, panelType, testData) {
251
+ switch (panelType) {
252
+ case 'bets':
253
+ if (this.betsViewModel) {
254
+ this.betsViewModel.simulateUseCase(useCase, testData);
255
+ }
256
+ else {
257
+ console.warn('BetsViewModel is not initialized');
258
+ }
259
+ break;
260
+ case 'stats':
261
+ if (this.statsViewModel) {
262
+ this.statsViewModel.simulateUseCase(useCase, testData);
263
+ }
264
+ else {
265
+ console.warn('StatsViewModel is not initialized');
266
+ }
267
+ break;
268
+ default:
269
+ throw new Error(`Unsupported panel type: ${panelType}`);
270
+ }
271
+ }
272
+ /**
273
+ * This method is called when the user navigates to the MaestroEventViewModel.
274
+ * It will pause navigation and start focus management.
275
+ */
276
+ deliverFocus() {
277
+ this.navigation.pause();
278
+ this.delegate.startFocusManagement();
279
+ }
280
+ }
@@ -0,0 +1,222 @@
1
+ import { Observable } from '../helpers/Observable';
2
+ import { ViewModel } from './ViewModel';
3
+ import { OverlayType, } from '../types/OverlayTypes';
4
+ const AUTO_DISMISS_TIMEOUT = 10400; // 10.4 seconds
5
+ export class OverlayViewModel extends ViewModel {
6
+ constructor(analyticsService) {
7
+ super();
8
+ Object.defineProperty(this, "_isVisible", {
9
+ enumerable: true,
10
+ configurable: true,
11
+ writable: true,
12
+ value: new Observable(false)
13
+ });
14
+ Object.defineProperty(this, "_currentOverlay", {
15
+ enumerable: true,
16
+ configurable: true,
17
+ writable: true,
18
+ value: new Observable(null)
19
+ });
20
+ Object.defineProperty(this, "_autoDismiss", {
21
+ enumerable: true,
22
+ configurable: true,
23
+ writable: true,
24
+ value: new Observable(true)
25
+ });
26
+ Object.defineProperty(this, "_overlayQueue", {
27
+ enumerable: true,
28
+ configurable: true,
29
+ writable: true,
30
+ value: new Observable([])
31
+ });
32
+ Object.defineProperty(this, "_hasTrackedView", {
33
+ enumerable: true,
34
+ configurable: true,
35
+ writable: true,
36
+ value: new Observable(false)
37
+ });
38
+ Object.defineProperty(this, "autoDismissTimeout", {
39
+ enumerable: true,
40
+ configurable: true,
41
+ writable: true,
42
+ value: null
43
+ });
44
+ Object.defineProperty(this, "analyticsService", {
45
+ enumerable: true,
46
+ configurable: true,
47
+ writable: true,
48
+ value: void 0
49
+ });
50
+ this.analyticsService = analyticsService;
51
+ }
52
+ get isVisible() {
53
+ return this._isVisible;
54
+ }
55
+ get currentOverlay() {
56
+ return this._currentOverlay;
57
+ }
58
+ get autoDismiss() {
59
+ return this._autoDismiss;
60
+ }
61
+ get overlayQueue() {
62
+ return this._overlayQueue;
63
+ }
64
+ get overlayTitle() {
65
+ const overlay = this._currentOverlay.value;
66
+ if (!overlay)
67
+ return '';
68
+ switch (overlay.type) {
69
+ case OverlayType.WinningBet:
70
+ return 'You won your bet!';
71
+ case OverlayType.FantasyPlayerEvent:
72
+ return overlay.fantasy?.title ?? 'Fantasy Update';
73
+ default:
74
+ return '';
75
+ }
76
+ }
77
+ get overlayMetadata() {
78
+ const overlay = this._currentOverlay.value;
79
+ if (!overlay)
80
+ return '';
81
+ switch (overlay.type) {
82
+ case OverlayType.WinningBet:
83
+ return (overlay.winningBet?.notificationText ??
84
+ 'Click OK to view your winning bets.');
85
+ case OverlayType.FantasyPlayerEvent:
86
+ return overlay.fantasy?.metadata ?? 'New Player Activity';
87
+ default:
88
+ return '';
89
+ }
90
+ }
91
+ showOverlay(overlayEvent) {
92
+ // If an overlay is already visible, queue this one
93
+ if (this._isVisible.value) {
94
+ const currentQueue = this._overlayQueue.value;
95
+ this._overlayQueue.value = [...currentQueue, overlayEvent];
96
+ return;
97
+ }
98
+ // Show the overlay
99
+ this._currentOverlay.value = overlayEvent;
100
+ this._isVisible.value = true;
101
+ this._hasTrackedView.value = false;
102
+ this._autoDismiss.value = true;
103
+ // Set up auto-dismiss
104
+ this.setupAutoDismiss();
105
+ }
106
+ hideOverlay() {
107
+ // Clear auto-dismiss timeout
108
+ if (this.autoDismissTimeout) {
109
+ clearTimeout(this.autoDismissTimeout);
110
+ this.autoDismissTimeout = null;
111
+ }
112
+ // Check if there are queued overlays
113
+ const queue = this._overlayQueue.value;
114
+ if (queue.length > 0) {
115
+ // Show next overlay in queue
116
+ const nextOverlay = queue[0];
117
+ const remainingQueue = queue.slice(1);
118
+ this._overlayQueue.value = remainingQueue;
119
+ this._currentOverlay.value = nextOverlay;
120
+ this._hasTrackedView.value = false;
121
+ this._autoDismiss.value = true; // Reset auto-dismiss for queued overlay
122
+ // Keep _isVisible as true since we're showing another overlay
123
+ // Set up auto-dismiss for next overlay
124
+ this.setupAutoDismiss();
125
+ }
126
+ else {
127
+ // No more overlays, hide completely
128
+ this._isVisible.value = false;
129
+ this._currentOverlay.value = null;
130
+ }
131
+ }
132
+ handleOverlayClick() {
133
+ const overlay = this._currentOverlay.value;
134
+ if (!overlay)
135
+ return;
136
+ // Track click event
137
+ this.trackOverlayClicked();
138
+ // Handle overlay-specific actions
139
+ switch (overlay.type) {
140
+ case OverlayType.WinningBet:
141
+ this._autoDismiss.value = false;
142
+ // TODO: Navigate to bets panel and deep link to specific bet
143
+ break;
144
+ case OverlayType.FantasyPlayerEvent:
145
+ // Fantasy overlay handled
146
+ break;
147
+ }
148
+ // Hide current overlay
149
+ this.hideOverlay();
150
+ }
151
+ trackOverlayViewed() {
152
+ if (this._hasTrackedView.value)
153
+ return;
154
+ const overlay = this._currentOverlay.value;
155
+ if (!overlay)
156
+ return;
157
+ this._hasTrackedView.value = true;
158
+ const event = {
159
+ eventName: 'overlayViewed',
160
+ attributes: {
161
+ template: 'espn_bet',
162
+ templateId: '',
163
+ instanceName: this.overlayTitle,
164
+ instanceId: this.getInstanceId(overlay),
165
+ fullscreen: false,
166
+ overlayType: overlay.type,
167
+ },
168
+ };
169
+ this.analyticsService.track(event);
170
+ }
171
+ trackOverlayClicked() {
172
+ const overlay = this._currentOverlay.value;
173
+ if (!overlay)
174
+ return;
175
+ const event = {
176
+ eventName: 'overlayClicked',
177
+ attributes: {
178
+ template: 'espn_bet',
179
+ templateId: '',
180
+ instanceName: this.overlayTitle,
181
+ instanceId: this.getInstanceId(overlay),
182
+ fullscreen: false,
183
+ overlayType: overlay.type,
184
+ },
185
+ };
186
+ this.analyticsService.track(event);
187
+ }
188
+ handleOverlayViewed(_overlayType) {
189
+ // Track that the overlay was viewed
190
+ this.trackOverlayViewed();
191
+ }
192
+ handleOverlayAction(_overlayType) {
193
+ // Track that the overlay was clicked/actioned
194
+ this.trackOverlayClicked();
195
+ }
196
+ cleanup() {
197
+ if (this.autoDismissTimeout) {
198
+ clearTimeout(this.autoDismissTimeout);
199
+ this.autoDismissTimeout = null;
200
+ }
201
+ }
202
+ setupAutoDismiss() {
203
+ if (this.autoDismissTimeout) {
204
+ clearTimeout(this.autoDismissTimeout);
205
+ }
206
+ this.autoDismissTimeout = setTimeout(() => {
207
+ if (this._autoDismiss.value) {
208
+ this.hideOverlay();
209
+ }
210
+ }, AUTO_DISMISS_TIMEOUT);
211
+ }
212
+ getInstanceId(overlay) {
213
+ switch (overlay.type) {
214
+ case OverlayType.WinningBet:
215
+ return overlay.winningBet?.serverID ?? '';
216
+ case OverlayType.FantasyPlayerEvent:
217
+ return overlay.fantasy?.athleteId ?? '';
218
+ default:
219
+ return '';
220
+ }
221
+ }
222
+ }