97 lines
2.9 KiB
TypeScript
97 lines
2.9 KiB
TypeScript
import { defineRouter } from '#q-app/wrappers'
|
|
import {
|
|
createMemoryHistory,
|
|
createRouter,
|
|
createWebHashHistory,
|
|
createWebHistory
|
|
} from 'vue-router'
|
|
import routes from './routes'
|
|
import { useAuthStore } from 'stores/auth'
|
|
import { useProjectsStore } from 'stores/projects'
|
|
const tg = window.Telegram?.WebApp
|
|
|
|
declare module 'vue-router' {
|
|
interface RouteMeta {
|
|
guestOnly?: boolean
|
|
hideBackButton?: boolean
|
|
backRoute?: string
|
|
requiresAuth?: boolean
|
|
}
|
|
}
|
|
|
|
export default defineRouter(function (/* { store, ssrContext } */) {
|
|
const createHistory = process.env.SERVER
|
|
? createMemoryHistory
|
|
: process.env.VUE_ROUTER_MODE === 'history'
|
|
? createWebHistory
|
|
: createWebHashHistory
|
|
|
|
const Router = createRouter({
|
|
scrollBehavior: () => ({ left: 0, top: 0 }),
|
|
routes,
|
|
history: createHistory(process.env.VUE_ROUTER_BASE)
|
|
})
|
|
|
|
const publicPath = ['404', 'terms', 'privacy', 'consent', 'settings']
|
|
|
|
const authStore = useAuthStore()
|
|
const projectsStore = useProjectsStore()
|
|
|
|
Router.beforeEach(async (to) => {
|
|
if (to.name !== 'telegram_only' && sessionStorage.getItem('isTelegram') === 'false') {
|
|
return { name: 'telegram_only', replace: true }
|
|
}
|
|
|
|
if (to.name === 'telegram_only') return true
|
|
if (typeof to.name === 'string' && publicPath.includes(to.name)) return true
|
|
|
|
if (to.name === 'login')
|
|
return authStore.isAuth ? { name: 'projects', replace: true } : true
|
|
|
|
if (to.name === 'agreements') return true
|
|
if (to.name === 'create_account' && !authStore.isAuth) return true
|
|
if (to.name === 'recovery_password' && !authStore.isAuth) return true
|
|
|
|
|
|
if (!authStore.isAuth) return { name: 'login', replace: true }
|
|
|
|
if (to.params.id) {
|
|
if (!projectsStore.isInit) await projectsStore.init()
|
|
if (to.params.id && projectsStore.projectById(Number(to.params.id))) {
|
|
if (projectsStore.currentProjectId !== Number(to.params.id)) {
|
|
projectsStore.setCurrentProjectId(Number(to.params.id))
|
|
}
|
|
} else {
|
|
projectsStore.setCurrentProjectId(null)
|
|
return { name: 'projects' }
|
|
}
|
|
}
|
|
})
|
|
|
|
const handleBackButton = async () => {
|
|
const currentRoute = Router.currentRoute.value
|
|
if (currentRoute.meta.backRoute) {
|
|
await Router.push({ name: currentRoute.meta.backRoute })
|
|
} else {
|
|
if (window.history.length > 1) Router.go(-1)
|
|
else await Router.push({ name: 'projects' })
|
|
}
|
|
}
|
|
|
|
Router.afterEach((to) => {
|
|
if (tg) {
|
|
const BackButton = tg?.BackButton
|
|
if (BackButton) {
|
|
BackButton[to.meta.hideBackButton ? 'hide' : 'show']()
|
|
BackButton.offClick(handleBackButton as () => void)
|
|
BackButton.onClick(handleBackButton as () => void)
|
|
}
|
|
}
|
|
|
|
if (to.params.id) projectsStore.setLastProjectId(Number(to.params.id))
|
|
if (to.name === 'projects') projectsStore.setLastProjectId(null)
|
|
projectsStore.setCurrentProjectId(to.params.id ? Number(to.params.id) : null)
|
|
})
|
|
|
|
return Router
|
|
}) |