blob: 022b0cb81669571c9369e1d5a4488cc636a2b01c [file] [log] [blame]
import React, { useState } from 'react';
import { useParams, useNavigate,useLocation } from 'react-router-dom';
import './RequestDetail.css';
const RequestDetail = () => {
const { id } = useParams();
const navigate = useNavigate();
const location = useLocation();
// 模拟数据
const [post, setPost] = useState({
id: 1,
title: '求《药屋少女的呢喃》第二季全集',
content: '求1080P带中文字幕版本,最好是内嵌字幕不是外挂的。\n\n希望有热心大佬能分享,可以给积分奖励!',
author: '动漫爱好者',
authorAvatar: 'https://via.placeholder.com/40',
date: '2023-10-15',
likeCount: 24,
isLiked: false,
isFavorited: false
});
const [comments, setComments] = useState([
{
id: 1,
type: 'text',
author: '资源达人',
authorAvatar: 'https://via.placeholder.com/40',
content: '我有第1-5集,需要的话可以私聊',
date: '2023-10-15 14:30',
likeCount: 5
},
{
id: 2,
type: 'torrent',
title: '药屋少女的呢喃第二季第8集',
size: '1.2GB',
author: '种子分享者',
authorAvatar: 'https://via.placeholder.com/40',
date: '2023-10-16 09:15',
likeCount: 8
}
]);
const [newComment, setNewComment] = useState('');
const handleLikePost = () => {
setPost(prev => ({
...prev,
likeCount: prev.isLiked ? prev.likeCount - 1 : prev.likeCount + 1,
isLiked: !prev.isLiked
}));
};
const handleFavoritePost = () => {
setPost(prev => ({
...prev,
isFavorited: !prev.isFavorited
}));
};
const handleCommentSubmit = (e) => {
e.preventDefault();
if (!newComment.trim()) return;
const newCommentObj = {
id: comments.length + 1,
type: 'text',
author: '当前用户',
authorAvatar: 'https://via.placeholder.com/40',
content: newComment,
date: new Date().toLocaleString(),
likeCount: 0
};
setComments([...comments, newCommentObj]);
setNewComment('');
};
const handleDownloadTorrent = (commentId) => {
console.log('下载种子', commentId);
// 实际下载逻辑
};
const handleBack = () => {
const fromTab = location.state?.fromTab; // 从跳转时传递的 state 中获取
if (fromTab) {
navigate(`/dashboard/${fromTab}`); // 明确返回对应标签页
} else {
navigate(-1); // 保底策略
}
}
return (
<div className="request-detail-container">
<button className="back-button" onClick={handleBack}>
&larr; 返回求种区
</button>
<div className="request-post">
<div className="post-header">
<img src={post.authorAvatar} alt={post.author} className="post-avatar" />
<div className="post-meta">
<div className="post-author">{post.author}</div>
<div className="post-date">{post.date}</div>
</div>
</div>
<h1 className="post-title">{post.title}</h1>
<div className="post-content">
{post.content.split('\n').map((para, i) => (
<p key={i}>{para}</p>
))}
</div>
<div className="post-actions">
<button
className={`like-button ${post.isLiked ? 'liked' : ''}`}
onClick={handleLikePost}
>
👍 点赞 ({post.likeCount})
</button>
<button
className={`favorite-button ${post.isFavorited ? 'favorited' : ''}`}
onClick={handleFavoritePost}
>
{post.isFavorited ? '★ 已收藏' : '☆ 收藏'}
</button>
</div>
</div>
<div className="comments-section">
<h2>回应 ({comments.length})</h2>
<form onSubmit={handleCommentSubmit} className="comment-form">
<textarea
value={newComment}
onChange={(e) => setNewComment(e.target.value)}
placeholder="写下你的回应..."
rows="3"
required
/>
<div className="form-actions">
<button type="submit" className="submit-comment">发表文字回应</button>
<button
type="button"
className="submit-torrent"
onClick={() => console.log('打开种子上传对话框')}
>
上传种子回应
</button>
</div>
</form>
<div className="comment-list">
{comments.map(comment => (
<div key={comment.id} className={`comment-item ${comment.type}`}>
<img
src={comment.authorAvatar}
alt={comment.author}
className="comment-avatar"
/>
<div className="comment-content">
<div className="comment-header">
<span className="comment-author">{comment.author}</span>
<span className="comment-date">{comment.date}</span>
</div>
{comment.type === 'text' ? (
<p className="comment-text">{comment.content}</p>
) : (
<div className="torrent-comment">
<span className="torrent-title">{comment.title}</span>
<span className="torrent-size">{comment.size}</span>
<button
className="download-torrent"
onClick={() => handleDownloadTorrent(comment.id)}
>
立即下载
</button>
</div>
)}
<button className="comment-like">
👍 ({comment.likeCount})
</button>
</div>
</div>
))}
</div>
</div>
</div>
);
};
export default RequestDetail;