blob: c58ed33198e31ace62f0b889f22149a0076fa95b [file] [log] [blame]
// import React, { useEffect, useState } from 'react';
// import { useParams } from 'wouter';
// import { GoodTwo, Star } from '@icon-park/react';
// import { getPostDetail, getPostComments, likePost, unlikePost, addCommentToPost, collectPost } from './api'; // 引入你的 API 函数
// import './PostDetailPage.css';
// import { useUser } from '../../../context/UserContext'; // 注意路径
// import Header from '../../../components/Header';
// const PostDetailPage = () => {
// const { postId } = useParams(); // 获取帖子ID
// const [postDetail, setPostDetail] = useState(null);
// const [comments, setComments] = useState([]);
// const [loading, setLoading] = useState(true);
// const [errorMsg, setErrorMsg] = useState('');
// const [newComment, setNewComment] = useState(''); // 新评论内容
// const [isAnonymous, setIsAnonymous] = useState(false); // 是否匿名
// const [isLiked, setIsLiked] = useState(false); // 是否已点赞
// const [isCollected, setIsCollected] = useState(false); // 是否已收藏
// const [replyToCommentId, setReplyToCommentId] = useState(null); // 回复的评论ID
// // 获取当前用户ID(假设从上下文中获取)
// const { user } = useUser(); // 你需要从用户上下文获取用户 ID
// useEffect(() => {
// const fetchPostDetail = async () => {
// setLoading(true);
// setErrorMsg('');
// try {
// // 获取帖子详情
// const postData = await getPostDetail(postId);
// setPostDetail(postData);
// // 获取帖子评论
// const commentsData = await getPostComments(postId);
// setComments(commentsData);
// // 设置是否已经点赞
// if (postData.likedByUser) {
// setIsLiked(true);
// } else {
// setIsLiked(false);
// }
// // 设置是否已经收藏
// if (postData.collectedByUser) {
// setIsCollected(true);
// } else {
// setIsCollected(false);
// }
// } catch (err) {
// console.error('加载失败:', err);
// setErrorMsg('加载失败,请稍后重试');
// } finally {
// setLoading(false);
// }
// };
// fetchPostDetail();
// }, [postId]);
// // 点赞功能
// const toggleLike = async () => {
// if (!user) {
// alert('请先登录');
// return;
// }
// try {
// if (isLiked) {
// // 取消点赞
// await unlikePost(postId, user.id);
// setIsLiked(false);
// setPostDetail((prev) => ({
// ...prev,
// postLikeNum: prev.postLikeNum - 1,
// }));
// } else {
// // 点赞
// await likePost(postId, user.id);
// setIsLiked(true);
// setPostDetail((prev) => ({
// ...prev,
// postLikeNum: prev.postLikeNum + 1,
// }));
// }
// } catch (err) {
// console.error('点赞失败:', err);
// alert('点赞失败,请稍后再试');
// }
// };
// // 收藏功能
// const toggleCollect = async () => {
// if (!user) {
// alert('请先登录');
// return;
// }
// try {
// const action = isCollected ? 'cancel' : 'collect';
// // 调用收藏 API
// await collectPost(postId, user.id, action);
// setIsCollected(!isCollected);
// setPostDetail((prev) => ({
// ...prev,
// postCollectNum: isCollected ? prev.postCollectNum - 1 : prev.postCollectNum + 1,
// }));
// } catch (err) {
// console.error('收藏失败:', err);
// alert('收藏失败,请稍后再试');
// }
// };
// // 添加评论
// const handleAddComment = async () => {
// if (!newComment.trim()) {
// alert('评论内容不能为空');
// return;
// }
// try {
// // 调用 API 添加评论,若为回复评论则传递父评论ID(com_comment_id)
// const commentData = await addCommentToPost(postId, user.id, newComment, isAnonymous, replyToCommentId);
// // 更新评论列表
// setComments((prev) => [
// ...prev,
// {
// commentId: commentData.commentId,
// post_id: postId,
// userId: user.id,
// content: newComment,
// isAnonymous,
// commentTime: new Date().toISOString(),
// comCommentId: replyToCommentId, // 回复评论时传递父评论ID
// },
// ]);
// // 清空评论框和回复状态
// setNewComment('');
// setReplyToCommentId(null);
// } catch (err) {
// console.error('评论添加失败:', err);
// alert('评论失败,请稍后再试');
// }
// };
// // 回复评论
// const handleReply = (commentId) => {
// setReplyToCommentId(commentId); // 设置父评论ID为当前评论的ID
// };
// return (
// <div className="post-detail-page">
// <Header />
// {loading ? (
// <p>加载中...</p>
// ) : errorMsg ? (
// <p className="error-text">{errorMsg}</p>
// ) : postDetail ? (
// <div className="post-detail">
// <h1>{postDetail.title}</h1>
// <div className="post-meta">
// <span className="post-user">用户ID: {postDetail.user_id}</span>
// <span className="post-time">
// 发布时间:{new Date(postDetail.postTime).toLocaleString()}
// </span>
// </div>
// <div className="post-content">
// <p>{postDetail.postContent}</p>
// {Array.isArray(postDetail.imgUrl) ? (
// <div className="post-images">
// {postDetail.imgUrl.map((url, idx) => (
// <img key={idx} src={url} alt={`图片${idx}`} />
// ))}
// </div>
// ) : (
// postDetail.imgUrl && (
// <img className="post-image" src={postDetail.imgUrl} alt="帖子图片" />
// )
// )}
// </div>
// {/* 点赞和收藏 */}
// <div className="post-actions">
// <button
// className="icon-btn"
// onClick={toggleLike} // 点赞操作
// >
// <GoodTwo
// theme="outline"
// size="20"
// fill={isLiked ? '#f00' : '#ccc'} // 如果已点赞,显示红色
// />
// <span>{postDetail.postLikeNum}</span>
// </button>
// <button
// className="icon-btn"
// onClick={toggleCollect} // 收藏操作
// >
// <Star
// theme="outline"
// size="20"
// fill={isCollected ? '#ffd700' : '#ccc'} // 如果已收藏,显示金色
// />
// <span>{postDetail.postCollectNum}</span>
// </button>
// </div>
// <hr className="divider" />
// {/* 评论部分 */}
// <h3>评论区</h3>
// <div className="comments-section">
// {comments.length ? (
// comments.map((comment) => (
// <div key={comment.commentId} className="comment">
// <div className="comment-header">
// <span className="comment-user">用户 ID: {comment.userId}</span>
// <button className="reply-btn" onClick={() => handleReply(comment.commentId)}>回复</button>
// </div>
// <p className="comment-content">{comment.content}</p>
// <div className="comment-time">
// {new Date(comment.commentTime).toLocaleString()}
// </div>
// {/* 回复框,只有在当前评论是正在回复的评论时显示 */}
// {replyToCommentId === comment.commentId && (
// <div className="reply-form">
// <textarea
// placeholder="输入你的回复..."
// value={newComment}
// onChange={(e) => setNewComment(e.target.value)}
// />
// <div className="comment-options">
// <label>
// <input
// type="checkbox"
// checked={isAnonymous}
// onChange={() => setIsAnonymous(!isAnonymous)}
// />
// 匿名评论
// </label>
// <button onClick={handleAddComment}>发布回复</button>
// </div>
// </div>
// )}
// </div>
// ))
// ) : (
// <p>暂无评论</p>
// )}
// {/* 添加评论表单 */}
// <div className="add-comment-form">
// <textarea
// placeholder="输入你的评论..."
// value={newComment}
// onChange={(e) => setNewComment(e.target.value)}
// />
// <div className="comment-options">
// <label>
// <input
// type="checkbox"
// checked={isAnonymous}
// onChange={() => setIsAnonymous(!isAnonymous)}
// />
// 匿名评论
// </label>
// <button onClick={handleAddComment}>发布评论</button>
// </div>
// </div>
// </div>
// </div>
// ) : (
// <p>帖子不存在</p>
// )}
// </div>
// );
// };
// export default PostDetailPage;
import React, { useEffect, useState } from 'react';
import { useParams } from 'wouter';
import { GoodTwo, Star } from '@icon-park/react';
import { getPostDetail, getPostComments, likePost, unlikePost, addCommentToPost, collectPost, uncollectPost } from './api'; // 引入你的 API 函数
import './PostDetailPage.css';
import { useUser } from '../../../context/UserContext'; // 注意路径
import Header from '../../../components/Header';
const PostDetailPage = () => {
const { postId } = useParams(); // 获取帖子ID
const [postDetail, setPostDetail] = useState(null);
const [comments, setComments] = useState([]);
const [loading, setLoading] = useState(true);
const [errorMsg, setErrorMsg] = useState('');
const [newComment, setNewComment] = useState(''); // 新评论内容
// const [isAnonymous, setIsAnonymous] = useState(false); // 是否匿名
const [isLiked, setIsLiked] = useState(false); // 是否已点赞
const [isCollected, setIsCollected] = useState(false); // 是否已收藏
const [replyToCommentId, setReplyToCommentId] = useState(null); // 回复的评论ID
// 获取当前用户ID(假设从上下文中获取)
const { user } = useUser(); // 你需要从用户上下文获取用户 ID
useEffect(() => {
const fetchPostDetail = async () => {
setLoading(true);
setErrorMsg('');
try {
// 获取帖子详情
const postData = await getPostDetail(postId);
setPostDetail(postData);
// 获取帖子评论
const commentsData = await getPostComments(postId);
setComments(commentsData);
// 设置是否已经点赞
if (postData.likedByUser) {
setIsLiked(true);
} else {
setIsLiked(false);
}
// 设置是否已经收藏
if (postData.collectedByUser) {
setIsCollected(true);
} else {
setIsCollected(false);
}
} catch (err) {
console.error('加载失败:', err);
setErrorMsg('加载失败,请稍后重试');
} finally {
setLoading(false);
}
};
fetchPostDetail();
}, [postId]);
// 点赞功能
const toggleLike = async () => {
if (!user) {
alert('请先登录');
return;
}
try {
if (isLiked) {
// 取消点赞
await unlikePost(postId, user.id);
setIsLiked(false);
setPostDetail((prev) => ({
...prev,
postLikeNum: prev.postLikeNum - 1,
}));
} else {
// 点赞
await likePost(postId, user.id);
setIsLiked(true);
setPostDetail((prev) => ({
...prev,
postLikeNum: prev.postLikeNum + 1,
}));
}
} catch (err) {
console.error('点赞失败:', err);
alert('点赞失败,请稍后再试');
}
};
// 收藏功能
const toggleCollect = async () => {
if (!user) {
alert('请先登录');
return;
}
try {
if (isCollected) {
// 取消收藏 - 使用原有的collectPost函数,传递action: "cancel"
await collectPost(postId, user.id, "cancel");
setIsCollected(false);
setPostDetail((prev) => ({
...prev,
postCollectNum: prev.postCollectNum - 1,
}));
} else {
// 收藏
await collectPost(postId, user.id, "collect");
setIsCollected(true);
setPostDetail((prev) => ({
...prev,
postCollectNum: prev.postCollectNum + 1,
}));
}
} catch (err) {
console.error('收藏操作失败:', err);
alert('收藏操作失败,请稍后再试');
}
};
// 添加评论
const handleAddComment = async () => {
if (!newComment.trim()) {
alert('评论内容不能为空');
return;
}
try {
// 调用 API 添加评论,若为回复评论则传递父评论ID(com_comment_id)
const commentData = await addCommentToPost(postId, user.id, newComment, replyToCommentId);
// 更新评论列表
setComments((prev) => [
...prev,
{
commentId: commentData.commentId,
post_id: postId,
userId: user.id,
content: newComment,
// isAnonymous,
commentTime: new Date().toISOString(),
comCommentId: replyToCommentId, // 回复评论时传递父评论ID
},
]);
// 清空评论框和回复状态
setNewComment('');
setReplyToCommentId(null);
} catch (err) {
console.error('评论添加失败:', err);
alert('评论失败,请稍后再试');
}
};
// 回复评论
const handleReply = (commentId) => {
setReplyToCommentId(commentId); // 设置父评论ID为当前评论的ID
};
return (
<div className="post-detail-page">
<Header />
{loading ? (
<p>加载中...</p>
) : errorMsg ? (
<p className="error-text">{errorMsg}</p>
) : postDetail ? (
<div className="post-detail">
<h1>{postDetail.title}</h1>
<div className="post-meta">
<span className="post-user">用户ID: {postDetail.user_id}</span>
<span className="post-time">
发布时间:{new Date(postDetail.postTime).toLocaleString()}
</span>
</div>
<div className="post-content">
<p>{postDetail.postContent}</p>
{Array.isArray(postDetail.imgUrl) ? (
<div className="post-images">
{postDetail.imgUrl.map((url, idx) => (
<img key={idx} src={url} alt={`图片${idx}`} />
))}
</div>
) : (
postDetail.imgUrl && (
<img className="post-image" src={postDetail.imgUrl} alt="帖子图片" />
)
)}
</div>
{/* 点赞和收藏 */}
<div className="post-actions">
<button
className="icon-btn"
onClick={toggleLike} // 点赞操作
>
<GoodTwo
theme="outline"
size="20"
fill={isLiked ? '#f00' : '#ccc'} // 如果已点赞,显示红色
/>
<span>{postDetail.postLikeNum}</span>
</button>
<button
className="icon-btn"
onClick={toggleCollect} // 收藏操作
>
<Star
theme="outline"
size="20"
fill={isCollected ? '#ffd700' : '#ccc'} // 如果已收藏,显示金色
/>
<span>{postDetail.postCollectNum}</span>
</button>
</div>
<hr className="divider" />
{/* 评论部分 */}
<h3>评论区</h3>
<div className="comments-section">
{comments.length ? (
comments.map((comment) => (
<div key={comment.commentId} className="comment">
<div className="comment-header">
<span className="comment-user">用户 ID: {comment.userId}</span>
<button className="reply-btn" onClick={() => handleReply(comment.commentId)}>回复</button>
</div>
<p className="comment-content">{comment.content}</p>
<div className="comment-time">
{new Date(comment.commentTime).toLocaleString()}
</div>
{/* 回复框,只有在当前评论是正在回复的评论时显示 */}
{replyToCommentId === comment.commentId && (
<div className="reply-form">
<textarea
placeholder="输入你的回复..."
value={newComment}
onChange={(e) => setNewComment(e.target.value)}
/>
<div className="comment-options">
{/* <label> */}
{/* <input */}
{/* type="checkbox" */}
{/* checked={isAnonymous} */}
{/* onChange={() => setIsAnonymous(!isAnonymous)} */}
{/* /> */}
{/* 匿名评论 */}
{/* </label> */}
<button onClick={handleAddComment}>发布回复</button>
</div>
</div>
)}
</div>
))
) : (
<p>暂无评论</p>
)}
{/* 添加评论表单 */}
<div className="add-comment-form">
<textarea
placeholder="输入你的评论..."
value={newComment}
onChange={(e) => setNewComment(e.target.value)}
/>
<div className="comment-options">
{/* <label>
<input
type="checkbox"
checked={isAnonymous}
onChange={() => setIsAnonymous(!isAnonymous)}
/>
匿名评论
</label> */}
<button onClick={handleAddComment}>发布评论</button>
</div>
</div>
</div>
</div>
) : (
<p>帖子不存在</p>
)}
</div>
);
};
export default PostDetailPage;