blob: 5051ceca068d8a22bcdb5add54768ce77341fa5e [file] [log] [blame]
import React, { useState, useEffect } from 'react';
import {
likePost,
unlikePost,
togglePinPost,
deletePost,
} from '../api/post';
const PostCard = ({ post, onDeleted, onUpdated }) => {
const [likes, setLikes] = useState(post.likes);
const [isLiked, setIsLiked] = useState(false); // 默认未点赞
const [isPinned, setIsPinned] = useState(post.is_pinned || false);
const [loading, setLoading] = useState(false);
useEffect(() => {
setIsPinned(post.is_pinned || false);
}, [post.is_pinned]);
const handleLike = async () => {
setLoading(true);
try {
if (!isLiked) {
const res = await likePost(post.postid);
if (res) {
setLikes(likes + 1);
setIsLiked(true);
}
} else {
const res = await unlikePost(post.postid);
if (res) {
setLikes(likes - 1);
setIsLiked(false);
}
}
} catch (error) {
console.error('点赞操作失败', error);
}
setLoading(false);
};
const handlePin = async () => {
setLoading(true);
try {
const res = await togglePinPost(post.postid);
if (res) {
onUpdated && onUpdated(); // 通知父组件刷新数据
}
} catch (error) {
console.error('置顶切换失败', error);
}
setLoading(false);
};
const handleDelete = async () => {
if (!window.confirm('确认删除该帖子吗?')) return;
setLoading(true);
try {
const res = await deletePost(post.postid);
if (res) {
onDeleted && onDeleted(post.postid);
}
} catch (error) {
console.error('删除失败', error);
}
setLoading(false);
};
return (
<div className="post-card" style={{ border: '1px solid #ddd', padding: 16, marginBottom: 12 }}>
<h3>{post.postTitle}</h3>
<p>{post.postContent}</p>
{post.photo && (
<img
src={`http://localhost:8080${post.photo}`}
alt="帖子图片"
style={{ maxWidth: '100%', maxHeight: 200 }}
/>
)}
<p>
<strong>标签:</strong> {post.tags || '无'}
</p>
<p>
<strong>作者ID:</strong> {post.userid} | <strong>点赞数:</strong> {likes}
</p>
<p>
<strong>发布时间:</strong> {new Date(post.postCreatedTime).toLocaleString()}
</p>
<p>
<button onClick={handleLike} disabled={loading}>
{isLiked ? '取消点赞' : '点赞'}
</button>{' '}
<button onClick={handlePin} disabled={loading}>
{isPinned ? '取消置顶' : '置顶'}
</button>{' '}
<button onClick={handleDelete} disabled={loading}>
删除
</button>
</p>
</div>
);
};
export default PostCard;