2018-12-02 17:25:49 +00:00
import React from 'react'
import { Formik } from 'formik'
import LiquidPledgingMock from 'Embark/contracts/LiquidPledgingMock'
import Button from '@material-ui/core/Button'
import MenuItem from '@material-ui/core/MenuItem'
import TextField from '@material-ui/core/TextField'
import Snackbar from '@material-ui/core/Snackbar'
import web3 from 'Embark/web3'
2018-12-02 14:46:20 +00:00
import { MySnackbarContentWrapper } from './base/SnackBars'
2018-11-29 20:52:24 +00:00
2018-12-02 17:25:49 +00:00
const { addGiver , addDelegate } = LiquidPledgingMock . methods
const FUNDER = 'FUNDER'
const DELEGATE = 'DELEGATE'
const helperText = {
[ FUNDER ] : 'The length of time in hours the Funder has to veto when the delegates pledge funds to a project' ,
[ DELEGATE ] : 'The length of time in hours the Delegate can be vetoed. Whenever this delegate is in a delegate chain the time allowed to veto any event must be greater than or equal to this time'
}
const adminProfiles = [ FUNDER , DELEGATE ]
2018-11-30 16:52:08 +00:00
const hoursToSeconds = hours => hours * 60 * 60
2018-11-30 15:33:48 +00:00
const addFunderSucessMsg = response => {
2018-11-30 16:52:08 +00:00
const { events : { GiverAdded : { returnValues : { idGiver } } } } = response
return ` Funder created with ID of ${ idGiver } `
2018-11-30 15:33:48 +00:00
}
2018-12-02 17:25:49 +00:00
const addDelegateSucessMsg = response => {
const { events : { DelegateAdded : { returnValues : { idDelegate } } } } = response
return ` Delegate created with ID of ${ idDelegate } `
}
2018-11-29 20:52:24 +00:00
2018-12-02 14:46:20 +00:00
const AddFunder = ( { appendFundProfile } ) => (
2018-11-29 20:52:24 +00:00
< Formik
2018-11-30 16:38:58 +00:00
initialValues = { { funderName : '' , funderDescription : '' , commitTime : '' } }
2018-11-30 15:33:48 +00:00
onSubmit = { async ( values , { setSubmitting , resetForm , setStatus } ) => {
2018-12-02 17:25:49 +00:00
const { adminType , funderName , funderDescription , commitTime } = values
2018-11-30 16:52:08 +00:00
const account = await web3 . eth . getCoinbase ( )
const args = [ funderName , funderDescription , hoursToSeconds ( commitTime ) , 0 ]
2018-12-02 17:25:49 +00:00
const isFunder = adminType === FUNDER
const sendFn = isFunder ? addGiver : addDelegate
sendFn ( ... args )
2018-11-30 15:33:48 +00:00
. estimateGas ( { from : account } )
. then ( async gas => {
2018-12-02 17:25:49 +00:00
sendFn ( ... args )
2018-11-30 15:33:48 +00:00
. send ( { from : account , gas : gas + 100 } )
. then ( res => {
2018-12-02 17:25:49 +00:00
if ( isFunder ) appendFundProfile ( res . events . GiverAdded )
2018-11-30 15:33:48 +00:00
setStatus ( {
2018-12-02 17:25:49 +00:00
snackbar : {
variant : 'success' ,
message : isFunder ? addFunderSucessMsg ( res ) : addDelegateSucessMsg ( res )
}
2018-11-30 15:33:48 +00:00
} )
} )
. catch ( e => {
console . log ( { e } )
setStatus ( {
snackbar : { variant : 'error' , message : 'There was an error' }
} )
} )
} )
2018-11-29 20:52:24 +00:00
} }
>
2018-11-30 15:33:48 +00:00
{ ( {
values ,
errors ,
touched ,
handleChange ,
handleBlur ,
handleSubmit ,
setFieldValue ,
setStatus ,
status
} ) => (
< form onSubmit = { handleSubmit } style = { { display : 'flex' , flexDirection : 'column' } } >
2018-12-02 17:25:49 +00:00
< TextField
id = "adminType"
name = "adminType"
select
label = "Select admin type"
placeholder = "Select admin type"
margin = "normal"
variant = "outlined"
onChange = { handleChange }
onBlur = { handleBlur }
value = { values . adminType || '' }
>
{ adminProfiles . map ( profile => (
< MenuItem style = { { display : 'flex' , alignItems : 'center' } } key = { profile } value = { profile } >
{ profile }
< / MenuItem >
) ) }
< / TextField >
2018-11-30 15:33:48 +00:00
< TextField
id = "funderName"
name = "funderName"
2018-12-02 17:25:49 +00:00
label = { ` ${ values . adminType === FUNDER ? 'Funding' : 'Delegate' } Name ` }
placeholder = { ` ${ values . adminType === FUNDER ? 'Funding' : 'Delegate' } Name ` }
2018-11-30 15:33:48 +00:00
margin = "normal"
variant = "outlined"
onChange = { handleChange }
onBlur = { handleBlur }
value = { values . funderName || '' }
/ >
< TextField
2018-11-30 16:38:58 +00:00
id = "funderDescription"
name = "funderDescription"
2018-12-02 13:24:31 +00:00
label = "Description (URL or IPFS Hash)"
placeholder = "Description (URL or IPFS Hash)"
2018-11-30 15:33:48 +00:00
margin = "normal"
variant = "outlined"
onChange = { handleChange }
onBlur = { handleBlur }
2018-11-30 16:38:58 +00:00
value = { values . funderDescription || '' }
2018-11-30 15:33:48 +00:00
/ >
< TextField
id = "commitTime"
name = "commitTime"
label = "Commit time in hours"
placeholder = "Commit time in hours"
margin = "normal"
variant = "outlined"
2018-12-02 17:25:49 +00:00
helperText = { helperText [ values . adminType ] }
2018-11-30 15:33:48 +00:00
onChange = { handleChange }
onBlur = { handleBlur }
value = { values . commitTime || '' }
/ >
< Button variant = "contained" color = "primary" type = "submit" >
2018-12-02 17:25:49 +00:00
{ ` ADD ${ values . adminType === FUNDER ? 'FUNDING' : 'DELEGATE' } PROFILE ` }
2018-11-30 15:33:48 +00:00
< / Button >
{ status && < Snackbar
anchorOrigin = { {
vertical : 'bottom' ,
horizontal : 'left' ,
} }
open = { ! ! status . snackbar }
autoHideDuration = { 6000 }
onClose = { ( ) => setStatus ( null ) }
>
< MySnackbarContentWrapper
onClose = { ( ) => setStatus ( null ) }
variant = { status . snackbar . variant }
message = { status . snackbar . message }
/ >
< / Snackbar > }
< / form >
) }
< / Formik >
2018-11-29 20:52:24 +00:00
)
2018-11-30 16:52:08 +00:00
export default AddFunder