import { type NavigationGuardReturn, createRouter, createWebHashHistory } from 'vue-router'; import { TemplateType } from '@/core/template.ts'; import { isUserLogined, isUserUnlocked } from '@/lib/userstate.ts'; import MainLayout from '@/views/desktop/MainLayout.vue'; import LoginPage from '@/views/desktop/LoginPage.vue'; import SignUpPage from '@/views/desktop/SignupPage.vue'; import VerifyEmailPage from '@/views/desktop/VerifyEmailPage.vue'; import ForgetPasswordPage from '@/views/desktop/ForgetPasswordPage.vue'; import ResetPasswordPage from '@/views/desktop/ResetPasswordPage.vue'; import UnlockPage from '@/views/desktop/UnlockPage.vue'; import HomePage from '@/views/desktop/HomePage.vue'; import TransactionListPage from '@/views/desktop/transactions/ListPage.vue'; import StatisticsTransactionPage from '@/views/desktop/statistics/TransactionPage.vue'; import AccountListPage from '@/views/desktop/accounts/ListPage.vue'; import TransactionCategoryListPage from '@/views/desktop/categories/ListPage.vue'; import TransactionTagListPage from '@/views/desktop/tags/ListPage.vue'; import TransactionTemplateListPage from '@/views/desktop/templates/ListPage.vue'; import UserSettingsPage from '@/views/desktop/user/UserSettingsPage.vue'; import AppSettingsPage from '@/views/desktop/app/AppSettingsPage.vue'; import ExchangeRatesPage from '@/views/desktop/ExchangeRatesPage.vue'; import AboutPage from '@/views/desktop/AboutPage.vue'; function checkLogin(): NavigationGuardReturn { if (!isUserLogined()) { return { path: '/login', replace: true }; } if (!isUserUnlocked()) { return { path: '/unlock', replace: true }; } return true; } function checkLocked(): NavigationGuardReturn { if (!isUserLogined()) { return { path: '/login', replace: true }; } if (isUserUnlocked()) { return { path: '/', replace: true }; } return true; } function checkNotLogin(): NavigationGuardReturn { if (isUserLogined() && !isUserUnlocked()) { return { path: '/unlock', replace: true }; } if (isUserLogined()) { return { path: '/', replace: true }; } return true; } const router = createRouter({ history: createWebHashHistory(), routes: [ { path: '/', component: MainLayout, beforeEnter: checkLogin, children: [ { path: '', component: HomePage, beforeEnter: checkLogin }, { path: '/transaction/list', component: TransactionListPage, beforeEnter: checkLogin, props: route => ({ initDateType: route.query['dateType'], initMaxTime: route.query['maxTime'], initMinTime: route.query['minTime'], initType: route.query['type'], initCategoryIds: route.query['categoryIds'], initAccountIds: route.query['accountIds'], initTagIds: route.query['tagIds'], initTagFilterType: route.query['tagFilterType'], initAmountFilter: route.query['amountFilter'], initKeyword: route.query['keyword'] }) }, { path: '/statistics/transaction', component: StatisticsTransactionPage, beforeEnter: checkLogin, props: route => ({ initAnalysisType: route.query['analysisType'], initChartDataType: route.query['chartDataType'], initChartType: route.query['chartType'], initChartDateType: route.query['chartDateType'], initStartTime: route.query['startTime'], initEndTime: route.query['endTime'], initFilterAccountIds: route.query['filterAccountIds'], initFilterCategoryIds: route.query['filterCategoryIds'], initTagIds: route.query['tagIds'], initTagFilterType: route.query['tagFilterType'], initSortingType: route.query['sortingType'], initTrendDateAggregationType: route.query['trendDateAggregationType'] }) }, { path: '/account/list', component: AccountListPage, beforeEnter: checkLogin }, { path: '/category/list', component: TransactionCategoryListPage, beforeEnter: checkLogin }, { path: '/tag/list', component: TransactionTagListPage, beforeEnter: checkLogin }, { path: '/template/list', component: TransactionTemplateListPage, beforeEnter: checkLogin, props: { initType: TemplateType.Normal.type } }, { path: '/schedule/list', component: TransactionTemplateListPage, beforeEnter: checkLogin, props: { initType: TemplateType.Schedule.type } }, { path: '/exchange_rates', component: ExchangeRatesPage, beforeEnter: checkLogin }, { path: '/user/settings', component: UserSettingsPage, beforeEnter: checkLogin, props: route => ({ initTab: route.query['tab'] }) }, { path: '/app/settings', component: AppSettingsPage, beforeEnter: checkLogin, props: route => ({ initTab: route.query['tab'] }) }, { path: '/about', component: AboutPage, beforeEnter: checkLogin } ] }, { path: '/login', component: LoginPage, beforeEnter: checkNotLogin }, { path: '/signup', component: SignUpPage, beforeEnter: checkNotLogin }, { path: '/verify_email', component: VerifyEmailPage, props: route => ({ email: route.query['email'], token: route.query['token'], hasValidEmailVerifyToken: route.query['emailSent'] === 'true' }) }, { path: '/forgetpassword', component: ForgetPasswordPage, beforeEnter: checkNotLogin }, { path: '/resetpassword', component: ResetPasswordPage, props: route => ({ token: route.query['token'] }) }, { path: '/unlock', component: UnlockPage, beforeEnter: checkLocked } ], }) export default router;