From d9745d972aa5a8b21926c05c6bbc3e3a59df988f Mon Sep 17 00:00:00 2001 From: LeonG11 Date: Tue, 23 Jun 2026 16:39:57 +0300 Subject: [PATCH] feat: add page cart --- frontend/src/App.jsx | 9 ++++++ frontend/src/api/index.js | 5 ++++ frontend/src/pages/Cart.jsx | 56 +++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 frontend/src/pages/Cart.jsx diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 8e8a441..aada74e 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -6,6 +6,7 @@ import About from "./pages/About"; import Shop from "./pages/Shop"; import NotFoundPage from "./pages/NotFoundPage"; import Contact from "./pages/Contact"; +import Cart from "./pages/Cart"; const PrivateRoute = ({ children }) => { const token = localStorage.getItem("token"); @@ -26,6 +27,14 @@ export default function App() { } /> } /> } /> + + + + } + /> } /> diff --git a/frontend/src/api/index.js b/frontend/src/api/index.js index cc51a59..a357a28 100644 --- a/frontend/src/api/index.js +++ b/frontend/src/api/index.js @@ -38,3 +38,8 @@ export const updateItem = (id, itemData) => export const deleteItem = (id) => axios.delete(`${API_URL}/items/${id}`); export const getAllCategories = () => axios.get(`${API_URL}/getCategories`) + +export const getCart = () => axios.get(`${API_URL}/cart/`); +export const addToCart = (data) => axios.post(`${API_URL}/cart/`, data) +export const updateCartItem = (id, data) => axios.post(`${API_URL}/cart/${id}`, data) +export const removeFromCart = (id) => axios.post(`${API_URL}/cart/${id}`) diff --git a/frontend/src/pages/Cart.jsx b/frontend/src/pages/Cart.jsx new file mode 100644 index 0000000..f9ec8c3 --- /dev/null +++ b/frontend/src/pages/Cart.jsx @@ -0,0 +1,56 @@ +import { useState, useEffect } from "react"; +import PageLayout from "../components/PageLayout"; +import { getCart } from "../api/index"; +export default function Cart() { + const [items, setItems] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + getCart() + .then((res) => { + setItems(res.data); + }) + .catch(() => setError("Не удалось загрузить товары")) + .finally(() => setLoading(false)); + }, []); + + const total = items.reduce((sum, ci) => sum + ci.quantity * ci.item.price, 0); + + if (loading) { + return ( + +

Загрузка товаров

+
+ ); + } + return ( + +
+

+ Корзина +

+ {error &&

{error}

} + {items.length === 0 ? ( +

Корзина пуста

+ ) : ( +
+ {items.map((ci) => ( +
+ {ci.item.name} + + {ci.quanitity} x {ci.item.price} ={" "} + {ci.quantity * ci.item.price} + +
+ ))} +
Итого: {total}р.
+
+ )} +
+
+ ); +}