diff --git a/src/App.tsx b/src/App.tsx index cbbb1d5..c6f738d 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,253 +1,277 @@ -import { useState, useEffect } from "react"; +import { useState, type JSX, useEffect } from "react"; +import { Star, X, Sun, Moon } from "lucide-react"; +import { addReview, fetchReviews, type Review } from "./reviewsApi"; +import { useTheme } from "./contexts/ThemeContext"; import HeroSection from "./components/HeroSection"; -import LeadershipSection from "./components/LeadershipSection"; -import EntrepreneurshipSection from "./components/EntrepreneurshipSection"; -import AcademicSection from "./components/AcademicSection"; +import UniqueSection from "./components/UniqueSection"; +import AcademicSTEMHighlights from "./components/AcademicStemHighlights"; import TechSection from "./components/TechSection"; -import AboutSection from "./components/AboutSection"; -import AthleticsSection from "./components/AthleticsSection"; -import ReviewsSection from "./components/ReviewsSection"; +import LeadershipSection from "./components/LeadershipSection"; +import AthleticSection from "./components/AthleticsSection"; +import EntrepreuneurshipSection from "./components/EntrepreneurshipSection"; +import ReviewSection from "./components/ReviewSection"; import Footer from "./components/Footer"; -import { Sun, Moon } from "lucide-react"; const App = () => { - const [, setActiveSection] = useState("hero"); - const [, setIsVisible] = useState({}); - const [isDarkMode, setIsDarkMode] = useState(true); + const { theme, toggleTheme } = useTheme(); + const [showModal, setShowModal] = useState(false); + const [reviews, setReviews] = useState([]); + const [newReview, setNewReview] = useState({ + name: "", + rating: -1, + position: "", + text: "", + }); useEffect(() => { - const observer = new IntersectionObserver( - (entries) => { - entries.forEach((entry) => { - if (entry.isIntersecting) { - setIsVisible((prev) => ({ ...prev, [entry.target.id]: true })); - setActiveSection(entry.target.id); - } - }); - }, - { threshold: 0.3 } - ); - - document.querySelectorAll("section[id]").forEach((section) => { - observer.observe(section); - }); - - return () => observer.disconnect(); + fetchReviews().then(setReviews); }, []); - const scrollToSection = (sectionId: string) => { - document.getElementById(sectionId)?.scrollIntoView({ behavior: "smooth" }); + const handleAddReview = () => { + if ( + !newReview.name || + newReview.rating < 1 || + newReview.rating > 5 || + !newReview.position || + !newReview.text + ) { + alert("Please fill out all fields correctly."); + return; + } + + // Add the new review to the state + addReview(newReview) + .then(() => { + fetchReviews().then(setReviews); + alert("Review added successfully!"); + setNewReview({ name: "", rating: -1, position: "", text: "" }); + setShowModal(false); + }) + .catch((error) => { + console.error("Error adding review:", error); + alert("Failed to add review. Please try again later."); + setShowModal(false); + }); }; - const toggleDarkMode = () => { - setIsDarkMode(!isDarkMode); + const renderStars = (rating: number): JSX.Element[] => { + return Array(5) + .fill(0) + .map((_, i) => ( + + )); }; - const themeClasses = isDarkMode - ? "min-h-screen bg-gradient-to-br from-slate-900 via-purple-900 to-slate-900 text-white overflow-x-hidden transition-all duration-1000" - : "min-h-screen bg-gradient-to-br from-blue-50 via-purple-50 to-pink-50 text-gray-900 overflow-x-hidden transition-all duration-1000"; - - const cardClasses = isDarkMode - ? "bg-white/5 backdrop-blur-lg border-white/10" - : "bg-white/90 backdrop-blur-lg border-gray-200/60 shadow-xl"; - - const navClasses = isDarkMode - ? "bg-black/20 backdrop-blur-lg border-white/10" - : "bg-white/80 backdrop-blur-lg border-gray-200/30"; - - const textClasses = isDarkMode ? "text-gray-300" : "text-gray-700"; - return ( -
- - {/* Navigation */} -