be-components 5.6.7 → 5.6.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 (126) hide show
  1. package/lib/commonjs/Engage/api/index.js +13 -2
  2. package/lib/commonjs/Engage/api/index.js.map +1 -1
  3. package/lib/commonjs/Engage/components/EngageHeader.js +2 -0
  4. package/lib/commonjs/Engage/components/EngageHeader.js.map +1 -1
  5. package/lib/commonjs/Engage/components/PollCampaignCard.js +110 -0
  6. package/lib/commonjs/Engage/components/PollCampaignCard.js.map +1 -0
  7. package/lib/commonjs/Engage/index.js +83 -12
  8. package/lib/commonjs/Engage/index.js.map +1 -1
  9. package/lib/commonjs/FlashMarket/api/index.js +134 -0
  10. package/lib/commonjs/FlashMarket/api/index.js.map +1 -0
  11. package/lib/commonjs/FlashMarket/components/FlashMarketHelp.js +91 -0
  12. package/lib/commonjs/FlashMarket/components/FlashMarketHelp.js.map +1 -0
  13. package/lib/commonjs/FlashMarket/index.js +631 -0
  14. package/lib/commonjs/FlashMarket/index.js.map +1 -0
  15. package/lib/commonjs/Poll/api/index.js +12 -0
  16. package/lib/commonjs/Poll/api/index.js.map +1 -1
  17. package/lib/commonjs/Poll/components/CampaignHeader.js +13 -2
  18. package/lib/commonjs/Poll/components/CampaignHeader.js.map +1 -1
  19. package/lib/commonjs/Poll/components/CampaignLeaderboard.js +1 -4
  20. package/lib/commonjs/Poll/components/CampaignLeaderboard.js.map +1 -1
  21. package/lib/commonjs/Poll/index.js +21 -4
  22. package/lib/commonjs/Poll/index.js.map +1 -1
  23. package/lib/commonjs/index.js +7 -0
  24. package/lib/commonjs/index.js.map +1 -1
  25. package/lib/module/Engage/api/index.js +13 -2
  26. package/lib/module/Engage/api/index.js.map +1 -1
  27. package/lib/module/Engage/components/EngageHeader.js +2 -0
  28. package/lib/module/Engage/components/EngageHeader.js.map +1 -1
  29. package/lib/module/Engage/components/PollCampaignCard.js +103 -0
  30. package/lib/module/Engage/components/PollCampaignCard.js.map +1 -0
  31. package/lib/module/Engage/index.js +83 -12
  32. package/lib/module/Engage/index.js.map +1 -1
  33. package/lib/module/FlashMarket/api/index.js +129 -0
  34. package/lib/module/FlashMarket/api/index.js.map +1 -0
  35. package/lib/module/FlashMarket/components/FlashMarketHelp.js +84 -0
  36. package/lib/module/FlashMarket/components/FlashMarketHelp.js.map +1 -0
  37. package/lib/module/FlashMarket/index.js +622 -0
  38. package/lib/module/FlashMarket/index.js.map +1 -0
  39. package/lib/module/Poll/api/index.js +12 -0
  40. package/lib/module/Poll/api/index.js.map +1 -1
  41. package/lib/module/Poll/components/CampaignHeader.js +13 -2
  42. package/lib/module/Poll/components/CampaignHeader.js.map +1 -1
  43. package/lib/module/Poll/components/CampaignLeaderboard.js +1 -4
  44. package/lib/module/Poll/components/CampaignLeaderboard.js.map +1 -1
  45. package/lib/module/Poll/index.js +21 -4
  46. package/lib/module/Poll/index.js.map +1 -1
  47. package/lib/module/index.js +2 -1
  48. package/lib/module/index.js.map +1 -1
  49. package/lib/typescript/lib/commonjs/Engage/api/index.d.ts +3 -2
  50. package/lib/typescript/lib/commonjs/Engage/api/index.d.ts.map +1 -1
  51. package/lib/typescript/lib/commonjs/Engage/components/EngageHeader.d.ts.map +1 -1
  52. package/lib/typescript/lib/commonjs/Engage/components/PollCampaignCard.d.ts +7 -0
  53. package/lib/typescript/lib/commonjs/Engage/components/PollCampaignCard.d.ts.map +1 -0
  54. package/lib/typescript/lib/commonjs/Engage/index.d.ts +2 -1
  55. package/lib/typescript/lib/commonjs/Engage/index.d.ts.map +1 -1
  56. package/lib/typescript/lib/commonjs/FlashMarket/api/index.d.ts +27 -0
  57. package/lib/typescript/lib/commonjs/FlashMarket/api/index.d.ts.map +1 -0
  58. package/lib/typescript/lib/commonjs/FlashMarket/components/FlashMarketHelp.d.ts +4 -0
  59. package/lib/typescript/lib/commonjs/FlashMarket/components/FlashMarketHelp.d.ts.map +1 -0
  60. package/lib/typescript/lib/commonjs/FlashMarket/index.d.ts +13 -0
  61. package/lib/typescript/lib/commonjs/FlashMarket/index.d.ts.map +1 -0
  62. package/lib/typescript/lib/commonjs/Poll/api/index.d.ts +1 -0
  63. package/lib/typescript/lib/commonjs/Poll/api/index.d.ts.map +1 -1
  64. package/lib/typescript/lib/commonjs/Poll/components/CampaignHeader.d.ts +2 -1
  65. package/lib/typescript/lib/commonjs/Poll/components/CampaignHeader.d.ts.map +1 -1
  66. package/lib/typescript/lib/commonjs/Poll/components/CampaignLeaderboard.d.ts.map +1 -1
  67. package/lib/typescript/lib/commonjs/Poll/index.d.ts +3 -1
  68. package/lib/typescript/lib/commonjs/Poll/index.d.ts.map +1 -1
  69. package/lib/typescript/lib/commonjs/index.d.ts +1 -0
  70. package/lib/typescript/lib/commonjs/index.d.ts.map +1 -1
  71. package/lib/typescript/lib/module/Engage/api/index.d.ts +3 -2
  72. package/lib/typescript/lib/module/Engage/api/index.d.ts.map +1 -1
  73. package/lib/typescript/lib/module/Engage/components/EngageHeader.d.ts.map +1 -1
  74. package/lib/typescript/lib/module/Engage/components/PollCampaignCard.d.ts +7 -0
  75. package/lib/typescript/lib/module/Engage/components/PollCampaignCard.d.ts.map +1 -0
  76. package/lib/typescript/lib/module/Engage/index.d.ts +2 -1
  77. package/lib/typescript/lib/module/Engage/index.d.ts.map +1 -1
  78. package/lib/typescript/lib/module/FlashMarket/api/index.d.ts +26 -0
  79. package/lib/typescript/lib/module/FlashMarket/api/index.d.ts.map +1 -0
  80. package/lib/typescript/lib/module/FlashMarket/components/FlashMarketHelp.d.ts +4 -0
  81. package/lib/typescript/lib/module/FlashMarket/components/FlashMarketHelp.d.ts.map +1 -0
  82. package/lib/typescript/lib/module/FlashMarket/index.d.ts +15 -0
  83. package/lib/typescript/lib/module/FlashMarket/index.d.ts.map +1 -0
  84. package/lib/typescript/lib/module/Poll/api/index.d.ts +1 -0
  85. package/lib/typescript/lib/module/Poll/api/index.d.ts.map +1 -1
  86. package/lib/typescript/lib/module/Poll/components/CampaignHeader.d.ts +2 -1
  87. package/lib/typescript/lib/module/Poll/components/CampaignHeader.d.ts.map +1 -1
  88. package/lib/typescript/lib/module/Poll/components/CampaignLeaderboard.d.ts.map +1 -1
  89. package/lib/typescript/lib/module/Poll/index.d.ts +3 -1
  90. package/lib/typescript/lib/module/Poll/index.d.ts.map +1 -1
  91. package/lib/typescript/lib/module/index.d.ts +2 -1
  92. package/lib/typescript/lib/module/index.d.ts.map +1 -1
  93. package/lib/typescript/src/Engage/api/index.d.ts +4 -3
  94. package/lib/typescript/src/Engage/api/index.d.ts.map +1 -1
  95. package/lib/typescript/src/Engage/components/PollCampaignCard.d.ts +11 -0
  96. package/lib/typescript/src/Engage/components/PollCampaignCard.d.ts.map +1 -0
  97. package/lib/typescript/src/Engage/index.d.ts +4 -3
  98. package/lib/typescript/src/Engage/index.d.ts.map +1 -1
  99. package/lib/typescript/src/FlashMarket/api/index.d.ts +32 -0
  100. package/lib/typescript/src/FlashMarket/api/index.d.ts.map +1 -0
  101. package/lib/typescript/src/FlashMarket/components/FlashMarketHelp.d.ts +5 -0
  102. package/lib/typescript/src/FlashMarket/components/FlashMarketHelp.d.ts.map +1 -0
  103. package/lib/typescript/src/FlashMarket/index.d.ts +20 -0
  104. package/lib/typescript/src/FlashMarket/index.d.ts.map +1 -0
  105. package/lib/typescript/src/Poll/api/index.d.ts +5 -0
  106. package/lib/typescript/src/Poll/api/index.d.ts.map +1 -1
  107. package/lib/typescript/src/Poll/components/CampaignHeader.d.ts +2 -1
  108. package/lib/typescript/src/Poll/components/CampaignHeader.d.ts.map +1 -1
  109. package/lib/typescript/src/Poll/index.d.ts +8 -1
  110. package/lib/typescript/src/Poll/index.d.ts.map +1 -1
  111. package/lib/typescript/src/index.d.ts +2 -1
  112. package/lib/typescript/src/index.d.ts.map +1 -1
  113. package/package.json +1 -1
  114. package/src/Engage/api/index.ts +14 -3
  115. package/src/Engage/components/EngageHeader.tsx +2 -2
  116. package/src/Engage/components/PollCampaignCard.tsx +54 -0
  117. package/src/Engage/index.tsx +50 -11
  118. package/src/FlashMarket/api/index.ts +94 -0
  119. package/src/FlashMarket/components/FlashMarketHelp.tsx +41 -0
  120. package/src/FlashMarket/index.tsx +408 -0
  121. package/src/Poll/api/index.ts +9 -0
  122. package/src/Poll/components/CampaignHeader.tsx +10 -1
  123. package/src/Poll/components/CampaignLeaderboard.tsx +2 -2
  124. package/src/Poll/index.tsx +12 -5
  125. package/src/index.tsx +2 -0
  126. package/src/types.d.ts +13 -1
@@ -0,0 +1,408 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import { Button, Text, TextInput, View } from "../Components/Themed";
3
+ import type { LocationProps, PollCampaignProps, PollOptionProps, PollProps, PollResponseProps, PollSummaryProps, PublicPlayerProps } from '../types';
4
+ import { FlashMarketApi, FlashMarketHelpers } from './api';
5
+ import { Icons } from '../Components';
6
+ import { useColors } from '../constants/useColors';
7
+ import { ActivityIndicator, FlatList, Image } from 'react-native';
8
+ import FlashMarketHelp from './components/FlashMarketHelp';
9
+ import SocketManager from '../Socket';
10
+ import moment from 'moment-mini';
11
+
12
+
13
+ type FlashMarketProps = {
14
+ poll_id:string,
15
+ init_expanded?:boolean,
16
+ location?:LocationProps,
17
+ player_id?:string
18
+ player?:PublicPlayerProps,
19
+ onRequestLocation:() => void,
20
+ onFocusPosition?: (position:{ x:number, y:number, width:number, height:number }) => void,
21
+ onRequestAuthenticate: () => void
22
+ }
23
+ const FlashMarket = ({ poll_id, init_expanded, location, player, player_id, onRequestAuthenticate, onFocusPosition, onRequestLocation }:FlashMarketProps) => {
24
+ const Colors = useColors();
25
+ const [ needs_reload, setNeedsReload ] = useState(false);
26
+ const [ socket_summaries, setSocketSummaries ] = useState<PollSummaryProps[]>([]);
27
+ const [ socket_campaign, setSocketCampaign ] = useState<PollCampaignProps|undefined>(undefined);
28
+ const [ socket_poll_options, setSocketPollOptions ] = useState<PollOptionProps[]>([]);
29
+ const [ socket_polls, setSocketPolls ] = useState<PollProps[]>([]);
30
+ const [ expanded, setExpanded ] = useState(false);
31
+ const [ show_help, setShowHelp ] = useState(false);
32
+ const [ action_loading, setActionLoading ] = useState(false);
33
+ const [ draft_data, setDraftData ] = useState<{
34
+ stake: string
35
+ }>({
36
+ stake: '0'
37
+ })
38
+ const [ market_data, setMarketData ] = useState<{
39
+ loading:boolean,
40
+ poll?:PollProps,
41
+ poll_campaign?:PollCampaignProps,
42
+ poll_options:PollOptionProps[],
43
+ poll_summaries:PollSummaryProps[]
44
+ }>({
45
+ loading:false,
46
+ poll_options:[],
47
+ poll_summaries:[]
48
+ });
49
+ const { loading, poll, poll_options, poll_summaries, poll_campaign } = market_data;
50
+ const cl = poll_campaign?.market_type == 'FOR_MONEY' ? '$' : 'E'
51
+ const [ my_data, setMyData ] = useState<{
52
+ me_loading:boolean,
53
+ my_response?:PollResponseProps
54
+ }>({
55
+ me_loading:false
56
+ });
57
+ const { me_loading, my_response } = my_data;
58
+ const [ selected_option, setSelectedOption ] = useState<PollOptionProps | undefined>(undefined);
59
+
60
+ const allow_order = my_response || poll?.winning_option_id ? false : true
61
+ const potential_winnings = FlashMarketHelpers.calcPotentialWinnings(selected_option?.parimutuel_odds, draft_data.stake);
62
+ const order_valid = FlashMarketHelpers.isValid(poll, draft_data.stake);
63
+ const visible_options = poll_options.filter(po => po.status != 'inactive').sort((a,b) => a.priority - b.priority)
64
+ useEffect(() => {
65
+ FlashMarketApi.setEnvironment();
66
+ loadMarket(poll_id);
67
+ },[poll_id]);
68
+
69
+ useEffect(() => {
70
+ if(!poll || !player_id){ return }
71
+ loadMyData();
72
+ },[poll, player_id]);
73
+
74
+ useEffect(() => {
75
+ if(socket_summaries.length == 0){ return }
76
+ if(!poll){ return }
77
+ let same_options = socket_summaries.filter(p => p.poll_id == poll.poll_id);
78
+ if(same_options.length == 0){ return }
79
+ //See if we have that poll!
80
+ setMarketData({
81
+ ...market_data,
82
+ poll_summaries: poll_summaries.filter(po => !same_options.find(so => so.poll_option_id == po.poll_option_id)).concat(same_options)
83
+ })
84
+ },[JSON.stringify(socket_summaries)])
85
+
86
+ useEffect(() => {
87
+ if(!socket_campaign){ return }
88
+ if(!poll_campaign){ return }
89
+ if(poll_campaign.poll_campaign_id != socket_campaign.poll_campaign_id){ return }
90
+ setMarketData({
91
+ ...market_data,
92
+ poll_campaign: socket_campaign
93
+ })
94
+ },[socket_campaign]);
95
+
96
+ useEffect(() => {
97
+ if(socket_polls.length == 0){ return }
98
+ if(!poll){ return }
99
+ let same_poll = socket_polls.find(p => p.poll_id == poll.poll_id);
100
+ if(!same_poll){ return }
101
+ if(same_poll.status == 'active' && poll.status == 'pending'){ loadMarket(poll_id); return }
102
+ //See if we have that poll!
103
+ setMarketData({ ...market_data, poll: same_poll })
104
+ }, [JSON.stringify(socket_polls)])
105
+
106
+ useEffect(() => {
107
+ if(socket_poll_options.length == 0){ return }
108
+ if(!poll){ return }
109
+ let same_options = socket_poll_options.filter(p => p.poll_id == poll.poll_id);
110
+ if(same_options.length == 0){ return }
111
+ //See if we have that poll!
112
+ setMarketData({
113
+ ...market_data,
114
+ poll_options: poll_options.filter(po => !same_options.find(so => so.poll_option_id == po.poll_option_id)).concat(same_options)
115
+ })
116
+ }, [JSON.stringify(socket_poll_options)])
117
+
118
+ const loadMarket = async(id:string) => {
119
+ setMarketData({ ...market_data, loading: true })
120
+ const pr = await FlashMarketApi.getPollById(id);
121
+ if(!pr){ return }
122
+ const pc = await FlashMarketApi.getPollCampaignById(pr.poll.poll_campaign_id);
123
+ setMarketData({
124
+ ...market_data,
125
+ poll: pr.poll,
126
+ poll_campaign:pc,
127
+ poll_options:pr.poll_options,
128
+ poll_summaries: pr.poll_summaries,
129
+ loading:false
130
+ });
131
+ setDraftData({ ...draft_data, stake: pr.poll.minimum_stake.toFixed(2) });
132
+ if(init_expanded){ setExpanded(true) }
133
+ }
134
+
135
+ const handleSubmit = async(poll_option:PollOptionProps) => {
136
+ if(!player_id){ return onRequestAuthenticate() }
137
+ if(!order_valid){ return }
138
+ if(action_loading){ return }
139
+ if(!poll_campaign){ return }
140
+ if(poll_campaign.market_type == 'FOR_MONEY'){
141
+ if(!location){ return onRequestLocation() }
142
+ if(!location.legal_ind){ return alert(`Real money flash markets are not available in your current location`) }
143
+ }
144
+ setActionLoading(true);
145
+ let stake_num = parseFloat(draft_data.stake);
146
+ const response = await FlashMarketApi.createPMOrder(poll_option.poll_option_id, stake_num);
147
+ if(!response){ return alert('Unable to process order') }
148
+ setMyData({
149
+ ...my_data,
150
+ my_response: response.poll_response
151
+ });
152
+ setSelectedOption(undefined);
153
+ setActionLoading(false)
154
+
155
+ }
156
+
157
+ const generateResultIcon = (option:PollOptionProps) => {
158
+ switch(option.result_ind){
159
+ case 'win':
160
+ return (
161
+ <Icons.CheckIcon color={Colors.text.success} size={18} />
162
+ )
163
+ case 'lose':
164
+ return (
165
+ <Icons.CloseIcon color={Colors.text.error} size={14} />
166
+ )
167
+ case 'draw':
168
+ return (
169
+ <Icons.AlertIcon color={Colors.text.h1} size={18}/>
170
+ )
171
+ default: return <></>
172
+ }
173
+ }
174
+
175
+ const generateStatusIcon = (poll:PollProps) => {
176
+ switch(poll.status){
177
+ case 'active': return <Icons.ActivityIcon size={18} color={Colors.text.success} />
178
+ case 'paused': return <Icons.PausedIcon size={18} color={Colors.text.h1} />
179
+ case 'closed': return <Icons.LockClosedIcon size={18} color={Colors.text.h1}/>
180
+ default: return <Icons.AlertIcon size={18} color={Colors.text.warning} />
181
+ }
182
+ }
183
+
184
+ const getColor = (number:number) => {
185
+ if(number > 0){ return Colors.text.success }
186
+ if(number < 0){ return Colors.text.error }
187
+ return Colors.text.h1
188
+ }
189
+
190
+ const loadMyData = async() => {
191
+ if(!poll){ return }
192
+ setMyData({ ...my_data, me_loading: true });
193
+ let responses = await FlashMarketApi.getMyCampaignResponses(poll.poll_campaign_id);
194
+ let response = responses.find(r => r.poll_id == poll_id);
195
+ setMyData({ ...my_data, me_loading: false, my_response:response })
196
+ }
197
+
198
+ const renderOptions = (data:{ item:PollOptionProps, index:number }) => {
199
+ const my_option = data.item.poll_option_id == my_response?.poll_option_id ? my_response : undefined
200
+ const response_stats = FlashMarketHelpers.getResponseStats(data.item, my_option);
201
+ const selected = selected_option?.poll_option_id == data.item.poll_option_id ? true : false
202
+ return (
203
+ <View transparent style={{ borderRadius:8, flexDirection:'row', alignItems:'center', borderWidth:my_option?1:0, borderColor:Colors.text.action, padding:10 }}>
204
+ {my_option ?
205
+ <View transparent style={{ marginRight:10 }}>
206
+ {player ?
207
+ <Image
208
+ source={{ uri: player.profile_pic && player.profile_pic != '' ? player.profile_pic : 'https://res.cloudinary.com/hoabts6mc/image/upload/v1722453927/default_man_n96ofq.webp' }}
209
+ style={{ height:30, width:30, borderRadius:4 }}
210
+ resizeMode='cover'
211
+ />
212
+ :
213
+ <Icons.UserIcon color={Colors.text.action} size={14} />
214
+ }
215
+ </View>
216
+ :<></>}
217
+ <View transparent style={{ flex:1 }}>
218
+ <Text theme='h1'>{data.item.option_name}</Text>
219
+ {selected && data.item.parimutuel_odds && data.item.parimutuel_odds > 0 ?
220
+ <Text theme='h2' style={{ marginTop:3 }} color={Colors.text.action}>${draft_data.stake} to win ${potential_winnings.toFixed(2)}</Text>
221
+ :<></>}
222
+ </View>
223
+ {my_option?.result_ind ?
224
+ <View float style={{ justifyContent:'center', alignItems:'center', padding:5 }}>
225
+ <Text theme='h2' textAlign='center' color={getColor(response_stats.earnings)}>{cl}{response_stats.earnings.toFixed(2)}</Text>
226
+ <Text theme='description' textAlign='center' color={getColor(response_stats.earnings)}>Earnings</Text>
227
+ </View>
228
+ : my_option ?
229
+ <View float style={{ justifyContent:'center', alignItems:'center', padding:5 }}>
230
+ <Text theme='h2' textAlign='center' color={Colors.text.h1}>{cl}{response_stats.stake.toFixed(2)} to win {cl}{response_stats.potential_winnings.toFixed(2)}</Text>
231
+ </View>
232
+ :<></>}
233
+ {!selected ?
234
+ <View transparent style={{ marginRight:10, marginLeft:10 }}>
235
+ <Text theme='h1' color={Colors.text.action}>{((data.item.parimutuel_odds ?? 0)*100).toFixed(2)}%</Text>
236
+ </View>
237
+ :<></>}
238
+ {selected ?
239
+ <View transparent style={{ flexDirection:'row' }}>
240
+ <TextInput
241
+ onFocusPosition={onFocusPosition}
242
+ onChangeText={(text) => setDraftData({ ...draft_data, stake: text })}
243
+ style={{ width: 75, textAlign:'center', padding:10 }}
244
+ value={draft_data.stake}
245
+ />
246
+ <Button
247
+ type='success'
248
+ disabled={!order_valid || action_loading}
249
+ loading={action_loading}
250
+ style={{ padding:10, marginLeft:10, opacity:order_valid && !action_loading?1:0.5 }}
251
+ title='SUBMIT'
252
+ onPress={() => handleSubmit(data.item)}
253
+ />
254
+ <Button
255
+ title='X'
256
+ style={{ padding:10, marginLeft:10 }}
257
+ transparent
258
+ title_color={Colors.text.error}
259
+ onPress={() => setSelectedOption(undefined)}
260
+ />
261
+ </View>
262
+ :
263
+ <View transparent>
264
+ {!loading && !me_loading && allow_order ?
265
+ <Button
266
+ type='action'
267
+ disabled={action_loading}
268
+ style={{ padding:10 }}
269
+ onPress={() => setSelectedOption(data.item)}
270
+ >
271
+ <Text theme='h1' color={Colors.text.white}>Buy</Text>
272
+ </Button>
273
+ :<></>}
274
+ </View>
275
+ }
276
+ {data.item.result_ind ?
277
+ <View transparent style={{ padding:10 }}>
278
+ {generateResultIcon(data.item)}
279
+ </View>
280
+ :<></>}
281
+ {me_loading ?
282
+ <ActivityIndicator size={'small'} color={Colors.text.h1} />
283
+ :<></>}
284
+ </View>
285
+ )
286
+ }
287
+
288
+ if(!poll || loading){ return <></> }
289
+ const stats = FlashMarketHelpers.getStats(poll_summaries);
290
+ return (
291
+ <View transparent>
292
+ <View type='header' style={{ padding:10, flexDirection:'row', alignItems:'center' }}>
293
+ {poll.poll_image ?
294
+ <Image
295
+ source={{ uri: poll.poll_image?.url }}
296
+ style={{ height:50, width:50 }}
297
+ resizeMode='cover'
298
+ />
299
+ :
300
+ <Icons.FlameIcon color={Colors.text.warning} size={24} />
301
+ }
302
+ <View transparent style={{ flex:1, marginLeft:10 }}>
303
+ <Text theme='h1'>Flash Market🔥🔥</Text>
304
+ <Text theme='h2' style={{ marginTop:4 }}>{poll.poll_question}</Text>
305
+ </View>
306
+ {generateStatusIcon(poll)}
307
+ <Button
308
+ transparent
309
+ onPress={() => setExpanded(!expanded)}
310
+ >
311
+ <Icons.ChevronIcon direction={expanded ? 'up' : 'down'} size={8} color={Colors.text.action} />
312
+ </Button>
313
+ </View>
314
+ <View transparent type='body'>
315
+ {show_help ?
316
+ <View transparent>
317
+ <FlashMarketHelp />
318
+ </View>
319
+ :
320
+ <View transparent>
321
+ {expanded ?
322
+ <View transparent type='body' style={{ padding:10, minHeight:100 }}>
323
+ <FlatList
324
+ data={visible_options}
325
+ key={`poll_${poll_id}_options`}
326
+ renderItem={renderOptions}
327
+ keyExtractor={(item) => item.poll_option_id.toString()}
328
+ />
329
+ {['paused','pending'].includes(poll.status) ?
330
+ <View type='blur' style={{ position:'absolute', top:0, left:0, right:0, bottom:0, justifyContent:'center', alignItems:'center' }}>
331
+ <View float style={{ flexDirection:'row', alignItems:'center', padding:20 }}>
332
+ <Icons.PausedIcon size={35} color={Colors.text.h1} />
333
+ <View transparent style={{ marginLeft:20 }}>
334
+ <Text theme='h1'>Market Is Inactive</Text>
335
+ {poll.poll_open_time ?
336
+ <Text theme='warning'>Market opens at {moment(poll.poll_open_time).format('MMM DD hh:mm a')}</Text>
337
+ :<></>}
338
+ </View>
339
+ </View>
340
+ </View>
341
+ :<></>}
342
+ </View>
343
+ :<></>}
344
+ </View>
345
+ }
346
+ </View>
347
+ {expanded ?
348
+ <View type='footer' style={{ flexDirection:'row', alignItems:'center', padding:10 }}>
349
+ <Button transparent style={{ justifyContent:'center', alignItems:'center', borderRadius:0, padding:5, paddingRight:10, marginRight:10, borderRightWidth:1, borderColor:Colors.borders.light }}
350
+ onPress={() => setShowHelp(!show_help)}>
351
+ <Icons.AlertIcon color={show_help?Colors.text.error:Colors.text.warning} size={18} />
352
+ <Text style={{ marginTop:2 }} theme='description' color={show_help?Colors.text.error:Colors.text.warning} textAlign='center'>{show_help?'CLOSE':'HELP'}</Text>
353
+ </Button>
354
+ <View transparent style={{ justifyContent:'center', alignItems:'center', padding:5 }}>
355
+ <Text theme='h1' color={Colors.text.action} textAlign='center'>${(1).toFixed(2)}</Text>
356
+ <Text style={{ marginTop:2 }} theme='description' textAlign='center'>MAX BET</Text>
357
+ </View>
358
+ <View style={{ flex:1 }} />
359
+ <View transparent style={{ justifyContent:'center', alignItems:'center', padding:5 }}>
360
+ <Text theme='h1' color={Colors.text.action} textAlign='center'>${stats.total_staked.toFixed(2)}</Text>
361
+ <Text style={{ marginTop:2 }} theme='description' textAlign='center'>TOTAL POOL</Text>
362
+ </View>
363
+ </View>
364
+ :<></>}
365
+ <SocketManager
366
+ onConnect={() => {
367
+ if(needs_reload){
368
+ setNeedsReload(false);
369
+ return loadMarket(poll_id)
370
+ }
371
+ return
372
+ }}
373
+ onDisconnect={() => setNeedsReload(true)}
374
+ onSocketEvent={(ev) => {
375
+ switch(ev.type){
376
+ case 'UPDATE_POLL_CAMPAIGNS':
377
+ if(!poll_campaign){ return }
378
+ let pc = ev.poll_campaigns.find((pc:PollCampaignProps) => pc.poll_campaign_id == poll_campaign.poll_campaign_id);
379
+ if(!pc){ return }
380
+ setSocketCampaign(pc)
381
+ break;
382
+ case 'UPDATE_POLLS':
383
+ if(ev.polls.length == 0){ return }
384
+ if(!ev.polls[0]){ return }
385
+ setSocketPolls(ev.polls)
386
+ break
387
+ case 'UPDATE_POLL_OPTIONS':
388
+ if(ev.poll_options.length == 0){ return }
389
+ let these_options = ev.poll_options.filter((po:PollOptionProps) => po.poll_id == poll_id);
390
+ //let existing_polls = polls.filter(p => ev.poll_options.map((o:PollOptionProps) => o.poll_id.toString()).includes(p.poll_id.toString()))
391
+ //if(existing_polls.length == 0){ return } //No our poll!
392
+ setSocketPollOptions(these_options)
393
+ break
394
+ case 'UPDATE_POLL_SUMMARIES':
395
+ if(ev.poll_summaries.length == 0){ return }
396
+ let these_summaries = ev.poll_summaries.filter((ps:PollSummaryProps) => ps.poll_id == poll_id);
397
+ setSocketSummaries(these_summaries);
398
+ break
399
+ default: break;
400
+ }
401
+ }}
402
+ subscribed_events={['UPDATE_POLL_CAMPAIGNS', 'UPDATE_POLLS','UPDATE_POLL_OPTIONS', 'UPDATE_POLL_SUMMARIES']}
403
+ />
404
+ </View>
405
+ )
406
+ }
407
+
408
+ export default FlashMarket
@@ -171,6 +171,15 @@ const PollCampaignGoalApi = {
171
171
  }
172
172
 
173
173
  const PollResponseApi = {
174
+ createPMOrder: async(poll_option_id:string, stake:number):Promise<{ poll_response:PollResponseProps, my_leader:PollCampaignLeaderProps, poll_campaign:PollCampaignProps } | undefined> => {
175
+ try {
176
+ const resp = await axios.post(`${AUTH_SVC_API}/v2/pm/action/order`, { poll_option_id, stake });
177
+ return resp.data
178
+ } catch (e) {
179
+ console.log(e);
180
+ return undefined
181
+ }
182
+ },
174
183
  createPollResponse : async(poll_response:PollResponseProps):Promise<PollResponseProps> => {
175
184
  const resp = await axios.post(`${AUTH_SVC_API}/v1/polls/poll/response/create`, { poll_response })
176
185
  return resp.data.poll_response
@@ -7,14 +7,23 @@ import { useColors } from '../../constants/useColors';
7
7
 
8
8
  type CampaignHeaderProps = {
9
9
  poll_campaign:PollCampaignProps,
10
+ onBack?:() => void,
10
11
  onSharePollCampaign:(pc:PollCampaignProps) => void
11
12
  }
12
13
 
13
- const CampaignHeader = ({ poll_campaign, onSharePollCampaign }:CampaignHeaderProps) => {
14
+ const CampaignHeader = ({ poll_campaign, onSharePollCampaign, onBack }:CampaignHeaderProps) => {
14
15
  const Colors = useColors();
15
16
  return (
16
17
  <View>
17
18
  <View type='header' nativeID="competition_header" style={{ flexDirection:'row', alignItems:'center', padding:20, borderBottomWidth:1 }}>
19
+ {onBack ?
20
+ <Button
21
+ transparent
22
+ style={{ paddingLeft:0, paddingRight:20 }}
23
+ >
24
+ <Icons.ChevronIcon direction='left' color={Colors.text.h1} size={10} />
25
+ </Button>
26
+ :<></>}
18
27
  <View transparent>
19
28
  <Image
20
29
  source={{ uri: poll_campaign.campaign_image?.url ?? 'https://res.cloudinary.com/hoabts6mc/image/upload/v1649737862/be_logo_jte2ux.webp' }}
@@ -100,9 +100,9 @@ const CampaignLeaderboard = ({ poll_campaign, height, mode, view_mode, onShowFul
100
100
  }
101
101
 
102
102
  return (
103
- <View float style={{ flex:1, borderRadius:22, maxHeight: height-20, width: mode == 'desktop'?500:undefined }}>
103
+ <View float style={{ flex:1, maxHeight: height-20, width: mode == 'desktop'?500:undefined }}>
104
104
  {my_leader && me ?
105
- <View type='header' nativeID="my_results" style={{ padding:10, borderTopRightRadius:22, borderTopLeftRadius:22 }}>
105
+ <View type='header' nativeID="my_results" style={{ padding:10 }}>
106
106
  <Text style={{ padding:10 }} size={14} theme='h1' weight='bold'>My Results</Text>
107
107
  <View float style={{ flexDirection:'row', alignItems:'center', margin:4, padding:5, borderRadius:22 }}>
108
108
  <View transparent nativeID="player" style={{ flex:1, flexDirection:'row', alignItems:'center' }}>
@@ -17,14 +17,17 @@ type PollCampaignModuleProps = {
17
17
  player_id?:string,
18
18
  view_mode:'desktop'|'mobile',
19
19
  distinct_id:string,
20
+ insets?:{ top:number, bottom:number, left:number, right:number },
21
+ onBack?:() => void,
20
22
  onEvent?:(be_event:BEEventProps) => void,
21
23
  onRequestAuthenticate: (auth_strategy_id?:string, company_id?:string) => void,
22
24
  onSharePollCampaign: (poll_campaign:PollCampaignProps) => void,
23
25
  onComplete:() => void
26
+
24
27
  }
25
28
 
26
29
  const sections = ['header', 'progress', 'results','questions']
27
- const PollCampaign = ({ distinct_id, view_mode, poll_campaign_id, player_id, onRequestAuthenticate, onSharePollCampaign }: PollCampaignModuleProps ) => {
30
+ const PollCampaign = ({ distinct_id, view_mode, poll_campaign_id, player_id, insets, onBack, onRequestAuthenticate, onSharePollCampaign }: PollCampaignModuleProps ) => {
28
31
  const [ needs_reload, setNeedsReload ] = useState(false);
29
32
  const [ socket_polls, setSocketPolls ] = useState<PollProps[]>([]);
30
33
  const [ socket_campaign, setSocketCampaign ] = useState<PollCampaignProps|undefined>(undefined);
@@ -96,12 +99,15 @@ const PollCampaign = ({ distinct_id, view_mode, poll_campaign_id, player_id, onR
96
99
  const handleSubmitResponse = async(pr:PollResponseProps) => {
97
100
  if(!player_id){ return onRequestAuthenticate(poll_campaign?.auth_strategy_id, poll_campaign?.company_id) }
98
101
  try {
102
+ if(!pr.poll_option_id || !pr.stake){ return }
99
103
  if(action_loading){ return }
100
104
  setMyData({ ...my_data, action_loading: true })
101
- let new_pr = await PollResponseApi.createPollResponse(pr);
105
+ //let new_pr = await PollResponseApi.createPollResponse(pr);
106
+ let response = await PollResponseApi.createPMOrder(pr.poll_option_id, parseFloat(pr.stake as string))
107
+ if(!response){ return setMyData({ ...my_data, action_loading:false }) }
102
108
  setMyData({
103
109
  ...my_data,
104
- poll_responses: poll_responses.filter(pr => pr.poll_response_id != new_pr.poll_response_id).concat(new_pr)
110
+ poll_responses: poll_responses.filter(pr => pr.poll_response_id != response.poll_response.poll_response_id).concat(response.poll_response)
105
111
  })
106
112
  } catch (e) {
107
113
  alert('Unable to process!')
@@ -126,6 +132,7 @@ const PollCampaign = ({ distinct_id, view_mode, poll_campaign_id, player_id, onR
126
132
  if(!poll_campaign){ return <></> }
127
133
  return (
128
134
  <CampaignHeader
135
+ onBack={onBack}
129
136
  poll_campaign={poll_campaign}
130
137
  onSharePollCampaign={onSharePollCampaign}
131
138
  />
@@ -191,7 +198,7 @@ const PollCampaign = ({ distinct_id, view_mode, poll_campaign_id, player_id, onR
191
198
  transparent
192
199
  visible={active_poll_id ? true : false}
193
200
  >
194
- <View type='blur' style={view_mode=='desktop'?{flex:1, justifyContent:'center', alignItems:'center'}:{ flex:1, justifyContent:'flex-end', padding:12 }}>
201
+ <View type='blur' style={view_mode=='desktop'?{flex:1, justifyContent:'center', alignItems:'center'}:{ flex:1, justifyContent:'flex-end', padding:12, paddingBottom:(insets?.bottom??0) + 12, paddingTop:(insets?.top??0) + 12 }}>
195
202
  <PollCard
196
203
  poll_id={active_poll_id}
197
204
  action_loading={action_loading}
@@ -213,7 +220,7 @@ const PollCampaign = ({ distinct_id, view_mode, poll_campaign_id, player_id, onR
213
220
  visible={full_leaderboard?true:false}
214
221
  style={{ flex:1 }}
215
222
  >
216
- <View type='blur' style={view_mode=='desktop'?{flex:1, justifyContent:'center', alignItems:'center'}:{ flex:1, justifyContent:'flex-end', padding:12 }}>
223
+ <View type='blur' style={view_mode=='desktop'?{flex:1, justifyContent:'center', alignItems:'center'}:{ flex:1, justifyContent:'flex-end', padding:12, paddingBottom:(insets?.bottom??0) + 12, paddingTop:(insets?.top??0) + 12 }}>
217
224
  <CampaignLeaderboard
218
225
  poll_campaign={poll_campaign}
219
226
  view_mode='full'
package/src/index.tsx CHANGED
@@ -47,6 +47,7 @@ import PlayerRecommender from './PlayerRecommender';
47
47
  import ContactsCard from './PlayerRecommender/components/ContactCard';
48
48
  import ContactsSelector from './PlayerRecommender/components/ContactsSelector';
49
49
  import GolfScoreboard from './GolfScoreboard';
50
+ import FlashMarket from './FlashMarket';
50
51
 
51
52
  export {
52
53
  Authenticator,
@@ -56,6 +57,7 @@ export {
56
57
  Ticker,
57
58
  LeaderboardCard,
58
59
  LocationTracker,
60
+ FlashMarket,
59
61
  ContactsCard,
60
62
  PlayerRecommender,
61
63
  GolfScoreboard,
package/src/types.d.ts CHANGED
@@ -728,7 +728,10 @@ export interface PollCampaignProps {
728
728
  company_id?:string,
729
729
  admins:string[],
730
730
  phone:string,
731
+ market_type:'FREE'|'FOR_MONEY',
731
732
  total_responses:number,
733
+ prize_image?:any,
734
+ prize_override?:string,
732
735
  status: string,
733
736
  campaign_type: 'predict'|'trivia'|'feedback',
734
737
  active_polls?:number,
@@ -770,26 +773,35 @@ export interface PollCampaignGoalProps {
770
773
  }
771
774
 
772
775
 
776
+
773
777
  export interface PollCampaignLeaderProps {
774
778
  poll_campaign_leader_id:string,
775
779
  poll_campaign_id:string,
776
780
  player_id:string,
777
781
  place:number,
782
+ status: 'inprogress'|'closed',
778
783
  winnings:number,
779
- stake:number,
784
+ potential_winnings:number,
785
+ staked:number,
780
786
  responses:number,
787
+ earnings:number,
788
+ resolved_datetime?:any,
781
789
  create_datetime:any,
782
790
  last_update_datetime:any
783
791
  }
784
792
 
793
+
785
794
  export interface PollProps {
786
795
  poll_id:string,
787
796
  poll_campaign_id:string,
788
797
  poll_question: string,
789
798
  market_type:'FOR_MONEY'|'FREE',
790
799
  status:string,
800
+ minimum_pool?:number,
801
+ poll_open_time?:any,
791
802
  coupon_campaign_id?:string,
792
803
  coupon_payout_type?:any,
804
+ max_stake:number,
793
805
  require_resolution?:boolean,
794
806
  tie_breaker?:boolean,
795
807
  poll_type: 'select'|'input',