feat(auth): wiki/activity access flags, SESSION_DOMAIN, wiki nav link

This commit is contained in:
Davide Scaini
2026-05-01 21:56:02 +02:00
parent f6e9fe8198
commit 82288a35ea
5 changed files with 161 additions and 59 deletions
+12 -1
View File
@@ -9,7 +9,8 @@ interface Props {
public?: boolean;
}
const { title = 'BincioActivity', description = 'Your personal activity stats', public: isPublicPage = false } = Astro.props;
const editUrl = import.meta.env.PUBLIC_EDIT_URL ?? '';
const editUrl = import.meta.env.PUBLIC_EDIT_URL ?? '';
const wikiUrl = import.meta.env.PUBLIC_WIKI_URL ?? '';
// Edit UI is enabled when PUBLIC_EDIT_URL is set (single-user bincio-edit mode)
// OR when PUBLIC_EDIT_ENABLED=true (multi-user VPS mode — API proxied at /api/).
const editEnabled = editUrl !== '' || import.meta.env.PUBLIC_EDIT_ENABLED === 'true';
@@ -217,6 +218,10 @@ try {
<a href={`${baseUrl}convert/`} class="text-sm text-zinc-400 hover:text-white transition-colors shrink-0">Convert</a>
)}
<a id="nav-about" href={`${baseUrl}about/`} class="text-sm text-zinc-400 hover:text-white transition-colors shrink-0">About</a>
{wikiUrl && (
<a id="nav-wiki" href={wikiUrl} style="display:none"
class="text-sm text-zinc-400 hover:text-white transition-colors shrink-0">Wiki</a>
)}
</div>
)}
@@ -561,6 +566,12 @@ try {
}
} catch (_) {}
// Wiki link: show only for users who have wiki access
if (user.wiki_access) {
const wikiEl = document.getElementById('nav-wiki');
if (wikiEl) wikiEl.style.display = '';
}
// Admin: show admin link and poll for active jobs
if (user.is_admin) {
const adminLink = document.getElementById('nav-admin');
+14 -7
View File
@@ -1,6 +1,7 @@
---
import Base from '../../layouts/Base.astro';
const editUrl = import.meta.env.PUBLIC_EDIT_URL ?? '';
const editUrl = import.meta.env.PUBLIC_EDIT_URL ?? '';
const wikiUrl = import.meta.env.PUBLIC_WIKI_URL ?? '';
---
<Base title="Login — BincioActivity" public={true}>
<div class="max-w-sm mx-auto mt-16 px-4">
@@ -9,7 +10,7 @@ const editUrl = import.meta.env.PUBLIC_EDIT_URL ?? '';
</p>
<h1 class="text-2xl font-bold text-white mb-6 text-center">Sign in</h1>
<form id="login-form" class="space-y-4">
<form id="login-form" data-wiki-url={wikiUrl} class="space-y-4">
<div>
<label class="block text-sm text-zinc-400 mb-1" for="handle">Handle</label>
<input id="handle" name="handle" type="text" autocomplete="username"
@@ -41,14 +42,14 @@ const editUrl = import.meta.env.PUBLIC_EDIT_URL ?? '';
</Base>
<script>
const editUrl = import.meta.env.PUBLIC_EDIT_URL ?? (document.getElementById('login-form')?.dataset.editUrl ?? '');
const form = document.getElementById('login-form') as HTMLFormElement;
const errEl = document.getElementById('login-error') as HTMLElement;
const wikiUrl = form?.dataset.wikiUrl ?? '';
document.getElementById('login-form')?.addEventListener('submit', async (e) => {
form?.addEventListener('submit', async (e) => {
e.preventDefault();
const form = e.target as HTMLFormElement;
const handle = (form.querySelector('#handle') as HTMLInputElement).value.trim();
const handle = (form.querySelector('#handle') as HTMLInputElement).value.trim();
const password = (form.querySelector('#password') as HTMLInputElement).value;
const errEl = document.getElementById('login-error')!;
errEl.classList.add('hidden');
try {
@@ -64,6 +65,12 @@ const editUrl = import.meta.env.PUBLIC_EDIT_URL ?? '';
errEl.classList.remove('hidden');
return;
}
const data = await r.json();
// Wiki-only users have no activity access — send them straight to the wiki.
if (!data.activity_access && data.wiki_access && wikiUrl) {
window.location.href = wikiUrl;
return;
}
const next = new URLSearchParams(window.location.search).get('next') ?? '/';
window.location.href = next;
} catch {