M

Entrar na mentoria

const direcionamentos = [ { id:'d2', numero:'02', carreira:'Autoridade e Controle', periodo:'15 – 21 jun', status:'atual', metaBlocos: calcMeta(20), blocos:[ {codigo:'01A', disciplina:'Direito Constitucional', link:'#', etapa:4, preAgendado:false, acertos:8, prints:2}, {codigo:'01B', disciplina:'Direito Administrativo', link:'#', etapa:4, preAgendado:false, acertos:6, prints:1}, {codigo:'02A', disciplina:'Direito Penal', link:'#', etapa:0, preAgendado:true, acertos:null, prints:0}, {codigo:'02B', disciplina:'Direito Constitucional', link:'#', etapa:0, preAgendado:false, acertos:null, prints:0}, {codigo:'03A', disciplina:'Processo Civil', link:'#', etapa:0, preAgendado:false, acertos:null, prints:0}, ] }, { id:'d1', numero:'01', carreira:'Autoridade e Controle', periodo:'08 – 14 jun', status:'encerrado', metaBlocos: 26, blocos:[ {codigo:'01A', disciplina:'Direito Constitucional', link:'#', etapa:4, preAgendado:false, acertos:7, prints:2}, {codigo:'01B', disciplina:'Direito Penal', link:'#', etapa:4, preAgendado:false, acertos:9, prints:0}, {codigo:'02A', disciplina:'Administração Geral e Pública', link:'#', etapa:4, preAgendado:false, acertos:5, prints:1}, ] }, ]; let blocoCounter = 4; let direcAtivoId = null; let blocosExpandidos = new Set(); // ===================== EDITAL ===================== function parseLinhaCSV(linha, delim){ const out=[]; let cur=''; let dentroAspas=false; for(let i=0;is.trim()); } function parseEditalCSV(texto){ const linhas = texto.split('\n').map(l=>l.replace(/\r$/,'')).filter(l=>l.trim()); if(linhas.length===0) return []; const header = parseLinhaCSV(linhas[0], ';').map(h=>h.toLowerCase()); const start = header[0]==='materia' ? 1 : 0; const topicos = []; for(let i=start;ib.etapa===4).length; return Math.min(100, Math.round((feitos/direc.metaBlocos)*100)); } // ===== Perfil ===== function renderPerfil(){ const atual = direcionamentos.find(d=>d.status==='atual'); document.getElementById('pPct').innerHTML = pctOf(atual)+'%'; const todosFeitos = direcionamentos.flatMap(d=>d.blocos).filter(b=>b.etapa===4); document.getElementById('pTotalBlocos').textContent = todosFeitos.length; const media = todosFeitos.length ? Math.round(todosFeitos.reduce((s,b)=>s+b.acertos,0)/todosFeitos.length*10) : 0; document.getElementById('pAprov').innerHTML = todosFeitos.length ? media+'%' : '—'; document.getElementById('pHoras').textContent = horasSemanais+'h / semana'; } // ===== Direcionamentos list ===== function renderDirecList(){ // hero metrics document.getElementById('heroSemanas').textContent = direcionamentos.length; const todosFeitos = direcionamentos.flatMap(d=>d.blocos).filter(b=>b.etapa===4); document.getElementById('heroBlocos').textContent = todosFeitos.length; const mediaGeral = todosFeitos.length ? Math.round(todosFeitos.reduce((s,b)=>s+b.acertos,0)/todosFeitos.length*10) : 0; document.getElementById('heroAprov').textContent = todosFeitos.length ? mediaGeral+'%' : '—'; const list = document.getElementById('direcList'); list.innerHTML=''; const R = 26, C = 2*Math.PI*R; direcionamentos.forEach(d=>{ const feitos = d.blocos.filter(b=>b.etapa===4); const pct = pctOf(d); const offset = C - (C*pct/100); const aprov = feitos.length ? Math.round(feitos.reduce((s,b)=>s+b.acertos,0)/feitos.length*10) : null; const disciplinas = [...new Set(d.blocos.map(b=>b.disciplina))]; const div = document.createElement('div'); div.className='direc-card '+d.status; div.innerHTML = `
${pct}%
Direcionamento ${d.numero} ${d.status==='atual'?'Em andamento':'Encerrado'}
${d.carreira}
${d.periodo} · ${feitos.length} de ${d.metaBlocos} blocos concluídos
${aprov!==null ? `${aprov}% de acerto` : 'sem dados'}
`; div.onclick = ()=> openDirecionamento(d.id); list.appendChild(div); }); } function openDirecionamento(id){ direcAtivoId = id; document.querySelectorAll('#navAluno button').forEach(b=>b.classList.remove('active')); document.querySelectorAll('#mainAluno > section').forEach(s=>s.style.display='none'); document.getElementById('tab-blocos').style.display='block'; renderBlocos(); } document.getElementById('voltarDirecBtn').onclick = ()=>{ document.getElementById('tab-blocos').style.display='none'; document.getElementById('tab-direcionamentos').style.display='block'; document.querySelector('#navAluno button[data-tab="direcionamentos"]').classList.add('active'); }; function renderBlocos(){ const direc = direcionamentos.find(d=>d.id===direcAtivoId); document.getElementById('blocosPeriodoTitulo').textContent = 'Direcionamento '+direc.numero+' · '+direc.periodo; document.getElementById('contadorBlocos').textContent = `${direc.blocos.length} blocos · meta de ${direc.metaBlocos} na semana`; const pct = pctOf(direc); document.getElementById('progressoBar').style.width = pct+'%'; document.getElementById('progressoPctTxt').textContent = pct+'%'; const list = document.getElementById('blocoList'); list.innerHTML = ''; if(direc.blocos.length===0){ list.innerHTML = `
Nenhum bloco aindaSeu mentor ainda não importou os blocos desta semana.
`; return; } direc.blocos.forEach(b=>{ const statusKey = b.etapa===4 ? 'feito' : b.etapa>0 ? 'andamento' : b.preAgendado ? 'planejado' : 'pendente'; const statusTxt = {feito:'Feito', andamento:'Em andamento', planejado:'Pré-agendado', pendente:'Pendente'}[statusKey]; const expanded = blocosExpandidos.has(b.codigo+direc.id); const div = document.createElement('div'); div.className = 'bloco' + (expanded ? ' expanded' : ''); div.innerHTML = `
Bloco ${b.codigo}
${b.disciplina}
10 questões · ~30min ${b.prints ? `· ${b.prints} print${b.prints>1?'s':''}` : ''}
${b.acertos!==null ? `
${b.acertos}/10
` : ''}
${statusTxt}
${expanded ? renderEtapas(b, direc.id) : ''} `; list.appendChild(div); }); } function nodeClass(passo, etapaAtual){ if(etapaAtual >= passo) return 'done'; if(etapaAtual === passo-1) return 'active'; return ''; } function renderEtapas(b, direcId){ const e = b.etapa; const check = ``; const trophy = ``; let action = ''; if(e===0){ action = `
`; } else if(e===1){ const boxes = Array.from({length:11},(_,i)=>i).map(n=>`
${n}
`).join(''); action = `
Quantas das 10 questões você acertou?
${boxes}
`; } else if(e===2){ action = `
Arraste os prints aqui ou clique para selecionar
Já ficam marcados como ${b.disciplina} — sem precisar escolher matéria
`; } else if(e===3){ action = `
`; } else { action = `
${trophy} Bloco concluído
`; } return `
${e>=1?check:'1'}
Iniciar bloco
${e>=2?check:'2'}
Percentual de acertos
${e>=3?check:'3'}
Adicionar prints
${e>=4?check:trophy}
Finalizar
${action}
`; } document.getElementById('blocoList').addEventListener('click', (e)=>{ const toggle = e.target.closest('[data-toggle]'); const btn = e.target.closest('[data-action]'); const direc = direcionamentos.find(d=>d.id===direcAtivoId); if(btn){ const codigo = btn.dataset.codigo, action = btn.dataset.action; const bloco = direc.blocos.find(b=>b.codigo===codigo); if(action==='iniciar'){ window.open(bloco.link,'_blank'); bloco.etapa = 1; renderBlocos(); } if(action==='salvar-acertos'){ bloco.acertos = parseInt(btn.dataset.val); bloco.etapa = 2; renderBlocos(); renderPerfil(); } if(action==='abrir-prints'){ document.getElementById('fileInput-'+codigo).click(); } if(action==='finalizar'){ bloco.etapa = 4; renderBlocos(); renderPerfil(); } return; } if(toggle){ const key = toggle.dataset.toggle + direc.id; if(blocosExpandidos.has(key)) blocosExpandidos.delete(key); else blocosExpandidos.add(key); renderBlocos(); } }); // drag & drop + seleção de arquivos para prints (delegação, já que os blocos são re-renderizados) document.getElementById('blocoList').addEventListener('change', (e)=>{ if(e.target.matches('input[type=file]')){ const codigo = e.target.id.replace('fileInput-',''); if(e.target.files.length) abrirModalPrints(codigo, Array.from(e.target.files)); } }); document.getElementById('blocoList').addEventListener('dragover', (e)=>{ const dz = e.target.closest('.dropzone'); if(dz){ e.preventDefault(); dz.classList.add('dragover'); } }); document.getElementById('blocoList').addEventListener('dragleave', (e)=>{ const dz = e.target.closest('.dropzone'); if(dz) dz.classList.remove('dragover'); }); document.getElementById('blocoList').addEventListener('drop', (e)=>{ const dz = e.target.closest('.dropzone'); if(dz){ e.preventDefault(); dz.classList.remove('dragover'); const codigo = dz.dataset.codigo; if(e.dataTransfer.files.length) abrirModalPrints(codigo, Array.from(e.dataTransfer.files)); } }); let printsModalCodigo = null; function abrirModalPrints(codigo, files){ printsModalCodigo = codigo; const body = document.getElementById('printsModalBody'); body.innerHTML = files.map((f,i)=>` `).join(''); document.getElementById('printsModalCount').textContent = files.length+(files.length>1?' prints selecionados — confira a pré-visualização antes de marcar a tag':' print selecionado — confira a pré-visualização antes de marcar a tag'); document.getElementById('printsModalOverlay').style.display = 'flex'; // gera a pré-visualização real de cada imagem files.forEach((f,i)=>{ const reader = new FileReader(); reader.onload = (ev)=>{ const t = document.getElementById('thumb-'+i); if(t) t.innerHTML = `${f.name}`; }; if(f.type && f.type.startsWith('image/')) reader.readAsDataURL(f); else { const t = document.getElementById('thumb-'+i); if(t) t.textContent='ARQ'; } }); } document.getElementById('printsModalCancelar').onclick = ()=>{ document.getElementById('printsModalOverlay').style.display='none'; }; document.getElementById('printsModalConfirmar').onclick = ()=>{ const direc = direcionamentos.find(d=>d.id===direcAtivoId); const bloco = direc.blocos.find(b=>b.codigo===printsModalCodigo); const qtd = document.querySelectorAll('#printsModalBody .print-row').length; bloco.prints = (bloco.prints||0) + qtd; bloco.etapa = 3; document.getElementById('printsModalOverlay').style.display='none'; renderBlocos(); renderPerfil(); }; document.getElementById('recalcularBtn').onclick = ()=>{ horasSemanais = parseFloat(document.getElementById('horasInput').value)||20; renderPerfil(); }; // ===== Iniciar dia de estudos ===== let diaEtapa = 1; document.getElementById('iniciarDiaBtn').onclick = ()=>{ diaEtapa = 1; renderDiaModal(); document.getElementById('diaModalOverlay').style.display = 'flex'; }; document.getElementById('diaModalFechar').onclick = ()=> document.getElementById('diaModalOverlay').style.display='none'; function renderDiaModal(){ const direc = direcionamentos.find(d=>d.status==='atual'); const printsPendentes = []; direc.blocos.forEach(b=>{ for(let i=0;i<(b.prints||0);i++) printsPendentes.push({disciplina:b.disciplina, n:i+1}); }); document.getElementById('diaStep1').className = 'dia-step'; document.getElementById('diaStep2').className = 'dia-step' + (diaEtapa<2 ? ' locked' : ''); document.getElementById('diaCheck1').className = 'dia-step-num' + (diaEtapa>1 ? ' done' : ''); document.getElementById('diaCheck2').className = 'dia-step-num' + (diaEtapa>2 ? ' done' : ''); // etapa 1: revisar prints const body1 = document.getElementById('diaBody1'); if(printsPendentes.length===0){ body1.innerHTML = `
Nenhum print novo para revisar hoje.
`; } else { body1.innerHTML = printsPendentes.map((p,i)=>`
Print ${p.n} · ${p.disciplina}
Adicionado no direcionamento atual
`).join('') + ``; } const btn1 = document.getElementById('diaAvancar1'); if(btn1) btn1.onclick = ()=>{ diaEtapa = 2; renderDiaModal(); }; // etapa 2: iniciar blocos pré-agendados const body2 = document.getElementById('diaBody2'); const preAgendados = direc.blocos.filter(b=>b.preAgendado && b.etapa===0); if(diaEtapa<2){ body2.innerHTML = ''; } else if(preAgendados.length===0){ body2.innerHTML = `
Nenhum bloco pré-agendado para hoje.
`; } else { body2.innerHTML = preAgendados.map(b=>`
${b.codigo}${b.disciplina}
`).join(''); } } document.getElementById('diaModalOverlay').addEventListener('click', (e)=>{ const btn = e.target.closest('[data-action="ir-bloco"]'); if(!btn) return; const direc = direcionamentos.find(d=>d.status==='atual'); const bloco = direc.blocos.find(b=>b.codigo===btn.dataset.codigo); bloco.etapa = 1; if(bloco.link) window.open(bloco.link,'_blank'); document.getElementById('diaModalOverlay').style.display='none'; direcAtivoId = direc.id; blocosExpandidos.add(bloco.codigo+direc.id); document.querySelectorAll('#navAluno button').forEach(b2=>b2.classList.remove('active')); document.querySelectorAll('#mainAluno > section').forEach(s=>s.style.display='none'); document.getElementById('tab-blocos').style.display='block'; renderBlocos(); }); // ===== Nav tabs (aluno) ===== document.querySelectorAll('#navAluno button[data-tab]').forEach(btn=>{ btn.addEventListener('click', ()=>{ document.querySelectorAll('#navAluno button').forEach(b=>b.classList.remove('active')); btn.classList.add('active'); document.querySelectorAll('#mainAluno > section').forEach(s=>s.style.display='none'); document.getElementById('tab-'+btn.dataset.tab).style.display='block'; }); }); // ===== Role toggle ===== // ===================== EDITAL: ALUNO ===================== function renderEditalAluno(){ const ALUNO_IDX = 0; // Victor Andrade — usuário logado const vinculados = []; editais.forEach(ed=>{ const v = ed.vinculos.find(v=>v.alunoIdx===ALUNO_IDX); if(v) vinculados.push({edital:ed, vinculo:v}); }); const conteudo = document.getElementById('editalConteudo'); if(vinculados.length===0){ document.getElementById('editalSubtitulo').textContent = 'Seu mentor ainda não vinculou um edital à sua conta'; conteudo.innerHTML = `
Nenhum edital vinculadoQuando seu mentor importar o conteúdo programático do seu concurso, ele aparece aqui.
`; return; } conteudo.innerHTML = vinculados.map(({edital, vinculo}, idx)=>{ const total = vinculo.progresso.length; const vistos = vinculo.progresso.filter(p=>p.frequencia>0).length; const pct = Math.round((vistos/total)*100); const totalQuestoes = vinculo.progresso.reduce((s,p)=>s+p.frequencia,0); const porMateria = {}; vinculo.progresso.forEach(p=>{ (porMateria[p.materia] = porMateria[p.materia]||[]).push(p); }); const linhasTabela = Object.keys(porMateria).map(materia=>{ const linhas = porMateria[materia].map(p=>` ${p.assunto} ${p.frequencia>0 ? `Visto` : 'Não visto'} ${p.frequencia} questõe${p.frequencia===1?'':'s'} `).join(''); return `${materia}${linhas}`; }).join(''); return `

${edital.concurso}

${edital.cargo ? edital.cargo+' · ' : ''}${edital.banca ? 'Banca '+edital.banca : ''}
Cobertura do edital
${pct}%
Assuntos vistos
${vistos}/ ${total}
Questões feitas (total)
${totalQuestoes}
Data da prova
${edital.dataProva || 'a definir'}
${linhasTabela}
AssuntoStatusFrequência
`; }).join(''); document.getElementById('editalSubtitulo').textContent = vinculados.length+' edital'+(vinculados.length>1?'is':'')+' vinculado'+(vinculados.length>1?'s':'')+' à sua conta'; } // chama renderEditalAluno toda vez que a aba Edital é aberta document.querySelector('#navAluno button[data-tab="edital"]').addEventListener('click', renderEditalAluno); // ===================== PRINTS ===================== let printsAluno = [ {id:'p1', materia:'Direito Constitucional', tag:'Controle de constitucionalidade — diferença ADI x ADC', data:'2026-06-16', publico:true, img:null, cor:'#0B6E4F'}, {id:'p2', materia:'Direito Administrativo', tag:'Atributos do ato administrativo (presunção de legitimidade)', data:'2026-06-17', publico:false, img:null, cor:'#15B981'}, {id:'p3', materia:'Direito Penal', tag:'Diferença entre crime omissivo próprio e impróprio', data:'2026-06-18', publico:true, img:null, cor:'#C98A3A'}, {id:'p4', materia:'Direito Constitucional', tag:'Súmula vinculante — quem pode propor', data:'2026-06-20', publico:false, img:null, cor:'#0B6E4F'}, ]; let printIdCounter = 5; const feedPrints = [ {id:'f1', autor:'Marina Souza', materia:'Processo Civil', tag:'Prazo em dobro — quando se aplica', data:'2026-06-19', cor:'#2563A8'}, {id:'f2', autor:'Rafael Lima', materia:'Direito Penal', tag:'Crimes contra a Administração — peculato x concussão', data:'2026-06-19', cor:'#C98A3A'}, {id:'f3', autor:'Marina Souza', materia:'Direito Constitucional', tag:'Cláusulas pétreas — rol exemplificativo', data:'2026-06-20', cor:'#0B6E4F'}, ]; let printsViewAtual = 'meus'; let printsFiltroMateria = 'todas'; let uploadPrintsArquivos = []; function renderPrintsChips(){ const materias = [...new Set(printsAluno.map(p=>p.materia))]; const chipsWrap = document.getElementById('printsChips'); const todasChip = `
Todas
`; chipsWrap.innerHTML = todasChip + materias.map(m=>`
${m}
`).join(''); } document.getElementById('printsChips').addEventListener('click', (e)=>{ const chip = e.target.closest('.p-chip'); if(!chip) return; printsFiltroMateria = chip.dataset.materia; renderPrintsChips(); renderPrintsView(); }); document.querySelectorAll('.prints-subnav button').forEach(btn=>{ btn.addEventListener('click', ()=>{ document.querySelectorAll('.prints-subnav button').forEach(b=>b.classList.remove('active')); btn.classList.add('active'); printsViewAtual = btn.dataset.pview; document.getElementById('abrirUploadPrintsBtn').style.display = printsViewAtual==='meus' ? 'inline-flex' : 'none'; renderPrintsChips(); renderPrintsView(); }); }); document.getElementById('printsOrdem').addEventListener('change', renderPrintsView); function thumbHtml(p){ return p.img ? `print` : `
${p.materia}
`; } function renderPrintsView(){ const wrap = document.getElementById('printsView'); const ordem = document.getElementById('printsOrdem').value; if(printsViewAtual==='meus'){ let lista = printsAluno.filter(p=> printsFiltroMateria==='todas' || p.materia===printsFiltroMateria); lista = lista.slice().sort((a,b)=> ordem==='antigos' ? a.data.localeCompare(b.data) : b.data.localeCompare(a.data)); if(lista.length===0){ wrap.innerHTML = `
Nenhum print por aqui aindaAdicione prints direto aqui ou durante a resolução de um bloco.
`; return; } wrap.innerHTML = `
${lista.map(p=>` `).join('')}
`; } else { let lista = feedPrints.filter(p=> printsFiltroMateria==='todas' || p.materia===printsFiltroMateria); lista = lista.slice().sort((a,b)=> ordem==='antigos' ? a.data.localeCompare(b.data) : b.data.localeCompare(a.data)); wrap.innerHTML = `
${lista.map(p=>` `).join('')}
`; } } function formatarDataBR(iso){ const [y,m,d] = iso.split('-'); return `${d}/${m}`; } document.getElementById('printsView').addEventListener('change', (e)=>{ const chk = e.target.closest('[data-print-publico]'); if(!chk) return; const print = printsAluno.find(p=>p.id===chk.dataset.printPublico); print.publico = chk.checked; }); document.getElementById('printsView').addEventListener('click', (e)=>{ const btn = e.target.closest('[data-compartilhar]'); if(!btn) return; const original = feedPrints.find(p=>p.id===btn.dataset.compartilhar); printsAluno.unshift({ id:'p'+(printIdCounter++), materia:original.materia, tag: original.tag+' (compartilhado por '+original.autor+')', data: new Date().toISOString().slice(0,10), publico:false, img:null, cor:original.cor }); btn.textContent = 'Adicionado à sua pasta ✓'; btn.disabled = true; }); // ----- upload geral de prints ----- document.getElementById('abrirUploadPrintsBtn').onclick = ()=>{ uploadPrintsArquivos = []; document.getElementById('uploadPrintsBody').innerHTML = ''; document.getElementById('uploadPrintsConfirmar').style.display = 'none'; document.getElementById('uploadPrintsModalOverlay').style.display = 'flex'; }; document.getElementById('uploadPrintsCancelar').onclick = ()=> document.getElementById('uploadPrintsModalOverlay').style.display='none'; document.getElementById('uploadPrintsDropzone').onclick = ()=> document.getElementById('uploadPrintsFileInput').click(); document.getElementById('uploadPrintsFileInput').onchange = (e)=>{ if(e.target.files.length) montarLinhasUpload(Array.from(e.target.files)); }; document.getElementById('uploadPrintsDropzone').addEventListener('dragover', (e)=>{ e.preventDefault(); e.currentTarget.classList.add('dragover'); }); document.getElementById('uploadPrintsDropzone').addEventListener('dragleave', (e)=> e.currentTarget.classList.remove('dragover')); document.getElementById('uploadPrintsDropzone').addEventListener('drop', (e)=>{ e.preventDefault(); e.currentTarget.classList.remove('dragover'); if(e.dataTransfer.files.length) montarLinhasUpload(Array.from(e.dataTransfer.files)); }); const MATERIAS_PADRAO = ['Direito Constitucional','Direito Administrativo','Direito Penal','Processo Civil','Processo Penal','Administração Geral e Pública']; function montarLinhasUpload(files){ uploadPrintsArquivos = files; const body = document.getElementById('uploadPrintsBody'); body.innerHTML = files.map((f,i)=>` `).join(''); document.getElementById('uploadPrintsConfirmar').style.display = 'inline-flex'; files.forEach((f,i)=>{ const reader = new FileReader(); reader.onload = (ev)=>{ const t = document.getElementById('uthumb-'+i); if(t) t.innerHTML = `${f.name}`; }; if(f.type && f.type.startsWith('image/')) reader.readAsDataURL(f); }); } document.getElementById('uploadPrintsConfirmar').onclick = ()=>{ uploadPrintsArquivos.forEach((f,i)=>{ const materia = document.getElementById('umateria-'+i).value; const tag = document.getElementById('utag-'+i).value || 'Sem tag'; const thumbImg = document.getElementById('uthumb-'+i).querySelector('img'); printsAluno.unshift({ id:'p'+(printIdCounter++), materia, tag, data: new Date().toISOString().slice(0,10), publico:false, img: thumbImg ? thumbImg.src : null, cor:'#0B6E4F' }); }); document.getElementById('uploadPrintsModalOverlay').style.display='none'; renderPrintsChips(); renderPrintsView(); }; document.querySelector('#navAluno button[data-tab="prints"]').addEventListener('click', ()=>{ renderPrintsChips(); renderPrintsView(); }); renderPerfil(); renderDirecList(); // ===================== SUPABASE AUTH ===================== const _supabase = supabase.createClient( 'https://agxamsmyztmyesctiqkm.supabase.co', // ← cole sua Project URL aqui 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImFneGFtc215enRteWVzY3RpcWttIiwicm9sZSI6ImFub24iLCJpYXQiOjE3ODM1MzA0NTAsImV4cCI6MjA5OTEwNjQ1MH0.pZ7vmOZkY-be9L3w1i6nPSnWzWnwEzLtFU1-ysrdhRM' // ← cole sua anon/public key aqui ); function mostrarErro(msg){ const el = document.getElementById('loginError'); el.textContent = msg; el.style.display = 'block'; } function entrarNoApp(email){ document.getElementById('loginScreen').style.display = 'none'; document.getElementById('appShell').style.display = 'block'; document.getElementById('userEmailLabel').textContent = email; } // Verifica sessão ativa ao carregar a página _supabase.auth.getSession().then(async ({ data: { session } }) => { if (!session) return; // fica na tela de login const { data: perfil } = await _supabase .from('perfis') .select('role') .eq('id', session.user.id) .single(); if (perfil?.role === 'mentor') { window.location.href = '/admin.html'; } else { entrarNoApp(session.user.email); } }); // Login e-mail/senha document.getElementById('loginBtn').onclick = async () => { const email = document.getElementById('loginEmail').value.trim(); const senha = document.getElementById('loginPassword').value.trim(); if (!email || !senha) { mostrarErro('Preencha e-mail e senha.'); return; } document.getElementById('loginError').style.display = 'none'; const btn = document.getElementById('loginBtn'); btn.textContent = 'Entrando...'; btn.disabled = true; const { data, error } = await _supabase.auth.signInWithPassword({ email, password: senha }); btn.textContent = 'Entrar'; btn.disabled = false; if (error) { mostrarErro(error.message); return; } // checa role: mentor vai para /admin const { data: perfil } = await _supabase .from('perfis') .select('role') .eq('id', data.user.id) .single(); if (perfil?.role === 'mentor') { window.location.href = '/admin.html'; } else { entrarNoApp(data.user.email); } }; // Logout document.getElementById('logoutBtn').onclick = async () => { await _supabase.auth.signOut(); document.getElementById('appShell').style.display = 'none'; document.getElementById('loginScreen').style.display = 'flex'; };