- Neue Spalte 'settings' in users-Tabelle (Migration via TryAddColumn) - SettingsEndpoint: GET/PUT /api/settings - DatabaseService: GetUserSettings() + UpdateUserSettings() - Frontend: currentSettings als globaler State in app.js - settings-page.js: localStorage komplett entfernt, nutzt API - Settings werden beim App-Start aus DB geladen und angewendet
98 lines
2.5 KiB
JavaScript
98 lines
2.5 KiB
JavaScript
// ── Global State ──
|
||
var currentUser = null;
|
||
var currentSettings = null;
|
||
|
||
const SETTINGS_DEFAULTS = {
|
||
pageWidth: 900,
|
||
toolCallDisplay: 'modifications',
|
||
chainMetaDisplay: 'sometimes',
|
||
showDeletedMessages: 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?
|
||
var user = await apiMe();
|
||
if (!user) {
|
||
await navigateTo('login', {}, { replace: true });
|
||
return;
|
||
}
|
||
|
||
currentUser = user;
|
||
currentSettings = await apiGetSettings();
|
||
applySettings();
|
||
loadClaudeStatus();
|
||
|
||
const { page, id } = parseHash();
|
||
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-Seite immer erlauben, alles andere nur wenn eingeloggt
|
||
if (page !== 'login') {
|
||
var user = await apiMe();
|
||
if (!user) {
|
||
await navigateTo('login', {}, { replace: true });
|
||
return;
|
||
}
|
||
}
|
||
|
||
await navigateTo(page, { id }, { replace: true });
|
||
});
|