"use client"; import { useState, useEffect } from "react"; import { useRouter } from "next/navigation"; import { ArrowRight, Loader2 } from "lucide-react"; import { Button } from "@/components/ui/button"; import { useToast } from "@/hooks/use-toast"; import { useS3Upload } from "next-s3-upload"; import { useAuth, SignInButton } from "@clerk/nextjs"; interface CreateButtonProps { prompt: string; style: string; characterFiles: File[]; isLoading: boolean; setIsLoading: (loading: boolean) => void; } export function CreateButton({ prompt, style, characterFiles, isLoading, setIsLoading, }: CreateButtonProps) { const router = useRouter(); const [loadingStep, setLoadingStep] = useState(0); const { toast } = useToast(); const { uploadToS3 } = useS3Upload(); const { isSignedIn, isLoaded } = useAuth(); const [hasApiKey, setHasApiKey] = useState(false); // Check if user has their own API key set useEffect(() => { const checkApiKey = () => { const apiKey = localStorage.getItem("together_api_key"); setHasApiKey(!!apiKey); }; checkApiKey(); // Listen for storage changes window.addEventListener("storage", checkApiKey); return () => window.removeEventListener("storage", checkApiKey); }, []); useEffect(() => { if (!isLoading) return; const steps = [ "Enhancing prompt...", "Generating scenes...", "Creating your comic...", ]; let currentStep = 0; const interval = setInterval(() => { currentStep += 1; if (currentStep < steps.length) { setLoadingStep(currentStep); } else { clearInterval(interval); } }, 2500); return () => clearInterval(interval); }, [isLoading]); const handleCreate = async () => { if (!prompt.trim()) { toast({ title: "Prompt required", description: "Please enter a prompt to generate your comic", variant: "destructive", duration: 3000, }); return; } setIsLoading(true); setLoadingStep(0); try { const apiKey = localStorage.getItem("together_api_key"); const characterUploads = await Promise.all( characterFiles.map((file) => uploadToS3(file).then(({ url }) => url)) ); // Use API to create story and generate first page const response = await fetch("/api/generate-comic", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ prompt, apiKey, style, characterImages: characterUploads, }), }); if (!response.ok) { const errorData = await response.json(); if (response.status === 429 && errorData.isRateLimited) { throw new Error(errorData.error); } throw new Error(errorData.error || "Failed to create story"); } const result = await response.json(); // Redirect to the story editor using slug router.push(`/editor/${result.storySlug}`); } catch (error) { console.error("Error creating comic:", error); toast({ title: "Creation failed", description: error instanceof Error ? error.message : "Failed to create comic. Please try again.", variant: "destructive", duration: 4000, }); setIsLoading(false); } }; const loadingSteps = [ "Enhancing prompt...", "Generating scenes...", "Creating your comic...", ]; return (
{!isLoaded ? (
) : isSignedIn ? (
{hasApiKey ? ( <>Using your API key (~$0.01 per comic) ) : ( <>1 credit weekly )}
) : ( )}
); }