프로젝트
[프로젝트] 코드리뷰-client 04
이채야채
2022. 2. 6. 23:05
댓글로 넘어가보자
<ButtonBox>
<Button>댓글</Button>
<LikeBox onClick={handleLikeClick}>
<LikeCount>{like}</LikeCount>
<Like primary={like}>
<i className="far fa-thumbs-up"></i>
</Like>
</LikeBox>
</ButtonBox>
{state.userId && <NewCommentForm nowContentId={id} nowUserId={state.userId} getSingleData={getSingleData} />}
<CommentForm>
{comments?.map((comment, idx) => (
<SingleComment key={idx} comment={comment} getSingleData={getSingleData} id={id} />
))}
</CommentForm>
로그인시 댓글등록이 가능하게 보여지지만
아니면 달수가없다. 보이지않는다.
Newcommnetform. js
{state.userId && <NewCommentForm nowContentId={id} nowUserId={state.userId} getSingleData={getSingleData} />}
댓글을 수정한 사람이 댓글수정삭제를 할수있게 위해 nowUserId에 userId를 내려주고, 데이터에 담긴 comments가 잇기때문에 함께 내려준다. => 해당 컨텐츠 아이디 어떤곳의 댓글인지 알기위해 내려준다.
const NewCommentForm = ({ nowContentId, nowUserId, getSingleData, id }) => {
const [newComment, setNewComment] = useState("");
const handleChangeComment = (e) => {
setNewComment(e.target.value);
};
const onClickSubmit = async () => {
const comment = {
content: newComment,
contentId: nowContentId,
};
await postComment(comment);
await getSingleData(id);
};
return (
<WritingAllignment>
<CommentWriting
type='text'
onChange={handleChangeComment}
placeholder={!nowUserId && "댓글을 작성 하려면 로그인 하세요"}
/>
<CommentButton onClick={onClickSubmit}>등록</CommentButton>
</WritingAllignment>
);
};
작성한 댓글내용을 저장할 state를 만들어준다.
const [newComment, setNewComment] = useState("");
댓글작성시 api를 봐보자 body에 필요한것이 contentsId와 content였다.
content에는 댓글의 내용이 들어가야될것이며
contentsId에는 게시글의 id가 들어가야하기에, id를 받아온 nowcontentid를 넣어야한다.
const onClickSubmit = async () => {
const comment = {
content: newComment,
contentId: nowContentId,
};
await postComment(comment);
await getSingleData(id);
};
export const postComment = async (comment) => {
try {
const data = await axios.post(`${URL}/comment`, comment, cookieOption);
return data;
} catch (e) {}
};
const getSingleData = async () => {
const data = await getSingleContent(id);
setSingleData(data);
setLike(data.like);
};
export const getSingleContent = async (id) => {
try {
const {
data: { visitCnt },
} = await axios.get(`${URL}/content/${id}`, cookieOption);
return visitCnt;
} catch (e) {}
};
commnet를 내용을 담아 보내주면 해당 컨텐츠의 내용들이 다시 업데이트가되야하니 getSingleData(id)도 다시 업데이트를 ㅣㅅ켜준다. =>> 디테일페이지가 재렌더링
Singlecomment.js
<SingleComment key={idx} comment={comment} getSingleData={getSingleData} id={id} />

commnets => commnet는 배열안의 객체 하나하나 요것을 내려준다.
const SingleComment = ({ comment, getSingleData }) => {
const state = useSelector((state) => state.allReducer);
const [isEditing, setIsEditing] = useState(false);
const [changeContent, setChangeContent] = useState("");
const { nickname, createdAt, content, userId, id } = comment;
const handleEdit = async () => {
const change = !isEditing;
if (!change) {
await editComment(id, changeContent);
}
setChangeContent(content);
setIsEditing(change);
getSingleData();
};
const handlechangeContent = (e) => {
setChangeContent(e.target.value);
};
const handleDelete = async () => {
await deleteComment(id);
getSingleData();
};
const check = parseInt(userId) === parseInt(state.userId);
return (
<CommentBox>
<CommentAlignment>
<UserBox>
<User>{nickname}</User>
<Inform>{formatDate(createdAt)}</Inform>
</UserBox>
{isEditing ? (
<EditComment value={changeContent} onChange={handlechangeContent} />
) : (
<Comment>{content}</Comment>
)}
</CommentAlignment>
{check && (
<ModifyBox>
<ModifyPopup onClick={handleEdit}>{isEditing ? "완료" : "수정"}</ModifyPopup>
<ModifyPopup onClick={handleDelete}>삭제</ModifyPopup>
</ModifyBox>
)}
</CommentBox>
);
};
check와 isEditing은 이전에 게시글 수정에서 했던것과 같은 프로세스로 진행한다.