@maestro_io/maestro-web-sdk 5.1.2 → 5.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/dist/1.maestro-web-sdk.esm.js +1 -1
  2. package/dist/1.maestro-web-sdk.esm.js.map +1 -1
  3. package/dist/10.maestro-web-sdk.esm.js +1 -1
  4. package/dist/10.maestro-web-sdk.esm.js.map +1 -1
  5. package/dist/11.maestro-web-sdk.esm.js +1 -1
  6. package/dist/11.maestro-web-sdk.esm.js.map +1 -1
  7. package/dist/12.maestro-web-sdk.esm.js +1 -1
  8. package/dist/12.maestro-web-sdk.esm.js.map +1 -1
  9. package/dist/13.maestro-web-sdk.esm.js +1 -1
  10. package/dist/13.maestro-web-sdk.esm.js.map +1 -1
  11. package/dist/14.maestro-web-sdk.esm.js +1 -1
  12. package/dist/14.maestro-web-sdk.esm.js.map +1 -1
  13. package/dist/15.maestro-web-sdk.esm.js +1 -1
  14. package/dist/15.maestro-web-sdk.esm.js.map +1 -1
  15. package/dist/16.maestro-web-sdk.esm.js +1 -1
  16. package/dist/16.maestro-web-sdk.esm.js.map +1 -1
  17. package/dist/17.maestro-web-sdk.esm.js +1 -1
  18. package/dist/17.maestro-web-sdk.esm.js.map +1 -1
  19. package/dist/18.maestro-web-sdk.esm.js +1 -1
  20. package/dist/18.maestro-web-sdk.esm.js.map +1 -1
  21. package/dist/19.maestro-web-sdk.esm.js +1 -1
  22. package/dist/19.maestro-web-sdk.esm.js.map +1 -1
  23. package/dist/2.maestro-web-sdk.esm.js +1 -1
  24. package/dist/20.maestro-web-sdk.esm.js +1 -1
  25. package/dist/20.maestro-web-sdk.esm.js.map +1 -1
  26. package/dist/21.maestro-web-sdk.esm.js +1 -1
  27. package/dist/21.maestro-web-sdk.esm.js.map +1 -1
  28. package/dist/22.maestro-web-sdk.esm.js +1 -1
  29. package/dist/22.maestro-web-sdk.esm.js.map +1 -1
  30. package/dist/23.maestro-web-sdk.esm.js +1 -1
  31. package/dist/23.maestro-web-sdk.esm.js.map +1 -1
  32. package/dist/24.maestro-web-sdk.esm.js +1 -1
  33. package/dist/24.maestro-web-sdk.esm.js.map +1 -1
  34. package/dist/25.maestro-web-sdk.esm.js +1 -1
  35. package/dist/25.maestro-web-sdk.esm.js.map +1 -1
  36. package/dist/26.maestro-web-sdk.esm.js +1 -1
  37. package/dist/26.maestro-web-sdk.esm.js.map +1 -1
  38. package/dist/27.maestro-web-sdk.esm.js +1 -1
  39. package/dist/27.maestro-web-sdk.esm.js.map +1 -1
  40. package/dist/28.maestro-web-sdk.esm.js +1 -1
  41. package/dist/28.maestro-web-sdk.esm.js.map +1 -1
  42. package/dist/29.maestro-web-sdk.esm.js +1 -1
  43. package/dist/29.maestro-web-sdk.esm.js.map +1 -1
  44. package/dist/3.maestro-web-sdk.esm.js +1 -1
  45. package/dist/3.maestro-web-sdk.esm.js.map +1 -1
  46. package/dist/30.maestro-web-sdk.esm.js +1 -1
  47. package/dist/30.maestro-web-sdk.esm.js.map +1 -1
  48. package/dist/31.maestro-web-sdk.esm.js +1 -1
  49. package/dist/31.maestro-web-sdk.esm.js.map +1 -1
  50. package/dist/32.maestro-web-sdk.esm.js +1 -1
  51. package/dist/32.maestro-web-sdk.esm.js.map +1 -1
  52. package/dist/33.maestro-web-sdk.esm.js +1 -1
  53. package/dist/33.maestro-web-sdk.esm.js.map +1 -1
  54. package/dist/34.maestro-web-sdk.esm.js +1 -1
  55. package/dist/34.maestro-web-sdk.esm.js.map +1 -1
  56. package/dist/35.maestro-web-sdk.esm.js +1 -1
  57. package/dist/35.maestro-web-sdk.esm.js.map +1 -1
  58. package/dist/36.maestro-web-sdk.esm.js +1 -1
  59. package/dist/36.maestro-web-sdk.esm.js.map +1 -1
  60. package/dist/37.maestro-web-sdk.esm.js +1 -1
  61. package/dist/37.maestro-web-sdk.esm.js.map +1 -1
  62. package/dist/38.maestro-web-sdk.esm.js +1 -1
  63. package/dist/38.maestro-web-sdk.esm.js.map +1 -1
  64. package/dist/39.maestro-web-sdk.esm.js +2 -0
  65. package/dist/39.maestro-web-sdk.esm.js.map +1 -0
  66. package/dist/4.maestro-web-sdk.esm.js +1 -1
  67. package/dist/4.maestro-web-sdk.esm.js.map +1 -1
  68. package/dist/40.maestro-web-sdk.esm.js +2 -0
  69. package/dist/40.maestro-web-sdk.esm.js.map +1 -0
  70. package/dist/5.maestro-web-sdk.esm.js +1 -1
  71. package/dist/5.maestro-web-sdk.esm.js.map +1 -1
  72. package/dist/6.maestro-web-sdk.esm.js +1 -1
  73. package/dist/6.maestro-web-sdk.esm.js.map +1 -1
  74. package/dist/7.maestro-web-sdk.esm.js +1 -1
  75. package/dist/7.maestro-web-sdk.esm.js.map +1 -1
  76. package/dist/8.maestro-web-sdk.esm.js +1 -1
  77. package/dist/8.maestro-web-sdk.esm.js.map +1 -1
  78. package/dist/9.maestro-web-sdk.esm.js +1 -1
  79. package/dist/9.maestro-web-sdk.esm.js.map +1 -1
  80. package/dist/index.d.ts +4 -1
  81. package/dist/maestro-web-sdk.esm.js +3 -3
  82. package/dist/maestro-web-sdk.esm.js.map +1 -1
  83. package/dist/maestro-web-sdk.umd.js +3 -3
  84. package/dist/maestro-web-sdk.umd.js.map +1 -1
  85. package/dist/package.json +1 -1
  86. package/dist/src/components/atoms/SvgIcon/AddIcon.d.ts +3 -0
  87. package/dist/src/components/atoms/SvgIcon/AddIcon.js +6 -0
  88. package/dist/src/components/atoms/SvgIcon/Icon.js +2 -0
  89. package/dist/src/components/core/PanelManager/PanelManager.js +5 -3
  90. package/dist/src/components/molecules/NetworkDialog/NetworkDialog.d.ts +11 -0
  91. package/dist/src/components/molecules/NetworkDialog/NetworkDialog.js +34 -0
  92. package/dist/src/components/molecules/NetworkDialog/index.d.ts +2 -0
  93. package/dist/src/components/molecules/NetworkDialog/index.js +2 -0
  94. package/dist/src/components/molecules/NetworkError/NetworkError.d.ts +104 -0
  95. package/dist/src/components/molecules/NetworkError/NetworkError.js +26 -0
  96. package/dist/src/components/molecules/NetworkError/index.d.ts +2 -0
  97. package/dist/src/components/molecules/NetworkError/index.js +2 -0
  98. package/dist/src/components/molecules/PanelNavButton/PanelNavButton.d.ts +1 -0
  99. package/dist/src/components/molecules/PanelNavButton/PanelNavButton.js +16 -7
  100. package/dist/src/components/organisms/PanelNavigation/PanelNavigation.d.ts +1 -0
  101. package/dist/src/components/organisms/PanelNavigation/PanelNavigation.js +11 -7
  102. package/dist/src/development/MaestroEventDelegate.js +1 -0
  103. package/dist/src/helpers/site.d.ts +1 -0
  104. package/dist/src/helpers/site.js +6 -0
  105. package/dist/src/helpers/siteConfig.d.ts +1 -0
  106. package/dist/src/helpers/siteConfig.js +5 -0
  107. package/dist/src/models/IPanel.d.ts +1 -1
  108. package/dist/src/models/IPanel.js +1 -1
  109. package/dist/src/modules/espn/bets/services/BetsService.js +5 -5
  110. package/dist/src/modules/espn/bets/view/BetsView.js +1 -1
  111. package/dist/src/modules/espn/components/TabLoadError/TabLoadError.d.ts +96 -0
  112. package/dist/src/modules/espn/components/TabLoadError/TabLoadError.js +14 -0
  113. package/dist/src/modules/espn/components/TabLoadError/index.d.ts +2 -0
  114. package/dist/src/modules/espn/components/TabLoadError/index.js +2 -0
  115. package/dist/src/modules/espn/fantasy/components/TournamentOverflowQR/TournamentOverflowQR.d.ts +5 -5
  116. package/dist/src/modules/espn/fantasy/components/TournamentOverflowQR/TournamentOverflowQR.js +7 -73
  117. package/dist/src/modules/espn/fantasy/services/FantasyService.js +4 -1
  118. package/dist/src/modules/espn/fantasy/view/FantasyItemView.js +1 -1
  119. package/dist/src/modules/espn/fantasy/view/FantasyView.js +3 -2
  120. package/dist/src/modules/espn/fantasy/view-model/FantasyViewModel.FantasyPolling.d.ts +1 -1
  121. package/dist/src/modules/espn/fantasy/view-model/FantasyViewModel.FantasyPolling.js +10 -7
  122. package/dist/src/modules/espn/fantasy/view-model/FantasyViewModel.LeagueManagerPolling.d.ts +1 -1
  123. package/dist/src/modules/espn/fantasy/view-model/FantasyViewModel.LeagueManagerPolling.js +10 -7
  124. package/dist/src/modules/espn/fantasy/view-model/FantasyViewModel.TournamentPolling.d.ts +1 -1
  125. package/dist/src/modules/espn/fantasy/view-model/FantasyViewModel.TournamentPolling.js +10 -7
  126. package/dist/src/modules/espn/fantasy/view-model/FantasyViewModel.d.ts +1 -0
  127. package/dist/src/modules/espn/fantasy/view-model/FantasyViewModel.js +42 -32
  128. package/dist/src/modules/espn/key-plays/view/KeyPlayErrorStateView.js +1 -1
  129. package/dist/src/modules/espn/shop/services/ShopService.js +1 -1
  130. package/dist/src/modules/espn/shop/view/ShopView.js +1 -1
  131. package/dist/src/modules/espn/stats/services/StatsService.js +2 -2
  132. package/dist/src/modules/espn/stats/view/StatsView.js +1 -1
  133. package/dist/src/modules/fox/components/TabLoadError/TabLoadError.d.ts +96 -0
  134. package/dist/src/modules/fox/components/TabLoadError/TabLoadError.js +19 -0
  135. package/dist/src/modules/fox/components/TabLoadError/index.d.ts +2 -0
  136. package/dist/src/modules/fox/components/TabLoadError/index.js +2 -0
  137. package/dist/src/modules/fox/multi-view/interfaces/IMultiViewViewModel.d.ts +3 -0
  138. package/dist/src/modules/fox/multi-view/interfaces/IMultiViewViewModel.js +1 -0
  139. package/dist/src/modules/fox/multi-view/services/MultiViewService.d.ts +104 -0
  140. package/dist/src/modules/fox/multi-view/services/MultiViewService.js +97 -0
  141. package/dist/src/modules/fox/multi-view/types.d.ts +48 -42
  142. package/dist/src/modules/fox/multi-view/types.js +79 -82
  143. package/dist/src/modules/fox/multi-view/view/BuildYourOwn/BuildYourOwn.d.ts +7 -0
  144. package/dist/src/modules/fox/multi-view/view/BuildYourOwn/BuildYourOwn.js +99 -0
  145. package/dist/src/modules/fox/multi-view/view/BuildYourOwn/index.d.ts +2 -0
  146. package/dist/src/modules/fox/multi-view/view/BuildYourOwn/index.js +2 -0
  147. package/dist/src/modules/fox/multi-view/view/CuratedMultiview/CuratedMultiviews.d.ts +8 -0
  148. package/dist/src/modules/fox/multi-view/view/CuratedMultiview/CuratedMultiviews.js +92 -0
  149. package/dist/src/modules/fox/multi-view/view/CuratedMultiview/index.d.ts +2 -0
  150. package/dist/src/modules/fox/multi-view/view/CuratedMultiview/index.js +2 -0
  151. package/dist/src/modules/fox/multi-view/view/FoxMultiView.d.ts +1 -0
  152. package/dist/src/modules/fox/multi-view/view/FoxMultiView.js +65 -2
  153. package/dist/src/modules/fox/multi-view/view/components/BuildYourOwnTabs/BuildYourOwnTabs.d.ts +8 -0
  154. package/dist/src/modules/fox/multi-view/view/components/BuildYourOwnTabs/BuildYourOwnTabs.js +30 -0
  155. package/dist/src/modules/fox/multi-view/view/components/BuildYourOwnTabs/index.d.ts +2 -0
  156. package/dist/src/modules/fox/multi-view/view/components/BuildYourOwnTabs/index.js +2 -0
  157. package/dist/src/modules/fox/multi-view/view/components/CustomMultiviewStreamsCard/CustomMultiviewStreamsCard.d.ts +118 -0
  158. package/dist/src/modules/fox/multi-view/view/components/CustomMultiviewStreamsCard/CustomMultiviewStreamsCard.js +51 -0
  159. package/dist/src/modules/fox/multi-view/view/components/CustomMultiviewStreamsCard/index.d.ts +2 -0
  160. package/dist/src/modules/fox/multi-view/view/components/CustomMultiviewStreamsCard/index.js +2 -0
  161. package/dist/src/modules/fox/multi-view/view/components/LayoutSelector/LayoutSelector.d.ts +1 -1
  162. package/dist/src/modules/fox/multi-view/view/components/LayoutSelector/LayoutSelector.js +11 -14
  163. package/dist/src/modules/fox/multi-view/view/components/curated-multiview-card/CuratedMultiviewCard.d.ts +101 -0
  164. package/dist/src/modules/fox/multi-view/view/components/curated-multiview-card/CuratedMultiviewCard.js +41 -0
  165. package/dist/src/modules/fox/multi-view/view/components/curated-multiview-card/index.d.ts +2 -0
  166. package/dist/src/modules/fox/multi-view/view/components/curated-multiview-card/index.js +2 -0
  167. package/dist/src/modules/fox/multi-view/view-model/MultiViewViewModel.d.ts +84 -0
  168. package/dist/src/modules/fox/multi-view/view-model/MultiViewViewModel.js +509 -0
  169. package/dist/src/modules/fox/multi-view/view-model/index.d.ts +1 -0
  170. package/dist/src/modules/fox/multi-view/view-model/index.js +1 -0
  171. package/dist/src/services/NetworkManager/NetworkManager.js +1 -1
  172. package/dist/src/services/NetworkManager/errors.d.ts +3 -1
  173. package/dist/src/services/NetworkManager/errors.js +15 -1
  174. package/dist/src/services/StaticService/StaticService.js +1 -0
  175. package/dist/src/view-models/MaestroEventViewModel.d.ts +2 -0
  176. package/dist/src/view-models/MaestroEventViewModel.js +17 -1
  177. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack:///./src/helpers/strings.ts","webpack:///./src/modules/espn/shop/types.ts","webpack:///./src/modules/espn/shop/services/ShopService.ts","webpack:///./src/modules/espn/shop/mocks.ts","webpack:///./src/modules/espn/shop/view-model/ShopViewModel.ShopPolling.ts","webpack:///./src/modules/espn/shop/view-model/ShopViewModel.ts"],"names":["slugify","str","toLowerCase","trim","replace","stringHashCode","hash","i","length","charCodeAt","isShopProduct","item","type","ShopService","constructor","eventId","_defineProperty","this","networkManager","NetworkManager","externalBaseURL","pollShopData","interval","onData","onError","pollExternalApiRequestWithHeaders","endpoint","method","HttpMethod","GET","params","headers","MOCK_SHOP_NFL_RESPONSE","shop","sections","title","items","name","image","href","price","displayRetail","detail","qrCode","link","text","displaySale","caption","displayClearance","MOCK_SHOP_NBA_RESPONSE","MOCK_SHOP_NCF_RESPONSE","MOCK_SHOP_EMPTY_RESPONSE","defaultItem","disclaimer","backgroundImage","MOCK_SHOP_SINGLE_SECTION_RESPONSE","ShopPolling","service","task","lastResponseHash","shopService","refresh","callback","stop","start","polling","removeLastResponseHash","response","updateInterval","processPolledData","data","error","handlePollingError","captureException","context","console","headerInterval","getResponseHeaderPollingIntervalValue","log","newInterval","parsedInterval","parseInt","isNaN","warn","responseHash","JSON","stringify","extra","pollingInterval","ShopViewModel","ViewModel","analyticsService","options","super","Observable","shopPolling","useMockData","mockDataType","init","trackPanelView","fetchNewData","initialized","cleanup","_SDK$getMaestroEventV","gameState","SDK","getMaestroEventViewModel","statsViewModel","currentGameState","value","panelView","game_state","parsePriceToNumber","priceString","cleaned","lastComma","lastIndexOf","lastDot","normalized","Number","card","section","_SDK$getMaestroEventV2","_section$product","_section$product2","_section$product3","sale","_item$price","_item$price2","_item$price3","_item$price4","basePrice","currentPrice","basePriceNumber","salePriceNumber","Math","round","panelClick","metadata","product","id","entity_type","entity_name","shortDisplayName","refreshPolling","processShopData","bind","err","setTabLoadFailure","_data$shop","errorState","promoData","hasEverSuccessfullyLoaded","isDataLoading","fetchMockData","mockData","clearTabLoadFailure","setTimeout"],"mappings":"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","file":"10.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","/**\n * Shop module type definitions\n * Based on ESPN Shop API structure\n */\n\n/**\n * Image reference\n */\nexport interface IShopImage {\n /** Image URL */\n href?: string;\n /** Image width */\n width?: number;\n /** Image height */\n height?: number;\n}\n\n/**\n * Logo reference (same structure as image)\n */\nexport interface IShopLogo {\n /** Logo URL */\n href?: string;\n /** Logo width */\n width?: number;\n /** Logo height */\n height?: number;\n}\n\n/**\n * Link reference\n */\nexport interface IShopLink {\n /** Link URL */\n href?: string;\n /** Link text */\n text?: string;\n /** Link relations (e.g., [\"ictv\", \"fanatics\", \"index\", \"team\"]) */\n rel?: string[];\n}\n\n/**\n * Price information for a product\n */\nexport interface IShopPrice {\n /** Retail price display string (e.g., \"$29.99\") */\n displayRetail?: string;\n /** Sale price display string (e.g., \"$19.99\") - optional */\n displaySale?: string;\n /** Clearance price display string (e.g., \"$14.99\") - optional */\n displayClearance?: string;\n}\n\n/**\n * Product detail information shown in detail view\n */\nexport interface IShopDetail {\n /** Title for the detail view */\n title?: string;\n /** Description (optional, used for browse cards) */\n description?: string;\n /** Link information */\n link?: IShopLink;\n /** Background image URL */\n backgroundImage?: string;\n /** QR code image URL */\n qrCode?: string;\n /** Disclaimer text */\n disclaimer?: string;\n}\n\n/**\n * Product item in a shop section\n */\nexport interface IShopProduct {\n /** Item type discriminator */\n type?: 'product';\n /** Product name */\n name?: string;\n /** Product image */\n image?: IShopImage;\n /** Price information */\n price?: IShopPrice;\n /** Detail view information */\n detail?: IShopDetail;\n}\n\n/**\n * Browse card item (Want More?) in a shop section\n */\nexport interface IShopBrowseCard {\n /** Item type discriminator */\n type?: 'browse';\n /** Browse card name */\n name?: string;\n /** Caption text (e.g., \"Browse all Canadiens merch\") */\n caption?: string;\n /** Team/League/Event logo */\n image?: IShopImage;\n /** Detail view information */\n detail?: IShopDetail;\n}\n\n/**\n * Union type for all shop items\n */\nexport type IShopItem = IShopProduct | IShopBrowseCard;\n\n/**\n * Section product information (team/league info)\n */\nexport interface IShopSectionProduct {\n /** Product/Team ID */\n id?: string;\n /** Short display name (e.g., \"Canadiens\") */\n shortDisplayName?: string;\n /** Logo reference */\n logo?: IShopLogo;\n /** Type (e.g., \"team\") */\n type?: string;\n /** Link information */\n link?: IShopLink;\n /** Background image URL */\n backgroundImage?: string;\n}\n\n/**\n * Shop section containing a title and list of items\n */\nexport interface IShopSection {\n /** Section title (e.g., \"Shop Canadiens Merch\") */\n title?: string;\n /** Section product/team information */\n product?: IShopSectionProduct;\n /** Array of products or browse cards */\n items?: IShopItem[];\n}\n\nexport type IShopDefaultItem = {\n image?: {\n href?: string;\n width?: number;\n height?: number;\n };\n type?: string;\n detail?: {\n title?: string;\n link?: {\n href?: string;\n text?: string;\n };\n backgroundImage?: string;\n qrCode?: string;\n disclaimer?: string;\n };\n};\n\n/**\n * Shop container with sections\n */\nexport interface IShopContainer {\n /** Array of shop sections */\n sections?: IShopSection[];\n defaultItem?: IShopDefaultItem;\n}\n\n/**\n * Main shop API response\n */\nexport interface IShopResponse {\n /** Array of shop containers (typically one) */\n shop?: IShopContainer[];\n}\n\nexport const isShopProduct = (item: IShopItem): item is IShopProduct => {\n return item.type === 'product';\n};\n\nexport interface IShopViewModel {\n cleanup(): void;\n}\n","import NetworkManager, {\n HttpMethod,\n} from '../../../../services/NetworkManager/NetworkManager';\nimport { IShopResponse } from '../types';\nimport { ResponseWithHeaders } from '../../../../services/NetworkManager/types';\n\n/**\n * Service for handling shop-related API calls\n */\nclass ShopService {\n public networkManager: NetworkManager;\n private eventId: string;\n\n constructor(eventId: string) {\n this.eventId = eventId;\n this.networkManager = new NetworkManager({\n externalBaseURL: 'https://site.api.espn.com',\n });\n }\n\n /**\n * Start polling shop data\n *\n * @param interval - The polling interval in milliseconds\n * @param onData - Callback for successful data fetch with headers\n * @param onError - Callback for errors\n * @returns Object with a stop function to stop polling\n */\n pollShopData(\n interval: number,\n onData: (data: ResponseWithHeaders<IShopResponse>) => void,\n onError?: (error: Error) => void\n ): { stop: () => void } {\n return this.networkManager.pollExternalApiRequestWithHeaders({\n endpoint: `/apis/site/v2/events/${this.eventId}/shop`,\n interval,\n method: HttpMethod.GET,\n params: {},\n headers: {},\n onData,\n onError,\n });\n }\n}\n\nexport default ShopService;\n","import { IShopResponse } from './types';\n\n/**\n * Mock shop data for NFL game with multiple sections\n * Covers: regular products, sale products, and browse card\n */\nexport const MOCK_SHOP_NFL_RESPONSE: IShopResponse = {\n shop: [\n {\n sections: [\n {\n title: 'Chiefs Shop',\n items: [\n {\n type: 'product',\n name:\n \"Men's Kansas City Chiefs Patrick Mahomes Nike Red Game Player Jersey\",\n image: {\n href:\n 'https://fanatics.frgimages.com/kansas-city-chiefs/mens-kansas-city-chiefs-patrick-mahomes-nike-red-game-player-jersey_pi3453000_ff_3453170-8a4fb50f27b4aacd8c3b_full.jpg',\n },\n price: {\n displayRetail: '$119.99',\n },\n detail: {\n title: 'Chiefs Shop',\n qrCode:\n 'https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=https://fanatics.com/chiefs-mahomes-jersey',\n link: {\n href: 'https://fanatics.com/chiefs-mahomes-jersey',\n text: 'Scan to shop',\n },\n },\n },\n {\n type: 'product',\n name:\n 'Kansas City Chiefs New Era 2024 AFC Conference Champions Locker Room 9FORTY Adjustable Hat - Red',\n image: {\n href:\n 'https://fanatics.frgimages.com/kansas-city-chiefs/kansas-city-chiefs-new-era-2024-afc-conference-champions-locker-room-9forty-adjustable-hat-red_pi5595000_ff_5595784_full.jpg',\n },\n price: {\n displayRetail: '$34.99',\n displaySale: '$24.99',\n },\n detail: {\n title: 'Chiefs Shop',\n qrCode:\n 'https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=https://fanatics.com/chiefs-hat',\n link: {\n href: 'https://fanatics.com/chiefs-hat',\n text: 'Scan to shop',\n },\n },\n },\n {\n type: 'browse',\n name: 'Want More?',\n caption: 'Browse all Chiefs merch',\n image: {\n href: 'https://a.espncdn.com/i/teamlogos/nfl/500/kc.png',\n },\n detail: {\n title: 'Chiefs Shop',\n qrCode:\n 'https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=https://fanatics.com/chiefs',\n link: {\n href: 'https://fanatics.com/chiefs',\n text: 'Scan to browse all',\n },\n },\n },\n ],\n },\n {\n title: '49ers Shop',\n items: [\n {\n type: 'product',\n name:\n \"Men's San Francisco 49ers Brock Purdy Nike Scarlet Game Player Jersey\",\n image: {\n href:\n 'https://fanatics.frgimages.com/san-francisco-49ers/mens-san-francisco-49ers-brock-purdy-nike-scarlet-game-player-jersey_pi5068000_ff_5068449_full.jpg',\n },\n price: {\n displayRetail: '$119.99',\n },\n detail: {\n title: '49ers Shop',\n qrCode:\n 'https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=https://fanatics.com/49ers-purdy-jersey',\n link: {\n href: 'https://fanatics.com/49ers-purdy-jersey',\n text: 'Scan to shop',\n },\n },\n },\n {\n type: 'product',\n name:\n \"Men's San Francisco 49ers George Kittle Nike Scarlet Game Player Jersey\",\n image: {\n href:\n 'https://fanatics.frgimages.com/san-francisco-49ers/mens-san-francisco-49ers-george-kittle-nike-scarlet-game-player-jersey_pi4234000_ff_4234524_full.jpg',\n },\n price: {\n displayRetail: '$119.99',\n displayClearance: '$79.99',\n },\n detail: {\n title: '49ers Shop',\n qrCode:\n 'https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=https://fanatics.com/49ers-kittle-jersey',\n link: {\n href: 'https://fanatics.com/49ers-kittle-jersey',\n text: 'Scan to shop',\n },\n },\n },\n {\n type: 'browse',\n name: 'Want More?',\n caption: 'Browse all 49ers merch',\n image: {\n href: 'https://a.espncdn.com/i/teamlogos/nfl/500/sf.png',\n },\n detail: {\n title: '49ers Shop',\n qrCode:\n 'https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=https://fanatics.com/49ers',\n link: {\n href: 'https://fanatics.com/49ers',\n text: 'Scan to browse all',\n },\n },\n },\n ],\n },\n {\n title: 'NFL Shop',\n items: [\n {\n type: 'product',\n name: 'NFL Nike Official Authentic Game Football',\n image: {\n href:\n 'https://fanatics.frgimages.com/nfl/nfl-nike-official-authentic-game-football_pi4759000_ff_4759291_full.jpg',\n },\n price: {\n displayRetail: '$99.99',\n },\n detail: {\n title: 'NFL Shop',\n qrCode:\n 'https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=https://fanatics.com/nfl-football',\n link: {\n href: 'https://fanatics.com/nfl-football',\n text: 'Scan to shop',\n },\n },\n },\n {\n type: 'browse',\n name: 'Want More?',\n caption: 'Browse all NFL merch',\n image: {\n href: 'https://a.espncdn.com/i/teamlogos/leagues/500/nfl.png',\n },\n detail: {\n title: 'NFL Shop',\n qrCode:\n 'https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=https://fanatics.com/nfl',\n link: {\n href: 'https://fanatics.com/nfl',\n text: 'Scan to browse all',\n },\n },\n },\n ],\n },\n ],\n },\n ],\n};\n\n/**\n * Mock shop data for NBA game\n */\nexport const MOCK_SHOP_NBA_RESPONSE: IShopResponse = {\n shop: [\n {\n sections: [\n {\n title: 'Lakers Shop',\n items: [\n {\n type: 'product',\n name:\n \"Men's Los Angeles Lakers LeBron James Nike Purple Swingman Jersey - Icon Edition\",\n image: {\n href:\n 'https://fanatics.frgimages.com/los-angeles-lakers/mens-los-angeles-lakers-lebron-james-nike-purple-swingman-jersey-icon-edition_pi4548000_ff_4548764_full.jpg',\n },\n price: {\n displayRetail: '$129.99',\n },\n detail: {\n title: 'Lakers Shop',\n qrCode:\n 'https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=https://fanatics.com/lakers-lebron-jersey',\n link: {\n href: 'https://fanatics.com/lakers-lebron-jersey',\n text: 'Scan to shop',\n },\n },\n },\n {\n type: 'product',\n name:\n \"Men's Los Angeles Lakers Anthony Davis Nike Gold Swingman Jersey - City Edition\",\n image: {\n href:\n 'https://fanatics.frgimages.com/los-angeles-lakers/mens-los-angeles-lakers-anthony-davis-nike-gold-swingman-jersey-city-edition_pi5129000_ff_5129446_full.jpg',\n },\n price: {\n displayRetail: '$129.99',\n },\n detail: {\n title: 'Lakers Shop',\n qrCode:\n 'https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=https://fanatics.com/lakers-davis-jersey',\n link: {\n href: 'https://fanatics.com/lakers-davis-jersey',\n text: 'Scan to shop',\n },\n },\n },\n {\n type: 'browse',\n name: 'Want More?',\n caption: 'Browse all Lakers merch',\n image: {\n href: 'https://a.espncdn.com/i/teamlogos/nba/500/lal.png',\n },\n detail: {\n title: 'Lakers Shop',\n qrCode:\n 'https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=https://fanatics.com/lakers',\n link: {\n href: 'https://fanatics.com/lakers',\n text: 'Scan to browse all',\n },\n },\n },\n ],\n },\n ],\n },\n ],\n};\n\n/**\n * Mock shop data for NCAA Football\n */\nexport const MOCK_SHOP_NCF_RESPONSE: IShopResponse = {\n shop: [\n {\n sections: [\n {\n title: 'Texas Football Shop',\n items: [\n {\n type: 'product',\n name: 'Texas Longhorns Champion University Tee - Burnt Orange',\n image: {\n href:\n 'https://fanatics.frgimages.com/texas-longhorns/texas-longhorns-champion-university-tee-burnt-orange_pi4892000_ff_4892615_full.jpg',\n },\n price: {\n displayRetail: '$34.99',\n },\n detail: {\n title: 'Texas Shop',\n qrCode:\n 'https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=https://fanatics.com/texas-tee',\n link: {\n href: 'https://fanatics.com/texas-tee',\n text: 'Scan to shop',\n },\n },\n },\n {\n type: 'browse',\n name: 'Want More?',\n caption: 'Browse all Texas merch',\n image: {\n href: 'https://a.espncdn.com/i/teamlogos/ncaa/500/251.png',\n },\n detail: {\n title: 'Texas Shop',\n qrCode:\n 'https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=https://fanatics.com/texas',\n link: {\n href: 'https://fanatics.com/texas',\n text: 'Scan to browse all',\n },\n },\n },\n ],\n },\n {\n title: 'Texas A&M Shop',\n items: [\n {\n type: 'product',\n name: 'Texas A&M Aggies New Era Maroon 9FORTY Adjustable Hat',\n image: {\n href:\n 'https://fanatics.frgimages.com/texas-am-aggies/texas-am-aggies-new-era-maroon-9forty-adjustable-hat_pi4156000_ff_4156429_full.jpg',\n },\n price: {\n displayRetail: '$29.99',\n },\n detail: {\n title: 'Texas A&M Shop',\n qrCode:\n 'https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=https://fanatics.com/texas-am-hat',\n link: {\n href: 'https://fanatics.com/texas-am-hat',\n text: 'Scan to shop',\n },\n },\n },\n {\n type: 'browse',\n name: 'Want More?',\n caption: 'Browse all Texas A&M merch',\n image: {\n href: 'https://a.espncdn.com/i/teamlogos/ncaa/500/245.png',\n },\n detail: {\n title: 'Texas A&M Shop',\n qrCode:\n 'https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=https://fanatics.com/texas-am',\n link: {\n href: 'https://fanatics.com/texas-am',\n text: 'Scan to browse all',\n },\n },\n },\n ],\n },\n ],\n },\n ],\n};\n\n/**\n * Mock shop data with empty sections\n */\nexport const MOCK_SHOP_EMPTY_RESPONSE: IShopResponse = {\n shop: [\n {\n sections: [],\n defaultItem: {\n detail: {\n disclaimer:\n 'Visit shop.espn.com to explore more products and exclusive offers.',\n title: 'Shop the ESPN Store',\n backgroundImage: 'https://placedog.net/568x704',\n },\n },\n },\n ],\n};\n\n/**\n * Mock shop data with single section\n */\nexport const MOCK_SHOP_SINGLE_SECTION_RESPONSE: IShopResponse = {\n shop: [\n {\n sections: [\n {\n title: 'Team Shop',\n items: [\n {\n type: 'product',\n name: 'Premium Team Jersey - Official Merchandise',\n image: {\n href:\n 'https://via.placeholder.com/400x400/0066cc/ffffff?text=Team+Jersey',\n },\n price: {\n displayRetail: '$89.99',\n },\n detail: {\n title: 'Team Shop',\n qrCode:\n 'https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=https://fanatics.com/team-jersey',\n link: {\n href: 'https://fanatics.com/team-jersey',\n text: 'Scan to shop',\n },\n },\n },\n {\n type: 'browse',\n name: 'Want More?',\n caption: 'Browse all team merch',\n image: {\n href:\n 'https://via.placeholder.com/400x400/0066cc/ffffff?text=Team+Logo',\n },\n detail: {\n title: 'Team Shop',\n qrCode:\n 'https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=https://fanatics.com/team',\n link: {\n href: 'https://fanatics.com/team',\n text: 'Scan to browse all',\n },\n },\n },\n ],\n },\n ],\n },\n ],\n};\n","import { captureException } from '@/sentry';\nimport ShopService from '@/modules/espn/shop/services/ShopService';\nimport { IShopResponse } from '../types';\nimport { stringHashCode } from '@/helpers/strings';\n\ntype Polling = {\n interval: number;\n task: { stop: () => void } | null;\n lastResponseHash: number | null;\n};\n\nconst DEFAULT_SHOP_POLLING_INTERVAL = 30000; // 30 seconds\n\nexport default class ShopPolling {\n private polling: Polling = {\n interval: DEFAULT_SHOP_POLLING_INTERVAL,\n task: null,\n lastResponseHash: null,\n };\n private shopService: ShopService;\n\n constructor(service: ShopService) {\n this.shopService = service;\n }\n\n /**\n * Refresh polling for shop data\n */\n refresh(callback: (data: IShopResponse) => void): void {\n // First stop any existing polling\n this.stop();\n\n // Start the poll loop\n this.start(callback);\n }\n\n /**\n * Stop polling for shop data\n */\n stop(): void {\n if (this.polling.task) {\n this.polling.task.stop();\n this.polling.task = null;\n }\n }\n\n removeLastResponseHash(): void {\n this.polling.lastResponseHash = null;\n }\n\n private start(callback: (data: IShopResponse) => void): void {\n try {\n this.polling.task = this.shopService.pollShopData(\n this.polling.interval,\n (response) => {\n this.updateInterval(response.headers, callback);\n this.processPolledData(response.data, callback);\n },\n (error) => this.handlePollingError(error)\n );\n } catch (error) {\n captureException(error, {\n context: 'ShopViewModel.pollShop',\n });\n console.error('[SHOP] Error setting up shop polling:', error);\n }\n }\n\n /**\n * @description Update polling interval checking either response header or panel config.\n * Refresh polling if necessary.\n */\n private updateInterval(\n headers: Record<string, string>,\n callback: (data: IShopResponse) => void\n ): void {\n const headerInterval = this.getResponseHeaderPollingIntervalValue(headers);\n\n // Only update if we have a valid new interval and it's different from current\n if (headerInterval && headerInterval !== this.polling.interval) {\n console.log(\n `[SHOP] Updating shop polling interval from ${this.polling.interval}ms to ${headerInterval}ms`\n );\n this.polling.interval = headerInterval;\n // Restart polling with the new interval\n this.refresh(callback);\n }\n }\n\n private getResponseHeaderPollingIntervalValue(\n headers: Record<string, string>\n ): number | null {\n const newInterval = headers['polling-interval'];\n if (!newInterval) {\n return null;\n }\n\n const parsedInterval = parseInt(newInterval, 10);\n if (isNaN(parsedInterval) || parsedInterval <= 0) {\n console.warn(\n `[SHOP] Invalid polling interval header received: ${newInterval}.`\n );\n return null;\n }\n\n return parsedInterval * 1000; // Convert seconds to milliseconds\n }\n\n /**\n * Process data received from polling\n */\n private processPolledData(\n data: IShopResponse,\n callback: (data: IShopResponse) => void\n ): void {\n // Calculate hash for the response to check if it's different from the last one\n const responseHash = stringHashCode(JSON.stringify(data));\n\n // Check if this is the same as the last successful response\n if (this.polling.lastResponseHash === responseHash) {\n console.log(\n '[SHOP] Shop Response hash is the same as last successful response - skipping update'\n );\n return;\n }\n\n this.polling.lastResponseHash = responseHash;\n callback(data);\n }\n\n /**\n * Handle errors that occur during shop polling\n */\n private handlePollingError(error: Error): void {\n console.error('[SHOP] Shop polling error:', error);\n\n captureException(error, {\n context: 'ShopViewModel.pollShop',\n extra: {\n pollingInterval: this.polling.interval,\n },\n });\n }\n}\n","import { Observable } from '../../../../helpers/Observable';\nimport ShopService from '../services/ShopService';\nimport AnalyticsService from '@/services/AnalyticsService/AnalyticsService';\nimport { ViewModel } from '../../../../view-models/ViewModel';\nimport {\n IShopResponse,\n IShopSection,\n IShopProduct,\n IShopBrowseCard,\n isShopProduct,\n IShopDefaultItem,\n} from '../types';\nimport {\n MOCK_SHOP_NFL_RESPONSE,\n MOCK_SHOP_NBA_RESPONSE,\n MOCK_SHOP_NCF_RESPONSE,\n MOCK_SHOP_EMPTY_RESPONSE,\n MOCK_SHOP_SINGLE_SECTION_RESPONSE,\n} from '../mocks';\n\nimport { captureException } from '@/sentry';\nimport ShopPolling from './ShopViewModel.ShopPolling';\nimport SDK from '@/index';\n\nconst SHOP_ERROR_STATE = {\n NONE: 'none',\n TAB_LOAD_FAILURE: 'tabLoadFailure',\n EMPTY_SHOP: 'emptyShop',\n} as const;\n\nexport type ShopErrorState = typeof SHOP_ERROR_STATE[keyof typeof SHOP_ERROR_STATE];\n\n/**\n * ViewModel for Shop panel\n * Manages shop data fetching, polling, and state\n */\nexport class ShopViewModel extends ViewModel {\n // Observable properties\n public sections = new Observable<IShopSection[]>([]);\n public isDataLoading = new Observable<boolean>(true);\n public errorState = new Observable<ShopErrorState>('none');\n public hasEverSuccessfullyLoaded = new Observable<boolean>(false);\n public promoData = new Observable<IShopDefaultItem | null>(null);\n\n // Properties\n private shopService: ShopService;\n private analyticsService: AnalyticsService;\n private shopPolling: ShopPolling;\n private useMockData: boolean = false;\n private mockDataType: string = 'nfl';\n initialized = false;\n\n constructor(\n eventId: string,\n analyticsService: AnalyticsService,\n options: {\n useMockData?: boolean;\n mockDataType?: 'nfl' | 'nba' | 'ncf' | 'empty' | 'single';\n } = {}\n ) {\n super();\n this.shopService = new ShopService(eventId);\n this.analyticsService = analyticsService;\n this.shopPolling = new ShopPolling(this.shopService);\n this.useMockData = options.useMockData || false;\n this.mockDataType = options.mockDataType || 'nfl';\n }\n\n /**\n * Initialize the ViewModel and start data fetching\n */\n init() {\n // Track panel view on initialization\n this.trackPanelView();\n\n this.fetchNewData();\n this.initialized = true;\n }\n\n /**\n * Clean up resources when the ViewModel is no longer needed\n */\n cleanup(): void {\n this.shopPolling.stop();\n this.initialized = false;\n }\n\n /**\n * Track panel view event\n */\n private async trackPanelView(): Promise<void> {\n try {\n const gameState =\n SDK.getMaestroEventViewModel().statsViewModel?.currentGameState.value ||\n 'unknown';\n\n await this.analyticsService.panelView('espnShop', {\n game_state: [gameState],\n });\n } catch (error) {\n captureException(error, {\n context: 'ShopViewModel.trackPanelView',\n });\n console.error('[SHOP] Error tracking panel view:', error);\n }\n }\n\n /**\n * Parse price string to number, handling currency formats\n */\n private parsePriceToNumber(priceString: string): number {\n // Remove currency symbols and spaces\n const cleaned = priceString.replace(/[^0-9.,]/g, '');\n\n // Find the last occurrence of comma or dot (decimal separator)\n const lastComma = cleaned.lastIndexOf(',');\n const lastDot = cleaned.lastIndexOf('.');\n\n let normalized: string;\n\n if (lastComma > lastDot) {\n // EU format: €1.234,56 -> comma is decimal separator\n normalized = cleaned.replace(/\\./g, '').replace(',', '.');\n } else if (lastDot > lastComma) {\n // US format: $1,234.56 -> dot is decimal separator\n normalized = cleaned.replace(/,/g, '');\n } else if (lastComma !== -1) {\n // Only comma present, assume decimal: €25,00\n normalized = cleaned.replace(',', '.');\n } else if (lastDot !== -1) {\n // Only dot present, assume decimal: $25.00\n normalized = cleaned;\n } else {\n // No separators: 25\n normalized = cleaned;\n }\n\n return Number(normalized) || 0;\n }\n\n /**\n * Track shop item card click event\n */\n async trackItemClick(\n card: 'product_summary' | 'want more' | 'product_detail' | 'fallback',\n item: IShopProduct | IShopBrowseCard | null,\n section: IShopSection | null\n ): Promise<void> {\n try {\n let sale = 0;\n let price: string | null = null;\n\n const gameState =\n SDK.getMaestroEventViewModel().statsViewModel?.currentGameState.value ||\n 'unknown';\n\n if (item && isShopProduct(item)) {\n const basePrice = item.price?.displayRetail;\n const currentPrice =\n item.price?.displayClearance ||\n item.price?.displaySale ||\n item.price?.displayRetail;\n\n if (currentPrice && basePrice) {\n const basePriceNumber = this.parsePriceToNumber(basePrice);\n const salePriceNumber = this.parsePriceToNumber(currentPrice);\n\n if (basePriceNumber > 0) {\n sale = Math.round((1 - salePriceNumber / basePriceNumber) * 100);\n } else {\n sale = 0;\n }\n price = currentPrice;\n }\n }\n\n await this.analyticsService.panelClick({\n type: 'espnShop',\n name: 'shop_item_clicked',\n metadata: {\n card: [card],\n game_state: [gameState],\n product: section?.product?.id || null,\n entity_type: [section?.product?.type || 'unknown'],\n entity_name: [section?.product?.shortDisplayName || 'unknown'],\n price,\n sale: [`${sale}%`],\n },\n });\n } catch (error) {\n captureException(error, {\n context: 'ShopViewModel.trackItemClick',\n item,\n section,\n });\n console.error('[SHOP] Error tracking shop item click:', error);\n }\n }\n\n /**\n * Refresh polling for shop data\n */\n refreshPolling(): void {\n try {\n if (this.useMockData) {\n return;\n }\n\n this.shopPolling.refresh(this.processShopData.bind(this));\n } catch (err) {\n this.setTabLoadFailure();\n }\n }\n\n /**\n * Process the shop data and update the sections\n */\n private processShopData(data: IShopResponse) {\n try {\n const shop = data.shop?.[0];\n const sections = shop?.sections || [];\n\n // Check if there are any sections\n if (!sections?.length && shop?.defaultItem) {\n this.errorState.value = 'emptyShop';\n this.sections.value = [];\n\n this.promoData.value = shop.defaultItem;\n return;\n }\n\n // Update sections and clear error state\n this.sections.value = sections;\n this.errorState.value = 'none';\n this.hasEverSuccessfullyLoaded.value = true;\n\n if (this.isDataLoading.value) {\n this.isDataLoading.value = false;\n }\n } catch (err) {\n captureException(err, {\n context: 'ShopViewModel.processShopData',\n });\n console.error('[SHOP] Error processing shop data:', err);\n this.setTabLoadFailure();\n }\n }\n\n setTabLoadFailure() {\n if (!this.hasEverSuccessfullyLoaded.value) {\n this.errorState.value = 'tabLoadFailure';\n this.sections.value = [];\n }\n\n if (this.isDataLoading.value) {\n this.isDataLoading.value = false;\n }\n }\n\n /**\n * Fetch new shop data immediately (one-time)\n */\n fetchNewData() {\n this.isDataLoading.value = true;\n\n try {\n // Handle mock data if enabled\n if (this.useMockData) {\n this.sections.value = [];\n this.fetchMockData();\n return;\n }\n\n this.refreshPolling();\n } catch (error) {\n captureException(error, {\n context: 'ShopViewModel.fetchNewData',\n });\n console.error('[SHOP] Error fetching shop data:', error);\n\n this.setTabLoadFailure();\n }\n }\n\n /**\n * Fetch mock data for testing\n */\n private fetchMockData() {\n let mockData: IShopResponse;\n\n switch (this.mockDataType) {\n case 'nba':\n mockData = MOCK_SHOP_NBA_RESPONSE;\n break;\n case 'ncf':\n mockData = MOCK_SHOP_NCF_RESPONSE;\n break;\n case 'empty':\n mockData = MOCK_SHOP_EMPTY_RESPONSE;\n break;\n case 'single':\n mockData = MOCK_SHOP_SINGLE_SECTION_RESPONSE;\n break;\n case 'nfl':\n default:\n mockData = MOCK_SHOP_NFL_RESPONSE;\n break;\n }\n\n this.processShopData(mockData);\n this.hasEverSuccessfullyLoaded.value = true;\n this.isDataLoading.value = false;\n }\n\n /**\n * Clear tab load failure and retry\n */\n clearTabLoadFailure() {\n this.errorState.value = 'none';\n this.shopPolling.removeLastResponseHash();\n setTimeout(() => {\n this.refreshPolling();\n }, 100);\n }\n}\n\nexport default ShopViewModel;\n"],"sourceRoot":""}
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","deviceType","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":"10.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: { deviceType: 'ictv' },\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: { deviceType: 'ictv' },\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":""}