diff --git a/.gitignore b/.gitignore
index 4f7aa2d..71c9eff 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,7 +5,9 @@ __pycache__/
# C extensions
*.so
-
+services/frontend1/node_modules/
+node_modules/
+.DS_Store
# Distribution / packaging
.Python
build/
@@ -145,7 +147,7 @@ venv.bak/
# mkdocs documentation
/site
-
+**/node_modules/
# mypy
.mypy_cache/
.dmypy.json
diff --git a/services/frontend1/.dockerignore b/services/frontend1/.dockerignore
new file mode 100644
index 0000000..2e214dc
--- /dev/null
+++ b/services/frontend1/.dockerignore
@@ -0,0 +1,2 @@
+node_modules/
+*.env
\ No newline at end of file
diff --git a/services/frontend1/.env b/services/frontend1/.env
new file mode 100644
index 0000000..afe9281
--- /dev/null
+++ b/services/frontend1/.env
@@ -0,0 +1 @@
+REACT_APP_API_URL=http://localhost:8000/api/chat
\ No newline at end of file
diff --git a/services/frontend1/Dockerfile b/services/frontend1/Dockerfile
new file mode 100644
index 0000000..99ea2ca
--- /dev/null
+++ b/services/frontend1/Dockerfile
@@ -0,0 +1,23 @@
+# Base image
+FROM node:18-alpine
+
+# Set working directory
+WORKDIR /app
+
+# Copy package.json and package-lock.json files
+COPY package*.json ./
+
+# Install dependencies
+RUN npm install
+
+# Copy project files
+COPY . .
+
+# Build the application (if needed)
+RUN npm run build
+
+# Expose the port your app runs on
+EXPOSE 3000
+
+# Command to run the application
+CMD ["npm", "start"]
\ No newline at end of file
diff --git a/services/frontend1/public/northeastern-logo.svg b/services/frontend1/public/northeastern-logo.svg
new file mode 100644
index 0000000..f993e70
--- /dev/null
+++ b/services/frontend1/public/northeastern-logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/services/frontend1/public/nu_tab_icon.svg b/services/frontend1/public/nu_tab_icon.svg
new file mode 100644
index 0000000..f85823c
--- /dev/null
+++ b/services/frontend1/public/nu_tab_icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/services/frontend1/src/App.js b/services/frontend1/src/App.js
new file mode 100644
index 0000000..f184e14
--- /dev/null
+++ b/services/frontend1/src/App.js
@@ -0,0 +1,20 @@
+import React from 'react';
+import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
+import LandingPage from './LandingPage';
+import ChatInterface from './ChatInterface';
+import './index.css';
+
+function App() {
+ return (
+
+
+
+ } />
+ } />
+
+
+
+ );
+}
+
+export default App;
\ No newline at end of file
diff --git a/services/frontend1/src/BotAvatar.js b/services/frontend1/src/BotAvatar.js
new file mode 100644
index 0000000..93b57b1
--- /dev/null
+++ b/services/frontend1/src/BotAvatar.js
@@ -0,0 +1,17 @@
+// src/BotAvatar.js
+import React from 'react';
+import huskyLogo from './assets/husky-logo.svg';
+
+const BotAvatar = ({ size = 60 }) => (
+
+);
+
+export default BotAvatar;
diff --git a/services/frontend1/src/ChatInterface.js b/services/frontend1/src/ChatInterface.js
new file mode 100644
index 0000000..e48f831
--- /dev/null
+++ b/services/frontend1/src/ChatInterface.js
@@ -0,0 +1,158 @@
+import React, { useState, useRef, useEffect } from 'react';
+import { useNavigate } from 'react-router-dom';
+import NULogo from './NULogo';
+import BotAvatar from './BotAvatar';
+import UserAvatar from './UserAvatar';
+
+// Sample chat responses for the full chat interface
+const CHAT_RESPONSES = {
+ "hello": "Hi there! I'm NUBot. How can I help you with Northeastern University information today?",
+ "hi": "Hello! I'm NUBot, your Northeastern University assistant. What information can I help you find?",
+ "courses": "Northeastern offers a wide range of courses across various disciplines. Are you looking for courses in a specific department or program?",
+ "faculty": "Northeastern has renowned faculty members across all colleges. Which department or professor are you interested in learning about?",
+ "campus": "Northeastern's main campus is located in Boston, MA. We also have regional campuses in Charlotte, Seattle, San Francisco, Vancouver, Portland ME, and more. Which campus would you like to know more about?",
+ "about": "I'm NUBot, an AI assistant designed to help you navigate Northeastern University information more easily. I can answer questions about courses, faculty, campus resources, and more!",
+ "help": "I can help you find information about Northeastern's academic programs, faculty, campus resources, student services, and more. What would you like to know?",
+ "admission": "Northeastern has different application processes for undergraduate, graduate, and professional programs. Would you like information about a specific program's admission requirements?",
+ "events": "Northeastern hosts various events and activities throughout the year. You can check the university calendar or specific department pages for upcoming events. Is there a particular type of event you're interested in?",
+ "registration": "Course registration typically opens several months before the start of each semester. The exact dates depend on your student status and program. Would you like to know more about the registration process?",
+ "housing": "Northeastern offers various on-campus housing options for students, from traditional residence halls to apartment-style accommodations. Off-campus housing resources are also available through the university. Would you like specific information about housing options?",
+};
+
+// Typing indicator component that uses the three dots
+const TypingIndicator = () => {
+ return (
+
+
+
+
+
+ );
+};
+
+// This is a proper ChatInterface component for the /chat route
+const ChatInterface = () => {
+ const navigate = useNavigate();
+ const [messages, setMessages] = useState([
+ { sender: 'bot', message: "Hi there! I'm NUBot, your Northeastern University assistant. How can I help you today?" }
+ ]);
+ const [userInput, setUserInput] = useState('');
+ const [isLoading, setIsLoading] = useState(false);
+ const chatAreaRef = useRef(null);
+
+ // Scroll to bottom of chat area when messages change
+ useEffect(() => {
+ if (chatAreaRef.current) {
+ chatAreaRef.current.scrollTop = chatAreaRef.current.scrollHeight;
+ }
+ }, [messages, isLoading]); // Also scroll when loading state changes
+
+ const handleSendMessage = () => {
+ if (!userInput.trim() || isLoading) return;
+
+ // Add user message to chat
+ const userMessage = userInput.trim();
+ setMessages(prev => [...prev, { sender: 'user', message: userMessage }]);
+ setUserInput('');
+
+ // Set loading state
+ setIsLoading(true);
+
+ // Process bot response with delay to simulate thinking/processing
+ setTimeout(() => {
+ const lowerCaseInput = userMessage.toLowerCase();
+ let botResponse = "I'm here to help with anything related to Northeastern University. What else would you like to know?";
+
+ // Check for keyword matches
+ for (const [keyword, response] of Object.entries(CHAT_RESPONSES)) {
+ if (lowerCaseInput.includes(keyword)) {
+ botResponse = response;
+ break;
+ }
+ }
+
+ setMessages(prev => [...prev, { sender: 'bot', message: botResponse }]);
+ setIsLoading(false);
+ }, 1500); // Delay to simulate processing - adjust as needed
+ };
+
+ const handleKeyPress = (e) => {
+ if (e.key === 'Enter') {
+ handleSendMessage();
+ }
+ };
+
+ const handleExitChat = () => {
+ navigate('/');
+ };
+
+ return (
+
+ );
+};
+
+export default ChatInterface;
\ No newline at end of file
diff --git a/services/frontend1/src/LandingPage.js b/services/frontend1/src/LandingPage.js
new file mode 100644
index 0000000..c99397b
--- /dev/null
+++ b/services/frontend1/src/LandingPage.js
@@ -0,0 +1,400 @@
+import React, { useRef, useState, useEffect } from 'react';
+import { useNavigate } from 'react-router-dom';
+import NULogo from './NULogo'; // Import the same logo component used in ChatInterface
+import BotAvatar from './BotAvatar';
+import UserAvatar from './UserAvatar';
+
+// Import SVG icons for tools
+import GCPIcon from './assets/gcp.svg';
+import MistralIcon from './assets/mistralai.svg';
+import DockerIcon from './assets/docker.svg';
+import MLflowIcon from './assets/mlflow.svg';
+import PrefectIcon from './assets/prefect.svg';
+import GitIcon from './assets/git.svg';
+
+// Import custom message icon
+import MessageIcon from './assets/imessage.svg';
+import BotIcon from './assets/boticon1.svg'; // Import the bot icon
+
+// Using your existing illustration
+import StudentIllustration from './assets/landingpageimage.svg';
+
+const TOOLS = [
+ {
+ name: 'GCP Cloud Run',
+ icon: GCPIcon,
+ description: 'Offers reliable cloud hosting for our services'
+ },
+ {
+ name: 'Mistral API',
+ icon: MistralIcon,
+ description: 'Powers the LLM inference for natural-language responses.'
+ },
+ {
+ name: 'Docker',
+ icon: DockerIcon,
+ description: 'Containerizes each service for consistent deployment.'
+ },
+ {
+ name: 'MLflow',
+ icon: MLflowIcon,
+ description: 'Tracks experiments and manages our model registry.'
+ },
+ {
+ name: 'Prefect',
+ icon: PrefectIcon,
+ description: 'Orchestrates data pipelines and retraining workflows.'
+ },
+ {
+ name: 'Git',
+ icon: GitIcon,
+ description: 'Version-controls our code and CI/CD pipelines.'
+ }
+];
+
+// Sample chat responses for the demo widget
+const DEMO_RESPONSES = {
+ "hello": "Hi there! I'm NUBot. How can I help you with Northeastern University information today?",
+ "hi": "Hello! I'm NUBot, your Northeastern University assistant. What information can I help you find?",
+ "courses": "Northeastern offers a wide range of courses across various disciplines. Are you looking for courses in a specific department or program?",
+ "faculty": "Northeastern has renowned faculty members across all colleges. Which department or professor are you interested in learning about?",
+ "campus": "Northeastern's main campus is located in Boston, MA. We also have regional campuses in Charlotte, Seattle, San Francisco, Vancouver, Portland ME, and more. Which campus would you like to know more about?",
+ "about": "I'm NUBot, an AI assistant designed to help you navigate Northeastern University information more easily. I can answer questions about courses, faculty, campus resources, and more!",
+ "help": "I can help you find information about Northeastern's academic programs, faculty, campus resources, student services, and more. What would you like to know?",
+};
+
+// Typing indicator component
+const TypingIndicator = () => {
+ return (
+
+
+ {/* Modern hero section with larger illustration */}
+
+
+
+ NU
+ Bot
+
+
+
+
+ Navigate Northeastern with AI-powered assistance
+
+
+
+
+
+ Designed by Huskies, for Huskies. NUBot provides instant answers to your questions about campus, courses, faculty details, and resources.
+
+
+
+
+
+
+
+
+ {/* Tools section with grid layout - MOVED UP */}
+
+
Powered by
+
+ {TOOLS.map((tool) => (
+
+
+
{tool.name}
+
{tool.description}
+
+ ))}
+
+
+
+ {/* About Us Section - MOVED DOWN */}
+
+
About Us
+
+
+
Our Mission
+
+ At NUBot, we understand the challenges students face when navigating complex university websites.
+ Our team experienced these frustrations firsthand, often spending hours searching for
+ information about courses, faculty, and campus resources.
+
+
+ That's why we created NUBot - an AI-powered assistant specifically trained on Northeastern
+ University information to help students, faculty, and visitors quickly find what they need.
+
+
How NUBot Helps
+
+
Get instant answers about Northeastern's academic programs
+
Find detailed faculty information and office hours
+
Navigate campus resources and facilities
+
Learn about student services and support options
+
Get help with course selection and registration
+
+
+ Our goal is to save you time and make university information more accessible. Whether you're a
+ prospective student, current Husky, or faculty member, NUBot is here to assist you with accurate
+ and helpful information about Northeastern University.
+
+
+
+
+
+ {/* Contact Section (Placeholder) */}
+
+
Contact Us
+
+
+ Have questions, suggestions, or feedback? We'd love to hear from you!
+