import { Message, MessageContent } from "@/components/ai-elements/message"; import { PromptInput, PromptInputActionAddAttachments, PromptInputActionMenu, PromptInputActionMenuContent, PromptInputActionMenuTrigger, PromptInputAttachment, PromptInputAttachments, PromptInputBody, PromptInputHeader, type PromptInputMessage, PromptInputSubmit, PromptInputTextarea, PromptInputFooter, PromptInputTools, } from "@/components/ai-elements/prompt-input"; import { Action, Actions } from "@/components/ai-elements/actions"; import { Fragment, useState, useEffect } from "react"; import { useChat } from "@ai-sdk/react"; import { Response } from "@/components/ai-elements/response"; import { CopyIcon, RefreshCcwIcon, MessageCircle, Bot, AlertCircle, PaperclipIcon, User, } from "lucide-react"; import { AuditReport } from "./AuditReport"; import { AnalystReport } from "./AnalystReport"; import { WebSearchResults } from "./WebSearchResults"; import { Loader } from "@/components/ai-elements/loader"; import { DefaultChatTransport } from "ai"; interface ChatTabProps { selectedTema: string | null; } export function ChatTab({ selectedTema }: ChatTabProps) { const [input, setInput] = useState(""); const [error, setError] = useState(null); const { messages, sendMessage, status, regenerate, error: chatError, } = useChat({ transport: new DefaultChatTransport({ api: "/api/v1/agent/chat", headers: { tema: selectedTema || "", }, }), onError: (error) => { setError(`Error en el chat: ${error.message}`); }, }); // Clear error when starting new conversation useEffect(() => { if (status === "streaming") { setError(null); } }, [status]); const handleSubmit = (message: PromptInputMessage) => { const hasText = Boolean(message.text?.trim()); const hasAttachments = Boolean(message.files?.length); if (!(hasText || hasAttachments)) { return; } setError(null); sendMessage( { text: message.text || "Enviado con archivos adjuntos", files: message.files, }, { body: { dataroom: selectedTema, context: `Usuario está consultando sobre el dataroom: ${selectedTema}`, }, }, ); setInput(""); }; if (!selectedTema) { return (

Selecciona un dataroom para iniciar el chat

); } return (
{/* Chat Content */}
{/* Welcome Message */} {messages.length === 0 && (

¡Hola! Soy tu asistente de IA para el dataroom{" "} {selectedTema}. Puedes hacerme preguntas sobre los documentos almacenados aquí.

)} {/* Error Message */} {error && (

{error}

)} {/* Chat Messages */} {messages.map((message) => (
{message.parts.map((part, i) => { switch (part.type) { case "text": return ( {message.role === "user" ? (
{part.text}
) : (
{part.text}
)} {message.role === "assistant" && i === message.parts.length - 1 && (
regenerate()} label="Regenerar" disabled={status === "streaming"} > navigator.clipboard.writeText(part.text) } label="Copiar" >
)}
); case "tool-build_audit_report": switch (part.state) { case "input-available": return (
Generando reporte de auditoría...
); case "output-available": return (
); case "output-error": return (
Error generando reporte de auditoría

{part.errorText}

); default: return null; } case "tool-build_analysis_report": switch (part.state) { case "input-available": return (
Generando análisis histórico...
); case "output-available": return (
); case "output-error": return (
Error generando análisis histórico

{part.errorText}

); default: return null; } case "tool-search_web_information": switch (part.state) { case "input-available": return (
Searching the web...
); case "output-available": return (
); case "output-error": return (
Error searching the web

{part.errorText}

); default: return null; } default: return null; } })}
))} {status === "streaming" && } {status === "loading" && }
{/* Chat Input */}
{(attachment) => } setInput(e.target.value)} value={input} placeholder={`Pregunta algo sobre ${selectedTema}...`} disabled={status === "streaming" || status === "loading"} className="min-h-[60px] resize-none border-0 focus:ring-0 transition-all duration-200 text-base px-4 py-3 bg-white rounded-xl" />
); }