import { Input } from "@/components"; import { useMoonTokenManager } from "@/hooks"; import type { ChatMessage } from "@/types"; import React, { useEffect, useState } from "react"; import { useMoonSDK } from "../../hooks/old/useMoonSDK"; import ChatBubble from "./components/ChatBubble"; import { testMessages } from "./testData/chatTestData"; export type ChatBotProps = { className?: string; containerProps?: React.HTMLAttributes; messageBoxProps?: React.HTMLAttributes; inputProps?: React.InputHTMLAttributes; sendButtonProps?: React.ButtonHTMLAttributes; clearButtonProps?: React.HTMLAttributes; }; export const ChatBot: React.FC = ({ className, containerProps, messageBoxProps, inputProps, sendButtonProps, clearButtonProps, }) => { const containerRef = React.useRef(null); const messageBoxRef = React.useRef(null); const [showMessages, setShowMessages] = useState(false); const { chatOpen, wallet, chain, wallets } = useMoonSDK(); const { tokens } = useMoonTokenManager(); console.log("showMessages", showMessages); const [messages, setMessages] = useState([ { id: "initial", type: "userMessage", sender: "system", timestamp: new Date(), content: "Hello! I'm Cod3x, your friendly AI assistant. How can I help you today?", }, ...testMessages, ]); const [userInput, setUserInput] = useState(""); useEffect(() => { function handleClickOutside(event: MouseEvent) { if ( containerRef.current && !containerRef.current.contains(event.target as Node) ) { setShowMessages(false); } } document.addEventListener("mousedown", handleClickOutside); return () => { document.removeEventListener("mousedown", handleClickOutside); }; }, [containerRef]); useEffect(() => { loadMessagesFromLocalStorage(); if (messageBoxRef.current) { messageBoxRef.current.scrollTo(0, messageBoxRef.current.scrollHeight); } }, []); useEffect(() => { if (messages.length > 1) { saveMessagesToLocalStorage(); } }, [messages]); const handleInputChange = (event: React.ChangeEvent) => { setUserInput(event.target.value); }; const clearMessages = () => { setMessages([]); localStorage.removeItem("messages"); }; const saveMessagesToLocalStorage = () => { localStorage.setItem("messages", JSON.stringify(messages)); }; const loadMessagesFromLocalStorage = () => { let storedMessages = JSON.parse(localStorage.getItem("messages") || "[]"); if (storedMessages.length === 0) { storedMessages = [messages[0]]; } setMessages(storedMessages.filter((msg: ChatMessage) => msg?.content)); }; const sendMessage = async () => { setShowMessages(true); setUserInput(""); const userMessage: ChatMessage = { id: Date.now().toString(), type: "userMessage", sender: "user", timestamp: new Date(), content: userInput, }; setMessages([...messages, userMessage]); try { const response = await fetch( "https://api.conscience.ngrok.app/conscience/1/Cod3xV2/trigger", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ text: `User Available Wallets: ${JSON.stringify( wallets, )}\nUser tokens: ${JSON.stringify( tokens, )}\nUser Selected Wallet: ${wallet}\n Selected Chain: ${JSON.stringify( chain, )}\nUser Query:${userInput}`, }), }, ).then((response) => response.json()); let botMessage: ChatMessage; try { const jsonData = JSON.parse(response.data); if (response.data.includes("abiFileName")) { botMessage = { id: Date.now().toString(), type: "multiStepTransaction", sender: "system", timestamp: new Date(), content: response.data, steps: jsonData, }; } else { throw new Error("Not a transaction"); } } catch (e) { botMessage = { id: Date.now().toString(), type: "userMessage", sender: "system", timestamp: new Date(), content: response.data, }; } setMessages([...messages, userMessage, botMessage]); } catch (error) { console.error("Error fetching response:", error); } messageBoxRef.current?.scrollTo(0, messageBoxRef.current?.scrollHeight); }; return (
{[...messages].reverse().map((msg) => ( ))}
Clear Message History
setShowMessages(true)} onMouseEnter={() => setShowMessages(true)} type="text" placeholder="Message Cod3x" value={userInput} onChange={handleInputChange} onKeyDown={(e) => { if (e.key === "Enter") { sendMessage(); } }} />
); }; export default ChatBot;