All checks were successful
Testar e publicar imagem Docker / publish (push) Successful in 17s
34 lines
4.3 KiB
JavaScript
34 lines
4.3 KiB
JavaScript
const app = document.querySelector('#app');
|
|
const errors = { denied: 'Esta conta não está autorizada a entrar no painel.', authentication: 'O login expirou ou foi cancelado. Tenta novamente.', configuration: 'Falta configurar o Discord e o ID numérico do dono no Docker.' };
|
|
async function boot() {
|
|
const response = await fetch('/api/me');
|
|
if (!response.ok) throw new Error();
|
|
const { user, configured } = await response.json();
|
|
if (!user) {
|
|
app.innerHTML = `<section class="login"><div class="login-card"><img class="logo" src="/logo.png" alt="XanaX"><h1>O teu centro de bots.</h1><p>Configura, acompanha e organiza as automações do teu TeamSpeak num só lugar.</p><div id="notice"></div><a class="button" href="/auth/discord">Entrar com Discord →</a><p class="muted">Acesso reservado · TS6 Botflow</p></div></section>`;
|
|
const message = errors[new URLSearchParams(location.search).get('error')] || (!configured && errors.configuration);
|
|
if (message) { const notice = document.querySelector('#notice'); notice.className = 'notice'; notice.textContent = message; }
|
|
return;
|
|
}
|
|
const data = await fetch('/api/dashboard'); if (!data.ok) throw new Error();
|
|
const dashboard = await data.json();
|
|
app.innerHTML = `<div class="shell"><aside class="sidebar"><img class="logo" src="/logo.png" alt="XanaX"><div class="eyebrow">Botflow</div><nav><button class="nav active" data-page="dashboard">◈ Dashboard</button><button class="nav" data-page="bots">◇ Bots e flows</button><button class="nav" data-page="access">♙ Acesso</button></nav></aside><section class="workspace"><header class="topbar"><span>TS6 Botflow <span class="badge">Local</span></span><span><span id="username"></span> <button class="quiet" id="logout">Sair</button></span></header><div id="content"></div><footer class="footer">XanaX · O teu centro de automações</footer></section></div>`;
|
|
document.querySelector('#username').textContent = user.name;
|
|
const content = document.querySelector('#content');
|
|
function page(name) {
|
|
document.querySelectorAll('.nav').forEach(b => b.classList.toggle('active', b.dataset.page === name));
|
|
if (name === 'access') {
|
|
content.innerHTML = '<h1 class="title">Acesso ao painel</h1><p>A tua conta está autorizada a entrar no painel.</p><div class="card details"><div><span>Perfil</span><strong id="profile-role"></strong></div><div><span>ID Discord</span><strong id="discord-id"></strong></div><div><span>Novos utilizadores</span><strong>Sem acesso</strong></div></div>';
|
|
document.querySelector('#discord-id').textContent = user.id;
|
|
document.querySelector('#profile-role').textContent = user.role; return;
|
|
}
|
|
if (name === 'bots') { content.innerHTML = '<h1 class="title">Bots e flows</h1><p>A primeira experiência valida o painel e o acesso.</p><div class="card empty"><span class="empty-symbol">◇</span>Ainda não existem bots.<p>O editor de flows e a ligação ao TeamSpeak serão a próxima etapa.</p></div>'; return; }
|
|
content.innerHTML = `<h1 class="title">Dashboard</h1><p>Bem-vindo ao teu centro de automações.</p><div class="stats">${[['Bots',dashboard.bots.length],['Flows',dashboard.flows.length],['Execuções',dashboard.executions.length],['Servidores',dashboard.connections.length]].map(([label,value])=>`<div class="card"><span>${label}</span><strong class="stat-value">${value}</strong></div>`).join('')}</div><div class="split"><div class="card"><h2>Atividade recente</h2><div class="empty"><span class="empty-symbol">◷</span>Ainda sem execuções.<p>A atividade dos bots aparecerá aqui.</p></div></div><div class="card"><h2>O teu espaço</h2><div class="details"><div><span>Acesso</span><span class="badge" id="dashboard-role"></span></div><div><span>Autenticação</span><strong>Discord</strong></div><div><span>Ligação TeamSpeak</span><strong>Por configurar</strong></div></div><p>Começamos por testar o login. Depois ligamos os bots e construímos os flows.</p></div></div>`;
|
|
document.querySelector('#dashboard-role').textContent = user.role;
|
|
}
|
|
document.querySelectorAll('.nav').forEach(b => b.onclick = () => page(b.dataset.page));
|
|
document.querySelector('#logout').onclick = async () => { const r = await fetch('/auth/logout', { method: 'POST' }); if (r.ok) location.assign('/'); };
|
|
page('dashboard');
|
|
}
|
|
boot().catch(() => { app.textContent = 'Não foi possível carregar o painel. Atualiza a página para tentar novamente.'; });
|