class UserSettings {
|
constructor() {
|
this.cache = new window.jvbCache('settings');
|
this.debouncer = window.debouncer;
|
|
this.isLoggedIn = jvbSettings.currentUser !== null;
|
|
this.initListeners();
|
|
this.subscribers = new Set();
|
}
|
|
initListeners() {
|
this.changeHandler = this.handleChange.bind(this);
|
|
document.addEventListener('change', this.changeHandler);
|
}
|
|
handleChange(e) {
|
|
}
|
|
saveSetting(name, value) {
|
this.cache.setItem(name, value);
|
if (this.isLoggedIn) {
|
|
}
|
}
|
|
loadSetting(name) {
|
let value = this.cache.getItem(name);
|
|
if (this.isLoggedIn) {
|
|
}
|
}
|
|
loadUserSetting(name) {
|
|
}
|
|
/**
|
* Event system
|
*/
|
subscribe(callback) {
|
this.subscribers.add(callback);
|
return () => this.subscribers.delete(callback);
|
}
|
|
notify(event, data) {
|
this.subscribers.forEach(cb => cb(event, data));
|
}
|
|
/***************************************************
|
CLEANUP
|
***************************************************/
|
destroy() {
|
document.removeEventListener('change', this.changeHandler);
|
this.subscribers.clear();
|
}
|
}
|
|
document.addEventListener('DOMContentLoaded', function() {
|
window.jvbUserSettings = new UserSettings();
|
});
|
|
// Theme switching functionality
|
document.addEventListener('DOMContentLoaded', function() {
|
console.log('Theme switch initiated');
|
const themeSwitch = document.getElementById('theme-switch');
|
|
if (!themeSwitch) return;
|
|
// Initialize theme from localStorage or system preference
|
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)');
|
const storedTheme = localStorage.getItem('theme');
|
|
if (storedTheme) {
|
document.documentElement.classList.toggle('dark', storedTheme === 'dark');
|
themeSwitch.checked = storedTheme === 'dark';
|
} else {
|
document.documentElement.classList.toggle('dark', prefersDark.matches);
|
themeSwitch.checked = prefersDark.matches;
|
}
|
|
// Handle theme switch changes
|
themeSwitch.addEventListener('change', async function () {
|
const isDark = this.checked;
|
document.documentElement.classList.toggle('dark', isDark);
|
localStorage.setItem('theme', isDark ? 'dark' : 'light');
|
|
// If user is logged in, save preference
|
if (jvbSettings.currentUser !== null) {
|
try {
|
await fetch(`${jvbSettings.api}settings`, {
|
method: 'POST',
|
headers: {
|
'Content-Type': 'application/json',
|
'X-WP-Nonce': jvbSettings.nonce,
|
'action_nonce': jvbSettings.dash,
|
},
|
body: JSON.stringify({
|
dark_mode: isDark,
|
user: jvbSettings.currentUser
|
})
|
});
|
} catch (error) {
|
console.error('Failed to save theme preference:', error);
|
}
|
}
|
|
// Update label
|
const label = document.getElementById('theme-switch');
|
if (label) {
|
label.title = isDark ? 'Toggle Light Mode' : 'Toggle Dark Mode';
|
}
|
});
|
|
// Handle system theme changes
|
prefersDark.addEventListener('change', (e) => {
|
if (!localStorage.getItem('theme')) {
|
const isDark = e.matches;
|
document.documentElement.classList.toggle('dark', isDark);
|
themeSwitch.checked = isDark;
|
}
|
});
|
});
|