import { createRouter, createWebHistory, type RouteLocationNormalized, } from 'vue-router' import HomePage from '@/pages/HomePage.vue' import ComposePage from '@/pages/ComposePage.vue' import AboutPage from '@/pages/AboutPage.vue' import ContactPage from '@/pages/ContactPage.vue' import PrivacyPolicyPage from '@/pages/PrivacyPolicyPage.vue' import TermsOfServicePage from '@/pages/TermsOfServicePage.vue' import RegisterPage from '@/pages/RegisterPage.vue' import LoginPage from '@/pages/LoginPage.vue' import ForgotPasswordPage from '@/pages/ForgotPasswordPage.vue' import ResetPasswordPage from '@/pages/ResetPasswordPage.vue' import ChangePasswordPage from '@/pages/ChangePasswordPage.vue' import ChangeEmailPage from '@/pages/ChangeEmailPage.vue' import ConfirmEmailChangePage from '@/pages/ConfirmEmailChangePage.vue' import OrdersPage from '@/pages/OrdersPage.vue' import EditOrderPage from '@/pages/EditOrderPage.vue' import AdminPage from '@/pages/AdminPage.vue' import PaymentRedirect from '@/pages/PaymentRedirect.vue' import GuestCheckoutPage from '@/pages/GuestCheckoutPage.vue' import GuestPaymentRedirect from '@/pages/GuestPaymentRedirect.vue' import GuestOrderPage from '@/pages/GuestOrderPage.vue' import { useAuthStore } from '@/stores/authStore' import { getActivePinia } from 'pinia' export function scrollBehavior( to: RouteLocationNormalized, _from: RouteLocationNormalized, savedPosition: { left: number; top: number } | null, ) { if (savedPosition) { return savedPosition } if (to.hash) { return { el: to.hash, top: 0, behavior: 'smooth' as const } } return { top: 0, left: 0 } } const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), scrollBehavior, routes: [ { path: '/', name: 'home', component: HomePage, }, { path: '/compose', name: 'compose', component: ComposePage, meta: { requiresAuth: true }, }, { path: '/orders', name: 'orders', component: OrdersPage, meta: { requiresAuth: true }, }, { path: '/bestallning/:orderId/redigera', name: 'edit-order', component: EditOrderPage, meta: { requiresAuth: true }, }, { path: '/andra-losenord', name: 'change-password', component: ChangePasswordPage, meta: { requiresAuth: true }, }, { path: '/andra-epost', name: 'change-email', component: ChangeEmailPage, meta: { requiresAuth: true }, }, { path: '/admin', name: 'admin', component: AdminPage, meta: { requiresAuth: true, requiresAdmin: true }, }, { path: '/betalning/:orderId', name: 'payment', component: PaymentRedirect, meta: { requiresAuth: true }, }, { // Guest checkout — no account required to place and pay for an order. path: '/gast-bestallning', name: 'guest-checkout', component: GuestCheckoutPage, }, { // Guest payment page — token carried in query so refresh keeps the session. path: '/gast-betalning/:orderId', name: 'guest-payment', component: GuestPaymentRedirect, }, { // Magic-link landing — order status by opaque token. path: '/gast-order/:token', name: 'guest-order', component: GuestOrderPage, }, { path: '/registrera', name: 'register', component: RegisterPage, meta: { guestOnly: true }, }, { path: '/logga-in', name: 'login', component: LoginPage, meta: { guestOnly: true }, }, { path: '/glomt-losenord', name: 'forgot-password', component: ForgotPasswordPage, meta: { guestOnly: true }, }, { path: '/aterstall-losenord', name: 'reset-password', component: ResetPasswordPage, meta: { guestOnly: true }, }, { path: '/bekrafta-epost', name: 'confirm-email-change', component: ConfirmEmailChangePage, }, { path: '/om-oss', name: 'about', component: AboutPage, }, { path: '/om', redirect: '/om-oss', }, { path: '/kontakt', name: 'contact', component: ContactPage, }, { path: '/integritetspolicy', name: 'privacy', component: PrivacyPolicyPage, }, { path: '/villkor', name: 'terms', component: TermsOfServicePage, }, ], }) router.beforeEach((to) => { if (!getActivePinia()) return const auth = useAuthStore() const authenticated = auth.isAuthenticated && !auth.isTokenExpired() if (to.meta.guestOnly && authenticated) return { name: 'home' } if (to.meta.requiresAuth && !authenticated) { if (auth.isAuthenticated) auth.logout() return { name: 'login', query: { redirect: to.fullPath } } } if (to.meta.requiresAdmin && !auth.isAdmin) return { name: 'home' } }) export default router