be-components 1.0.1 → 1.0.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 (114) hide show
  1. package/lib/commonjs/Bracket/api/index.js +439 -0
  2. package/lib/commonjs/Bracket/api/index.js.map +1 -0
  3. package/lib/commonjs/Bracket/components/BracketCompetitionCard.js +570 -0
  4. package/lib/commonjs/Bracket/components/BracketCompetitionCard.js.map +1 -0
  5. package/lib/commonjs/Bracket/components/BracketCompetitionSelector.js +208 -0
  6. package/lib/commonjs/Bracket/components/BracketCompetitionSelector.js.map +1 -0
  7. package/lib/commonjs/Bracket/components/BracketPlay/BracketNavigator.js +142 -0
  8. package/lib/commonjs/Bracket/components/BracketPlay/BracketNavigator.js.map +1 -0
  9. package/lib/commonjs/Bracket/components/BracketPlay/BracketRound.js +94 -0
  10. package/lib/commonjs/Bracket/components/BracketPlay/BracketRound.js.map +1 -0
  11. package/lib/commonjs/Bracket/components/BracketPlay/RoundEvent.js +438 -0
  12. package/lib/commonjs/Bracket/components/BracketPlay/RoundEvent.js.map +1 -0
  13. package/lib/commonjs/Bracket/components/BracketPlay/index.js +350 -0
  14. package/lib/commonjs/Bracket/components/BracketPlay/index.js.map +1 -0
  15. package/lib/commonjs/Bracket/components/BracketSelector.js +138 -0
  16. package/lib/commonjs/Bracket/components/BracketSelector.js.map +1 -0
  17. package/lib/commonjs/Bracket/components/CompetitionLeaderboard.js +237 -0
  18. package/lib/commonjs/Bracket/components/CompetitionLeaderboard.js.map +1 -0
  19. package/lib/commonjs/Bracket/components/JoinCompetitionCard.js +130 -0
  20. package/lib/commonjs/Bracket/components/JoinCompetitionCard.js.map +1 -0
  21. package/lib/commonjs/Bracket/components/PlayerBalanceCard.js +53 -0
  22. package/lib/commonjs/Bracket/components/PlayerBalanceCard.js.map +1 -0
  23. package/lib/commonjs/Bracket/components/PlayerBracketManager.js +452 -0
  24. package/lib/commonjs/Bracket/components/PlayerBracketManager.js.map +1 -0
  25. package/lib/commonjs/Bracket/components/PlayerBrackets.js +179 -0
  26. package/lib/commonjs/Bracket/components/PlayerBrackets.js.map +1 -0
  27. package/lib/commonjs/Bracket/components/RoomMenu.js +118 -0
  28. package/lib/commonjs/Bracket/components/RoomMenu.js.map +1 -0
  29. package/lib/commonjs/Bracket/index.js +368 -0
  30. package/lib/commonjs/Bracket/index.js.map +1 -0
  31. package/lib/commonjs/index.js +7 -0
  32. package/lib/commonjs/index.js.map +1 -1
  33. package/lib/module/Bracket/api/index.js +433 -0
  34. package/lib/module/Bracket/api/index.js.map +1 -0
  35. package/lib/module/Bracket/components/BracketCompetitionCard.js +561 -0
  36. package/lib/module/Bracket/components/BracketCompetitionCard.js.map +1 -0
  37. package/lib/module/Bracket/components/BracketCompetitionSelector.js +199 -0
  38. package/lib/module/Bracket/components/BracketCompetitionSelector.js.map +1 -0
  39. package/lib/module/Bracket/components/BracketPlay/BracketNavigator.js +135 -0
  40. package/lib/module/Bracket/components/BracketPlay/BracketNavigator.js.map +1 -0
  41. package/lib/module/Bracket/components/BracketPlay/BracketRound.js +87 -0
  42. package/lib/module/Bracket/components/BracketPlay/BracketRound.js.map +1 -0
  43. package/lib/module/Bracket/components/BracketPlay/RoundEvent.js +431 -0
  44. package/lib/module/Bracket/components/BracketPlay/RoundEvent.js.map +1 -0
  45. package/lib/module/Bracket/components/BracketPlay/index.js +341 -0
  46. package/lib/module/Bracket/components/BracketPlay/index.js.map +1 -0
  47. package/lib/module/Bracket/components/BracketSelector.js +131 -0
  48. package/lib/module/Bracket/components/BracketSelector.js.map +1 -0
  49. package/lib/module/Bracket/components/CompetitionLeaderboard.js +228 -0
  50. package/lib/module/Bracket/components/CompetitionLeaderboard.js.map +1 -0
  51. package/lib/module/Bracket/components/JoinCompetitionCard.js +123 -0
  52. package/lib/module/Bracket/components/JoinCompetitionCard.js.map +1 -0
  53. package/lib/module/Bracket/components/PlayerBalanceCard.js +46 -0
  54. package/lib/module/Bracket/components/PlayerBalanceCard.js.map +1 -0
  55. package/lib/module/Bracket/components/PlayerBracketManager.js +443 -0
  56. package/lib/module/Bracket/components/PlayerBracketManager.js.map +1 -0
  57. package/lib/module/Bracket/components/PlayerBrackets.js +172 -0
  58. package/lib/module/Bracket/components/PlayerBrackets.js.map +1 -0
  59. package/lib/module/Bracket/components/RoomMenu.js +111 -0
  60. package/lib/module/Bracket/components/RoomMenu.js.map +1 -0
  61. package/lib/module/Bracket/index.js +359 -0
  62. package/lib/module/Bracket/index.js.map +1 -0
  63. package/lib/module/index.js +2 -1
  64. package/lib/module/index.js.map +1 -1
  65. package/lib/typescript/src/Bracket/api/index.d.ts +111 -0
  66. package/lib/typescript/src/Bracket/api/index.d.ts.map +1 -0
  67. package/lib/typescript/src/Bracket/components/BracketCompetitionCard.d.ts +34 -0
  68. package/lib/typescript/src/Bracket/components/BracketCompetitionCard.d.ts.map +1 -0
  69. package/lib/typescript/src/Bracket/components/BracketCompetitionSelector.d.ts +12 -0
  70. package/lib/typescript/src/Bracket/components/BracketCompetitionSelector.d.ts.map +1 -0
  71. package/lib/typescript/src/Bracket/components/BracketPlay/BracketNavigator.d.ts +14 -0
  72. package/lib/typescript/src/Bracket/components/BracketPlay/BracketNavigator.d.ts.map +1 -0
  73. package/lib/typescript/src/Bracket/components/BracketPlay/BracketRound.d.ts +25 -0
  74. package/lib/typescript/src/Bracket/components/BracketPlay/BracketRound.d.ts.map +1 -0
  75. package/lib/typescript/src/Bracket/components/BracketPlay/RoundEvent.d.ts +23 -0
  76. package/lib/typescript/src/Bracket/components/BracketPlay/RoundEvent.d.ts.map +1 -0
  77. package/lib/typescript/src/Bracket/components/BracketPlay/index.d.ts +19 -0
  78. package/lib/typescript/src/Bracket/components/BracketPlay/index.d.ts.map +1 -0
  79. package/lib/typescript/src/Bracket/components/BracketSelector.d.ts +12 -0
  80. package/lib/typescript/src/Bracket/components/BracketSelector.d.ts.map +1 -0
  81. package/lib/typescript/src/Bracket/components/CompetitionLeaderboard.d.ts +14 -0
  82. package/lib/typescript/src/Bracket/components/CompetitionLeaderboard.d.ts.map +1 -0
  83. package/lib/typescript/src/Bracket/components/JoinCompetitionCard.d.ts +17 -0
  84. package/lib/typescript/src/Bracket/components/JoinCompetitionCard.d.ts.map +1 -0
  85. package/lib/typescript/src/Bracket/components/PlayerBalanceCard.d.ts +9 -0
  86. package/lib/typescript/src/Bracket/components/PlayerBalanceCard.d.ts.map +1 -0
  87. package/lib/typescript/src/Bracket/components/PlayerBracketManager.d.ts +18 -0
  88. package/lib/typescript/src/Bracket/components/PlayerBracketManager.d.ts.map +1 -0
  89. package/lib/typescript/src/Bracket/components/PlayerBrackets.d.ts +17 -0
  90. package/lib/typescript/src/Bracket/components/PlayerBrackets.d.ts.map +1 -0
  91. package/lib/typescript/src/Bracket/components/RoomMenu.d.ts +14 -0
  92. package/lib/typescript/src/Bracket/components/RoomMenu.d.ts.map +1 -0
  93. package/lib/typescript/src/Bracket/index.d.ts +17 -0
  94. package/lib/typescript/src/Bracket/index.d.ts.map +1 -0
  95. package/lib/typescript/src/index.d.ts +2 -1
  96. package/lib/typescript/src/index.d.ts.map +1 -1
  97. package/package.json +1 -1
  98. package/src/Bracket/api/index.ts +370 -0
  99. package/src/Bracket/components/BracketCompetitionCard.tsx +351 -0
  100. package/src/Bracket/components/BracketCompetitionSelector.tsx +123 -0
  101. package/src/Bracket/components/BracketPlay/BracketNavigator.tsx +75 -0
  102. package/src/Bracket/components/BracketPlay/BracketRound.tsx +86 -0
  103. package/src/Bracket/components/BracketPlay/RoundEvent.tsx +262 -0
  104. package/src/Bracket/components/BracketPlay/index.tsx +247 -0
  105. package/src/Bracket/components/BracketSelector.tsx +87 -0
  106. package/src/Bracket/components/CompetitionLeaderboard.tsx +165 -0
  107. package/src/Bracket/components/JoinCompetitionCard.tsx +83 -0
  108. package/src/Bracket/components/PlayerBalanceCard.tsx +34 -0
  109. package/src/Bracket/components/PlayerBracketManager.tsx +229 -0
  110. package/src/Bracket/components/PlayerBrackets.tsx +119 -0
  111. package/src/Bracket/components/RoomMenu.tsx +69 -0
  112. package/src/Bracket/index.tsx +291 -0
  113. package/src/index.tsx +3 -1
  114. package/src/types.d.ts +173 -0
@@ -0,0 +1,370 @@
1
+ import axios from "axios"
2
+ import type { AthleteProps, BracketCompetitionProps, BracketCompetitionScoringRuleProps, BracketGroupProps, BracketProps, BracketRoundProps, CompetitionPayoutTypeProps, CompetitionPlayerBracketProps, CompetitionResultTypeProps, CompetitionTypeProps, EventProps, LeagueProps, MyPlayerProps, PlayerBalanceProps, PlayerBracketPickProps, PlayerBracketProps, PublicPlayerProps, RoundEventProps, TeamProps } from "../../types";
3
+ import { APIOverrides } from "../../ApiOverrides";
4
+ import moment from "moment-mini";
5
+ export { BracketApi, BracketComeptitionApi, BracketCompetitionHelpers }
6
+
7
+ let AUTH_SVC_API = ''
8
+ let EVENT_SVC_API = ''
9
+ let TP_SVC_API = ''
10
+
11
+
12
+ const BracketApi = {
13
+ setEnvironment: () => {
14
+ const endpoints = APIOverrides.getEndpoints();
15
+ TP_SVC_API = endpoints['TP_SVC_API'] as string;
16
+ EVENT_SVC_API = endpoints['EVENT_SVC_API'] as string;
17
+ AUTH_SVC_API = endpoints['AUTH_SVC_API'] as string;
18
+ },
19
+ getBracketById: async(bracket_id:string):Promise<{ bracket:BracketProps, bracket_rounds:BracketRoundProps[], round_events:RoundEventProps[], bracket_groups:BracketGroupProps[] }> => {
20
+ const resp = await axios.get(`${EVENT_SVC_API}/v1/brackets/bracket/${bracket_id}`)
21
+ return resp.data
22
+ },
23
+ getLeagues: async():Promise<LeagueProps[]> => {
24
+ const resp = await axios.get(`${EVENT_SVC_API}/v1/leagues`)
25
+ return resp.data.leagues
26
+ },
27
+ getActiveBrackets: async():Promise<BracketProps[]> => {
28
+ const resp = await axios.get(`${EVENT_SVC_API}/v1/brackets/active`)
29
+ return resp.data.brackets
30
+ },
31
+ getPlayersByPlayerIds : async(player_ids:string[]):Promise<PublicPlayerProps[]> => {
32
+ if(player_ids.length == 0){ return [] }
33
+ const resp = await axios.post(`${AUTH_SVC_API}/v1/players/bulk/get`, { player_ids })
34
+ return resp.data.players
35
+ },
36
+ getEventsByEventIds: async(event_ids:string[]):Promise<EventProps[]> => {
37
+ const resp = await axios.post(`${EVENT_SVC_API}/v1/events/bulk/get`, { attribute:'event_id', values: event_ids })
38
+ return resp.data.events
39
+ },
40
+ getAthletesByIds : async(athlete_ids:string[]):Promise<AthleteProps[]> => {
41
+ if(athlete_ids.length == 0){ return [] }
42
+ const resp = await axios.post(`${EVENT_SVC_API}/v1/athletes/bulk/get`, { attribute: 'athlete_id', values: athlete_ids })
43
+ return resp.data.athletes
44
+ },
45
+ getTeamsByIds: async(team_ids:string[]):Promise<TeamProps[]> => {
46
+ if(team_ids.length == 0){ return [] }
47
+ const resp = await axios.post(`${EVENT_SVC_API}/v1/teams/bulk/get`, { attribute:'team_id', values: team_ids })
48
+ return resp.data.teams
49
+ },
50
+ getExoticsByIds : async(exotic_ids:string[]):Promise<any[]> => {
51
+ const resp = await axios.post(`${EVENT_SVC_API}/v1/exotics/bulk/get`, { attribute: 'exotic_id', values: exotic_ids })
52
+ return resp.data.athletes
53
+ },
54
+ }
55
+
56
+ const BracketComeptitionApi = {
57
+ getMyDetails: async():Promise<MyPlayerProps> => {
58
+ const resp = await axios.get(`${AUTH_SVC_API}/v1/players/player/me`)
59
+ return resp.data.player
60
+ },
61
+ getMyBalance: async():Promise<PlayerBalanceProps> => {
62
+ const resp = await axios.get(`${AUTH_SVC_API}/v1/players/player/balance/me`)
63
+ return resp.data.player_balance
64
+ },
65
+ createBracketCompetition: async(bracket_competition:BracketCompetitionProps, bracket_competition_scoring_rules:BracketCompetitionScoringRuleProps[]):Promise<{bracket_competition:BracketCompetitionProps, bracket_competition_scoring_rules:BracketCompetitionScoringRuleProps[]}> => {
66
+ const resp = await axios.post(`${TP_SVC_API}/v1/brackets/competition/create`, { bracket_competition, bracket_competition_scoring_rules })
67
+ return resp.data
68
+ },
69
+ getCompetitionOptions: async():Promise<{competition_types:CompetitionTypeProps[], competition_result_types:CompetitionResultTypeProps[], competition_payout_types:CompetitionPayoutTypeProps[]}> => {
70
+ const resp = await axios.get(`${TP_SVC_API}/v1/competitions/options`)
71
+ return resp.data
72
+ },
73
+ getBracketCompetitions: async(status?:string):Promise<BracketCompetitionProps[]> => {
74
+ const resp = await axios.get(`${TP_SVC_API}/v1/brackets/competitions/all?status=${status}`)
75
+ return resp.data.bracket_competitions
76
+ },
77
+ getBracketcompetitionByCode: async(competition_code:string):Promise<BracketCompetitionProps | undefined> => {
78
+ try {
79
+ const resp = await axios.post(`${TP_SVC_API}/v1/brackets/competitions/code`, { competition_code })
80
+ return resp.data.bracket_competition
81
+ } catch (e) {
82
+ console.log(e)
83
+ return undefined
84
+ }
85
+ },
86
+ isCodeAvailable : async(competition_code:string):Promise<Boolean> => {
87
+ const resp = await axios.post(`${TP_SVC_API}/v1/brackets/code/available`, { competition_code })
88
+ return resp.data.available
89
+ },
90
+ getBracketCompetitionById: async(bracket_competition_id:string):Promise<{bracket_competition:BracketCompetitionProps, competition_player_brackets:CompetitionPlayerBracketProps[], player_brackets:PlayerBracketProps[], bracket_competition_scoring_rules:BracketCompetitionScoringRuleProps[]}> => {
91
+ const resp = await axios.get(`${TP_SVC_API}/v1/brackets/competition/${bracket_competition_id}`)
92
+ return resp.data
93
+ },
94
+ getPlayerBracketById: async(player_bracket_id:string):Promise<{player_bracket:PlayerBracketProps, player_bracket_picks:PlayerBracketPickProps[]}> => {
95
+ const resp = await axios.get(`${TP_SVC_API}/v1/brackets/bracket/${player_bracket_id}`)
96
+ return resp.data
97
+ },
98
+ createPlayerBracket: async(player_bracket:PlayerBracketProps):Promise<PlayerBracketProps> => {
99
+ const resp = await axios.post(`${TP_SVC_API}/v1/brackets/bracket/create`, { player_bracket })
100
+ return resp.data.player_bracket
101
+ },
102
+ updatePlayerBracket: async(player_bracket:PlayerBracketProps):Promise<PlayerBracketProps> => {
103
+ const resp = await axios.post(`${TP_SVC_API}/v1/brackets/bracket/update`, { player_bracket })
104
+ return resp.data.player_bracket
105
+ },
106
+ deletePlayerBracket: async(player_bracket_id:string):Promise<PlayerBracketProps> => {
107
+ const resp = await axios.post(`${TP_SVC_API}/v1/brackets/bracket/delete`, { player_bracket_id })
108
+ return resp.data.player_bracket
109
+ },
110
+ getMyPlayerBrackets: async(bracket_id?:string, bracket_competition_id?:string):Promise<{ player_brackets: PlayerBracketProps[], competition_player_brackets:CompetitionPlayerBracketProps[], bracket_competitions:BracketCompetitionProps[] }> => {
111
+ const resp = await axios.get(`${TP_SVC_API}/v1/brackets/player?bracket_id=${bracket_id}&bracket_competition_id=${bracket_competition_id}`)
112
+ console.log(resp.data)
113
+ return resp.data
114
+ },
115
+ savePick: async(player_bracket_pick:PlayerBracketPickProps):Promise<{player_bracket:PlayerBracketProps, player_bracket_picks:PlayerBracketPickProps[], competition_player_brackets:CompetitionPlayerBracketProps[]}> => {
116
+ const resp = await axios.post(`${TP_SVC_API}/v1/brackets/pick/create`, { player_bracket_pick })
117
+ return resp.data
118
+ },
119
+ joinBracketCompetition: async(competition_player_bracket:CompetitionPlayerBracketProps):Promise<{bracket_competition:BracketCompetitionProps, competition_player_bracket: CompetitionPlayerBracketProps}> => {
120
+ const resp = await axios.post(`${TP_SVC_API}/v1/brackets/competition/join`, { competition_player_bracket })
121
+ return resp.data
122
+ },
123
+ leaveBracketCompetition: async(competition_player_bracket_id:string):Promise<{bracket_competition:BracketCompetitionProps, competition_player_bracket:CompetitionPlayerBracketProps}> => {
124
+ const resp = await axios.post(`${TP_SVC_API}/v1/brackets/competition/leave`, { competition_player_bracket_id })
125
+ return resp.data
126
+ },
127
+ getCompetitionPlayerBracketsByCompetitionId: async(bracket_competition_id:string, offset:number):Promise<{ competition_player_brackets:CompetitionPlayerBracketProps[], player_brackets:PlayerBracketProps[] }> => {
128
+ const resp = await axios.get(`${TP_SVC_API}/v1/brackets/competitionplayer/competition/${bracket_competition_id}?offset=${offset}`)
129
+ return resp.data
130
+ },
131
+ getMyCompetitionPlayerBrackets: async():Promise<{ competition_player_brackets:CompetitionPlayerBracketProps[], bracket_competitions:BracketCompetitionProps[] }> => {
132
+ const resp = await axios.get(`${TP_SVC_API}/v1/brackets/competitionplayer/me`)
133
+ return resp.data
134
+ }
135
+ }
136
+
137
+
138
+ type BracketRoundStatus = { bracket_round_id:string, completion_pct: number }
139
+ type BracketGroupStatus = { bracket_group_id:string, completion_pct:number }
140
+ type NonGroupEventProps = {
141
+ round_event_id:string,
142
+ round_event:RoundEventProps,
143
+ event_number:number,
144
+ championship:boolean,
145
+ player_bracket_pick?:PlayerBracketPickProps,
146
+ away_placeholder_pick?:PlayerBracketPickProps,
147
+ home_placeholder_pick?:PlayerBracketPickProps,
148
+ orientation?: 'left'|'right'
149
+ }
150
+
151
+ const BracketCompetitionHelpers = {
152
+ getPayout: (bc:BracketCompetitionProps):number => {
153
+ let payout = bc.ticket_revenue
154
+ if(bc.promo_payout){ payout += bc.promo_payout }
155
+ if(bc.guaranteed_payout && payout < bc.guaranteed_payout){ payout = bc.guaranteed_payout }
156
+ return payout
157
+ },
158
+ canLeave: (bc?:BracketCompetitionProps) => {
159
+ if(!bc){ return false }
160
+ if(moment().isBefore(moment(bc.scheduled_datetime))){ return true }
161
+ return false
162
+ },
163
+ isEnoughBalance: (bc:BracketCompetitionProps, player_balance?:PlayerBalanceProps) => {
164
+ if(!player_balance) return false
165
+ if(bc.market_type == 'FREE' && player_balance.free_market_balance < bc.buy_in){ return false }
166
+ if(bc.market_type == 'FOR_MONEY' && player_balance.balance < bc.buy_in){ return false }
167
+ return true
168
+ },
169
+ showChampions:(bc:BracketCompetitionProps) => {
170
+ if(!bc){ return false }
171
+ if(moment().isBefore(moment(bc.scheduled_datetime))){ return false }
172
+ return true
173
+ },
174
+ canDeletePlayerBracket: (pb:PlayerBracketProps, cpbs:CompetitionPlayerBracketProps[]) => {
175
+ if(cpbs.length > 0){ return false }
176
+ if(pb.status != 'active'){ return false }
177
+ return true
178
+ },
179
+ getBuyInTitle: (bc:BracketCompetitionProps) => {
180
+ if(bc.buy_in == 0){ return `Join For Free` }
181
+ const cl = bc.market_type == 'FREE' ? 'E' : '$'
182
+ return `Join Competition ${cl}${bc.buy_in}`
183
+ },
184
+ genEmptyBracketCompetition: ():BracketCompetitionProps => {
185
+ let code = `${Math.floor(100000 + Math.random() * 900000)}`
186
+ return {
187
+ bracket_competition_id: '',
188
+ bracket_id: '',
189
+ competition_name:'',
190
+ competition_description: '',
191
+ code_valid: true,
192
+ competition_code: code,
193
+ create_datetime: '',
194
+ last_update_datetime: '',
195
+ image: { url: 'https://res.cloudinary.com/hoabts6mc/image/upload/v1677259366/Bracket_image_h0fkku.webp' },
196
+ status: 'scheduled',
197
+ buy_in: 0,
198
+ market_type: 'FOR_MONEY',
199
+ scheduled_datetime: '',
200
+ scoring_system: 'progressive',
201
+ max_brackets: 100,
202
+ max_brackets_per_player: 1,
203
+ invite_only: true,
204
+ ticket_revenue: 0,
205
+ tickets_sold: 0,
206
+ admin_id: '',
207
+ competition_result_type_id: ''
208
+ }
209
+ },
210
+ getDefaultScoringRules : (bracket_competition_id:string, bracket_rounds:BracketRoundProps[]):BracketCompetitionScoringRuleProps[] => {
211
+ let rules:BracketCompetitionScoringRuleProps[] = []
212
+ let next_points = 1;
213
+ bracket_rounds.sort((a,b) => a.round_number - b.round_number).map(br => {
214
+ rules.push({
215
+ bracket_competition_scoring_rule_id: '',
216
+ bracket_competition_id,
217
+ round_number: br.round_number,
218
+ win_points: br.carry_through?0:next_points,
219
+ underdog_bonus: false,
220
+ underdog_multiplier: 0,
221
+ create_datetime:'',
222
+ last_update_datetime:''
223
+ })
224
+ if(!br.carry_through){ next_points = next_points * 2 }
225
+ })
226
+ return rules
227
+ },
228
+ createEmptyPlayerBracket : (player_id:string, bracket_id:string):PlayerBracketProps => {
229
+ let title = `My Bracket ${Math.floor(Math.random() * 100)}`
230
+ return {
231
+ player_bracket_id: '',
232
+ player_id: player_id,
233
+ bracket_id: bracket_id,
234
+ bracket_name: title,
235
+ status: 'active',
236
+ completion_status: 'inprogress',
237
+ completion_pct: 0,
238
+ create_datetime: '',
239
+ last_update_datetime: ''
240
+ }
241
+ },
242
+ createPlayerBracketPick : (bracket_id:string, round_event:RoundEventProps, pick_side:'away'|'home', pick_side_id:string, pick_seed: number):PlayerBracketPickProps => {
243
+
244
+ return {
245
+ player_bracket_pick_id: '',
246
+ player_bracket_id: '',
247
+ bracket_id: bracket_id,
248
+ round_event_id: round_event.round_event_id,
249
+ pick_side,
250
+ pick_side_id,
251
+ pick_seed,
252
+ underdog_pick: false,
253
+ status: 'inprogress',
254
+ pick_side_type: 'team',
255
+ event_sequence: round_event.event_number,
256
+ points: 0,
257
+ create_datetime: '',
258
+ last_update_datetime:''
259
+ }
260
+ },
261
+ getBracketPickProgress : (pbp:PlayerBracketPickProps[], bracket_rounds:BracketRoundProps[], bracket_groups:BracketGroupProps[], round_events:RoundEventProps[]):{ round_status:BracketRoundStatus[], group_status:BracketGroupStatus[] } => {
262
+ let round_status:BracketRoundStatus[] = []
263
+ bracket_rounds.map(br => {
264
+ if(br.carry_through){ return round_status.push({ bracket_round_id: br.bracket_round_id, completion_pct: 1 }) }
265
+ let events = round_events.filter(re => re.bracket_round_id == br.bracket_round_id)
266
+ let picks = pbp.filter(pick => pick.status != 'deleted' && events.map(e => e.round_event_id.toString()).includes(pick.round_event_id.toString()))
267
+ let completion_pct = picks.length / events.length
268
+ return round_status.push({ bracket_round_id: br.bracket_round_id, completion_pct })
269
+ })
270
+
271
+ let group_status:BracketGroupStatus[] = []
272
+ bracket_groups.map(bg => {
273
+ let events = round_events.filter(re => re.bracket_group_id == bg.bracket_group_id && !re.no_pick);
274
+ if(events.length == 0){ return group_status.push({ bracket_group_id:bg.bracket_group_id, completion_pct: 1 }) }
275
+ let picks = pbp.filter(pick => pick.status != 'deleted' && events.map(e => e.round_event_id.toString()).includes(pick.round_event_id.toString()))
276
+ let completion_pct = picks.length / events.length
277
+ return group_status.push({ bracket_group_id: bg.bracket_group_id, completion_pct })
278
+ })
279
+
280
+ return { round_status, group_status }
281
+ },
282
+ getNonGroupGames : (round_events:RoundEventProps[], bracket_groups:BracketGroupProps[], player_bracket_picks:PlayerBracketPickProps[]):NonGroupEventProps[] => {
283
+ let non_group_events:NonGroupEventProps[] = []
284
+ let non_group_games = round_events.filter(re => re.bracket_group_id == '0')
285
+ if(non_group_games.length == 0){ return [] }
286
+ let championship_game = round_events.sort((a,b) => b.event_number - a.event_number)[0]
287
+ if(championship_game){
288
+ const champ_pick = player_bracket_picks.find(pbp => pbp.round_event_id == championship_game.round_event_id && pbp.status != 'deleted')
289
+ const away_champ_pick = player_bracket_picks.find(pbp => pbp.round_event_id == championship_game.away_placeholder && pbp.status != 'deleted')
290
+ const home_champ_pick = player_bracket_picks.find(pbp => pbp.round_event_id == championship_game.home_placeholder && pbp.status != 'deleted')
291
+
292
+ non_group_events.push({
293
+ round_event_id: championship_game.round_event_id,
294
+ event_number: championship_game.event_number,
295
+ round_event: championship_game,
296
+ championship: true,
297
+ away_placeholder_pick: away_champ_pick,
298
+ home_placeholder_pick: home_champ_pick,
299
+ player_bracket_pick: champ_pick
300
+ })
301
+ }
302
+ //Find the side of the bracket the game needs to be on
303
+ non_group_games.map(ngg => {
304
+ if(championship_game?.round_event_id == ngg.round_event_id){ return }
305
+ let away_placeholder_game = round_events.find(re => re.round_event_id == ngg.away_placeholder);
306
+ let away_group = bracket_groups.find(bg => bg.bracket_group_id == away_placeholder_game?.bracket_group_id)
307
+ //let home_placeholder_game = round_events.find(re => re.round_event_id == ngg.home_placeholder);
308
+ //let home_group = bracket_groups.find(bg => bg.bracket_group_id == home_placeholder_game?.bracket_group_id)
309
+ let orientation:'left'|'right' = 'left'
310
+ if(away_group?.orientation != 'left'){ orientation = 'right' }
311
+ let pbp = player_bracket_picks.find(pbp => pbp.round_event_id == ngg.round_event_id && pbp.status != 'deleted')
312
+ const away_ff_pick = player_bracket_picks.find(pbp => pbp.round_event_id == ngg.away_placeholder && pbp.status != 'deleted')
313
+ const home_ff_pick = player_bracket_picks.find(pbp => pbp.round_event_id == ngg.home_placeholder && pbp.status != 'deleted')
314
+
315
+ non_group_events.push({
316
+ round_event_id: ngg.round_event_id,
317
+ championship: false,
318
+ orientation,
319
+ player_bracket_pick: pbp,
320
+ round_event: ngg,
321
+ away_placeholder_pick: away_ff_pick,
322
+ home_placeholder_pick: home_ff_pick,
323
+ event_number: ngg.event_number
324
+ })
325
+
326
+ })
327
+
328
+ return non_group_events
329
+ },
330
+ generateCompetitionPlayerBracket : (bracket_competition_id:string, player_bracket_id:string):CompetitionPlayerBracketProps => {
331
+ return {
332
+ competition_player_bracket_id: '',
333
+ bracket_competition_id,
334
+ player_bracket_id,
335
+ place:0,
336
+ possible_points:0,
337
+ player_id: '',
338
+ status: 'active',
339
+ winnings: 0,
340
+ points_scored:0,
341
+ create_datetime: '',
342
+ last_update_datetime: ''
343
+ }
344
+ },
345
+ formatPlace :(place:number) => {
346
+ switch(place){
347
+ case 1:
348
+ return '1st'
349
+ case 2:
350
+ return '2nd'
351
+ case 3:
352
+ return '3rd'
353
+ case 4:
354
+ return '4th'
355
+ case 5:
356
+ return '5th'
357
+ case 6:
358
+ return '6th'
359
+ case 7:
360
+ return '7th'
361
+ case 8:
362
+ return '8th'
363
+ case 9:
364
+ return '9th'
365
+ default:
366
+ return `${place}`
367
+
368
+ }
369
+ },
370
+ }