import { useEffect, useState, useRef } from 'react' import type { AI } from '@/app/[locale]/morphic/action' import { useUIState, useActions, useAIState } from '@aigxion/isdk/rsc' import { cn } from '@/lib/utils' import { UserMessage } from './user-message' import { Input } from '../ui-v2/input' import { Button } from '../ui-v2/button' import { ArrowRight, Plus, Square } from 'lucide-react' import { EmptyScreen } from './empty-screen' export function ChatPanel() { const [input, setInput] = useState('') const [messages, setMessages] = useUIState() const [aiMessages, setAiMessages] = useAIState() const { submit } = useActions() const [isButtonPressed, setIsButtonPressed] = useState(false) const inputRef = useRef(null) const [showEmptyScreen, setShowEmptyScreen] = useState(false) // Focus on input when button is pressed useEffect(() => { if (isButtonPressed) { inputRef.current?.focus() setIsButtonPressed(false) } }, [isButtonPressed]) const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() // Clear messages if button is pressed if (isButtonPressed) { handleClear() setIsButtonPressed(false) } // Add user message to UI state setMessages(currentMessages => [ ...currentMessages, { id: Date.now(), isGenerating: false, component: } ]) // Submit and get response message const formData = new FormData(e.currentTarget) const responseMessage = await submit(formData) setMessages(currentMessages => [...currentMessages, responseMessage as any]) setInput('') } // Clear messages const handleClear = () => { setIsButtonPressed(true) setMessages([]) setAiMessages([]) } useEffect(() => { // focus on input when the page loads inputRef.current?.focus() }, []) // If there are messages and the new button has not been pressed, display the new Button if (messages.length > 0 && !isButtonPressed) { return (
) } // Condition 1 and 3: If there are no messages or the button is pressed, display the form const formPositionClass = messages.length === 0 ? 'fixed bottom-8 left-0 right-0 top-10 mx-auto h-screen flex flex-col items-center justify-center' : 'fixed bottom-8-ml-6' return (
{/* */}
{ setInput(e.target.value) setShowEmptyScreen(e.target.value.length === 0) }} onFocus={() => setShowEmptyScreen(true)} onBlur={() => setShowEmptyScreen(false)} />
{ setInput(message) }} className={cn(showEmptyScreen ? 'visible' : 'invisible')} />
) }