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.
Files changed (123) hide show
  1. package/lib/commonjs/Components/Jerseys.js +14 -4
  2. package/lib/commonjs/Components/Jerseys.js.map +1 -1
  3. package/lib/commonjs/LocationTracker/LocationStatus.js +1 -0
  4. package/lib/commonjs/LocationTracker/LocationStatus.js.map +1 -1
  5. package/lib/commonjs/MarketComponents/api/index.js +40 -0
  6. package/lib/commonjs/MarketComponents/api/index.js.map +1 -1
  7. package/lib/commonjs/MarketComponents/components/AthleteTournamentMarket/index.js.map +1 -1
  8. package/lib/commonjs/MarketComponents/components/MatchMarket/index.js +231 -0
  9. package/lib/commonjs/MarketComponents/components/MatchMarket/index.js.map +1 -0
  10. package/lib/commonjs/MarketComponents/components/TeamTournamentMarket/index.js +198 -0
  11. package/lib/commonjs/MarketComponents/components/TeamTournamentMarket/index.js.map +1 -0
  12. package/lib/commonjs/MarketComponents/components/TournamentMarket/api/index.js +109 -0
  13. package/lib/commonjs/MarketComponents/components/TournamentMarket/api/index.js.map +1 -0
  14. package/lib/commonjs/MarketComponents/components/TournamentMarket/index.js +382 -0
  15. package/lib/commonjs/MarketComponents/components/TournamentMarket/index.js.map +1 -0
  16. package/lib/commonjs/MarketComponents/index.js +3 -1
  17. package/lib/commonjs/MarketComponents/index.js.map +1 -1
  18. package/lib/commonjs/MarketMaker/api/index.js +80 -9
  19. package/lib/commonjs/MarketMaker/api/index.js.map +1 -1
  20. package/lib/commonjs/MarketMaker/components/Contest.js +111 -40
  21. package/lib/commonjs/MarketMaker/components/Contest.js.map +1 -1
  22. package/lib/commonjs/MarketMaker/components/ContestMarkets.js +538 -161
  23. package/lib/commonjs/MarketMaker/components/ContestMarkets.js.map +1 -1
  24. package/lib/commonjs/MarketMaker/components/Dashboard.js +8 -2
  25. package/lib/commonjs/MarketMaker/components/Dashboard.js.map +1 -1
  26. package/lib/commonjs/MarketMaker/components/OrderForm.js +186 -0
  27. package/lib/commonjs/MarketMaker/components/OrderForm.js.map +1 -0
  28. package/lib/commonjs/MarketMaker/components/SetMarketForm.js +221 -77
  29. package/lib/commonjs/MarketMaker/components/SetMarketForm.js.map +1 -1
  30. package/lib/commonjs/MarketMaker/components/WeightProgress.js +19 -8
  31. package/lib/commonjs/MarketMaker/components/WeightProgress.js.map +1 -1
  32. package/lib/commonjs/MarketMaker/index.js +138 -21
  33. package/lib/commonjs/MarketMaker/index.js.map +1 -1
  34. package/lib/commonjs/Socket/index.js +1 -1
  35. package/lib/commonjs/Socket/index.js.map +1 -1
  36. package/lib/module/Components/Jerseys.js +14 -4
  37. package/lib/module/Components/Jerseys.js.map +1 -1
  38. package/lib/module/LocationTracker/LocationStatus.js +1 -0
  39. package/lib/module/LocationTracker/LocationStatus.js.map +1 -1
  40. package/lib/module/MarketComponents/api/index.js +40 -0
  41. package/lib/module/MarketComponents/api/index.js.map +1 -1
  42. package/lib/module/MarketComponents/components/AthleteTournamentMarket/index.js.map +1 -1
  43. package/lib/module/MarketComponents/components/MatchMarket/index.js +222 -0
  44. package/lib/module/MarketComponents/components/MatchMarket/index.js.map +1 -0
  45. package/lib/module/MarketComponents/components/TeamTournamentMarket/index.js +189 -0
  46. package/lib/module/MarketComponents/components/TeamTournamentMarket/index.js.map +1 -0
  47. package/lib/module/MarketComponents/components/TournamentMarket/api/index.js +103 -0
  48. package/lib/module/MarketComponents/components/TournamentMarket/api/index.js.map +1 -0
  49. package/lib/module/MarketComponents/components/TournamentMarket/index.js +373 -0
  50. package/lib/module/MarketComponents/components/TournamentMarket/index.js.map +1 -0
  51. package/lib/module/MarketComponents/index.js +3 -1
  52. package/lib/module/MarketComponents/index.js.map +1 -1
  53. package/lib/module/MarketMaker/api/index.js +80 -9
  54. package/lib/module/MarketMaker/api/index.js.map +1 -1
  55. package/lib/module/MarketMaker/components/Contest.js +110 -41
  56. package/lib/module/MarketMaker/components/Contest.js.map +1 -1
  57. package/lib/module/MarketMaker/components/ContestMarkets.js +541 -162
  58. package/lib/module/MarketMaker/components/ContestMarkets.js.map +1 -1
  59. package/lib/module/MarketMaker/components/Dashboard.js +8 -2
  60. package/lib/module/MarketMaker/components/Dashboard.js.map +1 -1
  61. package/lib/module/MarketMaker/components/OrderForm.js +177 -0
  62. package/lib/module/MarketMaker/components/OrderForm.js.map +1 -0
  63. package/lib/module/MarketMaker/components/SetMarketForm.js +221 -77
  64. package/lib/module/MarketMaker/components/SetMarketForm.js.map +1 -1
  65. package/lib/module/MarketMaker/components/WeightProgress.js +17 -8
  66. package/lib/module/MarketMaker/components/WeightProgress.js.map +1 -1
  67. package/lib/module/MarketMaker/index.js +138 -21
  68. package/lib/module/MarketMaker/index.js.map +1 -1
  69. package/lib/module/Socket/index.js +1 -1
  70. package/lib/module/Socket/index.js.map +1 -1
  71. package/lib/typescript/src/Components/Jerseys.d.ts +2 -1
  72. package/lib/typescript/src/Components/Jerseys.d.ts.map +1 -1
  73. package/lib/typescript/src/LocationTracker/LocationStatus.d.ts.map +1 -1
  74. package/lib/typescript/src/MarketComponents/api/index.d.ts +6 -0
  75. package/lib/typescript/src/MarketComponents/api/index.d.ts.map +1 -1
  76. package/lib/typescript/src/MarketComponents/components/AthleteTournamentMarket/index.d.ts.map +1 -1
  77. package/lib/typescript/src/MarketComponents/components/MatchMarket/index.d.ts +33 -0
  78. package/lib/typescript/src/MarketComponents/components/MatchMarket/index.d.ts.map +1 -0
  79. package/lib/typescript/src/MarketComponents/components/TeamTournamentMarket/index.d.ts +29 -0
  80. package/lib/typescript/src/MarketComponents/components/TeamTournamentMarket/index.d.ts.map +1 -0
  81. package/lib/typescript/src/MarketComponents/components/TournamentMarket/api/index.d.ts +13 -0
  82. package/lib/typescript/src/MarketComponents/components/TournamentMarket/api/index.d.ts.map +1 -0
  83. package/lib/typescript/src/MarketComponents/components/TournamentMarket/index.d.ts +27 -0
  84. package/lib/typescript/src/MarketComponents/components/TournamentMarket/index.d.ts.map +1 -0
  85. package/lib/typescript/src/MarketComponents/index.d.ts +22 -0
  86. package/lib/typescript/src/MarketComponents/index.d.ts.map +1 -1
  87. package/lib/typescript/src/MarketMaker/api/index.d.ts +18 -4
  88. package/lib/typescript/src/MarketMaker/api/index.d.ts.map +1 -1
  89. package/lib/typescript/src/MarketMaker/components/Contest.d.ts +5 -2
  90. package/lib/typescript/src/MarketMaker/components/Contest.d.ts.map +1 -1
  91. package/lib/typescript/src/MarketMaker/components/ContestMarkets.d.ts +4 -1
  92. package/lib/typescript/src/MarketMaker/components/ContestMarkets.d.ts.map +1 -1
  93. package/lib/typescript/src/MarketMaker/components/Dashboard.d.ts +4 -2
  94. package/lib/typescript/src/MarketMaker/components/Dashboard.d.ts.map +1 -1
  95. package/lib/typescript/src/MarketMaker/components/OrderForm.d.ts +12 -0
  96. package/lib/typescript/src/MarketMaker/components/OrderForm.d.ts.map +1 -0
  97. package/lib/typescript/src/MarketMaker/components/SetMarketForm.d.ts +1 -1
  98. package/lib/typescript/src/MarketMaker/components/SetMarketForm.d.ts.map +1 -1
  99. package/lib/typescript/src/MarketMaker/components/WeightProgress.d.ts +2 -2
  100. package/lib/typescript/src/MarketMaker/components/WeightProgress.d.ts.map +1 -1
  101. package/lib/typescript/src/MarketMaker/index.d.ts +3 -1
  102. package/lib/typescript/src/MarketMaker/index.d.ts.map +1 -1
  103. package/lib/typescript/src/Socket/index.d.ts.map +1 -1
  104. package/package.json +1 -1
  105. package/src/Components/Jerseys.tsx +9 -4
  106. package/src/LocationTracker/LocationStatus.tsx +1 -0
  107. package/src/MarketComponents/api/index.ts +27 -0
  108. package/src/MarketComponents/components/AthleteTournamentMarket/index.tsx +0 -1
  109. package/src/MarketComponents/components/MatchMarket/index.tsx +149 -0
  110. package/src/MarketComponents/components/TeamTournamentMarket/index.tsx +121 -0
  111. package/src/MarketComponents/components/TournamentMarket/api/index.ts +74 -0
  112. package/src/MarketComponents/components/TournamentMarket/index.tsx +289 -0
  113. package/src/MarketComponents/index.tsx +3 -1
  114. package/src/MarketMaker/api/index.ts +61 -13
  115. package/src/MarketMaker/components/Contest.tsx +79 -29
  116. package/src/MarketMaker/components/ContestMarkets.tsx +400 -98
  117. package/src/MarketMaker/components/Dashboard.tsx +11 -5
  118. package/src/MarketMaker/components/OrderForm.tsx +134 -0
  119. package/src/MarketMaker/components/SetMarketForm.tsx +128 -77
  120. package/src/MarketMaker/components/WeightProgress.tsx +9 -5
  121. package/src/MarketMaker/index.tsx +122 -22
  122. package/src/Socket/index.tsx +5 -2
  123. 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
  }