"use client" import type React from "react" import { useState, useRef, useEffect } from "react" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { ArrowLeft, Image, Mic, Send, FileText, MicOff } from "lucide-react" import { useRouter } from "next/navigation" import { VoiceRecognition } from "@/app/components/VoiceRecognition" import { ScrollArea } from "@/components/ui/scroll-area" interface Message { id: string content: string sender: "user" | "ai" timestamp: Date attachments?: { type: "image" | "document" name: string url: string }[] } export default function AIAssistantPage() { const router = useRouter() const [messages, setMessages] = useState([ { id: "1", content: "你好!我是你的AI助手,有什么可以帮助你的吗?", sender: "ai", timestamp: new Date(), }, ]) const [inputValue, setInputValue] = useState("") const [isRecording, setIsRecording] = useState(false) const [isLoading, setIsLoading] = useState(false) const messagesEndRef = useRef(null) const fileInputRef = useRef(null) const documentInputRef = useRef(null) // 自动滚动到最新消息 useEffect(() => { messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }) }, [messages]) const handleSendMessage = async () => { if (!inputValue.trim() && !isRecording) return const newUserMessage: Message = { id: Date.now().toString(), content: inputValue, sender: "user", timestamp: new Date(), } setMessages((prev) => [...prev, newUserMessage]) setInputValue("") setIsLoading(true) // 模拟AI响应 setTimeout(() => { const aiResponse: Message = { id: (Date.now() + 1).toString(), content: `我已收到你的消息:"${newUserMessage.content}"。这是一个模拟的AI回复。`, sender: "ai", timestamp: new Date(), } setMessages((prev) => [...prev, aiResponse]) setIsLoading(false) }, 1000) } const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === "Enter" && !e.shiftKey) { e.preventDefault() handleSendMessage() } } const toggleRecording = () => { setIsRecording(!isRecording) } const handleVoiceInput = (text: string) => { setInputValue((prev) => prev + text) setIsRecording(false) } const handleFileUpload = (e: React.ChangeEvent, type: "image" | "document") => { const files = e.target.files if (!files || files.length === 0) return const file = files[0] const reader = new FileReader() reader.onload = () => { const newUserMessage: Message = { id: Date.now().toString(), content: type === "image" ? "我发送了一张图片" : `我上传了文档:${file.name}`, sender: "user", timestamp: new Date(), attachments: [ { type, name: file.name, url: reader.result as string, }, ], } setMessages((prev) => [...prev, newUserMessage]) setIsLoading(true) // 模拟AI响应 setTimeout(() => { const aiResponse: Message = { id: (Date.now() + 1).toString(), content: type === "image" ? "我已收到你的图片,正在分析内容..." : `我已收到你上传的文档:${file.name},正在分析内容...`, sender: "ai", timestamp: new Date(), } setMessages((prev) => [...prev, aiResponse]) setIsLoading(false) }, 1500) } reader.readAsDataURL(file) e.target.value = "" // 重置文件输入 } const triggerFileUpload = (type: "image" | "document") => { if (type === "image") { fileInputRef.current?.click() } else { documentInputRef.current?.click() } } const navigateToKnowledgeBase = () => { router.push("/workspace/ai-assistant/knowledge-base") } return (
{/* 头部 */}

AI对话助手

{/* 聊天区域 */}
{messages.map((message) => (
{message.attachments?.map((attachment, index) => (
{attachment.type === "image" ? (
Uploaded
) : (
{attachment.name}
)}
))}
{message.content}
{message.timestamp.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit", })}
))} {isLoading && (
)}
{/* 输入区域 */}
setInputValue(e.target.value)} onKeyDown={handleKeyDown} placeholder="输入消息..." className="flex-1" />
{/* 隐藏的文件上传输入 */} handleFileUpload(e, "image")} accept="image/*" className="hidden" /> handleFileUpload(e, "document")} accept=".pdf,.doc,.docx" className="hidden" /> {/* 语音识别组件 */} {isRecording && setIsRecording(false)} />}
) }