Files
japanese-srs-trainer-wanikani/client/src/router/index.ts
2025-10-27 05:45:38 +01:00

58 lines
1.4 KiB
TypeScript

/**
* router/index.ts
*
* Automatic routes for `./src/pages/*.vue`
*/
// Composables
import { createRouter, createWebHistory } from 'vue-router'
import { setupLayouts } from 'virtual:generated-layouts'
import { routes } from 'vue-router/auto-routes'
import { useAuthStore } from '../stores/auth.ts'
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
routes: setupLayouts(routes),
})
// Workaround for https://github.com/vitejs/vite/issues/11804
router.onError((err, to) => {
if (err?.message?.includes?.('Failed to fetch dynamically imported module')) {
if (localStorage.getItem('vuetify:dynamic-reload')) {
console.error('Dynamic import error, reloading page did not fix it', err)
} else {
console.log('Reloading page to fix dynamic import error')
localStorage.setItem('vuetify:dynamic-reload', 'true')
location.assign(to.fullPath)
}
} else {
console.error(err)
}
})
router.isReady().then(() => {
localStorage.removeItem('vuetify:dynamic-reload')
})
let hasFetchedUser = false
router.beforeEach(async (to) => {
const auth = useAuthStore()
if (to.path === '/login') return true
if (!hasFetchedUser && !auth.user && !auth.loading) {
hasFetchedUser = true
await auth.fetchUser()
}
if (!auth.isAuthenticated) {
return { path: '/login', query: { redirect: to.fullPath } }
}
return true
})
export default router