// Tracks whether first-run setup is complete, so the app can steer a fresh // admin into the /setup wizard. Defaults to "complete" so the wizard never // flashes before the real value loads. import { ref } from 'vue' import { settingsApi, setupApi } from '../api' export const setupComplete = ref(true) // Session-only: a fresh admin who clicks "Skip for now" is not nagged again // until the next login/reload. export const setupSkipped = ref(false) const loaded = ref(false) export function isSetupLoaded() { return loaded.value } export async function refreshSetupState() { try { const response = await settingsApi.get('setup_complete') const value = response.data?.data?.value setupComplete.value = value === true || value === 'true' } catch (err) { // If we cannot read it, assume complete so we do not trap the user. setupComplete.value = true } loaded.value = true return setupComplete.value } // First run, before any user exists. Defaults to false so the app never flashes // the create-admin screen at an established site while this loads. export const needsAdmin = ref(false) const adminLoaded = ref(false) export function isNeedsAdminLoaded() { return adminLoaded.value } export async function refreshNeedsAdmin() { try { const response = await setupApi.needsAdmin() needsAdmin.value = response.data?.data?.needsadmin === true } catch (err) { // Fail open: if we cannot tell, assume an admin exists rather than trap // everyone behind a create-admin screen they cannot complete. needsAdmin.value = false } adminLoaded.value = true return needsAdmin.value } // Called after the first admin is created so the gate stops firing. export function clearNeedsAdmin() { needsAdmin.value = false adminLoaded.value = true }