import { useState, useEffect } from 'react'; import { useRouter } from 'next/router'; import Link from 'next/link'; import Image from 'next/image'; import { Trash2, Plus, Minus, ShoppingBag } from 'lucide-react'; import Header from '../components/Header'; import Footer from '../components/Footer'; import cartService, { Cart, CartItem } from '../services/cart'; import authService from '../services/auth'; export default function CartPage() { const router = useRouter(); const [cart, setCart] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); // Загрузка корзины при монтировании компонента useEffect(() => { const fetchCart = async () => { try { // Проверяем, авторизован ли пользователь if (!authService.isAuthenticated()) { router.push('/login?redirect=/cart'); return; } setLoading(true); const cartData = await cartService.getCart(); setCart(cartData); setError(null); } catch (err) { console.error('Ошибка при загрузке корзины:', err); setError('Не удалось загрузить корзину. Пожалуйста, попробуйте позже.'); } finally { setLoading(false); } }; fetchCart(); }, [router]); // Обработчик изменения количества товара const handleQuantityChange = async (itemId: number, newQuantity: number) => { if (newQuantity < 1) return; try { // Сохраняем текущий порядок элементов const currentItems = cart?.items || []; await cartService.updateCartItem(itemId, { quantity: newQuantity }); // Обновляем корзину после изменения, но сохраняем порядок const updatedCart = await cartService.getCart(); // Сортируем элементы в том же порядке, что и были if (updatedCart && currentItems.length > 0) { const itemMap = new Map(currentItems.map(item => [item.id, item])); const sortedItems = updatedCart.items.sort((a, b) => { const indexA = currentItems.findIndex(item => item.id === a.id); const indexB = currentItems.findIndex(item => item.id === b.id); return indexA - indexB; }); updatedCart.items = sortedItems; } setCart(updatedCart); } catch (err) { console.error('Ошибка при обновлении количества:', err); setError('Не удалось обновить количество товара. Пожалуйста, попробуйте позже.'); } }; // Обработчик удаления товара из корзины const handleRemoveItem = async (itemId: number) => { try { // Сохраняем текущий порядок элементов const currentItems = cart?.items.filter(item => item.id !== itemId) || []; await cartService.removeFromCart(itemId); // Обновляем корзину после удаления, но сохраняем порядок const updatedCart = await cartService.getCart(); // Сортируем элементы в том же порядке, что и были if (updatedCart && currentItems.length > 0) { const sortedItems = updatedCart.items.sort((a, b) => { const indexA = currentItems.findIndex(item => item.id === a.id); const indexB = currentItems.findIndex(item => item.id === b.id); return indexA - indexB; }); updatedCart.items = sortedItems; } setCart(updatedCart); } catch (err) { console.error('Ошибка при удалении товара:', err); setError('Не удалось удалить товар из корзины. Пожалуйста, попробуйте позже.'); } }; // Обработчик очистки корзины const handleClearCart = async () => { try { await cartService.clearCart(); // Обновляем корзину после очистки const updatedCart = await cartService.getCart(); setCart(updatedCart); } catch (err) { console.error('Ошибка при очистке корзины:', err); setError('Не удалось очистить корзину. Пожалуйста, попробуйте позже.'); } }; // Переход к оформлению заказа const handleCheckout = () => { router.push('/checkout'); }; // Функция для корректного отображения URL изображения const getImageUrl = (imageUrl: string | undefined): string => { if (!imageUrl) return '/placeholder-image.jpg'; // Проверяем, начинается ли URL с http или https if (imageUrl.startsWith('http://') || imageUrl.startsWith('https://')) { return imageUrl; } // Формируем базовый URL для изображений const baseUrl = process.env.NEXT_PUBLIC_API_URL || 'http://127.0.0.1:8000/api'; const apiBaseUrl = baseUrl.replace(/\/api$/, ''); // Убираем '/api' в конце, если есть // Если URL начинается с /, добавляем базовый URL API if (imageUrl.startsWith('/')) { return `${apiBaseUrl}${imageUrl}`; } // В остальных случаях добавляем базовый URL API и / return `${apiBaseUrl}/${imageUrl}`; }; return (

Корзина

{loading ? (
) : error ? (
{error}
) : cart && cart.items.length > 0 ? (
{/* Список товаров в корзине */}

Товары в корзине ({cart.items_count})

{cart.items.map((item) => (
{/* Изображение товара */}
{item.product_image ? ( {item.product_name} ) : (
)}
{/* Информация о товаре */}

{item.product_name}

Вариант: {item.variant_name}

{item.total_price.toLocaleString('ru-RU')} ₽

{item.product_price.toLocaleString('ru-RU')} ₽ за шт.

{/* Управление количеством и удаление */}
{item.quantity}
))}
{/* Сводка заказа */}

Сводка заказа

Товары ({cart.items_count}) {cart.total_amount.toLocaleString('ru-RU')} ₽
Доставка Бесплатно
Итого {cart.total_amount.toLocaleString('ru-RU')} ₽
Продолжить покупки
) : (

Ваша корзина пуста

Добавьте товары в корзину, чтобы оформить заказ

Перейти к покупкам
)}
); }