Update src/components/DiagnosisPage.jsx
Browse files
src/components/DiagnosisPage.jsx
CHANGED
|
@@ -75,22 +75,39 @@ const DiagnosisPage = () => {
|
|
| 75 |
e.preventDefault();
|
| 76 |
if (!inputMessage.trim()) return;
|
| 77 |
|
|
|
|
| 78 |
const userMsg = {
|
| 79 |
id: messages.length + 1,
|
| 80 |
text: inputMessage,
|
| 81 |
sender: 'user',
|
| 82 |
time: new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })
|
| 83 |
};
|
| 84 |
-
|
|
|
|
|
|
|
|
|
|
| 85 |
setInputMessage('');
|
| 86 |
setIsLoading(true);
|
| 87 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 88 |
try {
|
| 89 |
const token = localStorage.getItem('token');
|
| 90 |
const response = await fetch('/api/chat', {
|
| 91 |
method: 'POST',
|
| 92 |
headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` },
|
| 93 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 94 |
});
|
| 95 |
|
| 96 |
if (response.status === 401) {
|
|
@@ -102,16 +119,24 @@ const DiagnosisPage = () => {
|
|
| 102 |
const data = await response.json();
|
| 103 |
|
| 104 |
const botMsg = {
|
| 105 |
-
id:
|
| 106 |
text: data.response || "Maaf, saya tidak mengerti.",
|
| 107 |
sender: 'bot',
|
| 108 |
time: new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }),
|
| 109 |
-
urls: data.urls || []
|
| 110 |
};
|
| 111 |
setMessages(prev => [...prev, botMsg]);
|
| 112 |
|
| 113 |
} catch (error) {
|
| 114 |
console.error("Error:", error);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 115 |
} finally {
|
| 116 |
setIsLoading(false);
|
| 117 |
}
|
|
@@ -135,7 +160,6 @@ const DiagnosisPage = () => {
|
|
| 135 |
<div className="message-content">{formatMessage(msg.text)}</div>
|
| 136 |
|
| 137 |
{/* --- DISPLAY URL REFERENCES (CAPSULE STYLE) --- */}
|
| 138 |
-
{/* Hanya tampil jika pengirimnya bot DAN ada url */}
|
| 139 |
{msg.sender === 'bot' && msg.urls && msg.urls.length > 0 && (
|
| 140 |
<div className="source-urls-container">
|
| 141 |
<span className="source-label">Referensi:</span>
|
|
|
|
| 75 |
e.preventDefault();
|
| 76 |
if (!inputMessage.trim()) return;
|
| 77 |
|
| 78 |
+
// 1. Buat object pesan user
|
| 79 |
const userMsg = {
|
| 80 |
id: messages.length + 1,
|
| 81 |
text: inputMessage,
|
| 82 |
sender: 'user',
|
| 83 |
time: new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })
|
| 84 |
};
|
| 85 |
+
|
| 86 |
+
// Update state local dulu (Optimistic UI)
|
| 87 |
+
const updatedMessages = [...messages, userMsg];
|
| 88 |
+
setMessages(updatedMessages);
|
| 89 |
setInputMessage('');
|
| 90 |
setIsLoading(true);
|
| 91 |
|
| 92 |
+
// 2. Siapkan History Chat (Ambil 4 pesan terakhir untuk konteks)
|
| 93 |
+
const chatHistory = updatedMessages
|
| 94 |
+
.filter(m => m.text && m.sender !== 'system') // Filter pesan valid
|
| 95 |
+
.slice(-4) // Batasi hanya 4 interaksi terakhir agar tidak terlalu panjang
|
| 96 |
+
.map(m => ({
|
| 97 |
+
role: m.sender === 'user' ? 'user' : 'assistant', // Map ke format backend
|
| 98 |
+
content: m.text
|
| 99 |
+
}));
|
| 100 |
+
|
| 101 |
try {
|
| 102 |
const token = localStorage.getItem('token');
|
| 103 |
const response = await fetch('/api/chat', {
|
| 104 |
method: 'POST',
|
| 105 |
headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` },
|
| 106 |
+
// Kirim message + history
|
| 107 |
+
body: JSON.stringify({
|
| 108 |
+
message: userMsg.text,
|
| 109 |
+
history: chatHistory
|
| 110 |
+
})
|
| 111 |
});
|
| 112 |
|
| 113 |
if (response.status === 401) {
|
|
|
|
| 119 |
const data = await response.json();
|
| 120 |
|
| 121 |
const botMsg = {
|
| 122 |
+
id: updatedMessages.length + 2,
|
| 123 |
text: data.response || "Maaf, saya tidak mengerti.",
|
| 124 |
sender: 'bot',
|
| 125 |
time: new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }),
|
| 126 |
+
urls: data.urls || []
|
| 127 |
};
|
| 128 |
setMessages(prev => [...prev, botMsg]);
|
| 129 |
|
| 130 |
} catch (error) {
|
| 131 |
console.error("Error:", error);
|
| 132 |
+
const errorMsg = {
|
| 133 |
+
id: updatedMessages.length + 2,
|
| 134 |
+
text: "Gagal terhubung ke server. Mohon periksa koneksi Anda.",
|
| 135 |
+
sender: 'bot',
|
| 136 |
+
time: new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }),
|
| 137 |
+
urls: []
|
| 138 |
+
}
|
| 139 |
+
setMessages(prev => [...prev, errorMsg]);
|
| 140 |
} finally {
|
| 141 |
setIsLoading(false);
|
| 142 |
}
|
|
|
|
| 160 |
<div className="message-content">{formatMessage(msg.text)}</div>
|
| 161 |
|
| 162 |
{/* --- DISPLAY URL REFERENCES (CAPSULE STYLE) --- */}
|
|
|
|
| 163 |
{msg.sender === 'bot' && msg.urls && msg.urls.length > 0 && (
|
| 164 |
<div className="source-urls-container">
|
| 165 |
<span className="source-label">Referensi:</span>
|