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; } const VersionCard: React.FC = ({ id, name, imageUrl, version, onSelect, }) => { return ( onSelect(id)} > {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 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 = () => ( Добавить версию ); return ( {loading ? ( ) : ( {/* Показываем установленные версии или дефолтную, если она есть */} {installedVersions.length > 0 ? ( installedVersions.map((version) => ( handleSelectVersion(version)} /> )) ) : ( // Если нет ни одной версии, показываем карточку добавления )} {/* Всегда добавляем карточку для добавления новых версий */} {installedVersions.length > 0 && ( )} )} {/* Модальное окно для выбора версии для скачивания */} Доступные версии для скачивания {availableVersions.length === 0 ? ( Загрузка доступных версий... ) : ( {availableVersions.map((version) => ( handleSelectVersion(version)} > ))} )} ); };