'use client'; import { type ComponentProps, useEffect, useRef, useState } from 'react'; import { Track } from 'livekit-client'; import { Loader, MessageSquareTextIcon, SendHorizontal } from 'lucide-react'; import { motion } from 'motion/react'; import { useChat } from '@livekit/components-react'; import { AgentDisconnectButton } from '@/components/agents-ui/agent-disconnect-button'; import { AgentTrackControl } from '@/components/agents-ui/agent-track-control'; import { AgentTrackToggle, agentTrackToggleVariants, } from '@/components/agents-ui/agent-track-toggle'; import { Button } from '@/components/ui/button'; import { Toggle } from '@/components/ui/toggle'; import { type UseInputControlsProps, useInputControls, usePublishPermissions, } from '@/hooks/agents-ui/use-agent-control-bar'; import { cn } from '@/lib/shadcn/utils'; const TOGGLE_VARIANT_1 = [ '[&_[data-state=off]]:bg-accent [&_[data-state=off]]:hover:bg-foreground/10', '[&_[data-state=off]_~_button]:bg-accent [&_[data-state=off]_~_button]:hover:bg-foreground/10', '[&_[data-state=off]]:border-border [&_[data-state=off]]:hover:border-foreground/12', '[&_[data-state=off]_~_button]:border-border [&_[data-state=off]_~_button]:hover:border-foreground/12', '[&_[data-state=off]]:text-destructive [&_[data-state=off]]:hover:text-destructive [&_[data-state=off]]:focus:text-destructive', '[&_[data-state=off]]:focus-visible:ring-foreground/12 [&_[data-state=off]]:focus-visible:border-ring', 'dark:[&_[data-state=off]_~_button]:bg-accent dark:[&_[data-state=off]_~_button:hover]:bg-foreground/10', ]; const TOGGLE_VARIANT_2 = [ 'data-[state=off]:bg-accent data-[state=off]:hover:bg-foreground/10', 'data-[state=off]:border-border data-[state=off]:hover:border-foreground/12', 'data-[state=off]:focus-visible:border-ring data-[state=off]:focus-visible:ring-foreground/12', 'data-[state=off]:text-foreground data-[state=off]:hover:text-foreground data-[state=off]:focus:text-foreground', 'data-[state=on]:bg-blue-500/20 data-[state=on]:hover:bg-blue-500/30', 'data-[state=on]:border-blue-700/10 data-[state=on]:text-blue-700 data-[state=on]:ring-blue-700/30', 'data-[state=on]:focus-visible:border-blue-700/50', 'dark:data-[state=on]:bg-blue-500/20 dark:data-[state=on]:text-blue-300', ]; const MOTION_PROPS = { variants: { hidden: { height: 0, opacity: 0, marginBottom: 0, }, visible: { height: 'auto', opacity: 1, marginBottom: 12, }, }, initial: 'hidden', transition: { duration: 0.3, ease: 'easeOut', }, }; interface AgentChatInputProps { chatOpen: boolean; onSend?: (message: string) => void; className?: string; } function AgentChatInput({ chatOpen, onSend = async () => {}, className }: AgentChatInputProps) { const inputRef = useRef(null); const [isSending, setIsSending] = useState(false); const [message, setMessage] = useState(''); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); try { setIsSending(true); await onSend(message); setMessage(''); } catch (error) { console.error(error); } finally { setIsSending(false); } }; const isDisabled = isSending || message.trim().length === 0; useEffect(() => { if (chatOpen) return; // when not disabled refocus on input inputRef.current?.focus(); }, [chatOpen]); return (