// src/renderer/pages/Marketplace.tsx import { useEffect, useState } from 'react'; import { Box, Typography, CircularProgress, Button, Grid, Card, CardContent, CardMedia, Pagination, Tabs, Tab, Alert, Snackbar, } from '@mui/material'; import { isPlayerOnline, getPlayerServer } from '../utils/playerOnlineCheck'; import { buyItem, fetchMarketplace, MarketplaceResponse, Server } from '../api'; import PlayerInventory from '../components/PlayerInventory'; interface TabPanelProps { children?: React.ReactNode; index: number; value: number; } function TabPanel(props: TabPanelProps) { const { children, value, index, ...other } = props; return ( ); } export default function Marketplace() { const [loading, setLoading] = useState(true); const [marketLoading, setMarketLoading] = useState(false); const [isOnline, setIsOnline] = useState(false); const [username, setUsername] = useState(''); const [playerServer, setPlayerServer] = useState(null); const [marketItems, setMarketItems] = useState( null, ); const [page, setPage] = useState(1); const [totalPages, setTotalPages] = useState(1); const [tabValue, setTabValue] = useState(0); const [notification, setNotification] = useState<{ open: boolean; message: string; type: 'success' | 'error'; }>({ open: false, message: '', type: 'success', }); const translateServer = (server: Server) => { switch (server.name) { case 'Server minecraft.hub.popa-popa.ru': return 'Хаб'; case 'Server survival.hub.popa-popa.ru': return 'Выживание'; case 'Server minecraft.minigames.popa-popa.ru': return 'Миниигры'; default: return server.name; } }; // Функция для проверки онлайн-статуса игрока и определения сервера const checkPlayerStatus = async () => { if (!username) return; try { setLoading(true); // Проверяем, онлайн ли игрок и получаем сервер, где он находится const { online, server } = await getPlayerServer(username); setIsOnline(online); setPlayerServer(server); // Если игрок онлайн и на каком-то сервере, загружаем предметы рынка if (online && server) { await loadMarketItems(server.ip, 1); } } catch (error) { console.error('Ошибка при проверке онлайн-статуса:', error); setIsOnline(false); setPlayerServer(null); } finally { setLoading(false); } }; // Функция для загрузки предметов маркетплейса const loadMarketItems = async (serverIp: string, pageNumber: number) => { try { setMarketLoading(true); const marketData = await fetchMarketplace(serverIp, pageNumber, 10); // 10 предметов на страницу setMarketItems(marketData); setPage(marketData.page); setTotalPages(marketData.pages); } catch (error) { console.error('Ошибка при загрузке предметов рынка:', error); setMarketItems(null); } finally { setMarketLoading(false); } }; // Обработчик смены страницы const handlePageChange = ( _event: React.ChangeEvent, newPage: number, ) => { if (playerServer) { loadMarketItems(playerServer.ip, newPage); } }; // Обработчик смены вкладок const handleTabChange = (_event: React.SyntheticEvent, newValue: number) => { setTabValue(newValue); }; // Обновляем функцию handleBuyItem в Marketplace.tsx const handleBuyItem = async (itemId: string) => { try { if (username) { const result = await buyItem(username, itemId); setNotification({ open: true, message: result.message || 'Предмет успешно куплен! Он будет добавлен в ваш инвентарь.', type: 'success', }); // Обновляем список предметов if (playerServer) { loadMarketItems(playerServer.ip, page); } } } catch (error) { console.error('Ошибка при покупке предмета:', error); setNotification({ open: true, message: error instanceof Error ? error.message : 'Ошибка при покупке предмета', type: 'error', }); } }; // Закрытие уведомления const handleCloseNotification = () => { setNotification({ ...notification, open: false }); }; // Получаем имя пользователя из localStorage при монтировании компонента useEffect(() => { const savedConfig = localStorage.getItem('launcher_config'); if (savedConfig) { const config = JSON.parse(savedConfig); if (config.username) { setUsername(config.username); } } }, []); // Проверяем статус при изменении username useEffect(() => { if (username) { checkPlayerStatus(); } }, [username]); // Показываем loader во время проверки if (loading) { return ( Проверяем, находитесь ли вы на сервере... ); } // Если игрок не онлайн if (!isOnline) { return ( Доступ к рынку ограничен Для доступа к рынку вам необходимо находиться на одном из серверов игры. Зайдите на любой сервер и обновите страницу. ); } return ( Рынок сервера{' '} {translateServer(playerServer || { name: '' })} {/* Вкладки */} {/* Содержимое вкладки "Товары" */} {marketLoading ? ( ) : !marketItems || marketItems.items.length === 0 ? ( На данный момент на рынке нет предметов. ) : ( <> {marketItems.items.map((item) => ( {item.display_name || item.material .replace(/_/g, ' ') .toLowerCase() .replace(/\b\w/g, (l) => l.toUpperCase())} Количество: {item.amount} Цена: {item.price} монет Продавец: {item.seller_name} ))} {totalPages > 1 && ( )} )} {/* Содержимое вкладки "Мой инвентарь" */} {playerServer && username ? ( { // После успешной продажи, обновляем список товаров if (playerServer) { loadMarketItems(playerServer.ip, 1); } // Показываем уведомление setNotification({ open: true, message: 'Предмет успешно выставлен на продажу!', type: 'success', }); }} /> ) : ( Не удалось загрузить инвентарь. )} {/* Уведомления */} {notification.message} ); }