fix(settings): async guard awaits config load, reactive devTierOverride, validate APP_TIER

This commit is contained in:
pyr0ball 2026-03-21 02:23:10 -07:00
parent e7d6dfef90
commit 81b87a750c
5 changed files with 28 additions and 5 deletions

View file

@ -875,10 +875,12 @@ def get_app_config():
import os
profile = os.environ.get("INFERENCE_PROFILE", "cpu")
valid_profiles = {"remote", "cpu", "single-gpu", "dual-gpu"}
valid_tiers = {"free", "paid", "premium", "ultra"}
raw_tier = os.environ.get("APP_TIER", "free")
return {
"isCloud": os.environ.get("CLOUD_MODE", "").lower() in ("1", "true"),
"isDevMode": os.environ.get("DEV_MODE", "").lower() in ("1", "true"),
"tier": os.environ.get("APP_TIER", "free"),
"tier": raw_tier if raw_tier in valid_tiers else "free",
"contractedClient": os.environ.get("CONTRACTED_CLIENT", "").lower() in ("1", "true"),
"inferenceProfile": profile if profile in valid_profiles else "cpu",
}

View file

@ -35,11 +35,12 @@ export const router = createRouter({
],
})
router.beforeEach((to, _from, next) => {
router.beforeEach(async (to, _from, next) => {
if (!to.path.startsWith('/settings/')) return next()
const config = useAppConfigStore()
if (!config.loaded) await config.load()
const tab = to.path.replace('/settings/', '')
const devOverride = localStorage.getItem('dev_tier_override')
const devOverride = config.devTierOverride
const gpuProfiles = ['single-gpu', 'dual-gpu']
if (tab === 'system' && config.isCloud) return next('/settings/my-profile')

View file

@ -12,6 +12,7 @@ export const useAppConfigStore = defineStore('appConfig', () => {
const contractedClient = ref(false)
const inferenceProfile = ref<InferenceProfile>('cpu')
const loaded = ref(false)
const devTierOverride = ref(localStorage.getItem('dev_tier_override') ?? '')
async function load() {
const { data } = await useApiFetch<{
@ -27,5 +28,15 @@ export const useAppConfigStore = defineStore('appConfig', () => {
loaded.value = true
}
return { isCloud, isDevMode, tier, contractedClient, inferenceProfile, loaded, load }
function setDevTierOverride(value: string | null) {
if (value) {
localStorage.setItem('dev_tier_override', value)
devTierOverride.value = value
} else {
localStorage.removeItem('dev_tier_override')
devTierOverride.value = ''
}
}
return { isCloud, isDevMode, tier, contractedClient, inferenceProfile, loaded, load, devTierOverride, setDevTierOverride }
})

View file

@ -33,4 +33,13 @@ describe('SettingsView sidebar', () => {
const wrapper = mount(SettingsView, { global: { plugins: [makeRouter()] } })
expect(wrapper.find('[data-testid="nav-developer"]').exists()).toBe(false)
})
it('shows Developer when devTierOverride is set in store', () => {
const store = useAppConfigStore()
store.isDevMode = false
store.setDevTierOverride('premium')
const wrapper = mount(SettingsView, { global: { plugins: [makeRouter()] } })
expect(wrapper.find('[data-testid="nav-developer"]').exists()).toBe(true)
store.setDevTierOverride(null) // cleanup
})
})

View file

@ -38,7 +38,7 @@ import { computed } from 'vue'
import { useAppConfigStore } from '../../stores/appConfig'
const config = useAppConfigStore()
const devOverride = computed(() => !!localStorage.getItem('dev_tier_override'))
const devOverride = computed(() => !!config.devTierOverride)
const gpuProfiles = ['single-gpu', 'dual-gpu']
const showSystem = computed(() => !config.isCloud)