|
"use client"; |
|
|
|
import { useState } from "react"; |
|
|
|
import { Form } from "@/_types"; |
|
import { generate } from "@/app/_actions/generate"; |
|
|
|
import { Brand } from "./step/brand"; |
|
import { Steps } from "./step/list"; |
|
import { Industry } from "./step/industry"; |
|
import { Description } from "./step/description"; |
|
import classNames from "classnames"; |
|
import { toast } from "react-toastify"; |
|
import Image from "next/image"; |
|
|
|
export const Generation = () => { |
|
const [form, setForm] = useState<Form>({ |
|
brand_name: "", |
|
display_name: false, |
|
description: "", |
|
industry: "", |
|
style: "", |
|
}); |
|
|
|
const [loading, setLoading] = useState<boolean>(false); |
|
const [result, setResult] = useState<number | undefined>(undefined); |
|
|
|
const handleGenerate = async () => { |
|
if (loading) return; |
|
setLoading(true); |
|
try { |
|
const response = await generate(form); |
|
setResult(response.data); |
|
} catch (err) { |
|
toast.error("An error occurred. Please try again later."); |
|
} finally { |
|
setLoading(false); |
|
} |
|
}; |
|
|
|
return ( |
|
<main id="generation" className="w-full py-10 lg:py-20"> |
|
<h3 className="max-w-4xl text-2xl lg:text-3xl text-[#aaaaaa] font-semibold mb-12 text-center mx-auto"> |
|
Start your <span className="text-white">generation</span> here. |
|
</h3> |
|
<Steps form={form} /> |
|
<div className="grid grid-cols-1 lg:grid-cols-3 gap-8 lg:gap-20"> |
|
<Brand form={form} setForm={setForm} /> |
|
<Description form={form} setForm={setForm} /> |
|
<Industry form={form} setForm={setForm} /> |
|
<div className="lg:col-span-3 flex items-center justify-center"> |
|
<button |
|
className={classNames( |
|
"max-lg:w-full rounded-full bg-white text-zinc-950 font-medium text-sm px-6 py-3 hover:bg-opacity-80 transition-all duration-150 disabled:bg-zinc-500 disabled:text-zinc-700", |
|
{ |
|
"animate-pulse": loading, |
|
} |
|
)} |
|
disabled={!form.brand_name || !form.description || !form.industry} |
|
onClick={handleGenerate} |
|
> |
|
{loading ? "Generating..." : "Generate my Logo"} |
|
</button> |
|
</div> |
|
{result && ( |
|
<div className="lg:col-span-3 flex items-center justify-center rounded-3xl"> |
|
<Image |
|
src={`/api/images/${result}`} |
|
alt="Generated logo" |
|
className="h-[300px]" |
|
width={400} |
|
height={400} |
|
/> |
|
</div> |
|
)} |
|
</div> |
|
</main> |
|
); |
|
}; |
|
|