"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 (