import { AnimatePresence, motion } from 'framer-motion'; import { Loader2, Sparkles } from 'lucide-react'; import { useEffect, useRef, useState } from 'react'; import { Button } from '@/components/ui/button'; import { Form, FormControl, FormField, FormItem, FormMessage } from '@/components/ui/form'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Textarea } from '@/components/ui/textarea'; import { LANGUAGE_OPTIONS } from '@/lib/constants/languages'; import { useGenerationForm } from '@/lib/hooks/useGenerationForm'; import { useProfile } from '@/lib/hooks/useProfiles'; import { useUIStore } from '@/stores/uiStore'; interface FloatingGenerateBoxProps { isPlayerOpen: boolean; } export function FloatingGenerateBox({ isPlayerOpen }: FloatingGenerateBoxProps) { const selectedProfileId = useUIStore((state) => state.selectedProfileId); const { data: selectedProfile } = useProfile(selectedProfileId || ''); const [isExpanded, setIsExpanded] = useState(false); const containerRef = useRef(null); const { form, handleSubmit, isPending } = useGenerationForm({ onSuccess: () => { setIsExpanded(false); }, }); // Click away handler to collapse the box useEffect(() => { function handleClickOutside(event: MouseEvent) { const target = event.target as HTMLElement; // Don't collapse if clicking inside the container if (containerRef.current?.contains(target)) { return; } // Don't collapse if clicking on a Select dropdown (which renders in a portal) if ( target.closest('[role="listbox"]') || target.closest('[data-radix-popper-content-wrapper]') ) { return; } setIsExpanded(false); } if (isExpanded) { document.addEventListener('mousedown', handleClickOutside); } return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, [isExpanded]); async function onSubmit(data: Parameters[0]) { await handleSubmit(data, selectedProfileId); } return (
(