be-components 5.9.6 → 5.9.8

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 (97) hide show
  1. package/lib/commonjs/GolfScoreboard/index.js +3 -0
  2. package/lib/commonjs/GolfScoreboard/index.js.map +1 -1
  3. package/lib/commonjs/MarketComponents/api/index.js +136 -0
  4. package/lib/commonjs/MarketComponents/api/index.js.map +1 -1
  5. package/lib/commonjs/MarketComponents/components/MarketManager/MarketResolveForm.js +553 -0
  6. package/lib/commonjs/MarketComponents/components/MarketManager/MarketResolveForm.js.map +1 -0
  7. package/lib/commonjs/MarketComponents/components/MarketManager/MarketRollbackForm.js +315 -0
  8. package/lib/commonjs/MarketComponents/components/MarketManager/MarketRollbackForm.js.map +1 -0
  9. package/lib/commonjs/MarketComponents/components/MarketManager/index.js +570 -0
  10. package/lib/commonjs/MarketComponents/components/MarketManager/index.js.map +1 -0
  11. package/lib/commonjs/MarketComponents/index.js +2 -0
  12. package/lib/commonjs/MarketComponents/index.js.map +1 -1
  13. package/lib/commonjs/PostHog/RNPostHog.js +107 -0
  14. package/lib/commonjs/PostHog/RNPostHog.js.map +1 -0
  15. package/lib/commonjs/PostHog/WebPostHog.js +108 -0
  16. package/lib/commonjs/PostHog/WebPostHog.js.map +1 -0
  17. package/lib/commonjs/PostHog/index.js +9 -32
  18. package/lib/commonjs/PostHog/index.js.map +1 -1
  19. package/lib/module/GolfScoreboard/index.js +3 -0
  20. package/lib/module/GolfScoreboard/index.js.map +1 -1
  21. package/lib/module/MarketComponents/api/index.js +136 -0
  22. package/lib/module/MarketComponents/api/index.js.map +1 -1
  23. package/lib/module/MarketComponents/components/MarketManager/MarketResolveForm.js +544 -0
  24. package/lib/module/MarketComponents/components/MarketManager/MarketResolveForm.js.map +1 -0
  25. package/lib/module/MarketComponents/components/MarketManager/MarketRollbackForm.js +307 -0
  26. package/lib/module/MarketComponents/components/MarketManager/MarketRollbackForm.js.map +1 -0
  27. package/lib/module/MarketComponents/components/MarketManager/index.js +561 -0
  28. package/lib/module/MarketComponents/components/MarketManager/index.js.map +1 -0
  29. package/lib/module/MarketComponents/index.js +2 -0
  30. package/lib/module/MarketComponents/index.js.map +1 -1
  31. package/lib/module/PostHog/RNPostHog.js +98 -0
  32. package/lib/module/PostHog/RNPostHog.js.map +1 -0
  33. package/lib/module/PostHog/WebPostHog.js +100 -0
  34. package/lib/module/PostHog/WebPostHog.js.map +1 -0
  35. package/lib/module/PostHog/index.js +9 -30
  36. package/lib/module/PostHog/index.js.map +1 -1
  37. package/lib/typescript/lib/commonjs/GolfScoreboard/index.d.ts.map +1 -1
  38. package/lib/typescript/lib/commonjs/MarketComponents/api/index.d.ts +21 -0
  39. package/lib/typescript/lib/commonjs/MarketComponents/api/index.d.ts.map +1 -1
  40. package/lib/typescript/lib/commonjs/MarketComponents/components/MarketManager/MarketResolveForm.d.ts +14 -0
  41. package/lib/typescript/lib/commonjs/MarketComponents/components/MarketManager/MarketResolveForm.d.ts.map +1 -0
  42. package/lib/typescript/lib/commonjs/MarketComponents/components/MarketManager/MarketRollbackForm.d.ts +15 -0
  43. package/lib/typescript/lib/commonjs/MarketComponents/components/MarketManager/MarketRollbackForm.d.ts.map +1 -0
  44. package/lib/typescript/lib/commonjs/MarketComponents/components/MarketManager/index.d.ts +9 -0
  45. package/lib/typescript/lib/commonjs/MarketComponents/components/MarketManager/index.d.ts.map +1 -0
  46. package/lib/typescript/lib/commonjs/MarketComponents/index.d.ts +1 -0
  47. package/lib/typescript/lib/commonjs/PostHog/RNPostHog.d.ts +22 -0
  48. package/lib/typescript/lib/commonjs/PostHog/RNPostHog.d.ts.map +1 -0
  49. package/lib/typescript/lib/commonjs/PostHog/WebPostHog.d.ts +22 -0
  50. package/lib/typescript/lib/commonjs/PostHog/WebPostHog.d.ts.map +1 -0
  51. package/lib/typescript/lib/commonjs/PostHog/index.d.ts +2 -11
  52. package/lib/typescript/lib/commonjs/PostHog/index.d.ts.map +1 -1
  53. package/lib/typescript/lib/module/GolfScoreboard/index.d.ts.map +1 -1
  54. package/lib/typescript/lib/module/MarketComponents/api/index.d.ts +21 -0
  55. package/lib/typescript/lib/module/MarketComponents/api/index.d.ts.map +1 -1
  56. package/lib/typescript/lib/module/MarketComponents/components/MarketManager/MarketResolveForm.d.ts +14 -0
  57. package/lib/typescript/lib/module/MarketComponents/components/MarketManager/MarketResolveForm.d.ts.map +1 -0
  58. package/lib/typescript/lib/module/MarketComponents/components/MarketManager/MarketRollbackForm.d.ts +15 -0
  59. package/lib/typescript/lib/module/MarketComponents/components/MarketManager/MarketRollbackForm.d.ts.map +1 -0
  60. package/lib/typescript/lib/module/MarketComponents/components/MarketManager/index.d.ts +9 -0
  61. package/lib/typescript/lib/module/MarketComponents/components/MarketManager/index.d.ts.map +1 -0
  62. package/lib/typescript/lib/module/MarketComponents/index.d.ts +2 -0
  63. package/lib/typescript/lib/module/MarketComponents/index.d.ts.map +1 -1
  64. package/lib/typescript/lib/module/PostHog/RNPostHog.d.ts +23 -0
  65. package/lib/typescript/lib/module/PostHog/RNPostHog.d.ts.map +1 -0
  66. package/lib/typescript/lib/module/PostHog/WebPostHog.d.ts +32 -0
  67. package/lib/typescript/lib/module/PostHog/WebPostHog.d.ts.map +1 -0
  68. package/lib/typescript/lib/module/PostHog/index.d.ts +26 -12
  69. package/lib/typescript/lib/module/PostHog/index.d.ts.map +1 -1
  70. package/lib/typescript/src/GolfScoreboard/index.d.ts.map +1 -1
  71. package/lib/typescript/src/MarketComponents/api/index.d.ts +33 -1
  72. package/lib/typescript/src/MarketComponents/api/index.d.ts.map +1 -1
  73. package/lib/typescript/src/MarketComponents/components/MarketManager/MarketResolveForm.d.ts +17 -0
  74. package/lib/typescript/src/MarketComponents/components/MarketManager/MarketResolveForm.d.ts.map +1 -0
  75. package/lib/typescript/src/MarketComponents/components/MarketManager/MarketRollbackForm.d.ts +17 -0
  76. package/lib/typescript/src/MarketComponents/components/MarketManager/MarketRollbackForm.d.ts.map +1 -0
  77. package/lib/typescript/src/MarketComponents/components/MarketManager/index.d.ts +10 -0
  78. package/lib/typescript/src/MarketComponents/components/MarketManager/index.d.ts.map +1 -0
  79. package/lib/typescript/src/MarketComponents/index.d.ts +6 -0
  80. package/lib/typescript/src/MarketComponents/index.d.ts.map +1 -1
  81. package/lib/typescript/src/PostHog/RNPostHog.d.ts +20 -0
  82. package/lib/typescript/src/PostHog/RNPostHog.d.ts.map +1 -0
  83. package/lib/typescript/src/PostHog/WebPostHog.d.ts +31 -0
  84. package/lib/typescript/src/PostHog/WebPostHog.d.ts.map +1 -0
  85. package/lib/typescript/src/PostHog/index.d.ts +2 -10
  86. package/lib/typescript/src/PostHog/index.d.ts.map +1 -1
  87. package/package.json +2 -1
  88. package/src/GolfScoreboard/index.tsx +4 -2
  89. package/src/MarketComponents/api/index.ts +93 -1
  90. package/src/MarketComponents/components/MarketManager/MarketResolveForm.tsx +354 -0
  91. package/src/MarketComponents/components/MarketManager/MarketRollbackForm.tsx +202 -0
  92. package/src/MarketComponents/components/MarketManager/index.tsx +392 -0
  93. package/src/MarketComponents/index.tsx +2 -0
  94. package/src/PostHog/RNPostHog.tsx +101 -0
  95. package/src/PostHog/WebPostHog.tsx +110 -0
  96. package/src/PostHog/index.tsx +9 -42
  97. package/src/types.d.ts +25 -0
@@ -0,0 +1,392 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import { Button, Text, View } from "../../../Components/Themed"
3
+ import type { AthleteProps, EventProps, MarketProps, MarketStatsProps, MatchProps, TeamProps, TournamentProps } from '../../../types';
4
+ import { MarketComponentApi, MarketComponentHelpers } from '../../api';
5
+ import { Alert, FlatList, Platform } from 'react-native';
6
+ import { useColors } from '../../../constants/useColors';
7
+ import { AthleteImage, TeamImage } from '../../../Components/Jerseys';
8
+ import MarketRollbackForm from './MarketRollbackForm';
9
+ import MarketResolveForm from './MarketResolveForm';
10
+
11
+ type MarketManagerProps = {
12
+ player_id?:string,
13
+ contest_type:string,
14
+ contest_id:string,
15
+ onClose:() => void
16
+ }
17
+
18
+ const manage_sections = ['header','total_stats','markets','orders']
19
+
20
+ const MarketManager = ({ player_id, contest_type, contest_id, onClose }:MarketManagerProps) => {
21
+ const Colors = useColors();
22
+ const [ rollback, setRollback ] = useState<{
23
+ visible:boolean,
24
+ market?:MarketProps,
25
+ side_type?:string,
26
+ side_id?:string
27
+ }>({
28
+ visible: false
29
+ });
30
+
31
+ const [ resolve, setResolve ] = useState<{
32
+ visible:boolean,
33
+ market?:MarketProps,
34
+ side_type?:string,
35
+ side_id?:string
36
+ }>({
37
+ visible: false
38
+ });
39
+
40
+ const [ active_market, setActiveMarket ] = useState<MarketProps|undefined>(undefined);
41
+ const [ form_data, setFormData ] = useState<{
42
+ loading: boolean,
43
+ action_loading:boolean,
44
+ markets:MarketProps[],
45
+ market_stats:MarketStatsProps[],
46
+ athletes:AthleteProps[],
47
+ teams:TeamProps[],
48
+ event?:EventProps,
49
+ tournament?:TournamentProps,
50
+ match?:MatchProps,
51
+ }>({
52
+ loading:false,
53
+ action_loading:false,
54
+ athletes: [],
55
+ teams:[],
56
+ markets: [],
57
+ market_stats: []
58
+ });
59
+ const { market_stats, event, tournament, match, markets, athletes, teams } = form_data;
60
+ const { closed, total_volume, commission, routing_prem, reconciliation, total_unresolved } = MarketComponentHelpers.getReconFromMarketStats(market_stats);
61
+ const { contest_title } = MarketComponentHelpers.getContestDetails(contest_type, event, tournament, match);
62
+ const supported_markets = MarketComponentHelpers.sortMarketStats(market_stats, MarketComponentHelpers.getSupportedMarkets(contest_type, markets, event, tournament, match));
63
+
64
+ const selected_market_stats = market_stats.filter(s => s.market_id == active_market?.market_id);
65
+ const selected_stats = MarketComponentHelpers.getReconFromMarketStats(selected_market_stats);
66
+
67
+
68
+ const overall_resolve = selected_stats.total_unresolved > 0 ? true : false
69
+ const overall_rollback = selected_stats.total_paid > 0 ? true : false
70
+ useEffect(() => {
71
+ if(!player_id){ return }
72
+ if(!contest_id){ return }
73
+ getData();
74
+ },[player_id, contest_id]);
75
+
76
+ const getContest = async() => {
77
+ let ev:EventProps | undefined = undefined
78
+ let mtch:MatchProps | undefined = undefined
79
+ let tn:TournamentProps | undefined = undefined
80
+ switch(contest_type){
81
+ case 'team':
82
+ let evs = await MarketComponentApi.getEventsByEventIds([contest_id]);
83
+ ev = evs[0]
84
+ break
85
+ case 'match':
86
+ let mtchs = await MarketComponentApi.getMatchesByMatchIds([contest_id]);
87
+ mtch = mtchs[0]
88
+ if(mtch){
89
+ let mt_tns = await MarketComponentApi.getTournamentsByTournamentIds([contest_id]);
90
+ tn = mt_tns[0]
91
+ }
92
+ break
93
+ case 'tournament':
94
+ let tns = await MarketComponentApi.getTournamentsByTournamentIds([contest_id]);
95
+ tn = tns[0]
96
+ break
97
+ default: break
98
+ }
99
+ return { event:ev, tournament: tn, match: mtch }
100
+ }
101
+
102
+ const getReconColor = (recon:number) => {
103
+ if(!closed){ return Colors.text.warning }
104
+ if(recon < 0){ return Colors.text.error }
105
+ return Colors.text.success
106
+ }
107
+
108
+ const getData = async() => {
109
+ MarketComponentApi.setEnvironment();
110
+ setFormData({ ...form_data, loading:true });
111
+ const me = await MarketComponentApi.getMyDetails();
112
+ if(me?.role != 'admin'){ return Alert.alert('Not authorized to view this!') }
113
+ const mk_stats = await MarketComponentApi.getMarketStatsByEvent(contest_id, contest_type);
114
+ let contest_resp = await getContest();
115
+ const mkets = await MarketComponentApi.getMarkets();
116
+ let team_ids = mk_stats.filter(s => s.side_type == 'team').map(s => s.side_id);
117
+ let athlete_ids = mk_stats.filter(s => s.side_type == 'athlete').map(s => s.side_id);
118
+ let tms = await MarketComponentApi.getTeamsByIds(team_ids);
119
+ let aths = await MarketComponentApi.getAthletesByIds(athlete_ids);
120
+ setFormData({
121
+ ...form_data,
122
+ loading:false,
123
+ markets:mkets,
124
+ teams: tms,
125
+ athletes: aths,
126
+ event: contest_resp.event,
127
+ match: contest_resp.match,
128
+ tournament: contest_resp.tournament,
129
+ market_stats: mk_stats.filter(mk => mk.market_type == 'FOR_MONEY')
130
+ });
131
+ }
132
+
133
+ const handleExpire = async(order_ids:string[]) => {
134
+ if(!active_market){ return }
135
+ if(Platform.OS == 'web'){
136
+ const confirmed = await confirm('Are you sure? This will update the expiration times to now. It may take up to 1 minute for the orders to be closed and refunded')
137
+ if(!confirmed){ return }
138
+ return await MarketComponentApi.expireOpenOrders(contest_id, contest_type, active_market.market_id, order_ids)
139
+ } else {
140
+ Alert.alert('Are you sure?', 'This will update the expiration times to now. It may take up to 1 minute for the orders to be closed and refunded', [
141
+ {
142
+ text: 'Cancel',
143
+ style:'cancel',
144
+ onPress:() => console.log('Done')
145
+ },
146
+ {
147
+ style: 'destructive',
148
+ text: 'Confirm',
149
+ onPress:async() => {
150
+ await MarketComponentApi.expireOpenOrders(contest_id, contest_type, active_market.market_id, order_ids)
151
+ }
152
+ }
153
+ ]);
154
+ return true
155
+ }
156
+
157
+ }
158
+
159
+ const renderMarketStats = (data:{ item:MarketStatsProps, index:number }) => {
160
+ if(data.item.status == 'cancelled' && data.item.called_amt < 0.01){ return <></> }
161
+ if(data.item.buy_sell_ind == 'sell' && data.item.status != 'approved'){ return <></> }
162
+ const athlete = athletes.find(a => a.athlete_id == data.item.side_id);
163
+ const team = teams.find(t => t.team_id == data.item.side_id);
164
+ const mk_agg = MarketComponentHelpers.getReconFromMarketStats([data.item]);
165
+ const market = markets.find(m => m.market_id == data.item.market_id);
166
+ if(!market){ return <></> }
167
+ const rollback_allowed = market.level != 'event' && mk_agg.total_paid > 0 ? true : false
168
+ const resolve_allowed = market.level != 'event' && mk_agg.total_unresolved > 0 ? true : false
169
+ return (
170
+ <View type='row' style={{ borderBottomWidth:1, borderColor:Colors.borders.light, padding:5 }}>
171
+ {data.item.side_type == 'athlete' && athlete ?
172
+ <View>
173
+ <AthleteImage
174
+ athlete={athlete}
175
+ size={32}
176
+ />
177
+ </View>
178
+ :data.item.side_type == 'team' && team ?
179
+ <View>
180
+ <TeamImage
181
+ team={team}
182
+ size={16}
183
+ />
184
+ </View>
185
+ :<></>}
186
+ <View transparent style={{ flex:1, marginLeft:10 }}>
187
+ <Text theme='h2'>{data.item.title}</Text>
188
+ <Text theme='light' size={10} style={{ marginTop:3 }}>{data.item.buy_sell_ind.toUpperCase()}: {data.item.status.toUpperCase()}</Text>
189
+ </View>
190
+ <View style={{ alignItems:'flex-end' }}>
191
+ <Text color={getReconColor(mk_agg.total_unresolved * -1)}>${mk_agg.total_unresolved.toFixed(2)}</Text>
192
+ <Text theme='light' textAlign='right'>Unresolved</Text>
193
+ </View>
194
+ {data.item.open_amt > 0 && data.item.status == 'approved' ?
195
+ <View style={{ alignItems:'flex-end', marginLeft:5, paddingLeft:5, borderLeftWidth:1, borderColor:Colors.borders.light }}>
196
+ <Text theme='description'>${data.item.open_amt.toFixed(2)}</Text>
197
+ <Text theme='light' textAlign='right'>Open</Text>
198
+ </View>
199
+ :<></>}
200
+ <View nativeID='actions' style={{ marginLeft:5, flexDirection:'row' }}>
201
+ {data.item.status == 'approved' ?
202
+ <Button
203
+ style={{ padding:10 }}
204
+ type='error'
205
+ onPress={() => handleExpire(data.item.order_ids)}>
206
+ <Text theme='h1' color={Colors.text.white} size={10}>CLEAR</Text>
207
+ </Button>
208
+ :<></>}
209
+ {resolve_allowed ?
210
+ <Button
211
+ style={{ padding:10, marginLeft:5 }}
212
+ type='success'
213
+ onPress={() => setResolve({ ...resolve, visible: true, side_type: data.item.side_type, side_id: data.item.side_id, market:market })}>
214
+ <Text theme='h1' color={Colors.text.white} size={10}>RESOLVE</Text>
215
+ </Button>
216
+ :<></>}
217
+ {rollback_allowed ?
218
+ <Button
219
+ style={{ padding:10, marginLeft:5 }}
220
+ title_color={Colors.text.white}
221
+ backgroundColor={Colors.text.warning}
222
+ onPress={() => setRollback({ ...rollback, visible:true, side_type: data.item.side_type, side_id:data.item.side_id, market: market })}>
223
+ <Text theme='h1' color={Colors.text.white} size={10}>ROLLBACK</Text>
224
+ </Button>
225
+ :<></>}
226
+ </View>
227
+ </View>
228
+ )
229
+ }
230
+
231
+ const renderSupportedMarkets = (data: { item:MarketProps, index:number }) => {
232
+ let mk_stats = market_stats.filter(s => s.market_id == data.item.market_id);
233
+ let mk_agg = MarketComponentHelpers.getReconFromMarketStats(mk_stats);
234
+ const selected = data.item.market_id == active_market?.market_id ? true : false
235
+
236
+ return (
237
+ <Button float style={{ width:100, padding:0, margin:4, borderColor:selected?Colors.text.success:Colors.borders.light }}
238
+ onPress={() => {
239
+ if(selected){ setActiveMarket(undefined) }
240
+ else { setActiveMarket(data.item) }
241
+ }}>
242
+ <View type='header' style={{ padding:5, borderTopRightRadius:8, borderTopLeftRadius:8 }}>
243
+ <Text theme='light' size={8}>{data.item.type == 'Stat' ? data.item.stat_label : data.item.type}</Text>
244
+ </View>
245
+ <View type='body' transparent style={{ padding:10, flex:1, justifyContent:'flex-end', alignItems:'flex-end' }}>
246
+ <Text theme='h1' color={Colors.text.h1}>{mk_agg.total_volume.toFixed(2)}</Text>
247
+ <Text theme='light' color={Colors.text.h1} size={10}>Volume</Text>
248
+ </View>
249
+ <View type='footer' style={{ padding:5, borderBottomRightRadius:8, borderBottomLeftRadius:8, flexDirection:'row', alignItems:'center' }}>
250
+ <Text theme='light' style={{ flex:1 }}>Rec:</Text>
251
+ <Text theme='h1' color={getReconColor(mk_agg.reconciliation)} size={12} textAlign='right'>${mk_agg.reconciliation.toFixed(2)}</Text>
252
+ </View>
253
+ </Button>
254
+ )
255
+ }
256
+
257
+ const renderSections = (data: { item:string, index:number }) => {
258
+ switch(data.item){
259
+ case 'header':
260
+ return (
261
+ <View type='header' style={{ flexDirection:'row', alignItems:'center', padding:10, borderTopRightRadius:8, borderTopLeftRadius:8 }}>
262
+ <View transparent style={{ flex:1 }}>
263
+ <Text theme='h1'>{contest_title}</Text>
264
+ <Text theme='description' style={{ marginTop:3 }}>Manage Market Data</Text>
265
+ </View>
266
+ <Button
267
+ float
268
+ style={{ padding:10, borderRadius:100 }}
269
+ title='X'
270
+ onPress={() => onClose()}
271
+ />
272
+ </View>
273
+ )
274
+ case 'total_stats':
275
+ return (
276
+ <View type='row' style={{ borderBottomWidth:1, borderColor:Colors.borders.light }}>
277
+ {closed ?
278
+ <View style={{ padding:10, flex:1 }}>
279
+ <Text theme='h1' color={Colors.text.success}>${(commission + routing_prem).toFixed(2)}</Text>
280
+ <Text theme='light' color={Colors.text.success} style={{ marginTop:2 }} size={8}>{commission.toFixed(2)} + {routing_prem.toFixed(2)}</Text>
281
+ <Text theme='description' style={{ marginTop:3 }}>Revenue</Text>
282
+ </View>
283
+ :
284
+ <View style={{ padding:10, flex:1 }}>
285
+ <Text theme='h1' color={Colors.text.warning}>${total_unresolved.toFixed(2)}</Text>
286
+ <Text theme='description' style={{ marginTop:3 }}>Unresolved</Text>
287
+ </View>
288
+ }
289
+ <View style={{ padding:10, flex:1 }}>
290
+ <Text theme='h1' color={Colors.text.h1}>${total_volume.toFixed(2)}</Text>
291
+ <Text theme='description' style={{ marginTop:3 }}>Volume</Text>
292
+ </View>
293
+ <View style={{ padding:10, flex:1 }}>
294
+ <Text theme='h1' color={getReconColor(reconciliation)}>${reconciliation.toFixed(2)}</Text>
295
+ <Text theme='description' style={{ marginTop:3 }}>Recon</Text>
296
+ </View>
297
+
298
+ </View>
299
+ )
300
+ case 'markets':
301
+ return (
302
+ <View transparent style={{ padding:10 }}>
303
+ <FlatList
304
+ data={supported_markets}
305
+ key={`supported_markets`}
306
+ renderItem={renderSupportedMarkets}
307
+ keyExtractor={(item) => item.market_id.toString()}
308
+ horizontal
309
+ />
310
+ </View>
311
+ )
312
+ case 'orders':
313
+ if(!active_market){ return <></> }
314
+ return (
315
+ <FlatList
316
+ data={market_stats.filter(s => s.market_id == active_market.market_id)}
317
+ key={`unresolved_stats_${active_market?.market_id}`}
318
+ renderItem={renderMarketStats}
319
+ keyExtractor={(item) => `${item.market_id}_${item.side_id}_${item.side}_${item.buy_sell_ind}_${item.var_1}_${item.status}`}
320
+ />
321
+ )
322
+ default: return <></>
323
+ }
324
+ }
325
+
326
+ return (
327
+ <View style={{ flex:1 }}>
328
+ <View transparent style={{ flex:1 }}>
329
+ <FlatList
330
+ data={manage_sections}
331
+ key={'manage_sections'}
332
+ keyExtractor={(item) => item}
333
+ renderItem={renderSections}
334
+ />
335
+ </View>
336
+ {active_market ?
337
+ <View type='footer' style={{ flexDirection:'row', alignItems:'center', padding:10 }}>
338
+ {overall_rollback ?
339
+ <Button
340
+ title='Rollback'
341
+ type='error'
342
+ style={{ flex:1, marginRight:3 }}
343
+ onPress={() => setRollback({ ...rollback, visible: true, market:active_market })}
344
+ />
345
+ :<></>}
346
+ {overall_resolve ?
347
+ <Button
348
+ title='Resolve'
349
+ type='success'
350
+ style={{ flex:1, marginLeft:3 }}
351
+ onPress={() => setResolve({ visible: true, market: active_market })}
352
+ />
353
+ :<></>}
354
+ </View>
355
+ :<></>}
356
+ {rollback.visible && rollback.market ?
357
+ <View type='blur' style={{ position:'absolute', top:0, left:0, right:0, bottom:0 }}>
358
+ <MarketRollbackForm
359
+ contest_title={contest_title}
360
+ contest_id={contest_id}
361
+ contest_type={contest_type}
362
+ market={rollback.market}
363
+ market_stats={market_stats}
364
+ side_type={rollback.side_type}
365
+ side_id={rollback.side_id}
366
+ athletes={athletes}
367
+ teams={teams}
368
+ onClose={() => setRollback({ visible: false })}
369
+ />
370
+ </View>
371
+ :<></>}
372
+ {resolve.visible && resolve.market ?
373
+ <View type='blur' style={{ position:'absolute', top:0, left:0, right:0, bottom:0 }}>
374
+ <MarketResolveForm
375
+ contest_title={contest_title}
376
+ contest_id={contest_id}
377
+ contest_type={contest_type}
378
+ market={resolve.market}
379
+ market_stats={market_stats}
380
+ side_type={resolve.side_type}
381
+ side_id={resolve.side_id}
382
+ athletes={athletes}
383
+ teams={teams}
384
+ onClose={() => setResolve({ visible: false })}
385
+ />
386
+ </View>
387
+ :<></>}
388
+ </View>
389
+ )
390
+ }
391
+
392
+ export default MarketManager
@@ -13,6 +13,7 @@ import OrderBookCard from './components/OrderBook';
13
13
  import MyOrderList from './components/MyOrderList';
14
14
  import ExternalPriceComparison from './components/ExternalPriceComparison';
15
15
  import OrderGradeBar from './components/OrderGradeBar';
16
+ import MarketManager from './components/MarketManager';
16
17
 
17
18
  export default {
18
19
  TeamEventMarket,
@@ -21,6 +22,7 @@ export default {
21
22
  BestAvailableOrderCard,
22
23
  EventMarket,
23
24
  OrderBookCard,
25
+ MarketManager,
24
26
  OrderBookChart,
25
27
  AthleteTournamentMarket,
26
28
  TeamEventList,
@@ -0,0 +1,101 @@
1
+ import AsyncStorage from '@react-native-async-storage/async-storage';
2
+ import React from 'react';
3
+ import PostHog, { PostHogProvider, type PostHogOptions, type PostHogProviderProps } from 'posthog-react-native';
4
+ import PostHogReactNativeSessionReplay from 'posthog-react-native-session-replay';
5
+ import type { PostHogEventProperties } from 'posthog-react-native/lib/posthog-core/src';
6
+
7
+ const BEPostHogProvider = (props:PostHogProviderProps) => {
8
+ return (
9
+ <PostHogProvider {...props}>
10
+ {props.children}
11
+ </PostHogProvider>
12
+ )
13
+ }
14
+ let client: PostHog | undefined = undefined
15
+ const generateClient = (api_key?:string, options?:PostHogOptions) => {
16
+ client = new PostHog(api_key??'phc_VOgl6v8COVPyu4AERusWqK8HSD2dDju99qSa70G4nLl', {
17
+ // usually 'https://us.i.posthog.com' or 'https://eu.i.posthog.com'
18
+ host: 'https://us.i.posthog.com',
19
+ customStorage:AsyncStorage,
20
+ persistence: 'memory',
21
+ ...options
22
+ })
23
+ return client
24
+ }
25
+
26
+ const EventActions = {
27
+ identify: async(player_id:string, props?:PostHogEventProperties) => {
28
+ if(!client){ return }
29
+ try {
30
+ await client.identify(player_id, props)
31
+ return true
32
+ } catch (e) {
33
+ console.log(e);
34
+ return false
35
+ }
36
+ },
37
+ captureScreen: async(screen:string, props?: any) => {
38
+ if(!client){ return }
39
+ try {
40
+ await client.screen(screen, props)
41
+ return true
42
+ } catch (e) {
43
+ console.log(e);
44
+ return false
45
+ }
46
+ },
47
+ captureEvent: async(event_name:string, props?:PostHogEventProperties) => {
48
+ if(!client){ return }
49
+ try {
50
+ await client.capture(event_name, props)
51
+ return true
52
+ } catch (e) {
53
+ console.log(e)
54
+ return false
55
+ }
56
+ }
57
+ }
58
+
59
+
60
+ const RecordingActions = {
61
+ startRecording: async() => {
62
+ if(!client){ return }
63
+ try {
64
+ await PostHogReactNativeSessionReplay.startSession(client.getSessionId());
65
+ return true
66
+ } catch (e) {
67
+ console.log(e);
68
+ return false
69
+ }
70
+ },
71
+ stopRecording: async() => {
72
+ try {
73
+ console.log('stopped')
74
+ await PostHogReactNativeSessionReplay.endSession();
75
+ return true
76
+ } catch (e) {
77
+ console.log(e)
78
+ return false
79
+ }
80
+ },
81
+ recordClip: async(seconds:number) => {
82
+ const started = await RecordingActions.startRecording();
83
+ console.log(started);
84
+ if(!started){ return }
85
+ setTimeout(() => {
86
+ RecordingActions.stopRecording()
87
+ }, seconds*1000);
88
+ }
89
+ }
90
+
91
+
92
+
93
+
94
+
95
+ export default {
96
+ source:'react-native',
97
+ BEPostHogProvider,
98
+ generateClient,
99
+ RecordingActions,
100
+ EventActions
101
+ }
@@ -0,0 +1,110 @@
1
+ //import AsyncStorage from '@react-native-async-storage/async-storage';
2
+ import React from 'react';
3
+ import posthog, { PostHog, type PostHogConfig } from 'posthog-js';
4
+ import { PostHogProvider } from 'posthog-js/react';
5
+
6
+ type WithOptionalChildren<T> = T & {
7
+ children?: React.ReactNode | undefined;
8
+ };
9
+ type PostHogProviderProps = {
10
+ client: PostHog;
11
+ apiKey?: never;
12
+ options?: never;
13
+ } | {
14
+ apiKey: string;
15
+ options?: Partial<PostHogConfig>;
16
+ client?: never;
17
+ };
18
+
19
+ const BEPostHogProvider = (props:WithOptionalChildren<PostHogProviderProps>) => {
20
+ return (
21
+ <PostHogProvider { ...props }>
22
+ {props.children}
23
+ </PostHogProvider>
24
+ )
25
+ }
26
+ let client: PostHog | undefined = undefined
27
+
28
+ const generateClient = (api_key?:string, options?:PostHogConfig) => {
29
+ client = posthog.init(api_key??'phc_VOgl6v8COVPyu4AERusWqK8HSD2dDju99qSa70G4nLl', {
30
+ api_host:'https://us.i.posthog.com',
31
+ autocapture: false,
32
+ capture_pageview: false,
33
+ capture_performance: false,
34
+ ...options
35
+ });
36
+ return client
37
+ }
38
+
39
+ const EventActions = {
40
+ identify: async(player_id:string, props?:any) => {
41
+ if(!client){ return }
42
+ try {
43
+ await posthog.identify(player_id, props)
44
+ return true
45
+ } catch (e) {
46
+ console.log(e);
47
+ return false
48
+ }
49
+ },
50
+ captureScreen: async(screen:string, props?: any) => {
51
+ if(!client){ return }
52
+ try {
53
+ await posthog.capture('$screen', { screen, ...props });
54
+ return true
55
+ } catch (e) {
56
+ console.log(e);
57
+ return false
58
+ }
59
+ },
60
+ captureEvent: async(event_name:string, props?:any) => {
61
+ if(!client){ return }
62
+ try {
63
+ await posthog.capture(event_name, props)
64
+ return true
65
+ } catch (e) {
66
+ console.log(e)
67
+ return false
68
+ }
69
+ }
70
+ }
71
+
72
+ const RecordingActions = {
73
+ startRecording: async() => {
74
+ try {
75
+ console.log('STARTING TO RECORD!!!!');
76
+ await posthog.startSessionRecording();
77
+ console.log('DONE!!')
78
+ return true
79
+ } catch (e) {
80
+ console.log(e);
81
+ return false
82
+ }
83
+ },
84
+ stopRecording: async() => {
85
+ try {
86
+ console.log('stopped')
87
+ await posthog.stopSessionRecording();
88
+ return true
89
+ } catch (e) {
90
+ console.log(e)
91
+ return false
92
+ }
93
+ },
94
+ recordClip: async(seconds:number) => {
95
+ const started = await RecordingActions.startRecording();
96
+ console.log(started);
97
+ if(!started){ return }
98
+ setTimeout(() => {
99
+ RecordingActions.stopRecording()
100
+ }, seconds*1000);
101
+ }
102
+ }
103
+
104
+ export default {
105
+ source: 'web',
106
+ BEPostHogProvider,
107
+ generateClient,
108
+ RecordingActions,
109
+ EventActions
110
+ }
@@ -1,44 +1,11 @@
1
- import PostHog, { PostHogProvider, type PostHogOptions } from 'posthog-react-native'
2
- import AsyncStorage from '@react-native-async-storage/async-storage';
3
- import type PostHogReactNativeSessionReplay from 'posthog-react-native-session-replay';
4
- import { Platform } from 'react-native';
1
+ import { Platform } from "react-native";
2
+ import RNPostHog from "./RNPostHog";
3
+ import WebPostHog from "./WebPostHog";
5
4
 
6
- let ph_client:PostHog | undefined = undefined
5
+ let BEPostHog = Platform.select({
6
+ ios: RNPostHog,
7
+ android: RNPostHog,
8
+ web: WebPostHog as any
9
+ })
7
10
 
8
- export let OptionalReactNativeSessionReplay:
9
- | typeof PostHogReactNativeSessionReplay
10
- | undefined;
11
-
12
- try {
13
- OptionalReactNativeSessionReplay = Platform.select({
14
- macos: undefined,
15
- web: require('posthog-js'),
16
- default: require('posthog-react-native-session-replay'), // Only Android and iOS
17
- });
18
- } catch (e) {
19
- // do nothing
20
- console.warn(
21
- 'PostHog Debug',
22
- `Error loading posthog-react-native-session-replay: ${e}`
23
- );
24
- }
25
-
26
-
27
-
28
- const generatePostHogClient = (api_key:string, options?: PostHogOptions) => {
29
- ph_client = new PostHog(api_key, {
30
- ...options,
31
- host: 'https://us.i.posthog.com',
32
- customStorage:AsyncStorage,
33
- persistence: 'memory'
34
- });
35
- return ph_client
36
- }
37
-
38
-
39
- export default {
40
- generatePostHogClient,
41
- BEPostHogProvider:PostHogProvider,
42
- ph_client,
43
- OptionalReactNativeSessionReplay
44
- }
11
+ export default BEPostHog