feature/webgl-preview-update (#21)
Co-authored-by: itoshi <kkzemeow@gmail.com> Reviewed-on: #21
This commit was merged in pull request #21.
This commit is contained in:
@@ -16,33 +16,35 @@ import {
|
||||
SnapshotListPage,
|
||||
CarrierListPage,
|
||||
StationListPage,
|
||||
// VehicleListPage,
|
||||
ArticleListPage,
|
||||
|
||||
// CountryPreviewPage,
|
||||
// VehiclePreviewPage,
|
||||
// CarrierPreviewPage,
|
||||
SnapshotCreatePage,
|
||||
CountryCreatePage,
|
||||
CityCreatePage,
|
||||
CarrierCreatePage,
|
||||
VehicleCreatePage,
|
||||
VehicleEditPage,
|
||||
CountryEditPage,
|
||||
CityEditPage,
|
||||
UserCreatePage,
|
||||
UserEditPage,
|
||||
// VehicleEditPage,
|
||||
CarrierEditPage,
|
||||
StationCreatePage,
|
||||
StationPreviewPage,
|
||||
StationEditPage,
|
||||
RouteCreatePage,
|
||||
RoutePreview,
|
||||
DemoPage,
|
||||
RouteEditPage,
|
||||
ArticlePreviewPage,
|
||||
CountryAddPage,
|
||||
} from "@pages";
|
||||
import { authStore, createSightStore, editSightStore } from "@shared";
|
||||
import {
|
||||
authStore,
|
||||
createSightStore,
|
||||
editSightStore,
|
||||
languageStore,
|
||||
ROUTE_REQUIRED_RESOURCES,
|
||||
} from "@shared";
|
||||
import { Layout } from "@widgets";
|
||||
import { runInAction } from "mobx";
|
||||
import React, { useEffect } from "react";
|
||||
@@ -53,11 +55,14 @@ import {
|
||||
Navigate,
|
||||
Outlet,
|
||||
useLocation,
|
||||
useMatches,
|
||||
} from "react-router-dom";
|
||||
|
||||
const PublicRoute = ({ children }: { children: React.ReactNode }) => {
|
||||
const { isAuthenticated } = authStore;
|
||||
if (isAuthenticated) {
|
||||
const need_auth = import.meta.env.VITE_NEED_AUTH == "true";
|
||||
|
||||
if (isAuthenticated || !need_auth) {
|
||||
return <Navigate to="/map" replace />;
|
||||
}
|
||||
return <>{children}</>;
|
||||
@@ -65,17 +70,37 @@ const PublicRoute = ({ children }: { children: React.ReactNode }) => {
|
||||
|
||||
const ProtectedRoute = ({ children }: { children: React.ReactNode }) => {
|
||||
const { isAuthenticated } = authStore;
|
||||
const need_auth = import.meta.env.VITE_NEED_AUTH == "true";
|
||||
|
||||
const location = useLocation();
|
||||
if (!isAuthenticated) {
|
||||
const matches = useMatches();
|
||||
|
||||
if (!isAuthenticated && need_auth) {
|
||||
return <Navigate to="/login" replace />;
|
||||
}
|
||||
if (location.pathname === "/") {
|
||||
|
||||
if (location.pathname === "/" && authStore.canRead("map")) {
|
||||
return <Navigate to="/map" replace />;
|
||||
}
|
||||
|
||||
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))
|
||||
) {
|
||||
if (location.pathname === "/devices" && authStore.hasRole("devices_maintenance_rw")) {
|
||||
return <>{children}</>;
|
||||
}
|
||||
return <Navigate to="/" replace />;
|
||||
}
|
||||
|
||||
return <>{children}</>;
|
||||
};
|
||||
|
||||
// Чтобы очистка сторов происходила при смене локации
|
||||
const ClearStoresWrapper: React.FC<{ children: React.ReactNode }> = ({
|
||||
children,
|
||||
}) => {
|
||||
@@ -87,6 +112,14 @@ const ClearStoresWrapper: React.FC<{ children: React.ReactNode }> = ({
|
||||
runInAction(() => {
|
||||
editSightStore.hasLoadedCommon = false;
|
||||
});
|
||||
|
||||
if (
|
||||
location.pathname.includes("create") ||
|
||||
location.pathname.includes("edit") ||
|
||||
location.pathname.includes("add")
|
||||
) {
|
||||
languageStore.setLanguage("ru");
|
||||
}
|
||||
}, [location]);
|
||||
|
||||
return <>{children}</>;
|
||||
@@ -101,7 +134,14 @@ const router = createBrowserRouter([
|
||||
</PublicRoute>
|
||||
),
|
||||
},
|
||||
{ path: "route-preview/:id", element: <RoutePreview /> },
|
||||
{
|
||||
path: "route-preview/:id",
|
||||
element: <RoutePreview />,
|
||||
},
|
||||
{
|
||||
path: "demo/:id",
|
||||
element: <DemoPage />,
|
||||
},
|
||||
{
|
||||
path: "/",
|
||||
element: (
|
||||
@@ -114,67 +154,258 @@ const router = createBrowserRouter([
|
||||
</ProtectedRoute>
|
||||
),
|
||||
children: [
|
||||
{ index: true, element: <MainPage /> },
|
||||
{
|
||||
index: true,
|
||||
element: <MainPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/"],
|
||||
},
|
||||
},
|
||||
|
||||
// Sight
|
||||
{ path: "sight", element: <SightListPage /> },
|
||||
{ path: "sight/create", element: <CreateSightPage /> },
|
||||
{ path: "sight/:id/edit", element: <EditSightPage /> },
|
||||
{
|
||||
path: "sight",
|
||||
element: <SightListPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/sight"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "sight/create",
|
||||
element: <CreateSightPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/sight/create"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "sight/:id/edit",
|
||||
element: <EditSightPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/sight/:id/edit"],
|
||||
},
|
||||
},
|
||||
|
||||
// Device
|
||||
{ path: "devices", element: <DevicesPage /> },
|
||||
{
|
||||
path: "devices",
|
||||
element: <DevicesPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/devices"],
|
||||
},
|
||||
},
|
||||
|
||||
// Map
|
||||
{ path: "map", element: <MapPage /> },
|
||||
{
|
||||
path: "map",
|
||||
element: <MapPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/map"],
|
||||
},
|
||||
},
|
||||
|
||||
// Media
|
||||
{ path: "media", element: <MediaListPage /> },
|
||||
{ path: "media/:id", element: <MediaPreviewPage /> },
|
||||
{ path: "media/:id/edit", element: <MediaEditPage /> },
|
||||
{
|
||||
path: "media",
|
||||
element: <MediaListPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/media"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "media/:id",
|
||||
element: <MediaPreviewPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/media/:id"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "media/:id/edit",
|
||||
element: <MediaEditPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/media/:id/edit"],
|
||||
},
|
||||
},
|
||||
|
||||
// Country
|
||||
{ path: "country", element: <CountryListPage /> },
|
||||
{ path: "country/create", element: <CountryCreatePage /> },
|
||||
{ path: "country/add", element: <CountryAddPage /> },
|
||||
// { path: "country/:id", element: <CountryPreviewPage /> },
|
||||
{ path: "country/:id/edit", element: <CountryEditPage /> },
|
||||
// City
|
||||
{ path: "city", element: <CityListPage /> },
|
||||
{ path: "city/create", element: <CityCreatePage /> },
|
||||
// { path: "city/:id", element: <CityPreviewPage /> },
|
||||
{ path: "city/:id/edit", element: <CityEditPage /> },
|
||||
// Route
|
||||
{ path: "route", element: <RouteListPage /> },
|
||||
{ path: "route/create", element: <RouteCreatePage /> },
|
||||
{ path: "route/:id/edit", element: <RouteEditPage /> },
|
||||
{
|
||||
path: "country",
|
||||
element: <CountryListPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/country"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "country/create",
|
||||
element: <CountryCreatePage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/country/create"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "country/add",
|
||||
element: <CountryAddPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/country/add"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "country/:id/edit",
|
||||
element: <CountryEditPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/country/:id/edit"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "city",
|
||||
element: <CityListPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/city"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "city/create",
|
||||
element: <CityCreatePage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/city/create"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "city/:id/edit",
|
||||
element: <CityEditPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/city/:id/edit"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "route",
|
||||
element: <RouteListPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/route"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "route/create",
|
||||
element: <RouteCreatePage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/route/create"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "route/:id/edit",
|
||||
element: <RouteEditPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/route/:id/edit"],
|
||||
},
|
||||
},
|
||||
|
||||
// User
|
||||
{ path: "user", element: <UserListPage /> },
|
||||
{ path: "user/create", element: <UserCreatePage /> },
|
||||
{ path: "user/:id/edit", element: <UserEditPage /> },
|
||||
// Snapshot
|
||||
{ path: "snapshot", element: <SnapshotListPage /> },
|
||||
{ path: "snapshot/create", element: <SnapshotCreatePage /> },
|
||||
{
|
||||
path: "user",
|
||||
element: <UserListPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/user"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "user/create",
|
||||
element: <UserCreatePage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/user/create"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "user/:id/edit",
|
||||
element: <UserEditPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/user/:id/edit"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "snapshot",
|
||||
element: <SnapshotListPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/snapshot"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "snapshot/create",
|
||||
element: <SnapshotCreatePage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/snapshot/create"],
|
||||
},
|
||||
},
|
||||
|
||||
// Carrier
|
||||
{ path: "carrier", element: <CarrierListPage /> },
|
||||
{ path: "carrier/create", element: <CarrierCreatePage /> },
|
||||
// { path: "carrier/:id", element: <CarrierPreviewPage /> },
|
||||
{ path: "carrier/:id/edit", element: <CarrierEditPage /> },
|
||||
// Station
|
||||
{ path: "station", element: <StationListPage /> },
|
||||
{ path: "station/create", element: <StationCreatePage /> },
|
||||
{ path: "station/:id", element: <StationPreviewPage /> },
|
||||
{ path: "station/:id/edit", element: <StationEditPage /> },
|
||||
// Vehicle
|
||||
// { path: "vehicle", element: <VehicleListPage /> },
|
||||
{ path: "vehicle/create", element: <VehicleCreatePage /> },
|
||||
// { path: "vehicle/:id", element: <VehiclePreviewPage /> },
|
||||
// { path: "vehicle/:id/edit", element: <VehicleEditPage /> },
|
||||
// Article
|
||||
{ path: "article", element: <ArticleListPage /> },
|
||||
{ path: "article/:id", element: <ArticlePreviewPage /> },
|
||||
// { path: "media/create", element: <CreateMediaPage /> },
|
||||
{
|
||||
path: "carrier",
|
||||
element: <CarrierListPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/carrier"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "carrier/create",
|
||||
element: <CarrierCreatePage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/carrier/create"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "carrier/:id/edit",
|
||||
element: <CarrierEditPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/carrier/:id/edit"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "station",
|
||||
element: <StationListPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/station"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "station/create",
|
||||
element: <StationCreatePage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/station/create"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "station/:id",
|
||||
element: <StationPreviewPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/station/:id"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "station/:id/edit",
|
||||
element: <StationEditPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/station/:id/edit"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "vehicle/create",
|
||||
element: <VehicleCreatePage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/vehicle/create"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "vehicle/:id/edit",
|
||||
element: <VehicleEditPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/vehicle/:id/edit"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "article",
|
||||
element: <ArticleListPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/article"],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "article/:id",
|
||||
element: <ArticlePreviewPage />,
|
||||
handle: {
|
||||
permissions: ROUTE_REQUIRED_RESOURCES["/article/:id"],
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
|
||||
Reference in New Issue
Block a user