diff --git a/frontend/src/api/index.js b/frontend/src/api/index.js index 04a084e..6d79b20 100644 --- a/frontend/src/api/index.js +++ b/frontend/src/api/index.js @@ -48,7 +48,7 @@ export const createOrder = (data) => axios.post(`${API_URL}/orders/`, data); export const getUserOrders = () => axios.get(`${API_URL}/orders`); export const getOrder = (id) => axios.get(`${API_URL}/orders/${id}`); -export const updateProfile = (data) => axios.patch(`${API_URL}/profile`); +export const updateProfile = (data) => axios.patch(`${API_URL}/profile`, data); export const getUserInfo = () => axios.get(`${API_URL}/profile`); export const uploadItemAvatar = (id, file) => { @@ -58,3 +58,9 @@ export const uploadItemAvatar = (id, file) => { headers: { "Content-Type": "multipart/form-data" }, }); }; + +export const getAllOrders = () => axios.get(`${API_URL}/admin/orders`); +export const updateOrderStatus = (id, data) => + axios.patch(`${API_URL}/admin/orders/${id}`, data); +export const registerAdmin = (data) => + axios.post(`${API_URL}/admin/register`, data); diff --git a/frontend/src/components/AdminOrders.jsx b/frontend/src/components/AdminOrders.jsx new file mode 100644 index 0000000..c047849 --- /dev/null +++ b/frontend/src/components/AdminOrders.jsx @@ -0,0 +1,94 @@ +import { useState, useEffect } from "react"; +import { getAllOrders, updateOrderStatus } from "../api/index"; + +const STATUSES = [ + { value: "new", label: "Новый" }, + { value: "packed", label: "Собран" }, + { value: "delivered", label: "Доставлен" }, + { value: "cancel", label: "Отменён" }, +]; + +export default function AdminOrders() { + const [orders, setOrders] = useState([]); + const [loading, setLoading] = useState(true); + + const loadOrders = () => { + getAllOrders() + .then((res) => setOrders(res.data)) + .catch(() => { }) + .finally(() => setLoading(false)); + }; + + useEffect(() => { + loadOrders(); + }, []); + + const handleStatusChange = async (id, newStatus) => { + try { + await updateOrderStatus(id, { status: newStatus }); + setOrders((prev) => + prev.map((o) => (o.id === id ? { ...o, status: newStatus } : o)), + ); + } catch { + alert("Не удалось изменить статус"); + } + }; + + if (loading) return

Загрузка...

; + + return ( +
+ {orders.length === 0 ? ( +

Заказов нет

+ ) : ( + orders.map((order) => ( +
+ {/* шапка: номер + селект статуса */} +
+ Заказ #{order.id} + +
+ + {/* товары заказа */} +
+ {order.items?.map((oi) => ( +
+ + {oi.item?.name} + + {oi.quantity} {oi.item?.unit} × {oi.price} ₽ + +
+ ))} +
+ + {/* подвал: адрес + итог */} +
+ {order.delivery_address} + + Итого: {order.total_price} ₽ + +
+
+ )) + )} +
+ ); +} diff --git a/frontend/src/pages/AdminPage.jsx b/frontend/src/pages/AdminPage.jsx index 645bc6f..63da5a3 100644 --- a/frontend/src/pages/AdminPage.jsx +++ b/frontend/src/pages/AdminPage.jsx @@ -1,7 +1,7 @@ import { useState } from "react"; import PageLayout from "../components/PageLayout"; import AdminItems from "../components/AdminItems"; -// import AdminOrders from "../components/AdminOrders"; // добавим позже +import AdminOrders from "../components/AdminOrders"; // добавим позже // import AdminStaff from "../components/AdminStaff"; // добавим позже export default function AdminPage() { @@ -38,9 +38,7 @@ export default function AdminPage() { {/* Содержимое активной вкладки */} {tab === "items" && } - {tab === "orders" && ( -

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

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

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

)}