be-components 6.7.8 → 6.8.0

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 (255) hide show
  1. package/lib/commonjs/Authenticator/index.js +1 -0
  2. package/lib/commonjs/Authenticator/index.js.map +1 -1
  3. package/lib/commonjs/Competition/components/CompetitionInfoCard.js +13 -0
  4. package/lib/commonjs/Competition/components/CompetitionInfoCard.js.map +1 -1
  5. package/lib/commonjs/Competition/components/CompetitionLeaderboard.js +1 -1
  6. package/lib/commonjs/Competition/components/CompetitionLeaderboard.js.map +1 -1
  7. package/lib/commonjs/Competition/index.js +26 -43
  8. package/lib/commonjs/Competition/index.js.map +1 -1
  9. package/lib/commonjs/CompetitionManager/api/index.js +57 -11
  10. package/lib/commonjs/CompetitionManager/api/index.js.map +1 -1
  11. package/lib/commonjs/CompetitionManager/components/AdminCompetitionList.js +406 -287
  12. package/lib/commonjs/CompetitionManager/components/AdminCompetitionList.js.map +1 -1
  13. package/lib/commonjs/CompetitionManager/components/AthleteSelector.js +11 -3
  14. package/lib/commonjs/CompetitionManager/components/AthleteSelector.js.map +1 -1
  15. package/lib/commonjs/CompetitionManager/components/CompanySelector.js +94 -0
  16. package/lib/commonjs/CompetitionManager/components/CompanySelector.js.map +1 -0
  17. package/lib/commonjs/CompetitionManager/components/CompetitionContestsForm.js +135 -107
  18. package/lib/commonjs/CompetitionManager/components/CompetitionContestsForm.js.map +1 -1
  19. package/lib/commonjs/CompetitionManager/components/CompetitionHeader.js +5 -5
  20. package/lib/commonjs/CompetitionManager/components/CompetitionHeader.js.map +1 -1
  21. package/lib/commonjs/CompetitionManager/components/CompetitionInfoForm.js +80 -34
  22. package/lib/commonjs/CompetitionManager/components/CompetitionInfoForm.js.map +1 -1
  23. package/lib/commonjs/CompetitionManager/components/CompetitionMatchMarketCard.js +12 -8
  24. package/lib/commonjs/CompetitionManager/components/CompetitionMatchMarketCard.js.map +1 -1
  25. package/lib/commonjs/CompetitionManager/components/CompetitionSettingsForm.js +36 -30
  26. package/lib/commonjs/CompetitionManager/components/CompetitionSettingsForm.js.map +1 -1
  27. package/lib/commonjs/CompetitionManager/components/ContestSelector.js +4 -2
  28. package/lib/commonjs/CompetitionManager/components/ContestSelector.js.map +1 -1
  29. package/lib/commonjs/CompetitionManager/components/ContestSettingsForm.js +37 -33
  30. package/lib/commonjs/CompetitionManager/components/ContestSettingsForm.js.map +1 -1
  31. package/lib/commonjs/CompetitionManager/components/GroupSelector.js +94 -0
  32. package/lib/commonjs/CompetitionManager/components/GroupSelector.js.map +1 -0
  33. package/lib/commonjs/CompetitionManager/components/MarketSelector.js +21 -12
  34. package/lib/commonjs/CompetitionManager/components/MarketSelector.js.map +1 -1
  35. package/lib/commonjs/CompetitionManager/components/PlayerSelector.js +4 -1
  36. package/lib/commonjs/CompetitionManager/components/PlayerSelector.js.map +1 -1
  37. package/lib/commonjs/CompetitionManager/index.js +44 -49
  38. package/lib/commonjs/CompetitionManager/index.js.map +1 -1
  39. package/lib/commonjs/Components/Toggle.js +2 -1
  40. package/lib/commonjs/Components/Toggle.js.map +1 -1
  41. package/lib/commonjs/CreateEngagement/api/index.js +192 -0
  42. package/lib/commonjs/CreateEngagement/api/index.js.map +1 -0
  43. package/lib/commonjs/CreateEngagement/index.js +1400 -0
  44. package/lib/commonjs/CreateEngagement/index.js.map +1 -0
  45. package/lib/commonjs/MarketComponents/api/index.js +51 -1
  46. package/lib/commonjs/MarketComponents/api/index.js.map +1 -1
  47. package/lib/commonjs/MarketComponents/components/LeagueSchedule.js +210 -0
  48. package/lib/commonjs/MarketComponents/components/LeagueSchedule.js.map +1 -0
  49. package/lib/commonjs/constants/useColors.js +1 -1
  50. package/lib/commonjs/constants/useColors.js.map +1 -1
  51. package/lib/commonjs/index.js +7 -0
  52. package/lib/commonjs/index.js.map +1 -1
  53. package/lib/commonjs/types.d.js.map +1 -1
  54. package/lib/module/Authenticator/index.js +1 -0
  55. package/lib/module/Authenticator/index.js.map +1 -1
  56. package/lib/module/Competition/components/CompetitionInfoCard.js +13 -0
  57. package/lib/module/Competition/components/CompetitionInfoCard.js.map +1 -1
  58. package/lib/module/Competition/components/CompetitionLeaderboard.js +1 -1
  59. package/lib/module/Competition/components/CompetitionLeaderboard.js.map +1 -1
  60. package/lib/module/Competition/index.js +26 -43
  61. package/lib/module/Competition/index.js.map +1 -1
  62. package/lib/module/CompetitionManager/api/index.js +57 -11
  63. package/lib/module/CompetitionManager/api/index.js.map +1 -1
  64. package/lib/module/CompetitionManager/components/AdminCompetitionList.js +391 -272
  65. package/lib/module/CompetitionManager/components/AdminCompetitionList.js.map +1 -1
  66. package/lib/module/CompetitionManager/components/AthleteSelector.js +11 -3
  67. package/lib/module/CompetitionManager/components/AthleteSelector.js.map +1 -1
  68. package/lib/module/CompetitionManager/components/CompanySelector.js +87 -0
  69. package/lib/module/CompetitionManager/components/CompanySelector.js.map +1 -0
  70. package/lib/module/CompetitionManager/components/CompetitionContestsForm.js +135 -107
  71. package/lib/module/CompetitionManager/components/CompetitionContestsForm.js.map +1 -1
  72. package/lib/module/CompetitionManager/components/CompetitionHeader.js +5 -5
  73. package/lib/module/CompetitionManager/components/CompetitionHeader.js.map +1 -1
  74. package/lib/module/CompetitionManager/components/CompetitionInfoForm.js +80 -34
  75. package/lib/module/CompetitionManager/components/CompetitionInfoForm.js.map +1 -1
  76. package/lib/module/CompetitionManager/components/CompetitionMatchMarketCard.js +12 -8
  77. package/lib/module/CompetitionManager/components/CompetitionMatchMarketCard.js.map +1 -1
  78. package/lib/module/CompetitionManager/components/CompetitionSettingsForm.js +36 -30
  79. package/lib/module/CompetitionManager/components/CompetitionSettingsForm.js.map +1 -1
  80. package/lib/module/CompetitionManager/components/ContestSelector.js +4 -2
  81. package/lib/module/CompetitionManager/components/ContestSelector.js.map +1 -1
  82. package/lib/module/CompetitionManager/components/ContestSettingsForm.js +37 -33
  83. package/lib/module/CompetitionManager/components/ContestSettingsForm.js.map +1 -1
  84. package/lib/module/CompetitionManager/components/GroupSelector.js +87 -0
  85. package/lib/module/CompetitionManager/components/GroupSelector.js.map +1 -0
  86. package/lib/module/CompetitionManager/components/MarketSelector.js +21 -12
  87. package/lib/module/CompetitionManager/components/MarketSelector.js.map +1 -1
  88. package/lib/module/CompetitionManager/components/PlayerSelector.js +4 -1
  89. package/lib/module/CompetitionManager/components/PlayerSelector.js.map +1 -1
  90. package/lib/module/CompetitionManager/index.js +45 -50
  91. package/lib/module/CompetitionManager/index.js.map +1 -1
  92. package/lib/module/Components/Toggle.js +2 -1
  93. package/lib/module/Components/Toggle.js.map +1 -1
  94. package/lib/module/CreateEngagement/api/index.js +186 -0
  95. package/lib/module/CreateEngagement/api/index.js.map +1 -0
  96. package/lib/module/CreateEngagement/index.js +1392 -0
  97. package/lib/module/CreateEngagement/index.js.map +1 -0
  98. package/lib/module/MarketComponents/api/index.js +51 -1
  99. package/lib/module/MarketComponents/api/index.js.map +1 -1
  100. package/lib/module/MarketComponents/components/LeagueSchedule.js +202 -0
  101. package/lib/module/MarketComponents/components/LeagueSchedule.js.map +1 -0
  102. package/lib/module/constants/useColors.js +1 -1
  103. package/lib/module/constants/useColors.js.map +1 -1
  104. package/lib/module/index.js +2 -1
  105. package/lib/module/index.js.map +1 -1
  106. package/lib/module/types.d.js.map +1 -1
  107. package/lib/typescript/lib/commonjs/Authenticator/index.d.ts.map +1 -1
  108. package/lib/typescript/lib/commonjs/Competition/components/CompetitionInfoCard.d.ts.map +1 -1
  109. package/lib/typescript/lib/commonjs/Competition/index.d.ts.map +1 -1
  110. package/lib/typescript/lib/commonjs/CompetitionManager/api/index.d.ts +9 -4
  111. package/lib/typescript/lib/commonjs/CompetitionManager/api/index.d.ts.map +1 -1
  112. package/lib/typescript/lib/commonjs/CompetitionManager/components/AdminCompetitionList.d.ts +4 -3
  113. package/lib/typescript/lib/commonjs/CompetitionManager/components/AdminCompetitionList.d.ts.map +1 -1
  114. package/lib/typescript/lib/commonjs/CompetitionManager/components/AthleteSelector.d.ts +3 -1
  115. package/lib/typescript/lib/commonjs/CompetitionManager/components/AthleteSelector.d.ts.map +1 -1
  116. package/lib/typescript/lib/commonjs/CompetitionManager/components/CompanySelector.d.ts +8 -0
  117. package/lib/typescript/lib/commonjs/CompetitionManager/components/CompanySelector.d.ts.map +1 -0
  118. package/lib/typescript/lib/commonjs/CompetitionManager/components/CompetitionContestsForm.d.ts +2 -2
  119. package/lib/typescript/lib/commonjs/CompetitionManager/components/CompetitionContestsForm.d.ts.map +1 -1
  120. package/lib/typescript/lib/commonjs/CompetitionManager/components/CompetitionHeader.d.ts +2 -1
  121. package/lib/typescript/lib/commonjs/CompetitionManager/components/CompetitionHeader.d.ts.map +1 -1
  122. package/lib/typescript/lib/commonjs/CompetitionManager/components/CompetitionInfoForm.d.ts +3 -2
  123. package/lib/typescript/lib/commonjs/CompetitionManager/components/CompetitionInfoForm.d.ts.map +1 -1
  124. package/lib/typescript/lib/commonjs/CompetitionManager/components/CompetitionMatchMarketCard.d.ts.map +1 -1
  125. package/lib/typescript/lib/commonjs/CompetitionManager/components/CompetitionSettingsForm.d.ts +1 -2
  126. package/lib/typescript/lib/commonjs/CompetitionManager/components/CompetitionSettingsForm.d.ts.map +1 -1
  127. package/lib/typescript/lib/commonjs/CompetitionManager/components/ContestSelector.d.ts.map +1 -1
  128. package/lib/typescript/lib/commonjs/CompetitionManager/components/ContestSettingsForm.d.ts +1 -2
  129. package/lib/typescript/lib/commonjs/CompetitionManager/components/ContestSettingsForm.d.ts.map +1 -1
  130. package/lib/typescript/lib/commonjs/CompetitionManager/components/GroupSelector.d.ts +8 -0
  131. package/lib/typescript/lib/commonjs/CompetitionManager/components/GroupSelector.d.ts.map +1 -0
  132. package/lib/typescript/lib/commonjs/CompetitionManager/components/MarketSelector.d.ts.map +1 -1
  133. package/lib/typescript/lib/commonjs/CompetitionManager/components/PlayerSelector.d.ts.map +1 -1
  134. package/lib/typescript/lib/commonjs/CompetitionManager/index.d.ts +4 -1
  135. package/lib/typescript/lib/commonjs/CompetitionManager/index.d.ts.map +1 -1
  136. package/lib/typescript/lib/commonjs/Components/Toggle.d.ts +2 -1
  137. package/lib/typescript/lib/commonjs/Components/Toggle.d.ts.map +1 -1
  138. package/lib/typescript/lib/commonjs/CreateEngagement/api/index.d.ts +39 -0
  139. package/lib/typescript/lib/commonjs/CreateEngagement/api/index.d.ts.map +1 -0
  140. package/lib/typescript/lib/commonjs/CreateEngagement/index.d.ts +18 -0
  141. package/lib/typescript/lib/commonjs/CreateEngagement/index.d.ts.map +1 -0
  142. package/lib/typescript/lib/commonjs/MarketComponents/api/index.d.ts +8 -0
  143. package/lib/typescript/lib/commonjs/MarketComponents/api/index.d.ts.map +1 -1
  144. package/lib/typescript/lib/commonjs/MarketComponents/components/LeagueSchedule.d.ts +8 -0
  145. package/lib/typescript/lib/commonjs/MarketComponents/components/LeagueSchedule.d.ts.map +1 -0
  146. package/lib/typescript/lib/commonjs/index.d.ts +1 -0
  147. package/lib/typescript/lib/commonjs/index.d.ts.map +1 -1
  148. package/lib/typescript/lib/module/Authenticator/index.d.ts.map +1 -1
  149. package/lib/typescript/lib/module/Competition/components/CompetitionInfoCard.d.ts.map +1 -1
  150. package/lib/typescript/lib/module/Competition/index.d.ts.map +1 -1
  151. package/lib/typescript/lib/module/CompetitionManager/api/index.d.ts +9 -4
  152. package/lib/typescript/lib/module/CompetitionManager/api/index.d.ts.map +1 -1
  153. package/lib/typescript/lib/module/CompetitionManager/components/AdminCompetitionList.d.ts +5 -5
  154. package/lib/typescript/lib/module/CompetitionManager/components/AdminCompetitionList.d.ts.map +1 -1
  155. package/lib/typescript/lib/module/CompetitionManager/components/AthleteSelector.d.ts +3 -1
  156. package/lib/typescript/lib/module/CompetitionManager/components/AthleteSelector.d.ts.map +1 -1
  157. package/lib/typescript/lib/module/CompetitionManager/components/CompanySelector.d.ts +8 -0
  158. package/lib/typescript/lib/module/CompetitionManager/components/CompanySelector.d.ts.map +1 -0
  159. package/lib/typescript/lib/module/CompetitionManager/components/CompetitionContestsForm.d.ts +2 -2
  160. package/lib/typescript/lib/module/CompetitionManager/components/CompetitionContestsForm.d.ts.map +1 -1
  161. package/lib/typescript/lib/module/CompetitionManager/components/CompetitionHeader.d.ts +2 -1
  162. package/lib/typescript/lib/module/CompetitionManager/components/CompetitionHeader.d.ts.map +1 -1
  163. package/lib/typescript/lib/module/CompetitionManager/components/CompetitionInfoForm.d.ts +3 -2
  164. package/lib/typescript/lib/module/CompetitionManager/components/CompetitionInfoForm.d.ts.map +1 -1
  165. package/lib/typescript/lib/module/CompetitionManager/components/CompetitionMatchMarketCard.d.ts.map +1 -1
  166. package/lib/typescript/lib/module/CompetitionManager/components/CompetitionSettingsForm.d.ts +1 -2
  167. package/lib/typescript/lib/module/CompetitionManager/components/CompetitionSettingsForm.d.ts.map +1 -1
  168. package/lib/typescript/lib/module/CompetitionManager/components/ContestSelector.d.ts.map +1 -1
  169. package/lib/typescript/lib/module/CompetitionManager/components/ContestSettingsForm.d.ts +1 -2
  170. package/lib/typescript/lib/module/CompetitionManager/components/ContestSettingsForm.d.ts.map +1 -1
  171. package/lib/typescript/lib/module/CompetitionManager/components/GroupSelector.d.ts +8 -0
  172. package/lib/typescript/lib/module/CompetitionManager/components/GroupSelector.d.ts.map +1 -0
  173. package/lib/typescript/lib/module/CompetitionManager/components/MarketSelector.d.ts.map +1 -1
  174. package/lib/typescript/lib/module/CompetitionManager/components/PlayerSelector.d.ts.map +1 -1
  175. package/lib/typescript/lib/module/CompetitionManager/index.d.ts +4 -1
  176. package/lib/typescript/lib/module/CompetitionManager/index.d.ts.map +1 -1
  177. package/lib/typescript/lib/module/Components/Toggle.d.ts +2 -1
  178. package/lib/typescript/lib/module/Components/Toggle.d.ts.map +1 -1
  179. package/lib/typescript/lib/module/CreateEngagement/api/index.d.ts +38 -0
  180. package/lib/typescript/lib/module/CreateEngagement/api/index.d.ts.map +1 -0
  181. package/lib/typescript/lib/module/CreateEngagement/index.d.ts +18 -0
  182. package/lib/typescript/lib/module/CreateEngagement/index.d.ts.map +1 -0
  183. package/lib/typescript/lib/module/MarketComponents/api/index.d.ts +8 -0
  184. package/lib/typescript/lib/module/MarketComponents/api/index.d.ts.map +1 -1
  185. package/lib/typescript/lib/module/MarketComponents/components/LeagueSchedule.d.ts +8 -0
  186. package/lib/typescript/lib/module/MarketComponents/components/LeagueSchedule.d.ts.map +1 -0
  187. package/lib/typescript/lib/module/index.d.ts +2 -1
  188. package/lib/typescript/lib/module/index.d.ts.map +1 -1
  189. package/lib/typescript/src/Competition/components/CompetitionInfoCard.d.ts.map +1 -1
  190. package/lib/typescript/src/Competition/index.d.ts +1 -1
  191. package/lib/typescript/src/Competition/index.d.ts.map +1 -1
  192. package/lib/typescript/src/CompetitionManager/api/index.d.ts +13 -5
  193. package/lib/typescript/src/CompetitionManager/api/index.d.ts.map +1 -1
  194. package/lib/typescript/src/CompetitionManager/components/AdminCompetitionList.d.ts +5 -1
  195. package/lib/typescript/src/CompetitionManager/components/AdminCompetitionList.d.ts.map +1 -1
  196. package/lib/typescript/src/CompetitionManager/components/AthleteSelector.d.ts +4 -2
  197. package/lib/typescript/src/CompetitionManager/components/AthleteSelector.d.ts.map +1 -1
  198. package/lib/typescript/src/CompetitionManager/components/CompanySelector.d.ts +10 -0
  199. package/lib/typescript/src/CompetitionManager/components/CompanySelector.d.ts.map +1 -0
  200. package/lib/typescript/src/CompetitionManager/components/CompetitionContestsForm.d.ts +1 -2
  201. package/lib/typescript/src/CompetitionManager/components/CompetitionContestsForm.d.ts.map +1 -1
  202. package/lib/typescript/src/CompetitionManager/components/CompetitionHeader.d.ts +3 -1
  203. package/lib/typescript/src/CompetitionManager/components/CompetitionHeader.d.ts.map +1 -1
  204. package/lib/typescript/src/CompetitionManager/components/CompetitionInfoForm.d.ts +4 -3
  205. package/lib/typescript/src/CompetitionManager/components/CompetitionInfoForm.d.ts.map +1 -1
  206. package/lib/typescript/src/CompetitionManager/components/CompetitionMatchMarketCard.d.ts.map +1 -1
  207. package/lib/typescript/src/CompetitionManager/components/CompetitionSettingsForm.d.ts +1 -2
  208. package/lib/typescript/src/CompetitionManager/components/CompetitionSettingsForm.d.ts.map +1 -1
  209. package/lib/typescript/src/CompetitionManager/components/ContestSettingsForm.d.ts +1 -2
  210. package/lib/typescript/src/CompetitionManager/components/ContestSettingsForm.d.ts.map +1 -1
  211. package/lib/typescript/src/CompetitionManager/components/GroupSelector.d.ts +10 -0
  212. package/lib/typescript/src/CompetitionManager/components/GroupSelector.d.ts.map +1 -0
  213. package/lib/typescript/src/CompetitionManager/components/MarketSelector.d.ts.map +1 -1
  214. package/lib/typescript/src/CompetitionManager/index.d.ts +5 -1
  215. package/lib/typescript/src/CompetitionManager/index.d.ts.map +1 -1
  216. package/lib/typescript/src/Components/Toggle.d.ts +2 -1
  217. package/lib/typescript/src/Components/Toggle.d.ts.map +1 -1
  218. package/lib/typescript/src/CreateEngagement/api/index.d.ts +29 -0
  219. package/lib/typescript/src/CreateEngagement/api/index.d.ts.map +1 -0
  220. package/lib/typescript/src/CreateEngagement/index.d.ts +21 -0
  221. package/lib/typescript/src/CreateEngagement/index.d.ts.map +1 -0
  222. package/lib/typescript/src/MarketComponents/api/index.d.ts +8 -0
  223. package/lib/typescript/src/MarketComponents/api/index.d.ts.map +1 -1
  224. package/lib/typescript/src/MarketComponents/components/LeagueSchedule.d.ts +10 -0
  225. package/lib/typescript/src/MarketComponents/components/LeagueSchedule.d.ts.map +1 -0
  226. package/lib/typescript/src/index.d.ts +2 -1
  227. package/lib/typescript/src/index.d.ts.map +1 -1
  228. package/package.json +1 -1
  229. package/src/Authenticator/index.tsx +1 -1
  230. package/src/Competition/components/CompetitionInfoCard.tsx +4 -0
  231. package/src/Competition/components/CompetitionLeaderboard.tsx +1 -1
  232. package/src/Competition/index.tsx +16 -29
  233. package/src/CompetitionManager/api/index.ts +49 -6
  234. package/src/CompetitionManager/components/AdminCompetitionList.tsx +247 -176
  235. package/src/CompetitionManager/components/AthleteSelector.tsx +14 -5
  236. package/src/CompetitionManager/components/CompanySelector.tsx +58 -0
  237. package/src/CompetitionManager/components/CompetitionContestsForm.tsx +96 -84
  238. package/src/CompetitionManager/components/CompetitionHeader.tsx +5 -4
  239. package/src/CompetitionManager/components/CompetitionInfoForm.tsx +59 -29
  240. package/src/CompetitionManager/components/CompetitionMatchMarketCard.tsx +9 -14
  241. package/src/CompetitionManager/components/CompetitionSettingsForm.tsx +30 -36
  242. package/src/CompetitionManager/components/ContestSelector.tsx +2 -2
  243. package/src/CompetitionManager/components/ContestSettingsForm.tsx +24 -25
  244. package/src/CompetitionManager/components/GroupSelector.tsx +57 -0
  245. package/src/CompetitionManager/components/MarketSelector.tsx +14 -13
  246. package/src/CompetitionManager/components/PlayerSelector.tsx +1 -1
  247. package/src/CompetitionManager/index.tsx +49 -33
  248. package/src/Components/Toggle.tsx +3 -2
  249. package/src/CreateEngagement/api/index.ts +138 -0
  250. package/src/CreateEngagement/index.tsx +878 -0
  251. package/src/MarketComponents/api/index.ts +60 -1
  252. package/src/MarketComponents/components/LeagueSchedule.tsx +161 -0
  253. package/src/constants/useColors.tsx +1 -1
  254. package/src/index.tsx +2 -0
  255. package/src/types.d.ts +8 -2
@@ -0,0 +1,878 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import { Button, Text, TextInput, View } from "../Components/Themed"
3
+ import type { BracketCompetitionProps, CompanyProps, CompetitionPayoutTypeProps, CompetitionProps, CompetitionResultTypeProps, CompetitionTypeProps, CreateEngagementStepProps, EventProps, FocusPositionProps, GroupProps, LeagueProps, PollProps, PublicPlayerProps, SquaresCompetitionProps } from '../types';
4
+ import { FlatList, Image, type ViewStyle } from 'react-native';
5
+ import { CreateEngagementApi, CreateEngagementHelpers } from './api';
6
+ import { Icons } from '../Components';
7
+ import { useColors } from '../constants/useColors';
8
+ import ImageUploader from '../Components/ImageUploader';
9
+ import moment from 'moment-mini';
10
+ import LeagueSchedule from '../MarketComponents/components/LeagueSchedule';
11
+
12
+ type CreateEngagementProps = {
13
+ player?:PublicPlayerProps,
14
+ onFocusPostiion?:(pos:FocusPositionProps) => void,
15
+ onCreateCompetition:(competition:CompetitionProps) => void,
16
+ onCreateBracketCompetition:(bc:BracketCompetitionProps) => void,
17
+ onCreateSquaresCompetition:(sc:SquaresCompetitionProps) => void,
18
+ onCreateFlashMarket:(fm:PollProps) => void,
19
+ header_style?:ViewStyle,
20
+ footer_style?:ViewStyle,
21
+ float?:boolean,
22
+ onClose:() => void,
23
+ init_engagement?:'competition'|'bracket'|'squares'|'flash'
24
+ group_id?:string,
25
+ company_id?:string
26
+ }
27
+
28
+ const sections = ['header','intro','step','info','groups','companies', 'create', 'image','success']
29
+
30
+
31
+ const steps:CreateEngagementStepProps[] = [
32
+ { step_key: 'intro', num: 1, title: 'BettorEdge Engagements', description: 'Create an engagement and share with friends to play along' },
33
+ { step_key: 'options', num:2, title: 'Engagement Types', description: 'Select an engagement type below to get started!' },
34
+ { step_key: 'group', num:3, title: 'Add Group', description: 'Select one of your groups to add this engagement to!' },
35
+ { step_key: 'company', num:4, title: 'Add Company', description: 'Select one of your companie to add this engagement to!' },
36
+ { step_key: 'image', num:5, title:'Add an Image!', description: 'Add an image to your engagement to make it stand out!' },
37
+ { step_key: 'create', num:6, title: 'Create Engagement', description: 'Complete the step below to create this BettorEdge Engagement!' },
38
+ { step_key: 'success', num:7, title: 'Engagement Successfully Created!', description: 'Your engagement is in pending status. You can activate it when ready from your dashboard or the engagement screen!' }
39
+ ]
40
+
41
+ const CreateEngagement = ({ float, player, init_engagement, onFocusPostiion, group_id, company_id, header_style, footer_style, onClose, onCreateCompetition, onCreateBracketCompetition, onCreateSquaresCompetition, onCreateFlashMarket}:CreateEngagementProps) => {
42
+ const Colors = useColors();
43
+ const [ size, setSize ] = useState({ width:0, height:0 });
44
+ const [ draft_squares, setDraftSquares ] = useState<SquaresCompetitionProps | undefined>(undefined);
45
+ const [ pending_engagement, setPendingEngagement ] = useState<{
46
+ create_loading:boolean,
47
+ competition?:CompetitionProps,
48
+ poll?:PollProps,
49
+ bracket_competition?:BracketCompetitionProps,
50
+ squares_competition?:SquaresCompetitionProps
51
+ }>({
52
+ create_loading: false
53
+ })
54
+ const [ draft_competition, setDraftCompetition ] = useState<undefined | {
55
+ loading:boolean,
56
+ types_visible:boolean,
57
+ results_visible: boolean,
58
+ competition_name:string,
59
+ competition_template_id?:string,
60
+ competition_type?:CompetitionTypeProps,
61
+ pacer_id?:string,
62
+ competition_result_type?:CompetitionResultTypeProps,
63
+ competition_description:string,
64
+ competition_types:CompetitionTypeProps[],
65
+ competition_payout_types:CompetitionPayoutTypeProps[],
66
+ competition_result_types:CompetitionResultTypeProps[]
67
+ }>(undefined);
68
+
69
+ const [ draft_image, setDraftImage ] = useState<any>(undefined);
70
+ const [ active_step, setActiveStep ] = useState<CreateEngagementStepProps>(steps[0] as CreateEngagementStepProps)
71
+ const [ state, setState ] = useState<{
72
+ loading: boolean,
73
+ active_engagment?:'competition'|'squares'|'flash'|'bracket',
74
+ active_group?:GroupProps,
75
+ active_company?:CompanyProps,
76
+ groups:GroupProps[],
77
+ companies:CompanyProps[]
78
+ }>({
79
+ loading:false,
80
+ groups: [],
81
+ companies: []
82
+ });
83
+
84
+ const { active_engagment, groups, companies, active_company, active_group } = state;
85
+
86
+ useEffect(() => {
87
+ CreateEngagementApi.setEnvironment();
88
+ loadStaticData();
89
+ },[player?.player_id])
90
+
91
+ const loadStaticData = async() => {
92
+ setState({ ...state, loading:true });
93
+ let my_grups = await CreateEngagementApi.getMyGroups(0);
94
+ let my_comps = await CreateEngagementApi.getMyCompanies();
95
+ let act_group = my_grups.groups.find(g => g.group_id == group_id);
96
+ let act_company = my_comps.companies.find(c => c.company_id == company_id);
97
+ setState({
98
+ ...state,
99
+ active_group: act_group,
100
+ active_engagment: init_engagement ? init_engagement : active_engagment,
101
+ active_company: act_company,
102
+ groups: my_grups.groups,
103
+ companies: my_comps.companies,
104
+ loading:false
105
+ })
106
+ }
107
+ const errors = CreateEngagementHelpers.isStepValid(active_step, active_engagment, draft_competition, draft_squares);
108
+
109
+ const handleNextStep = async() => {
110
+ if(errors.length > 0){ return alert(errors.map(e => e)) }
111
+ let next_step = steps[active_step.num]
112
+ //if(!next_step){ return }
113
+ switch(active_step.step_key){
114
+ case 'intro':
115
+ if(!next_step){ return }
116
+ return setActiveStep(next_step)
117
+ case 'options':
118
+ let group_step = steps.find(s => s.step_key == 'group');
119
+ let company_step = steps.find(s => s.step_key == 'company');
120
+ let create_step = steps.find(s => s.step_key == 'create');
121
+ if(group_step && groups.length > 0){ return setActiveStep(group_step) }
122
+ if(company_step && companies.length > 0){ return setActiveStep(company_step) }
123
+ if(!create_step){ return }
124
+ return setActiveStep(create_step)
125
+ case 'group':
126
+ let n_company_step = steps.find(s => s.step_key == 'company');
127
+ let n_create_step = steps.find(s => s.step_key == 'create');
128
+ if(n_company_step && companies.length > 0){ return setActiveStep(n_company_step) }
129
+ if(!n_create_step){ return }
130
+ return setActiveStep(n_create_step)
131
+ case 'company':
132
+ if(!next_step){ return }
133
+ return setActiveStep(next_step)
134
+ case 'image':
135
+ if(!next_step){ return }
136
+ return setActiveStep(next_step)
137
+ case 'create':
138
+ switch(active_engagment){
139
+ case 'competition':
140
+ if(!draft_competition){ return }
141
+ if(errors.length > 0){ return alert(errors.map(e => e)) }
142
+ if(!draft_competition.competition_type){ return }
143
+ if(!draft_competition.competition_result_type){ return }
144
+ setPendingEngagement({ ...pending_engagement, create_loading: true });
145
+
146
+ let new_competition = await CreateEngagementApi.createCompetition(
147
+ draft_competition.competition_name,
148
+ draft_competition.competition_description,
149
+ draft_competition.competition_type.competition_type_id,
150
+ draft_competition.competition_result_type.competition_result_type_id,
151
+ active_company?.company_id,
152
+ active_group?.group_id,
153
+ draft_competition.pacer_id,
154
+ draft_competition.competition_template_id,
155
+ undefined,
156
+ draft_image
157
+ )
158
+
159
+ setPendingEngagement({ ...pending_engagement, create_loading: false, competition: new_competition });
160
+ break
161
+ case 'squares':
162
+ if(!draft_squares){ return alert('Unable to process') }
163
+ if(errors.length > 0){ return alert(errors.map(e => e)) }
164
+ setPendingEngagement({ ...pending_engagement, create_loading:true })
165
+ const new_squares_comp = await CreateEngagementApi.createSquaresCompetition({ ...draft_squares, image: draft_image, company_id: active_company?.company_id, group_id: active_group?.group_id});
166
+ setPendingEngagement({ ...pending_engagement, create_loading: false, squares_competition: new_squares_comp });
167
+ break
168
+ default: return //We cdont have one!
169
+ }
170
+
171
+ if(next_step){ setActiveStep(next_step)}
172
+ return
173
+ case 'success':
174
+ switch(active_engagment){
175
+ case 'competition':
176
+ if(!pending_engagement.competition){ return alert('Unable to process') }
177
+ return onCreateCompetition(pending_engagement.competition)
178
+ case 'bracket':
179
+ if(!pending_engagement.bracket_competition){ return alert('Unable to process') }
180
+ return onCreateBracketCompetition(pending_engagement.bracket_competition)
181
+ case 'squares':
182
+ if(!pending_engagement.squares_competition){ return alert('Unable to process') }
183
+ return onCreateSquaresCompetition(pending_engagement.squares_competition)
184
+ case 'flash':
185
+ if(!pending_engagement.poll){ return alert('Unable to process') }
186
+ return onCreateFlashMarket(pending_engagement.poll);
187
+ default: return alert('Unable to process')
188
+ }
189
+ default: return
190
+ }
191
+ }
192
+
193
+ const renderSections = (data:{ item:string, index:number }) => {
194
+ switch(data.item){
195
+ case 'intro':
196
+ if(active_step.step_key != 'intro'){ return <></> }
197
+ return (
198
+ <View>
199
+ <Image
200
+ source={{ uri: 'https://res.cloudinary.com/hoabts6mc/image/upload/w_1000,ar_16:9,c_fill,g_auto,e_sharpen/v1757428505/ChatGPT_Image_Sep_9_2025_09_34_28_AM_vzjage.png' }}
201
+ style={{ width: size.width, height: size.width * 0.5 }}
202
+ resizeMode='cover'
203
+ />
204
+ </View>
205
+ )
206
+ case 'header':
207
+ return (
208
+ <View type='header' style={{ flexDirection:'row', alignItems:'center', padding:10, ...header_style }}>
209
+ {draft_image?.url ?
210
+ <Image
211
+ source={{ uri: draft_image?.url }}
212
+ style={{ height:50, width:50 }}
213
+ resizeMode='cover'
214
+ />
215
+ : active_engagment == 'competition' ?
216
+ <Icons.PickEmIcon size={20} color={Colors.text.h1} />
217
+ : active_engagment == 'bracket' ?
218
+ <Icons.BracketIcon size={20} color={Colors.text.h1} />
219
+ : active_engagment == 'squares' ?
220
+ <Icons.SquaresIcon size={20} color={Colors.text.h1} />
221
+ : <></>}
222
+ <View transparent style={{ flex:1, marginLeft:10, marginRight:10 }}>
223
+ <Text theme='h1'>Create {active_engagment ? active_engagment : 'Engagement'}</Text>
224
+ <Text theme='description'>Follow the steps below to create your engagement</Text>
225
+ </View>
226
+ <Button
227
+ title='X'
228
+ float
229
+ title_color={Colors.text.error}
230
+ onPress={() => onClose()}
231
+ />
232
+ </View>
233
+ )
234
+ case 'step':
235
+ return (
236
+ <View style={{ padding:20 }}>
237
+ <Text theme='h1' size={38}>{active_step.title}</Text>
238
+ <Text theme='description' color={errors.length > 0 ? Colors.text.warning :Colors.text.success} size={16} style={{ marginTop:10 }}>{active_step.description}</Text>
239
+ </View>
240
+ )
241
+ case 'info':
242
+ switch(active_step.step_key){
243
+ case 'intro':
244
+ return <IntroInfo />
245
+ case 'options':
246
+ return (
247
+ <View style={{ padding:10 }}>
248
+ <EngagementOptions active_engagement={active_engagment} onSelectEngagement={(e) => {
249
+ if(e == active_engagment){ return setState({ ...state, active_engagment: undefined }) }
250
+ return setState({ ...state, active_engagment: e })
251
+ }}
252
+ />
253
+ </View>
254
+ )
255
+ default: return <></>
256
+ }
257
+ case 'success':
258
+ if(active_step.step_key != 'success'){ return <></> }
259
+ return (
260
+ <View>
261
+ <Image
262
+ source={{ uri: draft_image?.url }}
263
+ style={{ width: size.width, height: size.width }}
264
+ resizeMode='contain'
265
+ />
266
+ </View>
267
+ )
268
+ case 'image':
269
+ if(active_step.step_key != 'image'){ return <></> }
270
+ return (
271
+ <View style={{ justifyContent:'center', alignItems:'center' }}>
272
+ <ImageUploader
273
+ public_id={`${(Math.random() * 10000000).toFixed()}_${active_engagment}_pic`}
274
+ onFinishUpload={(obj) => setDraftImage({ ...obj, url: obj.secure_url })}
275
+ >
276
+ {draft_image ?
277
+ <Image
278
+ source={{ uri: draft_image.url }}
279
+ style={{ width: size.width, height: size.width }}
280
+ resizeMode='cover'
281
+ />
282
+ :
283
+ <Icons.ImageIcon size={150} color={Colors.text.h1} />
284
+ }
285
+ <Text textAlign='center' style={{ marginTop:15 }} theme='h1' color={Colors.text.action}>{draft_image ? 'CHANGE IMAGE' : "ADD AN IMAGE"}</Text>
286
+ </ImageUploader>
287
+ </View>
288
+ )
289
+ case 'groups':
290
+ if(active_step.step_key != 'group'){ return <></> }
291
+ return (
292
+ <GroupSelector
293
+ groups={groups}
294
+ active_group={active_group}
295
+ onSelectGroup={(g) => setState({ ...state, active_group: g })}
296
+ />
297
+ )
298
+ case 'companies':
299
+ if(active_step.step_key != 'company'){ return <></> }
300
+ return (
301
+ <CompanySelector
302
+ companies={companies}
303
+ active_company={active_company}
304
+ onSelectCompany={(c) => setState({ ...state, active_company: c })}
305
+ />
306
+ )
307
+ case 'create':
308
+ if(active_step.step_key != 'create'){ return <></> }
309
+ switch(active_engagment){
310
+ case 'competition':
311
+ return <CreateCompetition onUpdateDraft={(d) => setDraftCompetition(d)} onFocusPosition={onFocusPostiion} />
312
+ case 'squares':
313
+ return <CreateSquares onUpdateDraft={(d) => setDraftSquares(d)} onFocusPosition={onFocusPostiion}/>
314
+ default: return <></>
315
+ }
316
+ default: return <></>
317
+ }
318
+ }
319
+
320
+ return (
321
+ <View float={float} style={{flex:1}} onLayout={(ev) => {
322
+ const { height, width } = ev.nativeEvent.layout;
323
+ setSize({ height, width });
324
+ }}>
325
+ <View style={{ flex:1 }}>
326
+ <FlatList
327
+ data={sections}
328
+ key={'create_engagement_list'}
329
+ keyExtractor={item => item}
330
+ renderItem={renderSections}
331
+ />
332
+ </View>
333
+ {active_step.step_key == 'intro' ?
334
+ <View type='footer' style={{ flexDirection:'row', alignItems:'center', padding:10, ...footer_style }}>
335
+ <Button
336
+ style={{ flex:1 }}
337
+ title='GET STARTED'
338
+ type='success'
339
+ onPress={() => handleNextStep()}
340
+ />
341
+ </View>
342
+ : active_step.step_key == 'success' ?
343
+ <View type='footer' style={{ flexDirection:'row', alignItems:'center', padding:10, ...footer_style }}>
344
+ <Button
345
+ style={{ flex:1 }}
346
+ title='GO TO YOUR ENGAGEMENT'
347
+ type='success'
348
+ onPress={() => handleNextStep()}
349
+ />
350
+ </View>
351
+ :
352
+ <View type='footer' style={{ flexDirection:'row', alignItems:'center', padding:10 }}>
353
+ <Button float style={{ height:50, width:50, padding:0, justifyContent:'center', alignItems:'center', borderRadius:100 }}
354
+ onPress={() => {
355
+ let prev_step = steps.find(s => s.num == active_step.num - 1)
356
+ if(prev_step?.step_key == 'group' && groups.length == 0){
357
+ prev_step = steps.find(s => s.step_key == 'options')
358
+ }
359
+ if(prev_step?.step_key == 'company' && companies.length == 0){
360
+ prev_step = steps.find(s => s.step_key == 'options')
361
+ }
362
+ if(!prev_step){ return alert('Unable to do it') }
363
+ setActiveStep(prev_step)
364
+ }}
365
+ >
366
+ <Icons.ChevronIcon direction='left' size={14} color={Colors.text.h1} />
367
+ </Button>
368
+ <View style={{ flex:1 }} />
369
+ <Button
370
+ float
371
+ disabled={pending_engagement.create_loading ? true : false}
372
+ loading={pending_engagement.create_loading}
373
+ style={{ padding: active_step.step_key == 'create' ? 10 : 0, height:active_step.step_key == 'create' ? undefined : 50, width:active_step.step_key == 'create' ? undefined : 50, justifyContent:'center', alignItems:'center', borderRadius:100, opacity: errors.length == 0 && !pending_engagement.create_loading ? 1:0.5 }}
374
+ onPress={() => handleNextStep()}>
375
+ {active_step.step_key == 'create' ?
376
+ <Text theme='h1' color={errors.length > 0 ? Colors.text.warning : Colors.text.success}>CREATE</Text>
377
+ :
378
+ <Icons.ChevronIcon direction='right' size={14} color={errors.length == 0 ? Colors.text.success : Colors.text.h1} />
379
+ }
380
+ </Button>
381
+ </View>
382
+ }
383
+ </View>
384
+ )
385
+ }
386
+
387
+ export default CreateEngagement
388
+
389
+
390
+ const IntroInfo = () => {
391
+ return (
392
+ <View style={{ padding:20 }}>
393
+ <Text theme='h1'>🎮 Make It Yours – Create custom pick-ems, competitions, or games in just a few steps</Text>
394
+ <Text theme='h1' style={{ marginTop:20 }}>👥 Play With Friends – Invite your group or the whole BettorEdge community</Text>
395
+ <Text theme='h1' style={{ marginTop:20 }}>📊 Track & Compete – See results, leaderboards, and bragging rights update in real time</Text>
396
+ </View>
397
+ )
398
+ }
399
+
400
+ type EngagementOptionProps = {
401
+ active_engagement?: 'competition'|'squares'|'flash'|'bracket',
402
+ onSelectEngagement: (engagement:'competition'|'squares'|'flash'|'bracket') => void
403
+ }
404
+ const EngagementOptions = ({active_engagement, onSelectEngagement}:EngagementOptionProps) => {
405
+ const Colors = useColors();
406
+ return (
407
+ <View>
408
+ <Button
409
+ key='competition'
410
+ float
411
+ style={{ padding:10, margin:10, flexDirection:'row', alignItems:'center', borderColor:active_engagement == 'competition' ? Colors.text.success: Colors.borders.light }}
412
+ onPress={() => onSelectEngagement('competition')}
413
+ >
414
+ <Icons.PickEmIcon size={50} color={active_engagement == 'competition' ? Colors.text.success :Colors.text.h1} />
415
+ <View transparent style={{ flex:1, marginLeft:10 }}>
416
+ <Text theme='h1' color={active_engagement == 'competition' ? Colors.text.success : Colors.text.h1}>BettorEdge Competition</Text>
417
+ <Text theme='description' color={active_engagement == 'competition' ? Colors.text.success : Colors.text.h1} style={{ marginTop:4 }}>Create a pick-em or wager based competition. Players will pick or wager multiple outcomes. Get more right and climb the leaderboard for large payouts</Text>
418
+ </View>
419
+ </Button>
420
+ <Button
421
+ key='squares'
422
+ float
423
+ style={{ padding:10, margin:10, flexDirection:'row', alignItems:'center', borderColor:active_engagement == 'squares' ? Colors.text.success: Colors.borders.light }}
424
+ onPress={() => onSelectEngagement('squares')}
425
+ >
426
+ <Icons.SquaresIcon size={50} color={active_engagement == 'squares' ? Colors.text.success :Colors.text.h1} />
427
+ <View transparent style={{ flex:1, marginLeft:10 }}>
428
+ <Text theme='h1' color={active_engagement == 'squares' ? Colors.text.success : Colors.text.h1}>Auction Squares</Text>
429
+ <Text theme='description' color={active_engagement == 'squares' ? Colors.text.success : Colors.text.h1} style={{ marginTop:4 }}>Create an auction squares game. Bid on squares until the auction ends. Buy and sell squares throughout the game.</Text>
430
+ </View>
431
+ </Button>
432
+ <Button
433
+ key='bracket'
434
+ float
435
+ style={{ padding:10, margin:10, flexDirection:'row', alignItems:'center', borderColor:active_engagement == 'bracket' ? Colors.text.success: Colors.borders.light }}
436
+ onPress={() => onSelectEngagement('bracket')}
437
+ >
438
+ <Icons.BracketIcon size={50} color={active_engagement == 'bracket' ? Colors.text.success :Colors.text.h1} />
439
+ <View transparent style={{ flex:1, marginLeft:10 }}>
440
+ <Text theme='h1' color={active_engagement == 'bracket' ? Colors.text.success : Colors.text.h1}>Bracket Challenge</Text>
441
+ <Text theme='description' color={active_engagement == 'bracket' ? Colors.text.success : Colors.text.h1} style={{ marginTop:4 }}>Create a bracket. Make picks until the championship. Pick more correctly and win!</Text>
442
+ </View>
443
+ </Button>
444
+ <Button
445
+ key='flash'
446
+ float
447
+ style={{ padding:10, margin:10, flexDirection:'row', alignItems:'center', borderColor:active_engagement == 'flash' ? Colors.text.success: Colors.borders.light }}
448
+ onPress={() => onSelectEngagement('flash')}
449
+ >
450
+ <Icons.FlameIcon size={50} color={active_engagement == 'flash' ? Colors.text.success :Colors.text.h1} />
451
+ <View transparent style={{ flex:1, marginLeft:10 }}>
452
+ <Text theme='h1' color={active_engagement == 'flash' ? Colors.text.success : Colors.text.h1}>Custom Market</Text>
453
+ <Text theme='description' color={active_engagement == 'flash' ? Colors.text.success : Colors.text.h1} style={{ marginTop:4 }}>Create a custom flash market. Players bet on the perimutuel outcomes, get it right and get paid!</Text>
454
+ </View>
455
+ </Button>
456
+ </View>
457
+ )
458
+ }
459
+
460
+ type GroupSelectorProps = {
461
+ active_group?:GroupProps,
462
+ groups:GroupProps[],
463
+ onSelectGroup:(group?:GroupProps) => void
464
+ }
465
+ const GroupSelector = ({ active_group, groups, onSelectGroup }:GroupSelectorProps) => {
466
+ const Colors = useColors();
467
+ const [ visible, setVisible ] = useState(false);
468
+
469
+ const renderGroups = (data:{ item:GroupProps, index:number }) => {
470
+ return (
471
+ <Button
472
+ transparent
473
+ style={{ flexDirection:'row', alignItems:'center', padding:10, borderRadius:0, borderBottomWidth:1, borderColor:Colors.borders.light }}
474
+ onPress={() => { setVisible(false); onSelectGroup(data.item) }}
475
+ >
476
+ <Image
477
+ source={{ uri: data.item.group_image?.url }}
478
+ style={{ height:40, width:40 }}
479
+ resizeMode='cover'
480
+ />
481
+ <View transparent style={{ flex:1, marginLeft:10 }}>
482
+ <Text theme='h1'>{data.item.name}</Text>
483
+ <Text theme='description' style={{ marginTop:3 }}>{data.item.description}</Text>
484
+ </View>
485
+ </Button>
486
+ )
487
+ }
488
+
489
+ return (
490
+ <Button style={{ margin:20 }} float onPress={() => { setVisible(!visible); onSelectGroup(undefined)}}>
491
+ <View transparent style={{ flexDirection:'row', alignItems:'center' }}>
492
+ <Text style={{ flex:1, marginRight:10 }} theme='h1'>{active_group?.name ?? 'No Group'}</Text>
493
+ <Icons.ChevronIcon direction={visible?'up':'down'} color={Colors.text.h1} size={8} />
494
+ </View>
495
+ {visible ?
496
+ <View transparent style={{ marginTop:20 }}>
497
+ <FlatList
498
+ data={groups}
499
+ key={'group_selector'}
500
+ keyExtractor={item => item.group_id.toString()}
501
+ renderItem={renderGroups}
502
+ />
503
+ </View>
504
+ :<></>}
505
+ </Button>
506
+ )
507
+ }
508
+
509
+
510
+
511
+
512
+
513
+ type CompanySelectorProps = {
514
+ active_company?:CompanyProps,
515
+ companies:CompanyProps[],
516
+ onSelectCompany:(c?:CompanyProps) => void
517
+ }
518
+ const CompanySelector = ({ active_company, companies, onSelectCompany }:CompanySelectorProps) => {
519
+ const Colors = useColors();
520
+ const [ visible, setVisible ] = useState(false);
521
+
522
+ const renderCompanies = (data:{ item:CompanyProps, index:number }) => {
523
+ return (
524
+ <Button
525
+ transparent
526
+ style={{ flexDirection:'row', alignItems:'center', padding:10, borderRadius:0, borderBottomWidth:1, borderColor:Colors.borders.light }}
527
+ onPress={() => { setVisible(false); onSelectCompany(data.item) }}
528
+ >
529
+ <Image
530
+ source={{ uri: data.item.company_image?.url }}
531
+ style={{ height:40, width:40 }}
532
+ resizeMode='cover'
533
+ />
534
+ <View transparent style={{ flex:1, marginLeft:10 }}>
535
+ <Text theme='h1'>{data.item.company_name}</Text>
536
+ <Text theme='description' style={{ marginTop:3 }}>{data.item.company_description}</Text>
537
+ </View>
538
+ </Button>
539
+ )
540
+ }
541
+
542
+ return (
543
+ <Button style={{ margin:20 }} float onPress={() => { setVisible(!visible); onSelectCompany(undefined) }}>
544
+ <View transparent style={{ flexDirection:'row', alignItems:'center' }}>
545
+ <Text style={{ flex:1, marginRight:10 }} theme='h1'>{active_company?.company_name ?? 'No Company'}</Text>
546
+ <Icons.ChevronIcon direction={visible?'up':'down'} color={Colors.text.h1} size={8} />
547
+ </View>
548
+ {visible ?
549
+ <View transparent style={{ marginTop:20 }}>
550
+ <FlatList
551
+ data={companies}
552
+ key={'company_selector'}
553
+ keyExtractor={item => item.company_id.toString()}
554
+ renderItem={renderCompanies}
555
+ />
556
+ </View>
557
+ :<></>}
558
+ </Button>
559
+ )
560
+ }
561
+
562
+
563
+ type SCProps = {
564
+ onFocusPosition?:(pos:FocusPositionProps) => void,
565
+ onUpdateDraft:(draft_sq_comp:SquaresCompetitionProps) => void
566
+ }
567
+
568
+ const CreateSquares = ({onFocusPosition, onUpdateDraft}:SCProps) => {
569
+ const Colors = useColors();
570
+ const [ draft, setDraft ] = useState<SquaresCompetitionProps>(CreateEngagementHelpers.generateSquaresComp());
571
+ const [ sq_data, setSQData ] = useState<{
572
+ leagues:LeagueProps[],
573
+ leagues_visible:boolean,
574
+ active_league?:LeagueProps,
575
+ league_schedule:boolean,
576
+ active_event?:EventProps,
577
+ }>({
578
+ leagues:[],
579
+ leagues_visible:false,
580
+ league_schedule: false
581
+ });
582
+ const { leagues, leagues_visible, league_schedule, active_league, active_event } = sq_data;
583
+
584
+ useEffect(() => {
585
+ getData()
586
+ },[]);
587
+
588
+ const getData = async() => {
589
+ const lgs = await CreateEngagementApi.getLeagues();
590
+ setSQData({ ...sq_data, leagues: lgs.filter(l => l.sport.toLowerCase() == 'football') });
591
+ }
592
+
593
+ useEffect(() => {
594
+ onUpdateDraft(draft);
595
+ },[JSON.stringify(draft)])
596
+
597
+ const renderLeagues = (data:{item:LeagueProps, index:number}) => {
598
+ const selected = active_league?.league_id == data.item.league_id ? true : false
599
+
600
+ return (
601
+ <Button
602
+ transparent
603
+ style={{ flexDirection:'row', borderRadius:0, padding:10, alignItems:'center', borderBottomWidth:1, borderColor:Colors.borders.light }}
604
+ onPress={() => setSQData({ ...sq_data, active_league: selected?undefined : data.item, leagues_visible:false, league_schedule: selected?false:true })}
605
+ >
606
+ <Image
607
+ source={{ uri: data.item.league_image }}
608
+ style={{ height:30, width:30 }}
609
+ resizeMode='contain'
610
+ />
611
+ <View transparent style={{ flex:1, marginLeft:10 }}>
612
+ <Text theme='h1'>{data.item.league_name}</Text>
613
+ <Text theme='description' style={{ marginTop:3 }}>{data.item.sport}</Text>
614
+ </View>
615
+ </Button>
616
+ )
617
+ }
618
+
619
+ return (
620
+ <View>
621
+ <View style={{ padding:10 }}>
622
+ <Text theme='h1' style={{ marginBottom:10 }}>Competition Name</Text>
623
+ <TextInput
624
+ placeholder='Add Name here...'
625
+ value={draft.sq_comp_name}
626
+ onFocusPosition={onFocusPosition}
627
+ style={{ borderColor:draft.sq_comp_name ? Colors.text.success : Colors.text.warning }}
628
+ onChangeText={(text) => setDraft({ ...draft, sq_comp_name: text })}
629
+ />
630
+ </View>
631
+ <View style={{ padding:10 }}>
632
+ <Text theme='h1' style={{ marginBottom:10 }}>Competition Description</Text>
633
+ <TextInput
634
+ placeholder='Add Decription here...'
635
+ onFocusPosition={onFocusPosition}
636
+ value={draft.sq_comp_description}
637
+ style={{ borderColor:draft.sq_comp_description ? Colors.text.success : Colors.text.warning }}
638
+ onChangeText={(text) => setDraft({ ...draft, sq_comp_description: text })}
639
+ />
640
+ </View>
641
+ <View style={{ padding:10 }}>
642
+ <Text theme='h1' style={{ marginBottom:10 }}>Squares Event</Text>
643
+ <Button float style={{ borderColor:active_league?Colors.text.success:Colors.text.warning }} onPress={() => setSQData({ ...sq_data, leagues_visible: !leagues_visible })}>
644
+ <View transparent style={{ flexDirection:'row', alignItems:'center' }}>
645
+ <Text style={{ flex:1, marginRight:10 }} theme='h1'>{active_league?.league_name ?? 'Select League'}</Text>
646
+ <Icons.ChevronIcon direction={leagues_visible?'up':'down'} color={Colors.text.h1} size={8} />
647
+ </View>
648
+ {leagues_visible ?
649
+ <View transparent style={{ marginTop:20 }}>
650
+ <FlatList
651
+ data={leagues.sort((a,b) => a.priority - b.priority)}
652
+ key={'competition_reult_types'}
653
+ keyExtractor={item => item.league_id.toString()}
654
+ renderItem={renderLeagues}
655
+ />
656
+ </View>
657
+ :<></>}
658
+ </Button>
659
+ </View>
660
+ <View float style={{ margin:10 }}>
661
+ {active_league && league_schedule ?
662
+ <LeagueSchedule
663
+ onSelectEvent={(e) => {
664
+ setSQData({ ...sq_data, active_event: e, league_schedule:false });
665
+ setDraft({ ...draft, sport: active_league?.league_name, begin_datetime: moment(e.scheduled_datetime).add(4, 'minutes'), event_id: e.event_id })
666
+ }}
667
+ league={active_league}
668
+ active_event={active_event?.event_id}
669
+ />
670
+ : active_event ?
671
+ <Button style={{ borderColor:active_event?Colors.text.success:Colors.text.warning }} float onPress={() => setSQData({ ...sq_data, league_schedule: true })}>
672
+ <Text theme='h1'>{active_event.event_title}</Text>
673
+ </Button>
674
+ :<></>}
675
+ </View>
676
+ </View>
677
+ )
678
+ }
679
+
680
+ type CCProps = {
681
+ onFocusPosition?:(pos:FocusPositionProps) => void,
682
+ onUpdateDraft:(draft: {
683
+ loading:boolean,
684
+ types_visible:boolean,
685
+ results_visible: boolean,
686
+ competition_name:string,
687
+ competition_type?:CompetitionTypeProps,
688
+ competition_result_type?:CompetitionResultTypeProps,
689
+ competition_description:string,
690
+ competition_types:CompetitionTypeProps[],
691
+ competition_payout_types:CompetitionPayoutTypeProps[],
692
+ competition_result_types:CompetitionResultTypeProps[]
693
+ }) => void
694
+ }
695
+
696
+ const CreateCompetition = ({ onFocusPosition, onUpdateDraft }:CCProps) => {
697
+ const Colors = useColors();
698
+ const [ templates, setTemplates ] = useState<CompetitionProps[]>([]);
699
+ const [ draft, setDraft ] = useState<{
700
+ loading:boolean,
701
+ templates_visible:boolean,
702
+ types_visible:boolean,
703
+ results_visible: boolean,
704
+ pacer_id?:string,
705
+ competition_template_id?:string,
706
+ competition_name:string,
707
+ competition_type?:CompetitionTypeProps,
708
+ competition_result_type?:CompetitionResultTypeProps,
709
+ competition_description:string,
710
+ competition_types:CompetitionTypeProps[],
711
+ competition_payout_types:CompetitionPayoutTypeProps[],
712
+ competition_result_types:CompetitionResultTypeProps[]
713
+ }>({
714
+ loading: false, templates_visible:false, types_visible:false, results_visible: false, competition_description:'', competition_name:'', competition_payout_types:[], competition_result_types:[], competition_types:[]
715
+ });
716
+ const { competition_name, competition_template_id, templates_visible, competition_description,competition_result_types, types_visible, competition_types, results_visible, competition_type, competition_result_type } = draft;
717
+ const template = templates.find(t => t.competition_id == competition_template_id)
718
+ useEffect(() => {
719
+ getData();
720
+ },[]);
721
+
722
+ useEffect(() => {
723
+ onUpdateDraft(draft)
724
+ },[JSON.stringify(draft)])
725
+
726
+ const getData = async() => {
727
+ setDraft({ ...draft, loading:true });
728
+ CreateEngagementApi.setEnvironment();
729
+ let options = await CreateEngagementApi.getCompetitionOptions();
730
+ let temps = await CreateEngagementApi.getTemplateCompetitions();
731
+ setDraft({
732
+ ...draft,
733
+ loading: false,
734
+ competition_result_types: options.competition_result_types,
735
+ competition_types: options.competition_types,
736
+ competition_payout_types:options.competition_payout_types,
737
+ });
738
+ setTemplates(temps)
739
+ }
740
+
741
+ const renderCompetitionTypes = (data:{item:CompetitionTypeProps, index:number}) => {
742
+ return (
743
+ <Button
744
+ transparent
745
+ style={{ flexDirection:'row', borderRadius:0, padding:10, alignItems:'center', borderBottomWidth:1, borderColor:Colors.borders.light }}
746
+ onPress={() => setDraft({ ...draft, competition_type: data.item, types_visible: false })}
747
+ >
748
+ <View transparent style={{ flex:1 }}>
749
+ <Text theme='h1'>{data.item.type_label}</Text>
750
+ <Text theme='description' style={{ marginTop:3 }}>{data.item.description}</Text>
751
+ </View>
752
+ </Button>
753
+ )
754
+ }
755
+
756
+ const renderTemplates = (data:{item:CompetitionProps, index:number}) => {
757
+ const selected = competition_template_id == data.item.competition_id ? true : false
758
+ const comp_type = competition_types.find(ct => ct.competition_type_id == data.item.competition_type_id)
759
+ const comp_result = competition_result_types.find(crt => crt.competition_result_type_id == data.item.competition_result_type_id);
760
+ if(!comp_type || !comp_result){ return <></> }
761
+ return (
762
+ <Button
763
+ transparent
764
+ style={{ flexDirection:'row', borderRadius:0, padding:10, alignItems:'center', borderBottomWidth:1, borderColor:Colors.borders.light }}
765
+ onPress={() => setDraft({ ...draft, competition_template_id: selected ? undefined : data.item.competition_id, templates_visible: false, competition_type:selected?undefined:comp_type, competition_result_type:selected ? undefined: comp_result })}
766
+ >
767
+ <Image
768
+ source={{ uri: data.item.image?.url }}
769
+ style={{ height:30, width:30 }}
770
+ resizeMode='contain'
771
+ />
772
+ <View transparent style={{ flex:1, marginLeft:10 }}>
773
+ <Text theme='h1'>{data.item.competition_name}</Text>
774
+ <Text theme='description' style={{ marginTop:3 }}>{data.item.competition_description}</Text>
775
+ </View>
776
+ </Button>
777
+ )
778
+ }
779
+
780
+ const renderResultTypes = (data:{item:CompetitionResultTypeProps, index:number}) => {
781
+ return (
782
+ <Button
783
+ transparent
784
+ style={{ flexDirection:'row', borderRadius:0, padding:10, alignItems:'center', borderBottomWidth:1, borderColor:Colors.borders.light }}
785
+ onPress={() => setDraft({ ...draft, competition_result_type: data.item, results_visible: false })}
786
+ >
787
+ <View transparent style={{ flex:1 }}>
788
+ <Text theme='h1'>{data.item.label}</Text>
789
+ <Text theme='description' style={{ marginTop:3 }}>{data.item.description}</Text>
790
+ </View>
791
+ </Button>
792
+ )
793
+ }
794
+
795
+ return (
796
+ <View style={{ padding:10 }}>
797
+ <View style={{ padding:10 }}>
798
+ <Text theme='h1' style={{ marginBottom:10 }}>Competition Name</Text>
799
+ <TextInput
800
+ placeholder='Add Name here...'
801
+ value={competition_name}
802
+ onFocusPosition={onFocusPosition}
803
+ style={{ borderColor:competition_name ? Colors.text.success : Colors.text.warning }}
804
+ onChangeText={(text) => setDraft({ ...draft, competition_name: text })}
805
+ />
806
+ </View>
807
+ <View style={{ padding:10 }}>
808
+ <Text theme='h1' style={{ marginBottom:10 }}>Competition Description</Text>
809
+ <TextInput
810
+ placeholder='Add Decription here...'
811
+ value={competition_description}
812
+ onFocusPosition={onFocusPosition}
813
+ style={{ borderColor:competition_description ? Colors.text.success : Colors.text.warning }}
814
+ onChangeText={(text) => setDraft({ ...draft, competition_description: text })}
815
+ />
816
+ </View>
817
+ {templates.length > 0 ?
818
+ <View style={{ padding:10 }}>
819
+ <Text theme='h1' style={{ marginBottom:10 }}>Templates</Text>
820
+ <Button float onPress={() => setDraft({ ...draft, templates_visible: !templates_visible, competition_template_id:undefined })}>
821
+ <View transparent style={{ flexDirection:'row', alignItems:'center' }}>
822
+ <Text style={{ flex:1, marginRight:10 }} theme='h1'>{template?.competition_name ?? 'Select Template'}</Text>
823
+ <Icons.ChevronIcon direction={templates_visible?'up':'down'} color={Colors.text.h1} size={8} />
824
+ </View>
825
+ {templates_visible ?
826
+ <View transparent style={{ marginTop:20 }}>
827
+ <FlatList
828
+ data={templates.sort((a,b) => moment(a.scheduled_datetime).unix() - moment(b.scheduled_datetime).unix())}
829
+ key={'templates_list'}
830
+ keyExtractor={item => item.competition_id.toString()}
831
+ renderItem={renderTemplates}
832
+ />
833
+ </View>
834
+ :<></>}
835
+ </Button>
836
+ </View>
837
+ :<></>}
838
+ <View style={{ padding:10 }}>
839
+ <Text theme='h1' style={{ marginBottom:10 }}>Competition Type</Text>
840
+ <Button float style={{ borderColor:competition_type ? Colors.text.success: Colors.text.warning }} onPress={() => setDraft({ ...draft, types_visible: !types_visible })}>
841
+ <View transparent style={{ flexDirection:'row', alignItems:'center' }}>
842
+ <Text style={{ flex:1, marginRight:10 }} theme='h1'>{competition_type?.type_label ?? 'Select Type'}</Text>
843
+ <Icons.ChevronIcon direction={types_visible?'up':'down'} color={Colors.text.h1} size={8} />
844
+ </View>
845
+ {types_visible ?
846
+ <View transparent style={{ marginTop:20 }}>
847
+ <FlatList
848
+ data={competition_types.sort((a,b) => a.type_label.localeCompare(b.type_label))}
849
+ key={'competition_types'}
850
+ keyExtractor={item => item.competition_type_id.toString()}
851
+ renderItem={renderCompetitionTypes}
852
+ />
853
+ </View>
854
+ :<></>}
855
+ </Button>
856
+ </View>
857
+ <View style={{ padding:10 }}>
858
+ <Text theme='h1' style={{ marginBottom:10 }}>Payout Type</Text>
859
+ <Button float style={{ borderColor:competition_result_type ? Colors.text.success: Colors.text.warning }} onPress={() => setDraft({ ...draft, results_visible: !results_visible })}>
860
+ <View transparent style={{ flexDirection:'row', alignItems:'center' }}>
861
+ <Text style={{ flex:1, marginRight:10 }} theme='h1'>{competition_result_type?.label ?? 'Select Payout'}</Text>
862
+ <Icons.ChevronIcon direction={results_visible?'up':'down'} color={Colors.text.h1} size={8} />
863
+ </View>
864
+ {results_visible ?
865
+ <View transparent style={{ marginTop:20 }}>
866
+ <FlatList
867
+ data={competition_result_types.sort((a,b) => a.label.localeCompare(b.label))}
868
+ key={'competition_reult_types'}
869
+ keyExtractor={item => item.competition_result_type_id.toString()}
870
+ renderItem={renderResultTypes}
871
+ />
872
+ </View>
873
+ :<></>}
874
+ </Button>
875
+ </View>
876
+ </View>
877
+ )
878
+ }