import { useEffect, useState } from 'react'; import { Box, Typography, Grid, Card, CardMedia, CardContent, CardActions, Button, CircularProgress, Modal, List, ListItem, ListItemText, IconButton, } from '@mui/material'; import { useNavigate } from 'react-router-dom'; import AddIcon from '@mui/icons-material/Add'; import DownloadIcon from '@mui/icons-material/Download'; interface VersionCardProps { id: string; name: string; imageUrl: string; version: string; onSelect: (id: string) => void; isHovered: boolean; onHover: (id: string | null) => void; hoveredCardId: string | null; } export const VersionCard: React.FC = ({ id, name, imageUrl, version, onSelect, isHovered, onHover, hoveredCardId, }) => { return ( onSelect(id)} onMouseEnter={() => onHover(id)} onMouseLeave={() => onHover(null)} > {name} ); }; interface VersionInfo { id: string; name: string; version: string; imageUrl?: string; config?: { downloadUrl: string; apiReleaseUrl: string; versionFileName: string; packName: string; memory: number; baseVersion: string; serverIp: string; fabricVersion: string; preserveFiles: string[]; }; } interface AvailableVersionInfo { id: string; name: string; version: string; imageUrl?: string; config: { downloadUrl: string; apiReleaseUrl: string; versionFileName: string; packName: string; memory: number; baseVersion: string; serverIp: string; fabricVersion: string; preserveFiles: string[]; }; } // В компоненте VersionsExplorer export const VersionsExplorer = () => { const [installedVersions, setInstalledVersions] = useState([]); const [availableVersions, setAvailableVersions] = useState< AvailableVersionInfo[] >([]); const [loading, setLoading] = useState(true); const [modalOpen, setModalOpen] = useState(false); const [downloadLoading, setDownloadLoading] = useState(null); const [hoveredCardId, setHoveredCardId] = useState(null); const navigate = useNavigate(); useEffect(() => { const fetchVersions = async () => { try { setLoading(true); // Получаем список установленных версий через IPC const installedResult = await window.electron.ipcRenderer.invoke( 'get-installed-versions', ); if (installedResult.success) { setInstalledVersions(installedResult.versions); } // Получаем доступные версии с GitHub Gist const availableResult = await window.electron.ipcRenderer.invoke( 'get-available-versions', { gistUrl: 'https://gist.githubusercontent.com/DIKER0K/06cd12fb3a4d08b1f0f8c763a7d05e06/raw/versions.json', }, ); if (availableResult.success) { setAvailableVersions(availableResult.versions); } } catch (error) { console.error('Ошибка при загрузке версий:', error); // Можно добавить обработку ошибки, например показать уведомление } finally { setLoading(false); } }; fetchVersions(); }, []); const handleSelectVersion = (version: VersionInfo) => { localStorage.setItem( 'selected_version_config', JSON.stringify(version.config || {}), ); navigate(`/launch/${version.id}`); }; const handleAddVersion = () => { setModalOpen(true); }; const handleCloseModal = () => { setModalOpen(false); }; const handleDownloadVersion = async (version: AvailableVersionInfo) => { try { setDownloadLoading(version.id); // Скачивание и установка выбранной версии const downloadResult = await window.electron.ipcRenderer.invoke( 'download-and-extract', { downloadUrl: version.config.downloadUrl, apiReleaseUrl: version.config.apiReleaseUrl, versionFileName: version.config.versionFileName, packName: version.id, preserveFiles: version.config.preserveFiles || [], }, ); if (downloadResult?.success) { // Добавляем скачанную версию в список установленных setInstalledVersions((prev) => [...prev, version]); setModalOpen(false); } } catch (error) { console.error(`Ошибка при скачивании версии ${version.id}:`, error); } finally { setDownloadLoading(null); } }; // Карточка добавления новой версии const AddVersionCard = () => ( setHoveredCardId('add')} onMouseLeave={() => setHoveredCardId(null)} > Добавить версию ); return ( {/* Глобальный фоновый слой для размытия всего интерфейса */} {loading ? ( ) : ( {/* Показываем установленные версии или дефолтную, если она есть */} {installedVersions.length > 0 ? ( installedVersions.map((version) => ( handleSelectVersion(version)} isHovered={hoveredCardId === version.id} onHover={setHoveredCardId} hoveredCardId={hoveredCardId} /> )) ) : ( // Если нет ни одной версии, показываем карточку добавления )} {/* Всегда добавляем карточку для добавления новых версий */} {installedVersions.length > 0 && ( )} )} {/* Модальное окно для выбора версии для скачивания */} Доступные версии для скачивания {availableVersions.length === 0 ? ( Загрузка доступных версий... ) : ( {availableVersions.map((version) => ( handleSelectVersion(version)} > ))} )} ); };