be-components 1.9.7 → 1.9.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 (115) hide show
  1. package/lib/commonjs/Components/Icons.js +186 -0
  2. package/lib/commonjs/Components/Icons.js.map +1 -1
  3. package/lib/commonjs/Components/ViewportObserver.js.map +1 -1
  4. package/lib/commonjs/MarketComponents/api/index.js +10 -1
  5. package/lib/commonjs/MarketComponents/api/index.js.map +1 -1
  6. package/lib/commonjs/MarketComponents/components/AthleteMarket/index.js +7 -2
  7. package/lib/commonjs/MarketComponents/components/AthleteMarket/index.js.map +1 -1
  8. package/lib/commonjs/MarketComponents/components/BetScopeIndicator.js +19 -0
  9. package/lib/commonjs/MarketComponents/components/BetScopeIndicator.js.map +1 -0
  10. package/lib/commonjs/MarketComponents/components/MarketButton/index.js +6 -1
  11. package/lib/commonjs/MarketComponents/components/MarketButton/index.js.map +1 -1
  12. package/lib/commonjs/MarketComponents/components/OrderGradeBar.js +2 -2
  13. package/lib/commonjs/MarketComponents/components/OrderGradeBar.js.map +1 -1
  14. package/lib/commonjs/MarketComponents/components/TeamEventMarket/index.js +125 -6
  15. package/lib/commonjs/MarketComponents/components/TeamEventMarket/index.js.map +1 -1
  16. package/lib/commonjs/Poll/components/CampaignHeader.js +53 -0
  17. package/lib/commonjs/Poll/components/CampaignHeader.js.map +1 -0
  18. package/lib/commonjs/Poll/components/CampaignLeaderboard.js +295 -0
  19. package/lib/commonjs/Poll/components/CampaignLeaderboard.js.map +1 -0
  20. package/lib/commonjs/Poll/components/CampaignPlay.js +11 -89
  21. package/lib/commonjs/Poll/components/CampaignPlay.js.map +1 -1
  22. package/lib/commonjs/Poll/components/CampaignProgressBar.js +0 -1
  23. package/lib/commonjs/Poll/components/CampaignProgressBar.js.map +1 -1
  24. package/lib/commonjs/Poll/components/CampaignResult.js +44 -345
  25. package/lib/commonjs/Poll/components/CampaignResult.js.map +1 -1
  26. package/lib/commonjs/Poll/components/PollCard.js +2 -1
  27. package/lib/commonjs/Poll/components/PollCard.js.map +1 -1
  28. package/lib/commonjs/Poll/components/PollQuestionsSection.js +81 -0
  29. package/lib/commonjs/Poll/components/PollQuestionsSection.js.map +1 -0
  30. package/lib/commonjs/Poll/components/PollSelectCard.js +1 -2
  31. package/lib/commonjs/Poll/components/PollSelectCard.js.map +1 -1
  32. package/lib/commonjs/Poll/index.js +132 -36
  33. package/lib/commonjs/Poll/index.js.map +1 -1
  34. package/lib/module/Components/Icons.js +186 -0
  35. package/lib/module/Components/Icons.js.map +1 -1
  36. package/lib/module/Components/ViewportObserver.js.map +1 -1
  37. package/lib/module/MarketComponents/api/index.js +10 -1
  38. package/lib/module/MarketComponents/api/index.js.map +1 -1
  39. package/lib/module/MarketComponents/components/AthleteMarket/index.js +8 -3
  40. package/lib/module/MarketComponents/components/AthleteMarket/index.js.map +1 -1
  41. package/lib/module/MarketComponents/components/BetScopeIndicator.js +12 -0
  42. package/lib/module/MarketComponents/components/BetScopeIndicator.js.map +1 -0
  43. package/lib/module/MarketComponents/components/MarketButton/index.js +6 -1
  44. package/lib/module/MarketComponents/components/MarketButton/index.js.map +1 -1
  45. package/lib/module/MarketComponents/components/OrderGradeBar.js +2 -2
  46. package/lib/module/MarketComponents/components/OrderGradeBar.js.map +1 -1
  47. package/lib/module/MarketComponents/components/TeamEventMarket/index.js +126 -7
  48. package/lib/module/MarketComponents/components/TeamEventMarket/index.js.map +1 -1
  49. package/lib/module/Poll/components/CampaignHeader.js +46 -0
  50. package/lib/module/Poll/components/CampaignHeader.js.map +1 -0
  51. package/lib/module/Poll/components/CampaignLeaderboard.js +286 -0
  52. package/lib/module/Poll/components/CampaignLeaderboard.js.map +1 -0
  53. package/lib/module/Poll/components/CampaignPlay.js +11 -89
  54. package/lib/module/Poll/components/CampaignPlay.js.map +1 -1
  55. package/lib/module/Poll/components/CampaignProgressBar.js +0 -1
  56. package/lib/module/Poll/components/CampaignProgressBar.js.map +1 -1
  57. package/lib/module/Poll/components/CampaignResult.js +48 -348
  58. package/lib/module/Poll/components/CampaignResult.js.map +1 -1
  59. package/lib/module/Poll/components/PollCard.js +2 -1
  60. package/lib/module/Poll/components/PollCard.js.map +1 -1
  61. package/lib/module/Poll/components/PollQuestionsSection.js +72 -0
  62. package/lib/module/Poll/components/PollQuestionsSection.js.map +1 -0
  63. package/lib/module/Poll/components/PollSelectCard.js +1 -2
  64. package/lib/module/Poll/components/PollSelectCard.js.map +1 -1
  65. package/lib/module/Poll/index.js +133 -38
  66. package/lib/module/Poll/index.js.map +1 -1
  67. package/lib/typescript/src/Components/Icons.d.ts +2 -0
  68. package/lib/typescript/src/Components/Icons.d.ts.map +1 -1
  69. package/lib/typescript/src/Components/ViewportObserver.d.ts.map +1 -1
  70. package/lib/typescript/src/MarketComponents/api/index.d.ts +1 -0
  71. package/lib/typescript/src/MarketComponents/api/index.d.ts.map +1 -1
  72. package/lib/typescript/src/MarketComponents/components/AthleteMarket/index.d.ts +2 -2
  73. package/lib/typescript/src/MarketComponents/components/AthleteMarket/index.d.ts.map +1 -1
  74. package/lib/typescript/src/MarketComponents/components/BetScopeIndicator.d.ts +7 -0
  75. package/lib/typescript/src/MarketComponents/components/BetScopeIndicator.d.ts.map +1 -0
  76. package/lib/typescript/src/MarketComponents/components/MarketButton/index.d.ts +2 -2
  77. package/lib/typescript/src/MarketComponents/components/MarketButton/index.d.ts.map +1 -1
  78. package/lib/typescript/src/MarketComponents/components/TeamEventMarket/index.d.ts +4 -2
  79. package/lib/typescript/src/MarketComponents/components/TeamEventMarket/index.d.ts.map +1 -1
  80. package/lib/typescript/src/MarketComponents/index.d.ts +5 -4
  81. package/lib/typescript/src/MarketComponents/index.d.ts.map +1 -1
  82. package/lib/typescript/src/Poll/components/CampaignHeader.d.ts +9 -0
  83. package/lib/typescript/src/Poll/components/CampaignHeader.d.ts.map +1 -0
  84. package/lib/typescript/src/Poll/components/CampaignLeaderboard.d.ts +12 -0
  85. package/lib/typescript/src/Poll/components/CampaignLeaderboard.d.ts.map +1 -0
  86. package/lib/typescript/src/Poll/components/CampaignPlay.d.ts.map +1 -1
  87. package/lib/typescript/src/Poll/components/CampaignProgressBar.d.ts.map +1 -1
  88. package/lib/typescript/src/Poll/components/CampaignResult.d.ts +3 -7
  89. package/lib/typescript/src/Poll/components/CampaignResult.d.ts.map +1 -1
  90. package/lib/typescript/src/Poll/components/PollCard.d.ts.map +1 -1
  91. package/lib/typescript/src/Poll/components/PollQuestionsSection.d.ts +11 -0
  92. package/lib/typescript/src/Poll/components/PollQuestionsSection.d.ts.map +1 -0
  93. package/lib/typescript/src/Poll/components/PollSelectCard.d.ts +1 -2
  94. package/lib/typescript/src/Poll/components/PollSelectCard.d.ts.map +1 -1
  95. package/lib/typescript/src/Poll/index.d.ts +4 -2
  96. package/lib/typescript/src/Poll/index.d.ts.map +1 -1
  97. package/package.json +1 -1
  98. package/src/Components/Icons.tsx +64 -0
  99. package/src/Components/ViewportObserver.tsx +2 -4
  100. package/src/MarketComponents/api/index.ts +10 -1
  101. package/src/MarketComponents/components/AthleteMarket/index.tsx +12 -4
  102. package/src/MarketComponents/components/BetScopeIndicator.tsx +17 -0
  103. package/src/MarketComponents/components/MarketButton/index.tsx +5 -2
  104. package/src/MarketComponents/components/OrderGradeBar.tsx +2 -2
  105. package/src/MarketComponents/components/TeamEventMarket/index.tsx +75 -10
  106. package/src/Poll/components/CampaignHeader.tsx +35 -0
  107. package/src/Poll/components/CampaignLeaderboard.tsx +181 -0
  108. package/src/Poll/components/CampaignPlay.tsx +11 -82
  109. package/src/Poll/components/CampaignProgressBar.tsx +0 -1
  110. package/src/Poll/components/CampaignResult.tsx +42 -162
  111. package/src/Poll/components/PollCard.tsx +2 -1
  112. package/src/Poll/components/PollQuestionsSection.tsx +66 -0
  113. package/src/Poll/components/PollSelectCard.tsx +2 -3
  114. package/src/Poll/index.tsx +120 -31
  115. package/src/types.d.ts +1 -0
@@ -1199,13 +1199,77 @@ const MarketClosedIcon = ({color, size}:IconProps) => {
1199
1199
  )
1200
1200
  }
1201
1201
 
1202
+ const QuestionIcon = ({ color, size }:IconProps) => {
1203
+ return (
1204
+ <svg width={`${size ?? 18}`} height={`${size ?? 18}`} viewBox="0 0 26 26" version="1.1" xmlns="http://www.w3.org/2000/svg">
1205
+ <title>question-circle-svgrepo-com</title>
1206
+ <g id="ss" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
1207
+ <g id="question-circle-svgrepo-com" transform="translate(1.000000, 1.000000)">
1208
+ <path d="M9.75,8.25 C9.75,7.007364 10.7574,6 12,6 C13.2426,6 14.25,7.007364 14.25,8.25 C14.25,9.07494 13.806,9.7962 13.14408,10.18788 C12.5736,10.52532 12,11.03724 12,11.7 L12,13.2" id="Path" stroke={color ?? Colors.brand.midnight} stroke-width="2" stroke-linecap="round"></path>
1209
+ <circle id="Oval" fill={color ?? Colors.brand.midnight} fill-rule="nonzero" cx="12" cy="16.8" r="1.2"></circle>
1210
+ <path d="M6,1.605384 C7.765044,0.584364 9.81432,0 12,0 C18.62736,0 24,5.37258 24,12 C24,18.62736 18.62736,24 12,24 C5.37258,24 0,18.62736 0,12 C0,9.81432 0.584364,7.765044 1.605384,6" id="Path" stroke={color ?? Colors.brand.midnight} stroke-width="2" stroke-linecap="round"></path>
1211
+ </g>
1212
+ </g>
1213
+ </svg>
1214
+ )
1215
+ }
1216
+
1217
+ const BetScopeSuccessIcon = ({ size }:IconProps) => {
1218
+ return (
1219
+ <svg width={`${size ?? 18}`} height={`${size ?? 18}`} viewBox="0 0 38 38" version="1.1" xmlns="http://www.w3.org/2000/svg">
1220
+ <title>Group 2</title>
1221
+ <defs>
1222
+ <path d="M30.2225952,11.2208759 C28.2270706,5.27982546 22.6133387,1 16,1 C9.38651858,1 3.7726871,5.28001018 1.77727561,11.2212605 M1.30519687,12.9747777 C1.10509087,13.9519227 1,14.9636887 1,16 C1,22.5314971 5.17455318,28.087975 11.0010783,30.1468525 M12.972972,30.6944332 C13.9506762,30.8947796 14.9630503,31 16,31 C24.2842712,31 31,24.2842712 31,16 C31,15.0071351 30.9035361,14.0368005 30.7194692,13.0978572" id="path-1"></path>
1223
+ <filter x="-21.7%" y="-15.0%" width="143.3%" height="143.3%" filterUnits="objectBoundingBox" id="filter-2">
1224
+ <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
1225
+ <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
1226
+ <feMorphology radius="1" operator="erode" in="SourceAlpha" result="shadowInner"></feMorphology>
1227
+ <feOffset dx="0" dy="2" in="shadowInner" result="shadowInner"></feOffset>
1228
+ <feComposite in="shadowOffsetOuter1" in2="shadowInner" operator="out" result="shadowOffsetOuter1"></feComposite>
1229
+ <feGaussianBlur stdDeviation="1.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
1230
+ <feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
1231
+ </filter>
1232
+ <path d="M17,5 C10.372583,5 5,10.372583 5,17" id="path-3"></path>
1233
+ <filter x="-66.7%" y="-50.0%" width="233.3%" height="233.3%" filterUnits="objectBoundingBox" id="filter-4">
1234
+ <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
1235
+ <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
1236
+ <feMorphology radius="1" operator="erode" in="SourceAlpha" result="shadowInner"></feMorphology>
1237
+ <feOffset dx="0" dy="2" in="shadowInner" result="shadowInner"></feOffset>
1238
+ <feComposite in="shadowOffsetOuter1" in2="shadowInner" operator="out" result="shadowOffsetOuter1"></feComposite>
1239
+ <feGaussianBlur stdDeviation="2" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
1240
+ <feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
1241
+ </filter>
1242
+ </defs>
1243
+ <g id="ss" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
1244
+ <g id="Group-2" transform="translate(3.000000, 1.000000)">
1245
+ <g id="Group">
1246
+ <circle id="Oval" fill="#FFFFFF" cx="16" cy="16" r="16"></circle>
1247
+ <g id="Shape">
1248
+ <use fill="black" fill-opacity="1" filter="url(#filter-2)"></use>
1249
+ <use stroke="#F46D2B" stroke-width="2"></use>
1250
+ </g>
1251
+ <g id="Path" stroke-linecap="round">
1252
+ <use fill="black" fill-opacity="1" filter="url(#filter-4)"></use>
1253
+ <use stroke="#010101" stroke-width="2"></use>
1254
+ </g>
1255
+ </g>
1256
+ <g id="checkmark" transform="translate(12.000000, 13.000000)" fill="#F46D2B" fill-rule="nonzero" stroke="#F46D2B" stroke-linejoin="round" stroke-width="0.5">
1257
+ <polygon id="Path" points="0 3.46409675 0.78760393 2.67649282 2.66137566 4.53514739 7.21239607 0 8 0.802721088 2.66137566 6.14058957"></polygon>
1258
+ </g>
1259
+ </g>
1260
+ </g>
1261
+ </svg>
1262
+ )
1263
+ }
1202
1264
 
1203
1265
  export default {
1204
1266
  SearchIcon,
1205
1267
  LiquidityIcon,
1206
1268
  EyeOnIcon,
1207
1269
  MarketClosedIcon,
1270
+ BetScopeSuccessIcon,
1208
1271
  AlertIcon,
1272
+ QuestionIcon,
1209
1273
  PieIcon,
1210
1274
  BankIcon,
1211
1275
  SquaresIcon,
@@ -1,7 +1,7 @@
1
1
  import { useState, useMemo, useEffect } from "react";
2
2
 
3
3
  export const useIsInViewport = (ref:any) => {
4
- const [isIntersecting, setIsIntersecting] = useState(false);
4
+ const [ isIntersecting, setIsIntersecting ] = useState(false);
5
5
 
6
6
  const observer = useMemo(
7
7
  () =>
@@ -14,14 +14,12 @@ export const useIsInViewport = (ref:any) => {
14
14
  );
15
15
 
16
16
  useEffect(() => {
17
- if(!ref?.current){ return }
17
+ if(!ref?.current){ return }
18
18
  observer.observe(ref.current);
19
-
20
19
  return () => {
21
20
  observer.disconnect();
22
21
  };
23
22
 
24
23
  }, [ref, observer]);
25
-
26
24
  return isIntersecting;
27
25
  }
@@ -3,6 +3,7 @@ import { APIOverrides } from "../../ApiOverrides"
3
3
  import type { AthleteProps, EventOrderStatProps, EventProps, MarketProps, MarketSideOptionProps, MatchProps, OrderProps, TeamProps, TournamentProps } from "../../types"
4
4
 
5
5
  let EVENT_SVC_API = ''
6
+ let AUTH_SVC_API = ''
6
7
 
7
8
  export { MarketComponentApi, MarketComponentHelpers }
8
9
 
@@ -11,7 +12,7 @@ const MarketComponentApi = {
11
12
  const endpoints = APIOverrides.getEndpoints();
12
13
  EVENT_SVC_API = endpoints['EVENT_SVC_API'] as string;
13
14
  //MK_SVC_API = endpoints['MK_SVC_API'] as string;
14
- //AUTH_SVC_API = endpoints['AUTH_SVC_API'] as string;
15
+ AUTH_SVC_API = endpoints['AUTH_SVC_API'] as string;
15
16
  },
16
17
  getAthletesByTeamId: async(team_id:string):Promise<AthleteProps[]> => {
17
18
  try {
@@ -21,6 +22,14 @@ const MarketComponentApi = {
21
22
  console.log(e)
22
23
  return []
23
24
  }
25
+ },
26
+ getCompanyById: async(company_id:string) => {
27
+ try {
28
+ const resp = await axios.get(`${AUTH_SVC_API}/v1/companies/company/id/${company_id}`)
29
+ return resp.data
30
+ } catch (e) {
31
+ return undefined
32
+ }
24
33
  }
25
34
  }
26
35
 
@@ -1,4 +1,4 @@
1
- import React, { useCallback } from 'react';
1
+ import React, { useCallback, useMemo } from 'react';
2
2
  import { View, TouchableOpacity } from 'react-native';
3
3
  import type { AthleteProps, BestAvailableOrderProps, EventOrderStatProps, EventProps, MarketProps, MarketSideOptionProps, OrderProps, TradeProps } from "../../../types"
4
4
  import { view_styles } from '../../../constants/styles';
@@ -29,8 +29,11 @@ type AthleteMarketProps = {
29
29
  }
30
30
 
31
31
  const AthleteMarket = ({ event, show_event, hide_liquidity, hide_stat_banner, width, athlete, market, event_order_stats, default_price_view, latest_trades, show_grades, best_available_orders, onOrder, onView, onTradeLongPress }:AthleteMarketProps) => {
32
- const { liquidity, open_order_count } = MarketComponentHelpers.getLiqudity(event_order_stats);
33
- const is_locked = MarketComponentHelpers.isEventMarketLocked(event, market.market_id);
32
+
33
+
34
+ const { liquidity, open_order_count } = MarketComponentHelpers.getLiqudity(event_order_stats)
35
+ const is_locked = useMemo(() => MarketComponentHelpers.isEventMarketLocked(event, market.market_id),[JSON.stringify(event.supported_markets)])
36
+
34
37
  const renderSides = useCallback((data:{ item:MarketSideOptionProps, index:number, market:MarketProps }) => {
35
38
  const ba_order = best_available_orders.find(o => o.market_id == market.market_id && o.side_type == 'athlete' && o.side_id == athlete.athlete_id && o.side == data.item.side && o.show);
36
39
  const side_details = MarketComponentHelpers.getTeamEventSideIds(event, market, data.item, athlete, undefined);
@@ -121,4 +124,9 @@ const AthleteMarket = ({ event, show_event, hide_liquidity, hide_stat_banner, wi
121
124
  )
122
125
  }
123
126
 
124
- export default AthleteMarket
127
+ export default React.memo(AthleteMarket, (left, right) => {
128
+ if(JSON.stringify(left) != JSON.stringify(right)){
129
+ return false
130
+ }
131
+ return true
132
+ })
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import { View } from 'react-native';
3
+
4
+ type BetScopeIndicatorProps = {
5
+ bet_scope_grade?: number
6
+ }
7
+
8
+ const BetScopeIndicator = ({ bet_scope_grade }:BetScopeIndicatorProps) => {
9
+ if(!bet_scope_grade || bet_scope_grade < 100){ return <></> }
10
+ return (
11
+ <View>
12
+
13
+ </View>
14
+ )
15
+ }
16
+
17
+ export default React.memo(BetScopeIndicator, (left, right) => left.bet_scope_grade == right.bet_scope_grade)
@@ -43,7 +43,7 @@ const MarketCard = ({ side_option, locked, show_grades, market, trade, order, on
43
43
  }, 600);
44
44
  }
45
45
  },[trade])
46
-
46
+
47
47
  return (
48
48
  <TouchableOpacity
49
49
  style={{ flex:1, backgroundColor:color, borderRadius:4}}
@@ -81,4 +81,7 @@ const MarketCard = ({ side_option, locked, show_grades, market, trade, order, on
81
81
  )
82
82
  }
83
83
 
84
- export default MarketCard
84
+ export default React.memo(MarketCard, (left, right) => {
85
+ if(JSON.stringify(left) != JSON.stringify(right)){ return false }
86
+ return true
87
+ })
@@ -68,7 +68,7 @@ const OrderGradeBar = ({ grade, view_type, mask, onSelectGrade }:OrderGradeBarPr
68
68
  if(!grade && grade !== 0){ return <></> }
69
69
  //Check if the grade is greater than the minumum of the box
70
70
  const filled = grade >= data.item.min ? true : false
71
- const success = grade > 97.5 ? true : false
71
+ const success = grade > 100 ? true : false
72
72
  const locked = !premium ? true : false
73
73
 
74
74
  //Render the box
@@ -84,7 +84,7 @@ const OrderGradeBar = ({ grade, view_type, mask, onSelectGrade }:OrderGradeBarPr
84
84
  }
85
85
 
86
86
  if(view_type == 'market'){
87
- const success = grade > 97.5 ? true : false
87
+ const success = grade > 100 ? true : false
88
88
  if(!premium){
89
89
  return (<></>)
90
90
  }
@@ -1,6 +1,6 @@
1
- import React, { useCallback, useEffect, useState } from 'react';
1
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
2
  import { View, Image, FlatList, TouchableOpacity, ActivityIndicator, ScrollView } from 'react-native';
3
- import type { AthleteProps, BestAvailableOrderProps, CompetitionProps, EventOrderStatProps, EventProps, MarketProps, MarketSideOptionProps, OrderProps, SquaresCompetitionProps, TradeProps } from '../../../types';
3
+ import type { AthleteProps, BestAvailableOrderProps, CompanyProps, CompetitionProps, EventOrderStatProps, EventProps, MarketProps, MarketSideOptionProps, OrderProps, SquaresCompetitionProps, TradeProps } from '../../../types';
4
4
  import { view_styles } from '../../../constants/styles';
5
5
  import { Button, Icons, LinearDiagnal, Text } from '../../../Components';
6
6
  import {TeamEventMarketHelpers} from './api';
@@ -11,6 +11,9 @@ import EventMarket from '../../components/EventMarket';
11
11
 
12
12
  import { MarketComponentApi, MarketComponentHelpers } from '../../api';
13
13
  import { MarketButtonHelpers } from '../MarketButton/api';
14
+ import LinearGradient from 'react-native-linear-gradient';
15
+ import { useIsInViewport } from '../../../Components/ViewportObserver';
16
+ import type { BEEventProps } from '../../../Observer/api/types';
14
17
 
15
18
  type TeamEventMarketProps = {
16
19
  event:EventProps,
@@ -25,6 +28,7 @@ type TeamEventMarketProps = {
25
28
  default_price_view: 'last_trade'|'best_available',
26
29
  onView:(data:{ event_id:string, event_type:string, market_id:string, side_type?:string, side_id?:string }) => void,
27
30
  onOrder:(order:OrderProps) => void,
31
+ onEvent?:(be_event:BEEventProps) => void,
28
32
  onExpand?:(expanded:boolean) => void,
29
33
  show_grades?:boolean,
30
34
  onCompetitionSelect:(competition_id:string) => void,
@@ -34,7 +38,7 @@ type TeamEventMarketProps = {
34
38
  onActivate?:(event_id:string, event_type:string) => void
35
39
  activate_loading?:boolean
36
40
  }
37
- const TeamEventMarket = ({ event, init_expanded, show_id, activate_loading, competitions, squares_competition, show_grades, markets, latest_trades, best_available_orders, event_order_stats, default_price_view, onSquaresSelect, onCompetitionSelect, onExpand, onOrder, onView, onViewAdditionalMarkets, onTradeLongPress, onActivate }:TeamEventMarketProps) => {
41
+ const TeamEventMarket = ({ event, init_expanded, show_id, activate_loading, competitions, squares_competition, show_grades, markets, latest_trades, best_available_orders, event_order_stats, default_price_view, onSquaresSelect, onCompetitionSelect, onExpand, onOrder, onView, onViewAdditionalMarkets, onTradeLongPress, onActivate, onEvent }:TeamEventMarketProps) => {
38
42
  const [ expanded_data, setExpandedData ] = useState<{
39
43
  expanded:boolean,
40
44
  loaded:boolean,
@@ -46,16 +50,43 @@ const TeamEventMarket = ({ event, init_expanded, show_id, activate_loading, comp
46
50
  expanded:false,
47
51
  athletes:[]
48
52
  })
53
+ const [ sponsor, setSponsor ] = useState<CompanyProps|undefined>(undefined);
49
54
  const [ competitions_expanded, setCompetitionsExpanded ] = useState(false);
50
55
  const { expanded, athletes, loaded, loading } = expanded_data;
51
56
  const event_status = TeamEventMarketHelpers.getEventStatus(event);
52
-
57
+ const ref = useRef(null)
58
+ const isInViewport = useIsInViewport(ref)
53
59
 
54
60
  useEffect(() => {
55
61
  MarketComponentApi.setEnvironment();
56
62
  if(init_expanded){ expandedEvent(); }
63
+ if(event.sponsor_id){ getCompanyFromServer(event.sponsor_id) }
57
64
  },[])
58
65
 
66
+ useEffect(() => {
67
+ if(isInViewport && onEvent && event.sponsor_id){
68
+ let be_event:BEEventProps = {
69
+ event_name:'company_view',
70
+ event_data: {
71
+ view_type: 'contest',
72
+ view_location: 'list',
73
+ contest_type:'team',
74
+ contest_id:event.event_id,
75
+ company_id: event.sponsor_id
76
+ },
77
+ level:2
78
+ }
79
+ onEvent(be_event)
80
+ }
81
+ },[isInViewport])
82
+
83
+
84
+ const getCompanyFromServer = async(company_id:string) => {
85
+ const resp = await MarketComponentApi.getCompanyById(company_id)
86
+ if(!resp?.company){ return }
87
+ setSponsor(resp.company)
88
+ }
89
+
59
90
  const expandedEvent = async() => {
60
91
  if(!event){ return }
61
92
  if(onExpand){ onExpand(expanded ? false : true) }
@@ -76,7 +107,9 @@ const TeamEventMarket = ({ event, init_expanded, show_id, activate_loading, comp
76
107
  })
77
108
  }
78
109
 
79
- const primary_markets = TeamEventMarketHelpers.getPrimaryMarkets(event, markets);
110
+ const primary_markets = useMemo(() => {
111
+ return TeamEventMarketHelpers.getPrimaryMarkets(event, markets)
112
+ }, [markets.length])
80
113
 
81
114
  const handleSelectCompetition = () => {
82
115
  if(!competitions || competitions.length == 0){ return }
@@ -138,7 +171,8 @@ const TeamEventMarket = ({ event, init_expanded, show_id, activate_loading, comp
138
171
  <Text size={12} color={Colors.brand.midnight} textAlign='center'>{data.item.type.toUpperCase()}</Text>
139
172
  </View>
140
173
  )
141
- },[])
174
+ },[primary_markets.length])
175
+
142
176
 
143
177
  const renderNonPrimaryMarkets = useCallback((data: { item:EventOrderStatProps, index:number }) => {
144
178
  const market = markets.find(m => m.market_id == data.item.market_id);
@@ -211,9 +245,36 @@ const TeamEventMarket = ({ event, init_expanded, show_id, activate_loading, comp
211
245
  if(!event.away || !event.home){ return <></> }
212
246
 
213
247
  const { liquidity, open_order_count } = MarketComponentHelpers.getLiqudity(event_order_stats);
214
- const { non_primary_markets, available } = TeamEventMarketHelpers.sortNonPrimaryMarkets(TeamEventMarketHelpers.getNonPrimaryMarkets(event, markets), event_order_stats, latest_trades)
248
+ const { non_primary_markets, available } = useMemo(() => TeamEventMarketHelpers.sortNonPrimaryMarkets(TeamEventMarketHelpers.getNonPrimaryMarkets(event, markets), event_order_stats, latest_trades),[])
249
+
215
250
  return (
216
- <View style={{ ...view_styles.section, borderWidth:1, borderColor:Colors.shades.shade600 }}>
251
+ <View ref={ref} style={{ ...view_styles.section, borderWidth:1, borderColor:Colors.shades.shade600 }}>
252
+ {sponsor ?
253
+ <LinearGradient style={{ marginTop:-1, marginLeft:-1, marginRight:-1, padding:10, flexDirection:'row', borderTopRightRadius:8, borderTopLeftRadius:8 }} start={{x: 0, y: 0}} end={{x: 1, y: 0}} colors={[sponsor.brand_primary ?? Colors.brand.midnight, sponsor.brand_secondary ?? Colors.brand.cyan]}>
254
+ <View style={{ height:30, width:30, borderRadius:4, backgroundColor:Colors.shades.white }}>
255
+ <Image
256
+ source={{ uri: sponsor.company_image?.url }}
257
+ style={{ height:30, width:30, borderRadius:4 }}
258
+ resizeMode='cover'
259
+ />
260
+ </View>
261
+ <View style={{ flex:1, marginLeft:10 }}>
262
+ <Text size={12} color={Colors.shades.white} weight='bold'>Brought to you by {sponsor.company_name}</Text>
263
+ <View style={{ marginTop:3, flexDirection:'row', alignItems:'center' }}>
264
+ {show_id ?
265
+ <Text style={{ marginLeft:2, marginRight:3 }} size={12} color={Colors.shades.white} weight='semibold' selectable>{event.event_id} </Text>
266
+ :<></>}
267
+ {event.event_sub_title ?
268
+ <Text size={12} color={Colors.shades.white} weight='semibold'>{event.event_sub_title}</Text>
269
+ :<></>}
270
+ </View>
271
+ </View>
272
+ <View style={{ flexDirection:'row', alignItems:'center' }}>
273
+ <Icons.TVIcon size={10} color={Colors.shades.white} />
274
+ <Text style={{ marginLeft:8 }} size={12} color={Colors.shades.white} weight='semibold'>{event.info?.broadcast?.network}</Text>
275
+ </View>
276
+ </LinearGradient>
277
+ :
217
278
  <View nativeID='event_header_data' style={{ flexDirection:'row', padding:10, borderBottomWidth:1, borderBottomColor:Colors.shades.shade600 }}>
218
279
  {onActivate && event_status != 'closed' ?
219
280
  <Button
@@ -239,6 +300,7 @@ const TeamEventMarket = ({ event, init_expanded, show_id, activate_loading, comp
239
300
  <Text style={{ marginLeft:8 }} size={12} color={Colors.brand.midnight} weight='semibold'>{event.info?.broadcast?.network}</Text>
240
301
  </View>
241
302
  </View>
303
+ }
242
304
  <View nativeID='primary_markets' style={{ flexDirection:'row' }}>
243
305
  <View nativeID='team_details' style={{ flex:1, padding:5, paddingRight:0 }}>
244
306
  <View style={{ flexDirection:'row', alignItems:'center', marginTop:5, marginBottom:5, marginLeft:10 }}>
@@ -297,7 +359,7 @@ const TeamEventMarket = ({ event, init_expanded, show_id, activate_loading, comp
297
359
  </View>
298
360
  <FlatList
299
361
  key={`${event.event_id}_primary_markets`}
300
- data={primary_markets}
362
+ data={primary_markets.sort((a,b) => parseInt(a.market_id) - parseInt(b.market_id))}
301
363
  horizontal
302
364
  renderItem={renderPrimaryMarkets}
303
365
  keyExtractor={(item) => item.market_id.toString()}
@@ -407,4 +469,7 @@ const TeamEventMarket = ({ event, init_expanded, show_id, activate_loading, comp
407
469
  )
408
470
  }
409
471
 
410
- export default TeamEventMarket
472
+ export default React.memo(TeamEventMarket, (left, right) => {
473
+ if(JSON.stringify(left) != JSON.stringify(right)){ return false }
474
+ return true
475
+ })
@@ -0,0 +1,35 @@
1
+ import React from 'react';
2
+ import { Image, TouchableOpacity, View } from 'react-native';
3
+ import type { PollCampaignProps } from '../../types';
4
+ import { Icons, Text } from '../../Components';
5
+ import Colors from '../../constants/colors';
6
+
7
+ type CampaignHeaderProps = {
8
+ poll_campaign:PollCampaignProps,
9
+ onSharePollCampaign:(pc:PollCampaignProps) => void
10
+ }
11
+
12
+ const CampaignHeader = ({ poll_campaign, onSharePollCampaign }:CampaignHeaderProps) => {
13
+
14
+ return (
15
+ <View>
16
+ <View nativeID="competition_header" style={{ flexDirection:'row', alignItems:'center', padding:20, borderBottomWidth:1, borderColor:Colors.shades.shade600 }}>
17
+ <View>
18
+ <Image
19
+ source={{ uri: poll_campaign.campaign_image?.url ?? 'https://res.cloudinary.com/hoabts6mc/image/upload/v1649737862/be_logo_jte2ux.webp' }}
20
+ style={{ height:50, width:50, borderRadius:4 }}
21
+ resizeMode="cover"
22
+ />
23
+ </View>
24
+ <View style={{ flex:1, marginLeft:10 }}>
25
+ <Text theme='header'>{poll_campaign.name}</Text>
26
+ </View>
27
+ <TouchableOpacity style={{ paddingLeft:10 }} onPress={() => onSharePollCampaign(poll_campaign)}>
28
+ <Icons.ShareIcon color={Colors.brand.midnight} size={14} />
29
+ </TouchableOpacity>
30
+ </View>
31
+ </View>
32
+ )
33
+ }
34
+
35
+ export default CampaignHeader
@@ -0,0 +1,181 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import { View, ScrollView, Image, FlatList, ActivityIndicator } from "react-native"
3
+ import type { PollCampaignLeaderProps, PollCampaignProps, PublicPlayerProps } from '../../types';
4
+ import { PollCampaignApi } from '../api';
5
+ import { Button, Icons, Text } from '../../Components';
6
+ import Colors from '../../constants/colors';
7
+ import { view_styles } from '../../constants/styles';
8
+
9
+ type CampaignLeaderboardProps = {
10
+ poll_campaign:PollCampaignProps,
11
+ view_mode: "short"|"full",
12
+ height?:number,
13
+ onShowFullLeaderboard?: () => void,
14
+ onClose?:() => void
15
+ }
16
+
17
+ const CampaignLeaderboard = ({ poll_campaign, height, view_mode, onShowFullLeaderboard, onClose }:CampaignLeaderboardProps) => {
18
+ const [ leaderboard_data, setLeaderData ] = useState<{
19
+ loading:boolean,
20
+ offset:number,
21
+ leaders:PollCampaignLeaderProps[],
22
+ players:PublicPlayerProps[],
23
+ my_leader?: PollCampaignLeaderProps
24
+ }>({
25
+ loading:false,
26
+ offset:0,
27
+ leaders:[],
28
+ players:[]
29
+ })
30
+ const { loading, leaders, players, my_leader, offset } = leaderboard_data;
31
+ const me = players.find(p => p.player_id == my_leader?.player_id);
32
+
33
+ let filtered_leaders = [ ...leaders ]
34
+ if(view_mode == 'short'){
35
+ filtered_leaders = filtered_leaders.sort((a,b) => a.place - b.place).slice(0,3);
36
+ }
37
+
38
+ useEffect(() => {
39
+ getDataFromServer(0);
40
+ },[poll_campaign.poll_campaign_id])
41
+
42
+ const getDataFromServer = async(offset:number) => {
43
+ setLeaderData({ ...leaderboard_data, loading:true })
44
+ const ls = await PollCampaignApi.getLeadersByCampaignId(poll_campaign.poll_campaign_id, offset)
45
+ const player_ids = ls.poll_campaign_leaders.map(l => l.player_id);
46
+ if(ls.my_leaderboard){
47
+ let my_id = player_ids.find(id => id == ls.my_leaderboard?.player_id);
48
+ if(!my_id){ player_ids.push(ls.my_leaderboard.player_id) }
49
+ }
50
+ const ps = await PollCampaignApi.getPlayersByPlayerIds(player_ids);
51
+ setLeaderData({
52
+ ...leaderboard_data,
53
+ players:ps,
54
+ offset,
55
+ loading: false,
56
+ leaders: ls.poll_campaign_leaders,
57
+ my_leader: ls.my_leaderboard
58
+ })
59
+ }
60
+
61
+ const renderTrophy = (place:number) => {
62
+ switch(place){
63
+ case 1: return <Icons.TrophyIcon color={Colors.incentive.gold} size={16}/>
64
+ case 2: return <Icons.TrophyIcon color={Colors.incentive.silver} size={16}/>
65
+ case 3: return <Icons.TrophyIcon color={Colors.incentive.bronze} size={16}/>
66
+ default: return <></>
67
+ }
68
+ }
69
+
70
+
71
+ const renderLeaders = (data: {item:PollCampaignLeaderProps, index:number}) => {
72
+ const player = players.find(p => p.player_id == data.item.player_id);
73
+ if(!player){ return <></> }
74
+ return (
75
+ <View style={{ flexDirection:'row', alignItems:'center', margin:4, padding:10, borderRadius:22, backgroundColor:Colors.shades.white, borderWidth:1, borderColor:Colors.shades.shade600 }}>
76
+ <View nativeID="place" style={{ margin:5, height:20, width:20, justifyContent:'center', alignItems:'center', borderRadius:100, borderWidth:1, borderColor:Colors.brand.slate }}>
77
+ <Text size={10} color={Colors.brand.midnight} weight='bold' textAlign="center">{offset > 0 ? offset:''}{data.index+1}</Text>
78
+ </View>
79
+ <View nativeID="player" style={{ flex:1, flexDirection:'row', alignItems:'center' }}>
80
+ <View nativeID="profile_pic" style={{ marginRight:10 }}>
81
+ <Image
82
+ source={{ uri: player.profile_pic && player.profile_pic != '' ? player.profile_pic : 'https://res.cloudinary.com/hoabts6mc/image/upload/v1689262384/default-avatar_bbkn2t.png' }}
83
+ style={{ height:40, width:40, borderRadius:100 }}
84
+ resizeMode='cover'
85
+ />
86
+ </View>
87
+ <View style={{ flex:1 }} nativeID="name">
88
+ <Text size={14} color={Colors.brand.midnight} weight='bold'>{player.username}</Text>
89
+ <Text style={{ marginTop:3 }} size={12} color={Colors.brand.midnight} weight='regular'>{data.item.winnings.toFixed(2)} Points</Text>
90
+ </View>
91
+ <View>
92
+ {renderTrophy(data.index+1)}
93
+ </View>
94
+ </View>
95
+ </View>
96
+ )
97
+ }
98
+
99
+ return (
100
+ <View style={{ flex:1, height:height, backgroundColor:Colors.shades.shade100 }}>
101
+ {my_leader && me ?
102
+ <View nativeID="my_results">
103
+ <View style={{ flexDirection:'row', alignItems:'center', margin:4, padding:10, borderRadius:22, backgroundColor:Colors.shades.white }}>
104
+ <View nativeID="place" style={{ margin:5, height:20, width:20, justifyContent:'center', alignItems:'center', borderRadius:100, borderWidth:1, borderColor:Colors.brand.slate }}>
105
+ <Text size={10} color={Colors.brand.midnight} weight='bold' textAlign="center">{my_leader.place}</Text>
106
+ </View>
107
+ <View nativeID="player" style={{ flex:1, flexDirection:'row', alignItems:'center' }}>
108
+ <View nativeID="profile_pic" style={{ marginRight:10 }}>
109
+ <Image
110
+ source={{ uri: me.profile_pic && me.profile_pic != '' ? me.profile_pic : 'https://res.cloudinary.com/hoabts6mc/image/upload/v1689262384/default-avatar_bbkn2t.png' }}
111
+ style={{ height:40, width:40, borderRadius:100 }}
112
+ resizeMode='cover'
113
+ />
114
+ </View>
115
+ <View style={{ flex:1 }} nativeID="name">
116
+ <Text size={14} color={Colors.brand.midnight} weight='bold'>{me.username}</Text>
117
+ <Text style={{ marginTop:3 }} size={12} color={Colors.brand.midnight} weight='regular'>{my_leader.winnings.toFixed(2)} Points</Text>
118
+ </View>
119
+ <View>
120
+ {renderTrophy(my_leader.place)}
121
+ </View>
122
+ </View>
123
+ </View>
124
+ </View>
125
+ :<></>}
126
+ <ScrollView style={{flex:1}}>
127
+ {loading ?
128
+ <ActivityIndicator size='large' color={Colors.brand.midnight} style={{ padding:10, alignSelf:'center' }} />
129
+ :<></>}
130
+ <FlatList
131
+ data={filtered_leaders}
132
+ renderItem={renderLeaders}
133
+ keyExtractor={((item) => item.player_id.toString())}
134
+ />
135
+ </ScrollView>
136
+ {view_mode == 'full' ?
137
+ <View style={{ flexDirection:'row', alignItems:'center' }}>
138
+ {offset > 0 ?
139
+ <Button
140
+ title='PREV'
141
+ title_color={Colors.brand.electric}
142
+ backgroundColor='transparent'
143
+ onPress={() => getDataFromServer(offset - 1)}
144
+ />
145
+ :<></>}
146
+ <View style={{flex:1}} />
147
+ <Button
148
+ title='NEXT'
149
+ title_color={Colors.brand.electric}
150
+ backgroundColor='transparent'
151
+ onPress={() => getDataFromServer(offset + 1)}
152
+ />
153
+ </View>
154
+ :<></>}
155
+ {view_mode == 'short' && onShowFullLeaderboard ?
156
+ <View style={{ ...view_styles.section_footer }}>
157
+ <Button
158
+ title='See Full Leaderboard'
159
+ style={{ flex:1, alignSelf:'center' }}
160
+ title_color={Colors.brand.electric}
161
+ backgroundColor='transparent'
162
+ onPress={() => onShowFullLeaderboard()}
163
+ />
164
+ </View>
165
+ :<></>}
166
+ {onClose ?
167
+ <View style={{ ...view_styles.section_footer }}>
168
+ <Button
169
+ title='CLOSE'
170
+ style={{ flex:1 }}
171
+ title_color={Colors.shades.white}
172
+ backgroundColor={Colors.utility.error}
173
+ onPress={() => onClose()}
174
+ />
175
+ </View>
176
+ :<></>}
177
+ </View>
178
+ )
179
+ }
180
+
181
+ export default CampaignLeaderboard