feat: welcome_version=2 — Polish-Refresh sichtbar für returning users

This commit is contained in:
Präzisionskatze 2026-04-29 04:51:28 +02:00
parent 25bb61feaf
commit 90220ff525
3 changed files with 17 additions and 7 deletions

View file

@ -9,7 +9,8 @@ meta_description: "Ava — Awareness- und Club-Manager-Coach. Policy, Incident-R
bot_key_var: __AVA_KEY__ bot_key_var: __AVA_KEY__
bot_key_value: qb_cbfx31vpj6z5 bot_key_value: qb_cbfx31vpj6z5
ls_prefix: ava ls_prefix: ava
bot_version: "2026-04-21" bot_version: "2026-04-29"
welcome_version: 2
# Color theme (Ava — purple) # Color theme (Ava — purple)
accent: "#7c3aed" accent: "#7c3aed"

View file

@ -53,6 +53,7 @@
flashCardsRated: s.flashCardsRated || 0, flashCardsRated: s.flashCardsRated || 0,
badges: s.badges || {}, badges: s.badges || {},
seenWelcome: s.seenWelcome || false, seenWelcome: s.seenWelcome || false,
seenWelcomeVersion: s.seenWelcomeVersion || 0,
completedCurricula: s.completedCurricula || [] completedCurricula: s.completedCurricula || []
}; };
} catch (e) { } catch (e) {
@ -62,10 +63,16 @@
quizStreak: 0, maxQuizStreak: 0, mastery: {}, quizStreak: 0, maxQuizStreak: 0, mastery: {},
moduleCorrect: {}, moduleTotal: {}, modulePassedFlash: {}, moduleCorrect: {}, moduleTotal: {}, modulePassedFlash: {},
completedQuizzes: 0, flashCardsRated: 0, completedQuizzes: 0, flashCardsRated: 0,
badges: {}, seenWelcome: false, completedCurricula: [] badges: {}, seenWelcome: false, seenWelcomeVersion: 0, completedCurricula: []
}; };
} }
} }
// Welcome-version bump: bump this number whenever a bot's welcome.html gets a
// non-trivial visual refresh, so returning users see the new intro once.
// Per-bot value injected at render time from config.yaml welcome_version
// (default 1). After dismiss, state.seenWelcomeVersion catches up.
const WELCOME_VERSION = Number(window.__WELCOME_VERSION__ || 1);
function saveState() { localStorage.setItem(LS_KEY, JSON.stringify(state)); } function saveState() { localStorage.setItem(LS_KEY, JSON.stringify(state)); }
function loadChatHistory() { function loadChatHistory() {
@ -369,7 +376,8 @@
} }
function renderWelcome() { function renderWelcome() {
if (state.xp === 0 && chatHistory.length === 0 && !state.seenWelcome) { const newWelcomeAvailable = (state.seenWelcomeVersion || 0) < WELCOME_VERSION;
if ((state.xp === 0 && chatHistory.length === 0 && !state.seenWelcome) || newWelcomeAvailable) {
$('#welcome-screen').classList.remove('hidden'); $('#welcome-screen').classList.remove('hidden');
$('#welcome-screen').setAttribute('aria-hidden', 'false'); $('#welcome-screen').setAttribute('aria-hidden', 'false');
} else { } else {
@ -391,6 +399,7 @@
if (!text.trim() && attaches.length === 0) return; if (!text.trim() && attaches.length === 0) return;
$('#welcome-screen').classList.add('hidden'); $('#welcome-screen').classList.add('hidden');
state.seenWelcome = true; state.seenWelcome = true;
state.seenWelcomeVersion = WELCOME_VERSION;
addMsg('user', text || '(nur Anhang)', { attachments: attaches }); addMsg('user', text || '(nur Anhang)', { attachments: attaches });
chatHistory.push({ chatHistory.push({
@ -1726,13 +1735,13 @@
// Welcome-card shortcuts // Welcome-card shortcuts
$$('[data-goto]').forEach(b => b.addEventListener('click', () => { $$('[data-goto]').forEach(b => b.addEventListener('click', () => {
state.seenWelcome = true; saveState(); state.seenWelcome = true; state.seenWelcomeVersion = WELCOME_VERSION; saveState();
switchMode(b.dataset.goto); switchMode(b.dataset.goto);
})); }));
// Welcome-card prompt-fillers (special *_REQUEST modes) // Welcome-card prompt-fillers (special *_REQUEST modes)
$$('[data-prompt]').forEach(b => b.addEventListener('click', () => { $$('[data-prompt]').forEach(b => b.addEventListener('click', () => {
state.seenWelcome = true; saveState(); state.seenWelcome = true; state.seenWelcomeVersion = WELCOME_VERSION; saveState();
switchMode('chat'); switchMode('chat');
const composer = $('#composer'); const composer = $('#composer');
if (composer) { if (composer) {
@ -1813,7 +1822,7 @@
// Update status once per min (visual cue) // Update status once per min (visual cue)
setInterval(() => { /* placeholder for future heartbeat */ }, 60000); setInterval(() => { /* placeholder for future heartbeat */ }, 60000);
console.log('Ava v2026-04-21 ready. XP:', state.xp, 'Streak:', state.currentStreak); console.log('Ava v2026-04-29 ready. XP:', state.xp, 'Streak:', state.currentStreak);
} }
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot); if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot);

View file

@ -7,7 +7,7 @@
<meta name="theme-color" content="#0a0a0f"> <meta name="theme-color" content="#0a0a0f">
<meta name="description" content="Ava — Awareness- und Club-Manager-Coach. Policy, Incident-Response, Haftung, Safer Spaces. Läuft im deutschen Bunker."> <meta name="description" content="Ava — Awareness- und Club-Manager-Coach. Policy, Incident-Response, Haftung, Safer Spaces. Läuft im deutschen Bunker.">
<link rel="stylesheet" href="styles.css"> <link rel="stylesheet" href="styles.css">
<script>window.__AVA_KEY__ = 'qb_cbfx31vpj6z5';</script> <script>window.__AVA_KEY__ = 'qb_cbfx31vpj6z5'; window.__WELCOME_VERSION__ = 2;</script>
</head> </head>
<body> <body>
<div class="app" role="application" aria-label="Ava Awareness-Coach"> <div class="app" role="application" aria-label="Ava Awareness-Coach">