/* global React, Icon, Avatar, ProgressRing, ProgressBar, Modal, timeAgo, formatDate, formatTime */ // ============================================================================ // Member area screens // ============================================================================ // ----- Dashboard ----- const Dashboard = ({ user, nav }) => { const phases = DB.phases(); const overall = DB.overallProgress(user); const allLessons = phases.flatMap(p => DB.lessonsByPhase(p.id)); const nextLesson = allLessons.find(l => !user.progress[l.id]?.watched); const recentPosts = DB.posts().slice(0, 3); const upcomingLives = DB.lives().filter(l => l.status === 'agendada').slice(0, 2); const activity = DB.activity(8); return (
Núcleo de Líderes · {formatDate(new Date().toISOString(), {weekday:'long', day:'2-digit', month:'long'})}

Olá, {user.name.split(' ')[0]}. Continue sua jornada.

Você está {overall}% através do programa. Próximo passo abaixo.

{user.declaracaoIntencao && (
Sua declaração de intenção
"{user.declaracaoIntencao}"
)}
{nextLesson && (
nav(`/aula/${nextLesson.id}`)} style={{ cursor: 'pointer' }}>
Próxima aula
{nextLesson.title}
{phases.find(p=>p.id===nextLesson.phaseId)?.title} · {nextLesson.duration}
)}
Progresso geral
{overall}%
Aulas concluídas
{allLessons.filter(l => user.progress[l.id]?.watched).length} / {allLessons.length}
desde {formatDate(user.createdAt)}
Próxima live
{upcomingLives[0] ? formatDate(upcomingLives[0].date, { day:'2-digit', month:'short' }) : '—'}
{upcomingLives[0] ? `às ${formatTime(upcomingLives[0].date)}` : 'Sem lives agendadas'}
Fase atual
{(() => { const cur = phases.find(p => { const pr = DB.progressForPhase(user, p.id); return pr.pct < 100; }) || phases[phases.length-1]; return cur.title.split(':')[0]; })()}
{(() => { const cur = phases.find(p => { const pr = DB.progressForPhase(user, p.id); return pr.pct < 100; }) || phases[phases.length-1]; return cur.pillar; })()}

Sua jornada

nav('/jornada')} style={{ cursor:'pointer' }}>Ver todas as fases →
{phases.map((p, idx) => { const pr = DB.progressForPhase(user, p.id); return (
nav(`/jornada/${p.slug}`)} style={{ cursor:'pointer' }}>
0{idx}
{p.pillar}

{p.title}

{p.subtitle}
{pr.pct}%
{pr.done} / {pr.total} aulas
); })}

Próximas lives

{DB.lives().slice(0, 3).map(live => (
{new Date(live.date).toLocaleDateString('pt-BR', { month: 'short' })}
{new Date(live.date).getDate()}
{live.title}
{live.status === 'gravada' ? 'Gravação disponível' : `${formatTime(live.date)} · 60–90min`}
{live.status}
))}

Comunidade

nav('/comunidade')} style={{cursor:'pointer'}}>Ver tudo →
{recentPosts.map(p => { const author = DB.userById(p.authorId); return (
nav('/comunidade')} style={{cursor:'pointer'}}>
{author?.name}
{timeAgo(p.createdAt)} · {p.replies.length} resposta(s)
{p.body.length > 140 ? p.body.slice(0,140)+'…' : p.body}
); })}
); }; // ----- Jornada (list of phases or single phase) ----- const Jornada = ({ user, phaseSlug, nav }) => { const phases = DB.phases(); const phase = phaseSlug ? phases.find(p => p.slug === phaseSlug) : null; if (phase) { const lessons = DB.lessonsByPhase(phase.id); const idx = phases.findIndex(p => p.id === phase.id); const pr = DB.progressForPhase(user, phase.id); return (
{phase.pillar}

{phase.title}

{phase.subtitle}

{pr.pct}%
{pr.done} de {pr.total} aulas
0{idx}

{phase.description}

{lessons.map(l => { const pgr = user.progress[l.id]; const done = pgr?.watched; const partial = pgr?.secs > 0 && !done; return (
nav(`/aula/${l.id}`)}>
{l.title}
{l.type === 'live' ? 'Live' : l.type === 'workbook' ? 'Exercício' : 'Aula gravada'} {l.duration} {l.materials.length > 0 && · {l.materials.length} material(is) anexo(s)}
{done ? 'Revisar' : (partial ? 'Continuar' : 'Assistir')}
); })}
); } return (
Programa de 12 semanas

Sua jornada

Quatro fases. Cada uma com aulas gravadas, lives semanais e orientação individualizada.

{phases.map((p, idx) => { const lessons = DB.lessonsByPhase(p.id); const pr = DB.progressForPhase(user, p.id); return (
nav(`/jornada/${p.slug}`)} style={{cursor:'pointer'}}>
0{idx}
{p.pillar}

{p.title}

{p.subtitle}
{pr.pct}%
{pr.done} / {pr.total} aulas
{lessons.slice(0, 3).map(l => { const done = user.progress[l.id]?.watched; return (
nav(`/aula/${l.id}`)}>
{l.title}
{l.type === 'live' ? 'Live' : l.type === 'workbook' ? 'Exercício' : 'Aula'} {l.duration}
{done ? 'Revisar' : 'Assistir'}
); })} {lessons.length > 3 && (
nav(`/jornada/${p.slug}`)} style={{ background: 'rgba(42,108,255,0.04)', justifyContent: 'center' }}>
Ver mais {lessons.length - 3} aulas dessa fase →
)}
); })}
); }; // ----- Player ----- const LessonPlayer = ({ user, lessonId, nav }) => { const lesson = DB.lesson(lessonId); const [tab, setTab] = React.useState('descricao'); const [playing, setPlaying] = React.useState(false); const [pct, setPct] = React.useState(() => { const p = user.progress[lessonId]; if (!p) return 0; return p.total ? Math.round(p.secs / p.total * 100) : 0; }); if (!lesson) return

Aula não encontrada.

; const phase = DB.phases().find(p => p.id === lesson.phaseId); const sameFase = DB.lessonsByPhase(lesson.phaseId); const curIdx = sameFase.findIndex(l => l.id === lesson.id); const prev = sameFase[curIdx - 1]; const next = sameFase[curIdx + 1]; const markDone = () => { DB.updateProgress(user.id, lesson.id, 100, 100, true); setPct(100); }; const togglePlay = () => { setPlaying(p => !p); }; // simulate progress when playing React.useEffect(() => { if (!playing) return; const t = setInterval(() => { setPct(p => { const np = Math.min(100, p + 2); DB.updateProgress(user.id, lesson.id, np, 100, np >= 100); if (np >= 100) setPlaying(false); return np; }); }, 600); return () => clearInterval(t); }, [playing, lesson.id, user.id]); return (
{!playing ? ( ) : ( )}
{lesson.title}
{lesson.duration}
{Math.round(pct)}% assistido
{['descricao','transcricao','notas'].map(t => ( ))}
{tab==='descricao' && ( <>

{lesson.description}

Esta aula faz parte da {phase.title} ({phase.pillar}). O conteúdo é base para a Folha em Branco semanal e para a Orientação Individualizada do próximo ciclo — assista antes de quinta-feira.

Como aproveitar: assista uma primeira vez de ponta a ponta. Depois, refaça com caderno do lado nas partes que mais te tocaram. Traga uma pergunta concreta para a Folha em Branco.

)} {tab==='transcricao' && ( <>

Transcrição completa será disponibilizada até 24h após a publicação. Você pode buscar termos específicos pelo Ctrl+F.

[00:00] Boas-vindas e contexto da aula…

[02:14] Por que esse conceito chega só agora no programa…

[08:42] Exercício prático que você fará nesta semana…

)} {tab==='notas' && (