guard.ts 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import { useDiscreteApi } from '@/composables'
  2. import { useUserStore, toRefsPreferencesStore, toRefsUserStore } from '@/stores'
  3. import type { Router } from 'vue-router'
  4. const Layout = () => import('@/layout/index.vue')
  5. const { loadingBar } = useDiscreteApi()
  6. const { showTopLoadingBar } = toRefsPreferencesStore()
  7. const { resolveMenuList, cleanup } = useUserStore()
  8. const { token, routeList } = toRefsUserStore()
  9. export function setupRouterGuard(router: Router) {
  10. router.beforeEach(async (to, from, next) => {
  11. if (showTopLoadingBar.value) {
  12. loadingBar.start()
  13. }
  14. if (to.name === 'signIn') {
  15. if (!token.value) {
  16. next()
  17. } else {
  18. next(from.fullPath)
  19. }
  20. return false
  21. }
  22. if (!token.value) {
  23. cleanup()
  24. next()
  25. return false
  26. }
  27. if (token.value && !router.hasRoute('layout')) {
  28. try {
  29. await resolveMenuList()
  30. router.addRoute({
  31. path: '/',
  32. name: 'layout',
  33. component: Layout,
  34. // if you need to have a redirect when accessing / routing
  35. redirect: '/dashboard',
  36. children: routeList.value,
  37. })
  38. next(to.fullPath)
  39. } catch (error) {
  40. console.error('Error resolving user menu or adding route:', error)
  41. cleanup()
  42. next()
  43. }
  44. return false
  45. }
  46. next()
  47. return false
  48. })
  49. router.beforeResolve((_, __, next) => {
  50. next()
  51. })
  52. router.afterEach(() => {
  53. if (showTopLoadingBar.value) {
  54. loadingBar.finish()
  55. }
  56. })
  57. }