import { useEffect, useRef, useState } from 'react'; import SkinViewer from '../components/SkinViewer'; import { fetchPlayer, uploadSkin, fetchCapes, Cape, activateCape, deactivateCape, } from '../api'; import { Box, Typography, Paper, Button, FormControl, InputLabel, Select, MenuItem, Alert, CircularProgress, } from '@mui/material'; import CapeCard from '../components/CapeCard'; export default function Profile() { const fileInputRef = useRef(null); const [walkingSpeed, setWalkingSpeed] = useState(0.5); const [skin, setSkin] = useState(''); const [cape, setCape] = useState(''); const [username, setUsername] = useState(''); const [skinFile, setSkinFile] = useState(null); const [skinModel, setSkinModel] = useState(''); // slim или classic const [uploadStatus, setUploadStatus] = useState< 'idle' | 'loading' | 'success' | 'error' >('idle'); const [statusMessage, setStatusMessage] = useState(''); const [isDragOver, setIsDragOver] = useState(false); const [capes, setCapes] = useState([]); const [uuid, setUuid] = useState(''); const [loading, setLoading] = useState(false); useEffect(() => { const savedConfig = localStorage.getItem('launcher_config'); if (savedConfig) { const config = JSON.parse(savedConfig); if (config.uuid) { loadPlayerData(config.uuid); setUsername(config.username || ''); loadCapesData(config.username || ''); setUuid(config.uuid || ''); } } }, []); const loadPlayerData = async (uuid: string) => { try { setLoading(true); const player = await fetchPlayer(uuid); setSkin(player.skin_url); setCape(player.cloak_url); setLoading(false); } catch (error) { console.error('Ошибка при получении данных игрока:', error); setSkin(''); setCape(''); } }; const loadCapesData = async (username: string) => { try { setLoading(true); const capesData = await fetchCapes(username); setCapes(capesData); setLoading(false); } catch (error) { console.error('Ошибка при получении плащей:', error); setCapes([]); } }; // Обработка перетаскивания файла const handleFileDrop = (e: React.DragEvent) => { e.preventDefault(); setIsDragOver(false); if (e.dataTransfer.files && e.dataTransfer.files.length > 0) { const file = e.dataTransfer.files[0]; if (file.type === 'image/png') { setSkinFile(file); setStatusMessage(`Файл "${file.name}" готов к загрузке`); } else { setStatusMessage('Пожалуйста, выберите файл в формате PNG'); setUploadStatus('error'); } } }; // Обработка выбора файла const handleFileSelect = (e: React.ChangeEvent) => { if (e.target.files && e.target.files.length > 0) { const file = e.target.files[0]; if (file.type === 'image/png') { setSkinFile(file); setStatusMessage(`Файл "${file.name}" готов к загрузке`); } else { setStatusMessage('Пожалуйста, выберите файл в формате PNG'); setUploadStatus('error'); } } }; const handleActivateCape = async (cape_id: string) => { setLoading(true); await activateCape(username, cape_id); await loadCapesData(username); setLoading(false); }; const handleDeactivateCape = async (cape_id: string) => { setLoading(true); await deactivateCape(username, cape_id); await loadCapesData(username); await loadPlayerData(uuid); setLoading(false); }; // Отправка запроса на установку скина const handleUploadSkin = async () => { setLoading(true); if (!skinFile || !username) { setStatusMessage('Необходимо выбрать файл и указать имя пользователя'); setUploadStatus('error'); return; } setUploadStatus('loading'); try { await uploadSkin(username, skinFile, skinModel); setStatusMessage('Скин успешно загружен!'); setUploadStatus('success'); // Обновляем информацию о игроке, чтобы увидеть новый скин const config = JSON.parse( localStorage.getItem('launcher_config') || '{}', ); if (config.uuid) { loadPlayerData(config.uuid); } } catch (error) { setStatusMessage( `Ошибка: ${error instanceof Error ? error.message : 'Не удалось загрузить скин'}`, ); setUploadStatus('error'); } finally { setLoading(false); } }; return ( {loading ? ( ) : ( <> {/* Используем переработанный компонент SkinViewer */} {username} { e.preventDefault(); setIsDragOver(true); }} onDragLeave={() => setIsDragOver(false)} onDrop={handleFileDrop} onClick={() => fileInputRef.current?.click()} > {skinFile ? `Выбран файл: ${skinFile.name}` : 'Перетащите PNG файл скина или кликните для выбора'} Модель скина {uploadStatus === 'error' && ( {statusMessage} )} {uploadStatus === 'success' && ( {statusMessage} )} Ваши плащи {capes.map((cape) => ( ))} )} ); }