Files
b2b/bo/src/router/index.ts
2026-04-15 16:00:42 +02:00

140 lines
3.5 KiB
TypeScript

import { createRouter, createWebHistory } from 'vue-router'
import { currentLang, langs, switchLocalization } from './langs'
import { getSettings } from './settings'
import { useAuthStore } from '@/stores/customer/auth'
import { getRoutes } from './menu'
function isAuthenticated(): boolean {
if (typeof document === 'undefined') return false
return document.cookie.split('; ').some((c) => c === 'is_authenticated=1')
}
await switchLocalization()
await getSettings()
const routes = await getRoutes()
let newRoutes = []
function getLayoutFromComponent(path: string) {
const emptyLayouts = [
'LoginView.vue',
'RegisterView.vue',
'PasswordRecoveryView.vue',
'VerifyEmailView.vue',
'ResetPasswordForm.vue'
]
return emptyLayouts.some((name) => path.includes(name)) ? 'empty' : 'default'
}
for (let r of routes) {
const component = () => import(/* @vite-ignore */ `..${r.component}`)
const parsedMeta = r.meta ? JSON.parse(r.meta) : {}
const layout = parsedMeta.layout ?? getLayoutFromComponent(r.component)
newRoutes.push({
path: r.path,
component,
name: r.name,
meta: {
...parsedMeta,
layout,
},
})
}
const router = createRouter({
history: createWebHistory(import.meta.env.VITE_BASE_URL),
routes: [
{
path: '/',
redirect: () => `/${currentLang.value?.iso_code}`,
},
{
path: '/:locale',
name: 'locale',
children: [
...newRoutes,
{
path: ':pathMatch(.*)*',
component: () => import('@/views/NotFoundView.vue'),
name: 'not-found-child',
},
],
},
{
path: '/:pathMatch(.*)*',
component: () => import('@/views/NotFoundView.vue'),
name: 'not-found-root',
},
],
})
const viewModules = import.meta.glob('/src/views/**/*.vue')
const componentModules = import.meta.glob('/src/components/**/*.vue')
async function setRoutes() {
const routes = await getRoutes()
for (const item of routes) {
const componentName = item.component
const [, folder] = componentName.split('/')
const componentPath = `/src${componentName}`
let modules =
folder === 'views' ? viewModules : componentModules
const importer = modules[componentPath]
if (!importer) {
console.error('Component not found:', componentPath)
continue
}
const importedComponent = (await importer()).default
const parsedMeta = item.meta ? JSON.parse(item.meta) : {}
const layout = parsedMeta.layout ?? getLayoutFromComponent(item.component)
router.addRoute('locale', {
path: item.path,
component: importedComponent,
name: item.name,
meta: {
...parsedMeta,
layout,
}
})
}
// await router.replace(router.currentRoute.value.fullPath)
}
await setRoutes()
router.beforeEach((to, from) => {
const locale = to.params.locale as string
const localeLang = langs.find((x) => x.iso_code === locale)
if (locale && langs.length > 0) {
const authStore = useAuthStore()
const validLocale = langs.find((l) => l.lang_code === locale)
if (validLocale) {
currentLang.value = localeLang
if (!to.meta?.guest && !authStore.isAuthenticated) {
return { name: 'login', params: { locale } }
}
return true
} else if (locale) {
return `/${currentLang.value?.iso_code}${to.path.replace(`/${locale}`, '') || '/'}`
}
}
if (!locale && to.path !== '/') {
return `/${currentLang.value?.iso_code}${to.path}`
}
return true
})
export default router