import { useEffect, useState } from 'react'; import { Box, Typography, Grid, Card, CardContent, Button, Modal, List, ListItem, ListItemText, } from '@mui/material'; import { useNavigate } from 'react-router-dom'; import AddIcon from '@mui/icons-material/Add'; import { FullScreenLoader } from '../components/FullScreenLoader'; interface VersionCardProps { id: string; name: string; imageUrl: string; version: string; onSelect: (id: string) => void; isHovered: boolean; onHover: (id: string | null) => void; hoveredCardId: string | null; } const gradientPrimary = 'linear-gradient(71deg, #F27121 0%, #E940CD 70%, #8A2387 100%)'; export const VersionCard: React.FC = ({ id, name, imageUrl, // пока не используется, но оставляем для будущего version, onSelect, isHovered, onHover, hoveredCardId, }) => { return ( onSelect(id)} onMouseEnter={() => onHover(id)} onMouseLeave={() => onHover(null)} > {name} Версия {version} ); }; 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 | AvailableVersionInfo) => { const cfg: any = (version as any).config; if (cfg && (cfg.downloadUrl || cfg.apiReleaseUrl)) { localStorage.setItem('selected_version_config', JSON.stringify(cfg)); } else { localStorage.removeItem('selected_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 ( {/* Заголовок страницы в стиле Registration */} Выбор версии клиента Выберите установленную версию или добавьте новую сборку {/* Глобальный фоновый слой (мягкий эффект) */} {/* */} {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)} > {downloadLoading === version.id && ( Загрузка... )} ))} )} ); };