import { useEffect, useMemo, useRef, useState } from "react"; import { AnimatePresence, motion } from "framer-motion"; import { ArrowUpRight } from "lucide-react"; import MessageBubble from "./MessageBubble"; import ChatButton from "./ChatButton"; import { matchAnswer, outOfScopeAnswer, suggestedQuestions, } from "./qaMap"; type Message = { id: string; role: "user" | "bot"; text: string; }; const welcomeMessage: Message = { id: "welcome", role: "bot", text: "Hi 👋 I’m QuantFortune Assistant. How can I help you today?", }; export default function ChatWidget() { const [open, setOpen] = useState(false); const [input, setInput] = useState(""); const [messages, setMessages] = useState([welcomeMessage]); const [typing, setTyping] = useState(false); const [showSuggestions, setShowSuggestions] = useState(true); const endRef = useRef(null); const debounceRef = useRef(null); const suggestTimerRef = useRef(null); useEffect(() => { endRef.current?.scrollIntoView({ behavior: "smooth" }); }, [messages, typing, open]); const handleSend = (question: string) => { const trimmed = question.trim(); if (!trimmed) return; const matched = matchAnswer(trimmed); if (!matched) { return; } if (debounceRef.current) { window.clearTimeout(debounceRef.current); } if (suggestTimerRef.current) { window.clearTimeout(suggestTimerRef.current); } debounceRef.current = window.setTimeout(() => { const userMessage: Message = { id: `u_${Date.now()}`, role: "user", text: trimmed, }; setMessages((prev) => [...prev, userMessage]); setInput(""); const answer = matched ?? outOfScopeAnswer; const delay = 500 + Math.floor(Math.random() * 300); setTyping(true); setShowSuggestions(false); window.setTimeout(() => { setTyping(false); const botMessage: Message = { id: `b_${Date.now()}`, role: "bot", text: answer, }; setMessages((prev) => [...prev, botMessage]); suggestTimerRef.current = window.setTimeout(() => { if (!input.trim()) { setShowSuggestions(true); } }, 1400); }, delay); }, 250); }; const chips = useMemo(() => suggestedQuestions.slice(0, 10), []); const inputAnswer = matchAnswer(input); const showHint = input.trim().length > 0 && !inputAnswer; return ( <> setOpen((prev) => !prev)} /> {open && (

QuantFortune Assistant

Instant answers • Always on

{messages.map((msg) => ( ))} {typing && ( Typing... )}
{showSuggestions && (
{chips.map((chip) => ( handleSend(chip)} className="flex w-full items-center justify-between rounded-xl border border-white/10 bg-white/5 px-3 py-2 text-left text-xs text-slate-200 transition hover:border-sky-400/40 hover:bg-sky-500/10" > ➜ {chip} ↗ ))}
)}
setInput(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") { e.preventDefault(); handleSend(input); } }} placeholder="Ask about QuantFortune, SIPs, or broker connection…" className="w-full rounded-full border border-white/10 bg-white/5 px-4 py-2 pr-10 text-sm text-slate-100 placeholder:text-slate-500 focus:border-sky-400/50 focus:outline-none" />
{showHint && (

Try a suggested question for instant answers.

)}
)} ); }