All files / app/features/communities/discussions DiscussionsSection.tsx

67.85% Statements 19/28
0% Branches 0/4
0% Functions 0/7
79.16% Lines 19/24

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 1195x 5x 5x 5x 5x 5x 5x 5x 5x 5x   5x 5x 5x   5x 5x   5x             5x       5x         5x                                                                                                                                                                        
import { Link as MuiLink, styled } from "@mui/material";
import Alert from "components/Alert";
import Button from "components/Button";
import CenteredSpinner from "components/CenteredSpinner/CenteredSpinner";
import { EmailIcon } from "components/Icons";
import TextBody from "components/TextBody";
import { useListDiscussions } from "features/communities/hooks";
import { useTranslation } from "i18n";
import { COMMUNITIES } from "i18n/namespaces";
import Link from "next/link";
import { Community } from "proto/communities_pb";
import { composingDiscussionHash, routeToCommunity } from "routes";
import { theme } from "theme";
import hasAtLeastOnePage from "utils/hasAtLeastOnePage";
 
import { SectionTitle } from "../CommunityPage";
import DiscussionCard from "./DiscussionCard";
 
const StyledLoadMoreButton = styled("div")(() => ({
  alignSelf: "center",
  display: "flex",
  justifyContent: "center",
  width: "100%",
}));
 
const StyledCreateResourceButton = styled(Button)(() => ({
  margin: theme.spacing(2, 0),
}));
 
const StyledDiscussionsHeader = styled("div")(() => ({
  alignItems: "center",
  display: "flex",
}));
 
const StyledDiscussionsContainer = styled("div")(() => ({
  "& > *": {
    width: "100%",
  },
  "& > :not(:last-child)": {
    marginBlockEnd: theme.spacing(3),
  },
  display: "flex",
  flexDirection: "row",
  flexWrap: "wrap",
  justifyContent: "space-between",
  paddingBlockEnd: theme.spacing(5),
}));
 
export default function DiscussionsSection({
  community,
}: {
  community: Community.AsObject;
}) {
  const { t } = useTranslation([COMMUNITIES]);
 
  const {
    isLoading: isDiscussionsLoading,
    error: discussionsError,
    data: discussions,
    hasNextPage: discussionsHasNextPage,
  } = useListDiscussions(community.communityId);
 
  return (
    <section>
      <StyledDiscussionsHeader>
        <SectionTitle icon={<EmailIcon />} variant="h2">
          {t("communities:discussions_title")}
        </SectionTitle>
      </StyledDiscussionsHeader>
      {discussionsError && (
        <Alert severity="error">{discussionsError.message}</Alert>
      )}
 
      <StyledCreateResourceButton
        size="small"
        component={Link}
        href={`${routeToCommunity(
          community.communityId,
          community.slug,
          "discussions",
        )}#${composingDiscussionHash}`}
      >
        {t("communities:new_post_label")}
      </StyledCreateResourceButton>
      <StyledDiscussionsContainer>
        {isDiscussionsLoading ? (
          <CenteredSpinner />
        ) : hasAtLeastOnePage(discussions, "discussionsList") ? (
          discussions.pages
            .flatMap((res) => res.discussionsList)
            .map((discussion) => (
              <DiscussionCard
                discussion={discussion}
                key={`discussioncard-${discussion.thread!.threadId}`}
              />
            ))
        ) : (
          <TextBody>{t("communities:discussions_empty_state")}</TextBody>
        )}
        {discussionsHasNextPage && (
          <StyledLoadMoreButton>
            <MuiLink
              component={Link}
              underline="hover"
              href={routeToCommunity(
                community.communityId,
                community.slug,
                "discussions",
              )}
            >
              {t("communities:see_more_discussions_label")}
            </MuiLink>
          </StyledLoadMoreButton>
        )}
      </StyledDiscussionsContainer>
    </section>
  );
}