import React, { useState, useCallback } from "react";
import PropTypes from "prop-types";
import { useSelector, useDispatch } from "react-redux";
import { Card, Popover, Button, Avatar, List, Comment } from "antd";
import {
RetweetOutlined,
HeartOutlined,
MessageOutlined,
EllipsisOutlined,
HeartTwoTone,
ConsoleSqlOutlined,
} from "@ant-design/icons";
import Link from "next/link";
import moment from "moment";
import CommentForm from "./CommentForm";
import PostImages from "./PostImages";
import PostCardContent from "./PostCardContent";
const PostCard = ({ post }) => {
console.log("포스트카드");
console.log(post);
const [Liked, setLiked] = useState(false);
const [commentFormOpened, setCommentFormOpened] = useState(false);
const onToggleLike = useCallback(() => {
// prev는 자동으로 이전 데이터가 들어가 있음. true는 false로 false는 true로
setLiked((prev) => !prev);
}, []);
const onToggleComment = useCallback(() => {
// true는 false로 false는 true로
setCommentFormOpened((prev) => !prev);
}, []);
// const { id } = useSelector((state) => state.user.me && state.user.me.id);
// 같은 문장인데 줄어 든거임.
const id = useSelector((state) => state.user.me?.id);
return (
<div style={{ marginTop: 20 }}>
<Card
cover={post.Images[0] && <PostImages images={post.Images} />}
// 배열 안에 jsx를 넣어줄거면 key를 넣어 줘야 한다.
actions={[
<RetweetOutlined key="retweet" />,
Liked ? (
<HeartTwoTone
twoToneColor="#eb2f96"
key="heart"
onClick={onToggleLike}
/>
) : (
<HeartOutlined key="heart" onClick={onToggleLike} />
),
<MessageOutlined key="comment" onClick={onToggleComment} />,
<Popover
key="more"
content={
<Button.Group>
{/* 로그린 했고 작성자 아이디랑 내아이디랑 같으면 수정 가능 */}
{id && post.User.id === id ? (
<>
<Button>수정</Button>
<Button type="danger">삭제</Button>
</>
) : (
<Button>신고</Button>
)}
</Button.Group>
}
>
<EllipsisOutlined />
</Popover>,
]}
>
<Card.Meta
// 유저 닉네임의 첫번째 글자
avatar={<Avatar>{post.User.nickname[0]}</Avatar>}
title={post.User.nickname}
description={<PostCardContent postData={post.content} />}
/>
</Card>
{commentFormOpened && (
<div>
<CommentForm post={post} />
<List
header={`${post.Comments.length}개의 댓글`}
itemLayout="horizontal"
dataSource={post.Comments}
// post.comments의 세부 항목이 item으로 들어감
renderItem={(item) => (
<li>
<Comment
author={item.User.nickname}
avatar={<Avatar>{item.User.nickname[0]}</Avatar>}
content={item.content}
/>
</li>
)}
/>
</div>
)}
{/* <CommentForm />
<Comments /> */}
</div>
);
};
PostCard.propTypes = {
// PropTypes.object이렇게 할 수 있는데 더 구체적으로 적어 줄수 있다.
post: PropTypes.shape({
id: PropTypes.number,
User: PropTypes.object,
content: PropTypes.string,
createdAt: PropTypes.object,
Comments: PropTypes.arrayOf(PropTypes.object),
Images: PropTypes.arrayOf(PropTypes.string),
}).isRequired,
};
export default PostCard;