import React, { useState } from 'react'; import './ChatPage.css'; // 確保你有這個樣式檔案 import { useNavigate } from 'react-router-dom'; // frontend message type interface Message { sender: 'user' | 'ai'; text: string; } // Type definition of backend return data interface AskResponse { answer: string; source_documents: string[]; } const ChatPage: React.FC = () => { const [messages, setMessages] = useState([]); const [input, setInput] = useState(''); const [loading, setLoading] = useState(false); const navigate = useNavigate(); const handleSend = async () => { if (input.trim() === '') return; const userMessage: Message = { sender: 'user', text: input }; setMessages((prev) => [...prev, userMessage]); setInput(''); setLoading(true); try { const res = await fetch('/ask', { // 改成相對路徑 method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ query: input }), }); if (!res.ok) throw new Error('Backend error'); const data: AskResponse = await res.json(); let aiText = data.answer; if (aiText.includes("📚 Source Snippets")) { aiText = aiText.split("📚 Source Snippets")[0].trim(); } const aiMessage: Message = { sender: 'ai', text: aiText }; setMessages((prev) => [...prev, aiMessage]); // const aiText = `${data.answer}\n\n📚 Source Snippets:\n${data.source_documents.slice(0, 2).join('\n\n')}`; // const aiMessage: Message = { sender: 'ai', text: aiText }; setMessages((prev) => [...prev, aiMessage]); } catch (err) { console.error('Fetch error:', err); const errorMessage: Message = { sender: 'ai', text: '❌ Unable to get a response, please try again later.' }; setMessages((prev) => [...prev, errorMessage]); } finally { setLoading(false); } }; return (
LabAid AI Chat
{messages.map((msg, idx) => (
{msg.text}
))} {loading &&
💬 thinking...
}
setInput(e.target.value)} onKeyDown={(e) => { if (e.key === 'Enter') handleSend(); }} placeholder="please enter your question..." />
); }; export default ChatPage;