- loadStrings sends the chosen language as ?locale= and keeps meta.locales as availableLocales - the user menu lists the admin locales, each named in its own language; choosing one saves it through PUT /account/preferences, caches it and reloads the page - boot loads the strings in the cached language; me() reloads them when the stored preference differs
43 lines
1.9 KiB
TypeScript
43 lines
1.9 KiB
TypeScript
import { createApp } from 'vue'
|
|
import App from './App.vue'
|
|
import { createAdminRouter } from './app/router'
|
|
import { onUnauthorized } from './api/client'
|
|
import { loadFieldTypes } from './app/fieldTypes'
|
|
import { loadStrings } from './app/i18n'
|
|
import { expireSession, me } from './state/useAuth'
|
|
import { loadNavigation } from './state/useNavigation'
|
|
import { applyTheme, cachedLocale, cachedTheme } from './state/usePreferences'
|
|
import { loadSettings } from './state/useSettings'
|
|
import './styles/main.css'
|
|
|
|
async function boot(): Promise<void> {
|
|
// The last theme choice (system unless the admin picked light or dark) is
|
|
// applied before the first await, so nothing renders in the wrong theme;
|
|
// me() then applies the admin's stored preference.
|
|
applyTheme(cachedTheme())
|
|
// Boot order (research Pattern 7): the public strings bundle first, so the
|
|
// login screen is translated, then the session, then navigation and the
|
|
// plugin field types.
|
|
// The cached admin language picks the bundle's locale; me() reloads the
|
|
// strings when the stored preference differs.
|
|
await loadStrings(cachedLocale() || undefined).catch(() => undefined)
|
|
// A 401 here only means "not signed in"; the router guard sends the
|
|
// visitor to the login route with the requested path as redirect.
|
|
const user = await me().catch(() => null)
|
|
if (user) {
|
|
// Plugin field types load once per session: their scripts define the
|
|
// elements any controller's form may use, their styles stay enabled.
|
|
await Promise.all([loadNavigation().catch(() => []), loadSettings().catch(() => []), loadFieldTypes()])
|
|
}
|
|
const router = createAdminRouter()
|
|
// A session that cannot be recovered ends here: the profile and every
|
|
// stored list query are cleared before the login screen shows (T-16.1-03).
|
|
onUnauthorized(() => expireSession(router))
|
|
const app = createApp(App)
|
|
app.use(router)
|
|
await router.isReady()
|
|
app.mount('#app')
|
|
}
|
|
|
|
void boot()
|