const AIChatbot = () => { const { useState, useEffect, useRef } = React; const [isOpen, setIsOpen] = useState(false); const [messages, setMessages] = useState([]); const [input, setInput] = useState(""); const [loading, setLoading] = useState(false); const messagesEndRef = useRef(null); const scrollToBottom = () => { messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }); }; useEffect(() => { scrollToBottom(); }, [messages]); useEffect(() => { if (isOpen && messages.length === 0) { loadHistory(); } }, [isOpen]); const loadHistory = async () => { try { const data = await ApiUtils.get( `${CONFIG.API_ENDPOINTS.AI.HISTORY}?limit=10` ); if (data.data && data.data.history) { const formatted = data.data.history.reverse().flatMap((chat) => [ { text: chat.message, sender: "user", time: chat.created_at }, { text: chat.response, sender: "ai", time: chat.created_at }, ]); setMessages(formatted); } } catch (error) { console.error("Failed to load history:", error); } }; const sendMessage = async () => { if (!input.trim() || loading) return; const userMessage = { text: input, sender: "user", time: new Date() }; setMessages((prev) => [...prev, userMessage]); setInput(""); setLoading(true); try { const data = await ApiUtils.post(CONFIG.API_ENDPOINTS.AI.CHAT, { message: input, history: messages.slice(-10).map((msg) => ({ text: msg.text, sender: msg.sender, })), }); const aiMessage = { text: data.data.message?.content || data.data.response || "Maaf, tidak ada respons.", sender: "ai", time: new Date(), }; setMessages((prev) => [...prev, aiMessage]); } catch (error) { console.error("AI Chat error:", error); const errorMessage = { text: "Maaf, terjadi kesalahan. Silakan coba lagi.", sender: "ai", time: new Date(), }; setMessages((prev) => [...prev, errorMessage]); } finally { setLoading(false); } }; const clearHistory = async () => { if (!confirm("Hapus semua riwayat chat?")) return; try { await ApiUtils.delete(CONFIG.API_ENDPOINTS.AI.HISTORY); setMessages([]); } catch (error) { console.error("Failed to clear history:", error); alert("Gagal menghapus riwayat"); } }; return ( <> {/* Floating Button */} {/* Chat Window - REDUCED HEIGHT */} {isOpen && (
{/* Header - REDUCED PADDING */}

🤖 AI Assistant

Tanya apa saja tentang Lost & Found

{/* Messages Area - ADJUSTED HEIGHT */}
{messages.length === 0 && (

👋

Halo! Ada yang bisa saya bantu?

💡 Coba tanya:

"Ada dompet yang ditemukan?"

"Bagaimana cara lapor kehilangan?"

)} {messages.map((msg, idx) => (

{msg.text}

{msg.intent && ( 🏷️ {msg.intent} )}
))} {loading && (
💭 Sedang berpikir...
)}
{/* Input Area - REDUCED PADDING */}
setInput(e.target.value)} onKeyPress={(e) => e.key === "Enter" && sendMessage()} placeholder="Ketik pesan..." className="flex-1 px-3 py-2 bg-slate-700 text-white text-sm rounded-xl focus:outline-none focus:ring-2 focus:ring-blue-500" disabled={loading} />
)} ); };