178 lines
4.2 KiB
TypeScript

import {
createRootRoute,
createRoute,
createRouter,
Outlet,
redirect,
} from '@tanstack/react-router'
import { useSessionStore } from '@/entities/session'
import { BondPage } from '@/pages/bond'
import { BrokerAccountOverviewPage } from '@/pages/broker-account'
import { BrokerAccountsPage } from '@/pages/broker-accounts'
import { BrokerAnalyticsPage } from '@/pages/broker-analytics'
import { BrokerEventsPage } from '@/pages/broker-events'
import { BrokerOperationsPage } from '@/pages/broker-operations'
import { BrokerPositionsPage } from '@/pages/broker-positions'
import { HomePage } from '@/pages/home'
import { LoginPage } from '@/pages/login'
import { PortfolioDetailPage, PortfoliosListPage } from '@/pages/portfolios'
import { ProfilePage } from '@/pages/profile'
import { RegisterPage } from '@/pages/register'
import { ScreenerPage } from '@/pages/screener'
import { StockPage } from '@/pages/stock'
import { BrokerAccountLayout } from '@/widgets/broker-account-layout'
import { AppLayout } from '../layouts/AppLayout'
function requireAuth() {
if (!useSessionStore.getState().isAuthenticated) {
throw redirect({ to: '/login' })
}
}
const rootRoute = createRootRoute({
component: () => <AppLayout />,
})
const indexRoute = createRoute({
getParentRoute: () => rootRoute,
path: '/',
component: HomePage,
})
const stockRoute = createRoute({
getParentRoute: () => rootRoute,
path: '/stocks/$secid',
component: StockPage,
})
const bondRoute = createRoute({
getParentRoute: () => rootRoute,
path: '/bonds/$secid',
component: BondPage,
})
const screenerRoute = createRoute({
getParentRoute: () => rootRoute,
path: '/screener',
component: ScreenerPage,
})
const loginRoute = createRoute({
getParentRoute: () => rootRoute,
path: '/login',
component: LoginPage,
})
const registerRoute = createRoute({
getParentRoute: () => rootRoute,
path: '/register',
component: RegisterPage,
})
const profileRoute = createRoute({
getParentRoute: () => rootRoute,
path: '/profile',
beforeLoad: requireAuth,
component: ProfilePage,
})
const portfoliosRoute = createRoute({
getParentRoute: () => rootRoute,
path: '/portfolios',
beforeLoad: requireAuth,
component: PortfoliosListPage,
})
const portfolioDetailRoute = createRoute({
getParentRoute: () => rootRoute,
path: '/portfolios/$id',
beforeLoad: requireAuth,
component: PortfolioDetailPage,
})
const brokerRoute = createRoute({
getParentRoute: () => rootRoute,
path: '/broker',
beforeLoad: requireAuth,
component: BrokerAccountsPage,
})
const brokerAccountRoot = createRoute({
getParentRoute: () => rootRoute,
path: '/broker/$accountId',
beforeLoad: requireAuth,
component: () => (
<BrokerAccountLayout>
<Outlet />
</BrokerAccountLayout>
),
})
const brokerAccountIndexRoute = createRoute({
getParentRoute: () => brokerAccountRoot,
path: '/',
component: BrokerAccountOverviewPage,
})
const brokerSharesRoute = createRoute({
getParentRoute: () => brokerAccountRoot,
path: '/shares',
component: () => <BrokerPositionsPage type="share" title="Акции" />,
})
const brokerBondsRoute = createRoute({
getParentRoute: () => brokerAccountRoot,
path: '/bonds',
component: () => <BrokerPositionsPage type="bond" title="Облигации" />,
})
const brokerOperationsRoute = createRoute({
getParentRoute: () => brokerAccountRoot,
path: '/operations',
component: BrokerOperationsPage,
})
const brokerEventsRoute = createRoute({
getParentRoute: () => brokerAccountRoot,
path: '/events',
component: BrokerEventsPage,
})
const brokerAnalyticsRoute = createRoute({
getParentRoute: () => brokerAccountRoot,
path: '/analytics',
component: BrokerAnalyticsPage,
})
const routeTree = rootRoute.addChildren([
indexRoute,
stockRoute,
bondRoute,
screenerRoute,
loginRoute,
registerRoute,
profileRoute,
portfoliosRoute,
portfolioDetailRoute,
brokerRoute,
brokerAccountRoot.addChildren([
brokerAccountIndexRoute,
brokerSharesRoute,
brokerBondsRoute,
brokerOperationsRoute,
brokerEventsRoute,
brokerAnalyticsRoute,
]),
])
export const router = createRouter({
routeTree,
defaultPreload: 'intent',
})
declare module '@tanstack/react-router' {
interface Register {
router: typeof router
}
}