"use client" import { useState, useTransition } from "react" import { useSpring, animated } from "@react-spring/web" import { cn } from "@/lib/utils" import { headingFont } from "@/app/interface/fonts" import { useCharacterLimit } from "@/lib/useCharacterLimit" import { generateAnimation } from "@/app/server/actions/animation" export function Generate() { const [_isPending, startTransition] = useTransition() const [isLocked, setLocked] = useState(false) const [promptDraft, setPromptDraft] = useState("") const [assetUrl, setAssetUrl] = useState("") const [isOverSubmitButton, setOverSubmitButton] = useState(false) const { shouldWarn, colorClass, nbCharsUsed, nbCharsLimits } = useCharacterLimit({ value: promptDraft, nbCharsLimits: 70, warnBelow: 10, }) const submitButtonBouncer = useSpring({ transform: isOverSubmitButton ? 'scale(1.05)' : 'scale(1.0)', boxShadow: isOverSubmitButton ? `0px 5px 15px 0px rgba(0, 0, 0, 0.05)` : `0px 0px 0px 0px rgba(0, 0, 0, 0.05)`, loop: true, config: { tension: 300, friction: 10, }, }) const handleSubmit = () => { console.log("handleSubmit:", { isLocked, promptDraft }) if (isLocked) { return } if (!promptDraft) { return } setLocked(true) startTransition(async () => { try { console.log("starting transition, calling generateAnimation") const newAssetUrl = await generateAnimation({ prompt: promptDraft, lora: "https://huggingface.co/ostris/crayon_style_lora_sdxl/resolve/main/crayons_v1_sdxl.safetensors", size: "512x512" // "320x768" }) setAssetUrl(newAssetUrl) } catch (err) { console.error(err) } finally { setLocked(false) } }) } return (
{assetUrl ?
: null}
setPromptDraft(e.target.value)} onKeyDown={({ key }) => { if (key === 'Enter') { if (!isLocked) { handleSubmit() } } }} disabled={isLocked} />
{nbCharsUsed} / {nbCharsLimits}
setOverSubmitButton(true)} onMouseLeave={() => setOverSubmitButton(false)} className={cn( `px-6 py-3`, `rounded-full`, `transition-all duration-300 ease-in-out`, isLocked ? `bg-orange-500/20 border-orange-800/10` : `bg-sky-500/80 hover:bg-sky-400/100 border-sky-800/20`, `text-center`, `w-full`, `text-2xl text-sky-50`, `border`, headingFont.className, // `transition-all duration-300`, // `hover:animate-bounce` )} disabled={isLocked} onClick={handleSubmit} > {isLocked ? "Generating.." : "Generate"}
{/* Put community creations here, this may get wild though.
A
B
C
D
E
*/}
) }