Open choigirang opened 1 year ago
/** 개별 게시글 페이지 */
export default function PostDetail({ id }: { id: number }) {
const [likes, setLikes] = useState<boolean>(false);
// 로그인 상태 확인 (댓글 기능)
const user = useSelector((state: RootState) => state.user.user);
// 게시글 받아오기
const queryResult = usePostDetail(id);
const checkLikes = queryResult.data && queryResult.data.likes.indexOf(`${user.id}`);
useEffect(() => {
if (checkLikes) setLikes(true);
else setLikes(false);
}, [checkLikes]);
const router = useRouter();
if (queryResult.isLoading) {
return <div>Loading...</div>;
}
if (queryResult.isError) {
const error = queryResult.error as Error;
return <div>Error: {error.message}</div>;
}
if (!queryResult.data) {
return <div>No data available</div>;
}
// 게시글 데이터
const data: PostType = queryResult.data;
// 좋아요
const likesHadnler = () => {
api
.post('/post/likes', { id: user.id, postNumber: id })
.then(res => {
if (checkLikes) setLikes(false);
else setLikes(true);
})
.catch(res => console.log('서버 오류'));
};
// 글 삭제
const deleteHandler = (e: React.MouseEvent<HTMLButtonElement>) => {
e.preventDefault();
api.delete(`/post/${data.postNumber}`).then(res => {
alert('게시글이 삭제되었습니다.');
router.push('/');
});
};
// 글 수정
const editHandler = () => {
router.push(`/community/edit/${data.postNumber}`);
};
return (
<Container>
<PostInfo>
{/* 카테고리 들어갈 자리 */}
{/* 작성자, 타이틀, 날짜, 조회수 등 */}
<div className="info-top">
<p className="title">{data.title}</p>
<div className="right-side">
{data.author === user.id && (
<button className="edit-btn" onClick={editHandler}>
수정
</button>
)}
{(data.author === user.id || user.super) && (
<button className="delete-btn" onClick={e => deleteHandler(e)}>
삭제
</button>
)}
<p className="likse" onClick={likesHadnler}>
{likes ? <AiFillLike size="18px" /> : <AiOutlineLike size="18px" />}
</p>
</div>
</div>
{/* 작성글 */}
<div className="info-bottom">
<div className="author-date">
<span className="author">{data.author}</span>|<span className="date">{data.date}</span>
</div>
<div className="views-likes">
<span className="views">조회수 : {data.views}</span>|<span className="likes">스크랩 : {data.likes}</span>
</div>
</div>
</PostInfo>
{/* 작성한 데이터 */}
<ShowWritingData data={data.body} />
{/* 댓글 작성하기 */}
{<AddComment number={data.postNumber} author={user.id} src={'post'} />}
{/* 댓글 */}
{data.comments.map((comment, idx) => (
<EachComment key={idx} comment={comment} number={data.postNumber} src={'post'} />
))}
</Container>
);
}
filter에 따른 AiLikes 설정 필요