해시태그 검색하기 강의에서
453
작성한 질문수 46
import { Card, Button, Avatar, Popover, List, Comment } from "antd";
import {
RetweetOutlined,
HeartOutlined,
MessageOutlined,
HeartTwoTone,
EllipsisOutlined,
} from "@ant-design/icons";
import { useDispatch, useSelector } from "react-redux";
import PropTypes from "prop-types";
import PostImages from "./PostImages";
import { useCallback, useEffect, useState } from "react";
import CommentForm from "./CommentForm";
import PostCardContent from "./PostCardContent";
import FollowButton from "./FollowButton";
import {
REMOVE_POST_REQUEST,
LIKE_POST_REQUEST,
UNLIKE_POST_REQUEST,
RETWEET_REQUEST,
} from "../reducers/post";
import Link from "next/link";
const PostCard = ({ post }) => {
const dispatch = useDispatch();
const { removePostLoading } = useSelector((state) => state.post);
const [commentFormOpened, setCommentFormOpened] = useState(false);
const id = useSelector((state) => state.user.me?.id);
const onLike = useCallback(() => {
if (!id) {
return alert("로그인이 필요합니다.");
}
return dispatch({
type: LIKE_POST_REQUEST,
data: post.id,
});
}, [id]);
const onUnLike = useCallback(() => {
if (!id) {
return alert("로그인이 필요합니다.");
}
return dispatch({
type: UNLIKE_POST_REQUEST,
data: post.id,
});
}, [id]);
const onToggleComment = useCallback(() => {
setCommentFormOpened((prev) => !prev);
}, []);
const onRemovePost = useCallback(() => {
if (!id) {
return alert("로그인이 필요합니다.");
}
return dispatch({
type: REMOVE_POST_REQUEST,
data: post.id,
});
}, [id]);
const onRetweet = useCallback(() => {
if (!id) {
return alert("로그인이 필요합니다.");
}
return dispatch({
type: RETWEET_REQUEST,
data: post.id,
});
}, []);
const liked = post.Likers?.find((v) => v.id === id);
return (
<div style={{ marginBottom: 10 }}>
<Card
cover={post.Images[0] && <PostImages images={post.Images} />}
actions={[
<RetweetOutlined key="retweet" onClick={onRetweet} />,
liked ? (
<HeartTwoTone
twoToneColor="#eb2f96"
key="heart"
onClick={onUnLike}
/>
) : (
<HeartOutlined key="heart" onClick={onLike} />
),
<MessageOutlined key="message" onClick={onToggleComment} />,
<Popover
key="more"
content={
<Button.Group>
{id && post.user?.id === id ? (
<>
<Button>수정</Button>
<Button
type="danger"
onClick={onRemovePost}
loading={removePostLoading}
>
삭제
</Button>
</>
) : (
<Button>신고</Button>
)}
</Button.Group>
}
>
<EllipsisOutlined />
</Popover>,
]}
title={
post.RetweetId ? `${post.user.nickname}님이 공유하셨습니다` : null
}
extra={id && <FollowButton post={post} />}
>
{post.RetweetId && post.Retweet ? (
<Card
cover={
post.Retweet.Images[0] && (
<PostImages images={post.Retweet.Images} />
)
}
>
<Card.Meta
avatar={
<Link href={`/user/${post.Retweet.user.id}`}>
<a>
<Avatar>{post.Retweet.user.nickname[0]}</Avatar>
</a>
</Link>
}
title={post.Retweet.user.nickname}
description={<PostCardContent postData={post.Retweet.content} />}
/>
</Card>
) : (
<Card.Meta
avatar={
<Link href={`/user/${post.user.id}`}>
<a>
<Avatar>{post.user.nickname[0]}</Avatar>
</a>
</Link>
}
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}
renderItem={(item) => (
<li>
<Comment
author={item.user?.nickname}
avatar={
<Link href={`/user/${post.user?.id}`}>
<a>
<Avatar>{post.user?.nickname[0]}</Avatar>
</a>
</Link>
}
content={item.content}
/>
</li>
)}
/>
</div>
)}
</div>
);
};
PostCard.propTypes = {
post: PropTypes.shape({
id: PropTypes.number,
user: PropTypes.object,
content: PropTypes.string,
createdAt: PropTypes.string,
Comment: PropTypes.arrayOf(PropTypes.object),
Images: PropTypes.arrayOf(PropTypes.object),
Likers: PropTypes.arrayOf(PropTypes.object),
RetweetId: PropTypes.number,
Retweet: PropTypes.objectOf(PropTypes.any),
}).isRequired,
};
export default PostCard;
아바타를 클릭하면 해당 아이디 정보하고 그 아이디 게시물만 떠야하는데 해당 아이디 프로필은 잘뜨는데 게시물이 다른사람 게시글까지 같이 뜹니다.
참고로 저는 post.User를 u로 바꿔야지만 뜹니다
답변 1
넥스트 버젼 질문
0
78
2
로그인시 401 Unauthorized 오류가 뜹니다
0
89
1
무한 스크롤 중 스크롤 튐 현상
0
175
1
특정 페이지 접근을 막고 싶을 때
0
103
2
createGlobalStyle의 위치와 영향범위
0
96
2
인라인 스타일 리렌더링 관련
0
91
2
vsc 에서 npm init 설치시 오류
0
146
2
nextjs 15버전 사용 가능할까요?
0
158
1
화면 새로고침 문의
0
121
1
RTK에서 draft, state 차이가 있나요?
0
153
2
Next 14 사용해도 될까요?
0
452
1
next, node 버전 / 폴더 구조 질문 드립니다.
0
349
1
url 오류 질문있습니다
0
211
1
ssh xxxxx로 우분투에 들어가려니까 port 22: Connection timed out
0
373
1
sudo certbot --nginx 에러
0
1275
2
Minified React error 콘솔에러 (hydrate)
0
470
1
카카오 공유했을 때 이전에 작성했던 글이 나오는 버그
0
247
1
프론트서버 배포 후 EADDRINUSE에러 발생
0
327
1
npm run build 에러
0
518
1
front 서버 npm run build 중에 발생한 에러들
0
382
1
서버 실행하고 브라우저로 들어갔을때 404에러
0
338
2
css 서버사이드 랜더링이 적용되지 않아서 문의 드립니다.
0
288
1
팔로워 3명씩 불러오고 데이터 합쳐주는걸로 바꾸고 서버요청을 무한으로하고있습니다.
0
239
2
해시태그 검색에서 throttle에 관해 질문있습니다.
0
201
1





