import React, { useState, useEffect } from 'react'; import { Play, Shield, User, GraduationCap, ArrowRight, Lock, Mail, Plus, CheckCircle, ChevronRight, HelpCircle, Film, Laptop } from 'lucide-react'; import Navbar from './components/Navbar'; import HeroBanner from './components/HeroBanner'; import CourseCarousel from './components/CourseCarousel'; import CourseView from './components/CourseView'; import SubscriptionView from './components/SubscriptionView'; import CourseUnlockModal from './components/CourseUnlockModal'; import CertificatesTab from './components/CertificatesTab'; import ProfileView from './components/ProfileView'; import HelpView from './components/HelpView'; import { User as UserType, Course as CourseType, SubscriptionStatus } from './types'; export default function App() { const [token, setToken] = useState(localStorage.getItem('devflix_token')); const [user, setUser] = useState<{ name: string; email: string; role: 'admin' | 'student'; subscriptionStatus: SubscriptionStatus; } | null>(null); // App routing const [activeView, setView] = useState('home'); // home, course-view, subscription, admin-dashboard, admin-content const [selectedCourseId, setSelectedCourseId] = useState(null); const [unlockingCourse, setUnlockingCourse] = useState(null); // Authentication forms const [isRegister, setIsRegister] = useState(false); const [loginEmail, setLoginEmail] = useState(''); const [loginPassword, setLoginPassword] = useState(''); const [regName, setRegName] = useState(''); const [regEmail, setRegEmail] = useState(''); const [regPassword, setRegPassword] = useState(''); const [regBirthDate, setRegBirthDate] = useState(''); const [regWhatsapp, setRegWhatsapp] = useState(''); const [authError, setAuthError] = useState(null); const [authSuccess, setAuthSuccess] = useState(null); const [authLoading, setAuthLoading] = useState(false); // Course catalogue const [courses, setCourses] = useState<(CourseType & { progress?: number; totalLessons?: number; completedLessons?: number })[]>([]); const [isLoadingCourses, setIsLoadingCourses] = useState(false); useEffect(() => { if (token) { fetchUserProfile(); } }, [token]); useEffect(() => { if (user) { fetchCourses(); } }, [user]); const fetchUserProfile = async () => { try { const res = await fetch('/api/auth/me', { headers: { 'Authorization': `Bearer ${token}` } }); if (res.ok) { const data = await res.json(); setUser(data); } else { // Stale token handleLogout(); } } catch (err) { console.error('Failed to load profile:', err); } }; const fetchCourses = async () => { setIsLoadingCourses(true); try { const res = await fetch('/api/courses', { headers: { 'Authorization': `Bearer ${token}` } }); if (res.ok) { const data = await res.json(); setCourses(data); } } catch (err) { console.error('Failed to fetch courses:', err); } finally { setIsLoadingCourses(false); } }; const handleLogin = async (e: React.FormEvent) => { e.preventDefault(); setAuthError(null); setAuthLoading(true); try { const res = await fetch('/api/auth/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email: loginEmail, password: loginPassword }) }); const data = await res.json(); if (!res.ok) { throw new Error(data.error || 'Erro ao efetuar login'); } localStorage.setItem('devflix_token', data.token); setToken(data.token); setUser(data.user); setLoginEmail(''); setLoginPassword(''); } catch (err: any) { setAuthError(err.message); } finally { setAuthLoading(false); } }; const handleRegister = async (e: React.FormEvent) => { e.preventDefault(); setAuthError(null); setAuthSuccess(null); setAuthLoading(true); try { const res = await fetch('/api/auth/register', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: regName, email: regEmail, password: regPassword, birthDate: regBirthDate, whatsapp: regWhatsapp }) }); const data = await res.json(); if (!res.ok) { throw new Error(data.error || 'Erro ao efetuar cadastro'); } localStorage.setItem('devflix_token', data.token); setToken(data.token); setUser(data.user); setRegName(''); setRegEmail(''); setRegPassword(''); } catch (err: any) { setAuthError(err.message); } finally { setAuthLoading(false); } }; const handleLogout = () => { localStorage.removeItem('devflix_token'); setToken(null); setUser(null); setView('home'); setSelectedCourseId(null); }; const handleSelectCourse = (courseId: string) => { const selected = courses.find(c => c.id === courseId); if (selected && (selected as any).isUnlocked === false) { setUnlockingCourse(selected); return; } setSelectedCourseId(courseId); setView('course-view'); }; // Group courses by Category const categories = Array.from(new Set(courses.map(c => c.category))) as string[]; // Preset quick-fill logins for easy testing const quickFill = (email: string, pass: string) => { setLoginEmail(email); setLoginPassword(pass); setAuthError(null); }; // Check if active student is blocked (overdue or cancelled) const isBlocked = user?.subscriptionStatus === 'OVERDUE' || user?.subscriptionStatus === 'CANCELED'; return (
{token && user ? ( /* --- AUTHENTICATED AREA --- */ <> { setView(v); setSelectedCourseId(null); }} onLogout={handleLogout} />
{/* RENDER VIEW: HOME CATALOGUE */} {activeView === 'home' && (
{/* Hero Banner (Featured last course or first catalogue course) */} 0 ? courses[0] : null} onPlay={handleSelectCourse} subscriptionStatus={user.subscriptionStatus} setView={setView} /> {/* Categories Carousels */}
{isLoadingCourses ? (
) : courses.length === 0 ? (
Nenhum curso disponível no momento.
) : ( categories.map(cat => ( c.category === cat)} onSelectCourse={handleSelectCourse} onUnlockCourse={(course) => setUnlockingCourse(course)} subscriptionStatus={user.subscriptionStatus} /> )) )}
)} {/* RENDER VIEW: COURSE STUDY ROOM */} {activeView === 'course-view' && selectedCourseId && ( { setView('home'); setSelectedCourseId(null); fetchCourses(); }} /> )} {/* RENDER VIEW: ACCOUNT & BILLING / SUBSCRIPTION */} {activeView === 'subscription' && ( setUser(prev => prev ? { ...prev, subscriptionStatus: newStatus } : null)} /> )} {/* RENDER VIEW: CERTIFICATES */} {activeView === 'certificates' && ( )} {/* RENDER VIEW: PROFILE */} {activeView === 'profile' && ( setView('home')} /> )} {/* RENDER VIEW: HELP */} {activeView === 'help' && ( setView('home')} /> )}
{/* Unlock Modal */} {unlockingCourse && ( setUnlockingCourse(null)} onSuccess={() => { setUnlockingCourse(null); fetchCourses(); fetchUserProfile(); }} token={token || ''} /> )} {/* Footer */}

MICROTECFLIX - Plataforma de Cursos Profissionalizantes de Informática

Desenvolvido com foco em alta experiência de estudo para Windows, Pacote Office (Word, Excel, PowerPoint) e informática profissionalizante.

© 2026 MicrotecFlix Inc. Todos os direitos reservados. Integrado oficialmente com a API Asaas.

) : ( /* --- UNAUTHENTICATED PORTAL (LOGIN / REGISTER) --- */
{/* Login Container */}
{/* Logo */}

MICROTECFLIX

Acelere seus estudos em informática e pacote Office no estilo Netflix.

{/* Error indicators */} {authError && (
{authError}
)} {isRegister ? ( /* REGISTER FORM */
setRegName(e.target.value)} placeholder="Seu nome" className="w-full glass-input rounded-lg p-3 text-xs text-white focus:outline-none" />
setRegEmail(e.target.value)} placeholder="email@exemplo.com" className="w-full glass-input rounded-lg p-3 text-xs text-white focus:outline-none" />
setRegBirthDate(e.target.value)} className="w-full glass-input rounded-lg p-3 text-xs text-white focus:outline-none" />
setRegWhatsapp(e.target.value)} placeholder="(11) 99999-9999" className="w-full glass-input rounded-lg p-3 text-xs text-white focus:outline-none" />
setRegPassword(e.target.value)} placeholder="Mínimo 6 caracteres" className="w-full glass-input rounded-lg p-3 text-xs text-white focus:outline-none" />

Já possui cadastro?{' '}

) : ( /* LOGIN FORM */
setLoginEmail(e.target.value)} placeholder="email@exemplo.com" className="w-full glass-input rounded-lg p-3 pl-10 text-xs text-white focus:outline-none" />
setLoginPassword(e.target.value)} placeholder="Digite sua senha" className="w-full glass-input rounded-lg p-3 pl-10 text-xs text-white focus:outline-none" />

Novo por aqui?{' '}

{/* QUICK PRESETS FOR SANDBOX DEMO */}

Acesso de Teste Rápido (Iframe Sandbox)

)}
)}
); }