"use client"; import { useEffect, useRef, useState, useCallback } from "react"; import { useSearchParams } from "next/navigation"; import { apiV1 } from "rowboat-shared"; import { z } from "zod"; import { Button, Dropdown, DropdownItem, DropdownMenu, DropdownTrigger, Textarea } from "@nextui-org/react"; import MarkdownContent from "./markdown-content"; type Message = { role: "user" | "assistant" | "system" | "tool"; content: string; tool_call_id?: string; tool_name?: string; } function ChatWindowHeader({ chatId, closeChat, closed, setMinimized, }: { chatId: string | null; closeChat: () => Promise; closed: boolean; setMinimized: (minimized: boolean) => void; }) { return
Chat
{(chatId && !closed) && { if (key === "close") { closeChat(); } }}> Close chat }
} function LoadingAssistantResponse() { return
} function AssistantMessage({ children, }: { children: React.ReactNode; }) { return
Assistant
{typeof children === 'string' ? : children}
} function UserMessage({ children, }: { children: React.ReactNode; }) { return
{typeof children === 'string' ? : children}
} function ChatWindowMessages({ messages, loadingAssistantResponse, }: { messages: Message[]; loadingAssistantResponse: boolean; }) { const messagesEndRef = useRef(null); useEffect(() => { messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }); }, [messages]); return
Hello! I'm Rowboat, your personal assistant. How can I help you today? {messages.map((message, index) => { switch (message.role) { case "user": return {message.content}; case "assistant": return {message.content}; case "system": return null; // Hide system messages from the UI case "tool": return Tool response ({message.tool_name}): {message.content} ; default: return null; } })} {loadingAssistantResponse && }
} function ChatWindowInput({ handleUserMessage, }: { handleUserMessage: (message: string) => Promise; }) { const [prompt, setPrompt] = useState(""); function handleInputKeyDown(event: React.KeyboardEvent) { if (event.key === 'Enter' && !event.shiftKey) { event.preventDefault(); const input = prompt.trim(); setPrompt(''); handleUserMessage(input); } } return