be-components 2.1.8 → 2.2.0
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/lib/commonjs/EventComponents/AthleteCard.js +19 -0
- package/lib/commonjs/EventComponents/AthleteCard.js.map +1 -0
- package/lib/commonjs/EventComponents/TeamCard.js +33 -0
- package/lib/commonjs/EventComponents/TeamCard.js.map +1 -0
- package/lib/commonjs/EventComponents/TeamProfile/index.js +248 -0
- package/lib/commonjs/EventComponents/TeamProfile/index.js.map +1 -0
- package/lib/commonjs/EventComponents/api/index.js +46 -0
- package/lib/commonjs/EventComponents/api/index.js.map +1 -0
- package/lib/commonjs/EventComponents/index.js +16 -0
- package/lib/commonjs/EventComponents/index.js.map +1 -0
- package/lib/commonjs/MarketComponents/api/index.js +35 -1
- package/lib/commonjs/MarketComponents/api/index.js.map +1 -1
- package/lib/commonjs/MarketComponents/components/TeamEventList/api/index.js +41 -0
- package/lib/commonjs/MarketComponents/components/TeamEventList/api/index.js.map +1 -0
- package/lib/commonjs/MarketComponents/components/TeamEventList/index.js +148 -0
- package/lib/commonjs/MarketComponents/components/TeamEventList/index.js.map +1 -0
- package/lib/commonjs/MarketComponents/components/TeamEventMarket/index.js +9 -6
- package/lib/commonjs/MarketComponents/components/TeamEventMarket/index.js.map +1 -1
- package/lib/commonjs/SocialComponents/PlayerProfile/index.js +2 -1
- package/lib/commonjs/SocialComponents/PlayerProfile/index.js.map +1 -1
- package/lib/commonjs/index.js +7 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/EventComponents/AthleteCard.js +12 -0
- package/lib/module/EventComponents/AthleteCard.js.map +1 -0
- package/lib/module/EventComponents/TeamCard.js +26 -0
- package/lib/module/EventComponents/TeamCard.js.map +1 -0
- package/lib/module/EventComponents/TeamProfile/index.js +239 -0
- package/lib/module/EventComponents/TeamProfile/index.js.map +1 -0
- package/lib/module/EventComponents/api/index.js +40 -0
- package/lib/module/EventComponents/api/index.js.map +1 -0
- package/lib/module/EventComponents/index.js +9 -0
- package/lib/module/EventComponents/index.js.map +1 -0
- package/lib/module/MarketComponents/api/index.js +35 -1
- package/lib/module/MarketComponents/api/index.js.map +1 -1
- package/lib/module/MarketComponents/components/TeamEventList/api/index.js +36 -0
- package/lib/module/MarketComponents/components/TeamEventList/api/index.js.map +1 -0
- package/lib/module/MarketComponents/components/TeamEventList/index.js +139 -0
- package/lib/module/MarketComponents/components/TeamEventList/index.js.map +1 -0
- package/lib/module/MarketComponents/components/TeamEventMarket/index.js +9 -6
- package/lib/module/MarketComponents/components/TeamEventMarket/index.js.map +1 -1
- package/lib/module/SocialComponents/PlayerProfile/index.js +2 -1
- package/lib/module/SocialComponents/PlayerProfile/index.js.map +1 -1
- package/lib/module/index.js +2 -1
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/src/EventComponents/AthleteCard.d.ts +8 -0
- package/lib/typescript/src/EventComponents/AthleteCard.d.ts.map +1 -0
- package/lib/typescript/src/EventComponents/TeamCard.d.ts +8 -0
- package/lib/typescript/src/EventComponents/TeamCard.d.ts.map +1 -0
- package/lib/typescript/src/EventComponents/TeamProfile/index.d.ts +8 -0
- package/lib/typescript/src/EventComponents/TeamProfile/index.d.ts.map +1 -0
- package/lib/typescript/src/EventComponents/api/index.d.ts +9 -0
- package/lib/typescript/src/EventComponents/api/index.d.ts.map +1 -0
- package/lib/typescript/src/EventComponents/index.d.ts +14 -0
- package/lib/typescript/src/EventComponents/index.d.ts.map +1 -0
- package/lib/typescript/src/MarketComponents/api/index.d.ts +4 -1
- package/lib/typescript/src/MarketComponents/api/index.d.ts.map +1 -1
- package/lib/typescript/src/MarketComponents/components/TeamEventList/api/index.d.ts +11 -0
- package/lib/typescript/src/MarketComponents/components/TeamEventList/api/index.d.ts.map +1 -0
- package/lib/typescript/src/MarketComponents/components/TeamEventList/index.d.ts +27 -0
- package/lib/typescript/src/MarketComponents/components/TeamEventList/index.d.ts.map +1 -0
- package/lib/typescript/src/MarketComponents/components/TeamEventMarket/index.d.ts +2 -1
- package/lib/typescript/src/MarketComponents/components/TeamEventMarket/index.d.ts.map +1 -1
- package/lib/typescript/src/MarketComponents/index.d.ts +2 -1
- package/lib/typescript/src/MarketComponents/index.d.ts.map +1 -1
- package/lib/typescript/src/SocialComponents/PlayerProfile/index.d.ts +2 -1
- package/lib/typescript/src/SocialComponents/PlayerProfile/index.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +2 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/package.json +2 -1
- package/src/EventComponents/AthleteCard.tsx +18 -0
- package/src/EventComponents/TeamCard.tsx +24 -0
- package/src/EventComponents/TeamProfile/index.tsx +160 -0
- package/src/EventComponents/api/index.ts +42 -0
- package/src/EventComponents/index.tsx +9 -0
- package/src/MarketComponents/api/index.ts +31 -2
- package/src/MarketComponents/components/TeamEventList/api/index.ts +23 -0
- package/src/MarketComponents/components/TeamEventList/index.tsx +136 -0
- package/src/MarketComponents/components/TeamEventMarket/index.tsx +6 -5
- package/src/SocialComponents/PlayerProfile/index.tsx +3 -2
- package/src/index.tsx +3 -1
- package/src/types.d.ts +9 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "be-components",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"description": "Components for BettorEdge Apps",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|
|
@@ -172,6 +172,7 @@
|
|
|
172
172
|
"react-device-detect": "^2.2.3",
|
|
173
173
|
"react-native-linear-gradient": "^2.8.3",
|
|
174
174
|
"react-native-web-linear-gradient": "^1.1.2",
|
|
175
|
+
"react-native-web-swiper": "^2.2.4",
|
|
175
176
|
"us-bank-account-validator": "^1.0.0",
|
|
176
177
|
"uuid": "^9.0.1"
|
|
177
178
|
},
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { View } from 'react-native';
|
|
3
|
+
import { view_styles } from '../constants/styles';
|
|
4
|
+
import type { AthleteProps } from '../types';
|
|
5
|
+
|
|
6
|
+
type AthleteCardProps = {
|
|
7
|
+
team:AthleteProps
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const AthleteCard = ({ }:AthleteCardProps) => {
|
|
11
|
+
return (
|
|
12
|
+
<View style={{ ...view_styles.section }}>
|
|
13
|
+
|
|
14
|
+
</View>
|
|
15
|
+
)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export default AthleteCard
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { View } from 'react-native';
|
|
3
|
+
import { view_styles } from '../constants/styles';
|
|
4
|
+
import type { TeamProps } from '../types';
|
|
5
|
+
import { Text } from '../Components';
|
|
6
|
+
|
|
7
|
+
type TeamCardProps = {
|
|
8
|
+
team:TeamProps
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const TeamCard = ({ team }:TeamCardProps) => {
|
|
12
|
+
console.log(team)
|
|
13
|
+
return (
|
|
14
|
+
<View style={{ ...view_styles.section }}>
|
|
15
|
+
<View style={{ ...view_styles.section_header }}>
|
|
16
|
+
<View style={{ flex:1 }}>
|
|
17
|
+
<Text theme='header'>{team.market_name} {team.name}</Text>
|
|
18
|
+
</View>
|
|
19
|
+
</View>
|
|
20
|
+
</View>
|
|
21
|
+
)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export default TeamCard
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import React, { useEffect, useState } from 'react';
|
|
2
|
+
import { View, Image, ScrollView, FlatList, TouchableOpacity, ActivityIndicator } from 'react-native';
|
|
3
|
+
import type { EventProps, TeamProps } from '../../types';
|
|
4
|
+
import { EventComponentApi } from '../api';
|
|
5
|
+
import { Text } from '../../Components';
|
|
6
|
+
import LinearGradient from 'react-native-linear-gradient';
|
|
7
|
+
import Colors from '../../constants/colors';
|
|
8
|
+
import { view_styles } from '../../constants/styles';
|
|
9
|
+
import TeamEventList from '../../MarketComponents/components/TeamEventList';
|
|
10
|
+
|
|
11
|
+
type TeamProfileProps = {
|
|
12
|
+
team_id:string,
|
|
13
|
+
height:number
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const TeamProfile = ({ team_id, height }: TeamProfileProps ) => {
|
|
17
|
+
const [ module_size, setModuleSize ] = useState({ height:777, width:330 });
|
|
18
|
+
const [ team_data, setData ] = useState<{
|
|
19
|
+
loading:boolean,
|
|
20
|
+
team?:TeamProps,
|
|
21
|
+
event_toggle:string,
|
|
22
|
+
}>({
|
|
23
|
+
loading: false,
|
|
24
|
+
event_toggle: 'Upcoming',
|
|
25
|
+
});
|
|
26
|
+
const { team, event_toggle } = team_data;
|
|
27
|
+
const [ event_data, setEventData ] = useState<{
|
|
28
|
+
event_loading:boolean,
|
|
29
|
+
events:EventProps[],
|
|
30
|
+
event_offset:number
|
|
31
|
+
}>({
|
|
32
|
+
event_loading: false,
|
|
33
|
+
events: [],
|
|
34
|
+
event_offset: 0
|
|
35
|
+
});
|
|
36
|
+
const { event_loading, events } = event_data;
|
|
37
|
+
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
EventComponentApi.setEnvironment();
|
|
40
|
+
getTeamData(team_id)
|
|
41
|
+
},[team_id]);
|
|
42
|
+
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
getEventData(0);
|
|
45
|
+
},[event_toggle])
|
|
46
|
+
|
|
47
|
+
const getTeamData = async(id:string) => {
|
|
48
|
+
setData({ ...team_data, loading:true });
|
|
49
|
+
const team = await EventComponentApi.getTeamById(id);
|
|
50
|
+
setData({
|
|
51
|
+
...team_data,
|
|
52
|
+
loading: false,
|
|
53
|
+
team:team,
|
|
54
|
+
})
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const getEventData = async(offset:number) => {
|
|
58
|
+
setEventData({ ...event_data, event_loading:true });
|
|
59
|
+
let evs:EventProps[] = [];
|
|
60
|
+
switch(event_toggle){
|
|
61
|
+
case 'Upcoming':
|
|
62
|
+
evs = await EventComponentApi.getUpcomingScheduleByTeams(team_id, offset);
|
|
63
|
+
break
|
|
64
|
+
case 'Past':
|
|
65
|
+
evs = await EventComponentApi.getPastScheduleByTeams(team_id, offset);
|
|
66
|
+
break
|
|
67
|
+
default: break
|
|
68
|
+
}
|
|
69
|
+
setEventData({
|
|
70
|
+
...event_data,
|
|
71
|
+
event_loading: false,
|
|
72
|
+
event_offset: offset,
|
|
73
|
+
events: evs
|
|
74
|
+
})
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
const renderEventToggles = (data:{ item:string, index:number }) => {
|
|
80
|
+
const active = data.item == event_toggle ? true : false
|
|
81
|
+
return (
|
|
82
|
+
<TouchableOpacity style={{ width: (module_size.width - 65) / 2, padding:15, borderRadius:22, backgroundColor:active?Colors.brand.midnight:'transparent' }}
|
|
83
|
+
onPress={() => setData({ ...team_data, event_toggle: data.item })}>
|
|
84
|
+
<Text textAlign='center' weight='bold' size={14} color={active ?Colors.shades.white:Colors.brand.midnight}>{data.item}</Text>
|
|
85
|
+
</TouchableOpacity>
|
|
86
|
+
)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if(!team){ return <></> }
|
|
90
|
+
return (
|
|
91
|
+
<View style={{ height }} onLayout={(ev) => {
|
|
92
|
+
const { height, width } = ev.nativeEvent.layout;
|
|
93
|
+
setModuleSize({ height, width })
|
|
94
|
+
}}>
|
|
95
|
+
<View style={{ position:'absolute', top:0, left:0, right:0 }}>
|
|
96
|
+
<LinearGradient style={{ opacity:0.5, height:module_size.width, borderBottomLeftRadius:40, borderBottomRightRadius:40 }} colors={[team.primary_color ?? Colors.brand.midnightTopGradient, team.secondary_color ?? Colors.brand.midnight]} nativeID='team_header'/>
|
|
97
|
+
<View style={{ position:'absolute', top:0, left:0, right:0, bottom:0, alignItems:'center' }}>
|
|
98
|
+
<Image
|
|
99
|
+
source={{ uri:team.image?.url }}
|
|
100
|
+
style={{ height: module_size.width*0.75, width:module_size.width*0.75 }}
|
|
101
|
+
resizeMode='cover'
|
|
102
|
+
/>
|
|
103
|
+
</View>
|
|
104
|
+
</View>
|
|
105
|
+
<ScrollView style={{ flex:1 }}>
|
|
106
|
+
<View style={{ ...view_styles.section, marginTop:module_size.width *0.5 }}>
|
|
107
|
+
<View style={{ ...view_styles.section_header }}>
|
|
108
|
+
<Image
|
|
109
|
+
style={{ height:40, width:40 }}
|
|
110
|
+
source={{ uri: team.image?.url }}
|
|
111
|
+
resizeMode='cover'
|
|
112
|
+
/>
|
|
113
|
+
<View style={{ flex:1, marginLeft:10 }}>
|
|
114
|
+
<Text theme='header'>{team.market_name} {team.name}</Text>
|
|
115
|
+
<Text style={{ marginTop:4 }} theme='body_2'>{team.division} - {team.sub_division}</Text>
|
|
116
|
+
</View>
|
|
117
|
+
{team.rank ?
|
|
118
|
+
<Text size={22} color={Colors.brand.cyan} weight='bold'>{team.rank}</Text>
|
|
119
|
+
:<></>}
|
|
120
|
+
</View>
|
|
121
|
+
</View>
|
|
122
|
+
|
|
123
|
+
<View style={{ ...view_styles.section }}>
|
|
124
|
+
<View style={{ ...view_styles.section_header }}>
|
|
125
|
+
<View style={{ flex:1 }}>
|
|
126
|
+
<Text theme='header'>Events</Text>
|
|
127
|
+
<Text style={{ marginTop:3 }} theme='body_2'>Events that this team is participating in</Text>
|
|
128
|
+
</View>
|
|
129
|
+
</View>
|
|
130
|
+
<View style={{ ...view_styles.section_body, padding:0 }}>
|
|
131
|
+
<View style={{ ...view_styles.body_row, margin:10, marginLeft:20, marginRight:20, borderRadius:22, padding:1, backgroundColor:Colors.shades.shade100 }}>
|
|
132
|
+
<FlatList
|
|
133
|
+
key={'toggles'}
|
|
134
|
+
horizontal
|
|
135
|
+
showsHorizontalScrollIndicator={false}
|
|
136
|
+
data={['Upcoming', 'Past']}
|
|
137
|
+
renderItem={renderEventToggles}
|
|
138
|
+
keyExtractor={(item) => item}
|
|
139
|
+
|
|
140
|
+
/>
|
|
141
|
+
</View>
|
|
142
|
+
{event_loading ?
|
|
143
|
+
<ActivityIndicator
|
|
144
|
+
size='large'
|
|
145
|
+
color={Colors.brand.midnight}
|
|
146
|
+
style={{ padding:20, alignSelf:'center' }}
|
|
147
|
+
/>
|
|
148
|
+
:<></>}
|
|
149
|
+
<TeamEventList
|
|
150
|
+
key={`${team_id}_${event_toggle}`}
|
|
151
|
+
events={events}
|
|
152
|
+
/>
|
|
153
|
+
</View>
|
|
154
|
+
</View>
|
|
155
|
+
</ScrollView>
|
|
156
|
+
</View>
|
|
157
|
+
)
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export default TeamProfile
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import { APIOverrides } from "../../ApiOverrides";
|
|
3
|
+
import type { EventProps, TeamProps } from '../../types';
|
|
4
|
+
|
|
5
|
+
let EVENT_SVC_API = ''
|
|
6
|
+
//let AUTH_SVC_API = ''
|
|
7
|
+
|
|
8
|
+
export { EventComponentApi }
|
|
9
|
+
|
|
10
|
+
const EventComponentApi = {
|
|
11
|
+
setEnvironment: () => {
|
|
12
|
+
const endpoints = APIOverrides.getEndpoints();
|
|
13
|
+
EVENT_SVC_API = endpoints['EVENT_SVC_API'] as string;
|
|
14
|
+
//MK_SVC_API = endpoints['MK_SVC_API'] as string;
|
|
15
|
+
//AUTH_SVC_API = endpoints['AUTH_SVC_API'] as string;
|
|
16
|
+
},
|
|
17
|
+
getTeamById: async(team_id:string):Promise<undefined|TeamProps> => {
|
|
18
|
+
try {
|
|
19
|
+
const resp = await axios.get(`${EVENT_SVC_API}/v1/teams/team/${team_id}`);
|
|
20
|
+
return resp.data.team
|
|
21
|
+
} catch (e) {
|
|
22
|
+
console.log(e);
|
|
23
|
+
return undefined
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
getUpcomingScheduleByTeams: async(team_ids:string, offset:number):Promise<EventProps[]> => {
|
|
27
|
+
try {
|
|
28
|
+
const resp = await axios.get(`${EVENT_SVC_API}/v1/teams/schedule/upcoming/${team_ids}?offset=${offset}`)
|
|
29
|
+
return resp.data.events
|
|
30
|
+
} catch (e) {
|
|
31
|
+
return []
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
getPastScheduleByTeams: async(team_ids:string, offset:number):Promise<EventProps[]> => {
|
|
35
|
+
try {
|
|
36
|
+
const resp = await axios.get(`${EVENT_SVC_API}/v1/teams/schedule/past/${team_ids}?offset=${offset}`)
|
|
37
|
+
return resp.data.events
|
|
38
|
+
} catch (e) {
|
|
39
|
+
return []
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import axios from 'axios';
|
|
2
2
|
import { APIOverrides } from "../../ApiOverrides"
|
|
3
|
-
import type { AthleteProps, ContestStatProps, EventOrderStatProps, EventProps, MarketProps, MarketSideOptionProps, MatchProps, OrderProps, TeamProps, TournamentProps } from "../../types"
|
|
3
|
+
import type { AthleteProps, BestAvailableResponseProps, ContestStatProps, EventOrderStatProps, EventProps, MarketProps, MarketSideOptionProps, MatchProps, OrderProps, TeamProps, TournamentProps } from "../../types"
|
|
4
4
|
|
|
5
5
|
let EVENT_SVC_API = ''
|
|
6
6
|
let AUTH_SVC_API = ''
|
|
7
|
+
let MK_SVC_API = ''
|
|
7
8
|
|
|
8
9
|
export { MarketComponentApi, MarketComponentHelpers }
|
|
9
10
|
|
|
@@ -11,9 +12,37 @@ const MarketComponentApi = {
|
|
|
11
12
|
setEnvironment: () => {
|
|
12
13
|
const endpoints = APIOverrides.getEndpoints();
|
|
13
14
|
EVENT_SVC_API = endpoints['EVENT_SVC_API'] as string;
|
|
14
|
-
|
|
15
|
+
MK_SVC_API = endpoints['MK_SVC_API'] as string;
|
|
15
16
|
AUTH_SVC_API = endpoints['AUTH_SVC_API'] as string;
|
|
16
17
|
},
|
|
18
|
+
getMarkets:async():Promise<MarketProps[]> => {
|
|
19
|
+
try {
|
|
20
|
+
const resp = await axios.get(`${MK_SVC_API}/v1/markets/all`);
|
|
21
|
+
return resp.data.markets
|
|
22
|
+
} catch (e) {
|
|
23
|
+
console.log(e)
|
|
24
|
+
return []
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
getLatestTradesByEvents: async(event_type: string, event_ids:string[]) => {
|
|
28
|
+
try {
|
|
29
|
+
if(event_ids.length == 0){ return [] }
|
|
30
|
+
const resp = await axios.post(`${MK_SVC_API}/v1/trades/event/latest/bulk/get`, { event_type, event_ids })
|
|
31
|
+
return resp.data.trades
|
|
32
|
+
} catch (e) {
|
|
33
|
+
console.log(e)
|
|
34
|
+
return []
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
getBestAvailableOrders:async():Promise<BestAvailableResponseProps | undefined> => {
|
|
38
|
+
try {
|
|
39
|
+
const resp = await axios.get(`${MK_SVC_API}/v1/orders/available`);
|
|
40
|
+
return resp.data
|
|
41
|
+
} catch (e) {
|
|
42
|
+
console.log(e)
|
|
43
|
+
return undefined
|
|
44
|
+
}
|
|
45
|
+
},
|
|
17
46
|
getAthletesByTeamId: async(team_id:string):Promise<AthleteProps[]> => {
|
|
18
47
|
try {
|
|
19
48
|
const resp = await axios.get(`${EVENT_SVC_API}/v1/athletes/team/${team_id}`)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { BestAvailableOrderProps, BestAvailableResponseProps, EventOrderStatProps, EventProps, TradeProps } from "../../../../types";
|
|
2
|
+
|
|
3
|
+
export { TeamEventListHelpers }
|
|
4
|
+
|
|
5
|
+
const TeamEventListHelpers = {
|
|
6
|
+
getEventMarketDataFromBestAvailable: (ba:BestAvailableResponseProps, events:EventProps[]):{ updated:boolean, latest_trades:TradeProps[], event_order_stats:EventOrderStatProps[], available_orders:BestAvailableOrderProps[] } => {
|
|
7
|
+
let updated = false;
|
|
8
|
+
let event_order_stats:EventOrderStatProps[] = []
|
|
9
|
+
let available_orders:BestAvailableOrderProps[] = []
|
|
10
|
+
let latest_trades:TradeProps[] = []
|
|
11
|
+
ba.events.map(ba_event => {
|
|
12
|
+
if(!ba_event.supported_markets){ return }
|
|
13
|
+
if(!events.find(e => e.event_id == ba_event.event_id)){ return }
|
|
14
|
+
updated = true
|
|
15
|
+
ba_event.supported_markets.map(sm => {
|
|
16
|
+
if(sm.available_orders){ available_orders = available_orders.concat(sm.available_orders) }
|
|
17
|
+
if(sm.order_stats){ event_order_stats = event_order_stats.concat(sm.order_stats) }
|
|
18
|
+
if(sm.latest_trades){ latest_trades = latest_trades.concat(sm.latest_trades) }
|
|
19
|
+
})
|
|
20
|
+
})
|
|
21
|
+
return { updated, event_order_stats, available_orders, latest_trades }
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import React, { useEffect, useState } from 'react';
|
|
2
|
+
import { View, FlatList } from 'react-native';
|
|
3
|
+
import type { BestAvailableOrderProps, BestAvailableResponseProps, EventOrderStatProps, EventProps, MarketProps, OrderProps, TradeProps } from '../../../types';
|
|
4
|
+
import TeamEventMarket from '../TeamEventMarket';
|
|
5
|
+
import { MarketComponentApi } from '../../api';
|
|
6
|
+
import { TeamEventListHelpers } from './api';
|
|
7
|
+
import SocketManager from '../../../Socket';
|
|
8
|
+
|
|
9
|
+
type TeamEventListProps = {
|
|
10
|
+
key:string //Change key to reload data
|
|
11
|
+
events:EventProps[],
|
|
12
|
+
distinct_id?:string,
|
|
13
|
+
show_grades?:boolean,
|
|
14
|
+
show_id?:boolean,
|
|
15
|
+
init_expanded_ids?:string[],
|
|
16
|
+
onTeamSelect?:(team_id:string) => void,
|
|
17
|
+
onActivate?:(event_id:string, event_type:string) => void,
|
|
18
|
+
onViewEvent?:(data:{ event_id:string, event_type:string, market_id:string, side_id?:string, side_type?:string }) => void,
|
|
19
|
+
onOrder?:(o:OrderProps) => void,
|
|
20
|
+
onCompetitionSelect?:(competition_id:string) => void,
|
|
21
|
+
onSquaresSelect?:(sq_comp_id:string) => void,
|
|
22
|
+
onTradeLongPress?:(trade:TradeProps) => void,
|
|
23
|
+
onViewAdditionalMarkets?:(event_id:string, event_type:string) => void
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const TeamEventList = ({ events, show_grades, show_id, key, distinct_id, init_expanded_ids, onTeamSelect, onViewEvent, onOrder, onCompetitionSelect, onSquaresSelect, onTradeLongPress, onViewAdditionalMarkets, onActivate }:TeamEventListProps) => {
|
|
27
|
+
const [ needs_reload, setNeedsReload ] = useState(false);
|
|
28
|
+
const [ socket_response, setSocketResponse ] = useState<{ event_ids:string[], ba_response:BestAvailableResponseProps } | undefined>(undefined);
|
|
29
|
+
const [ event_data, setListData ] = useState<{
|
|
30
|
+
loading:boolean,
|
|
31
|
+
markets:MarketProps[],
|
|
32
|
+
latest_trades: TradeProps[],
|
|
33
|
+
available_orders: BestAvailableOrderProps[],
|
|
34
|
+
order_stats:EventOrderStatProps[]
|
|
35
|
+
}>({
|
|
36
|
+
loading:false,
|
|
37
|
+
latest_trades: [],
|
|
38
|
+
markets:[],
|
|
39
|
+
available_orders: [],
|
|
40
|
+
order_stats: []
|
|
41
|
+
});
|
|
42
|
+
const { available_orders, order_stats, latest_trades, markets } = event_data;
|
|
43
|
+
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
MarketComponentApi.setEnvironment();
|
|
46
|
+
if(events.length > 0){ getDataFromServer() }
|
|
47
|
+
},[key, events.length]);
|
|
48
|
+
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
if(!socket_response){ return }
|
|
51
|
+
const updated_data = TeamEventListHelpers.getEventMarketDataFromBestAvailable(socket_response.ba_response, events);
|
|
52
|
+
if(!updated_data.updated){ return }
|
|
53
|
+
setListData({
|
|
54
|
+
...event_data,
|
|
55
|
+
order_stats: order_stats.filter(os => !socket_response.event_ids.find(new_id => new_id == os.event_id)).concat(updated_data.event_order_stats),
|
|
56
|
+
available_orders: available_orders.filter(os => !socket_response.event_ids.find(new_id => new_id == os.event_id)).concat(updated_data.available_orders),
|
|
57
|
+
latest_trades: latest_trades.filter(lt => !socket_response.event_ids.find(new_id => new_id == lt.event_id)).concat(updated_data.latest_trades)
|
|
58
|
+
})
|
|
59
|
+
},[socket_response])
|
|
60
|
+
|
|
61
|
+
const getDataFromServer = async() => {
|
|
62
|
+
setListData({ ...event_data, loading:true });
|
|
63
|
+
const ba = await MarketComponentApi.getBestAvailableOrders();
|
|
64
|
+
if(!ba){ return }
|
|
65
|
+
const lt = await MarketComponentApi.getLatestTradesByEvents('team', events.map(e => e.event_id));
|
|
66
|
+
const ev_data = TeamEventListHelpers.getEventMarketDataFromBestAvailable(ba, events);
|
|
67
|
+
const maks = await MarketComponentApi.getMarkets();
|
|
68
|
+
setListData({
|
|
69
|
+
...event_data,
|
|
70
|
+
loading:false,
|
|
71
|
+
latest_trades: lt,
|
|
72
|
+
markets: maks,
|
|
73
|
+
order_stats: ev_data.event_order_stats,
|
|
74
|
+
available_orders: ev_data.available_orders
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const renderEvents = (data: { item:EventProps, index:number }) => {
|
|
79
|
+
const ba = available_orders.filter(o => o.event_id == data.item.event_id && o.event_type == 'team');
|
|
80
|
+
const order_st = order_stats.filter(os => os.event_id == data.item.event_id && os.event_type == 'team');
|
|
81
|
+
const lts = latest_trades.filter(lt => lt.event_id == data.item.event_id && lt.event_type == 'team');
|
|
82
|
+
let init_expanded = false
|
|
83
|
+
if(init_expanded_ids && init_expanded_ids.includes(data.item.event_id)){ init_expanded = true }
|
|
84
|
+
return (
|
|
85
|
+
<TeamEventMarket
|
|
86
|
+
event={data.item}
|
|
87
|
+
show_grades={show_grades}
|
|
88
|
+
show_id={show_id ? 'true' : 'false'}
|
|
89
|
+
markets={markets}
|
|
90
|
+
init_expanded={init_expanded}
|
|
91
|
+
latest_trades={lts}
|
|
92
|
+
best_available_orders={ba}
|
|
93
|
+
onTeamSelect={onTeamSelect}
|
|
94
|
+
default_price_view='best_available'
|
|
95
|
+
event_order_stats={order_st}
|
|
96
|
+
onActivate={onActivate ? onActivate : undefined}
|
|
97
|
+
onView={(ev) => {
|
|
98
|
+
if(onViewEvent){ onViewEvent(ev) }
|
|
99
|
+
}}
|
|
100
|
+
onOrder={(o) => onOrder ? onOrder(o) : console.log('')}
|
|
101
|
+
onCompetitionSelect={(c) => onCompetitionSelect ? onCompetitionSelect(c) : console.log('')}
|
|
102
|
+
onSquaresSelect={(s) => onSquaresSelect ? onSquaresSelect(s) : console.log(s)}
|
|
103
|
+
onViewAdditionalMarkets={(event_id, event_type) => onViewAdditionalMarkets ? onViewAdditionalMarkets(event_id, event_type) : console.log('')}
|
|
104
|
+
onTradeLongPress={(t) => onTradeLongPress ? onTradeLongPress(t) : console.log(t)}
|
|
105
|
+
/>
|
|
106
|
+
)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return (
|
|
110
|
+
<View>
|
|
111
|
+
<FlatList
|
|
112
|
+
data={events}
|
|
113
|
+
renderItem={renderEvents}
|
|
114
|
+
keyExtractor={(item) => item.event_id.toString()}
|
|
115
|
+
/>
|
|
116
|
+
<SocketManager
|
|
117
|
+
distinct_id={distinct_id}
|
|
118
|
+
onConnect={() => {
|
|
119
|
+
if(needs_reload){
|
|
120
|
+
getDataFromServer();
|
|
121
|
+
setNeedsReload(false);
|
|
122
|
+
}
|
|
123
|
+
}}
|
|
124
|
+
onDisconnect={() => setNeedsReload(true)}
|
|
125
|
+
onSocketEvent={(ev) => {
|
|
126
|
+
if(ev.type != 'V1_LOAD_BEST_AVAILABLE'){ return }
|
|
127
|
+
let event_ids = ev.data.events.map((e:EventProps) => e.event_id);
|
|
128
|
+
setSocketResponse({ event_ids, ba_response: ev.data });
|
|
129
|
+
}}
|
|
130
|
+
subscribed_events={['V1_LOAD_BEST_AVAILABLE']}
|
|
131
|
+
/>
|
|
132
|
+
</View>
|
|
133
|
+
)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export default TeamEventList
|
|
@@ -31,6 +31,7 @@ type TeamEventMarketProps = {
|
|
|
31
31
|
onOrder:(order:OrderProps) => void,
|
|
32
32
|
onEvent?:(be_event:BEEventProps) => void,
|
|
33
33
|
onExpand?:(expanded:boolean) => void,
|
|
34
|
+
onTeamSelect?:(team_id:string) => void,
|
|
34
35
|
show_grades?:boolean,
|
|
35
36
|
onCompetitionSelect:(competition_id:string) => void,
|
|
36
37
|
onSquaresSelect: (sq_comp_id:string) => void,
|
|
@@ -39,7 +40,7 @@ type TeamEventMarketProps = {
|
|
|
39
40
|
onActivate?:(event_id:string, event_type:string) => void
|
|
40
41
|
activate_loading?:boolean
|
|
41
42
|
}
|
|
42
|
-
const TeamEventMarket = ({ event, init_expanded, show_id, activate_loading, competitions, squares_competition, show_grades, markets, latest_trades, best_available_orders, event_order_stats, default_price_view, onSquaresSelect, onCompetitionSelect, onExpand, onOrder, onView, onViewAdditionalMarkets, onTradeLongPress, onActivate, onEvent }:TeamEventMarketProps) => {
|
|
43
|
+
const TeamEventMarket = ({ event, init_expanded, show_id, activate_loading, competitions, squares_competition, show_grades, markets, latest_trades, best_available_orders, event_order_stats, default_price_view, onTeamSelect, onSquaresSelect, onCompetitionSelect, onExpand, onOrder, onView, onViewAdditionalMarkets, onTradeLongPress, onActivate, onEvent }:TeamEventMarketProps) => {
|
|
43
44
|
const [ expanded_data, setExpandedData ] = useState<{
|
|
44
45
|
expanded:boolean,
|
|
45
46
|
loaded:boolean,
|
|
@@ -334,7 +335,7 @@ const TeamEventMarket = ({ event, init_expanded, show_id, activate_loading, comp
|
|
|
334
335
|
|
|
335
336
|
<Text size={12} color={show_stats ? Colors.utility.error : Colors.brand.electric}>{show_stats ? 'Hide Boxscore': `${TeamEventMarketHelpers.getTimeDetail(event)}`}</Text>
|
|
336
337
|
</TouchableOpacity>
|
|
337
|
-
<
|
|
338
|
+
<TouchableOpacity disabled={!onTeamSelect} style={{ ...view_styles.body_row, minHeight:48 }} onPress={() => onTeamSelect ? onTeamSelect(event.away_team_id) : console.log('')}>
|
|
338
339
|
<Image
|
|
339
340
|
source={{ uri: event.away.image?.url }}
|
|
340
341
|
style={{ height:30, width:30 }}
|
|
@@ -352,8 +353,8 @@ const TeamEventMarket = ({ event, init_expanded, show_id, activate_loading, comp
|
|
|
352
353
|
</View>
|
|
353
354
|
<Text theme='body'>{event.away_team_score}</Text>
|
|
354
355
|
</View>
|
|
355
|
-
</
|
|
356
|
-
<
|
|
356
|
+
</TouchableOpacity>
|
|
357
|
+
<TouchableOpacity disabled={!onTeamSelect} style={{ ...view_styles.body_row, minHeight:48 }} onPress={() => onTeamSelect ? onTeamSelect(event.home_team_id) : console.log('')}>
|
|
357
358
|
<Image
|
|
358
359
|
source={{ uri: event.home.image?.url }}
|
|
359
360
|
style={{ height:30, width:30 }}
|
|
@@ -371,7 +372,7 @@ const TeamEventMarket = ({ event, init_expanded, show_id, activate_loading, comp
|
|
|
371
372
|
</View>
|
|
372
373
|
<Text theme='body'>{event.home_team_score}</Text>
|
|
373
374
|
</View>
|
|
374
|
-
</
|
|
375
|
+
</TouchableOpacity>
|
|
375
376
|
</View>
|
|
376
377
|
{event_status == 'active' ?
|
|
377
378
|
<View nativeID='primary_market_details' style={{ padding:5 }}>
|
|
@@ -14,6 +14,7 @@ type PlayerProfileProps = {
|
|
|
14
14
|
viewing_player_id:string,
|
|
15
15
|
player_id?:string,
|
|
16
16
|
height?:number,
|
|
17
|
+
maxWidth:number,
|
|
17
18
|
padding_insets?:{ top:number, bottom:number },
|
|
18
19
|
onStartChat?:(player_id:string) => void,
|
|
19
20
|
onHeadToHead?: (player_id:string) => void,
|
|
@@ -28,7 +29,7 @@ type PlayerProfileProps = {
|
|
|
28
29
|
onBack?:() => void
|
|
29
30
|
}
|
|
30
31
|
|
|
31
|
-
const PlayerProfile = ({ viewing_player_id, padding_insets, player_id, height, onStartChat, onHeadToHead, onCopyOrder, onFadeOrder, onViewPostComments, onEditProfile, onSelectPlayer, onRequestAuthenticate, onBack }:PlayerProfileProps) => {
|
|
32
|
+
const PlayerProfile = ({ viewing_player_id, maxWidth, padding_insets, player_id, height, onStartChat, onHeadToHead, onCopyOrder, onFadeOrder, onViewPostComments, onEditProfile, onSelectPlayer, onRequestAuthenticate, onBack }:PlayerProfileProps) => {
|
|
32
33
|
const [ module_size, setModuleSize ] = useState({ height:755, width:330 });
|
|
33
34
|
const [ show_following, setShowFollowing ] = useState<{
|
|
34
35
|
visible:boolean,
|
|
@@ -207,7 +208,7 @@ const PlayerProfile = ({ viewing_player_id, padding_insets, player_id, height, o
|
|
|
207
208
|
}
|
|
208
209
|
|
|
209
210
|
return (
|
|
210
|
-
<View style={{ flex:1, backgroundColor:Colors.shades.black_faded, maxWidth
|
|
211
|
+
<View style={{ flex:1, backgroundColor:Colors.shades.black_faded, maxWidth }} onLayout={(ev) => {
|
|
211
212
|
const { height, width } = ev.nativeEvent.layout
|
|
212
213
|
setModuleSize({ width, height });
|
|
213
214
|
}}>
|
package/src/index.tsx
CHANGED
|
@@ -26,8 +26,9 @@ import SeasonManager from "./CompetitionSeasonManager";
|
|
|
26
26
|
import SeasonModule from "./CompetitionSeason";
|
|
27
27
|
import CreateSeasonForm from "./CompetitionSeasonManager/components/CreateSeasonForm";
|
|
28
28
|
import MarketComponents from './MarketComponents';
|
|
29
|
-
import
|
|
29
|
+
import EventComponents from './EventComponents';
|
|
30
30
|
|
|
31
|
+
import LocationTracker from "./LocationTracker";
|
|
31
32
|
export {
|
|
32
33
|
Authenticator,
|
|
33
34
|
Observer,
|
|
@@ -46,6 +47,7 @@ export {
|
|
|
46
47
|
MyWallet,
|
|
47
48
|
Checkout,
|
|
48
49
|
MarketComponents,
|
|
50
|
+
EventComponents,
|
|
49
51
|
PollCampaign,
|
|
50
52
|
PollCampaignApi,
|
|
51
53
|
PollApi,
|
package/src/types.d.ts
CHANGED
|
@@ -160,6 +160,12 @@ export interface ContestStatProps {
|
|
|
160
160
|
last_update_datetime:any
|
|
161
161
|
}
|
|
162
162
|
|
|
163
|
+
export interface BestAvailableResponseProps {
|
|
164
|
+
events: EventProps[],
|
|
165
|
+
tournaments: TournamentProps[],
|
|
166
|
+
matches:MatchProps[]
|
|
167
|
+
}
|
|
168
|
+
|
|
163
169
|
export interface AthleteProps {
|
|
164
170
|
athlete_id:string,
|
|
165
171
|
first_name:string,
|
|
@@ -220,6 +226,9 @@ export interface SupportedMarketProps {
|
|
|
220
226
|
market_id:string,
|
|
221
227
|
external_id?:string,
|
|
222
228
|
removed?:boolean //When true - it will no longer accept bets
|
|
229
|
+
available_orders?: BestAvailableOrderProps[],
|
|
230
|
+
order_stats?:EventOrderStatProps[],
|
|
231
|
+
latest_trades?:TradeProps[]
|
|
223
232
|
}
|
|
224
233
|
|
|
225
234
|
export interface EventScoringProps {
|