The data store's fetchVersion() was never called, so maxAccounts stayed at the default value of 10. Consolidated into the global store's fetchVersion() which is called on init. Co-Authored-By: Claude <noreply@anthropic.com>
100 lines
3.1 KiB
JavaScript
100 lines
3.1 KiB
JavaScript
/**
|
|
* Global Store for Antigravity Console
|
|
* Handles Translations, Toasts, and Shared Config
|
|
*/
|
|
|
|
document.addEventListener('alpine:init', () => {
|
|
Alpine.store('global', {
|
|
init() {
|
|
// Hash-based routing
|
|
const validTabs = ['dashboard', 'models', 'accounts', 'logs', 'settings'];
|
|
const getHash = () => window.location.hash.substring(1);
|
|
|
|
// 1. Initial load from hash
|
|
const initialHash = getHash();
|
|
if (validTabs.includes(initialHash)) {
|
|
this.activeTab = initialHash;
|
|
}
|
|
|
|
// 2. Sync State -> URL
|
|
Alpine.effect(() => {
|
|
if (validTabs.includes(this.activeTab) && getHash() !== this.activeTab) {
|
|
window.location.hash = this.activeTab;
|
|
}
|
|
});
|
|
|
|
// 3. Sync URL -> State (Back/Forward buttons)
|
|
window.addEventListener('hashchange', () => {
|
|
const hash = getHash();
|
|
if (validTabs.includes(hash) && this.activeTab !== hash) {
|
|
this.activeTab = hash;
|
|
}
|
|
});
|
|
|
|
// 4. Fetch version from API
|
|
this.fetchVersion();
|
|
},
|
|
|
|
async fetchVersion() {
|
|
try {
|
|
const response = await fetch('/api/config');
|
|
if (response.ok) {
|
|
const data = await response.json();
|
|
if (data.version) {
|
|
this.version = data.version;
|
|
}
|
|
// Update maxAccounts in data store
|
|
if (data.config && typeof data.config.maxAccounts === 'number') {
|
|
Alpine.store('data').maxAccounts = data.config.maxAccounts;
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.debug('Could not fetch version:', error);
|
|
}
|
|
},
|
|
|
|
// App State
|
|
version: '1.0.0',
|
|
activeTab: 'dashboard',
|
|
webuiPassword: localStorage.getItem('antigravity_webui_password') || '',
|
|
|
|
// i18n
|
|
lang: localStorage.getItem('app_lang') || 'en',
|
|
translations: window.translations || {},
|
|
|
|
// Toast Messages
|
|
toast: null,
|
|
|
|
// OAuth Progress
|
|
oauthProgress: {
|
|
active: false,
|
|
current: 0,
|
|
max: 60,
|
|
cancel: null
|
|
},
|
|
|
|
t(key, params = {}) {
|
|
let str = this.translations[this.lang][key] || key;
|
|
if (typeof str === 'string') {
|
|
Object.keys(params).forEach(p => {
|
|
str = str.replace(`{${p}}`, params[p]);
|
|
});
|
|
}
|
|
return str;
|
|
},
|
|
|
|
setLang(l) {
|
|
this.lang = l;
|
|
localStorage.setItem('app_lang', l);
|
|
},
|
|
|
|
showToast(message, type = 'info') {
|
|
const id = Date.now();
|
|
this.toast = { message, type, id };
|
|
setTimeout(() => {
|
|
if (this.toast && this.toast.id === id) this.toast = null;
|
|
}, 3000);
|
|
}
|
|
});
|
|
});
|