import { useEffect, useRef, useState } from "react"; import { Avatar, Button, Card, CardBody, CardHeader, Divider, ScrollShadow, Spinner, Textarea, } from "@heroui/react"; import { requestBotReply } from "./dsAPI"; export default function App() { const [messages, setMessages] = useState([ { role: "assistant", content: "你好,有什么可以帮你?", }, ]); const [inputText, setInputText] = useState(""); const [isSending, setIsSending] = useState(false); const [isBotTyping, setIsBotTyping] = useState(false); const bottomRef = useRef(null); useEffect(() => { bottomRef.current?.scrollIntoView({ behavior: "smooth" }); }, [messages, isBotTyping]); async function handleSend() { const text = inputText.trim(); if (!text || isSending) return; const userMessage = { role: "user", content: text, }; const nextMessages = [...messages, userMessage]; setMessages(nextMessages); setInputText(""); setIsSending(true); setIsBotTyping(true); // 给模型的上下文 const historyForModel = [ { role: "system", content: "你是一个简洁的助手,用中文回答。" }, ...nextMessages.map(({ role, content }) => ({ role, content })), ]; let reply = ""; try { reply = await requestBotReply(historyForModel); } catch (e) { reply = "出错了,请稍后再试。"; } const botMessage = { role: "assistant", content: reply, }; setMessages((prev) => [...prev, botMessage]); setIsBotTyping(false); setIsSending(false); } function handleKeyDown(e) { if (e.key === "Enter" && !e.shiftKey) { e.preventDefault(); handleSend(); } } return (
{/* 顶部 */}
Chatbot Demo
{/* 聊天区域 */}
{messages.map((m) => { const isUser = m.role === "user"; return (
{m.content}
); })} {isBotTyping && (
正在回复…
)}
{/* 输入区 */}