import * as Vue from 'vue' import * as VueRouterLib from 'vue-router' import * as PiniaLib from 'pinia' import { createApp } from 'vue' import { createPinia } from 'pinia' import { PerfectScrollbarPlugin } from 'vue3-perfect-scrollbar' import { useModuleStore } from '@KTXC/stores/moduleStore' import { useTenantStore } from '@KTXC/stores/tenantStore' import { useUserStore } from '@KTXC/stores/userStore' import { useL10nStore } from '@KTXC/stores/l10nStore' import { useThemeStore } from '@KTXC/stores/themeStore' import { i18n } from '@KTXC/l10n/runtime' import { fetchWrapper } from '@KTXC/utils/helpers/fetch-wrapper' import { FetchError } from '@KTXC/utils/helpers/fetch-wrapper-core' import { initializeModules } from '@KTXC/utils/modules' import { createSessionMonitor } from '@KTXC/services/authManager' import App from './App.vue' import router from './router' import vuetify from './plugins/vuetify/index' import '@mdi/font/css/materialdesignicons.min.css' import '@fontsource/public-sans/index.css' const app = createApp(App) const pinia = createPinia() app.use(pinia) app.use(PerfectScrollbarPlugin) app.use(i18n) app.use(vuetify) const globalWindow = window as typeof window & { [key: string]: unknown } globalWindow.Vue = Vue globalWindow.vue = Vue globalWindow.VueRouter = VueRouterLib globalWindow.Pinia = PiniaLib as unknown (async () => { const moduleStore = useModuleStore(); const tenantStore = useTenantStore(); const userStore = useUserStore(); const l10nStore = useL10nStore(); const themeStore = useThemeStore(); try { const payload = await fetchWrapper.get('/init'); moduleStore.init(payload?.modules ?? {}); tenantStore.init(payload?.tenant ?? null); userStore.init(payload?.user ?? {}); themeStore.boot(); // Resolve locale and load catalogs before modules boot await l10nStore.init(payload?.l10n ?? null); // Initialize auth session monitor const sessionMonitor = createSessionMonitor({ onLogout: () => userStore.logout() }); sessionMonitor.start(); // Initialize registered modules await initializeModules(app); // Register a catch-all and router router.addRoute({ name: 'NotFound', path: '/:pathMatch(.*)*', component: () => import('@KTXC/views/pages/maintenance/error/Error404Page.vue') }); app.use(router); await router.isReady(); app.mount('#app'); } catch (e) { console.error('Bootstrap failed:', e); // The private shell is unusable without /init. If the server rejected // the session, drop the stale local identity and return to login. if (e instanceof FetchError && (e.status === 401 || e.status === 403)) { userStore.clearAuth(); window.location.href = '/login'; } } })();