fix:发送按钮问题
This commit is contained in:
50
src/App.js
50
src/App.js
@@ -1,6 +1,5 @@
|
|||||||
import { useEffect, useRef, useState } from "react";
|
import { useEffect, useRef, useState } from "react";
|
||||||
import {
|
import {
|
||||||
Avatar,
|
|
||||||
Button,
|
Button,
|
||||||
Card,
|
Card,
|
||||||
CardBody,
|
CardBody,
|
||||||
@@ -8,7 +7,6 @@ import {
|
|||||||
Divider,
|
Divider,
|
||||||
ScrollShadow,
|
ScrollShadow,
|
||||||
Spinner,
|
Spinner,
|
||||||
Textarea,
|
|
||||||
} from "@heroui/react";
|
} from "@heroui/react";
|
||||||
import { requestBotReply } from "./dsAPI";
|
import { requestBotReply } from "./dsAPI";
|
||||||
|
|
||||||
@@ -81,8 +79,7 @@ export default function App() {
|
|||||||
<div className="mx-auto max-w-3xl">
|
<div className="mx-auto max-w-3xl">
|
||||||
<Card className="shadow-xl">
|
<Card className="shadow-xl">
|
||||||
{/* 顶部 */}
|
{/* 顶部 */}
|
||||||
<CardHeader className="flex items-center gap-3">
|
<CardHeader className="flex items-center">
|
||||||
<Avatar name="Bot" />
|
|
||||||
<div className="flex flex-col">
|
<div className="flex flex-col">
|
||||||
<span className="font-semibold">Chatbot Demo</span>
|
<span className="font-semibold">Chatbot Demo</span>
|
||||||
<span className="text-xs text-default-500">
|
<span className="text-xs text-default-500">
|
||||||
@@ -99,16 +96,8 @@ export default function App() {
|
|||||||
{messages.map((m) => {
|
{messages.map((m) => {
|
||||||
const isUser = m.role === "user";
|
const isUser = m.role === "user";
|
||||||
return (
|
return (
|
||||||
<div
|
<div className={`flex ${isUser ? "justify-end" : "justify-start"}`} >
|
||||||
className={`flex ${isUser ? "justify-end" : "justify-start"}`}
|
<div className={`flex max-w-[80%] ${isUser ? "flex-row-reverse" : ""}`} >
|
||||||
>
|
|
||||||
<div
|
|
||||||
className={`flex max-w-[80%] items-end gap-2 ${isUser ? "flex-row-reverse" : ""}`}
|
|
||||||
>
|
|
||||||
<Avatar
|
|
||||||
size="sm"
|
|
||||||
name={isUser ? "You" : "Bot"}
|
|
||||||
/>
|
|
||||||
<div
|
<div
|
||||||
className={`rounded-2xl px-4 py-3 text-sm leading-relaxed ${isUser
|
className={`rounded-2xl px-4 py-3 text-sm leading-relaxed ${isUser
|
||||||
? "bg-primary text-primary-foreground"
|
? "bg-primary text-primary-foreground"
|
||||||
@@ -124,8 +113,7 @@ export default function App() {
|
|||||||
|
|
||||||
{isBotTyping && (
|
{isBotTyping && (
|
||||||
<div className="flex justify-start">
|
<div className="flex justify-start">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center">
|
||||||
<Avatar size="sm" name="Bot" />
|
|
||||||
<div className="flex items-center gap-2 rounded-2xl bg-content2 px-4 py-2 text-sm text-default-600">
|
<div className="flex items-center gap-2 rounded-2xl bg-content2 px-4 py-2 text-sm text-default-600">
|
||||||
<Spinner size="sm" />
|
<Spinner size="sm" />
|
||||||
正在回复…
|
正在回复…
|
||||||
@@ -142,20 +130,33 @@ export default function App() {
|
|||||||
|
|
||||||
{/* 输入区 */}
|
{/* 输入区 */}
|
||||||
<div className="p-4">
|
<div className="p-4">
|
||||||
<div className="flex items-end gap-3">
|
{/* 这个容器视觉上就是“一个输入框” */}
|
||||||
<Textarea
|
<div className="rounded-xl border border-default-200 bg-background shadow-sm">
|
||||||
|
{/* 上半部分:真正可滚动/可拖拉的 textarea */}
|
||||||
|
<div className="px-3 pt-3">
|
||||||
|
<textarea
|
||||||
value={inputText}
|
value={inputText}
|
||||||
onValueChange={setInputText}
|
onChange={(e) => setInputText(e.target.value)}
|
||||||
onKeyDown={handleKeyDown}
|
onKeyDown={handleKeyDown}
|
||||||
placeholder="输入消息,Enter 发送,Shift+Enter 换行"
|
placeholder="输入消息,Enter 发送,Shift+Enter 换行"
|
||||||
minRows={2}
|
disabled={isSending}
|
||||||
maxRows={6}
|
rows={2}
|
||||||
isDisabled={isSending}
|
className="
|
||||||
variant="bordered"
|
w-full bg-transparent outline-none
|
||||||
className="flex-1"
|
text-sm leading-relaxed text-foreground
|
||||||
|
placeholder:text-default-400
|
||||||
|
resize-y
|
||||||
|
min-h-[72px] max-h-[220px]
|
||||||
|
overflow-auto
|
||||||
|
"
|
||||||
/>
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 下半部分:输入框“内部”的工具栏,按钮在右下角 */}
|
||||||
|
<div className="flex items-center justify-end gap-2 px-3 py-2">
|
||||||
<Button
|
<Button
|
||||||
color="primary"
|
color="primary"
|
||||||
|
size="sm"
|
||||||
onPress={handleSend}
|
onPress={handleSend}
|
||||||
isDisabled={isSending || !inputText.trim()}
|
isDisabled={isSending || !inputText.trim()}
|
||||||
>
|
>
|
||||||
@@ -163,6 +164,7 @@ export default function App() {
|
|||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</CardBody>
|
</CardBody>
|
||||||
</Card>
|
</Card>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user