be-components 1.5.9 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/Checkout/index.js +8 -6
- package/lib/commonjs/Checkout/index.js.map +1 -1
- package/lib/commonjs/CompetitionManager/components/AthleteSelector.js +50 -1
- package/lib/commonjs/CompetitionManager/components/AthleteSelector.js.map +1 -1
- package/lib/commonjs/Components/Icons.js +90 -0
- package/lib/commonjs/Components/Icons.js.map +1 -1
- package/lib/commonjs/Engage/components/BracketCompetitionCard.js +3 -1
- package/lib/commonjs/Engage/components/BracketCompetitionCard.js.map +1 -1
- package/lib/commonjs/Engage/components/CompetitionCard.js +3 -1
- package/lib/commonjs/Engage/components/CompetitionCard.js.map +1 -1
- package/lib/commonjs/Engage/components/SquaresCompetitionCard.js +3 -1
- package/lib/commonjs/Engage/components/SquaresCompetitionCard.js.map +1 -1
- package/lib/commonjs/LocationTracker/LocationStatus.js +39 -2
- package/lib/commonjs/LocationTracker/LocationStatus.js.map +1 -1
- package/lib/commonjs/LocationTracker/api/index.js +55 -1
- package/lib/commonjs/LocationTracker/api/index.js.map +1 -1
- package/lib/commonjs/MarketComponents/api/index.js +213 -0
- package/lib/commonjs/MarketComponents/api/index.js.map +1 -0
- package/lib/commonjs/MarketComponents/components/AthleteMarket/index.js +179 -0
- package/lib/commonjs/MarketComponents/components/AthleteMarket/index.js.map +1 -0
- package/lib/commonjs/MarketComponents/components/EventMarket/index.js +205 -0
- package/lib/commonjs/MarketComponents/components/EventMarket/index.js.map +1 -0
- package/lib/commonjs/MarketComponents/components/MarketButton/api/index.js +179 -0
- package/lib/commonjs/MarketComponents/components/MarketButton/api/index.js.map +1 -0
- package/lib/commonjs/MarketComponents/components/MarketButton/index.js +58 -0
- package/lib/commonjs/MarketComponents/components/MarketButton/index.js.map +1 -0
- package/lib/commonjs/MarketComponents/components/TeamEventMarket/api/index.js +48 -0
- package/lib/commonjs/MarketComponents/components/TeamEventMarket/api/index.js.map +1 -0
- package/lib/commonjs/MarketComponents/components/TeamEventMarket/index.js +479 -0
- package/lib/commonjs/MarketComponents/components/TeamEventMarket/index.js.map +1 -0
- package/lib/commonjs/MarketComponents/index.js +12 -0
- package/lib/commonjs/MarketComponents/index.js.map +1 -0
- package/lib/commonjs/index.js +7 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/Checkout/index.js +8 -6
- package/lib/module/Checkout/index.js.map +1 -1
- package/lib/module/CompetitionManager/components/AthleteSelector.js +50 -1
- package/lib/module/CompetitionManager/components/AthleteSelector.js.map +1 -1
- package/lib/module/Components/Icons.js +90 -0
- package/lib/module/Components/Icons.js.map +1 -1
- package/lib/module/Engage/components/BracketCompetitionCard.js +3 -1
- package/lib/module/Engage/components/BracketCompetitionCard.js.map +1 -1
- package/lib/module/Engage/components/CompetitionCard.js +3 -1
- package/lib/module/Engage/components/CompetitionCard.js.map +1 -1
- package/lib/module/Engage/components/SquaresCompetitionCard.js +3 -1
- package/lib/module/Engage/components/SquaresCompetitionCard.js.map +1 -1
- package/lib/module/LocationTracker/LocationStatus.js +39 -2
- package/lib/module/LocationTracker/LocationStatus.js.map +1 -1
- package/lib/module/LocationTracker/api/index.js +55 -1
- package/lib/module/LocationTracker/api/index.js.map +1 -1
- package/lib/module/MarketComponents/api/index.js +207 -0
- package/lib/module/MarketComponents/api/index.js.map +1 -0
- package/lib/module/MarketComponents/components/AthleteMarket/index.js +172 -0
- package/lib/module/MarketComponents/components/AthleteMarket/index.js.map +1 -0
- package/lib/module/MarketComponents/components/EventMarket/index.js +198 -0
- package/lib/module/MarketComponents/components/EventMarket/index.js.map +1 -0
- package/lib/module/MarketComponents/components/MarketButton/api/index.js +172 -0
- package/lib/module/MarketComponents/components/MarketButton/api/index.js.map +1 -0
- package/lib/module/MarketComponents/components/MarketButton/index.js +51 -0
- package/lib/module/MarketComponents/components/MarketButton/index.js.map +1 -0
- package/lib/module/MarketComponents/components/TeamEventMarket/api/index.js +42 -0
- package/lib/module/MarketComponents/components/TeamEventMarket/api/index.js.map +1 -0
- package/lib/module/MarketComponents/components/TeamEventMarket/index.js +470 -0
- package/lib/module/MarketComponents/components/TeamEventMarket/index.js.map +1 -0
- package/lib/module/MarketComponents/index.js +5 -0
- package/lib/module/MarketComponents/index.js.map +1 -0
- package/lib/module/index.js +2 -1
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/src/Checkout/index.d.ts.map +1 -1
- package/lib/typescript/src/CompetitionManager/components/AthleteSelector.d.ts.map +1 -1
- package/lib/typescript/src/Components/Icons.d.ts +3 -0
- package/lib/typescript/src/Components/Icons.d.ts.map +1 -1
- package/lib/typescript/src/Engage/components/BracketCompetitionCard.d.ts.map +1 -1
- package/lib/typescript/src/LocationTracker/LocationStatus.d.ts +7 -1
- package/lib/typescript/src/LocationTracker/LocationStatus.d.ts.map +1 -1
- package/lib/typescript/src/LocationTracker/api/index.d.ts +12 -1
- package/lib/typescript/src/LocationTracker/api/index.d.ts.map +1 -1
- package/lib/typescript/src/MarketComponents/api/index.d.ts +22 -0
- package/lib/typescript/src/MarketComponents/api/index.d.ts.map +1 -0
- package/lib/typescript/src/MarketComponents/components/AthleteMarket/index.d.ts +25 -0
- package/lib/typescript/src/MarketComponents/components/AthleteMarket/index.d.ts.map +1 -0
- package/lib/typescript/src/MarketComponents/components/EventMarket/index.d.ts +21 -0
- package/lib/typescript/src/MarketComponents/components/EventMarket/index.d.ts.map +1 -0
- package/lib/typescript/src/MarketComponents/components/MarketButton/api/index.d.ts +15 -0
- package/lib/typescript/src/MarketComponents/components/MarketButton/api/index.d.ts.map +1 -0
- package/lib/typescript/src/MarketComponents/components/MarketButton/index.d.ts +12 -0
- package/lib/typescript/src/MarketComponents/components/MarketButton/index.d.ts.map +1 -0
- package/lib/typescript/src/MarketComponents/components/TeamEventMarket/api/index.d.ts +10 -0
- package/lib/typescript/src/MarketComponents/components/TeamEventMarket/api/index.d.ts.map +1 -0
- package/lib/typescript/src/MarketComponents/components/TeamEventMarket/index.d.ts +25 -0
- package/lib/typescript/src/MarketComponents/components/TeamEventMarket/index.d.ts.map +1 -0
- package/lib/typescript/src/MarketComponents/index.d.ts +25 -0
- package/lib/typescript/src/MarketComponents/index.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +2 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/Checkout/index.tsx +2 -1
- package/src/CompetitionManager/components/AthleteSelector.tsx +36 -0
- package/src/Components/Icons.tsx +50 -0
- package/src/Engage/components/BracketCompetitionCard.tsx +2 -2
- package/src/Engage/components/CompetitionCard.tsx +1 -1
- package/src/Engage/components/SquaresCompetitionCard.tsx +1 -1
- package/src/LocationTracker/LocationStatus.tsx +34 -3
- package/src/LocationTracker/api/index.tsx +39 -3
- package/src/MarketComponents/api/index.ts +143 -0
- package/src/MarketComponents/components/AthleteMarket/index.tsx +109 -0
- package/src/MarketComponents/components/EventMarket/index.tsx +115 -0
- package/src/MarketComponents/components/MarketButton/api/index.ts +152 -0
- package/src/MarketComponents/components/MarketButton/index.tsx +37 -0
- package/src/MarketComponents/components/TeamEventMarket/api/index.ts +35 -0
- package/src/MarketComponents/components/TeamEventMarket/index.tsx +295 -0
- package/src/MarketComponents/index.tsx +5 -0
- package/src/index.tsx +2 -0
- package/src/types.d.ts +88 -2
- package/lib/commonjs/Markets/api/index.js +0 -28
- package/lib/commonjs/Markets/api/index.js.map +0 -1
- package/lib/commonjs/Markets/components/MarketButton.js +0 -25
- package/lib/commonjs/Markets/components/MarketButton.js.map +0 -1
- package/lib/module/Markets/api/index.js +0 -23
- package/lib/module/Markets/api/index.js.map +0 -1
- package/lib/module/Markets/components/MarketButton.js +0 -18
- package/lib/module/Markets/components/MarketButton.js.map +0 -1
- package/lib/typescript/src/Markets/api/index.d.ts +0 -7
- package/lib/typescript/src/Markets/api/index.d.ts.map +0 -1
- package/lib/typescript/src/Markets/components/MarketButton.d.ts +0 -11
- package/lib/typescript/src/Markets/components/MarketButton.d.ts.map +0 -1
- package/src/Markets/api/index.ts +0 -18
- package/src/Markets/components/MarketButton.tsx +0 -24
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import { APIOverrides } from "../../ApiOverrides"
|
|
3
|
+
import type { AthleteProps, EventOrderStatProps, EventProps, MarketProps, MarketSideOptionProps, MatchProps, OrderProps, TeamProps, TournamentProps } from "../../types"
|
|
4
|
+
|
|
5
|
+
let EVENT_SVC_API = ''
|
|
6
|
+
|
|
7
|
+
export { MarketComponentApi, MarketComponentHelpers }
|
|
8
|
+
|
|
9
|
+
const MarketComponentApi = {
|
|
10
|
+
setEnvironment: () => {
|
|
11
|
+
const endpoints = APIOverrides.getEndpoints();
|
|
12
|
+
EVENT_SVC_API = endpoints['EVENT_SVC_API'] as string;
|
|
13
|
+
//MK_SVC_API = endpoints['MK_SVC_API'] as string;
|
|
14
|
+
//AUTH_SVC_API = endpoints['AUTH_SVC_API'] as string;
|
|
15
|
+
},
|
|
16
|
+
getAthletesByTeamId: async(team_id:string):Promise<AthleteProps[]> => {
|
|
17
|
+
try {
|
|
18
|
+
const resp = await axios.get(`${EVENT_SVC_API}/v1/athletes/team/${team_id}`)
|
|
19
|
+
return resp.data.athletes
|
|
20
|
+
} catch (e) {
|
|
21
|
+
console.log(e)
|
|
22
|
+
return []
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
const MarketComponentHelpers = {
|
|
29
|
+
getLiqudity: (event_order_stats:EventOrderStatProps[]):{ liquidity: number, open_order_count:number } => {
|
|
30
|
+
let liquidity = event_order_stats.reduce((a,b) => a + b.open_order_amount, 0);
|
|
31
|
+
let open_order_count = event_order_stats.reduce((a,b) => a + parseInt(b.open_order_count as string), 0);
|
|
32
|
+
return { liquidity, open_order_count }
|
|
33
|
+
},
|
|
34
|
+
getVar1Label: (market:MarketProps, var_1:number, side?:string) => {
|
|
35
|
+
if(side == 'over'){ return `O ${var_1}` }
|
|
36
|
+
if(side == 'under'){ return `U ${var_1}` }
|
|
37
|
+
if(market.type != 'Spread'){ return `${var_1}` }
|
|
38
|
+
if(var_1 < 0){ return `${var_1}` }
|
|
39
|
+
return `+${var_1}`
|
|
40
|
+
},
|
|
41
|
+
getOddsLabel: (odds:number, decimals?:number) => {
|
|
42
|
+
let new_odds = odds.toFixed()
|
|
43
|
+
if(decimals){ new_odds = odds.toFixed(decimals) }
|
|
44
|
+
if(odds < 0){ return `${new_odds}` }
|
|
45
|
+
return `+${new_odds}`
|
|
46
|
+
},
|
|
47
|
+
getTeamEventSideIds:(event:EventProps, market:MarketProps, side_option:MarketSideOptionProps, athlete?:AthleteProps, team?:TeamProps) => {
|
|
48
|
+
const o_side = market.side_options.find(so => so.side != side_option.side);
|
|
49
|
+
if(!o_side){ return undefined }
|
|
50
|
+
switch(side_option.id_source){
|
|
51
|
+
case 'side':
|
|
52
|
+
return { side_id: side_option.side, reversed_side_id: o_side.side }
|
|
53
|
+
case 'athlete':
|
|
54
|
+
if(!athlete){ return undefined }
|
|
55
|
+
return { side_id: athlete.athlete_id, reversed_side_id: athlete.athlete_id }
|
|
56
|
+
case 'team':
|
|
57
|
+
if(market.level == 'event'){
|
|
58
|
+
let side_id = event[side_option.side as keyof EventProps]?.team_id
|
|
59
|
+
let reversed_side_id = event[o_side.side as keyof EventProps]?.team_id
|
|
60
|
+
if(!side_id || !reversed_side_id){ return undefined }
|
|
61
|
+
return { side_id, reversed_side_id }
|
|
62
|
+
}
|
|
63
|
+
if(market.level == 'team'){
|
|
64
|
+
if(!team){ return undefined }
|
|
65
|
+
return { side_id: team.team_id, reversed_side_id: team.team_id }
|
|
66
|
+
}
|
|
67
|
+
return undefined
|
|
68
|
+
default: return undefined
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
|
|
72
|
+
getOrderTitleForTeamEvent : (order:OrderProps, market:MarketProps, event:EventProps, athlete?:AthleteProps, exotic?:any):string | undefined => {
|
|
73
|
+
let market_side = market.side_options.find(o => o.side == order.side)
|
|
74
|
+
if(!market_side){ return undefined }
|
|
75
|
+
var re = /({.*?})/;
|
|
76
|
+
let parsed_text = market_side.parseable_title.split(re)
|
|
77
|
+
let new_title = '';
|
|
78
|
+
parsed_text.map(t => {
|
|
79
|
+
if(t === ''){ return }
|
|
80
|
+
if(t[0] !== '{'){ return new_title += t }
|
|
81
|
+
let variable = t.slice(1)
|
|
82
|
+
variable = variable.slice(0, variable.length -1)
|
|
83
|
+
switch(variable){
|
|
84
|
+
case 'team':
|
|
85
|
+
let team = event[order.side as keyof EventProps]
|
|
86
|
+
return new_title += team.market_name
|
|
87
|
+
case 'var_1': return new_title += MarketComponentHelpers.getVar1Label(market, order.var_1)
|
|
88
|
+
case 'athlete': return new_title += athlete?.abbr_name
|
|
89
|
+
case 'stat': return new_title += market.stat_label ?? market.stat
|
|
90
|
+
case 'exotic': return new_title += exotic?.name
|
|
91
|
+
default: return
|
|
92
|
+
|
|
93
|
+
}
|
|
94
|
+
})
|
|
95
|
+
return new_title
|
|
96
|
+
},
|
|
97
|
+
getOrderTitleForTournament : (order:OrderProps, market:MarketProps, tournament:TournamentProps, athlete?:AthleteProps, team?:TeamProps):string | undefined => {
|
|
98
|
+
if(!tournament){ return undefined }
|
|
99
|
+
let market_side = market.side_options.find(o => o.side == order.side)
|
|
100
|
+
if(!market_side){ return order.side }
|
|
101
|
+
var re = /({.*?})/;
|
|
102
|
+
let parsed_text = market_side.parseable_title.split(re)
|
|
103
|
+
let new_title = '';
|
|
104
|
+
parsed_text.map(t => {
|
|
105
|
+
if(t === ''){ return }
|
|
106
|
+
if(t[0] !== '{'){ return new_title += t }
|
|
107
|
+
let variable = t.slice(1)
|
|
108
|
+
variable = variable.slice(0, variable.length -1)
|
|
109
|
+
switch(variable){
|
|
110
|
+
case 'team': return new_title += `${team?.market_name} ${team?.name}`
|
|
111
|
+
case 'var_1': return new_title += MarketComponentHelpers.getVar1Label(market, order.var_1)
|
|
112
|
+
case 'athlete': return new_title += athlete?.abbr_name
|
|
113
|
+
case 'stat': return new_title += market.stat
|
|
114
|
+
default: return
|
|
115
|
+
|
|
116
|
+
}
|
|
117
|
+
})
|
|
118
|
+
return new_title
|
|
119
|
+
},
|
|
120
|
+
getOrderTitleForMatch : (order:OrderProps, market:MarketProps, match:MatchProps, athlete?:AthleteProps, team?:TeamProps):string | undefined => {
|
|
121
|
+
if(!match){ return undefined }
|
|
122
|
+
let market_side = market.side_options.find(o => o.side == order.side)
|
|
123
|
+
if(!market_side){ return order.side }
|
|
124
|
+
var re = /({.*?})/;
|
|
125
|
+
let parsed_text = market_side.parseable_title.split(re)
|
|
126
|
+
let new_title = '';
|
|
127
|
+
parsed_text.map(t => {
|
|
128
|
+
if(t === ''){ return }
|
|
129
|
+
if(t[0] !== '{'){ return new_title += t }
|
|
130
|
+
let variable = t.slice(1)
|
|
131
|
+
variable = variable.slice(0, variable.length -1)
|
|
132
|
+
switch(variable){
|
|
133
|
+
case 'team': return new_title += `${team?.market_name} ${team?.name}`
|
|
134
|
+
case 'var_1': return new_title += MarketComponentHelpers.getVar1Label(market, order.var_1)
|
|
135
|
+
case 'athlete': return new_title += athlete?.abbr_name
|
|
136
|
+
case 'stat': return new_title += market.stat
|
|
137
|
+
default: return
|
|
138
|
+
|
|
139
|
+
}
|
|
140
|
+
})
|
|
141
|
+
return new_title
|
|
142
|
+
}
|
|
143
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { View, TouchableOpacity } from 'react-native';
|
|
3
|
+
import type { AthleteProps, BestAvailableOrderProps, EventOrderStatProps, EventProps, MarketProps, MarketSideOptionProps, OrderProps, TradeProps } from "../../../types"
|
|
4
|
+
import { view_styles } from '../../../constants/styles';
|
|
5
|
+
import MarketButton from '../../components/MarketButton';
|
|
6
|
+
import { Icons, LinearDiagnal, Text } from '../../../Components';
|
|
7
|
+
import Colors from '../../../constants/colors';
|
|
8
|
+
import { MarketButtonHelpers } from '../MarketButton/api';
|
|
9
|
+
import { MarketComponentHelpers } from '../../api';
|
|
10
|
+
import { AthleteImage } from '../../../Components/Jerseys';
|
|
11
|
+
|
|
12
|
+
type AthleteMarketProps = {
|
|
13
|
+
event:EventProps,
|
|
14
|
+
event_type:'team'|'tournament'|'match',
|
|
15
|
+
athlete:AthleteProps,
|
|
16
|
+
hide_stat_banner?:boolean,
|
|
17
|
+
width?:number,
|
|
18
|
+
market:MarketProps,
|
|
19
|
+
latest_trades:TradeProps[],
|
|
20
|
+
best_available_orders:BestAvailableOrderProps[],
|
|
21
|
+
event_order_stats:EventOrderStatProps[],
|
|
22
|
+
default_price_view:'last_trade'|'best_available',
|
|
23
|
+
onOrder:(order:OrderProps) => void,
|
|
24
|
+
onView:(data:{event_id:string, event_type:string, market_id:string, side_type:'athlete', side_id:string}) => void
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const AthleteMarket = ({ event, hide_stat_banner, width, athlete, market, event_order_stats, default_price_view, latest_trades, best_available_orders, onOrder, onView }:AthleteMarketProps) => {
|
|
28
|
+
const { liquidity, open_order_count } = MarketComponentHelpers.getLiqudity(event_order_stats);
|
|
29
|
+
|
|
30
|
+
const renderSides = (data:{ item:MarketSideOptionProps, index:number, market:MarketProps }) => {
|
|
31
|
+
const side_details = MarketComponentHelpers.getTeamEventSideIds(event, market, data.item, athlete, undefined);
|
|
32
|
+
if(!side_details){ return <></> }
|
|
33
|
+
let trade = MarketButtonHelpers.getVisibleTrade(default_price_view, data.market, data.item, latest_trades, best_available_orders, side_details.side_id, side_details.reversed_side_id);
|
|
34
|
+
if(!trade){
|
|
35
|
+
trade = MarketButtonHelpers.getTradeFromMarket(market, event.event_id, 'team', data.item.side, data.item.id_source, side_details.side_id, side_details.reversed_side_id);
|
|
36
|
+
}
|
|
37
|
+
return (
|
|
38
|
+
<View style={{ margin:2, height:50, width:75 }}>
|
|
39
|
+
<MarketButton
|
|
40
|
+
side_option={data.item}
|
|
41
|
+
market={data.market}
|
|
42
|
+
trade={trade}
|
|
43
|
+
onPress={(order) => {
|
|
44
|
+
const order_title = MarketComponentHelpers.getOrderTitleForTeamEvent(order, market, event, athlete);
|
|
45
|
+
if(!order_title){ return alert('Unable to process order') }
|
|
46
|
+
onOrder({ ...order, title: order_title })
|
|
47
|
+
}}
|
|
48
|
+
/>
|
|
49
|
+
</View>
|
|
50
|
+
)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return (
|
|
54
|
+
<View style={{ ...view_styles.section, flex:1, borderWidth:1, borderColor:Colors.shades.shade600, width }}>
|
|
55
|
+
{!hide_stat_banner ?
|
|
56
|
+
<LinearDiagnal
|
|
57
|
+
label={market.stat_label ?? market.type}
|
|
58
|
+
label_size={14}
|
|
59
|
+
style={{ borderTopLeftRadius:8, padding:5 }}
|
|
60
|
+
left_color={Colors.incentive.gold}
|
|
61
|
+
right_color={'#ebd197'}
|
|
62
|
+
/>
|
|
63
|
+
:<></>}
|
|
64
|
+
|
|
65
|
+
<View style={{ ...view_styles.section_body, flex:1, padding:0, justifyContent:'center', alignItems:'center' }}>
|
|
66
|
+
<AthleteImage
|
|
67
|
+
athlete={athlete}
|
|
68
|
+
size={50}
|
|
69
|
+
number_size={12}
|
|
70
|
+
/>
|
|
71
|
+
<View style={{ padding:10, paddingBottom:0 }}>
|
|
72
|
+
<Text weight='bold' size={14} color={Colors.brand.midnight} textAlign='center'>{athlete.first_name} {athlete.last_name}</Text>
|
|
73
|
+
<Text style={{ marginTop:3 }} color={Colors.brand.midnight} weight='regular' textAlign='center' size={12}>{athlete.team?`${athlete.team.abbr}`:''} ({athlete.position})</Text>
|
|
74
|
+
</View>
|
|
75
|
+
</View>
|
|
76
|
+
<View nativeID='market_sides' style={{ flexDirection:'row', justifyContent:'center', alignItems:'center', padding:10 }}>
|
|
77
|
+
{market.side_options.sort((a,b) => {
|
|
78
|
+
let a_t = a.side == market.trade_side ? 1 : 0
|
|
79
|
+
let b_t = b.side == market.trade_side ? 1 : 0
|
|
80
|
+
return a_t - b_t
|
|
81
|
+
}).map((so, index) => {
|
|
82
|
+
return renderSides({ item:so, index, market })
|
|
83
|
+
})}
|
|
84
|
+
|
|
85
|
+
</View>
|
|
86
|
+
<View style={{ backgroundColor:Colors.shades.shade100, padding:10, flexDirection:'row', alignItems:'center', borderBottomLeftRadius:8, borderBottomRightRadius:8 }}>
|
|
87
|
+
<TouchableOpacity style={{ flex:1, flexDirection:'row' }} onPress={() => {
|
|
88
|
+
onView({
|
|
89
|
+
event_id: event.event_id,
|
|
90
|
+
event_type: 'team',
|
|
91
|
+
market_id: market.market_id,
|
|
92
|
+
side_type: 'athlete',
|
|
93
|
+
side_id: athlete.athlete_id
|
|
94
|
+
});
|
|
95
|
+
}}>
|
|
96
|
+
<View style={{ backgroundColor:Colors.shades.white, height:30, width:30, borderRadius:100, justifyContent:'center', alignItems:'center', ...view_styles.float }}>
|
|
97
|
+
<Icons.LiquidityIcon color={Colors.brand.midnight} size={30}/>
|
|
98
|
+
</View>
|
|
99
|
+
<View style={{ marginLeft:10 }}>
|
|
100
|
+
<Text theme='body_2'>Liquidity</Text>
|
|
101
|
+
<Text size={12} color={Colors.brand.electric} weight='semibold'>${liquidity.toFixed()} {open_order_count} Orders</Text>
|
|
102
|
+
</View>
|
|
103
|
+
</TouchableOpacity>
|
|
104
|
+
</View>
|
|
105
|
+
</View>
|
|
106
|
+
)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export default AthleteMarket
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { View, Image, TouchableOpacity } from 'react-native';
|
|
3
|
+
import type { BestAvailableOrderProps, EventOrderStatProps, EventProps, MarketProps, MarketSideOptionProps, OrderProps, TradeProps } from '../../../types';
|
|
4
|
+
import { MarketButtonHelpers } from '../MarketButton/api';
|
|
5
|
+
import MarketButton from '../../components/MarketButton';
|
|
6
|
+
import { Icons, LinearDiagnal, Text } from '../../../Components';
|
|
7
|
+
import Colors from '../../../constants/colors';
|
|
8
|
+
import { view_styles } from '../../../constants/styles';
|
|
9
|
+
import { TeamEventMarketHelpers } from '../TeamEventMarket/api';
|
|
10
|
+
import { MarketComponentHelpers } from '../../api';
|
|
11
|
+
|
|
12
|
+
type EventMarketProps = {
|
|
13
|
+
event:EventProps,
|
|
14
|
+
width?:number,
|
|
15
|
+
market:MarketProps,
|
|
16
|
+
hide_market_banner?:boolean,
|
|
17
|
+
latest_trades:TradeProps[],
|
|
18
|
+
best_available_orders:BestAvailableOrderProps[],
|
|
19
|
+
event_order_stats:EventOrderStatProps[],
|
|
20
|
+
default_price_view:'last_trade'|'best_available',
|
|
21
|
+
onOrder:(order:OrderProps) => void,
|
|
22
|
+
onView:(data: { event_id:string, event_type:string, market_id:string }) => void
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const EventMarket = ({ width, event, market, latest_trades, best_available_orders, hide_market_banner, event_order_stats, default_price_view, onOrder, onView }:EventMarketProps) => {
|
|
26
|
+
const { liquidity, open_order_count } = MarketComponentHelpers.getLiqudity(event_order_stats);
|
|
27
|
+
|
|
28
|
+
const renderSides = (data:{ item:MarketSideOptionProps, index:number, market:MarketProps }) => {
|
|
29
|
+
const side_details = MarketComponentHelpers.getTeamEventSideIds(event, market, data.item, undefined, undefined);
|
|
30
|
+
if(!side_details){ return }
|
|
31
|
+
let trade = MarketButtonHelpers.getVisibleTrade(default_price_view, data.market, data.item, latest_trades, best_available_orders, side_details.side_id, side_details.reversed_side_id);
|
|
32
|
+
if(!trade){
|
|
33
|
+
trade = MarketButtonHelpers.getTradeFromMarket(market, event.event_id, 'team', data.item.side, data.item.id_source, side_details.side_id, side_details.reversed_side_id);
|
|
34
|
+
}
|
|
35
|
+
if(!trade){ return <></> }
|
|
36
|
+
let side_label = event[data.item.side as keyof EventProps].abbr
|
|
37
|
+
return (
|
|
38
|
+
<View style={{ margin:2, height:50, width:75 }}>
|
|
39
|
+
<MarketButton
|
|
40
|
+
side_option={data.item}
|
|
41
|
+
market={data.market}
|
|
42
|
+
side_label={side_label}
|
|
43
|
+
trade={trade}
|
|
44
|
+
onPress={(order) => {
|
|
45
|
+
const order_title = MarketComponentHelpers.getOrderTitleForTeamEvent(order, market, event);
|
|
46
|
+
if(!order_title){ return alert('Unable to process order') }
|
|
47
|
+
onOrder({ ...order, title: order_title })
|
|
48
|
+
}}
|
|
49
|
+
/>
|
|
50
|
+
</View>
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return (
|
|
55
|
+
<View style={{ ...view_styles.section, flex:1, borderWidth:1, borderColor:Colors.shades.shade600, width, maxWidth:175 }}>
|
|
56
|
+
{!hide_market_banner ?
|
|
57
|
+
<LinearDiagnal
|
|
58
|
+
label={market.stat_label ?? market.type}
|
|
59
|
+
label_size={14}
|
|
60
|
+
style={{ borderTopLeftRadius:8, padding:5 }}
|
|
61
|
+
left_color={Colors.incentive.gold}
|
|
62
|
+
right_color={'#ebd197'}
|
|
63
|
+
/>
|
|
64
|
+
:<></>}
|
|
65
|
+
<View style={{ ...view_styles.section_body, flex:1, padding:0, justifyContent:'center', alignItems:'center' }}>
|
|
66
|
+
<View style={{flexDirection:'row', alignItems:'center'}}>
|
|
67
|
+
<Image
|
|
68
|
+
source={{ uri: event.away?.image?.url }}
|
|
69
|
+
style={{ height:50, width:50, marginRight:5 }}
|
|
70
|
+
resizeMode='cover'
|
|
71
|
+
/>
|
|
72
|
+
<Text theme='body'>VS</Text>
|
|
73
|
+
<Image
|
|
74
|
+
source={{ uri: event.home?.image?.url }}
|
|
75
|
+
style={{ height:50, width:50, marginLeft:5 }}
|
|
76
|
+
resizeMode='cover'
|
|
77
|
+
/>
|
|
78
|
+
</View>
|
|
79
|
+
<View style={{ padding:10, paddingBottom:0 }}>
|
|
80
|
+
<Text weight='bold' size={14} color={Colors.brand.midnight} textAlign='center'>{event.event_title}</Text>
|
|
81
|
+
<Text style={{ marginTop:3 }} color={Colors.brand.midnight} weight='regular' textAlign='center' size={12}>{TeamEventMarketHelpers.getTimeDetail(event)}</Text>
|
|
82
|
+
</View>
|
|
83
|
+
</View>
|
|
84
|
+
<View nativeID='market_sides' style={{ flexDirection:'row', justifyContent:'center', alignItems:'center', padding:10 }}>
|
|
85
|
+
{market.side_options.sort((a,b) => {
|
|
86
|
+
let a_t = a.side == market.trade_side ? 1 : 0
|
|
87
|
+
let b_t = b.side == market.trade_side ? 1 : 0
|
|
88
|
+
return a_t - b_t
|
|
89
|
+
}).map((so, index) => {
|
|
90
|
+
return renderSides({ item:so, index, market })
|
|
91
|
+
})}
|
|
92
|
+
|
|
93
|
+
</View>
|
|
94
|
+
<View style={{ backgroundColor:Colors.shades.shade100, padding:10, flexDirection:'row', alignItems:'center', borderBottomLeftRadius:8, borderBottomRightRadius:8 }}>
|
|
95
|
+
<TouchableOpacity style={{ flex:1, flexDirection:'row' }} onPress={() => {
|
|
96
|
+
onView({
|
|
97
|
+
event_id: event.event_id,
|
|
98
|
+
event_type: 'team',
|
|
99
|
+
market_id: market.market_id
|
|
100
|
+
});
|
|
101
|
+
}}>
|
|
102
|
+
<View style={{ backgroundColor:Colors.shades.white, height:30, width:30, borderRadius:100, justifyContent:'center', alignItems:'center', ...view_styles.float }}>
|
|
103
|
+
<Icons.LiquidityIcon color={Colors.brand.midnight} size={30}/>
|
|
104
|
+
</View>
|
|
105
|
+
<View style={{ marginLeft:10 }}>
|
|
106
|
+
<Text theme='body_2'>Liquidity</Text>
|
|
107
|
+
<Text size={12} color={Colors.brand.electric} weight='semibold'>${liquidity.toFixed()} {open_order_count} Orders</Text>
|
|
108
|
+
</View>
|
|
109
|
+
</TouchableOpacity>
|
|
110
|
+
</View>
|
|
111
|
+
</View>
|
|
112
|
+
)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export default EventMarket
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import moment from "moment-mini";
|
|
2
|
+
import Colors from "../../../../constants/colors";
|
|
3
|
+
import type { BestAvailableOrderProps, MarketProps, MarketSideOptionProps, OrderProps, TradeProps } from "../../../../types";
|
|
4
|
+
import { MarketComponentHelpers } from "../../../api";
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
export const MarketButtonHelpers = {
|
|
8
|
+
getButtonLabel: (market:MarketProps, side_option:MarketSideOptionProps, trade:TradeProps) => {
|
|
9
|
+
let v_1 = MarketComponentHelpers.getVar1Label(market, trade.var_1, side_option.side);
|
|
10
|
+
let o_1 = MarketComponentHelpers.getOddsLabel(trade.odds);
|
|
11
|
+
return { var_1: v_1, odds:o_1, color: trade.draft_liquidity? Colors.highlights.highlight500Faded : Colors.shades.shade100 }
|
|
12
|
+
},
|
|
13
|
+
getVisibleTrade: (default_price_view:'best_available'|'last_trade', market:MarketProps, side_option:MarketSideOptionProps, latest_trades:TradeProps[], best_available_orders:BestAvailableOrderProps[], side_id:string, reversed_side_id:string) => {
|
|
14
|
+
const order = best_available_orders.find(o => o.market_id == market.market_id && o.side == side_option.side && o.show);
|
|
15
|
+
const o_side_order = best_available_orders.find(o => o.market_id == market.market_id && o.side != side_option.side && o.show);
|
|
16
|
+
let trade = latest_trades.find(t => t.market_type == 'FOR_MONEY' && t.market_id == market.market_id && t.side == side_option.side);
|
|
17
|
+
switch(default_price_view){
|
|
18
|
+
case 'best_available':
|
|
19
|
+
if(order){ return MarketButtonHelpers.getTradeFromAvailableOrder(order, reversed_side_id) }
|
|
20
|
+
if(o_side_order){
|
|
21
|
+
//Now lets reverse this order and get a trade for it
|
|
22
|
+
const reversed_order = MarketButtonHelpers.reverseBAOrder(o_side_order, market, side_id);
|
|
23
|
+
if(!reversed_order){ return undefined }
|
|
24
|
+
return MarketButtonHelpers.getTradeFromAvailableOrder(reversed_order, reversed_side_id)
|
|
25
|
+
}
|
|
26
|
+
if(trade){ return trade }
|
|
27
|
+
return undefined
|
|
28
|
+
case 'last_trade':
|
|
29
|
+
if(trade){ return trade }
|
|
30
|
+
return undefined
|
|
31
|
+
default: return undefined
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
reverseBAOrder: (order:BestAvailableOrderProps, market:MarketProps, side_id:string):BestAvailableOrderProps | undefined => {
|
|
35
|
+
const side_option = market.side_options.find(so => so.side != order.side);
|
|
36
|
+
if(!side_option){ return undefined }
|
|
37
|
+
return {
|
|
38
|
+
...order,
|
|
39
|
+
side: side_option.side,
|
|
40
|
+
side_id: side_id,
|
|
41
|
+
odds: order.odds * -1,
|
|
42
|
+
var_1: market.type == 'Spread' ? order.var_1 * -1 : order.var_1,
|
|
43
|
+
probability: 1 - order.probability,
|
|
44
|
+
title: '',
|
|
45
|
+
open_amt: 0,
|
|
46
|
+
called_amt: 0,
|
|
47
|
+
potential_winnings: 0
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
getTradeFromMarket: (market:MarketProps, event_id:string, event_type: 'match'|'tournament'|'team', side:string, side_type:string, side_id:string, reversed_side_id:string):TradeProps => {
|
|
51
|
+
return {
|
|
52
|
+
trade_id:'',
|
|
53
|
+
event_id,
|
|
54
|
+
event_type,
|
|
55
|
+
trade_amt: 0,
|
|
56
|
+
cumulative_amt: 0,
|
|
57
|
+
latest:true,
|
|
58
|
+
probability:0.5,
|
|
59
|
+
odds: 100,
|
|
60
|
+
create_datetime:'',
|
|
61
|
+
last_update_datetime: '',
|
|
62
|
+
market_id: market.market_id,
|
|
63
|
+
var_1: 0,
|
|
64
|
+
side_id,
|
|
65
|
+
side_type:side_type as 'team'|'exotic'|'side'|'athlete',
|
|
66
|
+
reversed_side_id,
|
|
67
|
+
side,
|
|
68
|
+
position_ids:[],
|
|
69
|
+
market_type: 'FREE'
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
getTradeFromAvailableOrder : (ba:BestAvailableOrderProps, reversed_side_id:string):TradeProps => {
|
|
73
|
+
return {
|
|
74
|
+
trade_id:'',
|
|
75
|
+
event_id: ba.event_id,
|
|
76
|
+
event_type: ba.event_type as 'tournament'|'team'|'match',
|
|
77
|
+
cumulative_amt: 0,
|
|
78
|
+
trade_amt: 0,
|
|
79
|
+
create_datetime: '', last_update_datetime: '',
|
|
80
|
+
market_id: ba.market_id,
|
|
81
|
+
var_1: ba.var_1,
|
|
82
|
+
side: ba.side,
|
|
83
|
+
side_id: ba.side_id,
|
|
84
|
+
draft_liquidity: ba.open_amt,
|
|
85
|
+
reversed_side_id,
|
|
86
|
+
probability: ba.probability,
|
|
87
|
+
odds: ba.odds,
|
|
88
|
+
side_type: ba.side_type as 'team'|'athlete'|'side',
|
|
89
|
+
market_type: 'FOR_MONEY',
|
|
90
|
+
latest: true,
|
|
91
|
+
position_ids: []
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
reverseTradeFromOrder: (order:BestAvailableOrderProps, market:MarketProps):TradeProps => {
|
|
95
|
+
return {
|
|
96
|
+
trade_id:'',
|
|
97
|
+
side: order.side,
|
|
98
|
+
side_id: order.side_id,
|
|
99
|
+
reversed_side_id: '',
|
|
100
|
+
market_id: order.market_id,
|
|
101
|
+
event_id: order.event_id,
|
|
102
|
+
event_type: order.event_type as 'team'|'tournament'|'match',
|
|
103
|
+
odds: order.odds * -1,
|
|
104
|
+
var_1: market.type == 'Spread' ? order.var_1 * -1 : order.var_1,
|
|
105
|
+
probability: 1 - order.probability,
|
|
106
|
+
side_type: order.side_type as 'athlete'|'team'|'side',
|
|
107
|
+
market_type: 'FOR_MONEY',
|
|
108
|
+
latest: true,
|
|
109
|
+
trade_amt: 0, cumulative_amt:0,
|
|
110
|
+
position_ids: [],
|
|
111
|
+
last_update_datetime: '', create_datetime:''
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
getOrderFromTrade: (trade:TradeProps, unit_size?:number):OrderProps => {
|
|
115
|
+
let open_amt = 10
|
|
116
|
+
if(unit_size){ open_amt = unit_size }
|
|
117
|
+
let draft_liquidity = 0
|
|
118
|
+
if(trade.draft_liquidity){ draft_liquidity = trade.draft_liquidity }
|
|
119
|
+
|
|
120
|
+
return {
|
|
121
|
+
order_id: '',
|
|
122
|
+
player_id: '',
|
|
123
|
+
be_type: 'market', //TODO - Make this dynamic,
|
|
124
|
+
open_amt,
|
|
125
|
+
called_amt: 0,
|
|
126
|
+
buy_sell_ind: 'buy',
|
|
127
|
+
rejections:0,
|
|
128
|
+
commission_pct:0,
|
|
129
|
+
available_for_parlays: false,
|
|
130
|
+
event_id: trade.event_id,
|
|
131
|
+
draft_liquidity,
|
|
132
|
+
event_type: trade.event_type,
|
|
133
|
+
side: trade.side as 'home'|'away'|'over'|'under'|'yes'|'no',
|
|
134
|
+
side_type: trade.side_type as 'team' | 'side' | 'athlete',
|
|
135
|
+
resolution_status: 'inprogress',
|
|
136
|
+
side_id: trade.side_id,
|
|
137
|
+
order_type: trade.limit_override ? 'limit': 'market',
|
|
138
|
+
potential_winnings: 0,
|
|
139
|
+
collar_pct: .01,
|
|
140
|
+
positions: [],
|
|
141
|
+
market_id: trade.market_id,
|
|
142
|
+
title: '',
|
|
143
|
+
probability: trade.probability,
|
|
144
|
+
odds: trade.odds,
|
|
145
|
+
var_1: trade.var_1,
|
|
146
|
+
market_type: trade.market_type,
|
|
147
|
+
position_ids: [],
|
|
148
|
+
status: 'approved',
|
|
149
|
+
expire_datetime: moment().add(1, 'hours')
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { TouchableOpacity, View } from "react-native"
|
|
3
|
+
import Text from '../../../Components/Text';
|
|
4
|
+
import type { MarketProps, MarketSideOptionProps, OrderProps, TradeProps } from '../../../types';
|
|
5
|
+
import Colors from '../../../constants/colors';
|
|
6
|
+
import { MarketButtonHelpers } from './api';
|
|
7
|
+
|
|
8
|
+
type MarketButtonProps = {
|
|
9
|
+
market:MarketProps,
|
|
10
|
+
side_option:MarketSideOptionProps,
|
|
11
|
+
side_label?:string,
|
|
12
|
+
trade:TradeProps,
|
|
13
|
+
onPress: (order:OrderProps) => void
|
|
14
|
+
}
|
|
15
|
+
const MarketCard = ({ side_option, market, trade, side_label, onPress }:MarketButtonProps) => {
|
|
16
|
+
const { var_1, odds, color } = MarketButtonHelpers.getButtonLabel(market, side_option, trade);
|
|
17
|
+
const handlePress = () => {
|
|
18
|
+
return onPress(MarketButtonHelpers.getOrderFromTrade(trade))
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return (
|
|
22
|
+
<TouchableOpacity style={{ flex:1, padding:5, backgroundColor:color, borderRadius:4, justifyContent:'center' }}
|
|
23
|
+
onPress={() => handlePress()}>
|
|
24
|
+
<View>
|
|
25
|
+
{side_label ?
|
|
26
|
+
<Text size={12} color={Colors.brand.midnight} weight='semibold' textAlign='center'>{side_label}</Text>
|
|
27
|
+
:<></>}
|
|
28
|
+
{market.var_1_required ?
|
|
29
|
+
<Text size={12} color={Colors.brand.midnight} weight='semibold' textAlign='center'>{var_1}</Text>
|
|
30
|
+
:<></>}
|
|
31
|
+
<Text style={{ marginTop:2 }} size={12} color={Colors.brand.midnight} weight='semibold' textAlign='center'>{odds}</Text>
|
|
32
|
+
</View>
|
|
33
|
+
</TouchableOpacity>
|
|
34
|
+
)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export default MarketCard
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import moment from "moment-mini";
|
|
2
|
+
import type { AthleteProps, EventOrderStatProps, EventProps, MarketProps, TradeProps } from "../../../../types"
|
|
3
|
+
|
|
4
|
+
export { TeamEventMarketHelpers }
|
|
5
|
+
const TeamEventMarketHelpers = {
|
|
6
|
+
getPrimaryMarkets: (event:EventProps, markets:MarketProps[]):MarketProps[] => {
|
|
7
|
+
if(!event.supported_markets){ return [] }
|
|
8
|
+
let event_markets = markets.filter(m => event.supported_markets?.filter(sm => !sm.removed).map(sm => sm.market_id.toString()).includes(m.market_id.toString()));
|
|
9
|
+
return event_markets.filter(m => m.primary_market);
|
|
10
|
+
},
|
|
11
|
+
getNonPrimaryMarkets:(event:EventProps, markets:MarketProps[]):MarketProps[] => {
|
|
12
|
+
if(!event.supported_markets){ return [] }
|
|
13
|
+
let event_markets = markets.filter(m => event.supported_markets?.filter(sm => !sm.removed).map(sm => sm.market_id.toString()).includes(m.market_id.toString()));
|
|
14
|
+
return event_markets.filter(m => !m.primary_market);
|
|
15
|
+
},
|
|
16
|
+
getTimeDetail: (event:EventProps) => {
|
|
17
|
+
if(['scheduled','created'].includes(event.status)){ return moment(event.scheduled_datetime).format('MM/DD @ hh:mm a') }
|
|
18
|
+
return event.time_detail
|
|
19
|
+
},
|
|
20
|
+
sortNonPrimaryMarkets: (markets:MarketProps[], event_order_stats:EventOrderStatProps[]) => {
|
|
21
|
+
let sorted_stats = event_order_stats.filter(s => s.market_type == 'FOR_MONEY' && markets.map(m => m.market_id.toString()).includes(s.market_id.toString()));
|
|
22
|
+
return sorted_stats.sort((a,b) => parseInt(b.open_order_count as string) - parseInt(a.open_order_count as string))
|
|
23
|
+
},
|
|
24
|
+
sortAthleteMarkets: (market:MarketProps, event_order_stats:EventOrderStatProps[], latest_trades:TradeProps[], athletes:AthleteProps[]):AthleteProps[] => {
|
|
25
|
+
if(!market){ return [] }
|
|
26
|
+
let market_stats = event_order_stats.filter(s => s.market_id == market.market_id && s.market_type == 'FOR_MONEY');
|
|
27
|
+
let market_trades = latest_trades.filter(t => t.market_type == 'FOR_MONEY' && t.market_id == market.market_id && t.side_type == 'athlete');
|
|
28
|
+
let filtered_athletes = athletes.filter(a => market_trades.map(t => t.side_id.toString()).includes(a.athlete_id.toString()));
|
|
29
|
+
return filtered_athletes.sort((a,b) => {
|
|
30
|
+
let old_order_count = market_stats.filter(s => s.side_id == a.athlete_id).reduce((a,b) => a + parseInt(b.open_order_count as string), 0)
|
|
31
|
+
let new_order_count = market_stats.filter(s => s.side_id == b.athlete_id).reduce((a,b) => a + parseInt(b.open_order_count as string), 0)
|
|
32
|
+
return new_order_count - old_order_count
|
|
33
|
+
})
|
|
34
|
+
}
|
|
35
|
+
}
|