@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,7 +1,7 @@
1
1
  /// <reference types="prop-types" />
2
2
  import React from 'react';
3
3
  import { WithFocusableProps } from '@/external/spatial-navigation';
4
- import { Direction, Layout } from '@/external/spatial-navigation/utils';
4
+ import { Layout } from '@/external/spatial-navigation/utils';
5
5
  import './TournamentOverflowQR.styles.css';
6
6
  import { TournamentOverflowQRItem } from '../../types';
7
7
  type Props = {
@@ -17,7 +17,7 @@ declare const _default: {
17
17
  parentFocusKey: string;
18
18
  };
19
19
  setFocus: (focusKey: string) => void;
20
- navigateByDirection: (direction: Direction, details?: import("@/external/spatial-navigation/utils").Details) => void;
20
+ navigateByDirection: (direction: import("@/external/spatial-navigation/utils").Direction, details?: import("@/external/spatial-navigation/utils").Details) => void;
21
21
  stealFocus: () => void;
22
22
  onUpdateFocus: (focused: boolean) => void;
23
23
  onUpdateHasFocusedChild: (hasFocusedChild: boolean) => void;
@@ -25,7 +25,7 @@ declare const _default: {
25
25
  onClickPressHandler: (details: import("@/external/spatial-navigation/utils").Details) => void;
26
26
  onEnterReleaseHandler: () => void;
27
27
  onBackPressHandler: (details: import("@/external/spatial-navigation/utils").Details) => void;
28
- onArrowPressHandler: (direction: Direction, details: import("@/external/spatial-navigation/utils").Details) => boolean | void;
28
+ onArrowPressHandler: (direction: import("@/external/spatial-navigation/utils").Direction, details: import("@/external/spatial-navigation/utils").Details) => boolean | void;
29
29
  onBecameFocusedHandler: (layout: Layout, details: import("@/external/spatial-navigation/utils").Details) => void;
30
30
  onBecameBlurredHandler: (layout: Layout, details: import("@/external/spatial-navigation/utils").Details) => void;
31
31
  componentDidMount(): void;
@@ -58,7 +58,7 @@ declare const _default: {
58
58
  parentFocusKey: string;
59
59
  };
60
60
  setFocus: (focusKey: string) => void;
61
- navigateByDirection: (direction: Direction, details?: import("@/external/spatial-navigation/utils").Details) => void;
61
+ navigateByDirection: (direction: import("@/external/spatial-navigation/utils").Direction, details?: import("@/external/spatial-navigation/utils").Details) => void;
62
62
  stealFocus: () => void;
63
63
  onUpdateFocus: (focused: boolean) => void;
64
64
  onUpdateHasFocusedChild: (hasFocusedChild: boolean) => void;
@@ -66,7 +66,7 @@ declare const _default: {
66
66
  onClickPressHandler: (details: import("@/external/spatial-navigation/utils").Details) => void;
67
67
  onEnterReleaseHandler: () => void;
68
68
  onBackPressHandler: (details: import("@/external/spatial-navigation/utils").Details) => void;
69
- onArrowPressHandler: (direction: Direction, details: import("@/external/spatial-navigation/utils").Details) => boolean | void;
69
+ onArrowPressHandler: (direction: import("@/external/spatial-navigation/utils").Direction, details: import("@/external/spatial-navigation/utils").Details) => boolean | void;
70
70
  onBecameFocusedHandler: (layout: Layout, details: import("@/external/spatial-navigation/utils").Details) => void;
71
71
  onBecameBlurredHandler: (layout: Layout, details: import("@/external/spatial-navigation/utils").Details) => void;
72
72
  componentDidMount(): void;
@@ -2,93 +2,27 @@ import React from 'react';
2
2
  import { withFocusable, } from '@/external/spatial-navigation';
3
3
  import './TournamentOverflowQR.styles.css';
4
4
  import Image from '@/components/atoms/Image';
5
- import ActionButton from '@/components/molecules/ActionButton';
6
- import SDK from '@/index';
7
5
  const FocusableWrapper = withFocusable()((props) => {
8
- const { children, focused = false, expanded, backgroundImage } = props;
9
- return (React.createElement("div", { className: "tournament-overflow-qr focus-ring T02", "data-focused": focused, "data-expanded": expanded, "data-focuskey": props.focusKey || '', role: "button", tabIndex: 0, style: {
6
+ const { children, focused = false, backgroundImage } = props;
7
+ return (React.createElement("div", { className: "tournament-overflow-qr focus-ring T02", "data-focused": focused, "data-focuskey": props.focusKey || '', role: "button", tabIndex: 0, style: {
10
8
  backgroundImage: `url(${backgroundImage})`,
11
- } }, children(focused)));
9
+ } }, children));
12
10
  });
13
11
  class TournamentOverflowQR extends React.Component {
14
- constructor() {
15
- super(...arguments);
16
- Object.defineProperty(this, "state", {
17
- enumerable: true,
18
- configurable: true,
19
- writable: true,
20
- value: {
21
- expanded: false,
22
- }
23
- });
24
- Object.defineProperty(this, "onDismissPress", {
25
- enumerable: true,
26
- configurable: true,
27
- writable: true,
28
- value: () => {
29
- this.setState({ expanded: false }, () => {
30
- SDK.getMaestroEventViewModel().navigation.setFocus(this.focusKey);
31
- });
32
- }
33
- });
34
- }
35
12
  get focusKey() {
36
13
  return `tournament-overflow-qr-${this.props.item.id}`;
37
14
  }
38
- onEnterPress() {
39
- const newValue = !this.state.expanded;
40
- this.setState({
41
- expanded: newValue,
42
- }, () => {
43
- if (newValue) {
44
- SDK.getMaestroEventViewModel().navigation.setFocus(`${this.focusKey}`);
45
- }
46
- });
47
- this.props.onEnterPress();
48
- }
49
- onArrowPress(direction) {
50
- if (this.state.expanded && (direction === 'up' || direction === 'down')) {
51
- this.setState({
52
- expanded: false,
53
- }, () => {
54
- SDK.getMaestroEventViewModel().navigation.navigateByDirection(direction);
55
- });
56
- return false;
57
- }
58
- return true;
59
- }
60
- onBackPress() {
61
- if (this.state.expanded) {
62
- this.setState({
63
- expanded: false,
64
- });
65
- return false;
66
- }
67
- return true;
68
- }
69
- renderCollapsedView() {
70
- const { item } = this.props;
71
- return (React.createElement(React.Fragment, null,
72
- React.createElement("div", { className: "tournament-overflow-qr-content" },
73
- React.createElement("p", { className: "tournament-overflow-qr-title T30 FONT_BOLD_HEADLINE" }, item.title),
74
- React.createElement("p", { className: "tournament-overflow-qr-subtitle T10 FONT_BOLD" }, item.description)),
75
- React.createElement(Image, { src: item.logo, alt: "Tournament Logo", className: "tournament-overflow-qr-logo-image" })));
76
- }
77
- renderExpandedView(focused) {
15
+ renderExpandedView() {
78
16
  const { item } = this.props;
79
17
  return (React.createElement("div", { className: "tournament-overflow-qr-expanded" },
80
18
  React.createElement(Image, { src: item.logo, alt: "Tournament Logo", className: "tournament-overflow-qr-expanded-logo" }),
81
19
  React.createElement("p", { className: "tournament-overflow-qr-expanded-title T20 FONT_BOLD" }, item.title),
82
- React.createElement(Image, { src: item.qrCode, alt: "QR Code", width: 250, height: 250, className: "tournament-overflow-qr-expanded-qr" }),
83
- React.createElement("p", { className: "tournament-overflow-qr-expanded-instructions T04 FONT_BOLD_HEADLINE" }, item.description),
84
- React.createElement(ActionButton, { onEnterPress: this.onDismissPress, focusKey: `${this.focusKey}-dismiss`, "data-focused": focused }, "Dismiss")));
20
+ React.createElement(Image, { src: item.qrCode, alt: "QR Code", width: 300, height: 300, className: "tournament-overflow-qr-expanded-qr" }),
21
+ React.createElement("p", { className: "tournament-overflow-qr-expanded-instructions T20 FONT_BOLD" }, item.description)));
85
22
  }
86
23
  render() {
87
24
  const { item } = this.props;
88
- const { expanded } = this.state;
89
- return (React.createElement(FocusableWrapper, { ...this.props, focusKey: this.focusKey, onEnterPress: this.onEnterPress.bind(this), onArrowPress: this.onArrowPress.bind(this), onBackPress: this.onBackPress.bind(this), expanded: expanded, backgroundImage: item.background }, (focused) => expanded
90
- ? this.renderExpandedView(focused)
91
- : this.renderCollapsedView()));
25
+ return (React.createElement(FocusableWrapper, { ...this.props, focusKey: this.focusKey, backgroundImage: item.background }, this.renderExpandedView()));
92
26
  }
93
27
  }
94
28
  export default withFocusable()(TournamentOverflowQR);
@@ -68,6 +68,7 @@ class FantasyService {
68
68
  featureFlags: 'challengeEntries',
69
69
  filterType: 'FANTASY_CTV',
70
70
  platform: 'fantasyictv_bbd',
71
+ deviceType: 'ictv',
71
72
  swid,
72
73
  eventId,
73
74
  },
@@ -85,6 +86,7 @@ class FantasyService {
85
86
  params: {
86
87
  view: 'ictv_scoreboard',
87
88
  platform: 'fantasyictv_bbd',
89
+ deviceType: 'ictv',
88
90
  proGameId,
89
91
  teamId,
90
92
  },
@@ -115,8 +117,9 @@ class FantasyService {
115
117
  },
116
118
  params: {
117
119
  competitionId,
118
- view: 'ictv_challenges',
120
+ view: 'ictv_scoreboard',
119
121
  platform: 'fantasyictv_bbd',
122
+ deviceType: 'ictv',
120
123
  },
121
124
  });
122
125
  }
@@ -37,7 +37,7 @@ const FantasyItemView = ({ item, onEnterPress: onEnterPressProp, }) => {
37
37
  case 'tournament-bracket-card':
38
38
  return (React.createElement(TournamentBracketCard, { key: item.id, item: item, onArrowPress: onArrowPress, onBecameFocused: onBecameFocused, onEnterPress: onEnterPress }));
39
39
  case 'tournament-overflow-qr':
40
- return (React.createElement(TournamentOverflowQR, { key: item.id, item: item, onEnterPress: onEnterPress, onBecameFocused: onBecameFocused }));
40
+ return (React.createElement(TournamentOverflowQR, { key: item.id, item: item, onArrowPress: onArrowPress, onEnterPress: onEnterPress, onBecameFocused: onBecameFocused }));
41
41
  default:
42
42
  console.warn('Unknown fantasy item type:', JSON.stringify(item));
43
43
  return null;
@@ -2,7 +2,7 @@ import React, { Component } from 'react';
2
2
  import './FantasyView.styles.css';
3
3
  import ScrollableContainer from '@/components/core/ScrollableContainer';
4
4
  import SDK from '@/index';
5
- import TabLoadErrorView from '@/components/molecules/TabLoadError';
5
+ import TabLoadErrorView from '../../components/TabLoadError';
6
6
  import { captureException } from '@/sentry';
7
7
  import FantasyItemView from './FantasyItemView';
8
8
  import FantasyHeaderView from './FantasyHeaderView';
@@ -203,9 +203,10 @@ class FantasyView extends Component {
203
203
  this.viewModel.cleanup();
204
204
  }
205
205
  render() {
206
+ const isError = this.state.errorState === 'tabLoadFailure';
206
207
  return (React.createElement(ScrollableContainer, { scrollableContainerRef: this.container, containerTopOffset: this.getMaxHeaderHeight() || 40, "data-has-error": this.state.errorState !== 'none' },
207
208
  React.createElement("div", { className: "fantasy-view", ref: this.setContainerRef },
208
- this.renderItems(),
209
+ isError ? (React.createElement(TabLoadErrorView, { onEnterPress: this.clearTabLoadFailure, onArrowPress: this.onArrowPress })) : (this.renderItems()),
209
210
  React.createElement("div", { className: "fantasy-bottom-padding" }))));
210
211
  }
211
212
  }
@@ -7,7 +7,7 @@ export default class FantasyPolling {
7
7
  /**
8
8
  * Refresh polling for fantasy data
9
9
  */
10
- refresh(params: FantasyPollingParams, callback: (data: IFantasyResponse) => void): Promise<void>;
10
+ refresh(params: FantasyPollingParams, callback: (data: IFantasyResponse) => void, errorCallback: (error: Error) => void): Promise<void>;
11
11
  /**
12
12
  * Stop polling for fantasy data
13
13
  */
@@ -25,11 +25,11 @@ export default class FantasyPolling {
25
25
  /**
26
26
  * Refresh polling for fantasy data
27
27
  */
28
- async refresh(params, callback) {
28
+ async refresh(params, callback, errorCallback) {
29
29
  // First stop any existing polling
30
30
  this.stop();
31
31
  // Start the poll loop
32
- await this.start(params, callback);
32
+ await this.start(params, callback, errorCallback);
33
33
  }
34
34
  /**
35
35
  * Stop polling for fantasy data
@@ -43,12 +43,15 @@ export default class FantasyPolling {
43
43
  removeLastResponseHash() {
44
44
  this.polling.lastResponseHash = null;
45
45
  }
46
- async start(params, callback) {
46
+ async start(params, callback, errorCallback) {
47
47
  try {
48
48
  this.polling.task = this.fantasyService.pollFantasy(params, this.polling.interval, (response) => {
49
- this.updateInterval(params, response.headers, callback);
49
+ this.updateInterval(params, response.headers, callback, errorCallback);
50
50
  this.processPolledData(response.data, callback);
51
- }, (error) => this.handlePollingError(error, params.swid));
51
+ }, (error) => {
52
+ this.handlePollingError(error, params.swid);
53
+ errorCallback(error);
54
+ });
52
55
  }
53
56
  catch (error) {
54
57
  captureException(error, {
@@ -61,7 +64,7 @@ export default class FantasyPolling {
61
64
  * @description Update polling interval checking either response header or panel config.
62
65
  * Refresh polling if necessary.
63
66
  */
64
- updateInterval(params, headers, callback) {
67
+ updateInterval(params, headers, callback, errorCallback) {
65
68
  const headerInterval = this.getResponseHeaderPollingIntervalValue(headers);
66
69
  const panelConfigInterval = this.getPanelConfigInterval();
67
70
  const newInterval = headerInterval || panelConfigInterval; // order matters here
@@ -70,7 +73,7 @@ export default class FantasyPolling {
70
73
  console.log(`[Fantasy] Updating fantasy polling interval from ${this.polling.interval}ms to ${newInterval}ms`);
71
74
  this.polling.interval = newInterval;
72
75
  // Restart polling with the new interval
73
- this.refresh(params, callback);
76
+ this.refresh(params, callback, errorCallback);
74
77
  }
75
78
  }
76
79
  getResponseHeaderPollingIntervalValue(headers) {
@@ -7,7 +7,7 @@ export default class LeagueManagerPolling {
7
7
  /**
8
8
  * Refresh polling for league manager data
9
9
  */
10
- refresh(key: string, params: LeagueManagerPollingParams, callback: (data: ILeagueManagerResponse | ILeagueManagerRotoResponse) => void): void;
10
+ refresh(key: string, params: LeagueManagerPollingParams, callback: (data: ILeagueManagerResponse | ILeagueManagerRotoResponse) => void, errorCallback: (error: Error) => void): void;
11
11
  /**
12
12
  * Stop polling for fantasy data
13
13
  */
@@ -21,7 +21,7 @@ export default class LeagueManagerPolling {
21
21
  /**
22
22
  * Refresh polling for league manager data
23
23
  */
24
- refresh(key, params, callback) {
24
+ refresh(key, params, callback, errorCallback) {
25
25
  // First stop any existing polling
26
26
  this.stop(key);
27
27
  // Initialize polling state if it doesn't exist
@@ -33,7 +33,7 @@ export default class LeagueManagerPolling {
33
33
  };
34
34
  }
35
35
  // Start the poll loop
36
- this.start(key, params, callback);
36
+ this.start(key, params, callback, errorCallback);
37
37
  }
38
38
  /**
39
39
  * Stop polling for fantasy data
@@ -44,12 +44,15 @@ export default class LeagueManagerPolling {
44
44
  this.polling[key].task = null;
45
45
  }
46
46
  }
47
- start(key, params, callback) {
47
+ start(key, params, callback, errorCallback) {
48
48
  try {
49
49
  this.polling[key].task = this.fantasyService.pollLeagueManager(params, this.polling[key].interval, (response) => {
50
- this.updateInterval(key, params, callback, response.headers);
50
+ this.updateInterval(key, params, callback, response.headers, errorCallback);
51
51
  this.processPolledData(key, response.data, callback);
52
- }, (error) => this.handlePollingError(error, key, params));
52
+ }, (error) => {
53
+ this.handlePollingError(error, key, params);
54
+ errorCallback(error);
55
+ });
53
56
  }
54
57
  catch (error) {
55
58
  captureException(error, {
@@ -76,7 +79,7 @@ export default class LeagueManagerPolling {
76
79
  * @description Update polling interval checking either response header or panel config.
77
80
  * Refresh polling if necessary.
78
81
  */
79
- updateInterval(key, params, callback, headers) {
82
+ updateInterval(key, params, callback, headers, errorCallback) {
80
83
  const headerInterval = this.getResponseHeaderPollingIntervalValue(headers);
81
84
  const panelConfigInterval = this.getPanelConfigInterval();
82
85
  const newInterval = headerInterval || panelConfigInterval; // order matters here
@@ -85,7 +88,7 @@ export default class LeagueManagerPolling {
85
88
  console.log(`[Fantasy] Updating league manager polling interval from ${this.polling[key]?.interval}ms to ${newInterval}ms`);
86
89
  this.polling[key].interval = newInterval;
87
90
  // Restart polling with the new interval
88
- this.refresh(key, params, callback);
91
+ this.refresh(key, params, callback, errorCallback);
89
92
  }
90
93
  }
91
94
  getResponseHeaderPollingIntervalValue(headers) {
@@ -7,7 +7,7 @@ export default class TournamentPolling {
7
7
  /**
8
8
  * Refresh polling for tournament challenge data
9
9
  */
10
- refresh(key: string, params: TournamentChallengePollingParams, callback: (data: TournamentChallenge) => void): void;
10
+ refresh(key: string, params: TournamentChallengePollingParams, callback: (data: TournamentChallenge) => void, errorCallback: (error: Error) => void): void;
11
11
  /**
12
12
  * Stop polling for tournament challenge data
13
13
  */
@@ -21,7 +21,7 @@ export default class TournamentPolling {
21
21
  /**
22
22
  * Refresh polling for tournament challenge data
23
23
  */
24
- refresh(key, params, callback) {
24
+ refresh(key, params, callback, errorCallback) {
25
25
  // First stop any existing polling
26
26
  this.stop(key);
27
27
  // Initialize polling state if it doesn't exist
@@ -33,7 +33,7 @@ export default class TournamentPolling {
33
33
  };
34
34
  }
35
35
  // Start the poll loop
36
- this.start(key, params, callback);
36
+ this.start(key, params, callback, errorCallback);
37
37
  }
38
38
  /**
39
39
  * Stop polling for tournament challenge data
@@ -44,12 +44,15 @@ export default class TournamentPolling {
44
44
  this.polling[key].task = null;
45
45
  }
46
46
  }
47
- start(key, params, callback) {
47
+ start(key, params, callback, errorCallback) {
48
48
  try {
49
49
  this.polling[key].task = this.fantasyService.pollTournamentChallenge(params, this.polling[key].interval, (response) => {
50
- this.updateInterval(key, params, callback, response.headers);
50
+ this.updateInterval(key, params, callback, response.headers, errorCallback);
51
51
  this.processPolledData(key, response.data, callback);
52
- }, (error) => this.handlePollingError(error, key, params));
52
+ }, (error) => {
53
+ this.handlePollingError(error, key, params);
54
+ errorCallback(error);
55
+ });
53
56
  }
54
57
  catch (error) {
55
58
  captureException(error, {
@@ -62,7 +65,7 @@ export default class TournamentPolling {
62
65
  * @description Update polling interval checking either response header or panel config.
63
66
  * Refresh polling if necessary.
64
67
  */
65
- updateInterval(key, params, callback, headers) {
68
+ updateInterval(key, params, callback, headers, errorCallback) {
66
69
  const headerInterval = this.getResponseHeaderPollingIntervalValue(headers);
67
70
  const panelConfigInterval = this.getPanelConfigInterval();
68
71
  const newInterval = headerInterval || panelConfigInterval; // order matters here
@@ -71,7 +74,7 @@ export default class TournamentPolling {
71
74
  console.log(`[TOURNAMENT] Updating tournament polling interval from ${this.polling[key]?.interval}ms to ${newInterval}ms`);
72
75
  this.polling[key].interval = newInterval;
73
76
  // Restart polling with the new interval
74
- this.refresh(key, params, callback);
77
+ this.refresh(key, params, callback, errorCallback);
75
78
  }
76
79
  }
77
80
  getResponseHeaderPollingIntervalValue(headers) {
@@ -137,6 +137,7 @@ export declare class FantasyViewModel {
137
137
  * Initialize the ViewModel and start data fetching
138
138
  */
139
139
  init(): Promise<void>;
140
+ private handleFetchError;
140
141
  private fetchData;
141
142
  onEngage(type: FantasyItem['type']): void;
142
143
  onAskLogin(): void;
@@ -153,32 +153,45 @@ export class FantasyViewModel {
153
153
  this.trackPanelView();
154
154
  await this.fetchData();
155
155
  }
156
- async fetchData() {
157
- this.isDataLoading.value = true;
158
- const isAuthenticated = await this.delegate.userIsAuthenticated();
159
- if (!isAuthenticated) {
160
- this.isDataLoading.value = false;
161
- this.append({
162
- id: 'not-logged-in',
163
- type: 'notLoggedIn',
164
- });
165
- return;
166
- }
167
- else if (this.fantasyItems.value.find((i) => i.type === 'notLoggedIn')) {
168
- this.fantasyItems.value = [];
156
+ handleFetchError(error, context = 'FantasyViewModel.fetchData') {
157
+ captureException(error, { context });
158
+ console.error('[FANTASY] Error in ' + context + ':', error);
159
+ this.isDataLoading.value = false;
160
+ if (!this.hasEverSuccessfullyLoaded.value) {
161
+ this.errorState.value = 'tabLoadFailure';
169
162
  }
170
- const swid = (await this.delegate.getUserSWID()) || '';
171
- const jwt = (await this.delegate.getUserToken()) || '';
172
- if (this.useMockData) {
173
- await this.fetchMockData();
174
- return;
163
+ }
164
+ async fetchData() {
165
+ try {
166
+ this.isDataLoading.value = true;
167
+ const isAuthenticated = await this.delegate.userIsAuthenticated();
168
+ if (!isAuthenticated) {
169
+ this.isDataLoading.value = false;
170
+ this.append({
171
+ id: 'not-logged-in',
172
+ type: 'notLoggedIn',
173
+ });
174
+ return;
175
+ }
176
+ else if (this.fantasyItems.value.find((i) => i.type === 'notLoggedIn')) {
177
+ this.fantasyItems.value = [];
178
+ }
179
+ const swid = (await this.delegate.getUserSWID()) || '';
180
+ const jwt = (await this.delegate.getUserToken()) || '';
181
+ if (this.useMockData) {
182
+ await this.fetchMockData();
183
+ return;
184
+ }
185
+ else {
186
+ await this.fantasyPolling.refresh({
187
+ eventId: this.eventId,
188
+ swid,
189
+ jwt,
190
+ }, this.processFantasy.bind(this), this.handleFetchError.bind(this));
191
+ }
175
192
  }
176
- else {
177
- await this.fantasyPolling.refresh({
178
- eventId: this.eventId,
179
- swid,
180
- jwt,
181
- }, this.processFantasy.bind(this));
193
+ catch (error) {
194
+ this.handleFetchError(error);
182
195
  }
183
196
  }
184
197
  onEngage(type) {
@@ -269,6 +282,8 @@ export class FantasyViewModel {
269
282
  this.isLoadingTc.value = false;
270
283
  this.rebuildFantasyItems();
271
284
  }
285
+ }, (error) => {
286
+ this.handleFetchError(error, 'FantasyViewModel.processFantasy.tournamentChallenge');
272
287
  });
273
288
  }
274
289
  });
@@ -334,6 +349,8 @@ export class FantasyViewModel {
334
349
  }
335
350
  }
336
351
  }
352
+ }, (error) => {
353
+ this.handleFetchError(error, 'FantasyViewModel.processFantasy.leagueManager');
337
354
  });
338
355
  }
339
356
  // Mark successful load
@@ -344,14 +361,7 @@ export class FantasyViewModel {
344
361
  this.rebuildFantasyItems();
345
362
  }
346
363
  catch (error) {
347
- captureException(error, {
348
- context: 'FantasyViewModel.processFantasy',
349
- });
350
- console.error('[FANTASY] Error processing fantasy data:', error);
351
- this.isDataLoading.value = false;
352
- if (!this.hasEverSuccessfullyLoaded.value) {
353
- this.errorState.value = 'tabLoadFailure';
354
- }
364
+ this.handleFetchError(error, 'FantasyViewModel.processFantasy');
355
365
  }
356
366
  }
357
367
  parseRoto(data, preference) {
@@ -1,7 +1,7 @@
1
1
  import './KeyPlayErrorStateView.styles.css';
2
2
  import React from 'react';
3
3
  import SDK from '@/index';
4
- import TabLoadErrorView from '@/components/molecules/TabLoadError';
4
+ import TabLoadErrorView from '../../components/TabLoadError';
5
5
  import { useMaxHeightToBottom } from '@/hooks/useMaxHeightToBottom';
6
6
  const UnpopulatedEvent = () => {
7
7
  const maxHeightRef = useMaxHeightToBottom();
@@ -34,7 +34,7 @@ class ShopService {
34
34
  endpoint: `/apis/site/v2/events/${this.eventId}/shop`,
35
35
  interval,
36
36
  method: HttpMethod.GET,
37
- params: {},
37
+ params: { deviceType: 'ictv' },
38
38
  headers: {},
39
39
  onData,
40
40
  onError,
@@ -2,7 +2,7 @@ import React, { Component } from 'react';
2
2
  import './ShopView.styles.css';
3
3
  import ScrollableContainer from '@/components/core/ScrollableContainer';
4
4
  import SDK from '@/index';
5
- import TabLoadErrorView from '@/components/molecules/TabLoadError';
5
+ import TabLoadErrorView from '../../components/TabLoadError';
6
6
  import { isShopProduct, } from '../types';
7
7
  import ShopSection from './components/ShopSection';
8
8
  import ProductDetailView from './ProductDetailView';
@@ -32,7 +32,7 @@ class StatsService {
32
32
  return this.networkManager.externalApiRequest({
33
33
  endpoint: this.getSyncEndpoint(timeCode),
34
34
  method: HttpMethod.GET,
35
- params: {},
35
+ params: { deviceType: 'ictv' },
36
36
  headers: {},
37
37
  });
38
38
  }
@@ -50,7 +50,7 @@ class StatsService {
50
50
  endpoint: this.getSyncEndpoint(timeCode),
51
51
  interval,
52
52
  method: HttpMethod.GET,
53
- params: {},
53
+ params: { deviceType: 'ictv' },
54
54
  headers: {},
55
55
  onData,
56
56
  onError,
@@ -3,7 +3,7 @@ import './StatsView.styles.css';
3
3
  import ScrollableContainer from '@/components/core/ScrollableContainer';
4
4
  import SDK from '@/index';
5
5
  import StatsItemView from './StatsItemView';
6
- import TabLoadErrorView from '@/components/molecules/TabLoadError';
6
+ import TabLoadErrorView from '../../components/TabLoadError';
7
7
  import { captureException } from '@/sentry';
8
8
  import { setupMaxHeightToBottom } from '@/hooks/useMaxHeightToBottom';
9
9
  const STICKY_HEADER_HEIGHT = 32; // Match KeyPlaysView