- Neues Setting chatUsageBadge (default: false) blendet Usage-Badge im Chat ein/aus - Dashboard-Links durch 3-Dot-Header-Menü ersetzt (einheitlich mit Chat) - Admin-Items über admin-only Attribut gesteuert, dashboard-links CSS entfernt Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
106 lines
2.6 KiB
JavaScript
106 lines
2.6 KiB
JavaScript
// ── Global State ──
|
||
var currentUser = null;
|
||
var currentSettings = null;
|
||
|
||
const SETTINGS_DEFAULTS = {
|
||
pageWidth: 900,
|
||
toolCallDisplay: 'modifications',
|
||
chainMetaDisplay: 'sometimes',
|
||
showDeletedMessages: false,
|
||
chatUsageBadge: false
|
||
};
|
||
|
||
function loadSettings() {
|
||
return Object.assign({}, SETTINGS_DEFAULTS, currentSettings);
|
||
}
|
||
|
||
async function saveSettings(settings) {
|
||
currentSettings = settings;
|
||
applySettings();
|
||
try { await apiSaveSettings(settings); } catch (_) {}
|
||
}
|
||
|
||
function applySettings() {
|
||
var s = loadSettings();
|
||
document.documentElement.style.setProperty('--page-width', s.pageWidth + 'px');
|
||
}
|
||
|
||
// ── App Init ──
|
||
|
||
document.addEventListener('DOMContentLoaded', async () => {
|
||
// Auth-Check: Eingeloggt?
|
||
const { page, id } = parseHash();
|
||
|
||
// Shared-Page braucht kein Login
|
||
if (page === 'shared') {
|
||
await navigateTo('shared', { id }, { replace: true });
|
||
return;
|
||
}
|
||
|
||
var user = await apiMe();
|
||
if (!user) {
|
||
await navigateTo('login', {}, { replace: true });
|
||
return;
|
||
}
|
||
|
||
currentUser = user;
|
||
currentSettings = await apiGetSettings();
|
||
applySettings();
|
||
loadClaudeStatus();
|
||
|
||
var target = page === 'login' ? 'dashboard' : page;
|
||
await navigateTo(target, { id }, { replace: true });
|
||
});
|
||
|
||
async function loadClaudeStatus() {
|
||
const statusBar = document.getElementById('claudeStatusBar');
|
||
if (!statusBar) return;
|
||
|
||
// Schließen-Button
|
||
const closeBtn = statusBar.querySelector('.status-close');
|
||
if (closeBtn) {
|
||
closeBtn.addEventListener('click', () => { statusBar.hidden = true; });
|
||
}
|
||
|
||
try {
|
||
const res = await fetch('https://status.claude.com/api/v2/status.json');
|
||
if (!res.ok) return;
|
||
const data = await res.json();
|
||
|
||
const indicator = data.status?.indicator || 'none';
|
||
const description = data.status?.description || '';
|
||
|
||
if (indicator === 'none') return;
|
||
|
||
statusBar.classList.add(`status-${indicator}`);
|
||
statusBar.querySelector('.status-text').textContent = description;
|
||
statusBar.hidden = false;
|
||
} catch {
|
||
// Status-Abruf fehlgeschlagen – still ignorieren
|
||
}
|
||
}
|
||
|
||
// Browser Zurück/Vor-Button
|
||
window.addEventListener('popstate', async (e) => {
|
||
var page, id;
|
||
if (e.state && e.state.page) {
|
||
page = e.state.page;
|
||
id = e.state.params ? e.state.params.id : null;
|
||
} else {
|
||
const parsed = parseHash();
|
||
page = parsed.page;
|
||
id = parsed.id;
|
||
}
|
||
|
||
// Login- und Shared-Seite immer erlauben, alles andere nur wenn eingeloggt
|
||
if (page !== 'login' && page !== 'shared') {
|
||
var user = await apiMe();
|
||
if (!user) {
|
||
await navigateTo('login', {}, { replace: true });
|
||
return;
|
||
}
|
||
}
|
||
|
||
await navigateTo(page, { id }, { replace: true });
|
||
});
|