1
1
import axios from "axios" ;
2
+ import millify from "millify" ;
2
3
import Icon from "../common/Icon" ;
3
4
import { useRecoilValue } from "recoil" ;
5
+ import { MultiSigner } from "../../utils" ;
6
+ import { useNetworkState } from "react-use" ;
4
7
import { useEffect , useState } from "react" ;
8
+ import { SpinnerCircular } from "spinners-react" ;
9
+ import { useApp } from "../../context/AppContext" ;
5
10
import { Menu , MenuItem } from "@szhsin/react-menu" ;
11
+ import { getMinAmountToStartGame } from "../../utils/helpers" ;
6
12
import { addressAtom , providerAtom } from "../../atoms/appState" ;
7
- import { SpinnerCircular } from "spinners-react" ;
8
- import { MultiSigner } from "../../utils" ;
9
- import algosdk from "algosdk" ;
10
13
11
14
const ticketingOptions = [
12
15
"In 10 minutes" ,
@@ -15,13 +18,16 @@ const ticketingOptions = [
15
18
"In 2 hours" ,
16
19
] ;
17
20
const withdrawalOptions = [
21
+ "15 minutes after" ,
18
22
"1 hour after" ,
19
23
"2 hours after" ,
20
24
"3 hours after" ,
21
25
"4 hours after" ,
22
26
] ;
23
27
24
28
const NewGameModal = ( { closeNewGameModal, refetchCurrentGame } ) => {
29
+ const network = useNetworkState ( ) ;
30
+ const { acctBalance } = useApp ( ) ;
25
31
const address = useRecoilValue ( addressAtom ) ;
26
32
const provider = useRecoilValue ( providerAtom ) ;
27
33
@@ -35,9 +41,9 @@ const NewGameModal = ({ closeNewGameModal, refetchCurrentGame }) => {
35
41
const [ maxGuessNumber , setMaxGuessNumber ] = useState ( 10000 ) ;
36
42
const [ maxPlayersAllowed , setMaxPlayersAllowed ] = useState ( 2 ) ;
37
43
const [ ticketingStart , setTicketStart ] = useState ( "In 10 minutes" ) ;
38
- const [ withdrawalStart , setWithdrawalStart ] = useState ( "1 hour after" ) ;
44
+ const [ withdrawalStart , setWithdrawalStart ] = useState ( "15 minutes after" ) ;
39
45
40
- const ticketingValue = ( ) =>
46
+ const ticketingDateValue = ( ) =>
41
47
Math . round (
42
48
Date . now ( ) / 1000 +
43
49
( ticketingStart === "In 10 minutes"
@@ -49,7 +55,7 @@ const NewGameModal = ({ closeNewGameModal, refetchCurrentGame }) => {
49
55
: 7200 )
50
56
) ;
51
57
52
- const withdrawalValue = ( ) =>
58
+ const withdrawalDateValue = ( ) =>
53
59
Math . round (
54
60
Date . now ( ) / 1000 +
55
61
( ticketingStart === "In 10 minutes"
@@ -60,7 +66,9 @@ const NewGameModal = ({ closeNewGameModal, refetchCurrentGame }) => {
60
66
? 3600
61
67
: 7200 )
62
68
) +
63
- ( withdrawalStart === "1 hour after"
69
+ ( withdrawalStart === "15 minutes after"
70
+ ? 900
71
+ : withdrawalStart === "1 hour after"
64
72
? 3600
65
73
: withdrawalStart === "2 hours after"
66
74
? 7200
@@ -69,12 +77,16 @@ const NewGameModal = ({ closeNewGameModal, refetchCurrentGame }) => {
69
77
: 14400 ) ;
70
78
71
79
const startNewGame = async ( ) => {
80
+ if ( acctBalance < gameCost ) {
81
+ setError ( "Insufficient balance!" ) ;
82
+ return ;
83
+ }
84
+
72
85
if ( loading ) return ;
73
86
if ( ! address ) return setError ( "Please connect your wallet first!" ) ;
74
87
75
88
const params = {
76
- winMultiplier :
77
- winMultiplier > 10 ? 10 : winMultiplier < 0 ? 2 : winMultiplier ,
89
+ winMultiplier : winMultiplier < 0 ? 2 : winMultiplier ,
78
90
ticketFee : ( ticketFee > 10 ? 10 : ticketFee < 0 ? 1 : ticketFee ) * 1e6 ,
79
91
ticketingDuration :
80
92
durationType === "m"
@@ -87,16 +99,11 @@ const NewGameModal = ({ closeNewGameModal, refetchCurrentGame }) => {
87
99
: maxGuessNumber < 0
88
100
? 100
89
101
: maxGuessNumber ,
90
- maxPlayersAllowed :
91
- maxPlayersAllowed > 50
92
- ? 50
93
- : maxPlayersAllowed < 2
94
- ? 2
95
- : maxPlayersAllowed ,
102
+ maxPlayersAllowed : maxPlayersAllowed < 2 ? 2 : maxPlayersAllowed ,
96
103
97
104
gameMasterAddr : address ,
98
- ticketingStart : ticketingValue ( ) ,
99
- withdrawalStart : withdrawalValue ( ) ,
105
+ ticketingStart : ticketingDateValue ( ) ,
106
+ withdrawalStart : withdrawalDateValue ( ) ,
100
107
} ;
101
108
102
109
setError ( "" ) ;
@@ -105,12 +112,14 @@ const NewGameModal = ({ closeNewGameModal, refetchCurrentGame }) => {
105
112
const txnsArr = await axios
106
113
. post ( `/endCurrentAndCreateNewGame` , params )
107
114
. then ( response => {
108
- console . log ( response ) ;
109
115
return response ?. data ?. txns ;
110
116
} ) ;
111
117
112
118
if ( txnsArr ?. length ) await MultiSigner ( txnsArr , provider ) ;
113
- refetchCurrentGame ( ) ;
119
+
120
+ console . log ( "New game started successfully!" ) ;
121
+
122
+ await refetchCurrentGame ( ) ;
114
123
closeNewGameModal ( ) ;
115
124
} catch ( error ) {
116
125
console . log ( error ) ;
@@ -140,9 +149,29 @@ const NewGameModal = ({ closeNewGameModal, refetchCurrentGame }) => {
140
149
141
150
useEffect ( ( ) => {
142
151
handleDurationChange ( ) ;
143
- // eslint-disable-next-line react-hooks/exhaustive-deps
152
+ // eslint-disable-next-line
144
153
} , [ durationType ] ) ;
145
154
155
+ // Calculate the minimum amount required to start a game
156
+ const [ gameCost , setGameCost ] = useState ( 0 ) ;
157
+ useEffect ( ( ) => {
158
+ if ( ! network ?. online ) return ;
159
+ const getMinCost = async ( ) => {
160
+ const cost = await getMinAmountToStartGame (
161
+ isNaN ( ticketFee ) || ticketFee < 1 ? 1 * 1e6 : ticketFee * 1e6 ,
162
+ isNaN ( winMultiplier ) || winMultiplier < 2 ? 2 : winMultiplier ,
163
+ isNaN ( maxPlayersAllowed ) || maxPlayersAllowed < 2
164
+ ? 2
165
+ : maxPlayersAllowed
166
+ ) ;
167
+
168
+ setGameCost ( cost ) ;
169
+ } ;
170
+
171
+ getMinCost ( ) ;
172
+ // eslint-disable-next-line
173
+ } , [ winMultiplier , ticketFee , maxPlayersAllowed ] ) ;
174
+
146
175
return (
147
176
< >
148
177
< div className = "app-modal__header no-capitalize" >
@@ -162,29 +191,16 @@ const NewGameModal = ({ closeNewGameModal, refetchCurrentGame }) => {
162
191
< div className = "input-block sm" >
163
192
< input
164
193
min = { 0 }
165
- max = { 10 }
166
194
type = "number"
167
195
maxLength = { 3 }
168
196
onBlur = { e => {
169
- setMaxPlayersAllowed (
170
- e . target . value > 10
171
- ? 10
172
- : e . target . value < 0
173
- ? 0
174
- : e . target . value
175
- ) ;
197
+ setWinMultiplier ( e . target . value < 2 ? 2 : e . target . value ) ;
176
198
} }
177
- placeholder = "max 10 "
199
+ placeholder = "Min 2 "
178
200
name = "winMultiplier"
179
201
value = { winMultiplier }
180
202
onChange = { e =>
181
- setWinMultiplier (
182
- e . target . value > 10
183
- ? 50
184
- : e . target . value < 0
185
- ? 2
186
- : e . target . value
187
- )
203
+ setWinMultiplier ( e . target . value < 0 ? 0 : e . target . value )
188
204
}
189
205
/>
190
206
</ div >
@@ -195,29 +211,16 @@ const NewGameModal = ({ closeNewGameModal, refetchCurrentGame }) => {
195
211
< div className = "input-block sm" >
196
212
< input
197
213
min = { 2 }
198
- max = { 50 }
199
214
type = "number"
200
215
maxLength = { 3 }
201
216
onBlur = { e => {
202
- setMaxPlayersAllowed (
203
- e . target . value > 50
204
- ? 50
205
- : e . target . value < 2
206
- ? 2
207
- : e . target . value
208
- ) ;
217
+ setMaxPlayersAllowed ( e . target . value < 2 ? 2 : e . target . value ) ;
209
218
} }
210
- placeholder = "max 50 "
219
+ placeholder = "Min 2 "
211
220
name = "maxPlayersAllowed"
212
221
value = { maxPlayersAllowed }
213
222
onChange = { e =>
214
- setMaxPlayersAllowed (
215
- e . target . value > 50
216
- ? 50
217
- : e . target . value < 0
218
- ? 0
219
- : e . target . value
220
- )
223
+ setMaxPlayersAllowed ( e . target . value < 0 ? 0 : e . target . value )
221
224
}
222
225
/>
223
226
</ div >
@@ -242,7 +245,7 @@ const NewGameModal = ({ closeNewGameModal, refetchCurrentGame }) => {
242
245
) ;
243
246
} }
244
247
value = { maxGuessNumber }
245
- placeholder = "max 10000"
248
+ placeholder = "Max 10000"
246
249
onChange = { e =>
247
250
setMaxGuessNumber (
248
251
e . target . value > 10000 ? 10000 : e . target . value
@@ -257,7 +260,7 @@ const NewGameModal = ({ closeNewGameModal, refetchCurrentGame }) => {
257
260
< div className = "input-block ticket" >
258
261
< input
259
262
type = "number"
260
- placeholder = "min 1"
263
+ placeholder = "Min 1"
261
264
name = "ticketFee"
262
265
maxLength = { 3 }
263
266
value = { ticketFee }
@@ -429,6 +432,33 @@ const NewGameModal = ({ closeNewGameModal, refetchCurrentGame }) => {
429
432
</ div >
430
433
</ div >
431
434
435
+ < div className = "calculations" >
436
+ < div className = "calculations-row" >
437
+ < p className = "key" > Account balance: </ p >
438
+
439
+ < div className = "amount" >
440
+ < Icon . Algo size = { 15 } />
441
+ < p className = "value" >
442
+ { millify ( acctBalance , {
443
+ precision : 2 ,
444
+ } ) }
445
+ </ p >
446
+ </ div >
447
+ </ div >
448
+ < div
449
+ className = { `calculations-row ${
450
+ gameCost < acctBalance ? "valid" : "error"
451
+ } `}
452
+ >
453
+ < p className = "key" > Min amount required: </ p >
454
+
455
+ < div className = "amount" >
456
+ < Icon . Algo size = { 15 } />
457
+ < p className = "value" > { gameCost } </ p >
458
+ </ div >
459
+ </ div >
460
+ </ div >
461
+
432
462
{ loading && (
433
463
< div className = "loading-overlay" >
434
464
< SpinnerCircular size = { 50 } color = "#777" secondaryColor = "#ccc" />
0 commit comments