be-components 2.4.9 → 2.5.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/Components/Jerseys.js +14 -4
- package/lib/commonjs/Components/Jerseys.js.map +1 -1
- package/lib/commonjs/LocationTracker/LocationStatus.js +1 -0
- package/lib/commonjs/LocationTracker/LocationStatus.js.map +1 -1
- package/lib/commonjs/MarketComponents/api/index.js +40 -0
- package/lib/commonjs/MarketComponents/api/index.js.map +1 -1
- package/lib/commonjs/MarketComponents/components/AthleteTournamentMarket/index.js.map +1 -1
- package/lib/commonjs/MarketComponents/components/MatchMarket/index.js +231 -0
- package/lib/commonjs/MarketComponents/components/MatchMarket/index.js.map +1 -0
- package/lib/commonjs/MarketComponents/components/TeamTournamentMarket/index.js +198 -0
- package/lib/commonjs/MarketComponents/components/TeamTournamentMarket/index.js.map +1 -0
- package/lib/commonjs/MarketComponents/components/TournamentMarket/api/index.js +109 -0
- package/lib/commonjs/MarketComponents/components/TournamentMarket/api/index.js.map +1 -0
- package/lib/commonjs/MarketComponents/components/TournamentMarket/index.js +382 -0
- package/lib/commonjs/MarketComponents/components/TournamentMarket/index.js.map +1 -0
- package/lib/commonjs/MarketComponents/index.js +3 -1
- package/lib/commonjs/MarketComponents/index.js.map +1 -1
- package/lib/commonjs/MarketMaker/api/index.js +80 -9
- package/lib/commonjs/MarketMaker/api/index.js.map +1 -1
- package/lib/commonjs/MarketMaker/components/Contest.js +111 -40
- package/lib/commonjs/MarketMaker/components/Contest.js.map +1 -1
- package/lib/commonjs/MarketMaker/components/ContestMarkets.js +538 -161
- package/lib/commonjs/MarketMaker/components/ContestMarkets.js.map +1 -1
- package/lib/commonjs/MarketMaker/components/Dashboard.js +8 -2
- package/lib/commonjs/MarketMaker/components/Dashboard.js.map +1 -1
- package/lib/commonjs/MarketMaker/components/OrderForm.js +186 -0
- package/lib/commonjs/MarketMaker/components/OrderForm.js.map +1 -0
- package/lib/commonjs/MarketMaker/components/SetMarketForm.js +221 -77
- package/lib/commonjs/MarketMaker/components/SetMarketForm.js.map +1 -1
- package/lib/commonjs/MarketMaker/components/WeightProgress.js +19 -8
- package/lib/commonjs/MarketMaker/components/WeightProgress.js.map +1 -1
- package/lib/commonjs/MarketMaker/index.js +138 -21
- package/lib/commonjs/MarketMaker/index.js.map +1 -1
- package/lib/commonjs/Socket/index.js +1 -1
- package/lib/commonjs/Socket/index.js.map +1 -1
- package/lib/module/Components/Jerseys.js +14 -4
- package/lib/module/Components/Jerseys.js.map +1 -1
- package/lib/module/LocationTracker/LocationStatus.js +1 -0
- package/lib/module/LocationTracker/LocationStatus.js.map +1 -1
- package/lib/module/MarketComponents/api/index.js +40 -0
- package/lib/module/MarketComponents/api/index.js.map +1 -1
- package/lib/module/MarketComponents/components/AthleteTournamentMarket/index.js.map +1 -1
- package/lib/module/MarketComponents/components/MatchMarket/index.js +222 -0
- package/lib/module/MarketComponents/components/MatchMarket/index.js.map +1 -0
- package/lib/module/MarketComponents/components/TeamTournamentMarket/index.js +189 -0
- package/lib/module/MarketComponents/components/TeamTournamentMarket/index.js.map +1 -0
- package/lib/module/MarketComponents/components/TournamentMarket/api/index.js +103 -0
- package/lib/module/MarketComponents/components/TournamentMarket/api/index.js.map +1 -0
- package/lib/module/MarketComponents/components/TournamentMarket/index.js +373 -0
- package/lib/module/MarketComponents/components/TournamentMarket/index.js.map +1 -0
- package/lib/module/MarketComponents/index.js +3 -1
- package/lib/module/MarketComponents/index.js.map +1 -1
- package/lib/module/MarketMaker/api/index.js +80 -9
- package/lib/module/MarketMaker/api/index.js.map +1 -1
- package/lib/module/MarketMaker/components/Contest.js +110 -41
- package/lib/module/MarketMaker/components/Contest.js.map +1 -1
- package/lib/module/MarketMaker/components/ContestMarkets.js +541 -162
- package/lib/module/MarketMaker/components/ContestMarkets.js.map +1 -1
- package/lib/module/MarketMaker/components/Dashboard.js +8 -2
- package/lib/module/MarketMaker/components/Dashboard.js.map +1 -1
- package/lib/module/MarketMaker/components/OrderForm.js +177 -0
- package/lib/module/MarketMaker/components/OrderForm.js.map +1 -0
- package/lib/module/MarketMaker/components/SetMarketForm.js +221 -77
- package/lib/module/MarketMaker/components/SetMarketForm.js.map +1 -1
- package/lib/module/MarketMaker/components/WeightProgress.js +17 -8
- package/lib/module/MarketMaker/components/WeightProgress.js.map +1 -1
- package/lib/module/MarketMaker/index.js +138 -21
- package/lib/module/MarketMaker/index.js.map +1 -1
- package/lib/module/Socket/index.js +1 -1
- package/lib/module/Socket/index.js.map +1 -1
- package/lib/typescript/src/Components/Jerseys.d.ts +2 -1
- package/lib/typescript/src/Components/Jerseys.d.ts.map +1 -1
- package/lib/typescript/src/LocationTracker/LocationStatus.d.ts.map +1 -1
- package/lib/typescript/src/MarketComponents/api/index.d.ts +6 -0
- package/lib/typescript/src/MarketComponents/api/index.d.ts.map +1 -1
- package/lib/typescript/src/MarketComponents/components/AthleteTournamentMarket/index.d.ts.map +1 -1
- package/lib/typescript/src/MarketComponents/components/MatchMarket/index.d.ts +33 -0
- package/lib/typescript/src/MarketComponents/components/MatchMarket/index.d.ts.map +1 -0
- package/lib/typescript/src/MarketComponents/components/TeamTournamentMarket/index.d.ts +29 -0
- package/lib/typescript/src/MarketComponents/components/TeamTournamentMarket/index.d.ts.map +1 -0
- package/lib/typescript/src/MarketComponents/components/TournamentMarket/api/index.d.ts +13 -0
- package/lib/typescript/src/MarketComponents/components/TournamentMarket/api/index.d.ts.map +1 -0
- package/lib/typescript/src/MarketComponents/components/TournamentMarket/index.d.ts +27 -0
- package/lib/typescript/src/MarketComponents/components/TournamentMarket/index.d.ts.map +1 -0
- package/lib/typescript/src/MarketComponents/index.d.ts +22 -0
- package/lib/typescript/src/MarketComponents/index.d.ts.map +1 -1
- package/lib/typescript/src/MarketMaker/api/index.d.ts +18 -4
- package/lib/typescript/src/MarketMaker/api/index.d.ts.map +1 -1
- package/lib/typescript/src/MarketMaker/components/Contest.d.ts +5 -2
- package/lib/typescript/src/MarketMaker/components/Contest.d.ts.map +1 -1
- package/lib/typescript/src/MarketMaker/components/ContestMarkets.d.ts +4 -1
- package/lib/typescript/src/MarketMaker/components/ContestMarkets.d.ts.map +1 -1
- package/lib/typescript/src/MarketMaker/components/Dashboard.d.ts +4 -2
- package/lib/typescript/src/MarketMaker/components/Dashboard.d.ts.map +1 -1
- package/lib/typescript/src/MarketMaker/components/OrderForm.d.ts +12 -0
- package/lib/typescript/src/MarketMaker/components/OrderForm.d.ts.map +1 -0
- package/lib/typescript/src/MarketMaker/components/SetMarketForm.d.ts +1 -1
- package/lib/typescript/src/MarketMaker/components/SetMarketForm.d.ts.map +1 -1
- package/lib/typescript/src/MarketMaker/components/WeightProgress.d.ts +2 -2
- package/lib/typescript/src/MarketMaker/components/WeightProgress.d.ts.map +1 -1
- package/lib/typescript/src/MarketMaker/index.d.ts +3 -1
- package/lib/typescript/src/MarketMaker/index.d.ts.map +1 -1
- package/lib/typescript/src/Socket/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/Components/Jerseys.tsx +9 -4
- package/src/LocationTracker/LocationStatus.tsx +1 -0
- package/src/MarketComponents/api/index.ts +27 -0
- package/src/MarketComponents/components/AthleteTournamentMarket/index.tsx +0 -1
- package/src/MarketComponents/components/MatchMarket/index.tsx +149 -0
- package/src/MarketComponents/components/TeamTournamentMarket/index.tsx +121 -0
- package/src/MarketComponents/components/TournamentMarket/api/index.ts +74 -0
- package/src/MarketComponents/components/TournamentMarket/index.tsx +289 -0
- package/src/MarketComponents/index.tsx +3 -1
- package/src/MarketMaker/api/index.ts +61 -13
- package/src/MarketMaker/components/Contest.tsx +79 -29
- package/src/MarketMaker/components/ContestMarkets.tsx +400 -98
- package/src/MarketMaker/components/Dashboard.tsx +11 -5
- package/src/MarketMaker/components/OrderForm.tsx +134 -0
- package/src/MarketMaker/components/SetMarketForm.tsx +128 -77
- package/src/MarketMaker/components/WeightProgress.tsx +9 -5
- package/src/MarketMaker/index.tsx +122 -22
- package/src/Socket/index.tsx +5 -2
- package/src/types.d.ts +1 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import React, { useCallback } from 'react';
|
|
2
|
+
import { View, TouchableOpacity } from 'react-native';
|
|
3
|
+
import type { BestAvailableOrderProps, EventOrderStatProps, MarketProps, MarketSideOptionProps, OrderProps, TeamProps, TournamentProps, 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 { TeamImage } from '../../../Components/Jerseys';
|
|
11
|
+
|
|
12
|
+
type TeamTournamentMarketProps = {
|
|
13
|
+
tournament:TournamentProps,
|
|
14
|
+
event_type:'team'|'tournament'|'match',
|
|
15
|
+
team:TeamProps,
|
|
16
|
+
hide_stat_banner?:boolean,
|
|
17
|
+
width?:number,
|
|
18
|
+
market:MarketProps,
|
|
19
|
+
show_event?:boolean,
|
|
20
|
+
hide_liquidity?:boolean,
|
|
21
|
+
latest_trades:TradeProps[],
|
|
22
|
+
best_available_orders:BestAvailableOrderProps[],
|
|
23
|
+
event_order_stats:EventOrderStatProps[],
|
|
24
|
+
default_price_view:'last_trade'|'best_available',
|
|
25
|
+
onOrder:(order:OrderProps) => void,
|
|
26
|
+
show_grades?:boolean,
|
|
27
|
+
onView:(data:{event_id:string, event_type:string, market_id:string, side_type:'team', side_id:string}) => void,
|
|
28
|
+
onTradeLongPress:(trade:TradeProps) => void
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const TeamTournamentMarket = ({ tournament, show_event, hide_liquidity, hide_stat_banner, width, team, market, event_order_stats, default_price_view, latest_trades, show_grades, best_available_orders, onOrder, onView, onTradeLongPress }:TeamTournamentMarketProps) => {
|
|
32
|
+
const { liquidity, open_order_count } = MarketComponentHelpers.getLiqudity(event_order_stats);
|
|
33
|
+
const renderSides = useCallback((data:{ item:MarketSideOptionProps, index:number, market:MarketProps }) => {
|
|
34
|
+
|
|
35
|
+
const ba_order = best_available_orders.find(o => o.market_id == market.market_id && o.side_type == 'team' && o.side_id == team.team_id && o.side == data.item.side && o.show);
|
|
36
|
+
const side_details = MarketComponentHelpers.getTournamentSideIds(market, data.item, undefined, team);
|
|
37
|
+
if(!side_details){ return <></> }
|
|
38
|
+
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);
|
|
39
|
+
if(!trade){
|
|
40
|
+
trade = MarketButtonHelpers.getTradeFromMarket(market, tournament.tournament_id, 'team', data.item.side, data.item.id_source, side_details.side_id, side_details.reversed_side_id);
|
|
41
|
+
}
|
|
42
|
+
return (
|
|
43
|
+
<View style={{ margin:2, height:50, width:75 }}>
|
|
44
|
+
<MarketButton
|
|
45
|
+
side_option={data.item}
|
|
46
|
+
market={data.market}
|
|
47
|
+
trade={trade}
|
|
48
|
+
show_grades={show_grades}
|
|
49
|
+
order={ba_order}
|
|
50
|
+
onLongPress={onTradeLongPress}
|
|
51
|
+
onPress={(order) => {
|
|
52
|
+
const order_title = MarketComponentHelpers.getOrderTitleForTournament(order, market, tournament, undefined, team);
|
|
53
|
+
if(!order_title){ return alert('Unable to process order') }
|
|
54
|
+
onOrder({ ...order, title: order_title })
|
|
55
|
+
}}
|
|
56
|
+
/>
|
|
57
|
+
</View>
|
|
58
|
+
)
|
|
59
|
+
},[JSON.stringify(best_available_orders)])
|
|
60
|
+
|
|
61
|
+
return (
|
|
62
|
+
<View style={{ ...view_styles.section, flex:1, borderWidth:1, borderColor:Colors.shades.shade600, width }}>
|
|
63
|
+
{!hide_stat_banner ?
|
|
64
|
+
<LinearDiagnal
|
|
65
|
+
label={market.stat_label ?? market.type}
|
|
66
|
+
label_size={14}
|
|
67
|
+
style={{ borderTopLeftRadius:8, padding:5 }}
|
|
68
|
+
left_color={Colors.incentive.gold}
|
|
69
|
+
right_color={'#ebd197'}
|
|
70
|
+
/>
|
|
71
|
+
:<></>}
|
|
72
|
+
{show_event ?
|
|
73
|
+
<View style={{ padding:5, backgroundColor:Colors.shades.shade100 }}>
|
|
74
|
+
<Text size={12} color={Colors.brand.midnight} textAlign='center' weight='semibold'>{tournament.tournament_name}</Text>
|
|
75
|
+
</View>
|
|
76
|
+
:<></>}
|
|
77
|
+
<View style={{ ...view_styles.section_body, flex:1, padding:0, justifyContent:'center', alignItems:'center' }}>
|
|
78
|
+
<TeamImage
|
|
79
|
+
team={team}
|
|
80
|
+
size={24}
|
|
81
|
+
/>
|
|
82
|
+
<View style={{ padding:10, paddingBottom:0 }}>
|
|
83
|
+
<Text weight='bold' size={14} color={Colors.brand.midnight} textAlign='center'>{team.market_name} {team.name}</Text>
|
|
84
|
+
<Text style={{ marginTop:3 }} color={Colors.brand.midnight} weight='regular' textAlign='center' size={12}>{team.division}</Text>
|
|
85
|
+
</View>
|
|
86
|
+
</View>
|
|
87
|
+
<View nativeID='market_sides' style={{ flexDirection:'row', justifyContent:'center', alignItems:'center', padding:10 }}>
|
|
88
|
+
{market.side_options.sort((a,b) => {
|
|
89
|
+
let a_t = a.side == market.trade_side ? 1 : 0
|
|
90
|
+
let b_t = b.side == market.trade_side ? 1 : 0
|
|
91
|
+
return a_t - b_t
|
|
92
|
+
}).map((so, index) => {
|
|
93
|
+
return renderSides({ item:so, index, market })
|
|
94
|
+
})}
|
|
95
|
+
</View>
|
|
96
|
+
{!hide_liquidity ?
|
|
97
|
+
<View style={{ backgroundColor:Colors.shades.shade100, padding:10, flexDirection:'row', alignItems:'center', borderBottomLeftRadius:8, borderBottomRightRadius:8 }}>
|
|
98
|
+
<TouchableOpacity style={{ flex:1, flexDirection:'row' }} onPress={() => {
|
|
99
|
+
onView({
|
|
100
|
+
event_id: tournament.tournament_id,
|
|
101
|
+
event_type: 'tournament',
|
|
102
|
+
market_id: market.market_id,
|
|
103
|
+
side_type: 'team',
|
|
104
|
+
side_id: team.team_id
|
|
105
|
+
});
|
|
106
|
+
}}>
|
|
107
|
+
<View style={{ backgroundColor:Colors.shades.white, height:30, width:30, borderRadius:100, justifyContent:'center', alignItems:'center', ...view_styles.float }}>
|
|
108
|
+
<Icons.LiquidityIcon color={Colors.brand.midnight} size={30}/>
|
|
109
|
+
</View>
|
|
110
|
+
<View style={{ marginLeft:10 }}>
|
|
111
|
+
<Text theme='body_2'>Liquidity</Text>
|
|
112
|
+
<Text size={12} color={Colors.brand.electric} weight='semibold'>${liquidity.toFixed()} {open_order_count} Orders</Text>
|
|
113
|
+
</View>
|
|
114
|
+
</TouchableOpacity>
|
|
115
|
+
</View>
|
|
116
|
+
:<></>}
|
|
117
|
+
</View>
|
|
118
|
+
)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export default TeamTournamentMarket
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import moment from "moment-mini";
|
|
2
|
+
import type { AthleteProps, EventOrderStatProps, MarketProps, MatchProps, TeamProps, TournamentProps, TradeProps } from "../../../../types";
|
|
3
|
+
|
|
4
|
+
export { TournamentMarketHelpers }
|
|
5
|
+
const TournamentMarketHelpers = {
|
|
6
|
+
visibleMarketTypes: (tournament:TournamentProps, market?:MarketProps) => {
|
|
7
|
+
let show_athletes = false
|
|
8
|
+
let show_teams = false
|
|
9
|
+
let show_matches = false
|
|
10
|
+
tournament.supported_markets.map(sm => {
|
|
11
|
+
if(!market){ return }
|
|
12
|
+
if(sm.market_id != market.market_id){ return }
|
|
13
|
+
switch(market?.event_type){
|
|
14
|
+
case 'tournament':
|
|
15
|
+
if(market.level == 'athlete'){ show_athletes = true }
|
|
16
|
+
if(market.level == 'team'){ show_teams = true }
|
|
17
|
+
return
|
|
18
|
+
case 'match':
|
|
19
|
+
show_matches = true
|
|
20
|
+
return
|
|
21
|
+
default: return
|
|
22
|
+
}
|
|
23
|
+
})
|
|
24
|
+
return { show_athletes, show_teams, show_matches }
|
|
25
|
+
},
|
|
26
|
+
sortAthletes : (event_order_stats:EventOrderStatProps[], latest_trades:TradeProps[], athletes:AthleteProps[], market?:MarketProps) => {
|
|
27
|
+
return athletes.sort((a,b) => {
|
|
28
|
+
let a_prob = 0
|
|
29
|
+
let b_prob = 0
|
|
30
|
+
let a_trade = latest_trades.find(os => os.market_id == market?.market_id && os.side == market?.trade_side && os.side_type == 'athlete' && os.side_id == a.athlete_id);
|
|
31
|
+
if(a_trade){ a_prob = a_trade.probability }
|
|
32
|
+
let b_trade = latest_trades.find(os => os.market_id == market?.market_id && os.side == market?.trade_side && os.side_type == 'athlete' && os.side_id == b.athlete_id);
|
|
33
|
+
if(b_trade){ b_prob = b_trade.probability }
|
|
34
|
+
let a_stats = event_order_stats.filter(os => os.market_id == market?.market_id && os.side_type == 'athlete' && os.side_id == a.athlete_id).reduce((a,b) => a + b.open_order_amount, 0);
|
|
35
|
+
let b_stats = event_order_stats.filter(os => os.market_id == market?.market_id && os.side_type == 'athlete' && os.side_id == b.athlete_id).reduce((a,b) => a + b.open_order_amount, 0);
|
|
36
|
+
|
|
37
|
+
if(a_stats > 0){ a_prob += a_stats }
|
|
38
|
+
if(b_stats > 0){ b_prob += b_stats }
|
|
39
|
+
return b_prob - a_prob
|
|
40
|
+
})
|
|
41
|
+
},
|
|
42
|
+
sortTeams : (event_order_stats:EventOrderStatProps[], latest_trades:TradeProps[], teams:TeamProps[], market?:MarketProps) => {
|
|
43
|
+
return teams.sort((a,b) => {
|
|
44
|
+
let a_prob = 0
|
|
45
|
+
let b_prob = 0
|
|
46
|
+
let a_trade = latest_trades.find(os => os.market_id == market?.market_id && os.side == market?.trade_side && os.side_type == 'team' && os.side_id == a.team_id);
|
|
47
|
+
if(a_trade){ a_prob = a_trade.probability }
|
|
48
|
+
let b_trade = latest_trades.find(os => os.market_id == market?.market_id && os.side == market?.trade_side && os.side_type == 'team' && os.side_id == b.team_id);
|
|
49
|
+
if(b_trade){ b_prob = b_trade.probability }
|
|
50
|
+
let a_stats = event_order_stats.filter(os => os.market_id == market?.market_id && os.side_type == 'athlete' && os.side_id == a.team_id).reduce((a,b) => a + b.open_order_amount, 0);
|
|
51
|
+
let b_stats = event_order_stats.filter(os => os.market_id == market?.market_id && os.side_type == 'athlete' && os.side_id == b.team_id).reduce((a,b) => a + b.open_order_amount, 0);
|
|
52
|
+
|
|
53
|
+
if(a_stats > 0){ a_prob += a_stats }
|
|
54
|
+
if(b_stats > 0){ b_prob += b_stats }
|
|
55
|
+
return b_prob - a_prob
|
|
56
|
+
})
|
|
57
|
+
},
|
|
58
|
+
sortMatches : (event_order_stats:EventOrderStatProps[], matches:MatchProps[], market?:MarketProps) => {
|
|
59
|
+
return matches.sort((a,b) => {
|
|
60
|
+
let a_prob = 0
|
|
61
|
+
let b_prob = 0
|
|
62
|
+
let a_stats = event_order_stats.filter(os => os.market_id == market?.market_id && os.event_type == 'match' && os.event_id == a.match_id).reduce((a,b) => a + b.open_order_amount, 0);
|
|
63
|
+
let b_stats = event_order_stats.filter(os => os.market_id == market?.market_id && os.event_type == 'match' && os.event_id == b.match_id).reduce((a,b) => a + b.open_order_amount, 0);
|
|
64
|
+
if(a_stats > 0){ a_prob += a_stats + 999999999 }
|
|
65
|
+
if(b_stats > 0){ b_prob += b_stats + 999999999 }
|
|
66
|
+
if(a_prob == 0 && b_prob == 0){
|
|
67
|
+
b_prob = moment(a.scheduled_datetime).unix()
|
|
68
|
+
a_prob = moment(b.scheduled_datetime).unix()
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return b_prob - a_prob
|
|
72
|
+
})
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import React, { useEffect, useRef, useState } from 'react';
|
|
2
|
+
import { View, FlatList, TouchableOpacity, ActivityIndicator, Image } from 'react-native';
|
|
3
|
+
import { view_styles } from '../../../constants/styles';
|
|
4
|
+
import Colors from '../../../constants/colors';
|
|
5
|
+
import type { AthleteProps, BestAvailableOrderProps, EventOrderStatProps, LeagueProps, MarketProps, MatchProps, OrderProps, TeamProps, TournamentProps, TradeProps } from '../../../types';
|
|
6
|
+
import { Button, Icons, Text } from '../../../Components';
|
|
7
|
+
import { MarketComponentApi, MarketComponentHelpers } from '../../api';
|
|
8
|
+
import AthleteTournamentMarket from '../AthleteTournamentMarket';
|
|
9
|
+
import TeamTournamentMarket from '../TeamTournamentMarket';
|
|
10
|
+
import MatchMarket from '../MatchMarket';
|
|
11
|
+
import moment from 'moment-mini';
|
|
12
|
+
import { TournamentMarketHelpers } from './api';
|
|
13
|
+
import { useIsInViewport } from '../../../Components/ViewportObserver';
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
type TournamentMarketProps = {
|
|
17
|
+
tournament:TournamentProps,
|
|
18
|
+
league?:LeagueProps,
|
|
19
|
+
markets:MarketProps[],
|
|
20
|
+
latest_trades:TradeProps[],
|
|
21
|
+
best_available_orders:BestAvailableOrderProps[],
|
|
22
|
+
match_available_orders:BestAvailableOrderProps[],
|
|
23
|
+
event_order_stats:EventOrderStatProps[],
|
|
24
|
+
match_order_stats:EventOrderStatProps[],
|
|
25
|
+
match_latest_trades:TradeProps[],
|
|
26
|
+
onView:(data:{ event_id:string, event_type:string, market_id:string, side_type?:string, side_id?:string }) => void,
|
|
27
|
+
onTradeLongPress:(trade:TradeProps) => void,
|
|
28
|
+
onActivate?:(event_id:string, event_type:string) => void,
|
|
29
|
+
onViewAdditionalMarkets: (event_id:string, event_type:string) => void,
|
|
30
|
+
onOrder:(order:OrderProps) => void
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
const TournamentMarket = ({ tournament, league, markets, latest_trades, best_available_orders, event_order_stats, match_available_orders, match_latest_trades, match_order_stats, onView, onTradeLongPress, onViewAdditionalMarkets, onOrder }:TournamentMarketProps) => {
|
|
35
|
+
const [ tournament_data, setTournamentData ] = useState<{
|
|
36
|
+
loaded:boolean,
|
|
37
|
+
loading:boolean,
|
|
38
|
+
athletes:AthleteProps[],
|
|
39
|
+
teams:TeamProps[],
|
|
40
|
+
matches:MatchProps[],
|
|
41
|
+
match_trades:TradeProps[],
|
|
42
|
+
active_market?:MarketProps
|
|
43
|
+
}>({
|
|
44
|
+
loading:false,
|
|
45
|
+
loaded:false,
|
|
46
|
+
athletes:[],
|
|
47
|
+
match_trades:[],
|
|
48
|
+
teams:[],
|
|
49
|
+
matches:[]
|
|
50
|
+
});
|
|
51
|
+
const { loaded, athletes, loading, matches, teams, active_market, match_trades } = tournament_data;
|
|
52
|
+
const [ show_markets, setShowMarkets ] = useState(false);
|
|
53
|
+
|
|
54
|
+
const ref = useRef(null);
|
|
55
|
+
const is_in_viewport = useIsInViewport(ref)
|
|
56
|
+
|
|
57
|
+
const supported_markets = markets.filter(m => tournament.supported_markets.find(sm => sm.market_id == m.market_id));
|
|
58
|
+
const { show_athletes, show_teams, show_matches } = TournamentMarketHelpers.visibleMarketTypes(tournament, active_market);
|
|
59
|
+
const { liquidity, open_order_count } = MarketComponentHelpers.getLiqudity(event_order_stats.concat(match_order_stats));
|
|
60
|
+
const sorted_athletes = TournamentMarketHelpers.sortAthletes(event_order_stats, latest_trades, athletes, active_market);
|
|
61
|
+
const sorted_teams = TournamentMarketHelpers.sortTeams(event_order_stats, latest_trades, teams, active_market);
|
|
62
|
+
const sorted_matches = TournamentMarketHelpers.sortMatches(match_order_stats, matches, active_market);
|
|
63
|
+
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
if(!is_in_viewport || loaded || loading){ return }
|
|
66
|
+
MarketComponentApi.setEnvironment();
|
|
67
|
+
getTournamentData(tournament)
|
|
68
|
+
},[is_in_viewport, tournament.tournament_id]);
|
|
69
|
+
|
|
70
|
+
const getTournamentData = async(t:TournamentProps) => {
|
|
71
|
+
if(loaded || loading){ return }
|
|
72
|
+
setTournamentData({ ...tournament_data, loading:true });
|
|
73
|
+
let t_ids:string[] = [];
|
|
74
|
+
let a_ids:string[] = [];
|
|
75
|
+
let mtchs:MatchProps[] = await MarketComponentApi.getMatchesByTournament(t.tournament_id);
|
|
76
|
+
let trades = await MarketComponentApi.getLatestTradesByEvents('match', mtchs.map(m => m.match_id));
|
|
77
|
+
mtchs.map(m => {
|
|
78
|
+
if(t.participant_type == 'athlete'){ a_ids = a_ids.concat(m.participants) }
|
|
79
|
+
if(t.participant_type == 'team'){ t_ids = t_ids.concat(m.participant_type) }
|
|
80
|
+
})
|
|
81
|
+
if(t.participant_type == 'team'){ t_ids = t_ids.concat(t.participants) }
|
|
82
|
+
if(t.participant_type == 'athlete'){ a_ids = a_ids.concat(t.participants) }
|
|
83
|
+
|
|
84
|
+
let sm = tournament.supported_markets[0]
|
|
85
|
+
let market = markets.find(m => m.market_id == sm?.market_id);
|
|
86
|
+
const aths = await MarketComponentApi.getAthletesByIds(a_ids);
|
|
87
|
+
const tms = await MarketComponentApi.getTeamsByIds(t_ids);
|
|
88
|
+
|
|
89
|
+
setTournamentData({
|
|
90
|
+
...tournament_data,
|
|
91
|
+
loaded: true,
|
|
92
|
+
loading:false,
|
|
93
|
+
athletes: aths,
|
|
94
|
+
match_trades: trades,
|
|
95
|
+
teams: tms,
|
|
96
|
+
matches: mtchs,
|
|
97
|
+
active_market: market
|
|
98
|
+
})
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const renderMarkets = (data: { item:MarketProps, index:number }) => {
|
|
102
|
+
return (
|
|
103
|
+
<TouchableOpacity style={{ ...view_styles.body_row, padding:10, borderBottomWidth:1, borderColor:Colors.shades.shade600 }} onPress={() => {
|
|
104
|
+
setTournamentData({ ...tournament_data, active_market: data.item });
|
|
105
|
+
setShowMarkets(false);
|
|
106
|
+
}}>
|
|
107
|
+
<Text size={12} color={Colors.brand.midnight} weight='semibold'>{data.item.type == 'Stat' ? data.item.stat_label : data.item.type}</Text>
|
|
108
|
+
</TouchableOpacity>
|
|
109
|
+
)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const renderMatches = (data: { item:MatchProps, index:number }) => {
|
|
113
|
+
if(!active_market){ return <></> }
|
|
114
|
+
let home_athlete = athletes.find(a => a.athlete_id == data.item.participants[1]);
|
|
115
|
+
let away_athlete = athletes.find(a => a.athlete_id == data.item.participants[0]);
|
|
116
|
+
let home_team = teams.find(a => a.team_id == data.item.participants[1]);
|
|
117
|
+
let away_team = teams.find(a => a.team_id == data.item.participants[0]);
|
|
118
|
+
|
|
119
|
+
let m_available_orders = match_available_orders.filter(ba => ba.event_id == data.item.match_id && ba.event_type == 'match');
|
|
120
|
+
let m_trades = match_latest_trades.filter(t => t.event_id == data.item.match_id && t.event_type == 'match');
|
|
121
|
+
if(m_trades.length == 0){
|
|
122
|
+
m_trades = match_trades.filter(t => t.event_id == data.item.match_id && t.event_type == 'match');
|
|
123
|
+
}
|
|
124
|
+
let m_order_stats = match_order_stats.filter(os => os.event_id == data.item.match_id && os.event_type == 'match');
|
|
125
|
+
return (
|
|
126
|
+
<MatchMarket
|
|
127
|
+
match={data.item}
|
|
128
|
+
league={league}
|
|
129
|
+
away_athlete={away_athlete}
|
|
130
|
+
home_athlete={home_athlete}
|
|
131
|
+
away_team={away_team}
|
|
132
|
+
home_team={home_team}
|
|
133
|
+
market={active_market}
|
|
134
|
+
latest_trades={m_trades}
|
|
135
|
+
best_available_orders={m_available_orders}
|
|
136
|
+
event_order_stats={m_order_stats}
|
|
137
|
+
onOrder={onOrder}
|
|
138
|
+
onTradeLongPress={onTradeLongPress}
|
|
139
|
+
onView={onView}
|
|
140
|
+
default_price_view='best_available'
|
|
141
|
+
|
|
142
|
+
/>
|
|
143
|
+
)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const renderTeams = (data:{ item:TeamProps, index:number }) => {
|
|
147
|
+
if(!active_market){ return <></> }
|
|
148
|
+
let team_available_orders = best_available_orders.filter(ba => ba.side_type == 'team' && ba.side_id == data.item.team_id);
|
|
149
|
+
let team_trades = latest_trades.filter(t => t.side_type == 'team' && t.side_id == data.item.team_id);
|
|
150
|
+
let team_order_stats = event_order_stats.filter(os => os.side_type == 'team' && os.side_id == data.item.team_id);
|
|
151
|
+
return (
|
|
152
|
+
<TeamTournamentMarket
|
|
153
|
+
team={data.item}
|
|
154
|
+
event_type='tournament'
|
|
155
|
+
onTradeLongPress={onTradeLongPress}
|
|
156
|
+
onView={onView}
|
|
157
|
+
tournament={tournament}
|
|
158
|
+
event_order_stats={team_order_stats}
|
|
159
|
+
best_available_orders={team_available_orders}
|
|
160
|
+
latest_trades={team_trades}
|
|
161
|
+
default_price_view='best_available'
|
|
162
|
+
market={active_market}
|
|
163
|
+
onOrder={onOrder}
|
|
164
|
+
/>
|
|
165
|
+
)
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const renderAthletes = (data:{ item:AthleteProps, index:number }) => {
|
|
169
|
+
if(!active_market){ return <></> }
|
|
170
|
+
let team_available_orders = best_available_orders.filter(ba => ba.side_type == 'athlete' && ba.side_id == data.item.athlete_id);
|
|
171
|
+
let team_trades = latest_trades.filter(t => t.side_type == 'athlete' && t.side_id == data.item.athlete_id);
|
|
172
|
+
let team_order_stats = event_order_stats.filter(os => os.side_type == 'athlete' && os.side_id == data.item.athlete_id);
|
|
173
|
+
return (
|
|
174
|
+
<AthleteTournamentMarket
|
|
175
|
+
athlete={data.item}
|
|
176
|
+
event_type='tournament'
|
|
177
|
+
onTradeLongPress={onTradeLongPress}
|
|
178
|
+
onView={onView}
|
|
179
|
+
tournament={tournament}
|
|
180
|
+
event_order_stats={team_order_stats}
|
|
181
|
+
best_available_orders={team_available_orders}
|
|
182
|
+
latest_trades={team_trades}
|
|
183
|
+
default_price_view='best_available'
|
|
184
|
+
market={active_market}
|
|
185
|
+
onOrder={onOrder}
|
|
186
|
+
/>
|
|
187
|
+
)
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
return (
|
|
192
|
+
<View ref={ref} style={{ ...view_styles.section, borderWidth:1, borderColor:Colors.shades.shade600 }}>
|
|
193
|
+
<View style={{ ...view_styles.section_header }}>
|
|
194
|
+
{league ?
|
|
195
|
+
<Image
|
|
196
|
+
source={{ uri: league.league_image }}
|
|
197
|
+
style={{ height:40, width: 40, marginRight:10 }}
|
|
198
|
+
resizeMode='cover'
|
|
199
|
+
/>
|
|
200
|
+
:<></>}
|
|
201
|
+
<View style={{ flex:1 }}>
|
|
202
|
+
<Text theme='header_2'>{tournament.tournament_name}</Text>
|
|
203
|
+
<Text style={{ marginTop:3 }} theme='body'>{moment(tournament.scheduled_datetime).format('MMM DD YYYY')}</Text>
|
|
204
|
+
</View>
|
|
205
|
+
</View>
|
|
206
|
+
{loading || !loaded ?
|
|
207
|
+
<View style={{ padding:20 }}>
|
|
208
|
+
<ActivityIndicator size={'large'} color={Colors.brand.midnight} />
|
|
209
|
+
</View>
|
|
210
|
+
:
|
|
211
|
+
<View>
|
|
212
|
+
{show_teams && teams.length > 0 ?
|
|
213
|
+
<View style={{ ...view_styles.section_body }}>
|
|
214
|
+
<FlatList
|
|
215
|
+
data={sorted_teams}
|
|
216
|
+
renderItem={renderTeams}
|
|
217
|
+
horizontal
|
|
218
|
+
keyExtractor={(item) => item.team_id.toString()}
|
|
219
|
+
/>
|
|
220
|
+
</View>
|
|
221
|
+
:<></>}
|
|
222
|
+
{show_athletes && athletes.length > 0 ?
|
|
223
|
+
<View style={{ ...view_styles.section_body }}>
|
|
224
|
+
<FlatList
|
|
225
|
+
data={sorted_athletes}
|
|
226
|
+
renderItem={renderAthletes}
|
|
227
|
+
horizontal
|
|
228
|
+
keyExtractor={(item) => item.athlete_id.toString()}
|
|
229
|
+
/>
|
|
230
|
+
</View>
|
|
231
|
+
:show_matches && matches.length > 0 ?
|
|
232
|
+
<View style={{ ...view_styles.section_body }}>
|
|
233
|
+
<FlatList
|
|
234
|
+
data={sorted_matches}
|
|
235
|
+
renderItem={renderMatches}
|
|
236
|
+
keyExtractor={(item) => item.match_id.toString()}
|
|
237
|
+
horizontal
|
|
238
|
+
/>
|
|
239
|
+
</View>
|
|
240
|
+
:<></>}
|
|
241
|
+
</View>
|
|
242
|
+
}
|
|
243
|
+
<View style={{ backgroundColor:Colors.shades.shade100, padding:10, flexDirection:'row', alignItems:'center', flexWrap:'wrap', borderBottomLeftRadius:8, borderBottomRightRadius:8 }}>
|
|
244
|
+
<TouchableOpacity style={{ flex:1, flexDirection:'row', minWidth:115 }} onPress={() => {
|
|
245
|
+
if(!active_market){ return }
|
|
246
|
+
onViewAdditionalMarkets(tournament.tournament_id, 'tournament');
|
|
247
|
+
}}>
|
|
248
|
+
<View style={{ backgroundColor:Colors.shades.white, height:30, width:30, borderRadius:100, justifyContent:'center', alignItems:'center', ...view_styles.float }}>
|
|
249
|
+
<Icons.LiquidityIcon color={Colors.brand.midnight} size={30}/>
|
|
250
|
+
</View>
|
|
251
|
+
<View style={{ marginLeft:5 }}>
|
|
252
|
+
<Text theme='body_2'>Tournament Liquidity</Text>
|
|
253
|
+
<Text size={12} color={Colors.brand.electric} weight='semibold'>${liquidity.toFixed()} {open_order_count} Orders</Text>
|
|
254
|
+
</View>
|
|
255
|
+
</TouchableOpacity>
|
|
256
|
+
<TouchableOpacity style={{ flexDirection:'row', alignItems:'center', backgroundColor:Colors.shades.white, borderWidth:1, borderColor:Colors.shades.shade600, borderRadius:4, padding:10, ...view_styles.float }} onPress={() => setShowMarkets(!show_markets)}>
|
|
257
|
+
<Text style={{ marginRight:10 }} size={14} color={Colors.brand.midnight}>{active_market?.type == 'Stat' ? active_market.stat_label : active_market?.type}</Text>
|
|
258
|
+
<Icons.ChevronIcon color={Colors.brand.midnight} size={14} />
|
|
259
|
+
</TouchableOpacity>
|
|
260
|
+
{show_markets ?
|
|
261
|
+
<View style={{ ...view_styles.section, position:'absolute', bottom:5, right:5, minWidth:175 }}>
|
|
262
|
+
<View style={{ ...view_styles.section_header, backgroundColor:Colors.shades.shade100 }}>
|
|
263
|
+
<View style={{ flex:1 }}>
|
|
264
|
+
<Text theme='header_2'>Select Market</Text>
|
|
265
|
+
</View>
|
|
266
|
+
<Button
|
|
267
|
+
title='X'
|
|
268
|
+
title_weight='regular'
|
|
269
|
+
borderRadius={100}
|
|
270
|
+
backgroundColor={Colors.shades.white}
|
|
271
|
+
padding={5}
|
|
272
|
+
onPress={() => setShowMarkets(false)}
|
|
273
|
+
/>
|
|
274
|
+
</View>
|
|
275
|
+
<View style={{ ...view_styles.section_body, padding:10 }}>
|
|
276
|
+
<FlatList
|
|
277
|
+
data={supported_markets}
|
|
278
|
+
renderItem={renderMarkets}
|
|
279
|
+
keyExtractor={(item) => item.market_id.toString()}
|
|
280
|
+
/>
|
|
281
|
+
</View>
|
|
282
|
+
</View>
|
|
283
|
+
:<></>}
|
|
284
|
+
</View>
|
|
285
|
+
</View>
|
|
286
|
+
)
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
export default TournamentMarket
|
|
@@ -3,11 +3,13 @@ import AthleteMarket from './components/AthleteMarket';
|
|
|
3
3
|
import EventMarket from './components/EventMarket';
|
|
4
4
|
import AthleteTournamentMarket from './components/AthleteTournamentMarket';
|
|
5
5
|
import TeamEventList from './components/TeamEventList';
|
|
6
|
+
import TournamentMarket from './components/TournamentMarket';
|
|
6
7
|
|
|
7
8
|
export default {
|
|
8
9
|
TeamEventMarket,
|
|
9
10
|
AthleteMarket,
|
|
10
11
|
EventMarket,
|
|
11
12
|
AthleteTournamentMarket,
|
|
12
|
-
TeamEventList
|
|
13
|
+
TeamEventList,
|
|
14
|
+
TournamentMarket
|
|
13
15
|
}
|