"use client"; import { useState } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { Sparkles, Loader2 } from "lucide-react"; import { generationsApi, type GenerationRequest } from "@/lib/api"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Slider } from "@/components/ui/slider"; import { useToast } from "@/hooks/use-toast"; import { PromptSuggestions } from "@/components/prompt-suggestions"; const generationSchema = z.object({ prompt: z.string().min(1, "Prompt is required").max(1000), lyrics: z.string().optional(), duration: z.number().min(5).max(300).optional(), style: z.string().optional(), voice_preset: z.string().optional(), vocal_volume: z.number().min(0).max(1).optional(), instrumental_volume: z.number().min(0).max(1).optional(), }); type GenerationFormData = z.infer; export function GenerationForm() { const [isExpanded, setIsExpanded] = useState(false); const [showSuggestions, setShowSuggestions] = useState(true); const { toast } = useToast(); const queryClient = useQueryClient(); const { register, handleSubmit, setValue, watch, formState: { errors }, } = useForm({ resolver: zodResolver(generationSchema), defaultValues: { duration: 30, vocal_volume: 0.7, instrumental_volume: 0.8, }, }); const successMessages = [ "🎵 Your masterpiece is being forged!", "🎸 The AI musicians are tuning up!", "🎹 Composing your sonic masterpiece!", "🎺 The orchestra is assembling!", "🎼 Your music is coming to life!", ]; const mutation = useMutation({ mutationFn: (data: GenerationRequest) => generationsApi.create(data), onSuccess: () => { const randomMessage = successMessages[Math.floor(Math.random() * successMessages.length)]; toast({ title: randomMessage, description: "Watch the magic happen in your creations list below.", }); queryClient.invalidateQueries({ queryKey: ["generations"] }); setIsExpanded(false); setShowSuggestions(false); }, onError: (error: Error) => { toast({ title: "😔 Oops! Something went wrong", description: error.message || "Failed to start generation. Please try again.", variant: "destructive", }); }, }); const onSubmit = (data: GenerationFormData) => { mutation.mutate(data); }; const handleSelectPrompt = (prompt: string) => { setValue("prompt", prompt); setShowSuggestions(false); }; const promptValue = watch("prompt"); const vocalVolume = watch("vocal_volume") ?? 0.7; const instrumentalVolume = watch("instrumental_volume") ?? 0.8; return (

Compose Something New