be-components 6.3.1 → 6.3.3

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 (86) hide show
  1. package/lib/commonjs/Campaign/api/index.js +13 -0
  2. package/lib/commonjs/Campaign/api/index.js.map +1 -1
  3. package/lib/commonjs/Campaign/components/GolferAlert.js +135 -0
  4. package/lib/commonjs/Campaign/components/GolferAlert.js.map +1 -0
  5. package/lib/commonjs/Campaign/index.js +798 -2
  6. package/lib/commonjs/Campaign/index.js.map +1 -1
  7. package/lib/commonjs/Components/Jerseys.js +0 -1
  8. package/lib/commonjs/Components/Jerseys.js.map +1 -1
  9. package/lib/commonjs/FlashMarket/FlashHolder.js +12 -3
  10. package/lib/commonjs/FlashMarket/FlashHolder.js.map +1 -1
  11. package/lib/commonjs/FlashMarket/index.js +4 -2
  12. package/lib/commonjs/FlashMarket/index.js.map +1 -1
  13. package/lib/commonjs/Poll/api/index.js +10 -0
  14. package/lib/commonjs/Poll/api/index.js.map +1 -1
  15. package/lib/commonjs/Poll/index.js +4 -0
  16. package/lib/commonjs/Poll/index.js.map +1 -1
  17. package/lib/module/Campaign/api/index.js +13 -0
  18. package/lib/module/Campaign/api/index.js.map +1 -1
  19. package/lib/module/Campaign/components/GolferAlert.js +128 -0
  20. package/lib/module/Campaign/components/GolferAlert.js.map +1 -0
  21. package/lib/module/Campaign/index.js +800 -4
  22. package/lib/module/Campaign/index.js.map +1 -1
  23. package/lib/module/Components/Jerseys.js +0 -1
  24. package/lib/module/Components/Jerseys.js.map +1 -1
  25. package/lib/module/FlashMarket/FlashHolder.js +12 -3
  26. package/lib/module/FlashMarket/FlashHolder.js.map +1 -1
  27. package/lib/module/FlashMarket/index.js +4 -2
  28. package/lib/module/FlashMarket/index.js.map +1 -1
  29. package/lib/module/Poll/api/index.js +10 -0
  30. package/lib/module/Poll/api/index.js.map +1 -1
  31. package/lib/module/Poll/index.js +4 -0
  32. package/lib/module/Poll/index.js.map +1 -1
  33. package/lib/typescript/lib/commonjs/Campaign/api/index.d.ts +1 -0
  34. package/lib/typescript/lib/commonjs/Campaign/api/index.d.ts.map +1 -1
  35. package/lib/typescript/lib/commonjs/Campaign/components/GolferAlert.d.ts +10 -0
  36. package/lib/typescript/lib/commonjs/Campaign/components/GolferAlert.d.ts.map +1 -0
  37. package/lib/typescript/lib/commonjs/Campaign/index.d.ts +2 -1
  38. package/lib/typescript/lib/commonjs/Campaign/index.d.ts.map +1 -1
  39. package/lib/typescript/lib/commonjs/Components/Jerseys.d.ts.map +1 -1
  40. package/lib/typescript/lib/commonjs/FlashMarket/FlashHolder.d.ts +5 -1
  41. package/lib/typescript/lib/commonjs/FlashMarket/FlashHolder.d.ts.map +1 -1
  42. package/lib/typescript/lib/commonjs/FlashMarket/index.d.ts +3 -1
  43. package/lib/typescript/lib/commonjs/FlashMarket/index.d.ts.map +1 -1
  44. package/lib/typescript/lib/commonjs/Poll/api/index.d.ts +1 -0
  45. package/lib/typescript/lib/commonjs/Poll/api/index.d.ts.map +1 -1
  46. package/lib/typescript/lib/commonjs/Poll/index.d.ts +2 -1
  47. package/lib/typescript/lib/commonjs/Poll/index.d.ts.map +1 -1
  48. package/lib/typescript/lib/module/Campaign/api/index.d.ts +1 -0
  49. package/lib/typescript/lib/module/Campaign/api/index.d.ts.map +1 -1
  50. package/lib/typescript/lib/module/Campaign/components/GolferAlert.d.ts +10 -0
  51. package/lib/typescript/lib/module/Campaign/components/GolferAlert.d.ts.map +1 -0
  52. package/lib/typescript/lib/module/Campaign/index.d.ts +2 -1
  53. package/lib/typescript/lib/module/Campaign/index.d.ts.map +1 -1
  54. package/lib/typescript/lib/module/Components/Jerseys.d.ts.map +1 -1
  55. package/lib/typescript/lib/module/FlashMarket/FlashHolder.d.ts +5 -1
  56. package/lib/typescript/lib/module/FlashMarket/FlashHolder.d.ts.map +1 -1
  57. package/lib/typescript/lib/module/FlashMarket/index.d.ts +3 -1
  58. package/lib/typescript/lib/module/FlashMarket/index.d.ts.map +1 -1
  59. package/lib/typescript/lib/module/Poll/api/index.d.ts +1 -0
  60. package/lib/typescript/lib/module/Poll/api/index.d.ts.map +1 -1
  61. package/lib/typescript/lib/module/Poll/index.d.ts +2 -1
  62. package/lib/typescript/lib/module/Poll/index.d.ts.map +1 -1
  63. package/lib/typescript/src/Campaign/api/index.d.ts +2 -1
  64. package/lib/typescript/src/Campaign/api/index.d.ts.map +1 -1
  65. package/lib/typescript/src/Campaign/components/GolferAlert.d.ts +12 -0
  66. package/lib/typescript/src/Campaign/components/GolferAlert.d.ts.map +1 -0
  67. package/lib/typescript/src/Campaign/index.d.ts +2 -1
  68. package/lib/typescript/src/Campaign/index.d.ts.map +1 -1
  69. package/lib/typescript/src/FlashMarket/FlashHolder.d.ts +5 -1
  70. package/lib/typescript/src/FlashMarket/FlashHolder.d.ts.map +1 -1
  71. package/lib/typescript/src/FlashMarket/index.d.ts +3 -1
  72. package/lib/typescript/src/FlashMarket/index.d.ts.map +1 -1
  73. package/lib/typescript/src/Poll/api/index.d.ts +1 -0
  74. package/lib/typescript/src/Poll/api/index.d.ts.map +1 -1
  75. package/lib/typescript/src/Poll/index.d.ts +2 -1
  76. package/lib/typescript/src/Poll/index.d.ts.map +1 -1
  77. package/package.json +1 -1
  78. package/src/Campaign/api/index.ts +10 -1
  79. package/src/Campaign/components/GolferAlert.tsx +74 -0
  80. package/src/Campaign/index.tsx +425 -9
  81. package/src/Components/Jerseys.tsx +1 -1
  82. package/src/FlashMarket/FlashHolder.tsx +10 -4
  83. package/src/FlashMarket/index.tsx +5 -3
  84. package/src/Poll/api/index.ts +8 -0
  85. package/src/Poll/index.tsx +5 -1
  86. package/src/types.d.ts +1 -1
@@ -1,7 +1,7 @@
1
1
  import React, { useEffect, useState } from 'react';
2
- import { FlatList, Image, useWindowDimensions } from "react-native"
2
+ import { FlatList, Image, ImageBackground, useWindowDimensions } from "react-native"
3
3
  import { Button, Text, View } from '../Components/Themed';
4
- import type { AthleteProps, CampaignParticipantProps, CampaignProps, CompetitionProps, EventProps, LeagueProps, MarketProps, MatchProps, OrderAnalyticsProps, OrderProps, PollCampaignProps, PublicPlayerProps, TeamProps, TournamentProps } from '../types';
4
+ import type { AthleteProps, CampaignParticipantProps, CampaignProps, CompanyProps, CompetitionProps, EventProps, LeagueProps, MarketProps, MatchProps, OrderAnalyticsProps, OrderProps, PollCampaignProps, PollOptionProps, PollProps, PublicPlayerProps, TeamProps, TournamentProps } from '../types';
5
5
  import { CampaignApi, CampaignHelpers } from '../Campaign/api';
6
6
  import { MarketComponentApi } from '../MarketComponents/api';
7
7
  import { useColors } from '../constants/useColors';
@@ -15,12 +15,16 @@ import CampaignAnalytics from './components/CampaignAnalytics';
15
15
  import SocketManager from '../Socket';
16
16
  import NewPlayerAlert from './components/NewPlayerAlert';
17
17
  import ActionList from './components/ActionList';
18
- import { Icons, Toggle } from '../Components';
18
+ import { AutoScrollingFlatList, Icons, Toggle } from '../Components';
19
+ import { PollApi, PollCampaignApi, PollOptionApi } from '../Poll/api';
20
+ import FlashHolder from '../FlashMarket/FlashHolder';
21
+ import GolferAlert from './components/GolferAlert';
19
22
 
20
23
  type CampaignAppProps = {
21
24
  player_id?:string,
22
25
  campaign_id:string,
23
26
  distinct_id:string,
27
+ mode?:'golf',
24
28
  color_mode?:'light'|'dark',
25
29
  onCreateOrder?:(order:OrderProps) => void,
26
30
  action_loading?:boolean,
@@ -37,9 +41,11 @@ type CampaignAppProps = {
37
41
 
38
42
  const HEADER_HEIGHT = 75
39
43
  const sections = ['header', 'prize', 'participants', 'toggle', 'desktop_data', 'mobile_ticker', 'mobile_player', 'mobile_leaderboard', 'engagements']
40
- const Campaign = ({ player_id, campaign_id, insets, color_mode, distinct_id, onSelectCompetition, onSelectPollCampaign, onCreateOrder, onViewProfile, onCheckedIn, onCheckedOut, onBetNow }:CampaignAppProps) => {
44
+ //const golf_sections = ['header', 'closest_pin', 'sponsors']
45
+ const Campaign = ({ player_id, campaign_id, insets, color_mode, mode, distinct_id, onSelectCompetition, onSelectPollCampaign, onCreateOrder, onViewProfile, onCheckedIn, onCheckedOut, onBetNow }:CampaignAppProps) => {
41
46
  const Colors = useColors();
42
47
  const [ needs_reload, setNeedsReload ] = useState(false);
48
+ const [ golf_leader_size, setGolfLeaderSize ] = useState({ height:0, width:0 })
43
49
  const [ new_player_alert, setNewPlayerAlert ] = useState<CampaignParticipantProps|undefined>(undefined);
44
50
  const [ new_bet_alert, setNewBetAlert ] = useState<OrderProps | undefined>(undefined);
45
51
  //const [ refresh, setRefresh ] = useState(0);
@@ -68,12 +74,15 @@ const Campaign = ({ player_id, campaign_id, insets, color_mode, distinct_id, onS
68
74
  action_page:number,
69
75
  campaign_participants:CampaignParticipantProps[],
70
76
  teams:TeamProps[],
77
+ sponsors:CompanyProps[],
71
78
  athletes:AthleteProps[],
72
79
  leagues:LeagueProps[],
73
80
  tournaments:TournamentProps[],
74
81
  matches:MatchProps[],
75
82
  markets:MarketProps[],
76
83
  poll_campaigns:PollCampaignProps[],
84
+ flash_markets:PollProps[],
85
+ flash_options:PollOptionProps[],
77
86
  competitions:CompetitionProps[],
78
87
  orders:OrderProps[],
79
88
  events:EventProps[],
@@ -85,6 +94,9 @@ const Campaign = ({ player_id, campaign_id, insets, color_mode, distinct_id, onS
85
94
  leagues:[],
86
95
  tournaments:[],
87
96
  poll_campaigns: [],
97
+ flash_options: [],
98
+ flash_markets:[],
99
+ sponsors: [],
88
100
  competitions: [],
89
101
  matches:[],
90
102
  athletes:[],
@@ -95,7 +107,7 @@ const Campaign = ({ player_id, campaign_id, insets, color_mode, distinct_id, onS
95
107
  players:[],
96
108
  teams:[]
97
109
  });
98
- const { orders, events, tournaments, athletes, competitions, poll_campaigns, campaign, participant_page, action_page, leagues, campaign_participants, players, teams, } = embed_state;
110
+ const { orders, events, tournaments, flash_options, sponsors, athletes, competitions, flash_markets, poll_campaigns, campaign, participant_page, action_page, leagues, campaign_participants, players, teams, } = embed_state;
99
111
  //const visible_orders = orders.sort((a,b) => moment(b.create_datetime).unix() - moment(a.create_datetime).unix()).slice((action_page-1) * 5, ((action_page-1) * 5) + 5)
100
112
  useEffect(() => {
101
113
  if(!campaign_id){ return }
@@ -142,7 +154,16 @@ const Campaign = ({ player_id, campaign_id, insets, color_mode, distinct_id, onS
142
154
  plsers = plsers.concat(await CampaignApi.getPlayersByPlayerIds(needed_player_ids));
143
155
  //Set new bettor!!
144
156
  let new_player = cps.filter(cp => cp.status == 'active')[0]
145
- if(new_player && new_player.player_id != player_id){ setNewPlayerAlert(new_player) }
157
+ if(mode != 'golf' && new_player && new_player.player_id != player_id){ setNewPlayerAlert(new_player) }
158
+
159
+ if(mode == 'golf'){
160
+ //Old player
161
+ let exist = campaign_participants.find(cp => cp.campaign_participant_id == socket_participants[0]?.campaign_participant_id);
162
+ if(exist?.payload?.status == 'active' && campaign_participants[0]?.payload.status == 'closed'){
163
+ setNewPlayerAlert(new_player);
164
+ }
165
+ }
166
+
146
167
  //Ok! Now lets update the participants
147
168
  setEmbedState({
148
169
  ...embed_state,
@@ -197,7 +218,19 @@ const Campaign = ({ player_id, campaign_id, insets, color_mode, distinct_id, onS
197
218
  if(next_participant_page > participant_pages){ next_participant_page = 1 }
198
219
  let comps:CompetitionProps[] = []
199
220
  let pcs: PollCampaignProps[] = []
200
- if(c_resp.campaign && c_resp.campaign.poll_campaign_ids){ pcs = await CampaignApi.getPollCampaignsByIds(c_resp.campaign.poll_campaign_ids) }
221
+ let fls: PollProps[] = []
222
+ let opts: PollOptionProps[] = []
223
+ if(c_resp.campaign && c_resp.campaign.poll_campaign_ids){
224
+ pcs = await CampaignApi.getPollCampaignsByIds(c_resp.campaign.poll_campaign_ids)
225
+ let campaign_id = pcs[0]?.poll_campaign_id
226
+ if(campaign_id){
227
+ PollCampaignApi.setEnvironment();
228
+ let flash_resp = await PollApi.getPollsByCampaignId(campaign_id);
229
+ fls = flash_resp.polls
230
+ let poll_ids = [ ...new Set(fls.map(p => p.poll_id)) ]
231
+ opts = await PollOptionApi.getPollOptionsByPollIds(poll_ids);
232
+ }
233
+ }
201
234
  if(c_resp.campaign && c_resp.campaign.competition_ids){ comps = await CampaignApi.getCompetitionsByIds(c_resp.campaign.competition_ids) }
202
235
 
203
236
  let next_action_page = action_page + 1
@@ -219,13 +252,16 @@ const Campaign = ({ player_id, campaign_id, insets, color_mode, distinct_id, onS
219
252
  const tms = await MarketComponentApi.getTeamsByIds(tm_ids);
220
253
  const aths = await MarketComponentApi.getAthletesByIds(aths_ids);
221
254
  const lgs = await MarketComponentApi.getLeagues();
222
-
255
+ const spnsrs = await CampaignApi.getCompaniesByIds(c_resp.campaign?.sponsors ?? [])
223
256
  setEmbedState({
224
257
  ...embed_state,
225
258
  players:pls,
226
259
  campaign: c_resp.campaign,
227
260
  campaign_participants: c_resp.campaign_participants,
228
261
  teams: tms,
262
+ sponsors: spnsrs,
263
+ flash_markets: fls,
264
+ flash_options: opts,
229
265
  leagues: lgs,
230
266
  competitions:comps,
231
267
  poll_campaigns: pcs,
@@ -311,6 +347,33 @@ const Campaign = ({ player_id, campaign_id, insets, color_mode, distinct_id, onS
311
347
  )
312
348
  }
313
349
 
350
+ const renderGolfers = (data:{ item:CampaignParticipantProps, index:number }) => {
351
+ const player = players.find(p => p.player_id == data.item.player_id);
352
+ if(!player){ return <></> }
353
+ return (
354
+ <View type='row' style={{ padding:10, borderBottomWidth:1, borderColor:Colors.borders.light }}>
355
+ {data.item.payload.status == 'active' ?
356
+ <Icons.GolferIcon size={16} color={Colors.text.h1} />
357
+ : data.item.payload.status == 'pending' ?
358
+ <Icons.InProgressIcon size={16} color={Colors.text.h1} />
359
+ :
360
+ <Icons.LockClosedIcon size={16} color={Colors.text.h1} />
361
+ }
362
+ <View style={{ flex:1, flexDirection:'row', marginLeft:15 }}>
363
+ <Image
364
+ source={{ uri: player.profile_pic && player.profile_pic != '' ? player.profile_pic : 'https://res.cloudinary.com/hoabts6mc/image/upload/v1722453927/default_man_n96ofq.webp' }}
365
+ style={{ height:35, width:35, borderRadius:100}}
366
+ />
367
+ <View style={{ flex:1, marginLeft:10 }}>
368
+ <Text theme='h1'>{player.first_name} {player.last_name}</Text>
369
+ <Text theme='description' style={{ marginTop:3 }}>@{player.username}</Text>
370
+ </View>
371
+ </View>
372
+ <Text theme='h1'>{data.item.payload.pin_distance}</Text>
373
+ </View>
374
+ )
375
+ }
376
+
314
377
  const renderEngagements = (data:{ item:{ id:string, type:string, scheduled_datetime:Moment }, index:number }) => {
315
378
 
316
379
  switch(data.item.type){
@@ -360,6 +423,79 @@ const Campaign = ({ player_id, campaign_id, insets, color_mode, distinct_id, onS
360
423
  }
361
424
  }
362
425
 
426
+ const renderUpcomingGolfers = (data: { item:PollProps, index:number }) => {
427
+ const options = flash_options.filter(o => o.poll_id == data.item.poll_id);
428
+ return (
429
+ <View transparent style={{ flexDirection:'row', borderBottomWidth:1, borderColor:Colors.borders.light, borderBottomLeftRadius: 8 }}>
430
+ <View type='header' style={{ padding:20, justifyContent:'center', alignItems:'center', borderRightWidth:1, borderColor:Colors.borders.light }}>
431
+ <Text theme='description' style={{ marginBottom:4 }}>Group</Text>
432
+ <Text theme='h1'>{data.item.priority}</Text>
433
+ </View>
434
+ {options.sort((a,b) => a.priority - b.priority).map(o => {
435
+ return (
436
+ <View transparent style={{ flex:1, justifyContent:'center', alignItems:'center', padding:10, borderRightWidth:1, borderColor:Colors.borders.light }}>
437
+ <Image
438
+ source={{ uri: 'https://res.cloudinary.com/hoabts6mc/image/upload/v1722453927/default_man_n96ofq.webp' }}
439
+ style={{ height:40, width:40 }}
440
+ resizeMode='cover'
441
+ />
442
+ <Text theme='h2' style={{ marginTop:4 }} textAlign='center'>{o.option_name}</Text>
443
+ </View>
444
+ )
445
+ })}
446
+ </View>
447
+ )
448
+ }
449
+
450
+ const renderClosedGolfers = (data: { item:PollProps, index:number }) => {
451
+ const options = flash_options.filter(o => o.poll_id == data.item.poll_id);
452
+ return (
453
+ <View transparent style={{ flexDirection:'row', borderBottomWidth:1, borderColor:Colors.borders.light, borderBottomLeftRadius: 8 }}>
454
+ <View type='header' style={{ padding:20, justifyContent:'center', alignItems:'center', borderRightWidth:1, borderColor:Colors.borders.light }}>
455
+ <Text theme='description' style={{ marginBottom:4 }}>Group</Text>
456
+ <Text theme='h1'>{data.item.priority}</Text>
457
+ </View>
458
+ {options.sort((a,b) => a.priority - b.priority).map(o => {
459
+ return (
460
+ <View transparent style={{ flex:1, justifyContent:'center', alignItems:'center', padding:10, borderWidth:1, borderColor:o.result_ind=='win' ? Colors.text.success : Colors.borders.light }}>
461
+ <Image
462
+ source={{ uri: 'https://res.cloudinary.com/hoabts6mc/image/upload/v1722453927/default_man_n96ofq.webp' }}
463
+ style={{ height:50, width:50 }}
464
+ resizeMode='cover'
465
+ />
466
+ <Text theme='h2' style={{ marginTop:4 }} textAlign='center'>{o.option_name}</Text>
467
+
468
+ </View>
469
+ )
470
+ })}
471
+ </View>
472
+ )
473
+ }
474
+
475
+ const renderPastPoll = (data: { item:PollProps, index:number }) => {
476
+ return (
477
+ <View style={{ flexGrow:1, padding:10, flexDirection:'row', alignItems:'center' }}>
478
+ <Text theme='h1'>{data.item.poll_question}</Text>
479
+ </View>
480
+ )
481
+ }
482
+
483
+ const renderSponsors = (data: { item:CompanyProps, index:number }) => {
484
+ return (
485
+ <View float style={{ flexDirection:'row', alignItems:'center', minWidth:300, maxWidth:350, margin:10, padding:10 }}>
486
+ <Image
487
+ source={{ uri: data.item.company_image?.url }}
488
+ style={{ height:60, width:60, backgroundColor:Colors.text.white, borderRadius:8 }}
489
+ resizeMode='center'
490
+ />
491
+ <View transparent style={{ flex:1, marginLeft:10 }}>
492
+ <Text theme='h1'>{data.item.company_name}</Text>
493
+ <Text theme='description' style={{ marginTop:4 }}>{data.item.company_description}</Text>
494
+ </View>
495
+ </View>
496
+ )
497
+ }
498
+
363
499
  const renderSections = (data:{ item:string, index:number }) => {
364
500
  switch(data.item){
365
501
  case 'header':
@@ -389,6 +525,92 @@ const Campaign = ({ player_id, campaign_id, insets, color_mode, distinct_id, onS
389
525
  :<></>}
390
526
  </View>
391
527
  )
528
+ case 'closest_pin':
529
+ const active_poll = flash_markets[0]//.find(m => m.flash_active);
530
+ const next_three = flash_markets.filter(m => m.priority > (active_poll?.priority??0)).sort((a,b) => a.priority - b.priority).slice(0,3);
531
+ return (
532
+ <View style={{ flexDirection:'row', flexWrap:'wrap' }}>
533
+ <View nativeID='pin_leaderboard' style={{ flex:1, minWidth:400 }}>
534
+ <View>
535
+ <Image
536
+ source={{ uri: 'https://res.cloudinary.com/hoabts6mc/image/upload/v1752434537/a95a5b63614b60844f9612cce6cc985a2ed2879c-1600x1067_bfgn61.jpg' }}
537
+ style={{ height:400*0.6725, width:400 }}
538
+ resizeMode='cover'
539
+ />
540
+ </View>
541
+ </View>
542
+ <View style={{ minWidth:400 }}>
543
+ <FlatList
544
+ data={campaign_participants.sort((a,b) => parseFloat((a.payload.pin_distance ?? 9999)) - parseFloat((b.payload.pin_distance ?? 9999)))}
545
+ key={'closed_pin_leaders'}
546
+ keyExtractor={(item) => item.campaign_participant_id}
547
+ renderItem={renderGolfers}
548
+ />
549
+ </View>
550
+ <View nativeID='flash' style={{ flex:4, borderLeftWidth:1, borderColor:Colors.borders.light }}>
551
+ <View type='body' style={{ flex:1 }}>
552
+ <View style={{ flexDirection:'row', flex:1 }}>
553
+ <View style={{ flex:1 }}>
554
+
555
+ {active_poll ?
556
+ <FlashHolder
557
+ poll_id={active_poll?.poll_id}
558
+ init_expanded
559
+ hide_tabs
560
+ onRequestAuthenticate={() => console.log('')}
561
+ onRequestLocation={() => console.log('')}
562
+ onFocusPosition={() => console.log('')}
563
+ />
564
+ :<></>}
565
+ </View>
566
+ <View style={{ flex:1, borderLeftWidth:1, borderColor:Colors.borders.light }}>
567
+ <View type='header' style={{ flexDirection:'row', alignItems:'center', padding:10 }}>
568
+ <View transparent style={{ flex:1 }}>
569
+ <Text theme='h1'>Upcoming Groups</Text>
570
+ <Text theme='description' style={{ marginTop:8 }}>Bet on who will get closest to the pin!</Text>
571
+ </View>
572
+ </View>
573
+ <View>
574
+ {next_three.map((p,i) => {
575
+ return renderUpcomingGolfers({ item: p, index:i })
576
+ })}
577
+ </View>
578
+ </View>
579
+ </View>
580
+ </View>
581
+ </View>
582
+ </View>
583
+ )
584
+ case 'last_ones':
585
+ const past_three = flash_markets.filter(m => m.priority > (active_poll?.priority??0)).sort((a,b) => b.priority - a.priority).slice(0,5);
586
+ return (
587
+ <View style={{ flex:1, borderLeftWidth:1, borderColor:Colors.borders.light }}>
588
+ <View type='header' style={{ flexDirection:'row', alignItems:'center', padding:10 }}>
589
+ <View transparent style={{ flex:1 }}>
590
+ <Text theme='h1'>Upcoming Groups</Text>
591
+ <Text theme='description' style={{ marginTop:8 }}>Bet on who will get closest to the pin!</Text>
592
+ </View>
593
+ </View>
594
+ {past_three.map((p,i) => {
595
+ return renderPastPoll({ item: p, index:i })
596
+ })}
597
+ </View>
598
+ )
599
+ case 'sponsors':
600
+ return (
601
+ <View style={{ padding:10, borderTopWidth:1, borderColor:Colors.borders.light }}>
602
+ <View>
603
+ <Text theme='h1'>Sponsors</Text>
604
+ <Text theme='description' style={{ marginTop:4 }}>A massive thank you to all the amazing sponsors</Text>
605
+ </View>
606
+ <AutoScrollingFlatList
607
+ data={sponsors}
608
+ renderItem={renderSponsors}
609
+ horizontal
610
+ speed={50}
611
+ />
612
+ </View>
613
+ )
392
614
  case 'prize':
393
615
  if(!campaign?.prize_description){ return <></> }
394
616
  return (
@@ -528,6 +750,201 @@ const Campaign = ({ player_id, campaign_id, insets, color_mode, distinct_id, onS
528
750
  const new_bet_event = events.find(e => e.event_id == new_bet_alert?.event_id);
529
751
  const new_bet_tournament = tournaments.find(t => t.tournament_id == new_bet_alert?.event_id);
530
752
  const new_bet_league = new_bet_event ? leagues.find(l => l.league_id == new_bet_event.league_id) : leagues.find(l => l.league_id == new_bet_tournament?.league_id);
753
+
754
+ if(mode == 'golf'){
755
+ const active_poll = flash_markets.filter(m => ['paused','active'].includes(m.status)).sort((a,b) => a.priority - b.priority)[0]
756
+ const next_three = flash_markets.filter(m => m.priority > (active_poll?.priority??0)).sort((a,b) => a.priority - b.priority).slice(0,3);
757
+ const past_three = flash_markets.filter(m => m.status == 'closed').sort((a,b) => b.priority - a.priority).slice(0,3)
758
+ const active_participant = campaign_participants.find(cp => cp.payload.status == 'active');
759
+ const active_golfer = players.find(p => p.player_id == active_participant?.player_id);
760
+ return (
761
+ <View style={{ flex:1 }}>
762
+ <ImageBackground
763
+ style={{ flex:1 }}
764
+ source={{ uri: 'https://res.cloudinary.com/hoabts6mc/image/upload/v1752434537/a95a5b63614b60844f9612cce6cc985a2ed2879c-1600x1067_bfgn61.jpg' }}
765
+ >
766
+ <View type='blur' style={{ position:'absolute', top:0, left:0, right:0, bottom:0 }} />
767
+ <View transparent style={{flex:1, flexDirection:'row' }}>
768
+ <View transparent style={{ flex:2, margin:10, minWidth:350 }} onLayout={(ev) => {
769
+ const { height, width } = ev.nativeEvent.layout;
770
+ setGolfLeaderSize({ height, width: width -2 });
771
+ }}>
772
+ <View float style={{ flex:1 }}>
773
+ <View type='header' style={{ flexDirection:'row', alignItems:'center', padding:10, borderTopRightRadius:8, borderTopLeftRadius:8 }}>
774
+ <View transparent style={{ flex:1 }}>
775
+ <Text theme='h1'>On the Tee Now!</Text>
776
+ <Text theme='description'>Below are the current betting probabilities for the group on the tee!</Text>
777
+ </View>
778
+ </View>
779
+ <View style={{ flex:1 }}>
780
+ {active_poll ?
781
+ <FlashHolder
782
+ poll_id={active_poll?.poll_id}
783
+ init_expanded
784
+ hide_tabs
785
+ hide_timer
786
+ hide_footer
787
+ no_highlight
788
+ onRequestAuthenticate={() => console.log('')}
789
+ onRequestLocation={() => console.log('')}
790
+ onFocusPosition={() => console.log('')}
791
+ />
792
+ :<></>}
793
+ </View>
794
+ <View transparent>
795
+ <Image
796
+ source={{ uri: 'https://res.cloudinary.com/hoabts6mc/image/upload/v1752434537/a95a5b63614b60844f9612cce6cc985a2ed2879c-1600x1067_bfgn61.jpg' }}
797
+ style={{ height:golf_leader_size.width*0.6725, width:golf_leader_size.width, alignSelf:'center', borderBottomRightRadius:8, borderBottomLeftRadius:8 }}
798
+ />
799
+ <View transparent style={{ position:'absolute', top:0, left:0, right:0, bottom:0, justifyContent:'center', alignItems:'center' }}>
800
+ <View float style={{ padding:20 }}>
801
+ <Text theme='h2' textAlign='center'>Windsong Farm South Course</Text>
802
+ <Text theme='h1' style={{ marginTop:10 }} textAlign='center'>Hole 16</Text>
803
+ <View transparent style={{ marginTop:10, padding:10, justifyContent:'center', alignItems:'center' }}>
804
+ <QRCode
805
+ value={`https://play.bettoredge.com/social/campaign/${campaign_id}`}
806
+ size={100}
807
+ style={{ backgroundColor:'transparent' }}
808
+ />
809
+ </View>
810
+ </View>
811
+
812
+ </View>
813
+ </View>
814
+ </View>
815
+ </View>
816
+ <View float style={{ flex:3, minWidth:350, margin:10 }}>
817
+ <View type='header' style={{ padding:10, borderTopRightRadius:8, borderTopLeftRadius:8 }}>
818
+ <View transparent style={{ flex:1 }}>
819
+ <Text theme='h1'>Closest to the hole #16</Text>
820
+ </View>
821
+ </View>
822
+ {active_golfer ?
823
+ <View style={{ backgroundColor:Colors.views.gold, padding:10 }}>
824
+ <Text theme='h2'>Now On The Tee</Text>
825
+ <View transparent style={{ flexDirection:'row', marginTop:5}}>
826
+ <Image
827
+ source={{ uri: active_golfer.profile_pic && active_golfer.profile_pic != '' ? active_golfer.profile_pic : 'https://res.cloudinary.com/hoabts6mc/image/upload/v1722453927/default_man_n96ofq.webp' }}
828
+ style={{ height:35, width:35, borderRadius:100}}
829
+ />
830
+ <View transparent style={{ flex:1, marginLeft:10 }}>
831
+ <Text theme='h1' color={Colors.text.white}>{active_golfer.first_name} {active_golfer.last_name}</Text>
832
+ <Text theme='description' style={{ marginTop:3 }}>@{active_golfer.username}</Text>
833
+ </View>
834
+ <Icons.GolferIcon size={28} color={Colors.text.white} />
835
+ </View>
836
+ </View>
837
+ :<></>}
838
+ <View style={{ flex:1, borderBottomRightRadius:8, borderBottomLeftRadius:8 }}>
839
+ <View style={{ padding:10 }}>
840
+ <Text theme='h1'>LEADERBOARD</Text>
841
+ <Text theme='description' style={{ marginTop:4 }}>Closest to the pin - distance in feet from the pin</Text>
842
+ </View>
843
+ <FlatList
844
+ data={campaign_participants.sort((a,b) => parseFloat((a.payload.pin_distance ? a.payload.pin_distance : 9999)) - parseFloat((b.payload.pin_distance ? b.payload.pin_distance : 9999)))}
845
+ key={'closed_pin_leaders'}
846
+ keyExtractor={(item) => item.campaign_participant_id}
847
+ renderItem={renderGolfers}
848
+ />
849
+ </View>
850
+ <View type='header' style={{ padding:10, borderTopWidth:1, borderColor:Colors.borders.light, overflow:'hidden', borderBottomRightRadius:8, borderBottomLeftRadius:8 }}>
851
+ <View transparent>
852
+ <Text theme='h1'>Sponsors</Text>
853
+ <Text theme='h2' style={{ marginTop:4 }}>A massive thank you to all the amazing sponsors</Text>
854
+ </View>
855
+ <AutoScrollingFlatList
856
+ data={sponsors}
857
+ renderItem={renderSponsors}
858
+ horizontal
859
+ speed={20}
860
+ />
861
+ </View>
862
+ </View>
863
+ <View transparent style={{ flex:4 }}>
864
+ <View float nativeID='next_up' style={{ flexGrow:1, margin:10 }}>
865
+ <View type='header' style={{ flexDirection:'row', alignItems:'center', padding:10, borderTopRightRadius:8, borderTopLeftRadius:8 }}>
866
+ <Icons.GolferIcon size={28} color={Colors.text.h1} />
867
+ <View transparent style={{ flex:1, marginLeft:10 }}>
868
+ <Text theme='h1'>Upcoming Groups</Text>
869
+ <Text theme='description' style={{ marginTop:3 }}>Groups that are soon to be up!</Text>
870
+ </View>
871
+ </View>
872
+ <View style={{ borderBottomRightRadius:8, borderBottomLeftRadius:8 }}>
873
+ <FlatList
874
+ data={next_three.sort((a,b) => a.priority - b.priority)}
875
+ renderItem={renderUpcomingGolfers}
876
+ key={'next_up'}
877
+ keyExtractor={(item) => item.poll_id.toString()}
878
+ />
879
+ </View>
880
+ </View>
881
+ <View float nativeID='past' style={{ flexGrow:1, margin:10 }}>
882
+ <View type='header' style={{ flexDirection:'row', alignItems:'center', padding:10, borderTopRightRadius:8, borderTopLeftRadius:8 }}>
883
+ <Icons.GolferIcon size={28} color={Colors.text.h1} />
884
+ <View transparent style={{ flex:1, marginLeft:10 }}>
885
+ <Text theme='h1'>Recently Completed Groups</Text>
886
+ <Text theme='description' style={{ marginTop:3 }}>Winners from past groups!</Text>
887
+ </View>
888
+ </View>
889
+ <View style={{ borderBottomRightRadius:8, borderBottomLeftRadius:8 }}>
890
+ <FlatList
891
+ data={past_three.sort((a,b) => b.priority - a.priority)}
892
+ renderItem={renderClosedGolfers}
893
+ key={'past_up'}
894
+ keyExtractor={(item) => item.poll_id.toString()}
895
+ />
896
+ </View>
897
+ </View>
898
+ {campaign ?
899
+ <View type='header' style={{ margin:10, flexDirection:'row', alignItems:'center', padding:10, borderRadius:8 }}>
900
+
901
+ <Image
902
+ source={{ uri: campaign.campaign_image?.url }}
903
+ style={{ height:80, width:80, borderRadius:8 }}
904
+ resizeMode='center'
905
+ />
906
+ <View transparent style={{ flex:1, marginLeft:20 }}>
907
+ <Text theme='h1' size={18}>{campaign.campaign_name}</Text>
908
+ <Text theme='description' style={{ marginTop:4 }}>{campaign.description}</Text>
909
+ </View>
910
+
911
+ </View>
912
+ :<></>}
913
+ </View>
914
+
915
+ </View>
916
+ </ImageBackground>
917
+ {new_player_alert && new_player ?
918
+ <View type='blur' style={{ position:'absolute', top:0, left:0, right:0, bottom:0, alignItems:'center', paddingTop:100 }}>
919
+ <GolferAlert
920
+ campaign_participant={new_player_alert}
921
+ player={new_player}
922
+ view_mode={view_mode}
923
+ onViewProfile={onViewProfile}
924
+ onClose={() => setNewPlayerAlert(undefined)}
925
+ />
926
+ </View>
927
+ :<></>}
928
+ <SocketManager
929
+ onConnect={() => {
930
+ if(!needs_reload){ return }
931
+ }}
932
+ onDisconnect={() => setNeedsReload(true)}
933
+ subscribed_events={['UPDATE_CAMPAIGN_PARTICIPANTS']}
934
+ onSocketEvent={(event) => {
935
+ switch(event.type){
936
+ case 'UPDATE_CAMPAIGN_PARTICIPANTS':
937
+ let this_participants = event.campaign_participants.filter((cp:CampaignParticipantProps) => cp.campaign_id == campaign_id);
938
+ if(this_participants.length == 0){ return }
939
+ return setSocketParticipants(event.campaign_participants);
940
+ default: return
941
+ }
942
+ }}
943
+ />
944
+ </View>
945
+ )
946
+ }
947
+
531
948
  return (
532
949
  <View style={{ flex:1 }}>
533
950
  <View style={{ flex:1 }}>
@@ -597,7 +1014,6 @@ const Campaign = ({ player_id, campaign_id, insets, color_mode, distinct_id, onS
597
1014
  <SocketManager
598
1015
  onConnect={() => {
599
1016
  if(!needs_reload){ return }
600
- console.log('GET DATA!!!`')
601
1017
  }}
602
1018
  onDisconnect={() => setNeedsReload(true)}
603
1019
  subscribed_events={['UPDATE_CAMPAIGN_PARTICIPANTS']}
@@ -71,7 +71,7 @@ const TeamImage = ({ team, league , size} : TeamImageProps) => {
71
71
  let image_size = size ?? 20
72
72
 
73
73
  return (
74
- <View style={{ margin:5, alignSelf:'center', justifyContent:'center', alignItems:'center', borderRadius:100, backgroundColor:Colors.shades.white }}>
74
+ <View style={{ alignSelf:'center', justifyContent:'center', alignItems:'center', borderRadius:100, backgroundColor:Colors.shades.white }}>
75
75
  {team.image?.url ?
76
76
  <RN_Image source={{ uri: team.image.url }} style={{ height:image_size * 2, width:image_size * 2, borderRadius:100 }} resizeMode='center'/>
77
77
 
@@ -18,10 +18,14 @@ type FlashHolderProps = {
18
18
  player?:MyPlayerProps,
19
19
  init_expanded?:boolean,
20
20
  contest_type?:string,
21
+ parent_style?:ViewStyle,
22
+ hide_footer?:boolean,
21
23
  contest_id?:string,
22
24
  hide_tabs?:boolean,
23
25
  style?:ViewStyle,
24
26
  side_type?:string,
27
+ hide_timer?:boolean,
28
+ no_highlight?:boolean,
25
29
  location?:LocationProps,
26
30
  side_id?:string,
27
31
  poll_id?:string,
@@ -31,7 +35,7 @@ type FlashHolderProps = {
31
35
  onRequestAuthenticate: () => void
32
36
  }
33
37
  const sections = [ 'selector','explainer','flash_market','options','footer' ]
34
- const FlashHolder = ({ float, compact, style, distinct_id, hide_tabs, league_id, init_expanded, player_id, player, location, contest_type, contest_id, side_type, side_id, poll_id, onSelectCompactPoll, onRequestAuthenticate, onFocusPosition, onRequestLocation } : FlashHolderProps) => {
38
+ const FlashHolder = ({ float, compact, style, hide_timer, distinct_id, hide_footer, no_highlight, hide_tabs, parent_style, league_id, init_expanded, player_id, player, location, contest_type, contest_id, side_type, side_id, poll_id, onSelectCompactPoll, onRequestAuthenticate, onFocusPosition, onRequestLocation } : FlashHolderProps) => {
35
39
  const Colors = useColors();
36
40
  const [ needs_reload, setNeedsReload ] = useState(false);
37
41
  const [ socket_campaigns, setSocketCampaigns ] = useState<PollCampaignProps[]>([]);
@@ -190,7 +194,7 @@ const FlashHolder = ({ float, compact, style, distinct_id, hide_tabs, league_id,
190
194
  return (
191
195
  <Button
192
196
  float={selected}
193
- style={{ padding:4, margin:1, borderRadius:0, borderTopRightRadius:8, borderTopLeftRadius:8, borderWidth:2, borderBottomWidth:0, borderColor:selected ? Colors.text.success : Colors.borders.light, opacity:selected?1:0.5 }}
197
+ style={{ padding:4, margin:1, borderRadius:0, borderTopRightRadius:8, borderTopLeftRadius:8, borderWidth:2, borderBottomWidth:0, borderColor:selected && !no_highlight ? Colors.text.success : Colors.borders.light, opacity:selected?1:0.5 }}
194
198
  onPress={() => handleSelectPoll(data.item.poll_id)}
195
199
  >
196
200
  {data.item.poll_image ?
@@ -267,11 +271,13 @@ const FlashHolder = ({ float, compact, style, distinct_id, hide_tabs, league_id,
267
271
  poll={flash_market}
268
272
  poll_options={poll_options}
269
273
  poll_summaries={poll_summaries}
274
+ hide_footer={hide_footer}
270
275
  poll_campaign={poll_campaign}
271
276
  flash_market_fees={flash_market_fees}
272
277
  loading={loading || holder_loading}
273
278
  hide_image
274
- card_style={{ borderWidth:2, borderColor:Colors.text.success, borderBottomRightRadius:8, borderBottomLeftRadius:8 }}
279
+ hide_timer={hide_timer}
280
+ card_style={{ borderWidth:2, borderColor:!no_highlight?Colors.text.success:Colors.borders.light, borderBottomRightRadius:8, borderBottomLeftRadius:8 }}
275
281
  init_expanded={init_expanded}
276
282
  footer_style={{ borderBottomRightRadius:8, borderBottomLeftRadius:8 }}
277
283
  header_style={{ borderTopRightRadius:0, borderTopLeftRadius:0 }}
@@ -286,7 +292,7 @@ const FlashHolder = ({ float, compact, style, distinct_id, hide_tabs, league_id,
286
292
  }
287
293
  }
288
294
  return (
289
- <View transparent>
295
+ <View transparent style={{ ...parent_style }}>
290
296
  {flash_markets.length > 0 || active_flash_market ?
291
297
  <View float={float} style={{ ...style }}>
292
298
  <FlatList