All files / munch-ease-frontend/src/router index.ts

0% Statements 0/79
0% Branches 0/1
0% Functions 0/1
0% Lines 0/79

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80                                                                                                                                                               
import { createRouter, createWebHashHistory, Router } from 'vue-router'
import type { RouteRecordRaw } from 'vue-router'

// Lazy-loaded route components
const LoginPage = () => import('@/components/LoginPage.vue')
const RecipesPage = () => import('@/components/recipes/RecipesPage.vue')
const MealPlanPage = () => import('@/components/meals/MealPlanPage.vue')
const MyShoppingPage = () => import('@/components/shopping/MyShoppingPage.vue')
const PurchasedShoppingListPage = () => import('@/components/shopping/PurchasedShoppingListPage.vue')
const CurrentShoppingListPage = () => import('@/components/shopping/CurrentShoppingListPage.vue')
const EditMealPage = () => import('@/components/meals/EditMealPage.vue')
const EditRecipePage = () => import('@/components/recipes/EditRecipePage.vue')

export function createAppRouter(getCurrentUser: () => Promise<unknown> | unknown): Router {
  const routes: RouteRecordRaw[] = [
    { path: '/', redirect: { name: 'mealplan' } },
    { path: '/login', name: 'login', component: LoginPage },
    { path: '/mealplan', name: 'mealplan', component: MealPlanPage, meta: { requiresAuth: true } },
    {
      path: '/shopping',
      name: 'shopping',
      component: MyShoppingPage,
      meta: { requiresAuth: true },
    },
    {
      path: '/shopping/current',
      name: 'shopping-current',
      component: CurrentShoppingListPage,
      meta: { requiresAuth: true },
    },
    {
      path: '/shopping/:id',
      name: 'shopping-list',
      component: PurchasedShoppingListPage,
      props: true,
      meta: { requiresAuth: true },
    },
    { path: '/recipes', name: 'recipes', component: RecipesPage, meta: { requiresAuth: true } },
    {
      path: '/recipes/add',
      name: 'recipe-add',
      component: EditRecipePage,
      meta: { requiresAuth: true },
    },
    {
      path: '/recipes/:id',
      name: 'recipe-edit',
      component: EditRecipePage,
      props: true,
      meta: { requiresAuth: true },
    },
    { path: '/meals/add', name: 'meal-add', component: EditMealPage, meta: { requiresAuth: true } },
    {
      path: '/meals/:id',
      name: 'meal-edit',
      component: EditMealPage,
      props: true,
      meta: { requiresAuth: true },
    },
  ]

  const router = createRouter({
    history: createWebHashHistory(),
    routes,
  })

  router.beforeEach(async (to) => {
    if (!to.meta.requiresAuth) return true
    try {
      const user = await getCurrentUser()
      if (user) return true
    } catch (_) {
      /* ignore */
    }
    return { name: 'login', query: { redirect: to.fullPath } }
  })

  return router
}