import React, { useState, useEffect } from 'react'; import { Box, Typography, Card, CardContent, CardMedia, Button, Grid, Chip, CircularProgress, Alert, Modal, } from '@mui/material'; import { GridItem } from '../components/GridItem'; import { ShoppingBag, Inventory, LocalShipping, Code } from '@mui/icons-material'; import { useAuth } from '../context/AuthContext'; import { apiService } from '../services/api'; import type { Reward } from '../types'; export const ShopPage: React.FC = () => { const { user, updateUser } = useAuth(); const [rewards, setRewards] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [selectedReward, setSelectedReward] = useState(null); const [purchaseModalOpen, setPurchaseModalOpen] = useState(false); const [instructionModalOpen, setInstructionModalOpen] = useState(false); const [purchasing, setPurchasing] = useState(false); useEffect(() => { const fetchRewards = async () => { try { const response = await apiService.getAllRewards(); if (response.success && response.data) { setRewards(response.data); } else { setError('Не удалось загрузить призы'); } } catch (err) { console.error('Error fetching rewards:', err); setError('Произошла ошибка при загрузке призов'); } finally { setLoading(false); } }; fetchRewards(); }, []); const handlePurchase = async (reward: Reward) => { setSelectedReward(reward); setPurchaseModalOpen(true); }; const confirmPurchase = async () => { if (!selectedReward) return; setPurchasing(true); try { const response = await apiService.purchaseReward(selectedReward.id); if (response.success) { setPurchaseModalOpen(false); setInstructionModalOpen(true); // Refresh user data to update balance try { const userResponse = await apiService.getCurrentUser(); if (userResponse.success && userResponse.data) { updateUser({ stars_balance: userResponse.data.stars_balance }); } } catch (err) { console.error('Error refreshing user data:', err); } } else { setError(response.message || 'Не удалось приобрести приз'); } } catch (err) { console.error('Error purchasing reward:', err); setError('Произошла ошибка при покупке'); } finally { setPurchasing(false); } }; const canAfford = (price: number) => { return user && user.stars_balance >= price; }; const isInStock = (stock: number) => { return stock === 0 || stock > 0; }; if (loading) { return ( ); } if (error) { return ( {error} ); } return ( {/* Header */} Магазин призов 🛍️ Ваш баланс: {user?.stars_balance} ⭐ {/* Rewards Grid */} {rewards.map((reward) => ( {reward.title} {reward.description} {/* Price and Status */} : } label={reward.delivery_type === 'physical' ? 'Физический' : 'Цифровой'} size="small" sx={{ backgroundColor: 'rgba(255, 255, 255, 0.1)', color: '#ffffff', }} /> {!isInStock(reward.stock) && ( } label="Нет в наличии" size="small" sx={{ backgroundColor: 'rgba(244, 67, 54, 0.2)', color: '#f44336', }} /> )} {/* Action Button */} ))} {rewards.length === 0 && ( Пока нет доступных призов Загляните позже - призы появятся скоро! )} {/* Purchase Confirmation Modal */} setPurchaseModalOpen(false)} sx={{ display: 'flex', alignItems: 'center', justifyContent: 'center', }} > Подтверждение покупки Вы уверены, что хотите купить "{selectedReward?.title}" за {selectedReward?.price_stars} ⭐? {/* Instructions Modal */} setInstructionModalOpen(false)} sx={{ display: 'flex', alignItems: 'center', justifyContent: 'center', }} > Покупка успешно оформлена! 🎉 {selectedReward?.instructions} ); };