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.
- package/lib/commonjs/Engage/api/index.js +13 -2
- package/lib/commonjs/Engage/api/index.js.map +1 -1
- package/lib/commonjs/Engage/components/EngageHeader.js +2 -0
- package/lib/commonjs/Engage/components/EngageHeader.js.map +1 -1
- package/lib/commonjs/Engage/components/PollCampaignCard.js +110 -0
- package/lib/commonjs/Engage/components/PollCampaignCard.js.map +1 -0
- package/lib/commonjs/Engage/index.js +83 -12
- package/lib/commonjs/Engage/index.js.map +1 -1
- package/lib/commonjs/FlashMarket/api/index.js +134 -0
- package/lib/commonjs/FlashMarket/api/index.js.map +1 -0
- package/lib/commonjs/FlashMarket/components/FlashMarketHelp.js +91 -0
- package/lib/commonjs/FlashMarket/components/FlashMarketHelp.js.map +1 -0
- package/lib/commonjs/FlashMarket/index.js +631 -0
- package/lib/commonjs/FlashMarket/index.js.map +1 -0
- package/lib/commonjs/Poll/api/index.js +12 -0
- package/lib/commonjs/Poll/api/index.js.map +1 -1
- package/lib/commonjs/Poll/components/CampaignHeader.js +13 -2
- package/lib/commonjs/Poll/components/CampaignHeader.js.map +1 -1
- package/lib/commonjs/Poll/components/CampaignLeaderboard.js +1 -4
- package/lib/commonjs/Poll/components/CampaignLeaderboard.js.map +1 -1
- package/lib/commonjs/Poll/index.js +21 -4
- package/lib/commonjs/Poll/index.js.map +1 -1
- package/lib/commonjs/index.js +7 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/Engage/api/index.js +13 -2
- package/lib/module/Engage/api/index.js.map +1 -1
- package/lib/module/Engage/components/EngageHeader.js +2 -0
- package/lib/module/Engage/components/EngageHeader.js.map +1 -1
- package/lib/module/Engage/components/PollCampaignCard.js +103 -0
- package/lib/module/Engage/components/PollCampaignCard.js.map +1 -0
- package/lib/module/Engage/index.js +83 -12
- package/lib/module/Engage/index.js.map +1 -1
- package/lib/module/FlashMarket/api/index.js +129 -0
- package/lib/module/FlashMarket/api/index.js.map +1 -0
- package/lib/module/FlashMarket/components/FlashMarketHelp.js +84 -0
- package/lib/module/FlashMarket/components/FlashMarketHelp.js.map +1 -0
- package/lib/module/FlashMarket/index.js +622 -0
- package/lib/module/FlashMarket/index.js.map +1 -0
- package/lib/module/Poll/api/index.js +12 -0
- package/lib/module/Poll/api/index.js.map +1 -1
- package/lib/module/Poll/components/CampaignHeader.js +13 -2
- package/lib/module/Poll/components/CampaignHeader.js.map +1 -1
- package/lib/module/Poll/components/CampaignLeaderboard.js +1 -4
- package/lib/module/Poll/components/CampaignLeaderboard.js.map +1 -1
- package/lib/module/Poll/index.js +21 -4
- package/lib/module/Poll/index.js.map +1 -1
- package/lib/module/index.js +2 -1
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/lib/commonjs/Engage/api/index.d.ts +3 -2
- package/lib/typescript/lib/commonjs/Engage/api/index.d.ts.map +1 -1
- package/lib/typescript/lib/commonjs/Engage/components/EngageHeader.d.ts.map +1 -1
- package/lib/typescript/lib/commonjs/Engage/components/PollCampaignCard.d.ts +7 -0
- package/lib/typescript/lib/commonjs/Engage/components/PollCampaignCard.d.ts.map +1 -0
- package/lib/typescript/lib/commonjs/Engage/index.d.ts +2 -1
- package/lib/typescript/lib/commonjs/Engage/index.d.ts.map +1 -1
- package/lib/typescript/lib/commonjs/FlashMarket/api/index.d.ts +27 -0
- package/lib/typescript/lib/commonjs/FlashMarket/api/index.d.ts.map +1 -0
- package/lib/typescript/lib/commonjs/FlashMarket/components/FlashMarketHelp.d.ts +4 -0
- package/lib/typescript/lib/commonjs/FlashMarket/components/FlashMarketHelp.d.ts.map +1 -0
- package/lib/typescript/lib/commonjs/FlashMarket/index.d.ts +13 -0
- package/lib/typescript/lib/commonjs/FlashMarket/index.d.ts.map +1 -0
- package/lib/typescript/lib/commonjs/Poll/api/index.d.ts +1 -0
- package/lib/typescript/lib/commonjs/Poll/api/index.d.ts.map +1 -1
- package/lib/typescript/lib/commonjs/Poll/components/CampaignHeader.d.ts +2 -1
- package/lib/typescript/lib/commonjs/Poll/components/CampaignHeader.d.ts.map +1 -1
- package/lib/typescript/lib/commonjs/Poll/components/CampaignLeaderboard.d.ts.map +1 -1
- package/lib/typescript/lib/commonjs/Poll/index.d.ts +3 -1
- package/lib/typescript/lib/commonjs/Poll/index.d.ts.map +1 -1
- package/lib/typescript/lib/commonjs/index.d.ts +1 -0
- package/lib/typescript/lib/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/lib/module/Engage/api/index.d.ts +3 -2
- package/lib/typescript/lib/module/Engage/api/index.d.ts.map +1 -1
- package/lib/typescript/lib/module/Engage/components/EngageHeader.d.ts.map +1 -1
- package/lib/typescript/lib/module/Engage/components/PollCampaignCard.d.ts +7 -0
- package/lib/typescript/lib/module/Engage/components/PollCampaignCard.d.ts.map +1 -0
- package/lib/typescript/lib/module/Engage/index.d.ts +2 -1
- package/lib/typescript/lib/module/Engage/index.d.ts.map +1 -1
- package/lib/typescript/lib/module/FlashMarket/api/index.d.ts +26 -0
- package/lib/typescript/lib/module/FlashMarket/api/index.d.ts.map +1 -0
- package/lib/typescript/lib/module/FlashMarket/components/FlashMarketHelp.d.ts +4 -0
- package/lib/typescript/lib/module/FlashMarket/components/FlashMarketHelp.d.ts.map +1 -0
- package/lib/typescript/lib/module/FlashMarket/index.d.ts +15 -0
- package/lib/typescript/lib/module/FlashMarket/index.d.ts.map +1 -0
- package/lib/typescript/lib/module/Poll/api/index.d.ts +1 -0
- package/lib/typescript/lib/module/Poll/api/index.d.ts.map +1 -1
- package/lib/typescript/lib/module/Poll/components/CampaignHeader.d.ts +2 -1
- package/lib/typescript/lib/module/Poll/components/CampaignHeader.d.ts.map +1 -1
- package/lib/typescript/lib/module/Poll/components/CampaignLeaderboard.d.ts.map +1 -1
- package/lib/typescript/lib/module/Poll/index.d.ts +3 -1
- package/lib/typescript/lib/module/Poll/index.d.ts.map +1 -1
- package/lib/typescript/lib/module/index.d.ts +2 -1
- package/lib/typescript/lib/module/index.d.ts.map +1 -1
- package/lib/typescript/src/Engage/api/index.d.ts +4 -3
- package/lib/typescript/src/Engage/api/index.d.ts.map +1 -1
- package/lib/typescript/src/Engage/components/PollCampaignCard.d.ts +11 -0
- package/lib/typescript/src/Engage/components/PollCampaignCard.d.ts.map +1 -0
- package/lib/typescript/src/Engage/index.d.ts +4 -3
- package/lib/typescript/src/Engage/index.d.ts.map +1 -1
- package/lib/typescript/src/FlashMarket/api/index.d.ts +32 -0
- package/lib/typescript/src/FlashMarket/api/index.d.ts.map +1 -0
- package/lib/typescript/src/FlashMarket/components/FlashMarketHelp.d.ts +5 -0
- package/lib/typescript/src/FlashMarket/components/FlashMarketHelp.d.ts.map +1 -0
- package/lib/typescript/src/FlashMarket/index.d.ts +20 -0
- package/lib/typescript/src/FlashMarket/index.d.ts.map +1 -0
- package/lib/typescript/src/Poll/api/index.d.ts +5 -0
- package/lib/typescript/src/Poll/api/index.d.ts.map +1 -1
- package/lib/typescript/src/Poll/components/CampaignHeader.d.ts +2 -1
- package/lib/typescript/src/Poll/components/CampaignHeader.d.ts.map +1 -1
- package/lib/typescript/src/Poll/index.d.ts +8 -1
- package/lib/typescript/src/Poll/index.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +2 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/Engage/api/index.ts +14 -3
- package/src/Engage/components/EngageHeader.tsx +2 -2
- package/src/Engage/components/PollCampaignCard.tsx +54 -0
- package/src/Engage/index.tsx +50 -11
- package/src/FlashMarket/api/index.ts +94 -0
- package/src/FlashMarket/components/FlashMarketHelp.tsx +41 -0
- package/src/FlashMarket/index.tsx +408 -0
- package/src/Poll/api/index.ts +9 -0
- package/src/Poll/components/CampaignHeader.tsx +10 -1
- package/src/Poll/components/CampaignLeaderboard.tsx +2 -2
- package/src/Poll/index.tsx +12 -5
- package/src/index.tsx +2 -0
- 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
|
package/src/Poll/api/index.ts
CHANGED
|
@@ -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,
|
|
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
|
|
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' }}>
|
package/src/Poll/index.tsx
CHANGED
|
@@ -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 !=
|
|
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
|
-
|
|
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',
|