UNPKG

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
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};