raiserocket
Version:
https://docs.google.com/presentation/d/10rEHd1qQlRZSKmFSHUxEtLvOyvmJMwxf/edit?usp=share_link&ouid=106253845854070702655&rtpof=true&sd=truehttps://docs.google.com/presentation/d/10rEHd1qQlRZSKmFSHUxEtLvOyvmJMwxf/edit?usp=share_link&ouid=1062538458540707026
153 lines (125 loc) • 5.06 kB
JavaScript
import styled from 'styled-components';
import FormLeftWrapper from './Components/FormLeftWrapper'
import FormRightWrapper from './Components/FormRightWrapper'
import { createContext, useState } from 'react';
import {TailSpin} from 'react-loader-spinner';
import { ethers } from 'ethers';
import { toast } from 'react-toastify';
import CampaignFactory from '../../artifacts/contracts/Campaign.sol/CampaignFactory.json'
import Link from 'next/link';
const FormState = createContext();
const Form = () => {
const [form, setForm] = useState({
campaignTitle: "",
story: "",
requiredAmount: "",
category: "education",
});
const [loading, setLoading] = useState(false);
const [address, setAddress] = useState("");
const [uploaded, setUploaded] = useState(false);
const [storyUrl, setStoryUrl] = useState();
const [imageUrl, setImageUrl] = useState();
const FormHandler = (e) => {
setForm({
...form,
[e.target.name]: e.target.value
})
}
const [image, setImage] = useState(null);
const ImageHandler = (e) => {
setImage(e.target.files[0]);
}
const startCampaign = async (e) => {
e.preventDefault();
const provider = new ethers.providers.Web3Provider(window.ethereum);
const signer = provider.getSigner();
if(form.campaignTitle === "") {
toast.warn("Title Field Is Empty");
} else if(form.story === "" ) {
toast.warn("Story Field Is Empty");
} else if(form.requiredAmount === "") {
toast.warn("Required Amount Field Is Empty");
} else if(uploaded == false) {
toast.warn("Files Upload Required")
}
else {
setLoading(true);
const contract = new ethers.Contract(
process.env.NEXT_PUBLIC_ADDRESS,
CampaignFactory.abi,
signer
);
const CampaignAmount = ethers.utils.parseEther(form.requiredAmount);
const campaignData = await contract.createCampaign(
form.campaignTitle,
CampaignAmount,
imageUrl,
form.category,
storyUrl
);
await campaignData.wait();
setAddress(campaignData.to);
}
}
return (
<FormState.Provider value={{form, setForm, image, setImage, ImageHandler, FormHandler, setImageUrl, setStoryUrl, startCampaign, setUploaded}} >
<p className='font-excratch text-[20px] text-secondary-white my-4'>create campaigns</p>
<FormWrapper className='flex justify-center w-[1120px] h-[600px]'>
<FormMain className=' flex flex-col place-content-center ' >
{loading == true ?
address == "" ?
<Spinner>
<TailSpin height={60} />
</Spinner> :
<Address className='mt-20% justify-center flex flex-col '>
<h1 className='font-kinetica text-[16px] uppercase place-content-center translate-[10%] '>Campagin Started Sucessfully!</h1>
<h1 className=' mt-2 font-kinetica text-[16px] text-green place-content-center ' >{address}</h1>
<Link passHref href={'/explore'}>
<Button className='mt-6 translate-x-[90%] transition-all duration-300 cursor-pointer
inline-flex items-center space-x-2 text-green hover:img hover:text-primary-black border
border-green hover:bg-green px-2 py-2.5 text-sm focus:outline-none focus:ring-green-300 font-excratch
rounded-lg text-green dark:border-green dark:text-green dark:hover:text-primary-black dark:hover:bg-green dark:focus:ring-green'>
Go To Campaign
</Button>
</Link>
</Address>
:
<FormInputsWrapper>
<FormLeftWrapper />
<FormRightWrapper />
</FormInputsWrapper>
}
</FormMain>
</FormWrapper>
</FormState.Provider>
)
}
const FormWrapper = styled.div`
background: rgba( 84, 84, 84, 0.4);
box-shadow: 0 8px 32px 0 rgba( 31, 38, 135, 0.37 );
backdrop-filter: blur( 4.5px );
-webkit-backdrop-filter: blur( 4.5px );
border-radius: 10px;
border: 1px solid rgba( 255, 255, 255, 0.18 );
`
const FormMain = styled.div`
`
const FormInputsWrapper = styled.div`
display:flex;
justify-content:space-between ;
margin-top:45px ;
`
const Spinner = styled.div`
width:100%;
height:80vh;
display:flex ;
justify-content:center ;
align-items:center ;
`
const Address = styled.div`
`
const Button = styled.button`
`
export default Form;
export {FormState};