@maestro_io/maestro-web-sdk 2.1.0 → 2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/MaestroEventDelegate.js +60 -0
- package/dist/components/atoms/BaseButton/BaseButton.js +11 -0
- package/dist/components/atoms/BaseButton/index.js +2 -0
- package/dist/components/atoms/Image/index.js +30 -0
- package/dist/components/atoms/Rive/index.d.ts +7 -8
- package/dist/components/atoms/Rive/index.js +52 -0
- package/dist/components/atoms/SvgIcon/BetGeneralIcon.js +9 -0
- package/dist/components/atoms/SvgIcon/BetsIcon.js +11 -0
- package/dist/components/atoms/SvgIcon/BetsWarningIcon.js +11 -0
- package/dist/components/atoms/SvgIcon/CheckmarkIcon.js +6 -0
- package/dist/components/atoms/SvgIcon/CollapseIcon.js +6 -0
- package/dist/components/atoms/SvgIcon/ExpandIcon.js +6 -0
- package/dist/components/atoms/SvgIcon/FantasyIcon.js +8 -0
- package/dist/components/atoms/SvgIcon/FlameIcon.js +11 -0
- package/dist/components/atoms/SvgIcon/Icon.js +42 -0
- package/dist/components/atoms/SvgIcon/KeyPlaysIcon.js +10 -0
- package/dist/components/atoms/SvgIcon/MobilePhoneIcon.js +11 -0
- package/dist/components/atoms/SvgIcon/PlayIcon.js +8 -0
- package/dist/components/atoms/SvgIcon/StatsIcon.js +12 -0
- package/dist/components/atoms/SvgIcon/TimesIcon.js +6 -0
- package/dist/components/atoms/SvgIcon/WarningIcon.js +8 -0
- package/dist/components/atoms/SvgIcon/index.js +2 -0
- package/dist/components/core/App/App.js +41 -0
- package/dist/components/core/App/index.js +2 -0
- package/dist/components/core/OverlayContainer.js +58 -0
- package/dist/components/core/PanelManager/PanelManager.js +80 -0
- package/dist/components/core/PanelManager/index.js +2 -0
- package/dist/components/core/ScrollableContainer/FocusableItem.js +38 -0
- package/dist/components/core/ScrollableContainer/ScrollableContainer.js +166 -0
- package/dist/components/core/ScrollableContainer/index.js +2 -0
- package/dist/components/molecules/ActionButton/ActionButton.js +10 -0
- package/dist/components/molecules/ActionButton/index.js +2 -0
- package/dist/components/molecules/Overlay/Overlay.d.ts +1 -2
- package/dist/components/molecules/Overlay/Overlay.js +139 -0
- package/dist/components/molecules/Overlay/index.js +2 -0
- package/dist/components/molecules/PanelNavButton/PanelNavButton.js +40 -0
- package/dist/components/molecules/PanelNavButton/index.js +2 -0
- package/dist/components/molecules/SegmentButton/SegmentButton.js +10 -0
- package/dist/components/molecules/SegmentButton/index.js +2 -0
- package/dist/components/molecules/WatchButton/WatchButton.js +15 -0
- package/dist/components/molecules/WatchButton/index.js +2 -0
- package/dist/components/organisms/PanelNavigation/PanelNavigation.js +72 -0
- package/dist/components/organisms/PanelNavigation/index.js +2 -0
- package/dist/components/organisms/SegmentController/SegmentController.js +69 -0
- package/dist/components/organisms/SegmentController/index.d.ts +1 -1
- package/dist/components/organisms/SegmentController/index.js +2 -0
- package/dist/external/AxiosNetworkClient.js +83 -0
- package/dist/external/LocalStorageCacheManager.js +213 -0
- package/dist/external/ReactRenderer.d.ts +2 -2
- package/dist/external/ReactRenderer.js +86 -0
- package/dist/external/mocks/MockExternalNetworkClient.js +161 -0
- package/dist/external/ports/cacheManager.js +1 -0
- package/dist/external/ports/networkClient.js +1 -0
- package/dist/external/ports/renderer.js +1 -0
- package/dist/external/spatial-navigation/index.d.ts +1 -1
- package/dist/external/spatial-navigation/index.js +4 -0
- package/dist/external/spatial-navigation/measureLayout.js +30 -0
- package/dist/external/spatial-navigation/spatialNavigation.js +875 -0
- package/dist/external/spatial-navigation/utils.js +6 -0
- package/dist/external/spatial-navigation/visualDebugger.js +76 -0
- package/dist/external/spatial-navigation/withFocusable.js +238 -0
- package/dist/helpers/Observable.js +37 -0
- package/dist/helpers/deliver-focus.js +12 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.js +192 -0
- package/dist/interfaces/IMaestroEvent.js +6 -0
- package/dist/interfaces/IMaestroEventDelegate.js +1 -0
- package/dist/interfaces/IMaestroManager.js +1 -0
- package/dist/maestro-web-sdk.umd.js +3 -3
- package/dist/maestro-web-sdk.umd.js.map +1 -1
- package/dist/models/IModel.js +1 -0
- package/dist/models/IPanel.js +53 -0
- package/dist/models/ITheme.js +20 -0
- package/dist/models/IWinningBet.js +1 -0
- package/dist/modules/bets/interfaces/IBets.js +1 -0
- package/dist/modules/bets/mocks.js +572 -0
- package/dist/modules/bets/view/BetsView.js +116 -0
- package/dist/modules/bets/view/HotProps/HotPropsView.js +139 -0
- package/dist/modules/bets/view/SixPack/SixPackView.js +103 -0
- package/dist/modules/bets/view/TabLoadFailureView.js +12 -0
- package/dist/modules/bets/view/UserBets/BetResult/BetResult.js +6 -0
- package/dist/modules/bets/view/UserBets/BetsCard/BetsCard.js +122 -0
- package/dist/modules/bets/view/UserBets/BetsCard/BetsCardEvent.js +34 -0
- package/dist/modules/bets/view/UserBets/BetsCard/BetsCardFooter.js +22 -0
- package/dist/modules/bets/view/UserBets/Boost/Boost.js +6 -0
- package/dist/modules/bets/view/UserBets/OutcomeBadge/OutcomeBadge.js +9 -0
- package/dist/modules/bets/view/UserBets/Parlay/Parlay.js +13 -0
- package/dist/modules/bets/view/UserBets/Straight/Straight.js +6 -0
- package/dist/modules/bets/view/UserBets/Teaser/Teaser.js +13 -0
- package/dist/modules/bets/view/UserBets/UserBetsView.js +114 -0
- package/dist/modules/bets/view/components/Bet/Bet.js +32 -0
- package/dist/modules/bets/view/components/BetPill/BetPill.js +6 -0
- package/dist/modules/bets/view/components/BetsCard/BetsCard.js +15 -0
- package/dist/modules/bets/view/components/BetsCard/BetsCardHeader.js +20 -0
- package/dist/modules/bets/view/components/GamblingDisclaimer/GamblingDisclaimer.js +14 -0
- package/dist/modules/bets/view/components/LocationWarning/LocationWarning.js +16 -0
- package/dist/modules/bets/view/components/PromoCodeBanner/PromoCodeBanner.js +63 -0
- package/dist/modules/bets/view/components/PromoCodeBanner/index.d.ts +1 -1
- package/dist/modules/bets/view/components/PromoCodeBanner/index.js +1 -0
- package/dist/modules/bets/view-model/BetsViewModel.js +767 -0
- package/dist/modules/key-plays/constants.js +292 -0
- package/dist/modules/key-plays/interfaces/IKeyPlays.d.ts +4 -4
- package/dist/modules/key-plays/interfaces/IKeyPlays.js +14 -0
- package/dist/modules/key-plays/interfaces/IKeyPlaysResponse.js +1 -0
- package/dist/modules/key-plays/view/KeyPlayCardScoreTagView.js +13 -0
- package/dist/modules/key-plays/view/KeyPlayCardView.js +142 -0
- package/dist/modules/key-plays/view/KeyPlayErrorStateView.js +58 -0
- package/dist/modules/key-plays/view/KeyPlaysView.js +167 -0
- package/dist/modules/key-plays/view-model/KeyPlaysViewModel.js +182 -0
- package/dist/modules/stats/interfaces/IStats.d.ts +163 -0
- package/dist/modules/stats/interfaces/IStats.js +1 -0
- package/dist/modules/stats/mocks.d.ts +2 -0
- package/dist/modules/stats/mocks.js +546 -0
- package/dist/modules/stats/utils.d.ts +39 -0
- package/dist/modules/stats/utils.js +62 -0
- package/dist/modules/stats/view/GameLeaders/GameLeaders.d.ts +29 -0
- package/dist/modules/stats/view/GameLeaders/GameLeaders.js +9 -0
- package/dist/modules/stats/view/GameLeaders/index.d.ts +2 -0
- package/dist/modules/stats/view/GameLeaders/index.js +2 -0
- package/dist/modules/stats/view/MatchPredictor/DonutChart/DonutChart.d.ts +17 -0
- package/dist/modules/stats/view/MatchPredictor/DonutChart/DonutChart.js +55 -0
- package/dist/modules/stats/view/MatchPredictor/DonutChart/index.d.ts +2 -0
- package/dist/modules/stats/view/MatchPredictor/DonutChart/index.js +1 -0
- package/dist/modules/stats/view/MatchPredictor/MatchPredictorView.d.ts +52 -0
- package/dist/modules/stats/view/MatchPredictor/MatchPredictorView.js +66 -0
- package/dist/modules/stats/view/MatchPredictor/index.d.ts +3 -0
- package/dist/modules/stats/view/MatchPredictor/index.js +2 -0
- package/dist/modules/stats/view/RecentGames/RecentGames.d.ts +62 -0
- package/dist/modules/stats/view/RecentGames/RecentGames.js +22 -0
- package/dist/modules/stats/view/RecentGames/index.d.ts +2 -0
- package/dist/modules/stats/view/RecentGames/index.js +2 -0
- package/dist/modules/stats/view/StatsQRCode/StatsQRCodeView.d.ts +51 -0
- package/dist/modules/stats/view/StatsQRCode/StatsQRCodeView.js +38 -0
- package/dist/modules/stats/view/StatsQRCode/index.d.ts +2 -0
- package/dist/modules/stats/view/StatsQRCode/index.js +1 -0
- package/dist/modules/stats/view/StatsView.d.ts +20 -0
- package/dist/modules/stats/view/StatsView.js +87 -0
- package/dist/modules/stats/view/Teams/StatsCarousel.d.ts +8 -0
- package/dist/modules/stats/view/Teams/StatsCarousel.js +14 -0
- package/dist/modules/stats/view/Teams/StatsProgressBar.d.ts +7 -0
- package/dist/modules/stats/view/Teams/StatsProgressBar.js +14 -0
- package/dist/modules/stats/view/Teams/Teams.d.ts +67 -0
- package/dist/modules/stats/view/Teams/Teams.js +35 -0
- package/dist/modules/stats/view/Teams/index.d.ts +2 -0
- package/dist/modules/stats/view/Teams/index.js +2 -0
- package/dist/modules/stats/view/WinProbability/WinProbability.d.ts +62 -0
- package/dist/modules/stats/view/WinProbability/WinProbability.js +27 -0
- package/dist/modules/stats/view/WinProbability/index.d.ts +2 -0
- package/dist/modules/stats/view/WinProbability/index.js +2 -0
- package/dist/modules/stats/view/components/AthletesStatistics/AthletesStatistics.d.ts +51 -0
- package/dist/modules/stats/view/components/AthletesStatistics/AthletesStatistics.js +28 -0
- package/dist/modules/stats/view/components/AthletesStatistics/StatisticTable.d.ts +10 -0
- package/dist/modules/stats/view/components/AthletesStatistics/StatisticTable.js +11 -0
- package/dist/modules/stats/view/components/AthletesStatistics/index.d.ts +2 -0
- package/dist/modules/stats/view/components/AthletesStatistics/index.js +2 -0
- package/dist/modules/stats/view/index.d.ts +1 -0
- package/dist/modules/stats/view/index.js +1 -0
- package/dist/modules/stats/view-model/StatsViewModel.d.ts +31 -0
- package/dist/modules/stats/view-model/StatsViewModel.js +90 -0
- package/dist/services/BetsService.js +102 -0
- package/dist/services/NetworkManager/NetworkManager.js +410 -0
- package/dist/services/NetworkManager/errors.js +45 -0
- package/dist/services/ThemeManager/constants.js +47 -0
- package/dist/test-polyfills.d.ts +1 -0
- package/dist/test-polyfills.js +15 -0
- package/dist/types/OverlayTypes.js +4 -0
- package/dist/view-models/MaestroEventViewModel.d.ts +2 -0
- package/dist/view-models/MaestroEventViewModel.js +156 -0
- package/dist/view-models/OverlayViewModel.js +222 -0
- package/dist/view-models/PanelManagerViewModel.js +80 -0
- package/dist/view-models/ViewModel.js +32 -0
- package/dist/view-models/index.js +59 -0
- package/package.json +1 -1
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import SDK from '.';
|
|
2
|
+
import { KEY_PLAYS_RESPONSE_MOCK_DATA } from './modules/key-plays/constants';
|
|
3
|
+
const playbackProgressIntervals = {};
|
|
4
|
+
let keyPlayClipError = true;
|
|
5
|
+
const allPlays = KEY_PLAYS_RESPONSE_MOCK_DATA.sections.reduce((prev, curr) => prev + curr.items.length, 0);
|
|
6
|
+
/**
|
|
7
|
+
* Our own implementation of the IMaestroEventDelegate interface. Useful for Development and Testing
|
|
8
|
+
*/
|
|
9
|
+
export default class MaestroEventDelegate {
|
|
10
|
+
getBettingAPIBaseURL() {
|
|
11
|
+
return 'http://localhost:8080/espn-api';
|
|
12
|
+
}
|
|
13
|
+
userRequestedNewKeyPlaysData() {
|
|
14
|
+
throw new Error('Method not implemented.');
|
|
15
|
+
}
|
|
16
|
+
startFocusManagement() {
|
|
17
|
+
return Promise.resolve();
|
|
18
|
+
}
|
|
19
|
+
userIsAuthenticated() {
|
|
20
|
+
const swid = SDK.getClientAppSwid();
|
|
21
|
+
const appToken = SDK.getClientAppToken();
|
|
22
|
+
return Promise.resolve(Boolean(swid && appToken));
|
|
23
|
+
}
|
|
24
|
+
getUserSWID() {
|
|
25
|
+
return Promise.resolve(SDK.getClientAppSwid() || null);
|
|
26
|
+
}
|
|
27
|
+
getUserToken() {
|
|
28
|
+
return Promise.resolve(SDK.getClientAppToken() || null);
|
|
29
|
+
}
|
|
30
|
+
playClip(atIndex) {
|
|
31
|
+
Object.values(playbackProgressIntervals).forEach((interval) => {
|
|
32
|
+
clearInterval(interval);
|
|
33
|
+
});
|
|
34
|
+
// Do something with the clip index
|
|
35
|
+
const event = SDK.getMaestroEventViewModel();
|
|
36
|
+
if (atIndex === 0 && keyPlayClipError) {
|
|
37
|
+
keyPlayClipError = false;
|
|
38
|
+
event.didFailToPlayClip(atIndex);
|
|
39
|
+
this.playClip(atIndex + 1);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
event.didStartPlayingClip(atIndex);
|
|
43
|
+
// Simulate playback progress
|
|
44
|
+
let progress = 0;
|
|
45
|
+
playbackProgressIntervals[atIndex] = setInterval(() => {
|
|
46
|
+
progress += 0.002;
|
|
47
|
+
if (progress >= 1) {
|
|
48
|
+
clearInterval(playbackProgressIntervals[atIndex]);
|
|
49
|
+
event.didStopPlayingClip(atIndex);
|
|
50
|
+
// if index is still under allPlays boundary, play next clip
|
|
51
|
+
if (atIndex + 1 < allPlays) {
|
|
52
|
+
return this.playClip(atIndex + 1);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
event.didUpdatePlaybackProgressOfClip(atIndex, progress);
|
|
57
|
+
}
|
|
58
|
+
}, 10);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import './BaseButton.styles.css';
|
|
3
|
+
import FocusableItem from '@/components/core/ScrollableContainer/FocusableItem';
|
|
4
|
+
class BaseButton extends React.Component {
|
|
5
|
+
render() {
|
|
6
|
+
const className = ['base-button', this.props.className].join(' ');
|
|
7
|
+
return (React.createElement(FocusableItem, null,
|
|
8
|
+
React.createElement("button", { ...this.props, className: className }, this.props.children)));
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export default BaseButton;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
class Image extends React.Component {
|
|
3
|
+
constructor(props) {
|
|
4
|
+
super(props);
|
|
5
|
+
Object.defineProperty(this, "state", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
configurable: true,
|
|
8
|
+
writable: true,
|
|
9
|
+
value: {
|
|
10
|
+
failed: false,
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
Object.defineProperty(this, "handleError", {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
configurable: true,
|
|
16
|
+
writable: true,
|
|
17
|
+
value: () => {
|
|
18
|
+
this.setState({ failed: true });
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
render() {
|
|
23
|
+
if (this.state.failed) {
|
|
24
|
+
console.warn('Image failed to load:', this.props.src);
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
return (React.createElement("img", { alt: this.props.alt || 'Image', ...this.props, onError: this.handleError }));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export default Image;
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
/// <reference types="prop-types" />
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import { WithFocusableProps } from '@/external/spatial-navigation';
|
|
4
|
-
import { Rive as RiveCanvas } from '@rive-app/canvas';
|
|
5
4
|
declare const _default: {
|
|
6
5
|
new (props?: (React.CanvasHTMLAttributes<HTMLCanvasElement> & {
|
|
7
6
|
id: string;
|
|
8
7
|
autoFocus: boolean;
|
|
9
8
|
autoPlay: boolean;
|
|
10
9
|
src: string;
|
|
11
|
-
onLoadRiveInstance: (riveInstance:
|
|
10
|
+
onLoadRiveInstance: (riveInstance: any) => void;
|
|
12
11
|
} & WithFocusableProps) | undefined, context?: any): {
|
|
13
12
|
state: import("../../../external/spatial-navigation/withFocusable").WithFocusableState;
|
|
14
13
|
getChildContext(): {
|
|
@@ -33,14 +32,14 @@ declare const _default: {
|
|
|
33
32
|
autoFocus: boolean;
|
|
34
33
|
autoPlay: boolean;
|
|
35
34
|
src: string;
|
|
36
|
-
onLoadRiveInstance: (riveInstance:
|
|
35
|
+
onLoadRiveInstance: (riveInstance: any) => void;
|
|
37
36
|
} & WithFocusableProps>;
|
|
38
37
|
setState<K extends keyof import("../../../external/spatial-navigation/withFocusable").WithFocusableState>(state: import("../../../external/spatial-navigation/withFocusable").WithFocusableState | ((prevState: Readonly<import("../../../external/spatial-navigation/withFocusable").WithFocusableState>, props: React.CanvasHTMLAttributes<HTMLCanvasElement> & {
|
|
39
38
|
id: string;
|
|
40
39
|
autoFocus: boolean;
|
|
41
40
|
autoPlay: boolean;
|
|
42
41
|
src: string;
|
|
43
|
-
onLoadRiveInstance: (riveInstance:
|
|
42
|
+
onLoadRiveInstance: (riveInstance: any) => void;
|
|
44
43
|
} & WithFocusableProps) => import("../../../external/spatial-navigation/withFocusable").WithFocusableState | Pick<import("../../../external/spatial-navigation/withFocusable").WithFocusableState, K>) | Pick<import("../../../external/spatial-navigation/withFocusable").WithFocusableState, K>, callback?: (() => any) | undefined): void;
|
|
45
44
|
forceUpdate(callBack?: (() => any) | undefined): void;
|
|
46
45
|
props: Readonly<{
|
|
@@ -50,7 +49,7 @@ declare const _default: {
|
|
|
50
49
|
autoFocus: boolean;
|
|
51
50
|
autoPlay: boolean;
|
|
52
51
|
src: string;
|
|
53
|
-
onLoadRiveInstance: (riveInstance:
|
|
52
|
+
onLoadRiveInstance: (riveInstance: any) => void;
|
|
54
53
|
} & WithFocusableProps>;
|
|
55
54
|
context: any;
|
|
56
55
|
refs: {
|
|
@@ -62,21 +61,21 @@ declare const _default: {
|
|
|
62
61
|
autoFocus: boolean;
|
|
63
62
|
autoPlay: boolean;
|
|
64
63
|
src: string;
|
|
65
|
-
onLoadRiveInstance: (riveInstance:
|
|
64
|
+
onLoadRiveInstance: (riveInstance: any) => void;
|
|
66
65
|
} & WithFocusableProps>, nextContext: any): void;
|
|
67
66
|
shouldComponentUpdate?(nextProps: Readonly<React.CanvasHTMLAttributes<HTMLCanvasElement> & {
|
|
68
67
|
id: string;
|
|
69
68
|
autoFocus: boolean;
|
|
70
69
|
autoPlay: boolean;
|
|
71
70
|
src: string;
|
|
72
|
-
onLoadRiveInstance: (riveInstance:
|
|
71
|
+
onLoadRiveInstance: (riveInstance: any) => void;
|
|
73
72
|
} & WithFocusableProps>, nextState: Readonly<import("../../../external/spatial-navigation/withFocusable").WithFocusableState>, nextContext: any): boolean;
|
|
74
73
|
componentWillUpdate?(nextProps: Readonly<React.CanvasHTMLAttributes<HTMLCanvasElement> & {
|
|
75
74
|
id: string;
|
|
76
75
|
autoFocus: boolean;
|
|
77
76
|
autoPlay: boolean;
|
|
78
77
|
src: string;
|
|
79
|
-
onLoadRiveInstance: (riveInstance:
|
|
78
|
+
onLoadRiveInstance: (riveInstance: any) => void;
|
|
80
79
|
} & WithFocusableProps>, nextState: Readonly<import("../../../external/spatial-navigation/withFocusable").WithFocusableState>, nextContext: any): void;
|
|
81
80
|
};
|
|
82
81
|
contextTypes: {
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { setFocus, withFocusable, } from '@/external/spatial-navigation';
|
|
3
|
+
class Rive extends React.Component {
|
|
4
|
+
constructor() {
|
|
5
|
+
super(...arguments);
|
|
6
|
+
Object.defineProperty(this, "riveInstance", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
configurable: true,
|
|
9
|
+
writable: true,
|
|
10
|
+
value: null
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
componentDidMount() {
|
|
14
|
+
const canvas = document.getElementById(this.props.id);
|
|
15
|
+
if (!canvas) {
|
|
16
|
+
console.error('Canvas element not found with id:', this.props.id);
|
|
17
|
+
throw new Error('canvas not found');
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
// Temporarily commented out due to issues with RiveCanvas import
|
|
21
|
+
// this.riveInstance = new RiveCanvas({
|
|
22
|
+
// src: this.props.src,
|
|
23
|
+
// canvas,
|
|
24
|
+
// autoplay: this.props.autoPlay,
|
|
25
|
+
// stateMachines: 'stateMachine',
|
|
26
|
+
// onLoad: () => {
|
|
27
|
+
// this.props.onLoadRiveInstance(this.riveInstance);
|
|
28
|
+
// },
|
|
29
|
+
// onLoadError: (error: any) => {
|
|
30
|
+
// console.error('RiveCanvas load error:', error);
|
|
31
|
+
// },
|
|
32
|
+
// });
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
console.error('Error creating RiveCanvas:', error);
|
|
36
|
+
}
|
|
37
|
+
setTimeout(() => {
|
|
38
|
+
if (this.props.focusKey && this.props.autoFocus) {
|
|
39
|
+
setFocus(this.props.focusKey);
|
|
40
|
+
}
|
|
41
|
+
}, 0);
|
|
42
|
+
}
|
|
43
|
+
componentWillUnmount() {
|
|
44
|
+
if (this.riveInstance) {
|
|
45
|
+
this.riveInstance.cleanup();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
render() {
|
|
49
|
+
return (React.createElement("canvas", { style: this.props.style, id: this.props.id, "data-focused": this.props.focused }));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export default withFocusable()(Rive);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
const BetGeneralIcon = (props) => {
|
|
3
|
+
return (React.createElement("svg", { width: props.width, height: props.height, viewBox: "0 0 48 48", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
|
|
4
|
+
React.createElement("rect", { x: "1", y: "1", width: "46", height: "46", rx: "23", fill: "#101113" }),
|
|
5
|
+
React.createElement("rect", { x: "1", y: "1", width: "46", height: "46", rx: "23", stroke: "#A1A2A3", strokeWidth: "2" }),
|
|
6
|
+
React.createElement("path", { d: "M23.9994 25.2964L22.9624 26.3334L23.9624 27.3334L22.6661 28.6298L21.6661 27.6298L20.6476 28.6482L19.3512 27.3519L20.3697 26.3334L19.3697 25.3334L20.6661 24.037L21.6661 25.037L22.7031 24.0001L21.7031 23.0001L22.9994 21.7037L23.9994 22.7037L25.0364 21.6667L24.0364 20.6667L25.3328 19.3704L26.3328 20.3704L27.3512 19.3519L28.6476 20.6482L27.6291 21.6667L28.6291 22.6667L27.3328 23.9631L26.3328 22.9631L25.2958 24.0001L26.2958 25.0001L24.9994 26.2964L23.9994 25.2964Z", fill: "#A1A2A3" }),
|
|
7
|
+
React.createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M36.425 12.9435C36.389 12.7762 36.1471 11.8521 36.1471 11.8521C36.1471 11.8521 35.2231 11.6104 35.0558 11.5744C34.7212 11.5025 34.2407 11.4098 33.6432 11.3229C32.4502 11.1494 30.781 10.9976 28.8705 11.0844C25.0579 11.2578 20.1968 12.3884 16.2923 16.2931C12.3877 20.1978 11.2571 25.0588 11.0838 28.8714C10.9969 30.7818 11.1488 32.4509 11.3223 33.644C11.4092 34.2414 11.5019 34.7218 11.5738 35.0564C11.6097 35.2238 11.8528 36.1466 11.8528 36.1466C11.8528 36.1466 12.7755 36.3896 12.9429 36.4256C13.2774 36.4975 13.7579 36.5902 14.3553 36.6771C15.5484 36.8507 17.2175 37.0026 19.1279 36.9158C22.9405 36.7426 27.8016 35.6121 31.7065 31.7073C35.6113 27.8025 36.7419 22.9414 36.9151 19.1287C37.0019 17.2182 36.85 15.5491 36.6765 14.356C36.5896 13.7586 36.4969 13.2781 36.425 12.9435ZM17.7065 17.7073C21.1351 14.2786 25.4406 13.2424 28.9614 13.0824C30.7175 13.0025 32.2568 13.1423 33.3554 13.3021C33.8244 13.3703 34.2113 13.4419 34.4984 13.501C34.5575 13.7881 34.6291 14.175 34.6973 14.644C34.8571 15.7426 34.997 17.2818 34.9172 19.0379C34.7572 22.5587 33.7211 26.8643 30.2923 30.2931C26.8634 33.7219 22.5578 34.7579 19.0372 34.9179C17.281 34.9977 15.7419 34.8578 14.6433 34.698C14.1743 34.6297 13.7874 34.5581 13.5003 34.4991C13.4413 34.212 13.3697 33.8251 13.3015 33.3561C13.1417 32.2575 13.0019 30.7183 13.0817 28.9622C13.2418 25.4415 14.2779 21.136 17.7065 17.7073Z", fill: "#A1A2A3" })));
|
|
8
|
+
};
|
|
9
|
+
export default BetGeneralIcon;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
class BetsIcon extends React.Component {
|
|
3
|
+
constructor(props) {
|
|
4
|
+
super(props);
|
|
5
|
+
}
|
|
6
|
+
render() {
|
|
7
|
+
return (React.createElement("svg", { width: this.props.width, height: this.props.height, viewBox: "0 0 36 36", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
|
|
8
|
+
React.createElement("path", { d: "M26.4393 4.5H6.61944L3.34766 31.5C3.34766 31.5 19.7066 31.5 22.7432 31.5C23.3056 31.5 23.8679 31.4591 24.4251 31.3773C26.0406 31.1268 28.7193 30.3445 29.8491 27.6808C30.3501 26.4947 30.7387 23.1919 30.8665 22.3023C31.1783 20.1345 30.0178 18.8819 28.8625 18.1508C28.6069 17.9923 28.6733 17.6038 28.9647 17.5322C30.1814 17.2203 31.3266 16.571 31.6435 15.1906C31.8633 14.2192 32.0781 12.0872 32.2263 10.9011C32.9113 5.92643 29.568 4.5 26.4393 4.5ZM24.1542 19.792H15.8213L15.6117 21.5047H23.9497L23.4589 25.4773H10.1468L11.2715 16.3154H24.5836L24.1593 19.7869L24.1542 19.792ZM24.7779 14.7202H11.4658L11.9821 10.5227H25.2942L24.783 14.7202H24.7779Z", fill: "#9DA0A6" })));
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export default BetsIcon;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
class BetsWarningIcon extends React.Component {
|
|
3
|
+
constructor(props) {
|
|
4
|
+
super(props);
|
|
5
|
+
}
|
|
6
|
+
render() {
|
|
7
|
+
return (React.createElement("svg", { width: this.props.width, height: this.props.height, viewBox: "0 0 32 32", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
|
|
8
|
+
React.createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M3 16C3 8.8203 8.8203 3 16 3C23.1797 3 29 8.8203 29 16C29 23.1797 23.1797 29 16 29C8.8203 29 3 23.1797 3 16ZM14.6001 12.0668H17.4001V9.26676H14.6001V12.0668ZM17.3333 22.6667V14H14.6667V22.6667H17.3333Z", fill: "#FFB759" })));
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export default BetsWarningIcon;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
const CheckmarkIcon = (props) => {
|
|
3
|
+
return (React.createElement("svg", { width: props.width, height: props.height, viewBox: "0 0 25 24", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
|
|
4
|
+
React.createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M22.0678 6.50019L9.79999 18.768L3.53223 12.5002L5.29999 10.7324L9.79999 15.2324L20.3 4.73242L22.0678 6.50019Z", fill: "#41BA42" })));
|
|
5
|
+
};
|
|
6
|
+
export default CheckmarkIcon;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
const CollapseIcon = (props) => {
|
|
3
|
+
return (React.createElement("svg", { width: props.width, height: props.height, viewBox: "0 0 49 48", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
|
|
4
|
+
React.createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M20 39L20 28.5L9.5 28.5L9.5 25.5L23 25.5L23 39L20 39ZM39.5 22.5L26 22.5L26 9.00392L29 9.00392L29 19.5L39.5 19.5L39.5 22.5Z", fill: "white" })));
|
|
5
|
+
};
|
|
6
|
+
export default CollapseIcon;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
const ExpandIcon = (props) => {
|
|
3
|
+
return (React.createElement("svg", { width: props.width, height: props.height, viewBox: "0 0 48 48", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
|
|
4
|
+
React.createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M13.5 34.5L24 34.5L24 37.5L10.5 37.5L10.5 24L13.5 24L13.5 34.5ZM34.5 24L34.5 13.5006L24.0006 13.5045L23.9994 10.5045L37.5 10.4994L37.5 24L34.5 24Z", fill: "white" })));
|
|
5
|
+
};
|
|
6
|
+
export default ExpandIcon;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
class FantasyIcon extends React.Component {
|
|
3
|
+
render() {
|
|
4
|
+
return (React.createElement("svg", { width: this.props.width, height: this.props.height, viewBox: "0 0 36 36", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
|
|
5
|
+
React.createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M8.96879 29.0297C11.6061 31.2694 14.6822 32.9334 18.0001 33.9152C21.3179 32.9334 24.394 31.2694 27.0313 29.0297C29.6686 26.7899 31.8089 24.0239 33.3151 20.9089C31.6987 16.1971 30.9721 11.2259 31.1722 6.24861C26.9818 4.51945 22.5273 3.51728 18.0001 3.28516C13.4728 3.51728 9.01831 4.51945 4.82788 6.24861C5.02804 11.2259 4.30143 16.1971 2.68506 20.9089C4.19119 24.0239 6.33149 26.7899 8.96879 29.0297ZM11.7503 14.7153L12.2646 10.5164H25.5772L25.0616 14.7153H11.7503ZM23.7355 25.4753H10.423L11.5486 16.3157H24.8599L24.4349 19.7871H16.1048L15.8917 21.4998H24.2282L23.7355 25.4753Z", fill: "#9DA0A6" })));
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export default FantasyIcon;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
class FlameIcon extends React.Component {
|
|
3
|
+
constructor(props) {
|
|
4
|
+
super(props);
|
|
5
|
+
}
|
|
6
|
+
render() {
|
|
7
|
+
return (React.createElement("svg", { width: this.props.width, height: this.props.height, viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
|
|
8
|
+
React.createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M8.54183 0.327148L9.39895 0.669996C11.7818 1.62315 13.1252 3.98581 13.1252 7.08363V7.65808L14.6806 6.1026L15.1035 6.73694C15.9332 7.98141 17.2918 10.2078 17.2918 12.5003C17.2918 16.6478 14.0406 19.3753 10.0002 19.3753C5.95971 19.3753 2.7085 16.6478 2.7085 12.5003C2.7085 9.7532 4.31768 8.02946 5.74552 6.49998L5.79325 6.44885C7.27047 4.86611 8.54183 3.47254 8.54183 1.25029V0.327148ZM10.5323 10.5213L10.6145 10.7677C11.0056 11.941 11.4873 12.5422 11.892 13.0473L11.9337 13.0993C12.1409 13.3583 12.338 13.61 12.4799 13.9081C12.6244 14.2115 12.7085 14.5549 12.7085 15.0003C12.7085 16.496 11.4959 17.7086 10.0002 17.7086C8.50439 17.7086 7.29183 16.496 7.29183 15.0003C7.29183 13.5264 8.18282 11.9311 10.3096 10.655L10.5323 10.5213Z", fill: "#F58B00" })));
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export default FlameIcon;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import KeyPlaysIcon from './KeyPlaysIcon';
|
|
3
|
+
import PlayIcon from './PlayIcon';
|
|
4
|
+
import BetsIcon from './BetsIcon';
|
|
5
|
+
import StatsIcon from './StatsIcon';
|
|
6
|
+
import FantasyIcon from './FantasyIcon';
|
|
7
|
+
import WarningIcon from './WarningIcon';
|
|
8
|
+
import ExpandIcon from './ExpandIcon';
|
|
9
|
+
import CollapseIcon from './CollapseIcon';
|
|
10
|
+
import TimesIcon from './TimesIcon';
|
|
11
|
+
import CheckmarkIcon from './CheckmarkIcon';
|
|
12
|
+
import FlameIcon from './FlameIcon';
|
|
13
|
+
import BetsWarningIcon from './BetsWarningIcon';
|
|
14
|
+
import MobilePhoneIcon from './MobilePhoneIcon';
|
|
15
|
+
const iconImports = {
|
|
16
|
+
keyPlays: KeyPlaysIcon,
|
|
17
|
+
play: PlayIcon,
|
|
18
|
+
bets: BetsIcon,
|
|
19
|
+
stats: StatsIcon,
|
|
20
|
+
fantasy: FantasyIcon,
|
|
21
|
+
warning: WarningIcon,
|
|
22
|
+
expand: ExpandIcon,
|
|
23
|
+
collapse: CollapseIcon,
|
|
24
|
+
times: TimesIcon,
|
|
25
|
+
checkmark: CheckmarkIcon,
|
|
26
|
+
flame: FlameIcon,
|
|
27
|
+
betsWarning: BetsWarningIcon,
|
|
28
|
+
mobilePhone: MobilePhoneIcon,
|
|
29
|
+
};
|
|
30
|
+
// Skeleton component for loading state
|
|
31
|
+
const Skeleton = (props) => (React.createElement("div", { style: { width: props.width, height: props.height } }));
|
|
32
|
+
class Icon extends React.Component {
|
|
33
|
+
render() {
|
|
34
|
+
const { iconName, width, height } = this.props;
|
|
35
|
+
const IconComponent = iconImports[iconName];
|
|
36
|
+
if (!IconComponent) {
|
|
37
|
+
return React.createElement(Skeleton, { width: width, height: height });
|
|
38
|
+
}
|
|
39
|
+
return React.createElement(IconComponent, { iconName: iconName, width: width, height: height });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export default Icon;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
class KeyPlaysIcon extends React.Component {
|
|
3
|
+
render() {
|
|
4
|
+
return (React.createElement("svg", { width: this.props.width, height: this.props.height, viewBox: "0 0 30 32", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
|
|
5
|
+
React.createElement("path", { d: "M27.375 4.75H2.625V7H27.375V4.75Z", fill: "white" }),
|
|
6
|
+
React.createElement("path", { d: "M25.125 0.25H4.875V2.5H25.125V0.25Z", fill: "white" }),
|
|
7
|
+
React.createElement("path", { d: "M0.375 9.25V31.75H29.625V9.25H0.375ZM11.625 26.125V14.875L20.625 20.5L11.625 26.125Z", fill: "white" })));
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export default KeyPlaysIcon;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
class MobilePhoneIcon extends React.Component {
|
|
3
|
+
constructor(props) {
|
|
4
|
+
super(props);
|
|
5
|
+
}
|
|
6
|
+
render() {
|
|
7
|
+
return (React.createElement("svg", { width: this.props.width, height: this.props.height, viewBox: "0 0 32 32", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
|
|
8
|
+
React.createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M9.33333 1.66663C8.04467 1.66663 7 2.7113 7 3.99996V28C7 29.2886 8.04467 30.3333 9.33333 30.3333H22.6667C23.9553 30.3333 25 29.2886 25 28V3.99996C25 2.7113 23.9553 1.66663 22.6667 1.66663H9.33333ZM9 7.66663V23H23V7.66663H9ZM18 26H14V27.3333H18V26Z", fill: "#6C6E6F" })));
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export default MobilePhoneIcon;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
class PlayIcon extends React.Component {
|
|
3
|
+
render() {
|
|
4
|
+
return (React.createElement("svg", { width: this.props.width, height: this.props.height, viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
|
|
5
|
+
React.createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M18.1891 8.29879C18.6116 8.5331 18.9367 8.80345 19.162 9.10985C19.3873 9.41624 19.5 9.71863 19.5 10.019C19.5 10.3194 19.396 10.6158 19.1837 10.9102C18.9713 11.2026 18.6463 11.4669 18.2108 11.7012L10.9111 15.6724L3.58975 19.6035C3.15207 19.8378 2.74256 19.9679 2.36122 19.994C1.98204 20.02 1.65703 19.9619 1.38836 19.8177C1.12185 19.6735 0.905177 19.4453 0.742673 19.1328C0.582335 18.8204 0.5 18.4419 0.5 17.9994V2.00062C0.5 1.55805 0.573669 1.17956 0.721006 0.867153C0.87051 0.554748 1.09152 0.326452 1.38836 0.182265C1.6852 0.0380777 2.02104 -0.0199976 2.39372 0.00603615C2.76639 0.0340725 3.16507 0.164241 3.58975 0.398545L10.9111 4.36769L18.1891 8.29879Z", fill: "white" })));
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export default PlayIcon;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
class StatsIcon extends React.Component {
|
|
3
|
+
render() {
|
|
4
|
+
return (React.createElement("svg", { width: this.props.width, height: this.props.height, viewBox: "0 0 36 36", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
|
|
5
|
+
React.createElement("g", { clipPath: "url(#clip0_538_5831)" },
|
|
6
|
+
React.createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M14.5925 1.7998V32.6941H10.4849V14.8588H3.671V32.6941H0.899902V34.7641H35.099V32.6941H32.3603V8.0125H25.514V32.6941H21.4397V1.7998H14.5925Z", fill: "#9DA0A6" })),
|
|
7
|
+
React.createElement("defs", null,
|
|
8
|
+
React.createElement("clipPath", { id: "clip0_538_5831" },
|
|
9
|
+
React.createElement("rect", { width: "36", height: "36", fill: "white" })))));
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export default StatsIcon;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
const TimesIcon = (props) => {
|
|
3
|
+
return (React.createElement("svg", { width: props.width, height: props.height, viewBox: "0 0 25 24", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
|
|
4
|
+
React.createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M6.29999 3.73242L12.8 10.2324L19.3 3.73242L21.0678 5.50019L14.5678 12.0002L21.0678 18.5002L19.3 20.268L12.8 13.768L6.29999 20.268L4.53223 18.5002L11.0322 12.0002L4.53223 5.50019L6.29999 3.73242Z", fill: "#FF7F7F" })));
|
|
5
|
+
};
|
|
6
|
+
export default TimesIcon;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
class WarningIcon extends React.Component {
|
|
3
|
+
render() {
|
|
4
|
+
return (React.createElement("svg", { width: this.props.width, height: this.props.height, viewBox: "0 0 22 20", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
|
|
5
|
+
React.createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M11.0022 0.75L21.8012 19.4545H0.203125L11.0022 0.75ZM11.7522 13.5V7.5H10.2522V13.5H11.7522ZM11.8022 14.95H10.2022V16.55H11.8022V14.95Z", fill: "#F58B00" })));
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export default WarningIcon;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { DARK_THEME } from '@/services/ThemeManager/constants';
|
|
3
|
+
import './App.styles.css';
|
|
4
|
+
const colors = DARK_THEME.colors;
|
|
5
|
+
const typography = DARK_THEME.typography;
|
|
6
|
+
class App extends React.Component {
|
|
7
|
+
componentDidMount() {
|
|
8
|
+
Object.keys(colors).forEach((key) => {
|
|
9
|
+
document.documentElement.style.setProperty(`--sdk-${key}`, colors[key]);
|
|
10
|
+
});
|
|
11
|
+
Object.keys(typography).forEach((key) => {
|
|
12
|
+
document.documentElement.style.setProperty(`--sdk-font-${key}`, typography[key]);
|
|
13
|
+
});
|
|
14
|
+
// const existingScript = document.querySelector(
|
|
15
|
+
// 'script[src="https://unpkg.com/@rive-app/canvas"]'
|
|
16
|
+
// );
|
|
17
|
+
// if (!existingScript) {
|
|
18
|
+
// const script = document.createElement('script');
|
|
19
|
+
// script.src = 'https://unpkg.com/@rive-app/canvas';
|
|
20
|
+
// document.body.appendChild(script);
|
|
21
|
+
// }
|
|
22
|
+
}
|
|
23
|
+
componentWillUnmount() {
|
|
24
|
+
Object.keys(colors).forEach((key) => {
|
|
25
|
+
document.documentElement.style.removeProperty(`--sdk-${key}`);
|
|
26
|
+
});
|
|
27
|
+
Object.keys(typography).forEach((key) => {
|
|
28
|
+
document.documentElement.style.removeProperty(`--sdk-font-${key}`);
|
|
29
|
+
});
|
|
30
|
+
// const script = document.querySelector(
|
|
31
|
+
// 'script[src="https://unpkg.com/@rive-app/canvas"]'
|
|
32
|
+
// );
|
|
33
|
+
// if (script) {
|
|
34
|
+
// script.remove();
|
|
35
|
+
// }
|
|
36
|
+
}
|
|
37
|
+
render() {
|
|
38
|
+
return React.createElement("div", { className: "sdk-wrapper" }, this.props.children);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export default App;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
const OverlayContainer = React.createClass({
|
|
3
|
+
propTypes: {
|
|
4
|
+
viewModels: React.PropTypes.object,
|
|
5
|
+
},
|
|
6
|
+
getInitialState() {
|
|
7
|
+
return {
|
|
8
|
+
isVisible: false,
|
|
9
|
+
currentOverlay: null,
|
|
10
|
+
};
|
|
11
|
+
},
|
|
12
|
+
componentDidMount() {
|
|
13
|
+
if (!this.props.viewModels?.overlayViewModel)
|
|
14
|
+
return;
|
|
15
|
+
const overlayVM = this.props.viewModels.overlayViewModel;
|
|
16
|
+
// Subscribe to overlay visibility changes
|
|
17
|
+
this.unsubscribeVisible = overlayVM.isVisible.subscribe((visible) => {
|
|
18
|
+
this.setState({ isVisible: visible });
|
|
19
|
+
});
|
|
20
|
+
// Subscribe to current overlay changes
|
|
21
|
+
this.unsubscribeOverlay = overlayVM.currentOverlay.subscribe((overlay) => {
|
|
22
|
+
this.setState({ currentOverlay: overlay });
|
|
23
|
+
});
|
|
24
|
+
},
|
|
25
|
+
componentWillUnmount() {
|
|
26
|
+
if (this.unsubscribeVisible)
|
|
27
|
+
this.unsubscribeVisible();
|
|
28
|
+
if (this.unsubscribeOverlay)
|
|
29
|
+
this.unsubscribeOverlay();
|
|
30
|
+
},
|
|
31
|
+
render() {
|
|
32
|
+
if (!this.state.isVisible || !this.state.currentOverlay) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
const overlay = this.state.currentOverlay;
|
|
36
|
+
const Overlay = require('../molecules/Overlay').default;
|
|
37
|
+
return React.createElement(Overlay, {
|
|
38
|
+
key: `overlay-${overlay.type}-${Date.now()}`,
|
|
39
|
+
id: 'sdk-managed-rive-overlay',
|
|
40
|
+
overlayType: overlay.type,
|
|
41
|
+
position: overlay.position,
|
|
42
|
+
winningBet: overlay.winningBet,
|
|
43
|
+
fantasy: overlay.fantasy,
|
|
44
|
+
onOverlayViewed: (overlayType) => {
|
|
45
|
+
if (this.props.viewModels?.overlayViewModel) {
|
|
46
|
+
this.props.viewModels.overlayViewModel.handleOverlayViewed(overlayType);
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
onOverlayAction: (overlayType) => {
|
|
50
|
+
if (this.props.viewModels?.overlayViewModel) {
|
|
51
|
+
this.props.viewModels.overlayViewModel.handleOverlayAction(overlayType);
|
|
52
|
+
this.props.viewModels.overlayViewModel.hideOverlay();
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
export default OverlayContainer;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { PanelManagerViewModel } from '@/view-models/PanelManagerViewModel';
|
|
3
|
+
import './PanelManager.styles.css';
|
|
4
|
+
import PanelNavigation from '@/components/organisms/PanelNavigation';
|
|
5
|
+
import KeyPlaysView from '@/modules/key-plays/view/KeyPlaysView';
|
|
6
|
+
import BetsView from '@/modules/bets/view/BetsView';
|
|
7
|
+
const panelManagerViewModel = new PanelManagerViewModel();
|
|
8
|
+
const PANELS_MAP = {
|
|
9
|
+
keyPlays: React.createElement(KeyPlaysView, null),
|
|
10
|
+
bets: React.createElement(BetsView, null),
|
|
11
|
+
stats: React.createElement("div", { className: "panel-coming-soon T02" }, "Stats - Coming Soon"),
|
|
12
|
+
fantasy: React.createElement("div", { className: "panel-coming-soon T02" }, "Fantasy - Coming Soon"),
|
|
13
|
+
};
|
|
14
|
+
class PanelManager extends React.Component {
|
|
15
|
+
constructor(props) {
|
|
16
|
+
super(props);
|
|
17
|
+
Object.defineProperty(this, "unsubscribe", {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
configurable: true,
|
|
20
|
+
writable: true,
|
|
21
|
+
value: null
|
|
22
|
+
});
|
|
23
|
+
this.state = {
|
|
24
|
+
activePanel: panelManagerViewModel.currentPanel,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
componentDidMount() {
|
|
28
|
+
// Subscribe to changes in the view model
|
|
29
|
+
this.unsubscribe = panelManagerViewModel.currentPanelObservable.subscribe(() => {
|
|
30
|
+
this.setState({ activePanel: panelManagerViewModel.currentPanel });
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
componentWillUnmount() {
|
|
34
|
+
if (this.unsubscribe) {
|
|
35
|
+
this.unsubscribe();
|
|
36
|
+
this.unsubscribe = null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
goToPanel(panel) {
|
|
40
|
+
return () => {
|
|
41
|
+
if (panelManagerViewModel.currentPanel === panel) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
panelManagerViewModel.currentPanel = panel;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
render() {
|
|
48
|
+
const { activePanel } = this.state;
|
|
49
|
+
const PANEL_ITEMS = [
|
|
50
|
+
{
|
|
51
|
+
iconName: 'keyPlays',
|
|
52
|
+
onEnter: this.goToPanel('keyPlays'),
|
|
53
|
+
title: 'KEY PLAYS',
|
|
54
|
+
active: activePanel === 'keyPlays',
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
iconName: 'bets',
|
|
58
|
+
onEnter: this.goToPanel('bets'),
|
|
59
|
+
title: 'BETS',
|
|
60
|
+
active: activePanel === 'bets',
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
iconName: 'stats',
|
|
64
|
+
onEnter: this.goToPanel('stats'),
|
|
65
|
+
title: 'STATS',
|
|
66
|
+
active: activePanel === 'stats',
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
iconName: 'fantasy',
|
|
70
|
+
onEnter: this.goToPanel('fantasy'),
|
|
71
|
+
title: 'FANTASY',
|
|
72
|
+
active: activePanel === 'fantasy',
|
|
73
|
+
},
|
|
74
|
+
];
|
|
75
|
+
return (React.createElement("div", { className: "sdk--panel-manager" },
|
|
76
|
+
React.createElement(PanelNavigation, { items: PANEL_ITEMS }),
|
|
77
|
+
React.createElement("div", { className: "sdk--panel-wrapper" }, PANELS_MAP[activePanel])));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export default PanelManager;
|