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.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 (
);
};
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.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 && (
)}
);
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 ? (
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;