._.
This commit is contained in:
parent
7e2bfc7489
commit
732809a25f
@ -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 = () => (
|
||||
<Routes>
|
||||
<Route path="/login" element={<Login />} />
|
||||
<Route element={<PrivateRoute />}>
|
||||
<Route path="/" element={<Home />} />
|
||||
<Route path="/accessories" element={<Accessories />} />
|
||||
<Route path="/cities" element={<Cities />} />
|
||||
<Route path="/federal_districts" element={<FederalDistricts />} />
|
||||
<Route path="/roles" element={<Roles />} />
|
||||
<Route path="/statuses" element={<Statuses />} />
|
||||
<Route path="/trucks" element={<Trucks />} />
|
||||
<Route path="/users" element={<Users />} />
|
||||
<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 />} />
|
||||
<Route path="/roles" element={<Roles />} />
|
||||
<Route path="/statuses" element={<Statuses />} />
|
||||
<Route path="/trucks" element={<Trucks />} />
|
||||
<Route path="/users" element={<Users />} />
|
||||
</Route>
|
||||
</Route>
|
||||
</Routes>
|
||||
);
|
||||
|
||||
@ -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>
|
||||
);
|
||||
|
||||
19
src/components/RoleRoute.jsx
Normal file
19
src/components/RoleRoute.jsx
Normal 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;
|
||||
@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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 };
|
||||
}
|
||||
|
||||
@ -82,10 +82,6 @@ const FederalDistricts = () => {
|
||||
setEditingDistrictId(null);
|
||||
};
|
||||
|
||||
if (getAuthToken() === null) {
|
||||
navigate("/login");
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="container mt-4">
|
||||
<h3>Федеральные округа</h3>
|
||||
|
||||
@ -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 = () => {
|
||||
<button
|
||||
className="btn btn-primary"
|
||||
onClick={handleCreateOrder}
|
||||
disabled={loadingCreateOrder || loadingStatuses}
|
||||
disabled={loadingCreateOrder || loadingStatuses}
|
||||
>
|
||||
{loadingCreateOrder ? (
|
||||
<>
|
||||
|
||||
@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user