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.
Files changed (128) hide show
  1. package/lib/commonjs/Checkout/index.js +8 -6
  2. package/lib/commonjs/Checkout/index.js.map +1 -1
  3. package/lib/commonjs/CompetitionManager/components/AthleteSelector.js +50 -1
  4. package/lib/commonjs/CompetitionManager/components/AthleteSelector.js.map +1 -1
  5. package/lib/commonjs/Components/Icons.js +90 -0
  6. package/lib/commonjs/Components/Icons.js.map +1 -1
  7. package/lib/commonjs/Engage/components/BracketCompetitionCard.js +3 -1
  8. package/lib/commonjs/Engage/components/BracketCompetitionCard.js.map +1 -1
  9. package/lib/commonjs/Engage/components/CompetitionCard.js +3 -1
  10. package/lib/commonjs/Engage/components/CompetitionCard.js.map +1 -1
  11. package/lib/commonjs/Engage/components/SquaresCompetitionCard.js +3 -1
  12. package/lib/commonjs/Engage/components/SquaresCompetitionCard.js.map +1 -1
  13. package/lib/commonjs/LocationTracker/LocationStatus.js +39 -2
  14. package/lib/commonjs/LocationTracker/LocationStatus.js.map +1 -1
  15. package/lib/commonjs/LocationTracker/api/index.js +55 -1
  16. package/lib/commonjs/LocationTracker/api/index.js.map +1 -1
  17. package/lib/commonjs/MarketComponents/api/index.js +213 -0
  18. package/lib/commonjs/MarketComponents/api/index.js.map +1 -0
  19. package/lib/commonjs/MarketComponents/components/AthleteMarket/index.js +179 -0
  20. package/lib/commonjs/MarketComponents/components/AthleteMarket/index.js.map +1 -0
  21. package/lib/commonjs/MarketComponents/components/EventMarket/index.js +205 -0
  22. package/lib/commonjs/MarketComponents/components/EventMarket/index.js.map +1 -0
  23. package/lib/commonjs/MarketComponents/components/MarketButton/api/index.js +179 -0
  24. package/lib/commonjs/MarketComponents/components/MarketButton/api/index.js.map +1 -0
  25. package/lib/commonjs/MarketComponents/components/MarketButton/index.js +58 -0
  26. package/lib/commonjs/MarketComponents/components/MarketButton/index.js.map +1 -0
  27. package/lib/commonjs/MarketComponents/components/TeamEventMarket/api/index.js +48 -0
  28. package/lib/commonjs/MarketComponents/components/TeamEventMarket/api/index.js.map +1 -0
  29. package/lib/commonjs/MarketComponents/components/TeamEventMarket/index.js +479 -0
  30. package/lib/commonjs/MarketComponents/components/TeamEventMarket/index.js.map +1 -0
  31. package/lib/commonjs/MarketComponents/index.js +12 -0
  32. package/lib/commonjs/MarketComponents/index.js.map +1 -0
  33. package/lib/commonjs/index.js +7 -0
  34. package/lib/commonjs/index.js.map +1 -1
  35. package/lib/module/Checkout/index.js +8 -6
  36. package/lib/module/Checkout/index.js.map +1 -1
  37. package/lib/module/CompetitionManager/components/AthleteSelector.js +50 -1
  38. package/lib/module/CompetitionManager/components/AthleteSelector.js.map +1 -1
  39. package/lib/module/Components/Icons.js +90 -0
  40. package/lib/module/Components/Icons.js.map +1 -1
  41. package/lib/module/Engage/components/BracketCompetitionCard.js +3 -1
  42. package/lib/module/Engage/components/BracketCompetitionCard.js.map +1 -1
  43. package/lib/module/Engage/components/CompetitionCard.js +3 -1
  44. package/lib/module/Engage/components/CompetitionCard.js.map +1 -1
  45. package/lib/module/Engage/components/SquaresCompetitionCard.js +3 -1
  46. package/lib/module/Engage/components/SquaresCompetitionCard.js.map +1 -1
  47. package/lib/module/LocationTracker/LocationStatus.js +39 -2
  48. package/lib/module/LocationTracker/LocationStatus.js.map +1 -1
  49. package/lib/module/LocationTracker/api/index.js +55 -1
  50. package/lib/module/LocationTracker/api/index.js.map +1 -1
  51. package/lib/module/MarketComponents/api/index.js +207 -0
  52. package/lib/module/MarketComponents/api/index.js.map +1 -0
  53. package/lib/module/MarketComponents/components/AthleteMarket/index.js +172 -0
  54. package/lib/module/MarketComponents/components/AthleteMarket/index.js.map +1 -0
  55. package/lib/module/MarketComponents/components/EventMarket/index.js +198 -0
  56. package/lib/module/MarketComponents/components/EventMarket/index.js.map +1 -0
  57. package/lib/module/MarketComponents/components/MarketButton/api/index.js +172 -0
  58. package/lib/module/MarketComponents/components/MarketButton/api/index.js.map +1 -0
  59. package/lib/module/MarketComponents/components/MarketButton/index.js +51 -0
  60. package/lib/module/MarketComponents/components/MarketButton/index.js.map +1 -0
  61. package/lib/module/MarketComponents/components/TeamEventMarket/api/index.js +42 -0
  62. package/lib/module/MarketComponents/components/TeamEventMarket/api/index.js.map +1 -0
  63. package/lib/module/MarketComponents/components/TeamEventMarket/index.js +470 -0
  64. package/lib/module/MarketComponents/components/TeamEventMarket/index.js.map +1 -0
  65. package/lib/module/MarketComponents/index.js +5 -0
  66. package/lib/module/MarketComponents/index.js.map +1 -0
  67. package/lib/module/index.js +2 -1
  68. package/lib/module/index.js.map +1 -1
  69. package/lib/typescript/src/Checkout/index.d.ts.map +1 -1
  70. package/lib/typescript/src/CompetitionManager/components/AthleteSelector.d.ts.map +1 -1
  71. package/lib/typescript/src/Components/Icons.d.ts +3 -0
  72. package/lib/typescript/src/Components/Icons.d.ts.map +1 -1
  73. package/lib/typescript/src/Engage/components/BracketCompetitionCard.d.ts.map +1 -1
  74. package/lib/typescript/src/LocationTracker/LocationStatus.d.ts +7 -1
  75. package/lib/typescript/src/LocationTracker/LocationStatus.d.ts.map +1 -1
  76. package/lib/typescript/src/LocationTracker/api/index.d.ts +12 -1
  77. package/lib/typescript/src/LocationTracker/api/index.d.ts.map +1 -1
  78. package/lib/typescript/src/MarketComponents/api/index.d.ts +22 -0
  79. package/lib/typescript/src/MarketComponents/api/index.d.ts.map +1 -0
  80. package/lib/typescript/src/MarketComponents/components/AthleteMarket/index.d.ts +25 -0
  81. package/lib/typescript/src/MarketComponents/components/AthleteMarket/index.d.ts.map +1 -0
  82. package/lib/typescript/src/MarketComponents/components/EventMarket/index.d.ts +21 -0
  83. package/lib/typescript/src/MarketComponents/components/EventMarket/index.d.ts.map +1 -0
  84. package/lib/typescript/src/MarketComponents/components/MarketButton/api/index.d.ts +15 -0
  85. package/lib/typescript/src/MarketComponents/components/MarketButton/api/index.d.ts.map +1 -0
  86. package/lib/typescript/src/MarketComponents/components/MarketButton/index.d.ts +12 -0
  87. package/lib/typescript/src/MarketComponents/components/MarketButton/index.d.ts.map +1 -0
  88. package/lib/typescript/src/MarketComponents/components/TeamEventMarket/api/index.d.ts +10 -0
  89. package/lib/typescript/src/MarketComponents/components/TeamEventMarket/api/index.d.ts.map +1 -0
  90. package/lib/typescript/src/MarketComponents/components/TeamEventMarket/index.d.ts +25 -0
  91. package/lib/typescript/src/MarketComponents/components/TeamEventMarket/index.d.ts.map +1 -0
  92. package/lib/typescript/src/MarketComponents/index.d.ts +25 -0
  93. package/lib/typescript/src/MarketComponents/index.d.ts.map +1 -0
  94. package/lib/typescript/src/index.d.ts +2 -1
  95. package/lib/typescript/src/index.d.ts.map +1 -1
  96. package/package.json +1 -1
  97. package/src/Checkout/index.tsx +2 -1
  98. package/src/CompetitionManager/components/AthleteSelector.tsx +36 -0
  99. package/src/Components/Icons.tsx +50 -0
  100. package/src/Engage/components/BracketCompetitionCard.tsx +2 -2
  101. package/src/Engage/components/CompetitionCard.tsx +1 -1
  102. package/src/Engage/components/SquaresCompetitionCard.tsx +1 -1
  103. package/src/LocationTracker/LocationStatus.tsx +34 -3
  104. package/src/LocationTracker/api/index.tsx +39 -3
  105. package/src/MarketComponents/api/index.ts +143 -0
  106. package/src/MarketComponents/components/AthleteMarket/index.tsx +109 -0
  107. package/src/MarketComponents/components/EventMarket/index.tsx +115 -0
  108. package/src/MarketComponents/components/MarketButton/api/index.ts +152 -0
  109. package/src/MarketComponents/components/MarketButton/index.tsx +37 -0
  110. package/src/MarketComponents/components/TeamEventMarket/api/index.ts +35 -0
  111. package/src/MarketComponents/components/TeamEventMarket/index.tsx +295 -0
  112. package/src/MarketComponents/index.tsx +5 -0
  113. package/src/index.tsx +2 -0
  114. package/src/types.d.ts +88 -2
  115. package/lib/commonjs/Markets/api/index.js +0 -28
  116. package/lib/commonjs/Markets/api/index.js.map +0 -1
  117. package/lib/commonjs/Markets/components/MarketButton.js +0 -25
  118. package/lib/commonjs/Markets/components/MarketButton.js.map +0 -1
  119. package/lib/module/Markets/api/index.js +0 -23
  120. package/lib/module/Markets/api/index.js.map +0 -1
  121. package/lib/module/Markets/components/MarketButton.js +0 -18
  122. package/lib/module/Markets/components/MarketButton.js.map +0 -1
  123. package/lib/typescript/src/Markets/api/index.d.ts +0 -7
  124. package/lib/typescript/src/Markets/api/index.d.ts.map +0 -1
  125. package/lib/typescript/src/Markets/components/MarketButton.d.ts +0 -11
  126. package/lib/typescript/src/Markets/components/MarketButton.d.ts.map +0 -1
  127. package/src/Markets/api/index.ts +0 -18
  128. 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
+ }