/** * AI SDK UI - Basic Chat Component (v5) * * Demonstrates: * - useChat hook with v5 manual input management * - Streaming chat messages * - Loading states * - Error handling * - Auto-scroll to latest message * * CRITICAL v5 Change: useChat NO LONGER manages input state! * You must manually manage input with useState. * * Usage: * 1. Copy this component to your app * 2. Create API route (see nextjs-api-route.ts) * 3. Customize styling as needed */ 'use client'; import { useChat } from 'ai/react'; import { useState, FormEvent, useRef, useEffect } from 'react'; export default function ChatBasic() { // useChat hook - v5 style const { messages, sendMessage, isLoading, error, stop } = useChat({ api: '/api/chat', }); // Manual input management (v5 requires this!) const [input, setInput] = useState(''); // Auto-scroll to bottom const messagesEndRef = useRef(null); useEffect(() => { messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); }, [messages]); // Handle form submission const handleSubmit = (e: FormEvent) => { e.preventDefault(); if (!input.trim()) return; // v5: Use sendMessage instead of append sendMessage({ content: input }); setInput(''); }; return (
{/* Header */}

AI Chat

{/* Messages */}
{messages.map((message) => (
{message.content}
))} {/* Loading indicator */} {isLoading && (
)}
{/* Error message */} {error && (
Error: {error.message}
)} {/* Input */}
setInput(e.target.value)} placeholder="Type a message..." disabled={isLoading} className="flex-1 p-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 disabled:bg-gray-100" /> {isLoading ? ( ) : ( )}
); }