diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index d39847f..340bc4e 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -9,6 +9,7 @@ import Contact from "./pages/Contact"; import Cart from "./pages/Cart"; import Profile from "./pages/Profile"; import ItemPage from "./pages/ItemPage"; +import AdminPage from "./pages/AdminPage"; const PrivateRoute = ({ children }) => { const token = localStorage.getItem("token"); @@ -19,6 +20,21 @@ const PrivateRoute = ({ children }) => { return children; }; +const AdminRoute = ({ children }) => { + const token = localStorage.getItem("token"); + const user = JSON.parse(localStorage.getItem("user") || "{}"); + + if (!token) { + return ; + } + + if (user.role !== "Админ") { + return ; + } + + return children; +}; + export default function App() { return ( @@ -38,6 +54,14 @@ export default function App() { } /> + + + + } + /> } /> } /> diff --git a/frontend/src/components/AdminItems.jsx b/frontend/src/components/AdminItems.jsx new file mode 100644 index 0000000..fcf463d --- /dev/null +++ b/frontend/src/components/AdminItems.jsx @@ -0,0 +1,94 @@ +import { useState, useEffect } from "react"; +import { getAllItems, deleteItem } from "../api/index"; + +export default function AdminItems() { + const [items, setItems] = useState([]); + const [loading, setLoading] = useState(true); + + const loadItems = () => { + getAllItems() + .then((res) => setItems(res.data)) + .catch(() => { }) + .finally(() => setLoading(false)); + }; + + useEffect(() => { + loadItems(); + }, []); + + const handleDelete = async (id, name) => { + if (!confirm(`Удалить товар "${name}"?`)) return; + try { + await deleteItem(id); + setItems((prev) => prev.filter((it) => it.id !== id)); + } catch { + alert("Не удалось удалить товар"); + } + }; + + if (loading) return

Загрузка...

; + + return ( +
+ {/* Кнопка добавления (форму подключим следующим шагом) */} + + + {/* Таблица товаров */} +
+ + + + + + + + + + + + + + {items.map((item) => ( + + + + + + + + + + ))} + +
ФотоНазваниеКатегорияЦенаОстатокТипДействия
+ + {item.name}{item.category}{item.price} ₽ + {item.stock} {item.unit} + + {item.unit_type === "piece" ? "шт" : "вес"} + +
+ + +
+
+
+
+ ); +} diff --git a/frontend/src/pages/AdminPage.jsx b/frontend/src/pages/AdminPage.jsx new file mode 100644 index 0000000..645bc6f --- /dev/null +++ b/frontend/src/pages/AdminPage.jsx @@ -0,0 +1,50 @@ +import { useState } from "react"; +import PageLayout from "../components/PageLayout"; +import AdminItems from "../components/AdminItems"; +// import AdminOrders from "../components/AdminOrders"; // добавим позже +// import AdminStaff from "../components/AdminStaff"; // добавим позже + +export default function AdminPage() { + const [tab, setTab] = useState("items"); + + const tabs = [ + { key: "items", label: "Товары" }, + { key: "orders", label: "Заказы" }, + { key: "staff", label: "Сотрудники" }, + ]; + + return ( + +
+

+ Админ-панель +

+ + {/* Вкладки */} +
+ {tabs.map((t) => ( + + ))} +
+ + {/* Содержимое активной вкладки */} + {tab === "items" && } + {tab === "orders" && ( +

Раздел заказов — в разработке

+ )} + {tab === "staff" && ( +

Раздел сотрудников — в разработке

+ )} +
+
+ ); +}