import React, { useState, useEffect, useMemo, useRef } from 'react'; import { ViewType, ClassLevel, EBook, VideoLecture, User, Course, CartItem } from './types'; import Header from './components/Header'; import Sidebar from './components/Sidebar'; import AITutor from './components/AITutor'; import Quiz from './components/Quiz'; import AdminPortal from './components/AdminPortal'; import { CLASSES, SUBJECTS, MOCK_EBOOKS, MOCK_COURSES } from './constants'; const SubHeader: React.FC<{ onClassClick: (cls: string) => void }> = ({ onClassClick }) => (
Navigate:
{CLASSES.map(cls => ( ))}
); const ClassSection: React.FC<{ cls: ClassLevel; idx: number; books: EBook[]; onBookClick: (book: EBook) => void; onCourseClick: () => void; }> = ({ cls, idx, books, onBookClick, onCourseClick }) => { const [isVisible, setIsVisible] = useState(false); const sectionRef = useRef(null); useEffect(() => { const observer = new IntersectionObserver( ([entry]) => { if (entry.isIntersecting) { setIsVisible(true); observer.disconnect(); } }, { rootMargin: '100px' } ); if (sectionRef.current) observer.observe(sectionRef.current); return () => observer.disconnect(); }, []); return (
{isVisible ? (
Lvl {idx + 1}

{cls}

• Mastery Path
{books.slice(0, 14).map(book => (
onBookClick(book)} className="group relative bg-white dark:bg-slate-900 rounded-xl border dark:border-slate-800 hover:border-indigo-500 transition-all cursor-pointer overflow-hidden shadow-sm hover:shadow-md" >
{book.title} {book.price === 0 &&
FREE
}

{book.subject}

{book.title}
₹{book.price} ★ {book.rating?.toFixed(1)}
))}
) : (
)}
); }; const AdminAuth: React.FC<{ type: 'login' | 'register', onAuth: () => void, setView: (v: ViewType) => void }> = ({ type, onAuth, setView }) => { const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); return (
A

{type === 'login' ? 'Admin Portal' : 'Register Admin'}

setEmail(e.target.value)} placeholder="Email" className="w-full bg-slate-50 dark:bg-slate-800 p-3 rounded-xl border border-transparent focus:border-indigo-600 outline-none text-sm dark:text-white" /> setPassword(e.target.value)} placeholder="Key" className="w-full bg-slate-50 dark:bg-slate-800 p-3 rounded-xl border border-transparent focus:border-indigo-600 outline-none text-sm dark:text-white" />
); }; const App: React.FC = () => { const [currentView, setCurrentView] = useState('home'); const [isDarkMode, setIsDarkMode] = useState(() => localStorage.getItem('theme') === 'dark'); const [user, setUser] = useState(null); const [adminUser, setAdminUser] = useState(null); const [cart, setCart] = useState([]); const [purchasedIds, setPurchasedIds] = useState(() => JSON.parse(localStorage.getItem('tn_purchased') || '[]')); const [selectedEbook, setSelectedEbook] = useState(null); useEffect(() => { document.documentElement.classList.toggle('dark', isDarkMode); localStorage.setItem('theme', isDarkMode ? 'dark' : 'light'); }, [isDarkMode]); const handleClassJump = (cls: string) => { const el = document.getElementById(`section-${cls.replace(' ', '-')}`); if (el) window.scrollTo({ top: el.offsetTop - 110, behavior: 'smooth' }); }; const renderContent = () => { switch (currentView) { case 'admin-login': return { setAdminUser({ id: 'a1', role: 'admin', name: 'Nexus Admin', email: 'admin@nexus.com', streak: 0, joinedAt: '', lastActive: '' }); setCurrentView('admin'); }} />; case 'admin': if (!adminUser) { setCurrentView('admin-login'); return null; } return {}} />; case 'home': return (
Nexus v3.5 Stable

THE TOPPER
Network.

Elite NCERT preparation logic mapped for precision academic results.

{CLASSES.map((cls, idx) => ( b.class === cls)} onBookClick={b => { setSelectedEbook(b); setCurrentView('ebook-detail'); window.scrollTo(0,0); }} onCourseClick={() => setCurrentView('courses')} /> ))}
); case 'ebook-detail': if (!selectedEbook) return null; return (
{selectedEbook.title}
{selectedEbook.subject} {selectedEbook.class}

{selectedEbook.title}

Logic Unit by {selectedEbook.author}

Valuation

₹{selectedEbook.price}

Topper Score

★ {selectedEbook.rating?.toFixed(1)}

{selectedEbook.purchases?.toLocaleString()}+

Synced

Node Specs

Precision-solved exercises and exam logic mapped for the 2025 Board Session. Optimized for high-retention learning.

{['Precision', '2025 Ready', 'Exam Logic'].map(tag => ( {tag} ))}
); case 'ebooks': return (

Digital Vault

{MOCK_EBOOKS.map(book => (
{ setSelectedEbook(book); setCurrentView('ebook-detail'); window.scrollTo(0,0); }} className="bg-white dark:bg-slate-900 p-2 rounded-xl border dark:border-slate-800 hover:shadow-lg transition-all cursor-pointer">

{book.title}

₹{book.price}

))}
); case 'cart': const total = cart.reduce((acc, curr) => acc + curr.price, 0); return (

Preparation Bag

{cart.map(item => (

{item.title}

₹{item.price}

))} {cart.length === 0 &&
Bag is Empty
}
{cart.length > 0 && (

Total

₹{total}

)}
); case 'profile': return (
S

Topper Scholar

Scholar ID: Active

Active Nodes

{purchasedIds.map(id => { const b = MOCK_EBOOKS.find(x => x.id === id); return b ? (
{b.title}
Launch
) : null; })}
); case 'ai-tutor': return ; case 'quizzes': return ; case 'courses': return (

Elite Mastery

{MOCK_COURSES.map(course => (

{course.title}

₹{course.price}
))}
); default: return null; } }; return (
setIsDarkMode(!isDarkMode)} onAdminClick={() => setCurrentView('admin-login')} onProfileClick={() => setCurrentView('profile')} onCartClick={() => setCurrentView('cart')} searchItems={[]} onResultClick={() => {}} user={user} cartCount={cart.length} />
{renderContent()}
); }; export default App;