import React, { createRef } from 'react' import { Formik } from 'formik' import LiquidPledging from 'Embark/contracts/LiquidPledging' import {TextField, Button, MenuItem, Snackbar, InputAdornment} from '@material-ui/core' import CloudUpload from '@material-ui/icons/CloudUpload' import web3 from 'Embark/web3' import { MySnackbarContentWrapper } from './base/SnackBars' import { captureFile } from '../utils/ipfs' import ImageViewer from './image/ImageViewer' const { addGiver, addDelegate, addProject } = LiquidPledging.methods const FUNDER = 'FUNDER' const DELEGATE = 'DELEGATE' const PROJECT = 'PROJECT' 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', [PROJECT]: 'The length of time the Project has to veto when the project delegates to another delegate and they pledge those funds to a project' } const funderNameLabel = { [FUNDER]: 'Funding', [DELEGATE]: 'Delegate', [PROJECT]: 'Project' } const buttonLabel = { [FUNDER]: 'FUNDING', [DELEGATE]: 'DELEGATE', [PROJECT]: 'PROJECT' } const sendFns = { [FUNDER]: addGiver, [DELEGATE]: addDelegate, [PROJECT]: addProject } const adminProfiles = [FUNDER, DELEGATE, PROJECT] const hoursToSeconds = hours => hours * 60 * 60 const addFunderSucessMsg = response => { const { events: { GiverAdded: { returnValues: { idGiver } } } } = response return `Funder created with ID of ${idGiver}` } const addDelegateSucessMsg = response => { const { events: { DelegateAdded: { returnValues: { idDelegate } } } } = response return `Delegate created with ID of ${idDelegate}` } const addProjectSucessMsg = response => { const { events: { ProjectAdded: { returnValues: { idProject } } } } = response return `Project created with ID of ${idProject}` } const successMsg = { [FUNDER]: addFunderSucessMsg, [DELEGATE]: addDelegateSucessMsg, [PROJECT]: addProjectSucessMsg } let uploadInput = createRef() const AddFunder = ({ appendFundProfile }) => ( { const { adminType, funderName, funderDescription, commitTime } = values const account = await web3.eth.getCoinbase() //TODO add field for parent project const args = adminType === PROJECT ? [funderName, funderDescription, account, 0, hoursToSeconds(commitTime), 0] : [funderName, funderDescription, hoursToSeconds(commitTime), 0] const isFunder = adminType === FUNDER const sendFn = sendFns[adminType] sendFn(...args) .estimateGas({ from: account }) .then(async gas => { sendFn(...args) .send({ from: account, gas: gas + 100 }) .then(res => { console.log({res}) if (isFunder) appendFundProfile(res.events.GiverAdded) setStatus({ snackbar: { variant: 'success', message: successMsg[adminType](res) } }) }) .catch(e => { console.log({e}) setStatus({ snackbar: { variant: 'error', message: 'There was an error' } }) }) }) }} > {({ values, errors, touched, handleChange, handleBlur, handleSubmit, setFieldValue, setStatus, status }) => (
{adminProfiles.map(profile => ( {profile} ))} { uploadInput = input }} type="file" multiple onChange={ (e) => captureFile( e, hash => setFieldValue('funderDescription', hash), profileImg => setStatus({ profileImg }) ) } style={{ display: 'none' }} /> uploadInput.click()} /> ), }} label={Description (URL or IPFS Hash)} placeholder="Description (URL or IPFS Hash)" margin="normal" variant="outlined" onChange={handleChange} onBlur={handleBlur} value={values.funderDescription || ''} /> {/* {status && status.profileImg && ipfs} */} {status && } {status && status.snackbar && setStatus(null)} > setStatus(null)} variant={status.snackbar.variant} message={status.snackbar.message} /> } )}
) export default AddFunder