import React, { useState, useEffect, useRef } from "react"; import { Send, Bot, User } from "lucide-react"; import { motion } from "framer-motion"; import { mbaFaqs } from "../data/mbaData"; const API_BASE_URL = import.meta.env.VITE_API_BASE_URL || ""; export default function ICFAIChatbot() { // Local program/semester/course data const programs = [ { id: "mba_online", name: "Online MBA" }, { id: "bba_online", name: "Online BBA" }, ]; const allSemesters = [ { id: "sem1", name: "Semester I", courses: [ { id: "mob", name: "Management and Organization Behavior" }, { id: "ba", name: "Business Analytics" }, { id: "faf", name: "Foundations of Accounting and Finance" }, { id: "be", name: "Business Environment" }, { id: "itm", name: "IT for Managers" }, ], }, { id: "sem2", name: "Semester II", courses: [] }, { id: "sem3", name: "Semester III", courses: [] }, { id: "sem4", name: "Semester IV", courses: [] }, ]; const faqs = mbaFaqs || []; // Flow state: program -> semester -> course -> units const [flowStep, setFlowStep] = useState("program"); const [selectedProgram, setSelectedProgram] = useState(null); const [selectedSemester, setSelectedSemester] = useState(null); const [selectedCourse, setSelectedCourse] = useState(null); const [openUnit, setOpenUnit] = useState(null); // when a unit is selected, sidebar shows unit content // Chat state const [messages, setMessages] = useState([]); const [inputValue, setInputValue] = useState(""); const [isTyping, setIsTyping] = useState(false); const messagesEndRef = useRef(null); useEffect(() => { if (messages.length === 0) addBotMessage("Hello! 👋 Welcome — choose a program from the left."); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const addBotMessage = (text, delay = 300) => { setIsTyping(true); setTimeout(() => { setMessages((m) => [...m, { type: "bot", text }]); setIsTyping(false); scrollToBottom(); }, delay); }; const addUserMessage = (text) => { setMessages((m) => [...m, { type: "user", text }]); scrollToBottom(); }; const scrollToBottom = () => messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }); // Flow handlers const onSelectProgram = (p) => { addUserMessage(p.name); setSelectedProgram(p); setSelectedSemester(null); setSelectedCourse(null); setOpenUnit(null); setFlowStep("semester"); addBotMessage(`Great — ${p.name} selected. Choose a semester.`); }; const onSelectSemester = (s) => { addUserMessage(s.name); setSelectedSemester(s); setSelectedCourse(null); setOpenUnit(null); setFlowStep("course"); addBotMessage(`You selected ${s.name}. Pick a course.`); }; const onSelectCourse = (c) => { addUserMessage(c.name); setSelectedCourse(c); setOpenUnit(null); if (c.id === "itm") { setFlowStep("units"); addBotMessage(`You selected ${c.name}. Choose a unit from the left.`); } else { setFlowStep("chat"); addBotMessage(`You selected ${c.name}. Ask academic questions or open Units if available.`); } }; const onSelectUnit = (n) => setOpenUnit(n); const onBack = () => { if (openUnit) { setOpenUnit(null); return; } if (flowStep === "units") { setFlowStep("course"); setSelectedCourse(null); return; } if (flowStep === "course") { setFlowStep("semester"); setSelectedSemester(null); return; } if (flowStep === "semester") { setFlowStep("program"); setSelectedProgram(null); return; } }; const onFaqClick = (faq) => { // show FAQ answer in chat (keeps sidebar focused on FAQs) addUserMessage(faq.question); addBotMessage(faq.answer, 400); }; const handleSendMessage = async () => { if (!inputValue.trim()) return; const q = inputValue.trim(); addUserMessage(q); setInputValue(""); setIsTyping(true); try { const fd = new FormData(); fd.append("user_message", q); const res = await fetch(`${API_BASE_URL}/digital_icfai_chat`, { method: "POST", body: fd }); const data = await res.json().catch(() => ({})); const answer = (data && (data.answer || data.response)) || "I couldn't find an exact answer in the FAQs."; addBotMessage(answer, 200); } catch (err) { addBotMessage("Sorry, knowledge server unreachable. Try again later."); } finally { setIsTyping(false); } }; // Sidebar renderer — only one section visible at a time, and unit content expands inside sidebar const SidebarContent = () => { if (!flowStep || flowStep === "program") { return ( <>

Programs

{programs.map((p) => ( ))}
); } if (flowStep === "semester") { return ( <>

Semesters

{allSemesters.map((s) => ( ))}
); } if (flowStep === "course") { return ( <>

Courses in {selectedSemester?.name}

{(selectedSemester?.courses || []).length > 0 ? ( selectedSemester.courses.map((c) => ( )) ) : (
No courses listed for this semester
)}
); } if (flowStep === "units") { // If no unit selected, show unit buttons. If unit selected, show its FAQ(s) in the sidebar content area. if (!openUnit) { return ( <>

ITM Units

{[1,2,3,4,5].map((n) => ( ))}
); } // openUnit: render the unit content inside the sidebar (fixed header + scrollable FAQ list) return ( <>

Unit {openUnit}

{openUnit === 1 ? (
{faqs.map((q,i) => ( ))}
) : (
{faqs[openUnit - 2] ? ( ) : (
No FAQ assigned
)}
)}
); } return null; }; return (
{/* Sidebar: 600px, vertical layout, header fixed, content scrolls, footer fixed */} {/* Right panel: always shows chat */}

ICFAI Online Assistant

Chat / Answers

{/* Chat messages */}
{messages.map((m, i) => (
{m.type !== "user" &&
}
{m.text}
{m.type === "user" &&
}
))} {isTyping && (
)}
{/* Input area */}
setInputValue(e.target.value)} placeholder="Ask academic questions about the selected course..." className="flex-1 p-4 border border-gray-300 rounded-2xl focus:outline-none focus:ring-2 focus:ring-blue-600 text-sm" />

Powered by ICFAI Online

); }