This commit is contained in:
Андрей Дувакин 2024-10-07 17:03:24 +05:00
parent 7e2bfc7489
commit 732809a25f
12 changed files with 78 additions and 21 deletions

View File

@ -10,12 +10,16 @@ import Statuses from "./pages/Statuses.jsx";
import Trucks from "./pages/Trucks.jsx";
import Users from "./pages/Users.jsx";
import DeliveryOrderDetails from "./pages/DeliveryOrderDetails.jsx";
import RoleRoute from "./components/RoleRoute.jsx";
const RoutesComponent = () => (
<Routes>
<Route path="/login" element={<Login />} />
<Route element={<PrivateRoute />}>
<Route path="/" element={<Home />} />
<Route path="/sub-orders/:id" element={<DeliveryOrderDetails />} />
<Route element={<RoleRoute allowedRoles={["Администратор"]} />}>
<Route path="/accessories" element={<Accessories />} />
<Route path="/cities" element={<Cities />} />
<Route path="/federal_districts" element={<FederalDistricts />} />
@ -23,7 +27,7 @@ const RoutesComponent = () => (
<Route path="/statuses" element={<Statuses />} />
<Route path="/trucks" element={<Trucks />} />
<Route path="/users" element={<Users />} />
<Route path="/sub-orders/:id" element={<DeliveryOrderDetails />} />
</Route>
</Route>
</Routes>
);

View File

@ -12,8 +12,14 @@ export const AuthProvider = ({ children }) => {
return savedAuth === "true";
});
const [role, setRole] = useState(() => {
const savedUser = localStorage.getItem("user");
return savedUser ? JSON.parse(savedUser).role : null;
});
const login = (userData) => {
setIsAuthenticated(true);
setRole(userData.user.role_name);
localStorage.setItem("token", userData.token);
localStorage.setItem("user", JSON.stringify(userData.user));
localStorage.setItem("isAuthenticated", true);
@ -21,6 +27,7 @@ export const AuthProvider = ({ children }) => {
const logout = () => {
setIsAuthenticated(false);
setRole(null);
localStorage.removeItem("token");
localStorage.removeItem("isAuthenticated");
localStorage.removeItem("user");
@ -31,7 +38,7 @@ export const AuthProvider = ({ children }) => {
}, [isAuthenticated]);
return (
<AuthContext.Provider value={{ isAuthenticated, login, logout }}>
<AuthContext.Provider value={{ isAuthenticated, role, login, logout }}>
{children}
</AuthContext.Provider>
);

View File

@ -0,0 +1,19 @@
import React from "react";
import { Navigate, Outlet } from "react-router-dom";
import { useAuth } from "../AuthContext";
const RoleRoute = ({ allowedRoles }) => {
const { isAuthenticated, role } = useAuth();
if (!isAuthenticated) {
return <Navigate to="/login" />;
}
if (allowedRoles && !allowedRoles.includes(role)) {
return <Navigate to="/" />;
}
return <Outlet />;
};
export default RoleRoute;

View File

@ -35,6 +35,9 @@ const Accessories = () => {
const data = await getAccessories();
setAccessories(data);
} catch (error) {
if (error.response && error.response.status === 401) {
navigate("/login");
}
console.error("Ошибка при загрузке аксессуаров:", error);
}
};
@ -44,6 +47,9 @@ const Accessories = () => {
const data = await getCities();
setCities(data);
} catch (error) {
if (error.response && error.response.status === 401) {
navigate("/login");
}
console.error("Ошибка при загрузке городов:", error);
}
};

View File

@ -1,7 +1,6 @@
import React, { useState, useEffect } from "react";
import SelectionDialog from "../components/SelectionDialog.jsx";
import { useNavigate } from "react-router-dom";
import { getAuthToken } from "../api.jsx";
import { getCoordinates } from "../geocoder.jsx";
import {
getCities,
@ -37,6 +36,9 @@ const Cities = () => {
const data = await getCities();
setCities(data);
} catch (error) {
if (error.response && error.response.status === 401) {
navigate("/login");
}
console.error("Ошибка при загрузке городов:", error);
}
};
@ -46,6 +48,9 @@ const Cities = () => {
const data = await getFederalDistricts();
setFederalDistricts(data);
} catch (error) {
if (error.response && error.response.status === 401) {
navigate("/login");
}
console.error("Ошибка при загрузке федеральных округов:", error);
}
};
@ -144,10 +149,6 @@ const Cities = () => {
setShowDistrictDialog(false);
};
if (getAuthToken() === null) {
navigate("/login");
}
return (
<div className="container mt-4">
<h3>Города</h3>

View File

@ -54,6 +54,9 @@ const DeliveryOrderDetails = () => {
longitude: accessory.longitude,
};
} else {
if (error.response && error.response.status === 401) {
navigate("/login");
}
const coords = await getCoordinates(accessory.city_name);
return { city: accessory.city_name, ...coords };
}

View File

@ -82,10 +82,6 @@ const FederalDistricts = () => {
setEditingDistrictId(null);
};
if (getAuthToken() === null) {
navigate("/login");
}
return (
<div className="container mt-4">
<h3>Федеральные округа</h3>

View File

@ -28,6 +28,9 @@ const Home = () => {
const data = await getStatuses();
setStatuses(data);
} catch (error) {
if (error.response && error.response.status === 401) {
navigate("/login");
}
console.error("Ошибка при загрузке статусов:", error);
} finally {
setLoadingStatuses(false);
@ -39,6 +42,9 @@ const Home = () => {
const orders = await getTotalOrders();
setTotalOrders(orders);
} catch (error) {
if (error.response && error.response.status === 401) {
navigate("/login");
}
console.error("Ошибка при загрузке заказов:", error);
} finally {
setLoadingOrders(false);

View File

@ -21,6 +21,9 @@ const Roles = () => {
const data = await getRoles();
setRoles(data);
} catch (error) {
if (error.response && error.response.status === 401) {
navigate("/login");
}
console.error("Ошибка при загрузке ролей:", error);
}
};

View File

@ -26,6 +26,9 @@ const Statuses = () => {
const data = await getStatuses();
setStatuses(data);
} catch (error) {
if (error.response && error.response.status === 401) {
navigate("/login");
}
console.error("Ошибка при загрузке статусов:", error);
}
};

View File

@ -23,6 +23,9 @@ const Trucks = () => {
const data = await getTrucks();
setTrucks(data);
} catch (error) {
if (error.response && error.response.status === 401) {
navigate("/login");
}
console.error("Ошибка при загрузке грузовиков:", error);
}
};

View File

@ -36,6 +36,9 @@ const Users = () => {
console.log(data);
setUsers(data);
} catch (error) {
if (error.response && error.response.status === 401) {
navigate("/login");
}
console.error("Ошибка при загрузке пользователей:", error);
}
};
@ -45,6 +48,9 @@ const Users = () => {
const data = await getRoles();
setRoles(data);
} catch (error) {
if (error.response && error.response.status === 401) {
navigate("/login");
}
console.error("Ошибка при загрузке ролей:", error);
}
};