'use client' import Image from 'next/image' import { useEffect, useState } from 'react' import toast from 'react-hot-toast' import Player from 'react-lottie-player' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { getUserField, storeEmail } from '@/app/actions' import { isValidEmail } from '@/lib/utils' import { useLocalStorage } from '@/lib/hooks/use-local-storage' export function Landing({disableAnimations = false}) { const [validationError, setValidationError] = useState(null) const [email, setEmail] = useState('') const [localIsSubscribed, setLocalIsSubscribed] = useLocalStorage( 'email_subscribed', false ) const [mounted, setMounted] = useState(false) useEffect(() => { setMounted(true) }, []) useEffect(() => { async function fetchUserSubscribed() { const backendIsSubscribed = await getUserField('email_subscribed') if (backendIsSubscribed === true) { setLocalIsSubscribed(true) } } if (localIsSubscribed !== true) { fetchUserSubscribed() } }, [localIsSubscribed, setLocalIsSubscribed]) async function handleSubscribe(e: React.FormEvent) { e.preventDefault() if (!isValidEmail(email)) { setValidationError('Please enter a valid email') return } setValidationError(null) await storeEmail(email) setLocalIsSubscribed(true) setEmail('') toast.success('Thanks for subscribing!') } return ( <>
web3 gpt logo

Deploy smart contracts with AI

Generate

Generate custom smart contracts using a prompt.

Deploy

Deploy your smart contracts from the chat.

Speed Up

Code faster by skipping long and complex setups.


{mounted && localIsSubscribed === false && (

Weekly Updates

Sign up for development updates and early access to latest features

setEmail(e.target.value)} />
{validationError ? (

{validationError}

) : (

No spam, we promise :)

)}
)} ) }