Newer
Older
taehui / taehui-fe / src / forum / ForumView.tsx
@Taehui Taehui on 12 Mar 2 KB 2024-03-12 오후 7:02
import { useEffect } from "react";
import { Link, useParams } from "react-router-dom";
import {
  Badge,
  Button,
  Col,
  ListGroup,
  ListGroupItemHeading,
  Row,
} from "reactstrap";
import { observer } from "mobx-react-lite";
import { useTranslation } from "react-i18next";
import { useIntParam, useTo } from "taehui-ts/fe-utility";

import EssayTitleView from "src/forum/EssayTitleView";
import PositionInput from "src/forum/PositionInput";
import { useAvatarStore, useForumStore } from "src/Stores";
import { ForumViewLoading } from "src/Loading";
import useGetForum from "src/forum/useGetForum";

export default observer(() => {
  const { taehuiLevel } = useAvatarStore();
  const { viewUnit, setLastPage } = useForumStore();
  const { t } = useTranslation();

  type ForumViewParams = {
    forumID: string;
  };
  const { forumID } = useParams<ForumViewParams>() as ForumViewParams;
  const { param: page } = useIntParam("page", 1);

  const to = useTo();

  const {
    data: { title, essays, essayCount, level },
    isFetched: isForumLoaded,
  } = useGetForum(forumID, page, viewUnit);

  useEffect(() => {
    if (isForumLoaded) {
      setLastPage(Math.ceil(essayCount / viewUnit));
    }
  }, [essayCount, isForumLoaded, setLastPage, viewUnit]);

  return (
    <>
      <Row className="g-0">
        <Col className="m-1">
          <ListGroup>
            <ListGroupItemHeading>
              <Badge>{title}</Badge>
            </ListGroupItemHeading>
            {isForumLoaded ? (
              essays.map((essay) => (
                <EssayTitleView
                  forumID={forumID}
                  essay={essay}
                  key={essay.essayID}
                />
              ))
            ) : (
              <ForumViewLoading />
            )}
          </ListGroup>
        </Col>
      </Row>
      <Row className="justify-content-center g-0">
        <Col className="m-1" xs="auto">
          <PositionInput />
        </Col>
      </Row>
      <Row className="g-0">
        {taehuiLevel >= level && (
          <Col className="m-1 text-end">
            <Link to={`/forum/${forumID}/w`}>
              <Button color="success">{t("postEssay")}</Button>
            </Link>
          </Col>
        )}
        <Col
          className="m-1 text-end"
          xs={taehuiLevel >= level ? "auto" : undefined}
        >
          <Button
            color="danger"
            onClick={() => {
              to("/forums");
            }}
          >
            {t("quit")}
          </Button>
        </Col>
      </Row>
    </>
  );
});