65d60008da
Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
87 lines
2.8 KiB
TypeScript
87 lines
2.8 KiB
TypeScript
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 { useLayoutStore } from '@KTXC/stores/layoutStore'
|
|
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();
|
|
const layoutStore = useLayoutStore();
|
|
|
|
try {
|
|
const payload = await fetchWrapper.get('/init');
|
|
moduleStore.init(payload?.modules ?? {});
|
|
tenantStore.init(payload?.tenant ?? null);
|
|
userStore.init(payload?.user ?? {});
|
|
layoutStore.hydrateFromSettings();
|
|
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';
|
|
}
|
|
}
|
|
})();
|