All checks were successful
Build / build-and-test (push) Successful in 28s
损失的 TTFB 可以忽略不计
72 lines
2.0 KiB
JavaScript
72 lines
2.0 KiB
JavaScript
import { ref, computed, watch } from 'vue'
|
|
import { defineStore } from 'pinia'
|
|
import { useRouter, useRoute } from 'vue-router'
|
|
|
|
import { useHeadHelper } from '../ssr/headHelper.js'
|
|
|
|
export const useRouteStore = defineStore('route', () => {
|
|
const router = useRouter()
|
|
const route = useRoute()
|
|
const allRoutes = ref(router.getRoutes()
|
|
.filter(route => route.meta.hidden !== true)
|
|
.map(route => ({
|
|
path: route.path,
|
|
name: route.name,
|
|
order: route.meta.order || Number.MAX_SAFE_INTEGER
|
|
}))
|
|
.sort((a, b) => (a.order - b.order))
|
|
)
|
|
const lastFromDrawer = ref(0)
|
|
const customTitle = ref(null)
|
|
const title = import.meta.env.SSR ?
|
|
computed(() => route.meta.title || route.name) :
|
|
computed(() => customTitle.value || route.meta.title || route.name)
|
|
function drawerPress(target) {
|
|
if (lastFromDrawer.value == 0) {
|
|
lastFromDrawer.value = 1
|
|
router.push(target)
|
|
} else router.replace(target)
|
|
}
|
|
const progress = ref(0)
|
|
const progressMax = ref(1)
|
|
const showProgress = ref(false)
|
|
if (!import.meta.env.SSR) {
|
|
watch(title, title => document.title = title)
|
|
let progressTimer = null
|
|
router.beforeEach((to, from) => {
|
|
if (showProgress.value) return false
|
|
if (lastFromDrawer.value == 2) lastFromDrawer.value = 0
|
|
else if (lastFromDrawer.value == 1) lastFromDrawer.value = 2
|
|
progress.value = 0
|
|
progressMax.value = 1
|
|
showProgress.value = true
|
|
if (!progressTimer) {
|
|
progressTimer = setInterval(() => {
|
|
progress.value += progressMax.value / 10
|
|
if (progressMax.value <= progress.value) progressMax.value = progressMax.value * 3
|
|
}, 300)
|
|
}
|
|
return true
|
|
})
|
|
router.afterEach((to, from) => {
|
|
if (progressTimer) {
|
|
showProgress.value = false
|
|
clearInterval(progressTimer)
|
|
progressTimer = null
|
|
}
|
|
customTitle.value = null
|
|
if (!import.meta.env.SSR) window.scrollTo({ top: 0, left: 0, behavior: 'auto' });
|
|
})
|
|
}
|
|
return {
|
|
allRoutes,
|
|
lastFromDrawer,
|
|
title,
|
|
drawerPress,
|
|
showProgress,
|
|
progress,
|
|
progressMax,
|
|
customTitle
|
|
}
|
|
})
|