be-components 6.7.8 → 6.7.9

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