blob: 6528b0dd765a2bc48880b269e8a2231479c379dc [file] [log] [blame]
// export default PublishSeed;
import React, { useState, useRef, useEffect } from 'react';
import axios from 'axios';
import Header from '../../components/Header';
import './PublishSeed.css';
import { useUser } from '../../context/UserContext';
import { uploadFile } from '../../api/file';
import AuthButton from '../../components/AuthButton';
const PublishSeed = () => {
const [title, setTitle] = useState('');
const [description, setDescription] = useState('');
const [tags, setTags] = useState([]);
const [category, setCategory] = useState('movie');
const [message, setMessage] = useState('');
const [isLoading, setIsLoading] = useState(false);
const [fileName, setFileName] = useState('');
const [imageFile, setImageFile] = useState(null);
const [previewUrl, setPreviewUrl] = useState('');
const fileInputRef = useRef(null);
const imageInputRef = useRef(null);
const { user } = useUser();
useEffect(() => {
console.log('[DEBUG] 当前用户:', user);
}, [user]);
const handleTagsChange = (e) => {
console.log('[DEBUG] 标签输入变化:', e.target.value);
setTags(e.target.value.split(',').map(tag => tag.trim()).filter(Boolean));
};
const handleFileButtonClick = () => {
console.log('[DEBUG] 触发文件选择按钮点击');
fileInputRef.current?.click();
};
const handleImageButtonClick = () => {
console.log('[DEBUG] 触发封面图片选择按钮点击');
imageInputRef.current?.click();
};
const handleFileChange = (e) => {
console.log('[DEBUG] 种子文件选择变化:', e.target.files);
const selectedFile = e.target.files[0];
if (selectedFile) {
setFileName(selectedFile.name);
}
};
const handleImageChange = (e) => {
console.log('[DEBUG] 封面图片选择变化:', e.target.files);
const img = e.target.files[0];
if (!img) return;
setImageFile(img);
setPreviewUrl(URL.createObjectURL(img));
};
const handleSubmit = async (e) => {
console.log('[DEBUG] handleSubmit 被触发', e);
e.preventDefault();
setIsLoading(true);
setMessage('');
const currentFile = fileInputRef.current?.files[0];
console.log('[DEBUG] 当前选择文件:', currentFile);
if (!user || !user.userId) {
console.log('[DEBUG] 用户未登录,阻止上传');
setMessage('请先登录');
setIsLoading(false);
return;
}
if (!currentFile || !currentFile.name.toLowerCase().endsWith('.torrent')) {
console.log('[DEBUG] 文件校验失败');
setMessage('请上传一个 .torrent 文件');
setIsLoading(false);
return;
}
const formData = new FormData();
formData.append('file', currentFile);
formData.append('title', title);
formData.append('description', description);
formData.append('category', category);
formData.append('tags', tags.join(',')); // 逗号分隔字符串
formData.append('uploader', user.userId);
if (imageFile) {
formData.append('coverImage', imageFile);
}
try {
console.log('[DEBUG] 发送上传请求...');
const response = await axios.post('/seeds/upload', formData, {
// axios 会自动处理 multipart/form-data Content-Type 边界,不用手动设置
// headers: { 'Content-Type': 'multipart/form-data' },
});
console.log('[DEBUG] 请求成功,响应:', response.data);
if (response.data.code === 0) {
setMessage('种子上传成功');
} else {
setMessage(response.data.message || '上传失败,请稍后再试');
}
} catch (error) {
console.error('[handleSubmit] 上传失败:', error);
setMessage('上传失败,发生了错误');
} finally {
setIsLoading(false);
}
};
return (
<div className="ps-container">
<Header />
<div className="ps-card">
{message && <div className="ps-message">{message}</div>}
<form
className="ps-form"
onSubmit={(e) => {
console.log('[DEBUG] form onSubmit 触发');
handleSubmit(e);
}}
encType="multipart/form-data"
>
<div>
<label className="ps-label">标题</label>
<input
className="ps-input-text"
type="text"
value={title}
onChange={(e) => {
console.log('[DEBUG] 标题输入变化:', e.target.value);
setTitle(e.target.value);
}}
required
/>
</div>
<div>
<label className="ps-label">描述</label>
<textarea
className="ps-textarea"
value={description}
onChange={(e) => {
console.log('[DEBUG] 描述输入变化:', e.target.value);
setDescription(e.target.value);
}}
required
/>
</div>
<div>
<label className="ps-label">标签 (逗号分隔)</label>
<input
className="ps-input-text"
type="text"
value={tags.join(', ')}
onChange={handleTagsChange}
placeholder="例如:科幻, 动作"
required
/>
</div>
<div>
<label className="ps-label">分类</label>
<select
className="ps-select"
value={category}
onChange={(e) => {
console.log('[DEBUG] 分类选择变化:', e.target.value);
setCategory(e.target.value);
}}
required
>
<option value="movie">电影</option>
<option value="tv">电视剧</option>
<option value="music">音乐</option>
<option value="anime">动漫</option>
<option value="game">游戏</option>
<option value="variety">综艺</option>
<option value="software">软件</option>
<option value="sports">体育</option>
<option value="study">学习</option>
<option value="documentary">纪录片</option>
<option value="other">其他</option>
</select>
</div>
<div>
<label className="ps-label">种子文件</label>
<div
className="ps-seed-file-label"
onClick={handleFileButtonClick}
style={{ cursor: 'pointer' }}
>
点击选择文件
</div>
<input
type="file"
accept=".torrent"
ref={fileInputRef}
onChange={handleFileChange}
className="ps-seed-file-input"
/>
{fileName && <div style={{ marginTop: '5px', color: '#5F4437' }}>{fileName}</div>}
</div>
<div>
<label className="ps-label">封面图</label>
<div>
<button
type="button"
onClick={handleImageButtonClick}
className="ps-cover-upload-button"
>
上传图片
</button>
<input
type="file"
accept="image/*"
ref={imageInputRef}
onChange={handleImageChange}
className="ps-cover-upload-input"
/>
</div>
{previewUrl && (
<div style={{ marginTop: '10px' }}>
<img
src={previewUrl}
alt="封面预览"
className="ps-img-preview"
/>
</div>
)}
</div>
<div className="ps-upload-button">
<AuthButton
  roles={["cookie", "chocolate", "ice-cream"]}
type="submit"
disabled={isLoading}
onClick={() => console.log('[DEBUG] 上传按钮 onClick 触发')}
>
{isLoading ? '正在上传...' : '上传种子'}
</AuthButton>
</div>
</form>
</div>
</div>
);
};
export default PublishSeed;