import { CreateSightPage, DevicesPage, EditSightPage, LoginPage, MainPage, SightListPage, MapPage, MediaListPage, MediaPreviewPage, MediaEditPage, CountryListPage, CityListPage, RouteListPage, UserListPage, SnapshotListPage, CarrierListPage, StationListPage, ArticleListPage, SnapshotCreatePage, CountryCreatePage, CityCreatePage, CarrierCreatePage, VehicleCreatePage, VehicleEditPage, CountryEditPage, CityEditPage, UserCreatePage, UserEditPage, CarrierEditPage, StationCreatePage, StationPreviewPage, StationEditPage, RouteCreatePage, RoutePreview, DemoPage, RouteEditPage, ArticlePreviewPage, CountryAddPage, } from "@pages"; import { authStore, createSightStore, editSightStore, languageStore, ROUTE_REQUIRED_RESOURCES, } from "@shared"; import { Layout } from "@widgets"; import { runInAction } from "mobx"; import React, { useEffect } from "react"; import { createBrowserRouter, RouterProvider, Navigate, Outlet, useLocation, useMatches, } from "react-router-dom"; const PublicRoute = ({ children }: { children: React.ReactNode }) => { const { isAuthenticated } = authStore; const need_auth = import.meta.env.VITE_NEED_AUTH == "true"; if (isAuthenticated || !need_auth) { return ; } return <>{children}; }; const ProtectedRoute = ({ children }: { children: React.ReactNode }) => { const { isAuthenticated } = authStore; const need_auth = import.meta.env.VITE_NEED_AUTH == "true"; const location = useLocation(); const matches = useMatches(); if (!isAuthenticated && need_auth) { return ; } if (location.pathname === "/" && authStore.canRead("map")) { return ; } const lastMatch = matches[matches.length - 1] as | { handle?: { permissions?: string[] } } | undefined; const requiredPermissions = lastMatch?.handle?.permissions ?? []; if ( requiredPermissions.length > 0 && !requiredPermissions.every((permission) => authStore.canAccess(permission)) ) { return ; } return <>{children}; }; const ClearStoresWrapper: React.FC<{ children: React.ReactNode }> = ({ children, }) => { const location = useLocation(); useEffect(() => { editSightStore.clearSightInfo(); createSightStore.clearCreateSight(); runInAction(() => { editSightStore.hasLoadedCommon = false; }); if ( location.pathname.includes("create") || location.pathname.includes("edit") || location.pathname.includes("add") ) { languageStore.setLanguage("ru"); } }, [location]); return <>{children}; }; const router = createBrowserRouter([ { path: "/login", element: ( ), }, { path: "route-preview/:id", element: , }, { path: "demo/:id", element: , }, { path: "/", element: ( ), children: [ { index: true, element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/"], }, }, { path: "sight", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/sight"], }, }, { path: "sight/create", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/sight/create"], }, }, { path: "sight/:id/edit", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/sight/:id/edit"], }, }, { path: "devices", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/devices"], }, }, { path: "map", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/map"], }, }, { path: "media", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/media"], }, }, { path: "media/:id", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/media/:id"], }, }, { path: "media/:id/edit", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/media/:id/edit"], }, }, { path: "country", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/country"], }, }, { path: "country/create", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/country/create"], }, }, { path: "country/add", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/country/add"], }, }, { path: "country/:id/edit", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/country/:id/edit"], }, }, { path: "city", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/city"], }, }, { path: "city/create", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/city/create"], }, }, { path: "city/:id/edit", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/city/:id/edit"], }, }, { path: "route", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/route"], }, }, { path: "route/create", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/route/create"], }, }, { path: "route/:id/edit", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/route/:id/edit"], }, }, { path: "user", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/user"], }, }, { path: "user/create", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/user/create"], }, }, { path: "user/:id/edit", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/user/:id/edit"], }, }, { path: "snapshot", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/snapshot"], }, }, { path: "snapshot/create", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/snapshot/create"], }, }, { path: "carrier", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/carrier"], }, }, { path: "carrier/create", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/carrier/create"], }, }, { path: "carrier/:id/edit", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/carrier/:id/edit"], }, }, { path: "station", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/station"], }, }, { path: "station/create", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/station/create"], }, }, { path: "station/:id", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/station/:id"], }, }, { path: "station/:id/edit", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/station/:id/edit"], }, }, { path: "vehicle/create", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/vehicle/create"], }, }, { path: "vehicle/:id/edit", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/vehicle/:id/edit"], }, }, { path: "article", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/article"], }, }, { path: "article/:id", element: , handle: { permissions: ROUTE_REQUIRED_RESOURCES["/article/:id"], }, }, ], }, ]); export const Router = () => { return ; };