All files / app/features/profile/view ReferencesView.tsx

100% Statements 17/17
100% Branches 10/10
100% Functions 3/3
100% Lines 15/15

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 833x 3x 3x 3x     3x 3x     3x 3x   3x                 10x                     3x                         76x 76x   76x                                   3x                              
import Alert from "components/Alert";
import Button from "components/Button";
import CircularProgress from "components/CircularProgress";
import TextBody from "components/TextBody";
import useUsers from "features/userQueries/useUsers";
import { RpcError } from "grpc-web";
import { useTranslation } from "i18n";
import { GLOBAL, PROFILE } from "i18n/namespaces";
import { ListReferencesRes } from "proto/references_pb";
import { UseInfiniteQueryResult } from "react-query";
import hasAtLeastOnePage from "utils/hasAtLeastOnePage";
import makeStyles from "utils/makeStyles";
 
import ReferenceList from "./ReferenceList";
 
interface ReferencesViewProps {
  isReceived?: boolean;
  isReferenceUsersLoading: boolean;
  referencesQuery: UseInfiniteQueryResult<ListReferencesRes.AsObject, RpcError>;
  referenceUsers: ReturnType<typeof useUsers>["data"];
}
 
export const useReferencesViewStyles = makeStyles((theme) => ({
  noReferencesText: {
    marginBlockStart: theme.spacing(1),
  },
  seeMoreReferencesButtonContainer: {
    display: "flex",
    justifyContent: "center",
    width: "100%",
  },
}));
 
export default function ReferencesView({
  isReceived,
  isReferenceUsersLoading,
  referencesQuery: {
    data: referencesRes,
    error: referencesError,
    fetchNextPage,
    hasNextPage,
    isFetchingNextPage,
    isLoading: isReferencesLoading,
  },
  referenceUsers,
}: ReferencesViewProps) {
  const { t } = useTranslation([GLOBAL, PROFILE]);
  const classes = useReferencesViewStyles();
 
  return (
    <>
      {referencesError && (
        <Alert severity="error">{referencesError.message}</Alert>
      )}
      {isReferenceUsersLoading || isReferencesLoading ? (
        <CircularProgress />
      ) : hasAtLeastOnePage(referencesRes, "referencesList") ? (
        <>
          <ReferenceList
            isReceived={isReceived}
            referencePages={referencesRes.pages}
            referenceUsers={referenceUsers}
          />
          {hasNextPage && (
            <div className={classes.seeMoreReferencesButtonContainer}>
              <Button
                loading={isFetchingNextPage}
                onClick={() => fetchNextPage()}
              >
                {t("profile:see_more_references")}
              </Button>
            </div>
          )}
        </>
      ) : (
        <TextBody className={classes.noReferencesText}>
          {t("profile:no_references")}
        </TextBody>
      )}
    </>
  );
}