Click here to Skip to main content
15,884,353 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
Hello! I'm practising building comments app, where user can leave comment and reply to others' comments! When the user clicks on reply there's an event that binds each time it is clicked and should store the currently clicked comment's id in a useState variable prev for later sending to server. That current's id value is not undefined, it's a string, but when I set it like setPrev(curr._id), the useEffect that is responsible for listening to changes made to that prev variable shows me (when I call alert(prev)) that it has its initial value - null. And when sending on server it's null too. But ! When console.log'ging that prev value, it returns me the epected value for the prev (some id like: 85654646054hre, for instance). Here's the code for that CommentsExpandedArticle component:
JavaScript
export default function SpecificPostCommentsExtended({ article }) {
  const [prev, setPrev] = useState("");
  const [loaded, setLoaded] = useState(false);
  const [comments, setComments] = useState([]);
  const ifNoCom = async () => {
    setLoaded(true);
    setTimeout(function () {
      document.querySelector("#confirm").addEventListener("click", async () => {
        const data = await axios({
          url: vars.BACKENDURL + "/comment",
          withCredentials: true,
          method: "POST",
          data: {
            article: article,
            comment: {
              content: document.querySelector("#commentcontent").value,
              prevId: prev === "" ? null : prev,
            },
          },
        });
        setLoaded(true);
      });
    }, 30);
    return;
  };
  const ifCom = async () => {
    let i = 0;
    await article.commentsArr.forEach(async (c) => {
      const { data } = await axios({
        url: vars.BACKENDURL + "/getcomment",
        withCredentials: true,
        method: "POST",
        data: { comment: { _id: c } },
      });
      if (!comments.includes({ ...data })) {
        setComments((current) => [...current, { ...data }]);
      }
      i++;
      if (i === article.commentsArr.length - 1) {
        setLoaded(true);
        document
          .querySelector("#confirm")
          .addEventListener("click", async () => {
            console.log("It's prev - ", prev, "!lalalal");
            const data = await axios({
              url: vars.BACKENDURL + "/comment",
              withCredentials: true,
              method: "POST",
              data: {
                article: article,
                comment: {
                  content: document.querySelector("#commentcontent").value,
                  prevId: prev === "" ? null : prev,
                },
              },
            });
          });
      }
    });
  };
  const getComments = async () => {
    setComments([]);
    setLoaded(false);
    if (article.commentsArr.length === 0) {
      ifNoCom();
    } else {
      ifCom();
    }
  };

  useEffect(() => {
    getComments();
  }, []);
  return (
    <>
      <Header>
        <HeaderImg src="../../assets/headerpic.png" />
        <Navbar>
          <span>mypage</span>| <span>log out</span>
        </Navbar>
      </Header>
      <Content>
        <SideBar />
        <RightFrame>
          {loaded === false ? (
            <CircularProgress />
          ) : (
            <>
              <UpperBlock>
                <Title>
                  {article.group.toLowerCase()}
                  <Subtitle>
                    <span>previous</span>
                    <span>next</span>
                    <span>list</span>
                  </Subtitle>
                </Title>

                <PostContainer>
                  <PostDecription>
                    <div className="left">
                      <h2>{article.title}</h2>
                      <span>{article.writer}</span>
                      <span>{article.date}</span>
                    </div>
                    <div className="right">
                      <span
                        onClick={async () => {
                          window.location = `/${article._id}/edit`;
                        }}
                      >
                        edit
                      </span>
                      <span>|</span>
                      <span
                        onClick={async () => {
                          if (
                            !window.confirm(
                              "Are you sure you want to delete this post?"
                            )
                          ) {
                            return;
                          }
                          const { data } = await axios({
                            url: vars.BACKENDURL + `/deletepost`,
                            withCredentials: true,
                            method: "DELETE",
                            data: {
                              post: {
                                id: article._id,
                              },
                            },
                          });
                          alert(data);
                        }}
                      >
                        delete
                      </span>
                    </div>
                  </PostDecription>
                  <PostContents>
                    <h3>Contents</h3>
                    <p>{article.content}</p>
                  </PostContents>
                </PostContainer>
              </UpperBlock>
              <LowerBlock>
                <ReportBtns>
                  <ReportBtnMock>inappropriate language</ReportBtnMock>
                  <ReportBtnMock>misinformation</ReportBtnMock>
                </ReportBtns>
                <LowerRightFrame>
                  <div>
                    <span
                      onClick={() => {
                        window.location = "/specificpost/" + article._id;
                      }}
                    >
                      <img src="../../assets/comments.png" /> Comments{" "}
                      {article.comments}
                    </span>

                    <span
                      onClick={async () => {
                        const { data } = await axios({
                          url: vars.BACKENDURL + "/like",
                          method: "POST",
                          withCredentials: true,
                          data: {
                            post: article,
                          },
                        });
                        alert(data);
                      }}
                    >
                      <img src="../../assets/likes.png" /> Likes {article.likes}
                    </span>
                  </div>
                  <div>
                    <span>Like</span>
                    <span>|</span>
                    <span>Report</span>
                  </div>
                </LowerRightFrame>
                <CommentsBlock>
                  {comments.map((c, i) => {
                    console.log("C comment id", c.comment._id);
                    const _id = c.comment._id;
                    return (
                      <>
                        <Comment key={i}>
                          <Nickname>{c.comment.author}</Nickname>
                          <Contents>{c.comment.content}</Contents>
                          <LowerCommentContainer>
                            <span>{c.comment.date}</span>
                            <span
                              onClick={(e) => {
                                setPrev(_id);
                                console.log(_id, "-is id");
                                console.log(prev, "- prev");
                              }}
                            >
                              reply
                            </span>
                          </LowerCommentContainer>
                        </Comment>
                        {c.subcomments.map((sc, j) => {
                          return (
                            <SubComment key={j}>
                              <Nickname>{sc.author}</Nickname>
                              <Contents>
                                @{sc.author}, <br /> {sc.content}
                              </Contents>
                              <LowerCommentContainer>
                                <span>{sc.date}</span>
                              </LowerCommentContainer>
                            </SubComment>
                          );
                        })}
                      </>
                    );
                  })}
                  <ContentsInput id="commentcontent" />
                  <Confirm id="confirm">Post</Confirm>
                </CommentsBlock>
              </LowerBlock>
            </>
          )}
        </RightFrame>
      </Content>
    </>
  );
}


What I have tried:

Onclick Event attached to span with label "reply" tells me 
60c6f3a623961520f85c23f7 -is id
60c6f3a623961520f85c23f7 - prev

Yet the useEffect responsible for sending data to Db tells me:
It's prev -   !lalalal
Can you please help me make out how to set the value to that useState hook, what am I doing wrong? Maybe useState variable is overwritten somewhere else and I juts don;t know about it?
Posted

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900