import { VueQueryPlugin } from '@tanstack/vue-query' import { definePreset } from '@primeuix/themes' import Aura from '@primeuix/themes/aura' import { createPinia, type Pinia } from 'pinia' import PrimeVue from 'primevue/config' import ConfirmationService from 'primevue/confirmationservice' import { createApp, watch } from 'vue' import App from '@/App.vue' import { onApiError } from '@/api/errors' import { queryClient } from '@/app/query-client' import { useAuthStore } from '@/modules/auth/stores/auth.store' import { router } from '@/router' import '@/assets/main.css' const NexoPreset = definePreset(Aura, { semantic: { primary: { 50: '#eef4ff', 100: '#dbe7ff', 200: '#bfd2ff', 300: '#93b4ff', 400: '#6090fa', 500: '#3b6fed', 600: '#2554d8', 700: '#1e43af', 800: '#1e3b8a', 900: '#1d346d', 950: '#172554', }, }, }) async function bootstrap(): Promise { const app = createApp(App) const pinia: Pinia = createPinia() app.use(pinia) app.use(PrimeVue, { license: import.meta.env.VITE_PRIMEVUE_LICENSE, theme: { preset: NexoPreset, options: { darkModeSelector: '.app-dark', cssLayer: { name: 'primevue', order: 'theme, base, primevue, components, utilities', }, }, }, }) app.use(ConfirmationService) app.use(VueQueryPlugin, { queryClient }) const authStore = useAuthStore(pinia) await authStore.initialize() app.use(router) onApiError((error) => { if (error.status !== 401 || !authStore.isAuthenticated) return authStore.expireSession() }) watch( () => authStore.isAuthenticated, (isAuthenticated, wasAuthenticated) => { if (isAuthenticated || !wasAuthenticated || router.currentRoute.value.meta.public) return const redirect = router.currentRoute.value.fullPath void router.replace( redirect === '/login' ? { name: 'login' } : { name: 'login', query: { redirect } }, ) }, ) app.mount('#app') } void bootstrap()