@maestro_io/maestro-web-sdk 5.0.0 → 5.1.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.
- package/dist/1.maestro-web-sdk.esm.js +2 -0
- package/dist/1.maestro-web-sdk.esm.js.map +1 -0
- package/dist/10.maestro-web-sdk.esm.js +2 -0
- package/dist/10.maestro-web-sdk.esm.js.map +1 -0
- package/dist/11.maestro-web-sdk.esm.js +2 -0
- package/dist/11.maestro-web-sdk.esm.js.map +1 -0
- package/dist/12.maestro-web-sdk.esm.js +2 -0
- package/dist/12.maestro-web-sdk.esm.js.map +1 -0
- package/dist/13.maestro-web-sdk.esm.js +2 -0
- package/dist/13.maestro-web-sdk.esm.js.map +1 -0
- package/dist/14.maestro-web-sdk.esm.js +2 -0
- package/dist/14.maestro-web-sdk.esm.js.map +1 -0
- package/dist/15.maestro-web-sdk.esm.js +2 -0
- package/dist/15.maestro-web-sdk.esm.js.map +1 -0
- package/dist/16.maestro-web-sdk.esm.js +2 -0
- package/dist/16.maestro-web-sdk.esm.js.map +1 -0
- package/dist/17.maestro-web-sdk.esm.js +2 -0
- package/dist/17.maestro-web-sdk.esm.js.map +1 -0
- package/dist/18.maestro-web-sdk.esm.js +2 -0
- package/dist/18.maestro-web-sdk.esm.js.map +1 -0
- package/dist/19.maestro-web-sdk.esm.js +2 -0
- package/dist/19.maestro-web-sdk.esm.js.map +1 -0
- package/dist/2.maestro-web-sdk.esm.js +2 -0
- package/dist/2.maestro-web-sdk.esm.js.map +1 -0
- package/dist/20.maestro-web-sdk.esm.js +2 -0
- package/dist/20.maestro-web-sdk.esm.js.map +1 -0
- package/dist/21.maestro-web-sdk.esm.js +2 -0
- package/dist/21.maestro-web-sdk.esm.js.map +1 -0
- package/dist/22.maestro-web-sdk.esm.js +2 -0
- package/dist/22.maestro-web-sdk.esm.js.map +1 -0
- package/dist/23.maestro-web-sdk.esm.js +2 -0
- package/dist/23.maestro-web-sdk.esm.js.map +1 -0
- package/dist/24.maestro-web-sdk.esm.js +2 -0
- package/dist/24.maestro-web-sdk.esm.js.map +1 -0
- package/dist/25.maestro-web-sdk.esm.js +2 -0
- package/dist/25.maestro-web-sdk.esm.js.map +1 -0
- package/dist/26.maestro-web-sdk.esm.js +2 -0
- package/dist/26.maestro-web-sdk.esm.js.map +1 -0
- package/dist/27.maestro-web-sdk.esm.js +2 -0
- package/dist/27.maestro-web-sdk.esm.js.map +1 -0
- package/dist/28.maestro-web-sdk.esm.js +2 -0
- package/dist/28.maestro-web-sdk.esm.js.map +1 -0
- package/dist/29.maestro-web-sdk.esm.js +2 -0
- package/dist/29.maestro-web-sdk.esm.js.map +1 -0
- package/dist/3.maestro-web-sdk.esm.js +2 -0
- package/dist/3.maestro-web-sdk.esm.js.map +1 -0
- package/dist/30.maestro-web-sdk.esm.js +2 -0
- package/dist/30.maestro-web-sdk.esm.js.map +1 -0
- package/dist/31.maestro-web-sdk.esm.js +2 -0
- package/dist/31.maestro-web-sdk.esm.js.map +1 -0
- package/dist/32.maestro-web-sdk.esm.js +2 -0
- package/dist/32.maestro-web-sdk.esm.js.map +1 -0
- package/dist/33.maestro-web-sdk.esm.js +2 -0
- package/dist/33.maestro-web-sdk.esm.js.map +1 -0
- package/dist/34.maestro-web-sdk.esm.js +2 -0
- package/dist/34.maestro-web-sdk.esm.js.map +1 -0
- package/dist/35.maestro-web-sdk.esm.js +2 -0
- package/dist/35.maestro-web-sdk.esm.js.map +1 -0
- package/dist/36.maestro-web-sdk.esm.js +2 -0
- package/dist/36.maestro-web-sdk.esm.js.map +1 -0
- package/dist/37.maestro-web-sdk.esm.js +2 -0
- package/dist/37.maestro-web-sdk.esm.js.map +1 -0
- package/dist/38.maestro-web-sdk.esm.js +2 -0
- package/dist/38.maestro-web-sdk.esm.js.map +1 -0
- package/dist/4.maestro-web-sdk.esm.js +2 -0
- package/dist/4.maestro-web-sdk.esm.js.map +1 -0
- package/dist/5.maestro-web-sdk.esm.js +2 -0
- package/dist/5.maestro-web-sdk.esm.js.map +1 -0
- package/dist/6.maestro-web-sdk.esm.js +2 -0
- package/dist/6.maestro-web-sdk.esm.js.map +1 -0
- package/dist/7.maestro-web-sdk.esm.js +2 -0
- package/dist/7.maestro-web-sdk.esm.js.map +1 -0
- package/dist/8.maestro-web-sdk.esm.js +2 -0
- package/dist/8.maestro-web-sdk.esm.js.map +1 -0
- package/dist/9.maestro-web-sdk.esm.js +2 -0
- package/dist/9.maestro-web-sdk.esm.js.map +1 -0
- package/dist/index.d.ts +135 -1087
- package/dist/maestro-web-sdk.esm.js +3 -32
- package/dist/maestro-web-sdk.esm.js.map +1 -1
- package/dist/maestro-web-sdk.umd.js +3 -32
- package/dist/maestro-web-sdk.umd.js.map +1 -1
- package/dist/package.json +94 -0
- package/dist/src/components/atoms/BaseButton/BaseButton.d.ts +7 -0
- package/dist/src/components/atoms/BaseButton/BaseButton.js +11 -0
- package/dist/src/components/atoms/BaseButton/index.d.ts +2 -0
- package/dist/src/components/atoms/BaseButton/index.js +2 -0
- package/dist/src/components/atoms/Image/index.d.ts +13 -0
- package/dist/src/components/atoms/Image/index.js +34 -0
- package/dist/src/components/atoms/Rive/index.d.ts +221 -0
- package/dist/src/components/atoms/Rive/index.js +53 -0
- package/dist/src/components/atoms/SvgIcon/BetGeneralIcon.d.ts +3 -0
- package/dist/src/components/atoms/SvgIcon/BetGeneralIcon.js +9 -0
- package/dist/src/components/atoms/SvgIcon/BetsIcon.d.ts +3 -0
- package/dist/src/components/atoms/SvgIcon/BetsIcon.js +8 -0
- package/dist/src/components/atoms/SvgIcon/BetsWarningIcon.d.ts +7 -0
- package/dist/src/components/atoms/SvgIcon/BetsWarningIcon.js +11 -0
- package/dist/src/components/atoms/SvgIcon/BuilderIcon.d.ts +3 -0
- package/dist/src/components/atoms/SvgIcon/BuilderIcon.js +8 -0
- package/dist/src/components/atoms/SvgIcon/ChatIcon.d.ts +3 -0
- package/dist/src/components/atoms/SvgIcon/ChatIcon.js +6 -0
- package/dist/src/components/atoms/SvgIcon/CheckmarkIcon.d.ts +3 -0
- package/dist/src/components/atoms/SvgIcon/CheckmarkIcon.js +6 -0
- package/dist/src/components/atoms/SvgIcon/CollapseIcon.d.ts +3 -0
- package/dist/src/components/atoms/SvgIcon/CollapseIcon.js +6 -0
- package/dist/src/components/atoms/SvgIcon/ExpandIcon.d.ts +3 -0
- package/dist/src/components/atoms/SvgIcon/ExpandIcon.js +6 -0
- package/dist/src/components/atoms/SvgIcon/FantasyIcon.d.ts +7 -0
- package/dist/src/components/atoms/SvgIcon/FantasyIcon.js +15 -0
- package/dist/src/components/atoms/SvgIcon/FlameIcon.d.ts +7 -0
- package/dist/src/components/atoms/SvgIcon/FlameIcon.js +11 -0
- package/dist/src/components/atoms/SvgIcon/FoxKeyPlaysIcon.d.ts +3 -0
- package/dist/src/components/atoms/SvgIcon/FoxKeyPlaysIcon.js +7 -0
- package/dist/src/components/atoms/SvgIcon/FoxMultiViewIcon.d.ts +3 -0
- package/dist/src/components/atoms/SvgIcon/FoxMultiViewIcon.js +10 -0
- package/dist/src/components/atoms/SvgIcon/FoxStatsIcon.d.ts +3 -0
- package/dist/src/components/atoms/SvgIcon/FoxStatsIcon.js +7 -0
- package/dist/src/components/atoms/SvgIcon/HelloWorldIcon.d.ts +3 -0
- package/dist/src/components/atoms/SvgIcon/HelloWorldIcon.js +6 -0
- package/dist/src/components/atoms/SvgIcon/Icon.d.ts +15 -0
- package/dist/src/components/atoms/SvgIcon/Icon.js +68 -0
- package/dist/src/components/atoms/SvgIcon/KeyPlaysIcon.d.ts +6 -0
- package/dist/src/components/atoms/SvgIcon/KeyPlaysIcon.js +10 -0
- package/dist/src/components/atoms/SvgIcon/MobilePhoneIcon.d.ts +7 -0
- package/dist/src/components/atoms/SvgIcon/MobilePhoneIcon.js +11 -0
- package/dist/src/components/atoms/SvgIcon/PlayIcon.d.ts +6 -0
- package/dist/src/components/atoms/SvgIcon/PlayIcon.js +8 -0
- package/dist/src/components/atoms/SvgIcon/ShopIcon.d.ts +5 -0
- package/dist/src/components/atoms/SvgIcon/ShopIcon.js +7 -0
- package/dist/src/components/atoms/SvgIcon/ShopifyIcon.d.ts +3 -0
- package/dist/src/components/atoms/SvgIcon/ShopifyIcon.js +6 -0
- package/dist/src/components/atoms/SvgIcon/StatsIcon.d.ts +6 -0
- package/dist/src/components/atoms/SvgIcon/StatsIcon.js +12 -0
- package/dist/src/components/atoms/SvgIcon/TimesIcon.d.ts +3 -0
- package/dist/src/components/atoms/SvgIcon/TimesIcon.js +6 -0
- package/dist/src/components/atoms/SvgIcon/WarningIcon.d.ts +6 -0
- package/dist/src/components/atoms/SvgIcon/WarningIcon.js +8 -0
- package/dist/src/components/atoms/SvgIcon/index.d.ts +2 -0
- package/dist/src/components/atoms/SvgIcon/index.js +2 -0
- package/dist/src/components/core/App/App.d.ts +11 -0
- package/dist/src/components/core/App/App.js +35 -0
- package/dist/src/components/core/App/index.d.ts +2 -0
- package/dist/src/components/core/App/index.js +2 -0
- package/dist/src/components/core/PanelManager/PanelManager.d.ts +21 -0
- package/dist/src/components/core/PanelManager/PanelManager.js +102 -0
- package/dist/src/components/core/PanelManager/index.d.ts +2 -0
- package/dist/src/components/core/PanelManager/index.js +2 -0
- package/dist/src/components/core/ScrollableContainer/FocusableItem.d.ts +11 -0
- package/dist/src/components/core/ScrollableContainer/FocusableItem.js +24 -0
- package/dist/src/components/core/ScrollableContainer/ScrollableContainer.d.ts +54 -0
- package/dist/src/components/core/ScrollableContainer/ScrollableContainer.js +111 -0
- package/dist/src/components/core/ScrollableContainer/index.d.ts +6 -0
- package/dist/src/components/core/ScrollableContainer/index.js +5 -0
- package/dist/src/components/core/ScrollableContainer/useScrollableContainer.d.ts +14 -0
- package/dist/src/components/core/ScrollableContainer/useScrollableContainer.js +22 -0
- package/dist/src/components/molecules/ActionButton/ActionButton.d.ts +96 -0
- package/dist/src/components/molecules/ActionButton/ActionButton.js +15 -0
- package/dist/src/components/molecules/ActionButton/index.d.ts +2 -0
- package/dist/src/components/molecules/ActionButton/index.js +2 -0
- package/dist/src/components/molecules/HeadshotImage/HeadshotImage.d.ts +16 -0
- package/dist/src/components/molecules/HeadshotImage/HeadshotImage.js +50 -0
- package/dist/src/components/molecules/HeadshotImage/index.d.ts +2 -0
- package/dist/src/components/molecules/HeadshotImage/index.js +2 -0
- package/dist/src/components/molecules/PanelNavButton/PanelNavButton.d.ts +106 -0
- package/dist/src/components/molecules/PanelNavButton/PanelNavButton.js +27 -0
- package/dist/src/components/molecules/PanelNavButton/index.d.ts +2 -0
- package/dist/src/components/molecules/PanelNavButton/index.js +2 -0
- package/dist/src/components/molecules/SegmentButton/SegmentButton.d.ts +9 -0
- package/dist/src/components/molecules/SegmentButton/SegmentButton.js +10 -0
- package/dist/src/components/molecules/SegmentButton/index.d.ts +2 -0
- package/dist/src/components/molecules/SegmentButton/index.js +2 -0
- package/dist/src/components/molecules/TabLoadError/TabLoadError.d.ts +96 -0
- package/dist/src/components/molecules/TabLoadError/TabLoadError.js +14 -0
- package/dist/src/components/molecules/TabLoadError/index.d.ts +2 -0
- package/dist/src/components/molecules/TabLoadError/index.js +2 -0
- package/dist/src/components/molecules/WatchButton/WatchButton.d.ts +10 -0
- package/dist/src/components/molecules/WatchButton/WatchButton.js +15 -0
- package/dist/src/components/molecules/WatchButton/index.d.ts +2 -0
- package/dist/src/components/molecules/WatchButton/index.js +2 -0
- package/dist/src/components/organisms/PanelNavigation/PanelNavigation.d.ts +16 -0
- package/dist/src/components/organisms/PanelNavigation/PanelNavigation.js +60 -0
- package/dist/src/components/organisms/PanelNavigation/index.d.ts +2 -0
- package/dist/src/components/organisms/PanelNavigation/index.js +2 -0
- package/dist/src/components/organisms/SegmentController/SegmentController.d.ts +12 -0
- package/dist/src/components/organisms/SegmentController/SegmentController.js +35 -0
- package/dist/src/components/organisms/SegmentController/index.d.ts +3 -0
- package/dist/src/components/organisms/SegmentController/index.js +2 -0
- package/dist/src/development/MaestroEventDelegate.d.ts +27 -0
- package/dist/src/development/MaestroEventDelegate.js +109 -0
- package/dist/src/development/TimeSeek.d.ts +22 -0
- package/dist/src/development/TimeSeek.js +218 -0
- package/dist/src/development/development.d.ts +1 -0
- package/dist/src/development/development.js +39 -0
- package/dist/src/external/AxiosNetworkClient.d.ts +28 -0
- package/dist/src/external/AxiosNetworkClient.js +110 -0
- package/dist/src/external/LocalStorageCacheManager.d.ts +65 -0
- package/dist/src/external/LocalStorageCacheManager.js +213 -0
- package/dist/src/external/ReactRenderer.d.ts +17 -0
- package/dist/src/external/ReactRenderer.js +66 -0
- package/dist/src/external/mocks/MockExternalNetworkClient.d.ts +104 -0
- package/dist/src/external/mocks/MockExternalNetworkClient.js +187 -0
- package/dist/src/external/ports/cacheManager.d.ts +17 -0
- package/dist/src/external/ports/cacheManager.js +1 -0
- package/dist/src/external/ports/networkClient.d.ts +19 -0
- package/dist/src/external/ports/networkClient.js +1 -0
- package/dist/src/external/ports/renderer.d.ts +4 -0
- package/dist/src/external/ports/renderer.js +1 -0
- package/dist/src/external/spatial-navigation/__mocks__/withFocusable.d.ts +8 -0
- package/dist/src/external/spatial-navigation/__mocks__/withFocusable.js +7 -0
- package/dist/src/external/spatial-navigation/index.d.ts +4 -0
- package/dist/src/external/spatial-navigation/index.js +3 -0
- package/dist/src/external/spatial-navigation/measureLayout.d.ts +2 -0
- package/dist/src/external/spatial-navigation/measureLayout.js +30 -0
- package/dist/src/external/spatial-navigation/spatialNavigation.d.ts +160 -0
- package/dist/src/external/spatial-navigation/spatialNavigation.js +944 -0
- package/dist/src/external/spatial-navigation/utils.d.ts +22 -0
- package/dist/src/external/spatial-navigation/utils.js +6 -0
- package/dist/src/external/spatial-navigation/visualDebugger.d.ts +17 -0
- package/dist/src/external/spatial-navigation/visualDebugger.js +76 -0
- package/dist/src/external/spatial-navigation/withFocusable.d.ts +131 -0
- package/dist/src/external/spatial-navigation/withFocusable.js +254 -0
- package/dist/src/helpers/Observable.d.ts +12 -0
- package/dist/src/helpers/Observable.js +37 -0
- package/dist/src/helpers/strings.d.ts +2 -0
- package/dist/src/helpers/strings.js +14 -0
- package/dist/src/helpers/url.d.ts +1 -0
- package/dist/src/helpers/url.js +12 -0
- package/dist/src/hooks/useMaxHeightToBottom.d.ts +11 -0
- package/dist/src/hooks/useMaxHeightToBottom.js +48 -0
- package/dist/src/index.d.ts +53 -0
- package/dist/src/index.js +197 -0
- package/dist/src/interfaces/IMaestroEvent.d.ts +108 -0
- package/dist/src/interfaces/IMaestroEvent.js +1 -0
- package/dist/src/interfaces/IMaestroEventDelegate.d.ts +74 -0
- package/dist/src/interfaces/IMaestroEventDelegate.js +1 -0
- package/dist/src/interfaces/IMaestroManager.d.ts +81 -0
- package/dist/src/interfaces/IMaestroManager.js +1 -0
- package/dist/src/interfaces/IUserSettings.d.ts +44 -0
- package/dist/src/interfaces/IUserSettings.js +20 -0
- package/dist/src/models/IModel.d.ts +7 -0
- package/dist/src/models/IModel.js +1 -0
- package/dist/src/models/IPanel.d.ts +19 -0
- package/dist/src/models/IPanel.js +12 -0
- package/dist/src/models/ITheme.d.ts +77 -0
- package/dist/src/models/ITheme.js +20 -0
- package/dist/src/modules/espn/bets/interfaces/IBets.d.ts +192 -0
- package/dist/src/modules/espn/bets/interfaces/IBets.js +1 -0
- package/dist/src/modules/espn/bets/interfaces/IBetsViewModel.d.ts +5 -0
- package/dist/src/modules/espn/bets/interfaces/IBetsViewModel.js +1 -0
- package/dist/src/modules/espn/bets/mocks.d.ts +2 -0
- package/dist/src/modules/espn/bets/mocks.js +573 -0
- package/dist/src/modules/espn/bets/services/BetsService.d.ts +81 -0
- package/dist/src/modules/espn/bets/services/BetsService.js +123 -0
- package/dist/src/modules/espn/bets/types/BetsAnalyticsTypes.d.ts +8 -0
- package/dist/src/modules/espn/bets/types/BetsAnalyticsTypes.js +1 -0
- package/dist/src/modules/espn/bets/view/BetsView.d.ts +30 -0
- package/dist/src/modules/espn/bets/view/BetsView.js +169 -0
- package/dist/src/modules/espn/bets/view/HotProps/HotPropsView.d.ts +103 -0
- package/dist/src/modules/espn/bets/view/HotProps/HotPropsView.js +133 -0
- package/dist/src/modules/espn/bets/view/SixPack/SixPackView.d.ts +9 -0
- package/dist/src/modules/espn/bets/view/SixPack/SixPackView.js +77 -0
- package/dist/src/modules/espn/bets/view/UserBets/BetResult/BetResult.d.ts +6 -0
- package/dist/src/modules/espn/bets/view/UserBets/BetResult/BetResult.js +6 -0
- package/dist/src/modules/espn/bets/view/UserBets/BetsCard/BetsCard.d.ts +104 -0
- package/dist/src/modules/espn/bets/view/UserBets/BetsCard/BetsCard.js +140 -0
- package/dist/src/modules/espn/bets/view/UserBets/BetsCard/BetsCardEvent.d.ts +16 -0
- package/dist/src/modules/espn/bets/view/UserBets/BetsCard/BetsCardEvent.js +8 -0
- package/dist/src/modules/espn/bets/view/UserBets/BetsCard/BetsCardFooter.d.ts +7 -0
- package/dist/src/modules/espn/bets/view/UserBets/BetsCard/BetsCardFooter.js +18 -0
- package/dist/src/modules/espn/bets/view/UserBets/Boost/Boost.d.ts +7 -0
- package/dist/src/modules/espn/bets/view/UserBets/Boost/Boost.js +6 -0
- package/dist/src/modules/espn/bets/view/UserBets/OutcomeBadge/OutcomeBadge.d.ts +6 -0
- package/dist/src/modules/espn/bets/view/UserBets/OutcomeBadge/OutcomeBadge.js +9 -0
- package/dist/src/modules/espn/bets/view/UserBets/Parlay/Parlay.d.ts +8 -0
- package/dist/src/modules/espn/bets/view/UserBets/Parlay/Parlay.js +13 -0
- package/dist/src/modules/espn/bets/view/UserBets/Straight/Straight.d.ts +7 -0
- package/dist/src/modules/espn/bets/view/UserBets/Straight/Straight.js +6 -0
- package/dist/src/modules/espn/bets/view/UserBets/Teaser/Teaser.d.ts +7 -0
- package/dist/src/modules/espn/bets/view/UserBets/Teaser/Teaser.js +13 -0
- package/dist/src/modules/espn/bets/view/UserBets/UserBetsView.d.ts +25 -0
- package/dist/src/modules/espn/bets/view/UserBets/UserBetsView.js +107 -0
- package/dist/src/modules/espn/bets/view/components/Bet/Bet.d.ts +10 -0
- package/dist/src/modules/espn/bets/view/components/Bet/Bet.js +41 -0
- package/dist/src/modules/espn/bets/view/components/BetPill/BetPill.d.ts +6 -0
- package/dist/src/modules/espn/bets/view/components/BetPill/BetPill.js +6 -0
- package/dist/src/modules/espn/bets/view/components/BetsCard/BetsCard.d.ts +10 -0
- package/dist/src/modules/espn/bets/view/components/BetsCard/BetsCard.js +24 -0
- package/dist/src/modules/espn/bets/view/components/BetsCard/BetsCardHeader.d.ts +16 -0
- package/dist/src/modules/espn/bets/view/components/BetsCard/BetsCardHeader.js +20 -0
- package/dist/src/modules/espn/bets/view/components/GamblingDisclaimer/GamblingDisclaimer.d.ts +7 -0
- package/dist/src/modules/espn/bets/view/components/GamblingDisclaimer/GamblingDisclaimer.js +31 -0
- package/dist/src/modules/espn/bets/view/components/GamblingDisclaimer/index.d.ts +1 -0
- package/dist/src/modules/espn/bets/view/components/GamblingDisclaimer/index.js +1 -0
- package/dist/src/modules/espn/bets/view/components/LocationWarning/LocationWarning.d.ts +10 -0
- package/dist/src/modules/espn/bets/view/components/LocationWarning/LocationWarning.js +16 -0
- package/dist/src/modules/espn/bets/view/components/PromoCodeBanner/PromoCodeBanner.d.ts +5 -0
- package/dist/src/modules/espn/bets/view/components/PromoCodeBanner/PromoCodeBanner.js +45 -0
- package/dist/src/modules/espn/bets/view/components/PromoCodeBanner/index.d.ts +1 -0
- package/dist/src/modules/espn/bets/view/components/PromoCodeBanner/index.js +1 -0
- package/dist/src/modules/espn/bets/view-model/BetsViewModel.d.ts +218 -0
- package/dist/src/modules/espn/bets/view-model/BetsViewModel.js +947 -0
- package/dist/src/modules/espn/fantasy/components/ExpandedAthleteList/ExpandedAthletesList.d.ts +28 -0
- package/dist/src/modules/espn/fantasy/components/ExpandedAthleteList/ExpandedAthletesList.js +107 -0
- package/dist/src/modules/espn/fantasy/components/ExpandedAthleteList/index.d.ts +1 -0
- package/dist/src/modules/espn/fantasy/components/ExpandedAthleteList/index.js +1 -0
- package/dist/src/modules/espn/fantasy/components/LeagueCard/LeagueCard.d.ts +104 -0
- package/dist/src/modules/espn/fantasy/components/LeagueCard/LeagueCard.js +20 -0
- package/dist/src/modules/espn/fantasy/components/LeagueCard/index.d.ts +2 -0
- package/dist/src/modules/espn/fantasy/components/LeagueCard/index.js +2 -0
- package/dist/src/modules/espn/fantasy/components/TopPlayerCard/TopPlayerCard.d.ts +101 -0
- package/dist/src/modules/espn/fantasy/components/TopPlayerCard/TopPlayerCard.js +29 -0
- package/dist/src/modules/espn/fantasy/components/TopPlayerCard/index.d.ts +2 -0
- package/dist/src/modules/espn/fantasy/components/TopPlayerCard/index.js +2 -0
- package/dist/src/modules/espn/fantasy/components/TournamentOverflowQR/TournamentOverflowQR.d.ts +103 -0
- package/dist/src/modules/espn/fantasy/components/TournamentOverflowQR/TournamentOverflowQR.js +94 -0
- package/dist/src/modules/espn/fantasy/components/TournamentOverflowQR/index.d.ts +1 -0
- package/dist/src/modules/espn/fantasy/components/TournamentOverflowQR/index.js +1 -0
- package/dist/src/modules/espn/fantasy/mocks.d.ts +7620 -0
- package/dist/src/modules/espn/fantasy/mocks.js +3682 -0
- package/dist/src/modules/espn/fantasy/services/FantasyService.d.ts +76 -0
- package/dist/src/modules/espn/fantasy/services/FantasyService.js +124 -0
- package/dist/src/modules/espn/fantasy/types.d.ts +294 -0
- package/dist/src/modules/espn/fantasy/types.js +9 -0
- package/dist/src/modules/espn/fantasy/view/ActiveAthletesMarquee/ActiveAthletesMarquee.d.ts +21 -0
- package/dist/src/modules/espn/fantasy/view/ActiveAthletesMarquee/ActiveAthletesMarquee.js +74 -0
- package/dist/src/modules/espn/fantasy/view/ActiveAthletesMarquee/index.d.ts +2 -0
- package/dist/src/modules/espn/fantasy/view/ActiveAthletesMarquee/index.js +2 -0
- package/dist/src/modules/espn/fantasy/view/FantasyHeaderView.d.ts +8 -0
- package/dist/src/modules/espn/fantasy/view/FantasyHeaderView.js +8 -0
- package/dist/src/modules/espn/fantasy/view/FantasyItemView.d.ts +8 -0
- package/dist/src/modules/espn/fantasy/view/FantasyItemView.js +48 -0
- package/dist/src/modules/espn/fantasy/view/FantasyView.d.ts +34 -0
- package/dist/src/modules/espn/fantasy/view/FantasyView.js +212 -0
- package/dist/src/modules/espn/fantasy/view/InactiveLeague/DraftDateCountdown.d.ts +23 -0
- package/dist/src/modules/espn/fantasy/view/InactiveLeague/DraftDateCountdown.js +95 -0
- package/dist/src/modules/espn/fantasy/view/InactiveLeague/InactiveLeague.d.ts +100 -0
- package/dist/src/modules/espn/fantasy/view/InactiveLeague/InactiveLeague.js +13 -0
- package/dist/src/modules/espn/fantasy/view/InactiveLeague/index.d.ts +2 -0
- package/dist/src/modules/espn/fantasy/view/InactiveLeague/index.js +2 -0
- package/dist/src/modules/espn/fantasy/view/LoginView/LoginView.d.ts +96 -0
- package/dist/src/modules/espn/fantasy/view/LoginView/LoginView.js +27 -0
- package/dist/src/modules/espn/fantasy/view/LoginView/index.d.ts +2 -0
- package/dist/src/modules/espn/fantasy/view/LoginView/index.js +2 -0
- package/dist/src/modules/espn/fantasy/view/MatchupPair/DoubleAthleteCard/DoubleAthleteCard.d.ts +97 -0
- package/dist/src/modules/espn/fantasy/view/MatchupPair/DoubleAthleteCard/DoubleAthleteCard.js +25 -0
- package/dist/src/modules/espn/fantasy/view/MatchupPair/DoubleAthleteCard/index.d.ts +2 -0
- package/dist/src/modules/espn/fantasy/view/MatchupPair/DoubleAthleteCard/index.js +2 -0
- package/dist/src/modules/espn/fantasy/view/MatchupPair/ExpandedDoubleAthleteCards.d.ts +14 -0
- package/dist/src/modules/espn/fantasy/view/MatchupPair/ExpandedDoubleAthleteCards.js +9 -0
- package/dist/src/modules/espn/fantasy/view/MatchupPair/MatchupPair.d.ts +102 -0
- package/dist/src/modules/espn/fantasy/view/MatchupPair/MatchupPair.js +118 -0
- package/dist/src/modules/espn/fantasy/view/MatchupPair/index.d.ts +2 -0
- package/dist/src/modules/espn/fantasy/view/MatchupPair/index.js +2 -0
- package/dist/src/modules/espn/fantasy/view/MatchupSingle/ExpandedSingleAthleteCards.d.ts +14 -0
- package/dist/src/modules/espn/fantasy/view/MatchupSingle/ExpandedSingleAthleteCards.js +9 -0
- package/dist/src/modules/espn/fantasy/view/MatchupSingle/MatchupSingle.d.ts +102 -0
- package/dist/src/modules/espn/fantasy/view/MatchupSingle/MatchupSingle.js +108 -0
- package/dist/src/modules/espn/fantasy/view/MatchupSingle/SingleAthleteCard/SingleAthleteCard.d.ts +97 -0
- package/dist/src/modules/espn/fantasy/view/MatchupSingle/SingleAthleteCard/SingleAthleteCard.js +18 -0
- package/dist/src/modules/espn/fantasy/view/MatchupSingle/SingleAthleteCard/index.d.ts +2 -0
- package/dist/src/modules/espn/fantasy/view/MatchupSingle/SingleAthleteCard/index.js +2 -0
- package/dist/src/modules/espn/fantasy/view/MatchupSingle/index.d.ts +2 -0
- package/dist/src/modules/espn/fantasy/view/MatchupSingle/index.js +2 -0
- package/dist/src/modules/espn/fantasy/view/PromoView/PromoView.d.ts +100 -0
- package/dist/src/modules/espn/fantasy/view/PromoView/PromoView.js +12 -0
- package/dist/src/modules/espn/fantasy/view/PromoView/index.d.ts +2 -0
- package/dist/src/modules/espn/fantasy/view/PromoView/index.js +2 -0
- package/dist/src/modules/espn/fantasy/view/TournamentBracketCard/TournamentBracketCard.d.ts +101 -0
- package/dist/src/modules/espn/fantasy/view/TournamentBracketCard/TournamentBracketCard.js +37 -0
- package/dist/src/modules/espn/fantasy/view/TournamentBracketCard/index.d.ts +2 -0
- package/dist/src/modules/espn/fantasy/view/TournamentBracketCard/index.js +2 -0
- package/dist/src/modules/espn/fantasy/view/index.d.ts +2 -0
- package/dist/src/modules/espn/fantasy/view/index.js +2 -0
- package/dist/src/modules/espn/fantasy/view-model/FantasyViewModel.FantasyPolling.d.ts +32 -0
- package/dist/src/modules/espn/fantasy/view-model/FantasyViewModel.FantasyPolling.js +132 -0
- package/dist/src/modules/espn/fantasy/view-model/FantasyViewModel.LeagueManagerPolling.d.ts +32 -0
- package/dist/src/modules/espn/fantasy/view-model/FantasyViewModel.LeagueManagerPolling.js +141 -0
- package/dist/src/modules/espn/fantasy/view-model/FantasyViewModel.TournamentPolling.d.ts +32 -0
- package/dist/src/modules/espn/fantasy/view-model/FantasyViewModel.TournamentPolling.js +140 -0
- package/dist/src/modules/espn/fantasy/view-model/FantasyViewModel.d.ts +167 -0
- package/dist/src/modules/espn/fantasy/view-model/FantasyViewModel.js +798 -0
- package/dist/src/modules/espn/key-plays/constants.d.ts +3 -0
- package/dist/src/modules/espn/key-plays/constants.js +292 -0
- package/dist/src/modules/espn/key-plays/interfaces/IKeyPlays.d.ts +32 -0
- package/dist/src/modules/espn/key-plays/interfaces/IKeyPlays.js +14 -0
- package/dist/src/modules/espn/key-plays/interfaces/IKeyPlaysResponse.d.ts +44 -0
- package/dist/src/modules/espn/key-plays/interfaces/IKeyPlaysResponse.js +1 -0
- package/dist/src/modules/espn/key-plays/interfaces/IKeyPlaysViewModel.d.ts +17 -0
- package/dist/src/modules/espn/key-plays/interfaces/IKeyPlaysViewModel.js +1 -0
- package/dist/src/modules/espn/key-plays/view/KeyPlayCardScoreTagView.d.ts +9 -0
- package/dist/src/modules/espn/key-plays/view/KeyPlayCardScoreTagView.js +16 -0
- package/dist/src/modules/espn/key-plays/view/KeyPlayCardView.d.ts +27 -0
- package/dist/src/modules/espn/key-plays/view/KeyPlayCardView.js +115 -0
- package/dist/src/modules/espn/key-plays/view/KeyPlayErrorStateView.d.ts +13 -0
- package/dist/src/modules/espn/key-plays/view/KeyPlayErrorStateView.js +65 -0
- package/dist/src/modules/espn/key-plays/view/KeyPlaysView.d.ts +39 -0
- package/dist/src/modules/espn/key-plays/view/KeyPlaysView.js +179 -0
- package/dist/src/modules/espn/key-plays/view-model/KeyPlaysViewModel.d.ts +37 -0
- package/dist/src/modules/espn/key-plays/view-model/KeyPlaysViewModel.js +245 -0
- package/dist/src/modules/espn/shop/mocks.d.ts +22 -0
- package/dist/src/modules/espn/shop/mocks.js +391 -0
- package/dist/src/modules/espn/shop/services/ShopService.d.ts +23 -0
- package/dist/src/modules/espn/shop/services/ShopService.js +44 -0
- package/dist/src/modules/espn/shop/types.d.ts +164 -0
- package/dist/src/modules/espn/shop/types.js +7 -0
- package/dist/src/modules/espn/shop/view/ProductDetailView/ProductDetailView.d.ts +10 -0
- package/dist/src/modules/espn/shop/view/ProductDetailView/ProductDetailView.js +60 -0
- package/dist/src/modules/espn/shop/view/ProductDetailView/index.d.ts +2 -0
- package/dist/src/modules/espn/shop/view/ProductDetailView/index.js +2 -0
- package/dist/src/modules/espn/shop/view/ShopView.d.ts +38 -0
- package/dist/src/modules/espn/shop/view/ShopView.js +223 -0
- package/dist/src/modules/espn/shop/view/components/BrowseCard/BrowseCard.d.ts +103 -0
- package/dist/src/modules/espn/shop/view/components/BrowseCard/BrowseCard.js +23 -0
- package/dist/src/modules/espn/shop/view/components/BrowseCard/index.d.ts +2 -0
- package/dist/src/modules/espn/shop/view/components/BrowseCard/index.js +2 -0
- package/dist/src/modules/espn/shop/view/components/ProductSummaryCard/ProductSummaryCard.d.ts +104 -0
- package/dist/src/modules/espn/shop/view/components/ProductSummaryCard/ProductSummaryCard.js +26 -0
- package/dist/src/modules/espn/shop/view/components/ProductSummaryCard/index.d.ts +2 -0
- package/dist/src/modules/espn/shop/view/components/ProductSummaryCard/index.js +1 -0
- package/dist/src/modules/espn/shop/view/components/ShopPromoView/ShopPromoView.d.ts +8 -0
- package/dist/src/modules/espn/shop/view/components/ShopPromoView/ShopPromoView.js +19 -0
- package/dist/src/modules/espn/shop/view/components/ShopPromoView/index.d.ts +1 -0
- package/dist/src/modules/espn/shop/view/components/ShopPromoView/index.js +1 -0
- package/dist/src/modules/espn/shop/view/components/ShopSection/ShopSection.d.ts +12 -0
- package/dist/src/modules/espn/shop/view/components/ShopSection/ShopSection.js +34 -0
- package/dist/src/modules/espn/shop/view/components/ShopSection/index.d.ts +1 -0
- package/dist/src/modules/espn/shop/view/components/ShopSection/index.js +1 -0
- package/dist/src/modules/espn/shop/view/index.d.ts +2 -0
- package/dist/src/modules/espn/shop/view/index.js +2 -0
- package/dist/src/modules/espn/shop/view-model/ShopViewModel.ShopPolling.d.ts +31 -0
- package/dist/src/modules/espn/shop/view-model/ShopViewModel.ShopPolling.js +111 -0
- package/dist/src/modules/espn/shop/view-model/ShopViewModel.d.ts +73 -0
- package/dist/src/modules/espn/shop/view-model/ShopViewModel.js +323 -0
- package/dist/src/modules/espn/stats/components/TeamStatistic.d.ts +16 -0
- package/dist/src/modules/espn/stats/components/TeamStatistic.js +13 -0
- package/dist/src/modules/espn/stats/interfaces/IStats.d.ts +330 -0
- package/dist/src/modules/espn/stats/interfaces/IStats.js +46 -0
- package/dist/src/modules/espn/stats/interfaces/IStatsViewModel.d.ts +7 -0
- package/dist/src/modules/espn/stats/interfaces/IStatsViewModel.js +1 -0
- package/dist/src/modules/espn/stats/mocks.d.ts +2 -0
- package/dist/src/modules/espn/stats/mocks.js +746 -0
- package/dist/src/modules/espn/stats/services/StatsService.d.ts +54 -0
- package/dist/src/modules/espn/stats/services/StatsService.js +155 -0
- package/dist/src/modules/espn/stats/utils/driveSummaryUtils.d.ts +18 -0
- package/dist/src/modules/espn/stats/utils/driveSummaryUtils.js +48 -0
- package/dist/src/modules/espn/stats/utils/playerStatusUtils.d.ts +4 -0
- package/dist/src/modules/espn/stats/utils/playerStatusUtils.js +17 -0
- package/dist/src/modules/espn/stats/utils.d.ts +39 -0
- package/dist/src/modules/espn/stats/utils.js +62 -0
- package/dist/src/modules/espn/stats/view/ActiveAthletes/ActiveAthletes.d.ts +22 -0
- package/dist/src/modules/espn/stats/view/ActiveAthletes/ActiveAthletes.js +98 -0
- package/dist/src/modules/espn/stats/view/ActiveAthletes/CollapsedAthletes/CollapsedAthletes.d.ts +4 -0
- package/dist/src/modules/espn/stats/view/ActiveAthletes/CollapsedAthletes/CollapsedAthletes.js +27 -0
- package/dist/src/modules/espn/stats/view/ActiveAthletes/ExpandedAthletes/ExpandedAthletes.d.ts +22 -0
- package/dist/src/modules/espn/stats/view/ActiveAthletes/ExpandedAthletes/ExpandedAthletes.js +89 -0
- package/dist/src/modules/espn/stats/view/ActiveAthletes/index.d.ts +2 -0
- package/dist/src/modules/espn/stats/view/ActiveAthletes/index.js +2 -0
- package/dist/src/modules/espn/stats/view/CareerMatchup/CareerMatchup.d.ts +101 -0
- package/dist/src/modules/espn/stats/view/CareerMatchup/CareerMatchup.js +59 -0
- package/dist/src/modules/espn/stats/view/CareerMatchup/index.d.ts +1 -0
- package/dist/src/modules/espn/stats/view/CareerMatchup/index.js +1 -0
- package/dist/src/modules/espn/stats/view/DriveSummary/DrivePlayCard.d.ts +105 -0
- package/dist/src/modules/espn/stats/view/DriveSummary/DrivePlayCard.js +32 -0
- package/dist/src/modules/espn/stats/view/DriveSummary/DriveSummary.d.ts +10 -0
- package/dist/src/modules/espn/stats/view/DriveSummary/DriveSummary.js +40 -0
- package/dist/src/modules/espn/stats/view/DriveSummary/ExpandedItems/DriveSummaryExpanded.d.ts +27 -0
- package/dist/src/modules/espn/stats/view/DriveSummary/ExpandedItems/DriveSummaryExpanded.js +129 -0
- package/dist/src/modules/espn/stats/view/DriveSummary/Header/DriveSummaryHeader.d.ts +12 -0
- package/dist/src/modules/espn/stats/view/DriveSummary/Header/DriveSummaryHeader.js +26 -0
- package/dist/src/modules/espn/stats/view/DriveSummary/MainStat/MainStat.d.ts +10 -0
- package/dist/src/modules/espn/stats/view/DriveSummary/MainStat/MainStat.js +24 -0
- package/dist/src/modules/espn/stats/view/DriveSummary/index.d.ts +2 -0
- package/dist/src/modules/espn/stats/view/DriveSummary/index.js +2 -0
- package/dist/src/modules/espn/stats/view/GameLeaders/GameLeaders.d.ts +9 -0
- package/dist/src/modules/espn/stats/view/GameLeaders/GameLeaders.js +22 -0
- package/dist/src/modules/espn/stats/view/GameLeaders/index.d.ts +2 -0
- package/dist/src/modules/espn/stats/view/GameLeaders/index.js +2 -0
- package/dist/src/modules/espn/stats/view/MatchPredictor/DonutChart/DonutChart.d.ts +17 -0
- package/dist/src/modules/espn/stats/view/MatchPredictor/DonutChart/DonutChart.js +55 -0
- package/dist/src/modules/espn/stats/view/MatchPredictor/DonutChart/index.d.ts +2 -0
- package/dist/src/modules/espn/stats/view/MatchPredictor/DonutChart/index.js +1 -0
- package/dist/src/modules/espn/stats/view/MatchPredictor/MatchPredictorView.d.ts +100 -0
- package/dist/src/modules/espn/stats/view/MatchPredictor/MatchPredictorView.js +60 -0
- package/dist/src/modules/espn/stats/view/MatchPredictor/index.d.ts +3 -0
- package/dist/src/modules/espn/stats/view/MatchPredictor/index.js +2 -0
- package/dist/src/modules/espn/stats/view/Penalties/Penalties.d.ts +9 -0
- package/dist/src/modules/espn/stats/view/Penalties/Penalties.js +6 -0
- package/dist/src/modules/espn/stats/view/Penalties/index.d.ts +2 -0
- package/dist/src/modules/espn/stats/view/Penalties/index.js +2 -0
- package/dist/src/modules/espn/stats/view/PlayerSeasonStats/ExpandedPlayerStats.d.ts +16 -0
- package/dist/src/modules/espn/stats/view/PlayerSeasonStats/ExpandedPlayerStats.js +66 -0
- package/dist/src/modules/espn/stats/view/PlayerSeasonStats/PlayerSeasonStatsCard.d.ts +99 -0
- package/dist/src/modules/espn/stats/view/PlayerSeasonStats/PlayerSeasonStatsCard.js +26 -0
- package/dist/src/modules/espn/stats/view/PlayerSeasonStats/PlayerSeasonStatsMinified.d.ts +6 -0
- package/dist/src/modules/espn/stats/view/PlayerSeasonStats/PlayerSeasonStatsMinified.js +17 -0
- package/dist/src/modules/espn/stats/view/PlayerSeasonStats/PlayerSeasonStatsView.d.ts +8 -0
- package/dist/src/modules/espn/stats/view/PlayerSeasonStats/PlayerSeasonStatsView.js +165 -0
- package/dist/src/modules/espn/stats/view/PlayerSeasonStats/index.d.ts +1 -0
- package/dist/src/modules/espn/stats/view/PlayerSeasonStats/index.js +1 -0
- package/dist/src/modules/espn/stats/view/RecentGames/RecentGames.d.ts +100 -0
- package/dist/src/modules/espn/stats/view/RecentGames/RecentGames.js +23 -0
- package/dist/src/modules/espn/stats/view/RecentGames/index.d.ts +2 -0
- package/dist/src/modules/espn/stats/view/RecentGames/index.js +2 -0
- package/dist/src/modules/espn/stats/view/ScoringSummary/ExpandedScores/ExpandedScores.d.ts +30 -0
- package/dist/src/modules/espn/stats/view/ScoringSummary/ExpandedScores/ExpandedScores.js +123 -0
- package/dist/src/modules/espn/stats/view/ScoringSummary/ExpandedScores/ExpandedSummary.d.ts +100 -0
- package/dist/src/modules/espn/stats/view/ScoringSummary/ExpandedScores/ExpandedSummary.js +24 -0
- package/dist/src/modules/espn/stats/view/ScoringSummary/ExpandedScores/index.d.ts +2 -0
- package/dist/src/modules/espn/stats/view/ScoringSummary/ExpandedScores/index.js +2 -0
- package/dist/src/modules/espn/stats/view/ScoringSummary/ScoreItem/ScoreItem.d.ts +100 -0
- package/dist/src/modules/espn/stats/view/ScoringSummary/ScoreItem/ScoreItem.js +62 -0
- package/dist/src/modules/espn/stats/view/ScoringSummary/ScoreItem/index.d.ts +2 -0
- package/dist/src/modules/espn/stats/view/ScoringSummary/ScoreItem/index.js +2 -0
- package/dist/src/modules/espn/stats/view/ScoringSummary/ScoresSection/ScoresSection.d.ts +6 -0
- package/dist/src/modules/espn/stats/view/ScoringSummary/ScoresSection/ScoresSection.js +23 -0
- package/dist/src/modules/espn/stats/view/ScoringSummary/ScoresSection/index.d.ts +2 -0
- package/dist/src/modules/espn/stats/view/ScoringSummary/ScoresSection/index.js +2 -0
- package/dist/src/modules/espn/stats/view/ScoringSummary/ScoringSummary.d.ts +12 -0
- package/dist/src/modules/espn/stats/view/ScoringSummary/ScoringSummary.js +167 -0
- package/dist/src/modules/espn/stats/view/ScoringSummary/index.d.ts +1 -0
- package/dist/src/modules/espn/stats/view/ScoringSummary/index.js +1 -0
- package/dist/src/modules/espn/stats/view/StatsItemView.d.ts +8 -0
- package/dist/src/modules/espn/stats/view/StatsItemView.js +66 -0
- package/dist/src/modules/espn/stats/view/StatsQRCode/StatsQRCodeView.d.ts +100 -0
- package/dist/src/modules/espn/stats/view/StatsQRCode/StatsQRCodeView.js +36 -0
- package/dist/src/modules/espn/stats/view/StatsQRCode/index.d.ts +2 -0
- package/dist/src/modules/espn/stats/view/StatsQRCode/index.js +1 -0
- package/dist/src/modules/espn/stats/view/StatsView.d.ts +29 -0
- package/dist/src/modules/espn/stats/view/StatsView.js +164 -0
- package/dist/src/modules/espn/stats/view/TeamStats/TeamStatsView.d.ts +101 -0
- package/dist/src/modules/espn/stats/view/TeamStats/TeamStatsView.js +77 -0
- package/dist/src/modules/espn/stats/view/TeamStats/index.d.ts +2 -0
- package/dist/src/modules/espn/stats/view/TeamStats/index.js +1 -0
- package/dist/src/modules/espn/stats/view/Teams/StatsCarousel.d.ts +25 -0
- package/dist/src/modules/espn/stats/view/Teams/StatsCarousel.js +83 -0
- package/dist/src/modules/espn/stats/view/Teams/StatsProgressBar.d.ts +6 -0
- package/dist/src/modules/espn/stats/view/Teams/StatsProgressBar.js +19 -0
- package/dist/src/modules/espn/stats/view/Teams/Teams.d.ts +100 -0
- package/dist/src/modules/espn/stats/view/Teams/Teams.js +39 -0
- package/dist/src/modules/espn/stats/view/Teams/index.d.ts +2 -0
- package/dist/src/modules/espn/stats/view/Teams/index.js +2 -0
- package/dist/src/modules/espn/stats/view/WinProbability/WinProbability.d.ts +100 -0
- package/dist/src/modules/espn/stats/view/WinProbability/WinProbability.js +28 -0
- package/dist/src/modules/espn/stats/view/WinProbability/index.d.ts +2 -0
- package/dist/src/modules/espn/stats/view/WinProbability/index.js +2 -0
- package/dist/src/modules/espn/stats/view/components/AthletesStatistics/AthletesStatistics.d.ts +115 -0
- package/dist/src/modules/espn/stats/view/components/AthletesStatistics/AthletesStatistics.js +89 -0
- package/dist/src/modules/espn/stats/view/components/AthletesStatistics/StatisticTable.d.ts +3 -0
- package/dist/src/modules/espn/stats/view/components/AthletesStatistics/StatisticTable.js +12 -0
- package/dist/src/modules/espn/stats/view/components/AthletesStatistics/index.d.ts +2 -0
- package/dist/src/modules/espn/stats/view/components/AthletesStatistics/index.js +2 -0
- package/dist/src/modules/espn/stats/view/index.d.ts +2 -0
- package/dist/src/modules/espn/stats/view/index.js +2 -0
- package/dist/src/modules/espn/stats/view-model/StatsViewModel.d.ts +322 -0
- package/dist/src/modules/espn/stats/view-model/StatsViewModel.js +1416 -0
- package/dist/src/modules/fox/key-plays/view/FoxKeyPlays.d.ts +2 -0
- package/dist/src/modules/fox/key-plays/view/FoxKeyPlays.js +5 -0
- package/dist/src/modules/fox/multi-view/view/FoxMultiView.d.ts +2 -0
- package/dist/src/modules/fox/multi-view/view/FoxMultiView.js +5 -0
- package/dist/src/modules/fox/stats/view/FoxStatsView.d.ts +2 -0
- package/dist/src/modules/fox/stats/view/FoxStatsView.js +5 -0
- package/dist/src/modules/maestro/builder/components/BuilderSection/BuilderSection.d.ts +11 -0
- package/dist/src/modules/maestro/builder/components/BuilderSection/BuilderSection.js +52 -0
- package/dist/src/modules/maestro/builder/components/BuilderSection/index.d.ts +2 -0
- package/dist/src/modules/maestro/builder/components/BuilderSection/index.js +2 -0
- package/dist/src/modules/maestro/builder/components/ExpandableCard/ExpandableCard.d.ts +110 -0
- package/dist/src/modules/maestro/builder/components/ExpandableCard/ExpandableCard.js +37 -0
- package/dist/src/modules/maestro/builder/components/ExpandableCard/index.d.ts +2 -0
- package/dist/src/modules/maestro/builder/components/ExpandableCard/index.js +2 -0
- package/dist/src/modules/maestro/builder/components/SimpleCard/SimpleCard.d.ts +104 -0
- package/dist/src/modules/maestro/builder/components/SimpleCard/SimpleCard.js +12 -0
- package/dist/src/modules/maestro/builder/components/SimpleCard/index.d.ts +2 -0
- package/dist/src/modules/maestro/builder/components/SimpleCard/index.js +2 -0
- package/dist/src/modules/maestro/builder/index.d.ts +7 -0
- package/dist/src/modules/maestro/builder/index.js +7 -0
- package/dist/src/modules/maestro/builder/mocks/mockBuilderPanel.d.ts +149 -0
- package/dist/src/modules/maestro/builder/mocks/mockBuilderPanel.js +240 -0
- package/dist/src/modules/maestro/builder/types.d.ts +52 -0
- package/dist/src/modules/maestro/builder/types.js +1 -0
- package/dist/src/modules/maestro/builder/view/BuilderPanelView.d.ts +4 -0
- package/dist/src/modules/maestro/builder/view/BuilderPanelView.js +52 -0
- package/dist/src/modules/maestro/builder/view-model/BuilderPanelViewModel.d.ts +40 -0
- package/dist/src/modules/maestro/builder/view-model/BuilderPanelViewModel.js +229 -0
- package/dist/src/modules/maestro/builder/view-model/index.d.ts +1 -0
- package/dist/src/modules/maestro/builder/view-model/index.js +1 -0
- package/dist/src/modules/maestro/hello-world/HelloWorldImage.d.ts +2 -0
- package/dist/src/modules/maestro/hello-world/HelloWorldImage.js +32 -0
- package/dist/src/modules/maestro/hello-world/HelloWorldView.d.ts +11 -0
- package/dist/src/modules/maestro/hello-world/HelloWorldView.js +40 -0
- package/dist/src/modules/maestro/hello-world/index.d.ts +2 -0
- package/dist/src/modules/maestro/hello-world/index.js +2 -0
- package/dist/src/sentry.d.ts +3 -0
- package/dist/src/sentry.js +51 -0
- package/dist/src/services/AnalyticsService/AnalyticsService.d.ts +85 -0
- package/dist/src/services/AnalyticsService/AnalyticsService.js +406 -0
- package/dist/src/services/AnalyticsService/types.d.ts +65 -0
- package/dist/src/services/AnalyticsService/types.js +1 -0
- package/dist/src/services/InsightsService/InsightsPayloadBuilder.d.ts +279 -0
- package/dist/src/services/InsightsService/InsightsPayloadBuilder.js +385 -0
- package/dist/src/services/InsightsService/InsightsService.d.ts +11 -0
- package/dist/src/services/InsightsService/InsightsService.js +74 -0
- package/dist/src/services/NetworkManager/NetworkManager.d.ts +153 -0
- package/dist/src/services/NetworkManager/NetworkManager.js +434 -0
- package/dist/src/services/NetworkManager/errors.d.ts +17 -0
- package/dist/src/services/NetworkManager/errors.js +45 -0
- package/dist/src/services/NetworkManager/types.d.ts +7 -0
- package/dist/src/services/NetworkManager/types.js +1 -0
- package/dist/src/services/StaticService/StaticService.d.ts +20 -0
- package/dist/src/services/StaticService/StaticService.js +85 -0
- package/dist/src/services/StaticService/index.d.ts +2 -0
- package/dist/src/services/StaticService/index.js +2 -0
- package/dist/src/services/StaticService/mocks.d.ts +3 -0
- package/dist/src/services/StaticService/mocks.js +119 -0
- package/dist/src/services/StaticService/types.d.ts +78 -0
- package/dist/src/services/StaticService/types.js +1 -0
- package/dist/src/services/ThemeManager/constants.d.ts +2 -0
- package/dist/src/services/ThemeManager/constants.js +47 -0
- package/dist/src/services/UserSettingsManager.d.ts +63 -0
- package/dist/src/services/UserSettingsManager.js +158 -0
- package/dist/src/test-polyfills.d.ts +1 -0
- package/dist/src/test-polyfills.js +15 -0
- package/dist/src/view-models/MaestroEventViewModel.d.ts +94 -0
- package/dist/src/view-models/MaestroEventViewModel.js +370 -0
- package/dist/src/view-models/PanelManagerViewModel.d.ts +49 -0
- package/dist/src/view-models/PanelManagerViewModel.js +195 -0
- package/dist/src/view-models/ViewModel.d.ts +12 -0
- package/dist/src/view-models/ViewModel.js +32 -0
- package/package.json +7 -5
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{102:function(e,t,a){"use strict";a.d(t,"a",(function(){return i})),a.d(t,"b",(function(){return s}));const i=e=>e.toLowerCase().trim().replace(/[\s\W-]+/g,"-").replace(/^-+|-+$/g,"");function s(e){let t=0;for(let a=0;a<e.length;a++){t=(t<<5)-t+e.charCodeAt(a),t&=t}return t}},118:function(e,t,a){"use strict";a.d(t,"a",(function(){return i}));const i=(e,t,a)=>{try{const i=new URL(e);return i.searchParams.set("w",t.toString()),i.searchParams.set("h",a.toString()),i.toString()}catch(t){return console.warn("Malformed URL:",e,t),e}}},237:function(e,t,a){"use strict";a.r(t),a.d(t,"StatsViewModel",(function(){return f}));var i=a(3),s=a(33);const o={entities:{teams:{9:{id:"9",uid:"s:40~l:59~t:9",slug:"new-york-liberty",location:"New York",name:"Liberty",abbreviation:"NY",displayName:"New York Liberty",shortDisplayName:"Liberty",color:"86cebc",alternateColor:"000000",logo:"https://a.espncdn.com/i/teamlogos/wnba/500/ny.png",statistics:[{$key:"fieldGoalPct",value:45.8,displayValue:"45.8",displayName:"Field Goal %"},{$key:"threePointFieldGoalPct",value:34.7,displayValue:"34.7",displayName:"Three Point %"}],homeAway:"away",record:"11-4",displayOrder:1},11:{id:"11",uid:"s:40~l:59~t:11",slug:"phoenix-mercury",location:"Phoenix",name:"Mercury",abbreviation:"PHX",displayName:"Phoenix Mercury",shortDisplayName:"Mercury",color:"3c286e",alternateColor:"e56020",logo:"https://a.espncdn.com/i/teamlogos/wnba/500/phx.png",statistics:[{$key:"fieldGoalPct",value:43.1,displayValue:"43.1",displayName:"Field Goal %"},{$key:"threePointFieldGoalPct",value:34.8,displayValue:"34.8",displayName:"Three Point %"}],homeAway:"home",record:"12-4",displayOrder:2},14:{id:"14",uid:"s:40~l:59~t:14",abbreviation:"SEA",displayName:"Seattle Storm",logo:"https://a.espncdn.com/i/teamlogos/wnba/500/sea.png"},17:{id:"17",uid:"s:40~l:59~t:17",abbreviation:"LV",displayName:"Las Vegas Aces",logo:"https://a.espncdn.com/i/teamlogos/wnba/500/lv.png"},18:{id:"18",uid:"s:40~l:59~t:18",abbreviation:"CONN",displayName:"Connecticut Sun",logo:"https://a.espncdn.com/i/teamlogos/wnba/500/conn.png"},19:{id:"19",uid:"s:40~l:59~t:19",abbreviation:"CHI",displayName:"Chicago Sky",logo:"https://a.espncdn.com/i/teamlogos/wnba/500/chi.png"},20:{id:"20",uid:"s:40~l:59~t:20",abbreviation:"ATL",displayName:"Atlanta Dream",logo:"https://a.espncdn.com/i/teamlogos/wnba/500/atl.png"},129689:{id:"129689",uid:"s:40~l:59~t:129689",abbreviation:"GS",displayName:"Golden State Valkyries",logo:"https://a.espncdn.com/i/teamlogos/wnba/500/gs.png"},130:{id:"121245",uid:"s:20~l:28~t:12",abbreviation:"KC",displayName:"Kansas City Chiefs",shortDisplayName:"Kansas City",color:"e31837",alternateColor:"ffcb05",logo:"https://a.espncdn.com/i/teamlogos/nfl/500/kc.png",homeAway:"home"},164:{id:"11232",uid:"s:20~l:28~t:12",abbreviation:"KC",displayName:"Kansas City Chiefs",shortDisplayName:"Kansas City",color:"e31837",alternateColor:"ffcb05",logo:"https://a.espncdn.com/i/teamlogos/nfl/500/kc.png",homeAway:"away"}},athletes:{2529137:{id:"2529137",uid:"s:40~l:59~a:2529137",guid:"c3d35267-fedd-d8d2-8c24-64ee7aa144ac",displayName:"Natasha Cloud",shortName:"N. Cloud",jersey:"9",headshot:"https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2529137.jpg?w=184&h=144",links:[{rel:["playercard","desktop","athlete"],href:"https://www.espnqa.com/wnba/player/_/id/2529137/natasha-cloud",text:"Player Card"}],position:{abbreviation:"G"}},4700818:{id:"2529137",uid:"s:40~l:59~a:2529137",guid:"c3d35267-fedd-d8d2-8c24-64ee7aa144ac",displayName:"Natasha Cloud",shortName:"N. Cloud",jersey:"9",headshot:"https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2529137.jpg?w=184&h=144",links:[{rel:["playercard","desktop","athlete"],href:"https://www.espnqa.com/wnba/player/_/id/2529137/natasha-cloud",text:"Player Card"}],position:{abbreviation:"G"}},4837356:{id:"2529137156425",uid:"s:40~l:59~a:2529137",guid:"c3d35267-fedd-d8d2-8c24-64ee7aa144ac",displayName:"Natasha Cloud",shortName:"N. Cloud",jersey:"9",headshot:"https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2529137.jpg?w=184&h=144",links:[{rel:["playercard","desktop","athlete"],href:"https://www.espnqa.com/wnba/player/_/id/2529137/natasha-cloud",text:"Player Card"}],position:{abbreviation:"G"}},5037871:{id:"252913653447",uid:"s:40~l:59~a:2529137",guid:"c3d35267-fedd-d8d2-8c24-64ee7aa144ac",displayName:"Natasha Cloud",shortName:"N. Cloud",jersey:"9",headshot:"https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2529137.jpg?w=184&h=144",links:[{rel:["playercard","desktop","athlete"],href:"https://www.espnqa.com/wnba/player/_/id/2529137/natasha-cloud",text:"Player Card"}],position:{abbreviation:"G"}},4873138:{id:"25275349137",uid:"s:40~l:59~a:2529137",guid:"c3d35267-fedd-d8d2-8c24-64ee7aa144ac",displayName:"Natasha Cloud",shortName:"N. Cloud",jersey:"9",headshot:"https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2529137.jpg?w=184&h=144",links:[{rel:["playercard","desktop","athlete"],href:"https://www.espnqa.com/wnba/player/_/id/2529137/natasha-cloud",text:"Player Card"}],position:{abbreviation:"G"}},2529140:{id:"2529147630",uid:"s:40~l:59~a:2529140",guid:"908608e9-31d4-62f2-dfe2-9fee9024e7e2",displayName:"Alyssa Thomas",shortName:"A. Thomas",jersey:"25",headshot:"https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2529140.jpg?w=184&h=144",links:[{rel:["playercard","desktop","athlete"],href:"https://www.espnqa.com/wnba/player/_/id/2529140/alyssa-thomas",text:"Player Card"}],position:{abbreviation:"F"}},2998928:{id:"29989212758",uid:"s:40~l:59~a:2998928",guid:"4d83d500-2f40-c89e-4f85-62927c5abbeb",displayName:"Breanna Stewart",shortName:"B. Stewart",jersey:"30",headshot:"https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2998928.jpg?w=184&h=144",links:[{rel:["playercard","desktop","athlete"],href:"https://www.espnqa.com/wnba/player/_/id/2998928/breanna-stewart",text:"Player Card"}],position:{abbreviation:"F"}},2999101:{id:"2999112756501",uid:"s:40~l:59~a:2999101",guid:"d5154a93-4a46-71af-8b55-f69328b84b54",displayName:"Jonquel Jones",shortName:"J. Jones",jersey:"35",headshot:"https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2999101.jpg?w=184&h=144",links:[{rel:["playercard","desktop","athlete"],href:"https://www.espnqa.com/wnba/player/_/id/2999101/jonquel-jones",text:"Player Card"}],position:{abbreviation:"C"}},4281929:{id:"428191234729",uid:"s:40~l:59~a:4281929",guid:"d4c403bb-a2c8-ed6b-aeaa-c290d8afea9b",displayName:"Satou Sabally",shortName:"S. Sabally",jersey:"0",headshot:"https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/4281929.jpg?w=184&h=144",links:[{rel:["playercard","desktop","athlete"],href:"https://www.espnqa.com/wnba/player/_/id/4281929/satou-sabally",text:"Player Card"}],position:{abbreviation:"F"}}}},leaders:[{displayName:"Points",name:"pointsPerGame",home:{team:{$key:"11"},athlete:{$key:"4281929",statistics:[{displayValue:"19.1",abbreviation:"PTS"},{displayValue:"39.3",abbreviation:"FG%"},{displayValue:"81.9",abbreviation:"FT%"}]}},away:{team:{$key:"9"},athlete:{$key:"2998928",statistics:[{displayValue:"20.7",abbreviation:"PTS"},{displayValue:"52.0",abbreviation:"FG%"},{displayValue:"81.6",abbreviation:"FT%"}]}}},{displayName:"Assists",name:"assistsPerGame",home:{team:{$key:"11"},athlete:{$key:"2529140",statistics:[{displayValue:"9.3",abbreviation:"AST"},{displayValue:"3.2",abbreviation:"TO"},{displayValue:"30.3",abbreviation:"MIN"}]}},away:{team:{$key:"9"},athlete:{$key:"2529137",statistics:[{displayValue:"6.5",abbreviation:"AST"},{displayValue:"2.1",abbreviation:"TO"},{displayValue:"28.3",abbreviation:"MIN"}]}}},{displayName:"Rebounds",name:"reboundsPerGame",home:{team:{$key:"11"},athlete:{$key:"4281929",statistics:[{displayValue:"8.0",abbreviation:"REB"},{displayValue:"6.5",abbreviation:"DR"},{displayValue:"1.5",abbreviation:"OR"}]}},away:{team:{$key:"9"},athlete:{$key:"2999101",statistics:[{displayValue:"9.6",abbreviation:"REB"},{displayValue:"7.7",abbreviation:"DR"},{displayValue:"1.9",abbreviation:"OR"}]}}}],header:{teams:[{$key:"11",linescores:[{displayValue:"28"},{displayValue:"33"},{displayValue:"27"},{displayValue:"18"},{displayValue:"106"}]},{$key:"9",linescores:[{displayValue:"19"},{displayValue:"24"},{displayValue:"27"},{displayValue:"21"},{displayValue:"91"}]}],linescoresHeader:["1","2","3","4","T"]},predictor:{header:"Matchup Predictor",imageUrl:"https://platform.espnqa.com/lrd/matchuppredictor/401736212",homeTeam:{team:{$key:"11"},gameProjection:"31.8"},awayTeam:{team:{$key:"9"},gameProjection:"68.2"}},winProbability:{imageUrl:"https://platform.espnqa.com/lrd/winprobability/401736212/401736212576",homeTeam:{team:{$key:"11"},winPercentage:"100"},awayTeam:{team:{$key:"9"},winPercentage:"0"}},previousGames:[{displayOrder:2,team:{$key:"11"},events:[{team:{$key:"17",homeAway:"home"},score:"76-70",gameResult:"W"},{team:{$key:"18",homeAway:"home"},score:"83-75",gameResult:"W"},{team:{$key:"9",homeAway:"home"},score:"89-81",gameResult:"W"},{team:{$key:"19",homeAway:"home"},score:"107-86",gameResult:"W"},{team:{$key:"9",homeAway:"away"},score:"106-91",gameResult:"W"}]},{displayOrder:1,team:{$key:"9"},events:[{team:{$key:"20",homeAway:"away"},score:"86-81",gameResult:"W"},{team:{$key:"11",homeAway:"away"},score:"89-81",gameResult:"L"},{team:{$key:"14",homeAway:"home"},score:"89-79",gameResult:"L"},{team:{$key:"129689",homeAway:"home"},score:"81-78",gameResult:"W"},{team:{$key:"11",homeAway:"home"},score:"106-91",gameResult:"L"}]}],gameState:"in",promotion:{title:"Serving Sports Fans. Anytime.",description:"Open the ESPN app on a mobile device to checkout more stats!",logo:"https://www.espn.com/redesign/assets/img/ictv/logo_qr/1x/logo_qr_espn.png",qrCode:"https://stitcher.espn.com/qr-code/.png?url=sportscenter%3A%2F%2Fx-callback-url%2FshowGame%3FsportName%3Dbasketball%26leagueAbbrev%3Dwnba%26gameId%3D401736212&width=200&height=200",backgroundImage:"https://www.espn.com/redesign/assets/img/ictv/bkg_qr_espn.jpg"},activeAthletes:{displayText:"Active Athletes",teams:[{team:{$key:"130"},athletes:[{$key:"4700818",statLine:"16.6 PTS, 5.2 REB"},{$key:"4837356",statLine:"4.1 AST, 2.2 TO"}]},{team:{$key:"164"},athletes:[{$key:"5037871",statLine:"19.4 PTS, 4.0 AST"},{$key:"4873138",statLine:"7.2 REB, 2.1 OR"}]}]},drives:[{id:"drive-1",team:{$key:"9"},description:"4 PLAYS, 41 YARDS, 2:15",plays:[{id:"play-1",clock:{displayValue:"8:21"},period:{number:1},type:{text:"Shotgun"},text:"I.Pacheco left tackle to PHI 20 for 24 yards (M.Epps).",start:{downDistanceText:"2nd & 5 at PHI 44"}},{id:"play-2",clock:{displayValue:"9:33"},period:{number:1},type:{text:"Shotgun"},text:"P.Mahomes pass short middle to T.Kelce to KC 48 for 20 yards (T.Edwards).",start:{downDistanceText:"1st & 10 @ KC 25"}},{id:"play-3",clock:{displayValue:"10:09"},period:{number:1},type:{text:"Shotgun"},text:"I.Pacheco up the middle to KC 28 for 3 yards (J.Hargrave).",start:{downDistanceText:"1st & 10 @ KC 25"}},{id:"play-4",clock:{displayValue:"11:15"},period:{number:1},type:{text:"Shotgun"},text:"P.Mahomes pass complete short right to T.Kelce to KC 35 for 10 yards (J.Bradberry).",start:{downDistanceText:"2nd & 10 at KC 25"}}]}],meta:{gp_topic:"gp-basketball-wnba-401736212",picker_topic:"picker-basketball-wnba",gameState:"in"}},l=e=>e&&"object"==typeof e&&"$key"in e&&"value"in e&&"displayValue"in e&&"displayName"in e,r=e=>Array.isArray(e)&&e.every(e=>(e=>e&&"object"==typeof e&&"stats"in e&&Array.isArray(e.stats))(e));var n=a(34),d=a(8),c=a(4);function u(e,t,a){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var a=e[Symbol.toPrimitive];if(void 0!==a){var i=a.call(e,t||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}var m=class{constructor(e){u(this,"networkManager",void 0),u(this,"overrideUrl",null),this.networkManager=new n.b({externalBaseURL:e.getStatsAPIBaseURL()})}async getStatsByUrl(e){return this.networkManager.externalApiRequest({endpoint:this.getSyncEndpoint(e),method:n.a.GET,params:{},headers:{}})}pollStatsByUrl(e,t,a,i){return this.networkManager.pollExternalApiRequest({endpoint:this.getSyncEndpoint(e),interval:t,method:n.a.GET,params:{},headers:{},onData:a,onError:i})}getSyncEndpoint(e){if(this.overrideUrl)return console.log("[StatsService] Using overrideUrl:",this.overrideUrl),this.overrideUrl;const{leagueId:t,mainId:a}=this.getIdsFromPageConfig();return`/${t}/${a}/en/us/${this.formatTimeCodeForAPI(e)}`}getIdsFromPageConfig(){const e=d.default.getPageConfig();if(!e)throw new Error("Page config is null or undefined");const t=e.page.metadata,a=null==t?void 0:t.external_field_1,i=null==t?void 0:t.external_field_5;if(!a||!i){const e=Object.keys(t||{}).join(", ");throw new Error("Missing eventId or leagueId in page config metadata. Cannot build sync URL. Required fields: external_field_1 (eventId), external_field_5 (leagueId). Available fields: "+e)}const{leagueId:s,fauxcastId:o}=this.parseLeagueData(i),l=o||a;if(!l.trim()||!s.trim())throw new Error("MainId or leagueId is empty string in page config metadata");return{eventId:a,leagueId:s,mainId:l}}parseLeagueData(e){try{const t=JSON.parse(e);if(!t.leagueId)throw new Error("leagueId not found in parsed JSON");return{leagueId:t.leagueId,fauxcastId:t.fauxcastId}}catch(t){const a=new Error("Failed to parse leagueId from external_field_5. Raw value: "+e);throw Object(c.a)(a,{rawValue:e,parseError:t}),a}}formatTimeCodeForAPI(e){if(!e||0===e)return"latest";if("number"!=typeof e||isNaN(e)||!isFinite(e))return console.warn('Invalid timecode provided, using "latest":',e),"latest";try{const t=new Date(e);if(isNaN(t.getTime()))return console.warn('Invalid date from timecode, using "latest":',e),"latest";const a=Date.now();if(a-e<0)return"latest";return t.toISOString().replace(/\.\d{3}Z$/,"Z")}catch(t){return Object(c.a)(t,{timeCode:e}),console.warn('Error formatting timecode, using "latest":',e,t),"latest"}}};const h=e=>{var t,a;if(!e)return{plays:"0",yards:"0",time:""};const i=e.split(", ");return{plays:(null===(t=i[0])||void 0===t?void 0:t.split(" ")[0])||"0",yards:(null===(a=i[1])||void 0===a?void 0:a.split(" ")[0])||"0",time:i[2]||""}},p=e=>{var t;if(null==e||null===(t=e.period)||void 0===t||!t.number)return"";const a=(e=>{const t=e%100;if(t>=11&&t<=13)return"th";switch(e%10){case 1:return"st";case 2:return"nd";case 3:return"rd";default:return"th"}})(e.period.number);return`(${e.clock.displayValue} - ${e.period.number}${a}) (${e.type.text}) ${e.text}`};var y=a(118),v=a(102);function g(e,t,a){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var a=e[Symbol.toPrimitive];if(void 0!==a){var i=a.call(e,t||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}const b={activeAthletes:"activeAthletes",driveSummary:"drives",gameLeaders:"leaders",headerTeam:"header",matchPredictor:"predictor",playerSeasonStats:"playerStats",promotion:"promotion",recentGames:"previousGames",scoringSummary:"scoringSummary",teamStats:"entities",winProbability:"winProbability",careerMatchup:"careerMatchup",penalties:"penaltySummary"};class f extends s.a{constructor(e,t,a,s={}){super(),g(this,"isDataLoading",new i.a(!0)),g(this,"hasEverSuccessfullyLoaded",new i.a(!1)),g(this,"eventId",void 0),g(this,"statsItems",new i.a([])),g(this,"errorState",new i.a("none")),g(this,"currentGameState",new i.a("")),g(this,"statsService",void 0),g(this,"analyticsService",void 0),g(this,"useMockData",!1),g(this,"lastResponseHash",null),g(this,"currentPlayerTimeCode",null),g(this,"timecodePollingTask",null),g(this,"smartPollingTimeout",null),g(this,"timecodePollingState",{isActive:!1,currentUrl:null,lastUpdateTime:0}),g(this,"onEngage",e=>{this.analyticsService.panelClick({type:"espnStats",name:"stats_item_clicked",metadata:{card:[b[e]],game_state:[this.currentGameState.value]}})}),this.eventId=e,this.useMockData=s.useMockData||!1,this.statsService=new m(t),this.analyticsService=a}setDataToPanel(e){if("overrideUrl"in e){const t=e.overrideUrl;"string"==typeof t&&t.length>0&&(console.log("[StatsViewModel] Setting overrideUrl:",t),this.statsService.overrideUrl=t)}}async init(){if(this.useMockData)await this.fetchMockData();else{const e=this.getCurrentTimeCode();this.onUpdatePlayerTimeCode(e),this.analyticsService.panelView("espnStats")}}getCurrentTimeCode(){try{const e=d.default.getMaestroEventViewModel();if(e&&"function"==typeof e.getPlayerTimeCode)return e.getPlayerTimeCode()}catch(e){Object(c.a)(e,{context:"StatsViewModel.getCurrentTimeCode"}),console.warn("Could not get current timecode from MaestroEventViewModel:",e)}return null}cleanup(){this.stopTimecodePolling(),this.clearSmartPollingTimeout(),this.resetTimecodePollingState()}onUpdatePlayerTimeCode(e){if(this.currentPlayerTimeCode=e,!this.useMockData)try{this.performSmartPolling(e)}catch(e){Object(c.a)(e,{context:"StatsViewModel.onUpdatePlayerTimeCode"}),console.error("Error handling player timecode update:",e),this.handleTimecodeError("Error handling player timecode update",e)}}clearTabLoadFailure(){this.errorState.value="none";const e=this.getCurrentTimeCode();this.onUpdatePlayerTimeCode(e)}async performSmartPolling(e){this.clearSmartPollingTimeout(),this.stopTimecodePolling();try{const t=await this.statsService.getStatsByUrl(e);if(!t)throw new Error("API returned undefined or null response");this.processPolledData(t),this.smartPollingTimeout=window.setTimeout(()=>{this.startTimecodePolling(e),this.smartPollingTimeout=null},1e3)}catch(t){Object(c.a)(t,{context:"StatsViewModel.performSmartPolling"}),console.error("Error during smart polling immediate call:",t),this.handleTimecodeError("Error during smart polling immediate call",t),this.stopTimecodePolling(),this.startTimecodePolling(e)}}handleTimecodeError(e,t){var a;const i={context:e,errorType:(null==t||null===(a=t.constructor)||void 0===a?void 0:a.name)||"Unknown",errorMessage:t instanceof Error?t.message:String(t),timestamp:(new Date).toISOString(),currentTimecode:this.currentPlayerTimeCode,hasExistingData:this.statsItems.value.length>0,lastResponseHash:this.lastResponseHash,url:this.timecodePollingState.currentUrl};console.error(e+":",i),this.hasEverSuccessfullyLoaded.value||(this.errorState.value="tabLoadFailure")}clearSmartPollingTimeout(){this.smartPollingTimeout&&(clearTimeout(this.smartPollingTimeout),this.smartPollingTimeout=null)}resetTimecodePollingState(){this.timecodePollingState={isActive:!1,currentUrl:null,lastUpdateTime:0}}startTimecodePolling(e){this.stopTimecodePolling();try{this.timecodePollingTask=this.statsService.pollStatsByUrl(e,1e4,e=>{this.processPolledData(e)},e=>{console.error("Timecode polling error:",e),this.handleTimecodeError("Timecode polling error",e)}),this.timecodePollingState.isActive=!0}catch(e){Object(c.a)(e,{context:"StatsViewModel.startTimecodePolling"}),console.error("Error setting up timecode-based Stats polling:",e),this.handleTimecodeError("Error setting up timecode-based Stats polling",e)}}stopTimecodePolling(){this.timecodePollingTask&&(this.timecodePollingTask.stop(),this.timecodePollingTask=null),this.timecodePollingState.isActive=!1}async fetchMockData(){this.processData(o),this.hasEverSuccessfullyLoaded.value=!0,this.isDataLoading.value=!1}processPolledData(e){const t=JSON.stringify(e),a=Object(v.b)(t);this.hasEverSuccessfullyLoaded.value&&a===this.lastResponseHash||(this.lastResponseHash=a,this.hasEverSuccessfullyLoaded.value=!0,this.errorState.value="none",this.processData(e),"post"===e.gameState&&this.stopTimecodePolling())}processData(e){const t=[],a=this.parseHeaderTeams(e);a&&t.push(a);const i=this.parseMatchPredictor(e);i&&t.push(i);const s=this.parseCareerMatchup(e);s&&t.push(s);const o=this.parsePlayerSeasonStats(e);o&&t.push(o);const l=this.parseScoringSummary(e);l&&t.push(l);const r=this.parseWinProbability(e);r&&t.push(r);const n=this.parseTeamSeasonStatistics(e)||this.parseTeamsStatistics(e);n&&t.push(n);const d=this.parseDriveSummary(e);d.length>0&&t.push(...d);const c=this.parsePenalties(e);c&&t.push(c);const u=this.parseActiveAthletes(e);u&&t.push(u);const m=this.parseGameLeaders(e);m&&t.push(m);const h=this.parseRecentGames(e);h&&t.push(h);const p=this.parsePromotion(e);p&&t.push(p),this.statsItems.value=t,this.currentGameState.value=e.gameState}parseDriveSummary(e){var t;const a=null===(t=e.entities)||void 0===t?void 0:t.teams,i=e.drives;if(!a||!i||0===i.length)return[];const s=[];for(const e of i){var o;if(null==e||null===(o=e.team)||void 0===o||!o.$key)continue;const t=[...e.plays||[]].reverse(),i=t[t.length-1]||null;let l="";i&&(l=p(i));const{plays:r,time:n,yards:d}=h(e.description||""),c=a[e.team.$key];c&&s.push({id:e.id,lastPlayMarquee:l,plays:t,playsQuantity:r,team:c,time:n,type:"driveSummary",yards:d})}return s}parseTeamsStatistics(e){var t;const a=null===(t=e.entities)||void 0===t?void 0:t.teams;if(!a)return null;const i=Object.values(a).find(e=>"away"===e.homeAway),s=Object.values(a).find(e=>"home"===e.homeAway);if(!i||!s)return null;if(!i.statistics||!s.statistics)return null;const o=[];for(let e=0;e<i.statistics.length;e++){const t=i.statistics[e],a=s.statistics[e];l(t)&&l(a)&&o.push({awayTeamDisplayValue:(null==t?void 0:t.displayValue)||"0",displayName:t.displayName||"",homeTeamDisplayValue:(null==a?void 0:a.displayValue)||"0",awayTeamValue:(null==t?void 0:t.value)||0,homeTeamValue:(null==a?void 0:a.value)||0})}return o.length?{type:"teamStats",title:"Team Stats",awayTeam:{logo:i.logo,displayName:i.displayName||"",color:i.color||"",abbreviation:i.abbreviation||""},homeTeam:{logo:s.logo,displayName:s.displayName||"",color:s.color||"",abbreviation:s.abbreviation||""},statistics:o}:null}parseTeamSeasonStatistics(e){var t,a,i,s,o;const l=(null===(t=e.entities)||void 0===t?void 0:t.teams)||{};if(!(Object.keys(l).length&&e.statTeams&&e.statTeams.title&&null!==(a=e.statTeams.sections)&&void 0!==a&&a.length&&null!==(i=e.statTeams.teams)&&void 0!==i&&i.length))return null;const n=null===(s=e.statTeams.teams[0])||void 0===s?void 0:s.$key,d=null===(o=e.statTeams.teams[1])||void 0===o?void 0:o.$key;if(!n||!d)return null;const c=l[n],u=l[d];if(!u||!c)return null;const m={};return e.statTeams.sections.forEach(e=>{if(e.$key&&e.title){const i=[];if(r(u.statistics)&&r(c.statistics)){var t,a;const s=u.statistics.find(t=>t.$key===e.$key),o=c.statistics.find(t=>t.$key===e.$key);if(s&&o&&null!==(t=o.stats)&&void 0!==t&&t.length&&null!==(a=s.stats)&&void 0!==a&&a.length){for(let e=0;e<o.stats.length;e++){const t=o.stats[e],a=s.stats[e];i.push({awayTeamDisplayValue:(null==t?void 0:t.displayValue)||"0",displayName:t.displayName||"",homeTeamDisplayValue:(null==a?void 0:a.displayValue)||"0",awayTeamValue:null!=t&&t.displayValue?Number(t.displayValue):0,homeTeamValue:null!=a&&a.displayValue?Number(a.displayValue):0})}m[e.$key]={title:e.title,entries:i}}}}}),{type:"teamStats",title:e.statTeams.title,awayTeam:{abbreviation:c.abbreviation,displayName:c.displayName||"",color:c.color||"",logo:c.logo},homeTeam:{abbreviation:u.abbreviation,displayName:u.displayName||"",color:u.color||"",logo:u.logo},tabbedStatistics:m}}parseMatchPredictor(e){var t;const a=null===(t=e.entities)||void 0===t?void 0:t.teams,i=e.predictor;if(!(a&&i&&i.homeTeam&&i.awayTeam))return null;const s=a[i.homeTeam.team.$key],o=a[i.awayTeam.team.$key];if(!s||!o)return null;const l=parseFloat(i.homeTeam.gameProjection),r=parseFloat(i.awayTeam.gameProjection);return{type:"matchPredictor",header:i.header,imageUrl:i.imageUrl,awayTeam:{percentage:r,abbreviation:o.abbreviation,logo:o.logo,displayName:o.displayName||""},homeTeam:{percentage:l,abbreviation:s.abbreviation,logo:s.logo,displayName:s.displayName||""}}}parsePromotion(e){const t=e.promotion;return t?{type:"promotion",title:t.title||"",description:t.description||"",logo:t.logo||"",qrCode:t.qrCode||"",backgroundImage:t.backgroundImage||""}:null}parseCareerMatchup(e){var t;const a=e.careerMatchup,i=null===(t=e.entities)||void 0===t?void 0:t.athletes;if(!a||!a.sections)return null;const s=e=>{if("string"==typeof e)return e;if(e&&"object"==typeof e){const t=e.displayName;if("string"==typeof t)return t}return""},o=a.sections.filter(e=>!!e).map(e=>({items:(e.items||[]).filter(e=>!!e).map(e=>{var t;const a=null===(t=e.athlete)||void 0===t?void 0:t.$key,o=i&&a?i[a]:void 0,l=s(e.status),r="On Deck"===l;return{status:l,type:s(e.type)||"",displayName:s(e.displayName)||"",athlete:o,isHighlighted:r}}),statistics:(e.statistics||[]).filter(e=>!!e).map(e=>({abbreviation:e.abbreviation||"",displayValue:e.displayValue||""}))}));return{type:"careerMatchup",title:a.title||"",sections:o}}parseHeaderTeams(e){return this.parseHeaderTeamsFromTeamHeader(e)||this.parseHeaderTeamsFromHeader(e)}parseHeaderTeamsFromHeader(e){var t,a;const i=(null===(t=e.header)||void 0===t?void 0:t.teams)||[];return 0===i.length?null:this.buildHeaderTeamsItem({response:e,headerTeams:i,linescoresHeader:(null===(a=e.header)||void 0===a?void 0:a.linescoresHeader)||[],linescoresRowHeader:void 0,isLiveFromHeaderSource:!1})}parseHeaderTeamsFromTeamHeader(e){var t,a,i,s,o,l,r,n;const d=(null===(t=e.header)||void 0===t?void 0:t.teams)||[],c=(null===(a=e.teamHeader)||void 0===a?void 0:a.teams)||[];if(0===c.length)return null;const u=c.some(e=>Array.isArray(e.linescores)&&e.linescores.length>0),m=((null===(i=e.teamHeader)||void 0===i||null===(s=i.linescoresHeader)||void 0===s?void 0:s.length)||0)>0;if(!u&&!m&&d.length>0)return null;const h="teamLogo"===(null===(o=e.teamHeader)||void 0===o||null===(l=o.style)||void 0===l||null===(r=l.linescores)||void 0===r?void 0:r.rowHeader)?"teamLogo":void 0;return this.buildHeaderTeamsItem({response:e,headerTeams:c,linescoresHeader:(null===(n=e.teamHeader)||void 0===n?void 0:n.linescoresHeader)||[],linescoresRowHeader:h,isLiveFromHeaderSource:u||m})}buildHeaderTeamsItem(e){var t;const{response:a,headerTeams:i,linescoresHeader:s,linescoresRowHeader:o,isLiveFromHeaderSource:r}=e,n=null===(t=a.entities)||void 0===t?void 0:t.teams;if(!n||0===i.length)return null;const d=i.find(e=>{const t=n[e.$key];return t&&"home"===t.homeAway}),c=i.find(e=>{const t=n[e.$key];return t&&"away"===t.homeAway}),u=i[0],m=i[1],h=d||m,p=c||u;if(!h||!p)return null;const y=n[h.$key],v=n[p.$key];if(!y||!v)return null;const g=[],b=new Set,f=v.statistics||[],w=y.statistics||[],k=f.filter(l),T=w.filter(l);[...k,...T].forEach(e=>{b.add(e.$key)}),b.forEach(e=>{const t=k.find(t=>t.$key===e),a=T.find(t=>t.$key===e);t&&a&&g.push({displayName:(null==t?void 0:t.displayName)||(null==a?void 0:a.displayName)||"",awayTeamValue:(null==t?void 0:t.value)||0,homeTeamValue:(null==a?void 0:a.value)||0,awayTeamDisplayValue:(null==t?void 0:t.displayValue)||"0",homeTeamDisplayValue:(null==a?void 0:a.displayValue)||"0"})});const S=e=>e.linescores&&e.linescores.length>0?e.linescores.map(e=>e.displayValue):"string"==typeof e.score&&e.score.length>0?[e.score]:[],P=e=>{if(Array.isArray(e.details)&&e.details.filter(Boolean).length>0)return e.details.filter(Boolean)},N=P(p),$=P(h);let A=s,V=S(p),C=S(h);if(A.length>0&&(V.length>0||C.length>0)&&"teamLogo"===o){const e=A.slice(-3);if((e.includes("R")||e.includes("H")||e.includes("E"))&&A.length>12){const e=3,t=A.length-e,a=9;if(t>a){const e=t-a;A=A.slice(e),V=V.slice(e),C=C.slice(e)}}}return{type:"headerTeam",linescoresHeader:A,linescoresRowHeader:o,isLive:"in"===a.gameState||"post"===a.gameState||r,statistics:g,awayTeam:{abbreviation:v.abbreviation,color:v.color,id:v.id,linescores:V,logo:v.logo,name:v.name,record:v.record,...N?{details:N}:{}},homeTeam:{abbreviation:y.abbreviation,color:y.color,id:y.id,linescores:C,logo:y.logo,name:y.name,record:y.record,...$?{details:$}:{}}}}parseRecentGames(e){var t,a,i;const s=null===(t=e.entities)||void 0===t?void 0:t.teams,o=e.previousGames;if(!s||!o||0===o.length)return null;const l=o.find(e=>1===(null==e?void 0:e.displayOrder)),r=o.find(e=>2===(null==e?void 0:e.displayOrder));if(!l||!r)return null;if(!l.events||!r.events)return null;if(null===(a=l.team)||void 0===a||!a.$key||null===(i=r.team)||void 0===i||!i.$key)return null;const n=s[l.team.$key],d=s[r.team.$key];if(!n||!d)return null;return{type:"recentGames",awayTeam:{events:[...l.events].reverse().filter(e=>{var t;return null==e||null===(t=e.team)||void 0===t?void 0:t.$key}).map(e=>{const t=s[e.team.$key];return{gameResult:e.gameResult,homeAway:e.team.homeAway,score:e.score,teamLogo:null==t?void 0:t.logo}}),logo:n.logo,name:n.shortDisplayName},homeTeam:{events:[...r.events].reverse().filter(e=>{var t;return null==e||null===(t=e.team)||void 0===t?void 0:t.$key}).map(e=>{const t=s[e.team.$key];return{gameResult:e.gameResult,homeAway:e.team.homeAway,score:e.score,teamLogo:null==t?void 0:t.logo}}),logo:d.logo,name:d.shortDisplayName}}}parseWinProbability(e){var t;const a=e.winProbability;if(!a||!a.homeTeam||!a.awayTeam)return null;const i=null===(t=e.entities)||void 0===t?void 0:t.teams;if(!i)return null;const s=i[a.homeTeam.team.$key],o=i[a.awayTeam.team.$key];return s&&o?{type:"winProbability",chartImageUrl:a.imageUrl,awayTeam:{id:o.id,abbreviation:o.abbreviation,logo:o.logo,winPercentage:a.awayTeam.winPercentage},homeTeam:{id:s.id,abbreviation:s.abbreviation,logo:s.logo,winPercentage:a.homeTeam.winPercentage}}:null}parseGameLeaders(e){var t,a;if(null===(t=e.entities)||void 0===t||!t.athletes||null===(a=e.entities)||void 0===a||!a.teams)return null;const i=e.leaders,s="pre"===e.gameState;if(!i||0===i.length)return null;const o=[];for(const t of i){var l,r,n,d,c,u;if(!t.away||!t.home)continue;if(null===(l=t.away)||void 0===l||null===(r=l.athlete)||void 0===r||!r.$key||null===(n=t.home)||void 0===n||null===(d=n.athlete)||void 0===d||!d.$key)continue;const a=e.entities.athletes[t.away.athlete.$key],i=e.entities.athletes[t.home.athlete.$key];if(!a||!i)continue;const s=t.away.athlete.statistics||[],m=t.home.athlete.statistics||[],h={displayName:t.displayName,awayAthlete:{id:a.id,displayName:a.displayName,headshot:a.headshot?Object(y.a)(a.headshot,256,144):"",position:(null===(c=a.position)||void 0===c?void 0:c.abbreviation)||"-",shortName:a.shortName,jersey:a.jersey,statistics:s},homeAthlete:{id:i.id,displayName:i.displayName,headshot:i.headshot?Object(y.a)(i.headshot,256,144):"",position:(null===(u=i.position)||void 0===u?void 0:u.abbreviation)||"-",shortName:i.shortName,jersey:i.jersey,statistics:m}};o.push(h)}return o.length?{type:"gameLeaders",items:o,displayText:s?"Season Leaders":"Game Leaders"}:null}parseActiveAthletes(e){var t;const a=e.activeAthletes,{awayTeam:i,homeTeam:s}=this.getActiveAthletesTeamInfo(e),o=[];if(null===(t=e.entities)||void 0===t||!t.athletes||!a||-1===i.index||-1===s.index)return null;for(let t=0;t<a.teams[i.index].athletes.length;t++){var l,r;const n=a.teams[i.index].athletes[t],d=a.teams[s.index].athletes[t];if(null==n||!n.$key||null==d||!d.$key)continue;const c=e.entities.athletes[n.$key],u=e.entities.athletes[d.$key];if(!c||!u)continue;const m=[],h=[],p=n.statLine||"",v=d.statLine||"";p.trim().split(",").forEach((e,t)=>{const[a,i]=e.trim().split(" "),s=v.trim().split(",")[t];if(!s)return;const[o,l]=s.trim().split(" ");m.push({displayValue:a||"0",abbreviation:i||"-",value:parseFloat(a)||0}),h.push({displayValue:o||"0",abbreviation:l||"-",value:parseFloat(o)||0})}),o.push({awayAthlete:{id:c.id,displayName:c.displayName,headshot:c.headshot?Object(y.a)(c.headshot,256,144):"",position:(null===(l=c.position)||void 0===l?void 0:l.abbreviation)||"-",shortName:c.shortName,jersey:c.jersey,statistics:m,minifiedStatistics:n.statLine},homeAthlete:{id:u.id,displayName:u.displayName,headshot:u.headshot?Object(y.a)(u.headshot,256,144):"",position:(null===(r=u.position)||void 0===r?void 0:r.abbreviation)||"-",shortName:u.shortName,jersey:u.jersey,statistics:h,minifiedStatistics:d.statLine}})}return o.length?{type:"activeAthletes",awayTeam:i,homeTeam:s,athletes:o,displayText:a.displayText}:null}getActiveAthletesTeamInfo(e){var t,a;const i=(null===(t=e.activeAthletes)||void 0===t?void 0:t.teams)||[];let s={index:-1,id:"",logo:"",name:"-"},o={index:-1,id:"",logo:"",name:"-"};const l=null===(a=e.entities)||void 0===a?void 0:a.teams;if(!l)return{awayTeam:s,homeTeam:o};for(let e=0;e<i.length;e++){const t=l[i[e].team.$key];t&&("away"===t.homeAway?s={index:e,id:t.id,logo:t.logo,name:t.name||"-"}:"home"===t.homeAway&&(o={index:e,id:t.id,logo:t.logo,name:t.name||"-"}))}return{awayTeam:s,homeTeam:o}}parseScoringSummary(e){var t,a;const i=e.scoringSummary;if(!i||!i.sections)return null;const s=null===(t=e.entities)||void 0===t?void 0:t.teams,o=null===(a=e.entities)||void 0===a?void 0:a.athletes;if((e=>e&&"object"==typeof e&&"title"in e&&"sections"in e&&e.sections&&Array.isArray(e.sections)&&e.sections.some(e=>e&&"items"in e&&Array.isArray(e.items)&&e.items.some(e=>e&&("text"in e||"shortText"in e||"header"in e))))(i)){const e=[];for(const t of i.sections){var l;if(!t.title||null===(l=t.items)||void 0===l||!l.length)continue;const a=[];for(const e of t.items){var r,n,d;if(null==e||null===(r=e.team)||void 0===r||!r.$key||null==e||null===(n=e.athlete)||void 0===n||!n.$key)continue;const t=null==s?void 0:s[e.team.$key],i=null==o?void 0:o[e.athlete.$key],l="#"+((null==i?void 0:i.jersey)||""),c=(null==i?void 0:i.shortName)||"";if(!t||!i)continue;const u=[];l&&u.push({featured:!1,title:l}),c&&u.push({featured:!0,title:c}),a.push({teamLogo:(null==t?void 0:t.logo)||"",teamName:null==t?void 0:t.abbreviation,headshot:null!=i&&i.headshot?Object(y.a)(i.headshot,200,144):void 0,athleteShortName:(null==i?void 0:i.shortName)||"",athleteJersey:(null==i?void 0:i.jersey)||"",athletePosition:(null==i||null===(d=i.position)||void 0===d?void 0:d.abbreviation)||"",text:(null==e?void 0:e.text)||"",shortText:u,header:((null==e?void 0:e.header)||[]).map((e,t)=>{var a,i;return{featured:null!==(a=e.featured)&&void 0!==a&&a,title:`${null!==(i=e.title)&&void 0!==i?i:""}${0===t?",":""}`}})})}a.length>0&&e.push({title:t.title,items:a})}return 0===e.length?null:{type:"scoringSummary",tag:"mlb",title:i.title||"Scoring Summary",sections:e}}if((e=>e&&"object"==typeof e&&"title"in e&&"sections"in e&&e.sections&&Array.isArray(e.sections)&&e.sections.every(e=>e&&"title"in e&&"items"in e&&Array.isArray(e.items)&&e.items.every(e=>e&&"clock"in e&&"title"in e&&"team"in e&&"athlete"in e)))(i)){const e=i,t=[];for(const a of e.sections||[]){const e=[];for(const t of a.items||[]){var c,u,m,h;if(null==t||null===(c=t.team)||void 0===c||!c.$key||null==t||null===(u=t.athlete)||void 0===u||!u.$key||null==t||!t.title)continue;const a=t.team&&t.team.$key?null==s?void 0:s[t.team.$key]:void 0,i=(null===(m=t.athlete)||void 0===m?void 0:m.$key)||"",l=null==o?void 0:o[i],r=t.title||"",[n,...d]=r.split(" ");let p="",v="";d.length>0&&(p=d[d.length-1],v=d.slice(0,-1).join(" "));const g=[];t.clock&&g.push({featured:!0,title:t.clock}),null!=a&&a.abbreviation&&g.push({featured:!1,title:a.abbreviation});const b=[];n&&b.push({featured:!1,title:n}),v&&b.push({featured:!0,title:v}),p&&b.push({featured:!1,title:p}),e.push({teamLogo:(null==a?void 0:a.logo)||"",teamName:(null==a?void 0:a.abbreviation)||"",header:g,text:(null==t?void 0:t.description)||"",shortText:b,headshot:null!=l&&l.headshot?Object(y.a)(l.headshot,200,144):void 0,athleteShortName:v,athletePosition:(null==l||null===(h=l.position)||void 0===h?void 0:h.abbreviation)||"",athleteJersey:n})}e.length>0&&t.push({title:(null==a?void 0:a.title)||"",items:e})}return 0===t.length?null:{type:"scoringSummary",tag:"hockey",title:e.title||"Scoring Summary",sections:t}}return null}parsePenalties(e){var t,a;const i=e.penaltySummary;if(!i||!i.sections)return null;const s=null===(t=e.entities)||void 0===t?void 0:t.teams,o=null===(a=e.entities)||void 0===a?void 0:a.athletes,l=i.sections.map(e=>{const t=e.items.filter(e=>{var t,a;return(null==e||null===(t=e.team)||void 0===t?void 0:t.$key)&&(null==e||null===(a=e.athlete)||void 0===a?void 0:a.$key)}).map(e=>{var t;const a=null==s?void 0:s[e.team.$key],i=null==o?void 0:o[e.athlete.$key],[l,...r]=e.title.split(" "),n=(null!=r?r:[]).join(" ")||"",d=[];return l&&d.push({featured:!1,title:l}),n&&d.push({featured:!0,title:n}),{teamLogo:(null==a?void 0:a.logo)||"",teamName:(null==a?void 0:a.abbreviation)||"",header:[{title:e.clock||"",featured:!1}],text:e.description||"",shortText:d,headshot:null!=i&&i.headshot?Object(y.a)(i.headshot,200,144):void 0,athleteShortName:r.join(" "),athletePosition:(null==i||null===(t=i.position)||void 0===t?void 0:t.abbreviation)||"",athleteJersey:l||""}});return{title:e.title,items:t}});return!l.length||l.every(e=>0===e.items.length)?null:{type:"penalties",tag:"penalties",title:i.title,sections:l}}parsePlayerSeasonStats(e){var t,a,i;const s=e.playerStats,o=null===(t=e.entities)||void 0===t?void 0:t.teams,l=null===(a=e.entities)||void 0===a?void 0:a.athletes;if(null==s||null===(i=s.teams)||void 0===i||!i.length||!o)return null;const r=[];for(const e of s.teams){if(!e.$key)continue;const t=o[e.$key];if(!t)continue;const a=[];for(const t of e.sections||[]){var n;if(!t.title||null===(n=t.items)||void 0===n||!n.length)continue;const e=[];for(const a of t.items){var d,c,u,m,h;if(!a.title)continue;const t=null===(d=a.athlete)||void 0===d?void 0:d.$key,i=t?null==l?void 0:l[t]:void 0,s=(null===(c=a.athlete)||void 0===c?void 0:c.statistics)||[],o=s.find(e=>e.featured);e.push({title:a.title,headshot:null!=i&&i.headshot?Object(y.a)(i.headshot,256,144):"",position:(null==i||null===(u=i.position)||void 0===u?void 0:u.abbreviation)||"",jersey:(null==i?void 0:i.jersey)||"",featuredStat:o?{displayValue:o.displayValue||"",label:o.label||""}:null,statistics:s.filter(e=>!e.featured).map(e=>({displayValue:e.displayValue||"",label:e.label||""})),playerStatus:null!=a&&a.status?{displayName:null!==(m=a.status.displayName)&&void 0!==m?m:"",type:null!==(h=a.status.type)&&void 0!==h?h:""}:null})}e.length>0&&a.push({title:t.title,items:e})}a.length>0&&r.push({teamKey:e.$key,shortDisplayName:t.shortDisplayName||t.displayName||"",color:t.color||"",sections:a})}return 0===r.length?null:{type:"playerSeasonStats",teams:r}}}t.default=f}}]);
|
|
2
|
+
//# sourceMappingURL=9.maestro-web-sdk.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["webpack:///./src/helpers/strings.ts","webpack:///./src/helpers/url.ts","webpack:///./src/modules/espn/stats/mocks.ts","webpack:///./src/modules/espn/stats/interfaces/IStats.ts","webpack:///./src/modules/espn/stats/services/StatsService.ts","webpack:///./src/modules/espn/stats/utils/driveSummaryUtils.ts","webpack:///./src/modules/espn/stats/view-model/StatsViewModel.ts"],"names":["slugify","str","toLowerCase","trim","replace","stringHashCode","hash","i","length","charCodeAt","setImageDimensions","url","width","height","urlObj","URL","searchParams","set","toString","err","console","warn","MOCK_STATS_API_PRE_GAME_RESPONSE","entities","teams","id","uid","slug","location","name","abbreviation","displayName","shortDisplayName","color","alternateColor","logo","statistics","$key","value","displayValue","homeAway","record","displayOrder","athletes","guid","shortName","jersey","headshot","links","rel","href","text","position","leaders","home","team","athlete","away","header","linescores","linescoresHeader","predictor","imageUrl","homeTeam","gameProjection","awayTeam","winProbability","winPercentage","previousGames","events","score","gameResult","gameState","promotion","title","description","qrCode","backgroundImage","activeAthletes","displayText","statLine","drives","plays","clock","period","number","type","start","downDistanceText","meta","gp_topic","picker_topic","isTeamStatistic","data","isTabbedStatisticsArray","Array","isArray","every","item","stats","isTabbedStatistics","StatsService","constructor","delegate","_defineProperty","this","networkManager","NetworkManager","externalBaseURL","getStatsAPIBaseURL","timeCode","externalApiRequest","endpoint","getSyncEndpoint","method","HttpMethod","GET","params","headers","pollStatsByUrl","interval","onData","onError","pollExternalApiRequest","overrideUrl","log","leagueId","mainId","getIdsFromPageConfig","formatTimeCodeForAPI","pageConfig","SDK","getPageConfig","Error","metadata","page","eventId","external_field_1","leagueField","external_field_5","availableFields","Object","keys","join","fauxcastId","parseLeagueData","parsed","JSON","parse","parseError","error","captureException","rawValue","isNaN","isFinite","date","Date","getTime","now","toISOString","parseDriveDescription","_parts$","_parts$2","yards","time","parts","split","formatLastPlayMarquee","lastPlay","_lastPlay$period","ordinalSuffix","lastTwoDigits","getOrdinalSuffix","STATS_ITEM_TYPE_CARD_MAP","driveSummary","gameLeaders","headerTeam","matchPredictor","playerSeasonStats","recentGames","scoringSummary","teamStats","careerMatchup","penalties","StatsViewModel","ViewModel","analyticsService","options","super","Observable","isActive","currentUrl","lastUpdateTime","panelClick","card","game_state","currentGameState","useMockData","statsService","setDataToPanel","panelData","fetchMockData","currentTimeCode","getCurrentTimeCode","onUpdatePlayerTimeCode","panelView","maestroEventViewModel","getMaestroEventViewModel","getPlayerTimeCode","context","cleanup","stopTimecodePolling","clearSmartPollingTimeout","resetTimecodePollingState","playerTimeCode","currentPlayerTimeCode","performSmartPolling","handleTimecodeError","clearTabLoadFailure","errorState","immediateStats","getStatsByUrl","processPolledData","smartPollingTimeout","window","setTimeout","startTimecodePolling","_error$constructor","errorDetails","errorType","errorMessage","message","String","timestamp","currentTimecode","hasExistingData","statsItems","lastResponseHash","timecodePollingState","hasEverSuccessfullyLoaded","clearTimeout","timecodePollingTask","stop","processData","isDataLoading","responseString","stringify","currentHash","parseHeaderTeams","push","parseMatchPredictor","parseCareerMatchup","parsePlayerSeasonStats","parseScoringSummary","parseWinProbability","parseTeamSeasonStatistics","parseTeamsStatistics","parseDriveSummary","parsePenalties","parseActiveAthletes","parseGameLeaders","parseRecentGames","parsePromotion","_data$entities","result","drive","_drive$team","reverse","lastPlayMarquee","playsQuantity","_data$entities2","values","find","awayStat","homeStat","awayTeamDisplayValue","homeTeamDisplayValue","awayTeamValue","homeTeamValue","_data$entities3","_data$statTeams$secti","_data$statTeams$teams","_data$statTeams$teams2","_data$statTeams$teams3","statTeams","sections","awayTeamKey","homeTeamKey","tabbedStatistics","forEach","section","sectionKeyStatistics","_awaySectionStats$sta","_homeSectionStats$sta","homeSectionStats","st","awaySectionStats","Number","entries","_data$entities4","homePercentage","parseFloat","awayPercentage","percentage","response","_response$entities","toText","maybeDisplayName","filter","map","items","_item$athlete","athleteKey","undefined","statusText","status","isHighlighted","stat","parseHeaderTeamsFromTeamHeader","parseHeaderTeamsFromHeader","_response$header","_response$header2","headerTeams","buildHeaderTeamsItem","linescoresRowHeader","isLiveFromHeaderSource","_response$header3","_response$teamHeader","_response$teamHeader2","_response$teamHeader3","_response$teamHeader4","_response$teamHeader5","_response$teamHeader6","_response$teamHeader7","teamHeaderTeams","teamHeader","teamHeaderHasLinescores","some","t","teamHeaderHasLinescoresHeader","style","rowHeader","_response$entities2","rawLinescoresHeader","homeTeamHeader","awayTeamHeader","fallbackAwayTeamHeader","fallbackHomeTeamHeader","resolvedHomeTeamHeader","resolvedAwayTeamHeader","statisticsSet","Set","rawAwayStats","rawHomeStats","awayStatistics","homeStatistics","add","statKey","buildLinescores","l","maybeDetails","details","Boolean","awayDetails","homeDetails","awayTeamLinescores","homeTeamLinescores","lastThreeHeaders","slice","includes","statsCount","inningsCount","maxInningsToShow","inningsToRemove","isLive","_response$entities3","_awayTeamPreviousGame","_homeTeamPreviousGame","awayTeamPreviousGame","game","homeTeamPreviousGame","event","_event$team","eventTeam","teamLogo","_event$team2","_response$entities4","chartImageUrl","_response$entities5","_response$entities6","isPre","leader","_leader$away","_leader$away$athlete","_leader$home","_leader$home$athlete","_awayAthlete$position","_homeAthlete$position","awayAthlete","homeAthlete","awayAthleteStatistics","homeAthleteStatistics","_response$entities7","getActiveAthletesTeamInfo","index","_awayAthleteInfo$posi","_homeAthleteInfo$posi","awayAthleteInfo","homeAthleteInfo","awayStatLine","homeStatLine","awayDisplayValue","awayAbbreviation","homeStats","homeDisplayValue","homeAbbreviation","minifiedStatistics","_data$activeAthletes","_data$entities5","entitiesTeams","_data$entities6","_data$entities7","isMlbScoringSummary","_section$items","_item$team","_item$athlete2","_athlete$position","athleteNumber","athleteName","textParts","featured","teamName","athleteShortName","athleteJersey","athletePosition","shortText","h","_h$featured","_h$title","tag","isHockeyScoringSummary","hockeySummary","_item$team2","_item$athlete3","_item$athlete4","_athlete$position2","atheleteKey","itemTitle","athleteNameWithAssists","athleteAssists","_data$entities8","_data$entities9","penaltySummary","_item$team3","_item$athlete5","_athlete$position3","athleteDisplayName","s","_data$entities0","_data$entities1","_playerStats$teams","playerStats","parsedTeams","playerStatsTeam","_section$items2","_item$athlete6","_item$athlete7","_athlete$position4","_item$status$displayN","_item$status$type","featuredStat","label","playerStatus","teamKey"],"mappings":"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","file":"9.maestro-web-sdk.esm.js","sourcesContent":["export const slugify = (str: string) =>\n str\n .toLowerCase()\n .trim()\n .replace(/[\\s\\W-]+/g, '-')\n .replace(/^-+|-+$/g, '');\n\nexport function stringHashCode(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n}\n","export const setImageDimensions = (\n url: string,\n width: number,\n height: number\n) => {\n try {\n const urlObj = new URL(url);\n urlObj.searchParams.set('w', width.toString());\n urlObj.searchParams.set('h', height.toString());\n return urlObj.toString();\n } catch (err) {\n console.warn('Malformed URL:', url, err);\n return url; // Return the original URL if it cannot be parsed\n }\n};\n","import { StatsApiResponse } from './interfaces/IStats';\n\nexport const MOCK_STATS_API_PRE_GAME_RESPONSE: StatsApiResponse = {\n entities: {\n teams: {\n '9': {\n id: '9',\n uid: 's:40~l:59~t:9',\n slug: 'new-york-liberty',\n location: 'New York',\n name: 'Liberty',\n abbreviation: 'NY',\n displayName: 'New York Liberty',\n shortDisplayName: 'Liberty',\n color: '86cebc',\n alternateColor: '000000',\n logo: 'https://a.espncdn.com/i/teamlogos/wnba/500/ny.png',\n statistics: [\n {\n $key: 'fieldGoalPct',\n value: 45.8,\n displayValue: '45.8',\n displayName: 'Field Goal %',\n },\n {\n $key: 'threePointFieldGoalPct',\n value: 34.7,\n displayValue: '34.7',\n displayName: 'Three Point %',\n },\n ],\n homeAway: 'away',\n record: '11-4',\n displayOrder: 1,\n },\n '11': {\n id: '11',\n uid: 's:40~l:59~t:11',\n slug: 'phoenix-mercury',\n location: 'Phoenix',\n name: 'Mercury',\n abbreviation: 'PHX',\n displayName: 'Phoenix Mercury',\n shortDisplayName: 'Mercury',\n color: '3c286e',\n alternateColor: 'e56020',\n logo: 'https://a.espncdn.com/i/teamlogos/wnba/500/phx.png',\n statistics: [\n {\n $key: 'fieldGoalPct',\n value: 43.1,\n displayValue: '43.1',\n displayName: 'Field Goal %',\n },\n {\n $key: 'threePointFieldGoalPct',\n value: 34.8,\n displayValue: '34.8',\n displayName: 'Three Point %',\n },\n ],\n homeAway: 'home',\n record: '12-4',\n displayOrder: 2,\n },\n '14': {\n id: '14',\n uid: 's:40~l:59~t:14',\n abbreviation: 'SEA',\n displayName: 'Seattle Storm',\n logo: 'https://a.espncdn.com/i/teamlogos/wnba/500/sea.png',\n },\n '17': {\n id: '17',\n uid: 's:40~l:59~t:17',\n abbreviation: 'LV',\n displayName: 'Las Vegas Aces',\n logo: 'https://a.espncdn.com/i/teamlogos/wnba/500/lv.png',\n },\n '18': {\n id: '18',\n uid: 's:40~l:59~t:18',\n abbreviation: 'CONN',\n displayName: 'Connecticut Sun',\n logo: 'https://a.espncdn.com/i/teamlogos/wnba/500/conn.png',\n },\n '19': {\n id: '19',\n uid: 's:40~l:59~t:19',\n abbreviation: 'CHI',\n displayName: 'Chicago Sky',\n logo: 'https://a.espncdn.com/i/teamlogos/wnba/500/chi.png',\n },\n '20': {\n id: '20',\n uid: 's:40~l:59~t:20',\n abbreviation: 'ATL',\n displayName: 'Atlanta Dream',\n logo: 'https://a.espncdn.com/i/teamlogos/wnba/500/atl.png',\n },\n '129689': {\n id: '129689',\n uid: 's:40~l:59~t:129689',\n abbreviation: 'GS',\n displayName: 'Golden State Valkyries',\n logo: 'https://a.espncdn.com/i/teamlogos/wnba/500/gs.png',\n },\n '130': {\n id: '121245',\n uid: 's:20~l:28~t:12',\n abbreviation: 'KC',\n displayName: 'Kansas City Chiefs',\n shortDisplayName: 'Kansas City',\n color: 'e31837',\n alternateColor: 'ffcb05',\n logo: 'https://a.espncdn.com/i/teamlogos/nfl/500/kc.png',\n homeAway: 'home',\n },\n '164': {\n id: '11232',\n uid: 's:20~l:28~t:12',\n abbreviation: 'KC',\n displayName: 'Kansas City Chiefs',\n shortDisplayName: 'Kansas City',\n color: 'e31837',\n alternateColor: 'ffcb05',\n logo: 'https://a.espncdn.com/i/teamlogos/nfl/500/kc.png',\n homeAway: 'away',\n },\n },\n athletes: {\n '2529137': {\n id: '2529137',\n uid: 's:40~l:59~a:2529137',\n guid: 'c3d35267-fedd-d8d2-8c24-64ee7aa144ac',\n displayName: 'Natasha Cloud',\n shortName: 'N. Cloud',\n jersey: '9',\n headshot:\n 'https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2529137.jpg?w=184&h=144',\n links: [\n {\n rel: ['playercard', 'desktop', 'athlete'],\n href:\n 'https://www.espnqa.com/wnba/player/_/id/2529137/natasha-cloud',\n text: 'Player Card',\n },\n ],\n position: {\n abbreviation: 'G',\n },\n },\n '4700818': {\n id: '2529137',\n uid: 's:40~l:59~a:2529137',\n guid: 'c3d35267-fedd-d8d2-8c24-64ee7aa144ac',\n displayName: 'Natasha Cloud',\n shortName: 'N. Cloud',\n jersey: '9',\n headshot:\n 'https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2529137.jpg?w=184&h=144',\n links: [\n {\n rel: ['playercard', 'desktop', 'athlete'],\n href:\n 'https://www.espnqa.com/wnba/player/_/id/2529137/natasha-cloud',\n text: 'Player Card',\n },\n ],\n position: {\n abbreviation: 'G',\n },\n },\n '4837356': {\n id: '2529137156425',\n uid: 's:40~l:59~a:2529137',\n guid: 'c3d35267-fedd-d8d2-8c24-64ee7aa144ac',\n displayName: 'Natasha Cloud',\n shortName: 'N. Cloud',\n jersey: '9',\n headshot:\n 'https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2529137.jpg?w=184&h=144',\n links: [\n {\n rel: ['playercard', 'desktop', 'athlete'],\n href:\n 'https://www.espnqa.com/wnba/player/_/id/2529137/natasha-cloud',\n text: 'Player Card',\n },\n ],\n position: {\n abbreviation: 'G',\n },\n },\n '5037871': {\n id: '252913653447',\n uid: 's:40~l:59~a:2529137',\n guid: 'c3d35267-fedd-d8d2-8c24-64ee7aa144ac',\n displayName: 'Natasha Cloud',\n shortName: 'N. Cloud',\n jersey: '9',\n headshot:\n 'https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2529137.jpg?w=184&h=144',\n links: [\n {\n rel: ['playercard', 'desktop', 'athlete'],\n href:\n 'https://www.espnqa.com/wnba/player/_/id/2529137/natasha-cloud',\n text: 'Player Card',\n },\n ],\n position: {\n abbreviation: 'G',\n },\n },\n '4873138': {\n id: '25275349137',\n uid: 's:40~l:59~a:2529137',\n guid: 'c3d35267-fedd-d8d2-8c24-64ee7aa144ac',\n displayName: 'Natasha Cloud',\n shortName: 'N. Cloud',\n jersey: '9',\n headshot:\n 'https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2529137.jpg?w=184&h=144',\n links: [\n {\n rel: ['playercard', 'desktop', 'athlete'],\n href:\n 'https://www.espnqa.com/wnba/player/_/id/2529137/natasha-cloud',\n text: 'Player Card',\n },\n ],\n position: {\n abbreviation: 'G',\n },\n },\n '2529140': {\n id: '2529147630',\n uid: 's:40~l:59~a:2529140',\n guid: '908608e9-31d4-62f2-dfe2-9fee9024e7e2',\n displayName: 'Alyssa Thomas',\n shortName: 'A. Thomas',\n jersey: '25',\n headshot:\n 'https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2529140.jpg?w=184&h=144',\n links: [\n {\n rel: ['playercard', 'desktop', 'athlete'],\n href:\n 'https://www.espnqa.com/wnba/player/_/id/2529140/alyssa-thomas',\n text: 'Player Card',\n },\n ],\n position: {\n abbreviation: 'F',\n },\n },\n '2998928': {\n id: '29989212758',\n uid: 's:40~l:59~a:2998928',\n guid: '4d83d500-2f40-c89e-4f85-62927c5abbeb',\n displayName: 'Breanna Stewart',\n shortName: 'B. Stewart',\n jersey: '30',\n headshot:\n 'https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2998928.jpg?w=184&h=144',\n links: [\n {\n rel: ['playercard', 'desktop', 'athlete'],\n href:\n 'https://www.espnqa.com/wnba/player/_/id/2998928/breanna-stewart',\n text: 'Player Card',\n },\n ],\n position: {\n abbreviation: 'F',\n },\n },\n '2999101': {\n id: '2999112756501',\n uid: 's:40~l:59~a:2999101',\n guid: 'd5154a93-4a46-71af-8b55-f69328b84b54',\n displayName: 'Jonquel Jones',\n shortName: 'J. Jones',\n jersey: '35',\n headshot:\n 'https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/2999101.jpg?w=184&h=144',\n links: [\n {\n rel: ['playercard', 'desktop', 'athlete'],\n href:\n 'https://www.espnqa.com/wnba/player/_/id/2999101/jonquel-jones',\n text: 'Player Card',\n },\n ],\n position: {\n abbreviation: 'C',\n },\n },\n '4281929': {\n id: '428191234729',\n uid: 's:40~l:59~a:4281929',\n guid: 'd4c403bb-a2c8-ed6b-aeaa-c290d8afea9b',\n displayName: 'Satou Sabally',\n shortName: 'S. Sabally',\n jersey: '0',\n headshot:\n 'https://stitcher.espn.com/ctv/sports/basketball/leagues/wnba/athletes/4281929.jpg?w=184&h=144',\n links: [\n {\n rel: ['playercard', 'desktop', 'athlete'],\n href:\n 'https://www.espnqa.com/wnba/player/_/id/4281929/satou-sabally',\n text: 'Player Card',\n },\n ],\n position: {\n abbreviation: 'F',\n },\n },\n },\n },\n leaders: [\n {\n displayName: 'Points',\n name: 'pointsPerGame',\n home: {\n team: {\n $key: '11',\n },\n athlete: {\n $key: '4281929',\n statistics: [\n {\n displayValue: '19.1',\n abbreviation: 'PTS',\n },\n {\n displayValue: '39.3',\n abbreviation: 'FG%',\n },\n {\n displayValue: '81.9',\n abbreviation: 'FT%',\n },\n ],\n },\n },\n away: {\n team: {\n $key: '9',\n },\n athlete: {\n $key: '2998928',\n statistics: [\n {\n displayValue: '20.7',\n abbreviation: 'PTS',\n },\n {\n displayValue: '52.0',\n abbreviation: 'FG%',\n },\n {\n displayValue: '81.6',\n abbreviation: 'FT%',\n },\n ],\n },\n },\n },\n {\n displayName: 'Assists',\n name: 'assistsPerGame',\n home: {\n team: {\n $key: '11',\n },\n athlete: {\n $key: '2529140',\n statistics: [\n {\n displayValue: '9.3',\n abbreviation: 'AST',\n },\n {\n displayValue: '3.2',\n abbreviation: 'TO',\n },\n {\n displayValue: '30.3',\n abbreviation: 'MIN',\n },\n ],\n },\n },\n away: {\n team: {\n $key: '9',\n },\n athlete: {\n $key: '2529137',\n statistics: [\n {\n displayValue: '6.5',\n abbreviation: 'AST',\n },\n {\n displayValue: '2.1',\n abbreviation: 'TO',\n },\n {\n displayValue: '28.3',\n abbreviation: 'MIN',\n },\n ],\n },\n },\n },\n {\n displayName: 'Rebounds',\n name: 'reboundsPerGame',\n home: {\n team: {\n $key: '11',\n },\n athlete: {\n $key: '4281929',\n statistics: [\n {\n displayValue: '8.0',\n abbreviation: 'REB',\n },\n {\n displayValue: '6.5',\n abbreviation: 'DR',\n },\n {\n displayValue: '1.5',\n abbreviation: 'OR',\n },\n ],\n },\n },\n away: {\n team: {\n $key: '9',\n },\n athlete: {\n $key: '2999101',\n statistics: [\n {\n displayValue: '9.6',\n abbreviation: 'REB',\n },\n {\n displayValue: '7.7',\n abbreviation: 'DR',\n },\n {\n displayValue: '1.9',\n abbreviation: 'OR',\n },\n ],\n },\n },\n },\n ],\n header: {\n teams: [\n {\n $key: '11',\n linescores: [\n {\n displayValue: '28',\n },\n {\n displayValue: '33',\n },\n {\n displayValue: '27',\n },\n {\n displayValue: '18',\n },\n {\n displayValue: '106',\n },\n ],\n },\n {\n $key: '9',\n linescores: [\n {\n displayValue: '19',\n },\n {\n displayValue: '24',\n },\n {\n displayValue: '27',\n },\n {\n displayValue: '21',\n },\n {\n displayValue: '91',\n },\n ],\n },\n ],\n linescoresHeader: ['1', '2', '3', '4', 'T'],\n },\n predictor: {\n header: 'Matchup Predictor',\n imageUrl: 'https://platform.espnqa.com/lrd/matchuppredictor/401736212',\n homeTeam: {\n team: {\n $key: '11',\n },\n gameProjection: '31.8',\n },\n awayTeam: {\n team: {\n $key: '9',\n },\n gameProjection: '68.2',\n },\n },\n winProbability: {\n imageUrl:\n 'https://platform.espnqa.com/lrd/winprobability/401736212/401736212576',\n homeTeam: {\n team: {\n $key: '11',\n },\n winPercentage: '100',\n },\n awayTeam: {\n team: {\n $key: '9',\n },\n winPercentage: '0',\n },\n },\n previousGames: [\n {\n displayOrder: 2,\n team: {\n $key: '11',\n },\n events: [\n {\n team: {\n $key: '17',\n homeAway: 'home',\n },\n score: '76-70',\n gameResult: 'W',\n },\n {\n team: {\n $key: '18',\n homeAway: 'home',\n },\n score: '83-75',\n gameResult: 'W',\n },\n {\n team: {\n $key: '9',\n homeAway: 'home',\n },\n score: '89-81',\n gameResult: 'W',\n },\n {\n team: {\n $key: '19',\n homeAway: 'home',\n },\n score: '107-86',\n gameResult: 'W',\n },\n {\n team: {\n $key: '9',\n homeAway: 'away',\n },\n score: '106-91',\n gameResult: 'W',\n },\n ],\n },\n {\n displayOrder: 1,\n team: {\n $key: '9',\n },\n events: [\n {\n team: {\n $key: '20',\n homeAway: 'away',\n },\n score: '86-81',\n gameResult: 'W',\n },\n {\n team: {\n $key: '11',\n homeAway: 'away',\n },\n score: '89-81',\n gameResult: 'L',\n },\n {\n team: {\n $key: '14',\n homeAway: 'home',\n },\n score: '89-79',\n gameResult: 'L',\n },\n {\n team: {\n $key: '129689',\n homeAway: 'home',\n },\n score: '81-78',\n gameResult: 'W',\n },\n {\n team: {\n $key: '11',\n homeAway: 'home',\n },\n score: '106-91',\n gameResult: 'L',\n },\n ],\n },\n ],\n gameState: 'in',\n promotion: {\n title: 'Serving Sports Fans. Anytime.',\n description: 'Open the ESPN app on a mobile device to checkout more stats!',\n logo:\n 'https://www.espn.com/redesign/assets/img/ictv/logo_qr/1x/logo_qr_espn.png',\n qrCode:\n 'https://stitcher.espn.com/qr-code/.png?url=sportscenter%3A%2F%2Fx-callback-url%2FshowGame%3FsportName%3Dbasketball%26leagueAbbrev%3Dwnba%26gameId%3D401736212&width=200&height=200',\n backgroundImage:\n 'https://www.espn.com/redesign/assets/img/ictv/bkg_qr_espn.jpg',\n },\n activeAthletes: {\n displayText: 'Active Athletes',\n teams: [\n {\n team: {\n $key: '130',\n },\n athletes: [\n {\n $key: '4700818',\n statLine: '16.6 PTS, 5.2 REB',\n },\n {\n $key: '4837356',\n statLine: '4.1 AST, 2.2 TO',\n },\n ],\n },\n {\n team: {\n $key: '164',\n },\n athletes: [\n {\n $key: '5037871',\n statLine: '19.4 PTS, 4.0 AST',\n },\n {\n $key: '4873138',\n statLine: '7.2 REB, 2.1 OR',\n },\n ],\n },\n ],\n },\n drives: [\n {\n id: 'drive-1',\n team: {\n $key: '9',\n },\n description: '4 PLAYS, 41 YARDS, 2:15',\n plays: [\n {\n id: 'play-1',\n clock: {\n displayValue: '8:21',\n },\n period: {\n number: 1,\n },\n type: {\n text: 'Shotgun',\n },\n text: 'I.Pacheco left tackle to PHI 20 for 24 yards (M.Epps).',\n start: {\n downDistanceText: '2nd & 5 at PHI 44',\n },\n },\n {\n id: 'play-2',\n clock: {\n displayValue: '9:33',\n },\n period: {\n number: 1,\n },\n type: {\n text: 'Shotgun',\n },\n text:\n 'P.Mahomes pass short middle to T.Kelce to KC 48 for 20 yards (T.Edwards).',\n start: {\n downDistanceText: '1st & 10 @ KC 25',\n },\n },\n {\n id: 'play-3',\n clock: {\n displayValue: '10:09',\n },\n period: {\n number: 1,\n },\n type: {\n text: 'Shotgun',\n },\n text: 'I.Pacheco up the middle to KC 28 for 3 yards (J.Hargrave).',\n start: {\n downDistanceText: '1st & 10 @ KC 25',\n },\n },\n {\n id: 'play-4',\n clock: {\n displayValue: '11:15',\n },\n period: {\n number: 1,\n },\n type: {\n text: 'Shotgun',\n },\n text:\n 'P.Mahomes pass complete short right to T.Kelce to KC 35 for 10 yards (J.Bradberry).',\n start: {\n downDistanceText: '2nd & 10 at KC 25',\n },\n },\n ],\n },\n ],\n meta: {\n gp_topic: 'gp-basketball-wnba-401736212',\n picker_topic: 'picker-basketball-wnba',\n gameState: 'in',\n },\n};\n","export interface TeamStatistic {\n $key: string;\n value: number;\n displayValue: string;\n displayName: string;\n}\n\nexport const isTeamStatistic = (data: any): data is TeamStatistic => {\n return (\n data &&\n typeof data === 'object' &&\n '$key' in data &&\n 'value' in data &&\n 'displayValue' in data &&\n 'displayName' in data\n );\n};\n\nexport const isTabbedStatistics = (data: any): data is TeamTabbedStatistics => {\n return (\n data &&\n typeof data === 'object' &&\n 'stats' in data &&\n Array.isArray(data.stats)\n );\n};\n\nexport const isTabbedStatisticsArray = (\n data: any\n): data is TeamTabbedStatistics[] => {\n return Array.isArray(data) && data.every((item) => isTabbedStatistics(item));\n};\n\nexport const isHockeyScoringSummary = (\n data: any\n): data is RawScoringSummary => {\n return (\n data &&\n typeof data === 'object' &&\n 'title' in data &&\n 'sections' in data &&\n data.sections &&\n Array.isArray(data.sections) &&\n data.sections.every(\n (section: any) =>\n section &&\n 'title' in section &&\n 'items' in section &&\n Array.isArray(section.items) &&\n section.items.every(\n (item: any) =>\n item &&\n 'clock' in item &&\n 'title' in item &&\n 'team' in item &&\n 'athlete' in item\n )\n )\n );\n};\n\nexport const isMlbScoringSummary = (data: any): data is RawScoringSummary => {\n return (\n data &&\n typeof data === 'object' &&\n 'title' in data &&\n 'sections' in data &&\n data.sections &&\n Array.isArray(data.sections) &&\n data.sections.some(\n (section: any) =>\n section &&\n 'items' in section &&\n Array.isArray(section.items) &&\n section.items.some(\n (item: any) =>\n item && ('text' in item || 'shortText' in item || 'header' in item)\n )\n )\n );\n};\n\nexport interface TeamTabbedStatistics {\n $key?: string;\n stats?: {\n abbreviation?: string;\n displayName?: string;\n displayValue?: string;\n name?: string;\n }[];\n}\n\nexport interface Team {\n id: string;\n uid: string;\n slug?: string;\n location?: string;\n name?: string;\n abbreviation: string;\n displayName: string;\n shortDisplayName?: string;\n color?: string;\n alternateColor?: string;\n logo?: string;\n statistics?: TeamStatistic[] | TeamTabbedStatistics[];\n homeAway?: string;\n record?: string;\n displayOrder?: number;\n}\n\ninterface AthleteLink {\n rel: string[];\n href: string;\n text: string;\n}\n\ninterface AthletePosition {\n name?: string;\n displayName?: string;\n abbreviation: string;\n}\n\nexport interface Athlete {\n id: string;\n uid: string;\n guid: string;\n displayName: string;\n shortName: string;\n jersey: string;\n headshot?: string;\n links?: AthleteLink[];\n position?: AthletePosition;\n statistics?: {\n $key: string;\n value?: number;\n displayValue: string;\n }[];\n}\n\nexport interface EntityMap<T> {\n [id: string]: T;\n}\n\nexport interface LeaderStatistic {\n displayValue: string;\n abbreviation: string;\n}\n\ninterface LeaderAthlete {\n $key: string;\n statistics?: LeaderStatistic[];\n}\n\ninterface LeaderTeam {\n team: {\n $key: string;\n };\n athlete: LeaderAthlete;\n}\n\nexport interface Leader {\n displayName: string;\n name: string;\n home?: LeaderTeam;\n away?: LeaderTeam;\n}\n\ninterface LineScore {\n displayValue: string;\n}\n\ninterface HeaderTeam {\n $key: string;\n score?: string;\n linescores?: LineScore[];\n}\n\nexport interface Header {\n teams: HeaderTeam[];\n linescoresHeader?: string[];\n}\n\ninterface TeamHeaderTeam {\n $key: string;\n details?: string[];\n linescores?: LineScore[];\n}\n\nexport interface TeamHeader {\n teams: TeamHeaderTeam[];\n linescoresHeader?: string[];\n style?: {\n linescores?: {\n rowHeader?: string;\n };\n };\n}\n\nexport interface PredictorTeam {\n team: {\n $key: string;\n };\n gameProjection: string;\n teamChanceLoss?: string;\n}\n\nexport interface Predictor {\n header: string;\n imageUrl: string;\n homeTeam: PredictorTeam;\n awayTeam: PredictorTeam;\n}\n\nexport interface WinProbabilityTeam {\n team: {\n $key: string;\n };\n winPercentage: string;\n}\n\nexport interface WinProbability {\n imageUrl: string;\n homeTeam: WinProbabilityTeam;\n awayTeam: WinProbabilityTeam;\n}\n\ninterface ActiveAthletesTeam {\n team: {\n $key: string;\n };\n athletes: {\n $key: string;\n statLine: string;\n }[];\n}\n\nexport interface ActiveAthletes {\n displayText: string;\n teams: ActiveAthletesTeam[];\n}\n\nexport interface Meta {\n gp_topic: string;\n picker_topic: string;\n lastUpdatedAt?: string;\n firstPlayWallClock?: string;\n lastPlayWallClock?: string;\n gameState: string;\n syncUrl?: string;\n}\n\nexport interface StatsPromotion {\n backgroundImage?: string;\n description?: string;\n logoPng?: string;\n logo?: string;\n qrCode?: string;\n title?: string;\n}\n\n// Drive Summary interfaces\nexport interface DrivePlay {\n id: string;\n clock: {\n displayValue: string;\n };\n period: {\n number: number;\n };\n type: {\n text: string;\n };\n text: string;\n start: {\n downDistanceText: string;\n };\n}\n\nexport interface Drive {\n id: string;\n team: {\n $key: string;\n };\n description: string;\n plays: DrivePlay[];\n}\n\nexport interface StatsTeam {\n title?: string;\n teams?: {\n $key?: string;\n }[];\n sections?: {\n $key?: string;\n title?: string;\n }[];\n}\n\n// Player Stats interfaces (Pre-Game Season Stats)\nexport interface PlayerStatsAthleteStatistic {\n displayValue?: string;\n label?: string;\n featured?: boolean;\n}\n\nexport interface PlayerStatsAthlete {\n $key?: string;\n statistics?: PlayerStatsAthleteStatistic[];\n}\n\nexport interface PlayerStatsAthleteStatus {\n displayName?: string;\n type?: string;\n}\n\nexport interface PlayerStatsItem {\n title?: string;\n athlete?: PlayerStatsAthlete;\n status?: PlayerStatsAthleteStatus;\n}\n\nexport interface PlayerStatsSection {\n title?: string;\n items?: PlayerStatsItem[];\n}\n\nexport interface PlayerStatsTeam {\n $key?: string;\n sections?: PlayerStatsSection[];\n}\n\nexport interface PlayerStats {\n teams?: PlayerStatsTeam[];\n}\n\nexport interface CareerMatchupStatistic {\n displayValue?: string;\n abbreviation?: string;\n}\n\ntype TextLike =\n | string\n | {\n type?: string;\n displayName?: string;\n };\n\nexport interface CareerMatchupItem {\n status?: TextLike;\n type?: TextLike;\n displayName?: TextLike;\n athlete?: {\n $key?: string;\n };\n}\n\nexport interface CareerMatchupSection {\n items?: CareerMatchupItem[];\n statistics?: CareerMatchupStatistic[];\n}\n\nexport interface CareerMatchup {\n title?: string;\n sections?: CareerMatchupSection[];\n}\n\n// Scoring Summary interfaces - raw API response types\n// These interfaces represent the API response format before transformation\nexport interface RawScoringSummaryItem {\n team?: {\n $key?: string;\n };\n athlete?: {\n $key?: string;\n };\n clock?: string;\n title?: string;\n description?: string;\n header?: {\n title?: string;\n featured?: boolean;\n }[];\n text?: string;\n shortText?: string;\n}\n\nexport interface RawScoringSummarySection {\n title?: string;\n items?: RawScoringSummaryItem[];\n}\n\nexport interface RawScoringSummary {\n title?: string;\n sections?: RawScoringSummarySection[];\n}\n\nexport interface StatsApiResponse {\n entities: {\n teams: EntityMap<Team>;\n athletes?: EntityMap<Athlete>;\n };\n leaders?: Leader[];\n header?: Header;\n teamHeader?: TeamHeader;\n predictor?: Predictor;\n winProbability?: WinProbability;\n gameState: string;\n activeAthletes?: ActiveAthletes;\n meta: Meta;\n promotion?: StatsPromotion;\n drives?: Drive[];\n statTeams?: StatsTeam;\n previousGames?: {\n displayOrder: number;\n team: {\n $key: string;\n };\n events: {\n team: {\n $key: string;\n homeAway: string;\n };\n score: string;\n gameResult: string;\n }[];\n }[];\n scoringSummary?: RawScoringSummary;\n penaltySummary?: {\n title: string;\n sections: {\n title: string;\n items: {\n team: {\n $key: string;\n };\n athlete: {\n $key: string;\n };\n clock: string;\n title: string;\n description: string;\n }[];\n }[];\n };\n playerStats?: PlayerStats;\n careerMatchup?: CareerMatchup;\n}\n","import NetworkManager, {\n HttpMethod,\n} from '../../../../services/NetworkManager/NetworkManager';\nimport { StatsApiResponse } from '../interfaces/IStats';\nimport IMaestroEventDelegate from '@/interfaces/IMaestroEventDelegate';\nimport SDK from '../../../..';\nimport { captureException } from '@/sentry';\n\n/**\n * Service for handling stats-related API calls\n */\nclass StatsService {\n public networkManager: NetworkManager;\n public overrideUrl: string | null = null;\n\n constructor(delegate: IMaestroEventDelegate) {\n this.networkManager = new NetworkManager({\n externalBaseURL: delegate.getStatsAPIBaseURL(),\n });\n }\n\n /**\n * Get stats using a full sync URL (for timecode support)\n *\n * @param timeCode - The timecode in milliseconds, or null for 'latest'\n * @returns Promise with the stats data\n */\n async getStatsByUrl(timeCode: number | null): Promise<StatsApiResponse> {\n return this.networkManager.externalApiRequest({\n endpoint: this.getSyncEndpoint(timeCode),\n method: HttpMethod.GET,\n params: {},\n headers: {},\n });\n }\n\n /**\n * Start polling using a full sync URL (for timecode support)\n *\n * @param timeCode - The timecode in milliseconds, or null for 'latest'\n * @param interval - The polling interval in milliseconds\n * @param onData - Callback for successful data fetch\n * @param onError - Callback for errors\n * @returns Object with a stop function to stop polling\n */\n pollStatsByUrl(\n timeCode: number | null,\n interval: number,\n onData: (data: StatsApiResponse) => void,\n onError?: (error: Error) => void\n ): { stop: () => void } {\n return this.networkManager.pollExternalApiRequest({\n endpoint: this.getSyncEndpoint(timeCode),\n interval,\n method: HttpMethod.GET,\n params: {},\n headers: {},\n onData,\n onError,\n });\n }\n\n /**\n * Build sync URL for timecode-based stats fetching\n * @param timeCode - The timecode in milliseconds, or null for 'latest'\n * @returns Complete sync URL for the fauxcast stats endpoint\n */\n private getSyncEndpoint(timeCode: number | null): string {\n if (this.overrideUrl) {\n console.log('[StatsService] Using overrideUrl:', this.overrideUrl);\n return this.overrideUrl;\n }\n\n const { leagueId, mainId } = this.getIdsFromPageConfig();\n const formattedTimeCode = this.formatTimeCodeForAPI(timeCode);\n\n return `/${leagueId}/${mainId}/en/us/${formattedTimeCode}`;\n }\n\n /**\n * Extract event, league, and main IDs from page config metadata\n * @returns Object containing eventId, leagueId, and mainId\n */\n private getIdsFromPageConfig(): {\n eventId: string;\n leagueId: string;\n mainId: string;\n } {\n const pageConfig = SDK.getPageConfig();\n if (!pageConfig) {\n throw new Error('Page config is null or undefined');\n }\n\n const metadata = pageConfig.page.metadata;\n const eventId = metadata?.external_field_1;\n const leagueField = metadata?.external_field_5;\n\n if (!eventId || !leagueField) {\n const availableFields = Object.keys(metadata || {}).join(', ');\n throw new Error(\n 'Missing eventId or leagueId in page config metadata. Cannot build sync URL. ' +\n `Required fields: external_field_1 (eventId), external_field_5 (leagueId). ` +\n `Available fields: ${availableFields}`\n );\n }\n\n const { leagueId, fauxcastId } = this.parseLeagueData(leagueField);\n const mainId = fauxcastId || eventId;\n\n if (!mainId.trim() || !leagueId.trim()) {\n throw new Error(\n 'MainId or leagueId is empty string in page config metadata'\n );\n }\n\n return { eventId, leagueId, mainId };\n }\n\n /**\n * Parse league data from external_field_5 JSON string\n * @param leagueField - JSON string containing leagueId and optional fauxcastId\n * @returns Parsed league data\n */\n private parseLeagueData(\n leagueField: string\n ): {\n leagueId: string;\n fauxcastId?: string;\n } {\n try {\n const parsed = JSON.parse(leagueField);\n\n if (!parsed.leagueId) {\n throw new Error('leagueId not found in parsed JSON');\n }\n\n return { leagueId: parsed.leagueId, fauxcastId: parsed.fauxcastId };\n } catch (parseError) {\n const error = new Error(\n `Failed to parse leagueId from external_field_5. Raw value: ${leagueField}`\n );\n captureException(error, { rawValue: leagueField, parseError });\n throw error;\n }\n }\n\n /**\n * Format timecode for API consumption\n * @param timeCode - Timecode in milliseconds or null\n * @returns ISO date string, \"pre.json\" for pre-game, or \"latest\" for post-game\n */\n private formatTimeCodeForAPI(timeCode: number | null): string {\n if (!timeCode || timeCode === 0) {\n return 'latest';\n }\n\n if (\n typeof timeCode !== 'number' ||\n isNaN(timeCode) ||\n !isFinite(timeCode)\n ) {\n console.warn('Invalid timecode provided, using \"latest\":', timeCode);\n return 'latest';\n }\n\n try {\n const date = new Date(timeCode);\n\n if (isNaN(date.getTime())) {\n console.warn('Invalid date from timecode, using \"latest\":', timeCode);\n return 'latest';\n }\n\n // For future timecodes, use \"latest\" since we can't fetch future data\n const now = Date.now();\n const timeDiff = now - timeCode;\n if (timeDiff < 0) {\n return 'latest';\n }\n\n // Return ISO date string without milliseconds to match API format\n const isoString = date.toISOString().replace(/\\.\\d{3}Z$/, 'Z');\n return isoString;\n } catch (error) {\n captureException(error as Error, { timeCode });\n console.warn(\n 'Error formatting timecode, using \"latest\":',\n timeCode,\n error\n );\n return 'latest';\n }\n }\n}\n\nexport default StatsService;\n","import { DrivePlay } from '../interfaces/IStats';\n\n/**\n * Get ordinal suffix for a number (1st, 2nd, 3rd, 4th, etc.)\n */\nexport const getOrdinalSuffix = (number: number): string => {\n const lastTwoDigits = number % 100;\n if (lastTwoDigits >= 11 && lastTwoDigits <= 13) {\n return 'th';\n }\n\n const lastDigit = number % 10;\n switch (lastDigit) {\n case 1:\n return 'st';\n case 2:\n return 'nd';\n case 3:\n return 'rd';\n default:\n return 'th';\n }\n};\n\n/**\n * Parse drive description to get individual components\n * Format: \"11 PLAYS, 61 YARDS, 5:43\"\n */\nexport const parseDriveDescription = (description: string) => {\n if (!description) {\n return {\n plays: '0',\n yards: '0',\n time: '',\n };\n }\n\n const parts = description.split(', ');\n\n const plays = parts[0]?.split(' ')[0] || '0';\n const yards = parts[1]?.split(' ')[0] || '0';\n const time = parts[2] || '';\n\n return { plays, yards, time };\n};\n\n/**\n * Format the marquee text for the last play\n */\nexport const formatLastPlayMarquee = (lastPlay: DrivePlay): string => {\n if (!lastPlay?.period?.number) {\n return '';\n }\n const ordinalSuffix = getOrdinalSuffix(lastPlay.period.number);\n return `(${lastPlay.clock.displayValue} - ${lastPlay.period.number}${ordinalSuffix}) (${lastPlay.type.text}) ${lastPlay.text}`;\n};\n","import { Observable } from '../../../../helpers/Observable';\nimport { ViewModel } from '../../../../view-models/ViewModel';\nimport { MOCK_STATS_API_PRE_GAME_RESPONSE } from '../mocks';\nimport {\n Athlete,\n CareerMatchupStatistic,\n DrivePlay,\n isTabbedStatisticsArray,\n isTeamStatistic,\n isHockeyScoringSummary,\n isMlbScoringSummary,\n RawScoringSummary,\n StatsApiResponse,\n Team,\n TeamStatistic,\n} from '../interfaces/IStats';\nimport { AthletesStatisticsItem } from '../view/components/AthletesStatistics/AthletesStatistics';\nimport StatsService from '../services/StatsService';\nimport IMaestroEventDelegate from '@/interfaces/IMaestroEventDelegate';\n\nimport {\n formatLastPlayMarquee,\n parseDriveDescription,\n} from '../utils/driveSummaryUtils';\nimport AnalyticsService from '@/services/AnalyticsService/AnalyticsService';\nimport { setImageDimensions } from '@/helpers/url';\nimport SDK from '@/index';\nimport { captureException } from '@/sentry';\nimport { stringHashCode } from '@/helpers/strings';\n\nconst STATS_ERROR_STATE = {\n NONE: 'none',\n TAB_LOAD_FAILURE: 'tabLoadFailure',\n} as const;\nexport type StatsErrorState = typeof STATS_ERROR_STATE[keyof typeof STATS_ERROR_STATE];\n\ninterface TimecodePollingState {\n isActive: boolean;\n currentUrl: string | null;\n lastUpdateTime: number;\n}\n\n// Constants for configuration\nconst DEFAULT_POLLING_INTERVAL = 10000; // 10 seconds\nconst SMART_POLLING_DELAY = 1000; // 1 second delay after smart polling immediate call\n\ntype GetTeamInfoResponse = {\n awayTeam: {\n index: number;\n id: string;\n logo?: string;\n name: string;\n };\n homeTeam: {\n index: number;\n id: string;\n logo?: string;\n name: string;\n };\n};\n\nexport type HeaderTeamStatItem = {\n type: 'headerTeam';\n isLive: boolean;\n linescoresHeader: string[];\n linescoresRowHeader?: 'teamLogo' | 'teamName';\n statistics?: {\n displayName: string;\n homeTeamValue: number;\n awayTeamValue: number;\n awayTeamDisplayValue: string;\n homeTeamDisplayValue: string;\n }[];\n homeTeam: Pick<\n Team,\n 'color' | 'id' | 'logo' | 'name' | 'abbreviation' | 'record'\n > & {\n linescores: string[];\n details?: string[];\n };\n awayTeam: Pick<\n Team,\n 'color' | 'id' | 'logo' | 'name' | 'abbreviation' | 'record'\n > & {\n linescores: string[];\n details?: string[];\n };\n};\n\ntype HeaderLikeTeam = {\n $key: string;\n score?: string;\n linescores?: { displayValue: string }[];\n details?: string[];\n};\n\ntype RecentGamesPreviousGame = {\n score: string;\n gameResult: string;\n teamLogo?: string;\n homeAway: string;\n};\n\ntype RecentGamesTeam = {\n logo?: string;\n name?: string;\n events: RecentGamesPreviousGame[];\n};\n\nexport type RecentGamesStatsItem = {\n type: 'recentGames';\n awayTeam: RecentGamesTeam;\n homeTeam: RecentGamesTeam;\n};\n\nexport type WinProbabilityStatsItem = {\n type: 'winProbability';\n chartImageUrl: string;\n awayTeam: Pick<Team, 'id' | 'abbreviation' | 'logo'> & {\n winPercentage: string;\n };\n homeTeam: Pick<Team, 'id' | 'abbreviation' | 'logo'> & {\n winPercentage: string;\n };\n};\n\nexport type GameLeadersStatsItem = {\n type: 'gameLeaders';\n displayText: string;\n items: AthletesStatisticsItem[];\n};\n\nexport type ActiveAthletesItem = {\n type: 'activeAthletes';\n displayText: string;\n awayTeam: Pick<Team, 'id' | 'logo' | 'name'>;\n homeTeam: Pick<Team, 'id' | 'logo' | 'name'>;\n athletes: AthletesStatisticsItem[];\n};\n\nexport type StatsPromotionItem = {\n type: 'promotion';\n title: string;\n description: string;\n logo: string;\n qrCode: string;\n backgroundImage: string;\n};\n\nexport type StatsMatchPredictorItem = {\n type: 'matchPredictor';\n header: string;\n imageUrl: string;\n awayTeam: Pick<Team, 'abbreviation' | 'logo' | 'displayName'> & {\n percentage: number;\n };\n homeTeam: Pick<Team, 'abbreviation' | 'logo' | 'displayName'> & {\n percentage: number;\n };\n};\n\nexport type TeamStatsStatistics = {\n displayName: string;\n awayTeamDisplayValue: string;\n homeTeamDisplayValue: string;\n awayTeamValue: number;\n homeTeamValue: number;\n};\n\nexport type TeamStatsItem = {\n type: 'teamStats';\n awayTeam: Pick<Team, 'logo' | 'displayName' | 'color' | 'abbreviation'>;\n homeTeam: Pick<Team, 'logo' | 'displayName' | 'color' | 'abbreviation'>;\n statistics?: TeamStatsStatistics[];\n tabbedStatistics?: Record<\n string,\n {\n title: string;\n entries: TeamStatsStatistics[];\n }\n >;\n title: string;\n};\n\nexport type DriveSummaryItem = {\n type: 'driveSummary';\n id: string;\n team: Pick<Team, 'logo' | 'displayName'>;\n playsQuantity: string;\n yards: string;\n time: string;\n lastPlayMarquee: string;\n plays: DrivePlay[];\n};\n\nexport type IScoreItem = {\n teamLogo?: string;\n teamName?: string;\n athletePosition?: string;\n athleteNumber?: string;\n athleteName?: string;\n athleteAssists?: string;\n athleteThumbnail?: string;\n description: string;\n clock: string;\n};\n\nexport type IScoreSection = {\n title: string;\n scores: IScoreItem[];\n};\n\nexport type ScoringSummarySectionTeam = {\n teamLogo: string;\n teamName: string;\n header: Array<{ featured: boolean; title: string }>;\n text: string;\n shortText: Array<{ featured: boolean; title: string }>;\n headshot?: string;\n athleteShortName?: string;\n athletePosition?: string;\n athleteJersey?: string;\n};\n\nexport type ScoringSummarySection = {\n title: string;\n items: ScoringSummarySectionTeam[];\n};\n\nexport type ScoringSummaryItem = {\n type: 'scoringSummary';\n tag: string;\n title: string;\n sections: ScoringSummarySection[];\n};\n\nexport type PenaltiesItem = {\n type: 'penalties';\n tag: string;\n title: string;\n sections: ScoringSummarySection[];\n};\n\nexport type PlayerSeasonStatsPlayerItem = {\n title: string;\n headshot: string;\n position: string;\n jersey: string;\n featuredStat: { displayValue: string; label: string } | null;\n statistics: Array<{ displayValue: string; label: string }>;\n playerStatus: { displayName: string; type: string } | null;\n};\n\nexport type PlayerSeasonStatsSection = {\n title: string;\n items: PlayerSeasonStatsPlayerItem[];\n};\n\nexport type PlayerSeasonStatsTeam = {\n teamKey: string;\n shortDisplayName: string;\n color: string;\n sections: PlayerSeasonStatsSection[];\n};\n\nexport type PlayerSeasonStatsItem = {\n type: 'playerSeasonStats';\n teams: PlayerSeasonStatsTeam[];\n};\n\nexport interface CareerMatchupViewItem {\n status?: string; // e.g. \"On Deck\"\n isHighlighted?: boolean; // True if status usually indicates warning/attention like \"On Deck\"\n type: string; // e.g. \"batter\" or \"pitcher\"\n displayName: string; // e.g. \"At-Bat\"\n athlete?: Athlete;\n}\n\nexport interface CareerMatchupViewSection {\n items: CareerMatchupViewItem[];\n statistics: CareerMatchupStatistic[];\n}\n\nexport type CareerMatchupStatsItem = {\n type: 'careerMatchup';\n title: string;\n sections: CareerMatchupViewSection[];\n};\n\nexport type StatsItem =\n | HeaderTeamStatItem\n | RecentGamesStatsItem\n | WinProbabilityStatsItem\n | GameLeadersStatsItem\n | ActiveAthletesItem\n | StatsPromotionItem\n | StatsMatchPredictorItem\n | TeamStatsItem\n | DriveSummaryItem\n | ScoringSummaryItem\n | PenaltiesItem\n | PlayerSeasonStatsItem\n | CareerMatchupStatsItem;\n\n// The interval for polling stats data (in milliseconds)\nconst STATS_ITEM_TYPE_CARD_MAP: Record<\n StatsItem['type'],\n keyof StatsApiResponse\n> = {\n activeAthletes: 'activeAthletes',\n driveSummary: 'drives',\n gameLeaders: 'leaders',\n headerTeam: 'header',\n matchPredictor: 'predictor',\n playerSeasonStats: 'playerStats',\n promotion: 'promotion',\n recentGames: 'previousGames',\n scoringSummary: 'scoringSummary',\n teamStats: 'entities',\n winProbability: 'winProbability',\n careerMatchup: 'careerMatchup',\n penalties: 'penaltySummary',\n};\n\nexport class StatsViewModel extends ViewModel {\n isDataLoading = new Observable<boolean>(true);\n hasEverSuccessfullyLoaded = new Observable<boolean>(false);\n eventId: string;\n statsItems = new Observable<StatsItem[]>([]);\n errorState = new Observable<StatsErrorState>('none');\n currentGameState = new Observable<string>('');\n statsService: StatsService;\n analyticsService: AnalyticsService;\n\n // Properties\n private useMockData: boolean = false;\n private lastResponseHash: number | null = null;\n\n // Enhanced timecode-related properties\n private currentPlayerTimeCode: number | null = null;\n private timecodePollingTask: { stop: () => void } | null = null;\n private smartPollingTimeout: number | null = null;\n private timecodePollingState: TimecodePollingState = {\n isActive: false,\n currentUrl: null,\n lastUpdateTime: 0,\n };\n\n constructor(\n eventId: string,\n delegate: IMaestroEventDelegate,\n analyticsService: AnalyticsService,\n options: {\n useMockData?: boolean;\n } = {}\n ) {\n super();\n this.eventId = eventId;\n this.useMockData = options.useMockData || false;\n this.statsService = new StatsService(delegate);\n this.analyticsService = analyticsService;\n }\n\n /**\n * Sets panel-specific data configuration\n * @param panelData - Object containing panel configuration\n */\n setDataToPanel(panelData: Record<string, any>): void {\n if ('overrideUrl' in panelData) {\n const overrideUrl = panelData.overrideUrl;\n if (typeof overrideUrl === 'string' && overrideUrl.length > 0) {\n console.log('[StatsViewModel] Setting overrideUrl:', overrideUrl);\n this.statsService.overrideUrl = overrideUrl;\n }\n }\n }\n\n /**\n * Initialize the ViewModel and start data fetching\n */\n async init(): Promise<void> {\n if (this.useMockData) {\n await this.fetchMockData();\n } else {\n // Get the current timecode from MaestroEventViewModel instead of defaulting to null\n // This ensures we don't override the current timecode when switching tabs\n const currentTimeCode = this.getCurrentTimeCode();\n this.onUpdatePlayerTimeCode(currentTimeCode);\n this.analyticsService.panelView('espnStats');\n }\n }\n\n /**\n * Get the current timecode from the MaestroEventViewModel\n * This prevents the stats panel from always defaulting to real-time data\n */\n private getCurrentTimeCode(): number | null {\n try {\n // Access the MaestroEventViewModel through the imported SDK to get current timecode\n const maestroEventViewModel = SDK.getMaestroEventViewModel();\n if (\n maestroEventViewModel &&\n typeof maestroEventViewModel.getPlayerTimeCode === 'function'\n ) {\n return maestroEventViewModel.getPlayerTimeCode();\n }\n } catch (error) {\n captureException(error, {\n context: 'StatsViewModel.getCurrentTimeCode',\n });\n\n console.warn(\n 'Could not get current timecode from MaestroEventViewModel:',\n error\n );\n }\n\n // Fallback to null (real-time) if we can't get the current timecode\n return null;\n }\n\n onEngage = (type: StatsItem['type']): void => {\n this.analyticsService.panelClick({\n type: 'espnStats',\n name: 'stats_item_clicked',\n metadata: {\n card: [STATS_ITEM_TYPE_CARD_MAP[type]],\n game_state: [this.currentGameState.value],\n },\n });\n };\n\n /**\n * Clean up resources when the ViewModel is no longer needed\n */\n cleanup(): void {\n this.stopTimecodePolling();\n this.clearSmartPollingTimeout();\n this.resetTimecodePollingState();\n }\n\n /**\n * Handle player timecode updates with enhanced logging and validation\n *\n * @param playerTimeCode - The timecode in milliseconds, or null for live\n */\n onUpdatePlayerTimeCode(playerTimeCode: number | null): void {\n this.currentPlayerTimeCode = playerTimeCode;\n\n if (this.useMockData) {\n return;\n }\n\n try {\n this.performSmartPolling(playerTimeCode);\n } catch (error) {\n captureException(error, {\n context: 'StatsViewModel.onUpdatePlayerTimeCode',\n });\n\n console.error('Error handling player timecode update:', error);\n\n this.handleTimecodeError('Error handling player timecode update', error);\n }\n }\n\n clearTabLoadFailure() {\n this.errorState.value = 'none';\n const currentTimeCode = this.getCurrentTimeCode();\n this.onUpdatePlayerTimeCode(currentTimeCode);\n }\n\n /**\n * Implement smart polling strategy: immediate API call + delayed polling resumption\n *\n * @param playerTimeCode - The timecode in milliseconds, or null\n */\n private async performSmartPolling(\n playerTimeCode: number | null\n ): Promise<void> {\n this.clearSmartPollingTimeout();\n this.stopTimecodePolling();\n\n try {\n const immediateStats = await this.statsService.getStatsByUrl(\n playerTimeCode\n );\n\n if (!immediateStats) {\n throw new Error('API returned undefined or null response');\n }\n\n this.processPolledData(immediateStats);\n\n this.smartPollingTimeout = window.setTimeout(() => {\n this.startTimecodePolling(playerTimeCode);\n this.smartPollingTimeout = null;\n }, SMART_POLLING_DELAY);\n } catch (error) {\n captureException(error, {\n context: 'StatsViewModel.performSmartPolling',\n });\n\n console.error('Error during smart polling immediate call:', error);\n\n this.handleTimecodeError(\n 'Error during smart polling immediate call',\n error\n );\n\n this.stopTimecodePolling();\n this.startTimecodePolling(playerTimeCode);\n }\n }\n\n /**\n * Enhanced error handling for timecode-related operations\n *\n * @param context - Description of where the error occurred\n * @param error - The error that occurred\n */\n private handleTimecodeError(context: string, error: unknown): void {\n const errorDetails = {\n context,\n errorType: error?.constructor?.name || 'Unknown',\n errorMessage: error instanceof Error ? error.message : String(error),\n timestamp: new Date().toISOString(),\n currentTimecode: this.currentPlayerTimeCode,\n hasExistingData: this.statsItems.value.length > 0,\n lastResponseHash: this.lastResponseHash,\n url: this.timecodePollingState.currentUrl,\n };\n\n console.error(`${context}:`, errorDetails);\n\n if (!this.hasEverSuccessfullyLoaded.value) {\n this.errorState.value = 'tabLoadFailure';\n }\n }\n\n /**\n * Clear any pending smart polling timeout\n */\n private clearSmartPollingTimeout(): void {\n if (this.smartPollingTimeout) {\n clearTimeout(this.smartPollingTimeout);\n this.smartPollingTimeout = null;\n }\n }\n\n /**\n * Reset timecode polling state\n */\n private resetTimecodePollingState(): void {\n this.timecodePollingState = {\n isActive: false,\n currentUrl: null,\n lastUpdateTime: 0,\n };\n }\n\n /**\n * Start timecode-based polling with enhanced logging\n *\n * @param playerTimeCode - The timecode in milliseconds, or null\n */\n private startTimecodePolling(playerTimeCode: number | null): void {\n this.stopTimecodePolling();\n try {\n this.timecodePollingTask = this.statsService.pollStatsByUrl(\n playerTimeCode,\n DEFAULT_POLLING_INTERVAL,\n (data) => {\n this.processPolledData(data);\n },\n (error) => {\n console.error('Timecode polling error:', error);\n\n this.handleTimecodeError('Timecode polling error', error);\n }\n );\n\n this.timecodePollingState.isActive = true;\n } catch (error) {\n captureException(error, {\n context: 'StatsViewModel.startTimecodePolling',\n });\n\n console.error('Error setting up timecode-based Stats polling:', error);\n\n this.handleTimecodeError(\n 'Error setting up timecode-based Stats polling',\n error\n );\n }\n }\n\n /**\n * Stop timecode-based polling with enhanced logging\n */\n private stopTimecodePolling(): void {\n if (this.timecodePollingTask) {\n this.timecodePollingTask.stop();\n this.timecodePollingTask = null;\n }\n\n this.timecodePollingState.isActive = false;\n }\n\n /**\n * Fetch mock data for testing\n */\n private async fetchMockData(): Promise<void> {\n this.processData(MOCK_STATS_API_PRE_GAME_RESPONSE);\n this.hasEverSuccessfullyLoaded.value = true;\n this.isDataLoading.value = false;\n }\n\n /**\n * Process polled data with hash comparison to avoid unnecessary re-renders\n * Enhanced with comprehensive logging to show data changes\n *\n * @param data - The stats data received from the API\n */\n private processPolledData(data: StatsApiResponse): void {\n const responseString = JSON.stringify(data);\n const currentHash = stringHashCode(responseString);\n\n if (\n this.hasEverSuccessfullyLoaded.value &&\n currentHash === this.lastResponseHash\n ) {\n return;\n }\n\n this.lastResponseHash = currentHash;\n\n this.hasEverSuccessfullyLoaded.value = true;\n this.errorState.value = 'none';\n\n this.processData(data);\n\n if (data.gameState === 'post') {\n this.stopTimecodePolling();\n }\n }\n\n private processData(data: StatsApiResponse) {\n const statsItems: StatsItem[] = [];\n\n const headerTeam = this.parseHeaderTeams(data);\n if (headerTeam) {\n statsItems.push(headerTeam);\n }\n\n const matchPredictor = this.parseMatchPredictor(data);\n if (matchPredictor) {\n statsItems.push(matchPredictor);\n }\n\n const careerMatchup = this.parseCareerMatchup(data);\n if (careerMatchup) {\n statsItems.push(careerMatchup);\n }\n\n const playerSeasonStats = this.parsePlayerSeasonStats(data);\n if (playerSeasonStats) {\n statsItems.push(playerSeasonStats);\n }\n\n const scoringSummary = this.parseScoringSummary(data);\n if (scoringSummary) {\n statsItems.push(scoringSummary);\n }\n\n const winProbability = this.parseWinProbability(data);\n if (winProbability) {\n statsItems.push(winProbability);\n }\n\n // Team Stats (prefer season stats when available; fallback to game stats)\n const teamStats =\n this.parseTeamSeasonStatistics(data) || this.parseTeamsStatistics(data);\n if (teamStats) {\n statsItems.push(teamStats);\n }\n\n const driveSummary = this.parseDriveSummary(data);\n if (driveSummary.length > 0) {\n statsItems.push(...driveSummary);\n }\n\n const penalties = this.parsePenalties(data);\n if (penalties) {\n statsItems.push(penalties);\n }\n\n const activeAthletes = this.parseActiveAthletes(data);\n if (activeAthletes) {\n statsItems.push(activeAthletes);\n }\n\n const gameLeaders = this.parseGameLeaders(data);\n if (gameLeaders) {\n statsItems.push(gameLeaders);\n }\n\n const recentGames = this.parseRecentGames(data);\n if (recentGames) {\n statsItems.push(recentGames);\n }\n\n const promotion = this.parsePromotion(data);\n if (promotion) {\n statsItems.push(promotion);\n }\n\n // Update the stats items observable\n this.statsItems.value = statsItems;\n this.currentGameState.value = data.gameState;\n }\n\n private parseDriveSummary(data: StatsApiResponse): DriveSummaryItem[] {\n const teams = data.entities?.teams;\n const drives = data.drives;\n\n if (!teams || !drives || drives.length === 0) {\n return [];\n }\n\n const result: DriveSummaryItem[] = [];\n for (const drive of drives) {\n if (!drive?.team?.$key) {\n continue;\n }\n\n const plays = [...(drive.plays || [])].reverse();\n const lastPlay = plays[plays.length - 1] || null;\n let lastPlayMarquee = '';\n\n if (lastPlay) {\n lastPlayMarquee = formatLastPlayMarquee(lastPlay);\n }\n\n const { plays: playsQuantity, time, yards } = parseDriveDescription(\n drive.description || ''\n );\n\n const team = teams[drive.team.$key];\n\n if (!team) {\n continue;\n }\n\n result.push({\n id: drive.id,\n lastPlayMarquee,\n plays,\n playsQuantity,\n team,\n time,\n type: 'driveSummary',\n yards,\n });\n }\n\n return result;\n }\n\n private parseTeamsStatistics(data: StatsApiResponse): TeamStatsItem | null {\n const teams = data.entities?.teams;\n\n if (!teams) {\n return null;\n }\n\n const awayTeam = Object.values(teams).find(\n (team) => team.homeAway === 'away'\n );\n\n const homeTeam = Object.values(teams).find(\n (team) => team.homeAway === 'home'\n );\n\n if (!awayTeam || !homeTeam) {\n return null;\n }\n\n // Ensure both teams have statistics\n if (!awayTeam.statistics || !homeTeam.statistics) {\n return null;\n }\n\n const statistics: TeamStatsItem['statistics'] = [];\n for (let i = 0; i < awayTeam.statistics.length; i++) {\n const awayStat = awayTeam.statistics[i];\n const homeStat = homeTeam.statistics[i];\n\n if (isTeamStatistic(awayStat) && isTeamStatistic(homeStat)) {\n statistics.push({\n awayTeamDisplayValue: awayStat?.displayValue || '0',\n displayName: awayStat.displayName || '',\n homeTeamDisplayValue: homeStat?.displayValue || '0',\n awayTeamValue: awayStat?.value || 0,\n homeTeamValue: homeStat?.value || 0,\n });\n }\n }\n\n if (!statistics.length) {\n return null;\n }\n\n return {\n type: 'teamStats',\n title: 'Team Stats',\n awayTeam: {\n logo: awayTeam.logo,\n displayName: awayTeam.displayName || '',\n color: awayTeam.color || '',\n abbreviation: awayTeam.abbreviation || '',\n },\n homeTeam: {\n logo: homeTeam.logo,\n displayName: homeTeam.displayName || '',\n color: homeTeam.color || '',\n abbreviation: homeTeam.abbreviation || '',\n },\n statistics,\n };\n }\n\n private parseTeamSeasonStatistics(\n data: StatsApiResponse\n ): TeamStatsItem | null {\n const teams = data.entities?.teams || {};\n\n if (\n !Object.keys(teams).length ||\n !data.statTeams ||\n !data.statTeams.title ||\n !data.statTeams.sections?.length ||\n !data.statTeams.teams?.length\n ) {\n return null;\n }\n\n const awayTeamKey = data.statTeams.teams[0]?.$key;\n const homeTeamKey = data.statTeams.teams[1]?.$key;\n if (!awayTeamKey || !homeTeamKey) {\n return null;\n }\n const awayTeam = teams[awayTeamKey];\n const homeTeam = teams[homeTeamKey];\n if (!homeTeam || !awayTeam) {\n return null;\n }\n\n const tabbedStatistics: Record<\n string,\n {\n title: string;\n entries: TeamStatsStatistics[];\n }\n > = {};\n data.statTeams.sections.forEach((section) => {\n if (!!section.$key && !!section.title) {\n const sectionKeyStatistics: TeamStatsItem['statistics'] = [];\n if (\n isTabbedStatisticsArray(homeTeam.statistics) &&\n isTabbedStatisticsArray(awayTeam.statistics)\n ) {\n const homeSectionStats = homeTeam.statistics.find(\n (st) => st.$key === section.$key\n );\n const awaySectionStats = awayTeam.statistics.find(\n (st) => st.$key === section.$key\n );\n\n if (\n homeSectionStats &&\n awaySectionStats &&\n awaySectionStats.stats?.length &&\n homeSectionStats.stats?.length\n ) {\n for (let i = 0; i < awaySectionStats.stats.length; i++) {\n const awayStat = awaySectionStats.stats[i];\n const homeStat = homeSectionStats.stats[i];\n\n sectionKeyStatistics.push({\n awayTeamDisplayValue: awayStat?.displayValue || '0',\n displayName: awayStat.displayName || '',\n homeTeamDisplayValue: homeStat?.displayValue || '0',\n awayTeamValue: awayStat?.displayValue\n ? Number(awayStat.displayValue)\n : 0,\n homeTeamValue: homeStat?.displayValue\n ? Number(homeStat.displayValue)\n : 0,\n });\n }\n tabbedStatistics[section.$key] = {\n title: section.title,\n entries: sectionKeyStatistics,\n };\n }\n }\n }\n });\n\n return {\n type: 'teamStats',\n title: data.statTeams.title,\n awayTeam: {\n abbreviation: awayTeam.abbreviation,\n displayName: awayTeam.displayName || '',\n color: awayTeam.color || '',\n logo: awayTeam.logo,\n },\n homeTeam: {\n abbreviation: homeTeam.abbreviation,\n displayName: homeTeam.displayName || '',\n color: homeTeam.color || '',\n logo: homeTeam.logo,\n },\n tabbedStatistics,\n };\n }\n\n private parseMatchPredictor(\n data: StatsApiResponse\n ): StatsMatchPredictorItem | null {\n const teams = data.entities?.teams;\n const predictor = data.predictor;\n\n if (!teams || !predictor || !predictor.homeTeam || !predictor.awayTeam) {\n return null;\n }\n\n // Get team data\n const homeTeam = teams[predictor.homeTeam.team.$key];\n const awayTeam = teams[predictor.awayTeam.team.$key];\n\n if (!homeTeam || !awayTeam) {\n return null;\n }\n\n // Parse percentages\n const homePercentage = parseFloat(predictor.homeTeam.gameProjection);\n const awayPercentage = parseFloat(predictor.awayTeam.gameProjection);\n\n return {\n type: 'matchPredictor',\n header: predictor.header,\n imageUrl: predictor.imageUrl,\n awayTeam: {\n percentage: awayPercentage,\n abbreviation: awayTeam.abbreviation,\n logo: awayTeam.logo,\n displayName: awayTeam.displayName || '',\n },\n homeTeam: {\n percentage: homePercentage,\n abbreviation: homeTeam.abbreviation,\n logo: homeTeam.logo,\n displayName: homeTeam.displayName || '',\n },\n };\n }\n\n private parsePromotion(\n response: StatsApiResponse\n ): StatsPromotionItem | null {\n const promotion = response.promotion;\n\n if (!promotion) {\n return null;\n }\n\n return {\n type: 'promotion',\n title: promotion.title || '',\n description: promotion.description || '',\n logo: promotion.logo || '',\n qrCode: promotion.qrCode || '',\n backgroundImage: promotion.backgroundImage || '',\n };\n }\n\n private parseCareerMatchup(\n response: StatsApiResponse\n ): CareerMatchupStatsItem | null {\n const careerMatchup = response.careerMatchup;\n const athletes = response.entities?.athletes;\n\n if (!careerMatchup || !careerMatchup.sections) {\n return null;\n }\n\n const toText = (value: unknown): string => {\n if (typeof value === 'string') return value;\n if (value && typeof value === 'object') {\n const maybeDisplayName = (value as { displayName?: unknown })\n .displayName;\n if (typeof maybeDisplayName === 'string') return maybeDisplayName;\n }\n return '';\n };\n\n const sections = careerMatchup.sections\n .filter((section) => !!section)\n .map((section) => {\n const items = (section.items || [])\n .filter((item) => !!item)\n .map((item) => {\n const athleteKey = item.athlete?.$key;\n const athlete =\n athletes && athleteKey ? athletes[athleteKey] : undefined;\n // Determine if this item should be highlighted (e.g. warning color)\n // This abstraction allows the View to be sport-agnostic.\n // Currently only \"On Deck\" in MLB triggers this.\n const statusText = toText(item.status);\n const isHighlighted = statusText === 'On Deck';\n\n return {\n status: statusText,\n type: toText(item.type) || '',\n displayName: toText(item.displayName) || '',\n athlete,\n isHighlighted,\n };\n });\n\n const statistics = (section.statistics || [])\n .filter((stat) => !!stat)\n .map((stat) => ({\n abbreviation: stat.abbreviation || '',\n displayValue: stat.displayValue || '',\n }));\n\n return {\n items,\n statistics,\n };\n });\n\n return {\n type: 'careerMatchup',\n title: careerMatchup.title || '',\n sections,\n };\n }\n\n private parseHeaderTeams(\n response: StatsApiResponse\n ): HeaderTeamStatItem | null {\n return (\n this.parseHeaderTeamsFromTeamHeader(response) ||\n this.parseHeaderTeamsFromHeader(response)\n );\n }\n\n private parseHeaderTeamsFromHeader(\n response: StatsApiResponse\n ): HeaderTeamStatItem | null {\n const headerTeams: HeaderLikeTeam[] =\n ((response.header?.teams as unknown) as HeaderLikeTeam[] | undefined) ||\n [];\n\n if (headerTeams.length === 0) {\n return null;\n }\n\n return this.buildHeaderTeamsItem({\n response,\n headerTeams,\n linescoresHeader: response.header?.linescoresHeader || [],\n linescoresRowHeader: undefined,\n isLiveFromHeaderSource: false,\n });\n }\n\n private parseHeaderTeamsFromTeamHeader(\n response: StatsApiResponse\n ): HeaderTeamStatItem | null {\n const headerTeams: HeaderLikeTeam[] =\n ((response.header?.teams as unknown) as HeaderLikeTeam[] | undefined) ||\n [];\n const teamHeaderTeams: HeaderLikeTeam[] =\n ((response.teamHeader?.teams as unknown) as\n | HeaderLikeTeam[]\n | undefined) || [];\n\n if (teamHeaderTeams.length === 0) {\n return null;\n }\n\n const teamHeaderHasLinescores = teamHeaderTeams.some(\n (t) => Array.isArray(t.linescores) && t.linescores.length > 0\n );\n const teamHeaderHasLinescoresHeader =\n (response.teamHeader?.linescoresHeader?.length || 0) > 0;\n\n if (\n !teamHeaderHasLinescores &&\n !teamHeaderHasLinescoresHeader &&\n headerTeams.length > 0\n ) {\n return null;\n }\n\n const linescoresRowHeader =\n response.teamHeader?.style?.linescores?.rowHeader === 'teamLogo'\n ? 'teamLogo'\n : undefined;\n\n return this.buildHeaderTeamsItem({\n response,\n headerTeams: teamHeaderTeams,\n linescoresHeader: response.teamHeader?.linescoresHeader || [],\n linescoresRowHeader,\n isLiveFromHeaderSource:\n teamHeaderHasLinescores || teamHeaderHasLinescoresHeader,\n });\n }\n\n private buildHeaderTeamsItem(params: {\n response: StatsApiResponse;\n headerTeams: HeaderLikeTeam[];\n linescoresHeader: string[];\n linescoresRowHeader?: 'teamLogo' | 'teamName';\n isLiveFromHeaderSource: boolean;\n }): HeaderTeamStatItem | null {\n const {\n response,\n headerTeams,\n linescoresHeader: rawLinescoresHeader,\n linescoresRowHeader,\n isLiveFromHeaderSource,\n } = params;\n\n const teams = response.entities?.teams;\n if (!teams || headerTeams.length === 0) {\n return null;\n }\n\n const homeTeamHeader = headerTeams.find((t) => {\n const team = teams[t.$key];\n return team && team.homeAway === 'home';\n });\n\n const awayTeamHeader = headerTeams.find((t) => {\n const team = teams[t.$key];\n return team && team.homeAway === 'away';\n });\n\n // If home/away isn't provided, fall back to list order.\n const fallbackAwayTeamHeader = headerTeams[0];\n const fallbackHomeTeamHeader = headerTeams[1];\n\n const resolvedHomeTeamHeader = homeTeamHeader || fallbackHomeTeamHeader;\n const resolvedAwayTeamHeader = awayTeamHeader || fallbackAwayTeamHeader;\n\n if (!resolvedHomeTeamHeader || !resolvedAwayTeamHeader) {\n return null;\n }\n\n const homeTeam = teams[resolvedHomeTeamHeader.$key];\n const awayTeam = teams[resolvedAwayTeamHeader.$key];\n\n if (!homeTeam || !awayTeam) {\n return null;\n }\n\n const statistics: {\n displayName: string;\n homeTeamValue: number;\n awayTeamValue: number;\n awayTeamDisplayValue: string;\n homeTeamDisplayValue: string;\n }[] = [];\n\n const statisticsSet = new Set<string>();\n const rawAwayStats = awayTeam.statistics || [];\n const rawHomeStats = homeTeam.statistics || [];\n const awayStatistics = (rawAwayStats as TeamStatistic[]).filter(\n isTeamStatistic\n );\n const homeStatistics = (rawHomeStats as TeamStatistic[]).filter(\n isTeamStatistic\n );\n\n [...awayStatistics, ...homeStatistics].forEach((st) => {\n statisticsSet.add(st.$key);\n });\n\n // Ensure all statistics from both teams are included\n statisticsSet.forEach((statKey) => {\n const awayStat = awayStatistics.find((st) => st.$key === statKey);\n const homeStat = homeStatistics.find((st) => st.$key === statKey);\n\n if (!awayStat || !homeStat) {\n return;\n }\n\n statistics.push({\n displayName: awayStat?.displayName || homeStat?.displayName || '',\n awayTeamValue: awayStat?.value || 0,\n homeTeamValue: homeStat?.value || 0,\n awayTeamDisplayValue: awayStat?.displayValue || '0',\n homeTeamDisplayValue: homeStat?.displayValue || '0',\n });\n });\n\n const buildLinescores = (t: HeaderLikeTeam): string[] => {\n if (t.linescores && t.linescores.length > 0) {\n return t.linescores.map((l) => l.displayValue);\n }\n if (typeof t.score === 'string' && t.score.length > 0) {\n return [t.score];\n }\n return [];\n };\n\n const maybeDetails = (t: HeaderLikeTeam): string[] | undefined => {\n if (Array.isArray(t.details) && t.details.filter(Boolean).length > 0) {\n return t.details.filter(Boolean);\n }\n return undefined;\n };\n\n const awayDetails = maybeDetails(resolvedAwayTeamHeader);\n const homeDetails = maybeDetails(resolvedHomeTeamHeader);\n\n let linescoresHeader = rawLinescoresHeader;\n let awayTeamLinescores = buildLinescores(resolvedAwayTeamHeader);\n let homeTeamLinescores = buildLinescores(resolvedHomeTeamHeader);\n\n // If more than 9 innings are present, show only the last 9 innings plus R, H, E\n const hasLinescoresAndHeader =\n linescoresHeader.length > 0 &&\n (awayTeamLinescores.length > 0 || homeTeamLinescores.length > 0);\n\n if (hasLinescoresAndHeader && linescoresRowHeader === 'teamLogo') {\n const lastThreeHeaders = linescoresHeader.slice(-3);\n const isMlbFormat =\n lastThreeHeaders.includes('R') ||\n lastThreeHeaders.includes('H') ||\n lastThreeHeaders.includes('E');\n\n if (isMlbFormat && linescoresHeader.length > 12) {\n // More than 9 innings + 3 stats (R, H, E)\n const statsCount = 3; // R, H, E\n const inningsCount = linescoresHeader.length - statsCount;\n const maxInningsToShow = 9;\n\n if (inningsCount > maxInningsToShow) {\n const inningsToRemove = inningsCount - maxInningsToShow;\n\n // Slice header to keep last 9 innings + stats (R, H, E)\n linescoresHeader = linescoresHeader.slice(inningsToRemove);\n\n // Apply same slicing to team linescores\n awayTeamLinescores = awayTeamLinescores.slice(inningsToRemove);\n homeTeamLinescores = homeTeamLinescores.slice(inningsToRemove);\n }\n }\n }\n\n const isLive =\n response.gameState === 'in' ||\n response.gameState === 'post' ||\n isLiveFromHeaderSource;\n\n return {\n type: 'headerTeam',\n linescoresHeader,\n linescoresRowHeader,\n isLive,\n statistics,\n awayTeam: {\n abbreviation: awayTeam.abbreviation,\n color: awayTeam.color,\n id: awayTeam.id,\n linescores: awayTeamLinescores,\n logo: awayTeam.logo,\n name: awayTeam.name,\n record: awayTeam.record,\n ...(awayDetails ? { details: awayDetails } : {}),\n },\n homeTeam: {\n abbreviation: homeTeam.abbreviation,\n color: homeTeam.color,\n id: homeTeam.id,\n linescores: homeTeamLinescores,\n logo: homeTeam.logo,\n name: homeTeam.name,\n record: homeTeam.record,\n ...(homeDetails ? { details: homeDetails } : {}),\n },\n };\n }\n\n private parseRecentGames(\n response: StatsApiResponse\n ): RecentGamesStatsItem | null {\n const teams = response.entities?.teams;\n const previousGames = response.previousGames;\n\n if (!teams || !previousGames || previousGames.length === 0) {\n return null;\n }\n\n const awayTeamPreviousGame = previousGames.find(\n (game) => game?.displayOrder === 1\n );\n\n const homeTeamPreviousGame = previousGames.find(\n (game) => game?.displayOrder === 2\n );\n\n if (!awayTeamPreviousGame || !homeTeamPreviousGame) {\n return null;\n }\n\n if (!awayTeamPreviousGame.events || !homeTeamPreviousGame.events) {\n return null;\n }\n\n if (!awayTeamPreviousGame.team?.$key || !homeTeamPreviousGame.team?.$key) {\n return null;\n }\n\n const awayTeam = teams[awayTeamPreviousGame.team.$key];\n const homeTeam = teams[homeTeamPreviousGame.team.$key];\n\n if (!awayTeam || !homeTeam) {\n return null;\n }\n\n const previousGame: RecentGamesStatsItem = {\n type: 'recentGames',\n awayTeam: {\n events: [...awayTeamPreviousGame.events]\n .reverse()\n .filter((event) => event?.team?.$key)\n .map((event) => {\n const eventTeam = teams[event.team.$key];\n\n return {\n gameResult: event.gameResult,\n homeAway: event.team.homeAway,\n score: event.score,\n teamLogo: eventTeam?.logo,\n };\n }),\n logo: awayTeam.logo,\n name: awayTeam.shortDisplayName,\n },\n homeTeam: {\n events: [...homeTeamPreviousGame.events]\n .reverse()\n .filter((event) => event?.team?.$key)\n .map((event) => {\n const eventTeam = teams[event.team.$key];\n\n return {\n gameResult: event.gameResult,\n homeAway: event.team.homeAway,\n score: event.score,\n teamLogo: eventTeam?.logo,\n };\n }),\n logo: homeTeam.logo,\n name: homeTeam.shortDisplayName,\n },\n };\n\n return previousGame;\n }\n\n private parseWinProbability(\n response: StatsApiResponse\n ): WinProbabilityStatsItem | null {\n const winProbability = response.winProbability;\n if (\n !winProbability ||\n !winProbability.homeTeam ||\n !winProbability.awayTeam\n ) {\n return null;\n }\n\n const teams = response.entities?.teams;\n if (!teams) {\n return null;\n }\n\n const homeTeam = teams[winProbability.homeTeam.team.$key];\n const awayTeam = teams[winProbability.awayTeam.team.$key];\n\n if (!homeTeam || !awayTeam) {\n return null;\n }\n\n return {\n type: 'winProbability',\n chartImageUrl: winProbability.imageUrl,\n awayTeam: {\n id: awayTeam.id,\n abbreviation: awayTeam.abbreviation,\n logo: awayTeam.logo,\n winPercentage: winProbability.awayTeam.winPercentage,\n },\n homeTeam: {\n id: homeTeam.id,\n abbreviation: homeTeam.abbreviation,\n logo: homeTeam.logo,\n winPercentage: winProbability.homeTeam.winPercentage,\n },\n };\n }\n\n private parseGameLeaders(\n response: StatsApiResponse\n ): GameLeadersStatsItem | null {\n if (!response.entities?.athletes || !response.entities?.teams) {\n return null;\n }\n\n const leaders = response.leaders;\n const isPre = response.gameState === 'pre';\n if (!leaders || leaders.length === 0) {\n return null;\n }\n\n const items: GameLeadersStatsItem['items'] = [];\n for (const leader of leaders) {\n if (!leader.away || !leader.home) {\n continue;\n }\n\n if (!leader.away?.athlete?.$key || !leader.home?.athlete?.$key) {\n continue;\n }\n\n const awayAthlete = response.entities.athletes[leader.away.athlete.$key];\n const homeAthlete = response.entities.athletes[leader.home.athlete.$key];\n\n if (!awayAthlete || !homeAthlete) {\n continue;\n }\n\n const awayAthleteStatistics = leader.away.athlete.statistics || [];\n const homeAthleteStatistics = leader.home.athlete.statistics || [];\n\n const value: GameLeadersStatsItem['items'][number] = {\n displayName: leader.displayName,\n awayAthlete: {\n id: awayAthlete.id,\n displayName: awayAthlete.displayName,\n headshot: awayAthlete.headshot\n ? setImageDimensions(awayAthlete.headshot, 256, 144)\n : '',\n position: awayAthlete.position?.abbreviation || '-',\n shortName: awayAthlete.shortName,\n jersey: awayAthlete.jersey,\n statistics: awayAthleteStatistics,\n },\n homeAthlete: {\n id: homeAthlete.id,\n displayName: homeAthlete.displayName,\n headshot: homeAthlete.headshot\n ? setImageDimensions(homeAthlete.headshot, 256, 144)\n : '',\n position: homeAthlete.position?.abbreviation || '-',\n shortName: homeAthlete.shortName,\n jersey: homeAthlete.jersey,\n statistics: homeAthleteStatistics,\n },\n };\n\n items.push(value);\n }\n\n if (!items.length) {\n return null;\n }\n\n return {\n type: 'gameLeaders',\n items,\n displayText: isPre ? 'Season Leaders' : 'Game Leaders',\n };\n }\n\n private parseActiveAthletes(\n response: StatsApiResponse\n ): ActiveAthletesItem | null {\n const activeAthletes = response.activeAthletes;\n const { awayTeam, homeTeam } = this.getActiveAthletesTeamInfo(response);\n const athletes: ActiveAthletesItem['athletes'] = [];\n\n if (\n !response.entities?.athletes ||\n !activeAthletes ||\n awayTeam.index === -1 ||\n homeTeam.index === -1\n ) {\n return null;\n }\n\n for (\n let i = 0;\n i < activeAthletes.teams[awayTeam.index].athletes.length;\n i++\n ) {\n const awayAthlete = activeAthletes.teams[awayTeam.index].athletes[i];\n const homeAthlete = activeAthletes.teams[homeTeam.index].athletes[i];\n\n if (!awayAthlete?.$key || !homeAthlete?.$key) {\n continue;\n }\n\n const awayAthleteInfo = response.entities.athletes[awayAthlete.$key];\n const homeAthleteInfo = response.entities.athletes[homeAthlete.$key];\n\n if (!awayAthleteInfo || !homeAthleteInfo) {\n continue;\n }\n\n const awayAthleteStatistics: {\n displayValue: string;\n abbreviation: string;\n value: number;\n }[] = [];\n const homeAthleteStatistics: {\n displayValue: string;\n abbreviation: string;\n value: number;\n }[] = [];\n\n const awayStatLine = awayAthlete.statLine || '';\n const homeStatLine = homeAthlete.statLine || '';\n\n awayStatLine\n .trim()\n .split(',')\n .forEach((st, index) => {\n const [awayDisplayValue, awayAbbreviation] = st.trim().split(' ');\n const homeStats = homeStatLine.trim().split(',')[index];\n\n if (!homeStats) {\n return;\n }\n\n const [homeDisplayValue, homeAbbreviation] = homeStats\n .trim()\n .split(' ');\n\n awayAthleteStatistics.push({\n displayValue: awayDisplayValue || '0',\n abbreviation: awayAbbreviation || '-',\n value: parseFloat(awayDisplayValue) || 0,\n });\n\n homeAthleteStatistics.push({\n displayValue: homeDisplayValue || '0',\n abbreviation: homeAbbreviation || '-',\n value: parseFloat(homeDisplayValue) || 0,\n });\n });\n\n athletes.push({\n awayAthlete: {\n id: awayAthleteInfo.id,\n displayName: awayAthleteInfo.displayName,\n headshot: awayAthleteInfo.headshot\n ? setImageDimensions(awayAthleteInfo.headshot, 256, 144)\n : '',\n position: awayAthleteInfo.position?.abbreviation || '-',\n shortName: awayAthleteInfo.shortName,\n jersey: awayAthleteInfo.jersey,\n statistics: awayAthleteStatistics,\n minifiedStatistics: awayAthlete.statLine,\n },\n homeAthlete: {\n id: homeAthleteInfo.id,\n displayName: homeAthleteInfo.displayName,\n headshot: homeAthleteInfo.headshot\n ? setImageDimensions(homeAthleteInfo.headshot, 256, 144)\n : '',\n position: homeAthleteInfo.position?.abbreviation || '-',\n shortName: homeAthleteInfo.shortName,\n jersey: homeAthleteInfo.jersey,\n statistics: homeAthleteStatistics,\n minifiedStatistics: homeAthlete.statLine,\n },\n });\n }\n\n if (!athletes.length) {\n return null;\n }\n\n return {\n type: 'activeAthletes',\n awayTeam,\n homeTeam,\n athletes,\n displayText: activeAthletes.displayText,\n };\n }\n\n private getActiveAthletesTeamInfo(\n data: StatsApiResponse\n ): GetTeamInfoResponse {\n const teams = data.activeAthletes?.teams || [];\n let awayTeam: GetTeamInfoResponse['awayTeam'] = {\n index: -1,\n id: '',\n logo: '',\n name: '-',\n };\n let homeTeam: GetTeamInfoResponse['homeTeam'] = {\n index: -1,\n id: '',\n logo: '',\n name: '-',\n };\n\n const entitiesTeams = data.entities?.teams;\n if (!entitiesTeams) {\n return { awayTeam, homeTeam };\n }\n\n for (let i = 0; i < teams.length; i++) {\n const teamInfo = teams[i];\n const team = entitiesTeams[teamInfo.team.$key];\n\n if (!team) {\n continue;\n }\n\n if (team.homeAway === 'away') {\n awayTeam = {\n index: i,\n id: team.id,\n logo: team.logo,\n name: team.name || '-',\n };\n } else if (team.homeAway === 'home') {\n homeTeam = {\n index: i,\n id: team.id,\n logo: team.logo,\n name: team.name || '-',\n };\n }\n }\n\n return { awayTeam, homeTeam };\n }\n\n private parseScoringSummary(\n data: StatsApiResponse\n ): ScoringSummaryItem | null {\n const scoringSummary = data.scoringSummary;\n if (!scoringSummary || !scoringSummary.sections) {\n return null;\n }\n\n const teams = data.entities?.teams;\n const athletes = data.entities?.athletes;\n\n // Handle MLB Scoring Summary\n if (isMlbScoringSummary(scoringSummary)) {\n const sections: ScoringSummarySection[] = [];\n\n for (const section of scoringSummary.sections) {\n if (!section.title || !section.items?.length) {\n continue;\n }\n const items: ScoringSummarySectionTeam[] = [];\n for (const item of section.items) {\n if (!item?.team?.$key || !item?.athlete?.$key) {\n continue;\n }\n const team = teams?.[item.team.$key];\n const athlete = athletes?.[item.athlete.$key];\n const athleteNumber = `#${athlete?.jersey || ''}`;\n const athleteName = athlete?.shortName || '';\n\n if (!team || !athlete) {\n continue;\n }\n\n const textParts: Array<{ featured: boolean; title: string }> = [];\n if (athleteNumber) {\n textParts.push({\n featured: false,\n title: athleteNumber,\n });\n }\n if (athleteName) {\n textParts.push({\n featured: true,\n title: athleteName,\n });\n }\n\n items.push({\n teamLogo: team?.logo || '',\n teamName: team?.abbreviation,\n headshot: athlete?.headshot\n ? setImageDimensions(athlete.headshot, 200, 144)\n : undefined,\n athleteShortName: athlete?.shortName || '',\n athleteJersey: athlete?.jersey || '',\n athletePosition: athlete?.position?.abbreviation || '',\n text: item?.text || '',\n shortText: textParts,\n header: (item?.header || []).map((h, index) => ({\n featured: h.featured ?? false,\n title: `${h.title ?? ''}${index === 0 ? ',' : ''}`,\n })),\n });\n }\n if (items.length > 0) {\n sections.push({\n title: section.title,\n items,\n });\n }\n }\n\n if (sections.length === 0) {\n return null;\n }\n return {\n type: 'scoringSummary',\n tag: 'mlb',\n title: scoringSummary.title || 'Scoring Summary',\n sections,\n };\n }\n // Handle Hockey Scoring Summary - transform to unified format\n else if (isHockeyScoringSummary(scoringSummary)) {\n const hockeySummary = scoringSummary as RawScoringSummary;\n const sections: ScoringSummarySection[] = [];\n\n for (const section of hockeySummary.sections || []) {\n const items: ScoringSummarySectionTeam[] = [];\n\n for (const item of section.items || []) {\n if (!item?.team?.$key || !item?.athlete?.$key || !item?.title) {\n continue;\n }\n\n const team =\n item.team && item.team.$key ? teams?.[item.team.$key] : undefined;\n const atheleteKey = item.athlete?.$key || '';\n const athlete = athletes?.[atheleteKey];\n const itemTitle = item.title || '';\n const [athleteNumber, ...athleteNameWithAssists] = itemTitle.split(\n ' '\n );\n let athleteAssists = '';\n let athleteName = '';\n if (athleteNameWithAssists.length > 0) {\n athleteAssists =\n athleteNameWithAssists[athleteNameWithAssists.length - 1];\n athleteName = athleteNameWithAssists.slice(0, -1).join(' ');\n }\n\n const header: Array<{ featured: boolean; title: string }> = [];\n if (item.clock) {\n header.push({ featured: true, title: item.clock });\n }\n if (team?.abbreviation) {\n header.push({ featured: false, title: team.abbreviation });\n }\n\n const textParts: Array<{ featured: boolean; title: string }> = [];\n if (athleteNumber) {\n textParts.push({ featured: false, title: athleteNumber });\n }\n if (athleteName) {\n textParts.push({ featured: true, title: athleteName });\n }\n if (athleteAssists) {\n textParts.push({ featured: false, title: athleteAssists });\n }\n\n items.push({\n teamLogo: team?.logo || '',\n teamName: team?.abbreviation || '',\n header,\n text: item?.description || '',\n shortText: textParts,\n headshot: athlete?.headshot\n ? setImageDimensions(athlete.headshot, 200, 144)\n : undefined,\n athleteShortName: athleteName,\n athletePosition: athlete?.position?.abbreviation || '',\n athleteJersey: athleteNumber,\n });\n }\n\n if (items.length > 0) {\n sections.push({\n title: section?.title || '',\n items,\n });\n }\n }\n\n if (sections.length === 0) {\n return null;\n }\n\n return {\n type: 'scoringSummary',\n tag: 'hockey',\n title: hockeySummary.title || 'Scoring Summary',\n sections,\n };\n }\n\n return null;\n }\n\n private parsePenalties(data: StatsApiResponse): PenaltiesItem | null {\n const penalties = data.penaltySummary;\n if (!penalties || !penalties.sections) {\n return null;\n }\n\n const teams = data.entities?.teams;\n const athletes = data.entities?.athletes;\n\n const sections = penalties.sections.map(\n (section): ScoringSummarySection => {\n const items = section.items\n .filter((item) => item?.team?.$key && item?.athlete?.$key)\n .map(\n (item): ScoringSummarySectionTeam => {\n const team = teams?.[item.team.$key];\n const athlete = athletes?.[item.athlete.$key];\n const [athleteNumber, ...athleteName] = item.title.split(' ');\n const athleteDisplayName = (athleteName ?? []).join(' ') || '';\n\n const textParts: Array<{ featured: boolean; title: string }> = [];\n if (athleteNumber) {\n textParts.push({\n featured: false,\n title: athleteNumber,\n });\n }\n if (athleteDisplayName) {\n textParts.push({\n featured: true,\n title: athleteDisplayName,\n });\n }\n\n return {\n teamLogo: team?.logo || '',\n teamName: team?.abbreviation || '',\n header: [{ title: item.clock || '', featured: false }],\n text: item.description || '',\n shortText: textParts,\n headshot: athlete?.headshot\n ? setImageDimensions(athlete.headshot, 200, 144)\n : undefined,\n athleteShortName: athleteName.join(' '),\n athletePosition: athlete?.position?.abbreviation || '',\n athleteJersey: athleteNumber || '',\n };\n }\n );\n\n return {\n title: section.title,\n items,\n };\n }\n );\n\n if (!sections.length || sections.every((s) => s.items.length === 0)) {\n return null;\n }\n\n return {\n type: 'penalties',\n tag: 'penalties',\n title: penalties.title,\n sections,\n };\n }\n\n private parsePlayerSeasonStats(\n data: StatsApiResponse\n ): PlayerSeasonStatsItem | null {\n const playerStats = data.playerStats;\n const teams = data.entities?.teams;\n const athletes = data.entities?.athletes;\n\n if (!playerStats?.teams?.length || !teams) {\n return null;\n }\n\n const parsedTeams: PlayerSeasonStatsTeam[] = [];\n\n for (const playerStatsTeam of playerStats.teams) {\n if (!playerStatsTeam.$key) {\n continue;\n }\n\n const team = teams[playerStatsTeam.$key];\n if (!team) {\n continue;\n }\n\n const sections: PlayerSeasonStatsSection[] = [];\n\n for (const section of playerStatsTeam.sections || []) {\n if (!section.title || !section.items?.length) {\n continue;\n }\n\n const items: PlayerSeasonStatsPlayerItem[] = [];\n\n for (const item of section.items) {\n if (!item.title) {\n continue;\n }\n\n const athleteKey = item.athlete?.$key;\n const athlete: Athlete | undefined = athleteKey\n ? athletes?.[athleteKey]\n : undefined;\n\n const statistics = item.athlete?.statistics || [];\n const featuredStat = statistics.find((s) => s.featured);\n\n items.push({\n title: item.title,\n headshot: athlete?.headshot\n ? setImageDimensions(athlete.headshot, 256, 144)\n : '',\n position: athlete?.position?.abbreviation || '',\n jersey: athlete?.jersey || '',\n featuredStat: featuredStat\n ? {\n displayValue: featuredStat.displayValue || '',\n label: featuredStat.label || '',\n }\n : null,\n statistics: statistics\n .filter((s) => !s.featured)\n .map((s) => ({\n displayValue: s.displayValue || '',\n label: s.label || '',\n })),\n playerStatus: item?.status\n ? {\n displayName: item.status.displayName ?? '',\n type: item.status.type ?? '',\n }\n : null,\n });\n }\n\n if (items.length > 0) {\n sections.push({\n title: section.title,\n items,\n });\n }\n }\n\n if (sections.length > 0) {\n parsedTeams.push({\n teamKey: playerStatsTeam.$key,\n shortDisplayName: team.shortDisplayName || team.displayName || '',\n color: team.color || '',\n sections,\n });\n }\n }\n\n if (parsedTeams.length === 0) {\n return null;\n }\n\n return {\n type: 'playerSeasonStats',\n teams: parsedTeams,\n };\n }\n}\n\nexport default StatsViewModel;\n"],"sourceRoot":""}
|