99 lines
2.8 KiB
TypeScript
99 lines
2.8 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'
|
||
|
||
/*
|
||
* If not building with SSR mode, you can
|
||
* directly export the Router instantiation;
|
||
*
|
||
* The function below can be async too; either use
|
||
* async/await or return a Promise which resolves
|
||
* with the Router instance.
|
||
*/
|
||
|
||
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,
|
||
|
||
// Leave this as is and make changes in quasar.conf.js instead!
|
||
// quasar.conf.js -> build -> vueRouterMode
|
||
// quasar.conf.js -> build -> publicPath
|
||
history: createHistory(process.env.VUE_ROUTER_BASE),
|
||
})
|
||
|
||
const publicPaths = ['/login', '/create-account', '/recovery-password']
|
||
|
||
Router.beforeEach(async (to) => {
|
||
const authStore = useAuthStore()
|
||
|
||
// Инициализация хранилища перед проверкой
|
||
if (!authStore.isInitialized) {
|
||
await authStore.initialize()
|
||
}
|
||
|
||
// Проверка авторизации для непубличных маршрутов
|
||
if (!publicPaths.includes(to.path)) {
|
||
if (!authStore.isAuthenticated) {
|
||
return {
|
||
path: '/login',
|
||
query: { redirect: to.fullPath }
|
||
}
|
||
}
|
||
}
|
||
|
||
// Редирект авторизованных пользователей с публичных маршрутов
|
||
if (publicPaths.includes(to.path) && authStore.isAuthenticated) {
|
||
return { path: '/' }
|
||
}
|
||
})
|
||
|
||
const handleBackButton = async () => {
|
||
const currentRoute = Router.currentRoute.value
|
||
if (currentRoute.meta.backRoute) {
|
||
await Router.push(currentRoute.meta.backRoute);
|
||
} else {
|
||
if (window.history.length > 1) {
|
||
Router.go(-1)
|
||
} else {
|
||
await Router.push('/projects')
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
Router.afterEach((to) => {
|
||
const BackButton = window.Telegram?.WebApp?.BackButton;
|
||
if (BackButton) {
|
||
// Управление видимостью
|
||
if (to.meta.hideBackButton) {
|
||
BackButton.hide()
|
||
} else {
|
||
BackButton.show()
|
||
}
|
||
|
||
// Обновляем обработчик клика
|
||
BackButton.offClick(handleBackButton as () => void)
|
||
BackButton.onClick(handleBackButton as () => void)
|
||
}
|
||
|
||
if (!to.params.id) {
|
||
const projectsStore = useProjectsStore()
|
||
projectsStore.setCurrentProjectId(null)
|
||
}
|
||
})
|
||
|
||
return Router
|
||
})
|