Newer
Older
taehui / taehui-fe / src / want / WantView.tsx
@Taehui Taehui on 13 Mar 2 KB v1.0.0
import { useTranslation } from "react-i18next";
import { useParams } from "react-router-dom";
import { Col, ListGroup, ListGroupItemHeading, Row } from "reactstrap";
import InfiniteScroll from "react-infinite-scroll-component";

import { WantViewLoading } from "src/Loading";
import EssayTitleView from "src/forum/EssayTitleView";
import WantInput from "src/want/WantInput";
import CommentTitleView from "src/forum/CommentTitleView";
import { GetWantAPIComment, GetWantAPIEssay } from "src/wwwAPI";
import useGetWant from "src/want/useGetWant";

const WantView = () => {
  const { t } = useTranslation();

  type WantViewParams = {
    wantVariety: "essay" | "comment";
    wantInput: string;
  };
  const { wantVariety, wantInput } =
    useParams<WantViewParams>() as WantViewParams;

  const {
    fetchNextPage,
    hasNextPage,
    data: { pages },
    isFetched: isWantLoaded,
  } = useGetWant(wantVariety, wantInput);

  return (
    <>
      <WantInput />
      <hr />
      {isWantLoaded ? (
        <Row className="g-0">
          <Col className="m-1">
            <ListGroup>
              <ListGroupItemHeading>{t("wantView")}</ListGroupItemHeading>
              <InfiniteScroll
                dataLength={pages.length}
                next={() => fetchNextPage()}
                hasMore={hasNextPage}
                loader={null}
              >
                {wantVariety === "essay" &&
                  (pages as GetWantAPIEssay[]).flatMap((wantedEssayTitle) => {
                    return (
                      <EssayTitleView
                        key={wantedEssayTitle.essayID}
                        forumID={wantedEssayTitle.forumID}
                        forumTitle={wantedEssayTitle.forumTitle}
                        essay={wantedEssayTitle}
                      />
                    );
                  })}
                {wantVariety === "comment" &&
                  (pages as GetWantAPIComment[]).flatMap(
                    (wantedCommentTitle) => {
                      return (
                        <CommentTitleView
                          key={wantedCommentTitle.essayID}
                          forumID={wantedCommentTitle.forumID}
                          essayID={wantedCommentTitle.essayID}
                          comment={wantedCommentTitle}
                        />
                      );
                    },
                  )}
              </InfiniteScroll>
            </ListGroup>
          </Col>
        </Row>
      ) : (
        <WantViewLoading />
      )}
    </>
  );
};

export default WantView;