blob: 465afda8a2137fac1189027fcaefeba824e63a95 [file] [log] [blame] [edit]
import React, { useState } from 'react';
import {
Box, Container, Typography, Paper,
TextField, Button, Stack
} from '@mui/material';
import CloudUploadIcon from '@mui/icons-material/CloudUpload';
function Upload() {
const [title, setTitle] = useState('');
const [file, setFile] = useState(null);
const handleUpload = () => {
const formData = new FormData();
if (file) {
formData.append('file', file);
}
formData.append('title', title);
const token = localStorage.getItem('jwt_token'); // 假设你登录后将 token 存在 localStorage
fetch('http://localhost:8080/api/torrents/upload', {
method: 'POST',
headers: {
Authorization: `Bearer ${token}`,
},
body: formData,
})
.then(response => {
if (response.ok) {
console.log('上传成功');
alert('上传成功');
} else {
return response.text().then(text => {
console.error('上传失败:', text);
alert('上传失败: ' + text);
});
}
})
.catch(error => {
console.error('上传出错:', error);
alert('上传出错: ' + error.message);
});
};
return (
<Box sx={{ minHeight: '100vh', py: 4, background: 'linear-gradient(135deg, #2c3e50, #4ca1af)', color: 'white' }}> {/* Moved body styles here for self-containment */}
<Container maxWidth="sm" sx={{ position: 'relative', zIndex: 10 }}>
<Typography variant="h4" sx={{ textAlign: 'center', mb: 3, fontWeight: 'bold' }}> {/* Replaced className with sx */}
⬆️ 上传种子 · Mini-Tracker
</Typography>
<Paper sx={{ position: 'relative', zIndex: 20, padding: '2rem', backgroundColor: 'rgba(30, 30, 30, 0.9)' }}> {/* Replaced className with sx */}
<Stack spacing={3}> {/* Increased spacing a bit */}
<TextField
label="资源名称"
variant="outlined"
fullWidth
value={title}
onChange={e => setTitle(e.target.value)}
placeholder="请输入资源名称"
InputLabelProps={{
sx: {
color: '#ccc',
'&.Mui-focused': { // Ensure label color remains consistent when focused
color: '#ccc',
}
}
}}
sx={{
// Root element of the TextField
backgroundColor: 'transparent',
// Styles for the HTML input element itself
'& .MuiInputBase-input': {
color: 'white', // Text color
backgroundColor: 'transparent', // **** THIS IS THE FIX **** Ensure input background is transparent
caretColor: 'white', // Cursor color
'&::placeholder': {
color: '#bbb',
opacity: 1,
},
},
// Styles for the outlined border
'& .MuiOutlinedInput-root': {
'& fieldset': {
borderColor: '#888', // Default border color
},
'&:hover fieldset': {
borderColor: '#aaa', // Border color on hover
},
'&.Mui-focused fieldset': {
borderColor: '#fff', // Border color when focused
},
},
}}
/>
<Button
variant="contained"
component="label" // Allows the button to act as a label for a hidden input
startIcon={<CloudUploadIcon />}
sx={{ backgroundColor: '#00bcd4', color: 'white', '&:hover': { backgroundColor: '#0097a7' } }} // Replaced className with sx
>
选择种子文件
<input
hidden
type="file"
accept=".torrent"
onChange={e => {
if (e.target.files && e.target.files[0]) {
setFile(e.target.files[0]);
}
}}
/>
</Button>
{file && (
<Typography variant="body2" sx={{ color: '#eee', textAlign: 'center' }}>
已选择文件: {file.name}
</Typography>
)}
<Button
variant="outlined"
onClick={handleUpload}
disabled={!file || !title}
sx={{ borderColor: 'white', color: 'white', '&:hover': { borderColor: '#ddd', backgroundColor: 'rgba(255,255,255,0.1)'}, '&.Mui-disabled': { borderColor: '#777', color: '#777' } }} // Replaced className with sx
>
提交上传
</Button>
</Stack>
</Paper>
</Container>
{/* Background bubbles animation - assuming CSS for .bubbles and .bubble is globally available or defined in an imported CSS file */}
{/* For self-containment, these styles would ideally be JSS or defined in a <style> tag if not using styled-components or similar */}
<Box className="bubbles" sx={{
pointerEvents: 'none',
position: 'fixed',
top: 0,
left: 0,
width: '100%',
height: '100%',
overflow: 'hidden',
zIndex: 1, // Ensure it's behind the content paper but above the main background
}}>
{[...Array(40)].map((_, i) => (
<Box
key={i}
className="bubble" // Assuming .bubble and @keyframes rise are defined in your CSS
sx={{
position: 'absolute',
bottom: '-100px',
background: 'rgba(255, 255, 255, 0.15)',
borderRadius: '50%',
animation: 'rise 20s infinite ease-in', // Make sure @keyframes rise is defined
width: `${Math.random() * 20 + 10}px`,
height: `${Math.random() * 20 + 10}px`,
left: `${Math.random() * 100}%`,
animationDuration: `${10 + Math.random() * 20}s`,
animationDelay: `${Math.random() * 5}s`
}}
/>
))}
</Box>
{/* Define keyframes if not in external CSS */}
<style>
{`
@keyframes rise {
0% {
transform: translateY(0) scale(1);
opacity: 0.5;
}
50% {
opacity: 1;
}
100% {
transform: translateY(-120vh) scale(0.5);
opacity: 0;
}
}
body { /* Basic reset if base.css is not loaded */
margin: 0;
font-family: 'Roboto', sans-serif;
}
`}
</style>
</Box>
);
}
export default Upload;