diff --git a/src/AppRouter.jsx b/src/AppRouter.jsx index 4ccea93..3bb524b 100755 --- a/src/AppRouter.jsx +++ b/src/AppRouter.jsx @@ -10,20 +10,24 @@ 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 = () => ( } /> }> } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> } /> + + }> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + ); diff --git a/src/AuthContext.jsx b/src/AuthContext.jsx index 4b403cb..c38625f 100644 --- a/src/AuthContext.jsx +++ b/src/AuthContext.jsx @@ -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 ( - + {children} ); diff --git a/src/components/RoleRoute.jsx b/src/components/RoleRoute.jsx new file mode 100644 index 0000000..a219c39 --- /dev/null +++ b/src/components/RoleRoute.jsx @@ -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 ; + } + + if (allowedRoles && !allowedRoles.includes(role)) { + return ; + } + + return ; +}; + +export default RoleRoute; diff --git a/src/pages/Accessories.jsx b/src/pages/Accessories.jsx index 64e5725..2ac27e9 100644 --- a/src/pages/Accessories.jsx +++ b/src/pages/Accessories.jsx @@ -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); } }; diff --git a/src/pages/Cities.jsx b/src/pages/Cities.jsx index 7c2b14f..7c4b232 100644 --- a/src/pages/Cities.jsx +++ b/src/pages/Cities.jsx @@ -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 (

Города

diff --git a/src/pages/DeliveryOrderDetails.jsx b/src/pages/DeliveryOrderDetails.jsx index 418de0f..5aa56f6 100644 --- a/src/pages/DeliveryOrderDetails.jsx +++ b/src/pages/DeliveryOrderDetails.jsx @@ -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 }; } diff --git a/src/pages/FederalDistricts.jsx b/src/pages/FederalDistricts.jsx index 10ad377..10087d2 100644 --- a/src/pages/FederalDistricts.jsx +++ b/src/pages/FederalDistricts.jsx @@ -82,10 +82,6 @@ const FederalDistricts = () => { setEditingDistrictId(null); }; - if (getAuthToken() === null) { - navigate("/login"); - } - return (

Федеральные округа

diff --git a/src/pages/Home.jsx b/src/pages/Home.jsx index 106e201..c8a33e7 100644 --- a/src/pages/Home.jsx +++ b/src/pages/Home.jsx @@ -12,7 +12,7 @@ const Home = () => { const [expandedOrderId, setExpandedOrderId] = useState(null); const [loadingStatuses, setLoadingStatuses] = useState(true); const [loadingOrders, setLoadingOrders] = useState(true); - const [loadingCreateOrder, setLoadingCreateOrder] = useState(false); + const [loadingCreateOrder, setLoadingCreateOrder] = useState(false); const [deliveryOrdersCount, setDeliveryOrdersCount] = useState(0); const [deadline, setDeadline] = useState(new Date()); const navigate = useNavigate(); @@ -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); @@ -46,7 +52,7 @@ const Home = () => { }; const handleCreateOrder = async () => { - setLoadingCreateOrder(true); + setLoadingCreateOrder(true); try { await calculateTotalOrder(); alert("Начался расчет маршрутов. Заказ скоро появится в списке заказов."); @@ -54,7 +60,7 @@ const Home = () => { } catch (error) { console.error("Ошибка при расчете заказа:", error); } finally { - setLoadingCreateOrder(false); + setLoadingCreateOrder(false); } }; @@ -88,7 +94,7 @@ const Home = () => {